feat: 自动创建值班记录

This commit is contained in:
caoqianming 2023-06-28 09:00:43 +08:00
parent 783869638f
commit 49fa109233
6 changed files with 103 additions and 19 deletions

View File

@ -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='班组'),
),
]

View File

@ -1,5 +1,6 @@
from django.db import models 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 from apps.mtm.models import Mgroup, Team, Shift
# Create your models here. # Create your models here.
@ -17,16 +18,13 @@ class SfLog(CommonADModel):
"""值班记录 """值班记录
""" """
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE) 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) 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('值班开始') start_time = models.DateTimeField('值班开始')
end_time = models.DateTimeField('值班结束') end_time = models.DateTimeField('值班结束')
note = models.TextField('其他备注', null=True, blank=True) 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.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): class StSfLog(BaseModel):

View File

@ -20,19 +20,18 @@ class SfLogSerializer(CustomModelSerializer):
class Meta: class Meta:
model = SfLog model = SfLog
fields = '__all__' fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['leader', 'qua_data', 'cal_time', 'elec_val'] read_only_fields = EXCLUDE_FIELDS + ['mgroup', 'start_time', 'end_time', 'belong_dept']
update_fields = ['start_time', 'end_time', 'note'] extra_kwargs = {
'team': {'required': True},
'leader': {'required': True}
}
def validate(self, attrs): # def to_internal_value(self, data):
attrs['leader'] = attrs['mgroup'].leader # if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']:
return super().validate(attrs) # u_fields = self.Meta.update_fields
# new_data = {key: data[key] for key in u_fields if key in data}
def to_internal_value(self, data): # return super().to_internal_value(new_data)
if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']: # return super().to_internal_value(data)
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): class StSfLogSerializer(CustomModelSerializer):

20
apps/wpm/services.py Normal file
View File

@ -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)

26
apps/wpm/tasks.py Normal file
View File

@ -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)

View File

@ -4,6 +4,7 @@ from rest_framework.decorators import action
from django.db import transaction from django.db import transaction
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from rest_framework.mixins import DestroyModelMixin, UpdateModelMixin, ListModelMixin
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.wpm.models import SfLog, StLog, StSfLog from apps.wpm.models import SfLog, StLog, StSfLog
@ -24,12 +25,13 @@ class StLogViewSet(ListModelMixin, CustomGenericViewSet):
ordering = ['-start_time'] ordering = ['-start_time']
class SfLogViewSet(CustomModelViewSet): class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet):
""" """
list:值班记录 list:值班记录
值班记录 值班记录
""" """
perms_map = {'get': '*', 'put': 'sflog.update', 'delete': 'sflog.delete'}
queryset = SfLog.objects.all() queryset = SfLog.objects.all()
serializer_class = SfLogSerializer serializer_class = SfLogSerializer
select_related_fields = ['mgroup', 'shift', 'team', 'leader'] select_related_fields = ['mgroup', 'shift', 'team', 'leader']