feat: sflogexp合并stlog
This commit is contained in:
parent
f4e3d43034
commit
ccfeb9d901
|
@ -15,6 +15,7 @@ class SfLogFilter(filters.FilterSet):
|
|||
}
|
||||
|
||||
class SfLogExpFilter(filters.FilterSet):
|
||||
is_st = filters.BooleanFilter(method='filter_is_st', label='是否停机')
|
||||
class Meta:
|
||||
model = SfLogExp
|
||||
fields = {
|
||||
|
@ -22,4 +23,12 @@ class SfLogExpFilter(filters.FilterSet):
|
|||
"sflog__mgroup__name": ["exact"],
|
||||
"happen_time": ["day", "month", "year"],
|
||||
"sflog__end_time": ["day", "month", "year"],
|
||||
}
|
||||
"stlog": ["exact"],
|
||||
"stlog__start_time": ["day", "month", "year"],
|
||||
"stlog__end_time": ["day", "month", "year"]
|
||||
}
|
||||
|
||||
def filter_is_st(self, queryset, name, value):
|
||||
if value:
|
||||
return queryset.exclude(stlog=None)
|
||||
return queryset.filter(stlog=None)
|
|
@ -0,0 +1,68 @@
|
|||
# Generated by Django 3.2.12 on 2023-08-08 06:13
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('wpm', '0009_sflogexp'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sflogexp',
|
||||
name='duration',
|
||||
field=models.FloatField(blank=True, null=True, verbose_name='停机时长(h)'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='sflogexp',
|
||||
name='is_current_down',
|
||||
field=models.BooleanField(default=False, verbose_name='是否本班停机'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='sflogexp',
|
||||
name='stlog',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.stlog', verbose_name='关联停机记录'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='sflogexp',
|
||||
name='title',
|
||||
field=models.CharField(default='停机', max_length=20, verbose_name='异常名称'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflog',
|
||||
name='stlogs',
|
||||
field=models.ManyToManyField(through='wpm.SfLogExp', to='wpm.StLog', verbose_name='关联停机记录'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflogexp',
|
||||
name='cate',
|
||||
field=models.CharField(blank=True, max_length=10, null=True, verbose_name='原因类别'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflogexp',
|
||||
name='handler',
|
||||
field=models.CharField(default='', max_length=100, verbose_name='处理人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflogexp',
|
||||
name='happen_time',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='发生时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflogexp',
|
||||
name='measure',
|
||||
field=models.TextField(default='', max_length=100, verbose_name='处置措施'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sflogexp',
|
||||
name='reason',
|
||||
field=models.TextField(default='', max_length=100, verbose_name='事件原因'),
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='StSfLog',
|
||||
),
|
||||
]
|
|
@ -25,7 +25,7 @@ class SfLog(CommonADModel):
|
|||
start_time = models.DateTimeField('值班开始')
|
||||
end_time = models.DateTimeField('值班结束')
|
||||
note = models.TextField('其他备注', null=True, blank=True)
|
||||
stlogs = models.ManyToManyField('wpm.stlog', verbose_name='关联停机记录', through='wpm.stsflog')
|
||||
stlogs = models.ManyToManyField('wpm.stlog', verbose_name='关联停机记录', through='wpm.sflogexp')
|
||||
last_test_time = models.DateTimeField('最后质检时间', null=True, blank=True)
|
||||
total_hour_now = models.FloatField('总时长动', default=0)
|
||||
shut_hour = models.FloatField('停机时长', default=0)
|
||||
|
@ -39,27 +39,17 @@ class SfLog(CommonADModel):
|
|||
end_time_local = localtime(self.end_time)
|
||||
return end_time_local.year, end_time_local.month, end_time_local.day
|
||||
|
||||
|
||||
class StSfLog(BaseModel):
|
||||
"""
|
||||
停机-值班记录关联表
|
||||
"""
|
||||
stlog = models.ForeignKey(StLog, verbose_name='关联停机记录', on_delete=models.CASCADE)
|
||||
sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE)
|
||||
is_current_down = models.BooleanField('是否本班停机', default=False)
|
||||
reason = models.TextField('停机原因', null=True, blank=True)
|
||||
duration = models.FloatField('停机时长(h)', null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['sflog__start_time']
|
||||
|
||||
class SfLogExp(CommonADModel):
|
||||
"""
|
||||
生产异常情况记录
|
||||
"""
|
||||
sflog = models.ForeignKey(SfLog, on_delete=models.CASCADE, verbose_name='关联值班记录')
|
||||
happen_time = models.DateTimeField('发生时间')
|
||||
cate = models.CharField('异常类别', max_length=10)
|
||||
reason = models.TextField('原因')
|
||||
measure = models.TextField('处置措施')
|
||||
handler = models.CharField('处理人', max_length=100)
|
||||
stlog = models.ForeignKey(StLog, verbose_name='关联停机记录', on_delete=models.CASCADE, null=True, blank=True)
|
||||
title = models.CharField('异常名称', max_length=20)
|
||||
happen_time = models.DateTimeField('发生时间', null=True, blank=True)
|
||||
cate = models.CharField('原因类别', max_length=10, null=True, blank=True)
|
||||
reason = models.TextField('事件原因', default='', max_length=100)
|
||||
measure = models.TextField('处置措施', default='', max_length=100)
|
||||
handler = models.CharField('处理人', default='', max_length=100)
|
||||
is_current_down = models.BooleanField('是否本班停机', default=False)
|
||||
duration = models.FloatField('停机时长(h)', null=True, blank=True)
|
|
@ -2,7 +2,7 @@ from apps.utils.constants import EXCLUDE_FIELDS
|
|||
from apps.utils.serializers import CustomModelSerializer
|
||||
from rest_framework import serializers
|
||||
|
||||
from apps.wpm.models import SfLog, StLog, StSfLog, SfLogExp
|
||||
from apps.wpm.models import SfLog, StLog, SfLogExp
|
||||
from apps.system.models import Dictionary
|
||||
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change
|
||||
|
||||
|
@ -44,21 +44,14 @@ class SfLogSerializer(CustomModelSerializer):
|
|||
# new_data = {key: data[key] for key in u_fields if key in data}
|
||||
# return super().to_internal_value(new_data)
|
||||
# return super().to_internal_value(data)
|
||||
|
||||
|
||||
class StSfLogSerializer(CustomModelSerializer):
|
||||
stlog_ = StLogSerializer(source='stlog', read_only=True)
|
||||
sflog_ = SfLogSerializer(source='sflog', read_only=True)
|
||||
class Meta:
|
||||
model = StSfLog
|
||||
fields = '__all__'
|
||||
read_only_fields = EXCLUDE_FIELDS + ['stlog', 'sflog', 'is_current_down']
|
||||
|
||||
|
||||
class SflogExpSerializer(CustomModelSerializer):
|
||||
mgroup = serializers.CharField(source='sflog.mgroup.id', read_only=True)
|
||||
mgroup_name = serializers.CharField(source='sflog.mgroup.name', read_only=True)
|
||||
happen_time = serializers.DateTimeField(required=True, label='发生时间')
|
||||
cate = serializers.CharField(required=True, label='原因类别')
|
||||
class Meta:
|
||||
model = SfLogExp
|
||||
fields = '__all__'
|
||||
read_only_fields = EXCLUDE_FIELDS
|
||||
read_only_fields = EXCLUDE_FIELDS + ['stlog', 'is_current_down']
|
|
@ -1,4 +1,4 @@
|
|||
from apps.wpm.models import SfLog, StLog, StSfLog
|
||||
from apps.wpm.models import SfLog, SfLogExp
|
||||
from apps.mtm.models import Shift, Mgroup
|
||||
import datetime
|
||||
from django.utils.timezone import localtime
|
||||
|
|
|
@ -10,7 +10,7 @@ from apps.mtm.models import Mgroup
|
|||
import datetime
|
||||
from django.db.models import Sum
|
||||
from apps.wpm.services import make_sflogs
|
||||
from apps.wpm.models import SfLog, StLog, StSfLog
|
||||
from apps.wpm.models import SfLog, StLog, SfLogExp
|
||||
from django.utils.timezone import localtime
|
||||
from django.db.models import F
|
||||
|
||||
|
@ -76,7 +76,7 @@ def cal_shut_hour(stlogId: str):
|
|||
is_current_down = False
|
||||
if ind == 0:
|
||||
is_current_down = True
|
||||
stsf, _ = StSfLog.objects.get_or_create(stlog=stlog, sflog=sflog, defaults={'stlog': stlog, 'sflog': sflog, 'is_current_down': is_current_down})
|
||||
sflogexp, _ = SfLogExp.objects.get_or_create(stlog=stlog, sflog=sflog, defaults={'stlog': stlog, 'sflog': sflog, 'is_current_down': is_current_down, 'title': '停机'})
|
||||
# 计算duration
|
||||
sf_end, sf_start = sflog.end_time, sflog.start_time
|
||||
duration_item = min(sf_end, st_end) - min(sf_start, st_start)
|
||||
|
@ -84,10 +84,10 @@ def cal_shut_hour(stlogId: str):
|
|||
duration_item = 0
|
||||
else:
|
||||
duration_item = duration_item.total_seconds()/3600
|
||||
stsf.duration = duration_item
|
||||
stsf.save()
|
||||
sflogexp.duration = duration_item
|
||||
sflogexp.save()
|
||||
# 计算每班的总停机时间
|
||||
ret = StSfLog.objects.filter(sflog=sflog).aggregate(sum=Sum('duration'))
|
||||
ret = SfLogExp.objects.filter(sflog=sflog).exclude(stlog=None).aggregate(sum=Sum('duration'))
|
||||
if ret.get('sum', 0):
|
||||
sflog.shut_hour = ret['sum']
|
||||
sflog.save()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.urls import path, include
|
||||
from rest_framework.routers import DefaultRouter
|
||||
|
||||
from apps.wpm.views import SfLogViewSet, StLogViewSet, StSfLogViewSet, SfLogExpViewSet
|
||||
from apps.wpm.views import SfLogViewSet, StLogViewSet, SfLogExpViewSet
|
||||
|
||||
|
||||
API_BASE_URL = 'api/wpm/'
|
||||
|
@ -10,7 +10,6 @@ HTML_BASE_URL = 'wpm/'
|
|||
router = DefaultRouter()
|
||||
router.register('sflog', SfLogViewSet, basename='sflog')
|
||||
router.register('stlog', StLogViewSet, basename='stlog')
|
||||
router.register('stsflog', StSfLogViewSet, basename='stsflog')
|
||||
router.register('sflogexp', SfLogExpViewSet, basename='sflogexp')
|
||||
|
||||
urlpatterns = [
|
||||
|
|
|
@ -7,8 +7,8 @@ from rest_framework.exceptions import ParseError
|
|||
from rest_framework.mixins import DestroyModelMixin, UpdateModelMixin, ListModelMixin
|
||||
|
||||
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
||||
from apps.wpm.models import SfLog, StLog, StSfLog, SfLogExp
|
||||
from apps.wpm.serializers import SfLogSerializer, StLogSerializer, StSfLogSerializer, SflogExpSerializer
|
||||
from apps.wpm.models import SfLog, StLog, SfLogExp
|
||||
from apps.wpm.serializers import SfLogSerializer, StLogSerializer, SflogExpSerializer
|
||||
from apps.wpm.filters import SfLogFilter, SfLogExpFilter
|
||||
from apps.mtm.models import Material
|
||||
|
||||
|
@ -41,25 +41,6 @@ class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGe
|
|||
search_fields = ['note']
|
||||
ordering = ['-start_time']
|
||||
|
||||
# 此处需要进行修改
|
||||
# @transaction.atomic
|
||||
# def perform_create(self, serializer):
|
||||
# ins = serializer.save()
|
||||
# # 查看并比对停机记录
|
||||
# stls = StLog.objects.filter(mroup=ins.mgroup)
|
||||
# stls_ = (stls.filter(start_time__gte=ins.start_time, start_time__lt=ins.end_time)|
|
||||
# stls.exclude(end_time=None).filter(start_time__lte=ins.start_time, end_time__gt=ins.end_time)|
|
||||
# stls.exclude(end_time=None).filter(end_time__gte=ins.start_time, end_time__lt=ins.end_time))
|
||||
# for i in stls_:
|
||||
# StSfLog.objects.get_or_create(stlog=i, sflog=ins, defaults={'stlog': i, 'sflog': ins})
|
||||
# stsflog = StSfLog.objects.filter(stlog=i).order_by('-sflog__start_time').first()
|
||||
# if stsflog:
|
||||
# stsflog.is_current_down = True
|
||||
# stsflog.save()
|
||||
# # 计算能耗
|
||||
# from apps.enm.tasks import cal_sflog_en_val
|
||||
# cal_sflog_en_val.delay(ins.id)
|
||||
|
||||
@action(methods=['get'], detail=True, perms_map={'get': '*'})
|
||||
def init_test(self, request, pk=None):
|
||||
"""
|
||||
|
@ -79,25 +60,6 @@ class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGe
|
|||
qs = QuaStat.objects.filter(sflog=obj).order_by('material__sort', 'material__create_time', 'testitem__sort', 'testitem__create_time')
|
||||
sr = QuaStatSerializer(instance=qs, many=True)
|
||||
return Response(sr.data)
|
||||
|
||||
class StSfLogViewSet(ListModelMixin, UpdateModelMixin, CustomGenericViewSet):
|
||||
"""
|
||||
list:值班停机关系
|
||||
|
||||
值班停机关系
|
||||
"""
|
||||
perms_map = {'get': '*', 'put': 'sflog.update'}
|
||||
queryset = StSfLog.objects.all()
|
||||
serializer_class = StSfLogSerializer
|
||||
select_related_fields = ['stlog', 'sflog']
|
||||
filterset_fields = ['stlog', 'sflog']
|
||||
search_fields = ['reason']
|
||||
|
||||
def filter_queryset(self, queryset):
|
||||
params = self.request.query_params
|
||||
if 'stlog' not in params or 'sflog' not in params:
|
||||
raise ParseError('请指定所属停机或值班记录')
|
||||
return super().filter_queryset(queryset)
|
||||
|
||||
|
||||
class SfLogExpViewSet(CustomModelViewSet):
|
||||
|
@ -108,5 +70,5 @@ class SfLogExpViewSet(CustomModelViewSet):
|
|||
"""
|
||||
queryset = SfLogExp.objects.all()
|
||||
serializer_class = SflogExpSerializer
|
||||
select_related_fields = ['sflog', 'sflog__mgroup']
|
||||
select_related_fields = ['sflog', 'sflog__mgroup', 'stlog']
|
||||
filterset_class = SfLogExpFilter
|
Loading…
Reference in New Issue