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 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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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 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']
|
||||||
|
|
Loading…
Reference in New Issue