feat: 自动创建值班记录
This commit is contained in:
parent
783869638f
commit
49fa109233
|
@ -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='班组'),
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
|
@ -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)
|
|
@ -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']
|
||||
|
|
Loading…
Reference in New Issue