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

View File

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

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 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']