diff --git a/apps/wpm/migrations/0003_auto_20230628_0859.py b/apps/wpm/migrations/0003_auto_20230628_0859.py new file mode 100644 index 00000000..f72d75ff --- /dev/null +++ b/apps/wpm/migrations/0003_auto_20230628_0859.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.12 on 2023-06-28 00:59 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0002_auto_20230626_1559'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wpm', '0002_auto_20230625_1709'), + ] + + operations = [ + migrations.RemoveField( + model_name='sflog', + name='cal_time', + ), + migrations.RemoveField( + model_name='sflog', + name='elec_val', + ), + migrations.RemoveField( + model_name='sflog', + name='qua_data', + ), + migrations.AlterField( + model_name='sflog', + name='leader', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='班长'), + ), + migrations.AlterField( + model_name='sflog', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.team', verbose_name='班组'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 45c28919..5d3e7dd9 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -1,5 +1,6 @@ from django.db import models -from apps.system.models import CommonADModel, BaseModel +from apps.system.models import BaseModel +from apps.utils.models import CommonADModel, CommonBDModel from apps.mtm.models import Mgroup, Team, Shift # Create your models here. @@ -17,16 +18,13 @@ class SfLog(CommonADModel): """值班记录 """ mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE) - team = models.ForeignKey(Team, verbose_name='班组', on_delete=models.CASCADE) + team = models.ForeignKey(Team, verbose_name='班组', on_delete=models.CASCADE, null=True, blank=True) shift = models.ForeignKey(Shift, verbose_name='当班班次', on_delete=models.CASCADE) - leader = models.ForeignKey('system.user', verbose_name='班长', on_delete=models.CASCADE) + leader = models.ForeignKey('system.user', verbose_name='班长', on_delete=models.CASCADE, null=True, blank=True) 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') - qua_data = models.JSONField('质检数据', null=True, blank=True) - elec_val = models.FloatField('电耗值', null=True, blank=True) - cal_time = models.DateTimeField('计算时间', null=True, blank=True) class StSfLog(BaseModel): diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 639af0ee..1d214904 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -20,19 +20,18 @@ class SfLogSerializer(CustomModelSerializer): class Meta: model = SfLog fields = '__all__' - read_only_fields = EXCLUDE_FIELDS + ['leader', 'qua_data', 'cal_time', 'elec_val'] - update_fields = ['start_time', 'end_time', 'note'] - - def validate(self, attrs): - attrs['leader'] = attrs['mgroup'].leader - return super().validate(attrs) + read_only_fields = EXCLUDE_FIELDS + ['mgroup', 'start_time', 'end_time', 'belong_dept'] + extra_kwargs = { + 'team': {'required': True}, + 'leader': {'required': True} + } - def to_internal_value(self, data): - if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']: - u_fields = self.Meta.update_fields - 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) + # def to_internal_value(self, data): + # if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']: + # u_fields = self.Meta.update_fields + # 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): diff --git a/apps/wpm/services.py b/apps/wpm/services.py new file mode 100644 index 00000000..b407ac82 --- /dev/null +++ b/apps/wpm/services.py @@ -0,0 +1,20 @@ +from apps.wpm.models import SfLog +from apps.mtm.models import Shift, Mgroup +import datetime + +def make_sflogs(mgroup: Mgroup, shift: Shift, start_date: datetime.date, end_date: datetime.date): + start_time_o = shift.start_time_o + end_time_o = shift.end_time_o + current_date = start_date + while current_date <= end_date: + start_time = datetime.datetime.combine(current_date, start_time_o) + end_time = datetime.datetime.combine(current_date, end_time_o) + if start_time > end_time: + start_time -= datetime.timedelta(days=1) + SfLog.objects.get_or_create(mgroup=mgroup, shift=shift, start_time=start_time, defaults={ + "mgroup": mgroup, + "shift": shift, + "start_time": start_time, + "end_time": end_time, + }) + current_date = current_date + datetime.timedelta(days=1) \ No newline at end of file diff --git a/apps/wpm/tasks.py b/apps/wpm/tasks.py new file mode 100644 index 00000000..40e3f0aa --- /dev/null +++ b/apps/wpm/tasks.py @@ -0,0 +1,26 @@ +# Create your tasks here +from __future__ import absolute_import, unicode_literals +from apps.utils.tasks import CustomTask +from celery import shared_task +from apps.utils.sql import DbConnection +from server.settings import get_sysconfig +from django.core.cache import cache +from apps.wpm.models import SfLog +from apps.mtm.models import Mgroup, Shift +import datetime +from django.db.models import Sum +from apps.wpm.services import make_sflogs + + +@shared_task(base=CustomTask) +def make_sflogs_simple(days=2): + """ + 根据班次规则生成今明两天的排班记录 + """ + start_date = datetime.datetime.today() + end_date = start_date + datetime.timedelta(days=days) + mgroups = Mgroup.objects.filter(cate='section').all() + shifts = Shift.objects.all() + for mgroup in mgroups: + for shift in shifts: + make_sflogs(mgroup, shift, start_date, end_date) \ No newline at end of file diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 2f69f998..e55eda20 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -4,6 +4,7 @@ from rest_framework.decorators import action from django.db import transaction from rest_framework.response import Response 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 @@ -24,12 +25,13 @@ class StLogViewSet(ListModelMixin, CustomGenericViewSet): ordering = ['-start_time'] -class SfLogViewSet(CustomModelViewSet): +class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): """ list:值班记录 值班记录 """ + perms_map = {'get': '*', 'put': 'sflog.update', 'delete': 'sflog.delete'} queryset = SfLog.objects.all() serializer_class = SfLogSerializer select_related_fields = ['mgroup', 'shift', 'team', 'leader']