From 1a640d9a7083ceca23c116ce0a1ac2eb801908c2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 1 Nov 2023 13:28:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mlog=E5=A2=9E=E5=8A=A0submit=5Ftime/sub?= =?UTF-8?q?mit=5Fuser=E5=8F=8A=E7=9B=B8=E5=BA=94=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/pm/services.py | 10 +++--- apps/pm/views.py | 3 +- apps/wpm/filters.py | 3 +- .../wpm/migrations/0024_auto_20231101_1325.py | 31 +++++++++++++++++++ apps/wpm/models.py | 6 ++++ apps/wpm/serializers.py | 2 +- apps/wpm/services.py | 17 ++++++++-- 7 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 apps/wpm/migrations/0024_auto_20231101_1325.py diff --git a/apps/pm/services.py b/apps/pm/services.py index 05f47ab5..5c284c33 100644 --- a/apps/pm/services.py +++ b/apps/pm/services.py @@ -1,9 +1,10 @@ -from apps.system.models import Dept +from apps.system.models import Dept, User from apps.sam.models import OrderItem from apps.mtm.models import Route, Material, Mgroup from rest_framework.exceptions import ParseError from apps.pm.models import Mtask, Utask from django.db.models.query import QuerySet +from django.utils import timezone from datetime import date, timedelta import math from typing import List, Union @@ -243,18 +244,19 @@ class PmService: change_order_state_when_schedue(orderitemIds) @classmethod - def mtasks_submit(cls, mtasks: QuerySet[Mtask]): + def mtasks_submit(cls, mtasks: QuerySet[Mtask], user: User): """ 锁定生产任务 """ from apps.wpm.models import Mlog - from apps.wpm.services import mlog_confirm, update_mtask + from apps.wpm.services import mlog_submit, update_mtask + now = timezone.now() for mtask in mtasks: mlogs = Mlog.objects.filter(mtask=mtask) if mlogs.count() == 0: raise ParseError(f'{mtask.mgroup.name}_未填写日志') for mlog in mlogs: - mlog_confirm(mlog) + mlog_submit(mlog, user, now) update_mtask(mtask) mtask.state = Mtask.MTASK_DONE mtask.save() diff --git a/apps/pm/views.py b/apps/pm/views.py index c5e11eda..4f4c48c4 100644 --- a/apps/pm/views.py +++ b/apps/pm/views.py @@ -165,9 +165,10 @@ class MtaskViewSet(CustomModelViewSet): 提交任务后不可更新日志 """ ids = request.data.get('ids', []) + user = request.user mtasks = Mtask.objects.filter( id__in=ids, state=Mtask.MTASK_ASSGINED) - PmService.mtasks_submit(mtasks) + PmService.mtasks_submit(mtasks, user) return Response() @action(methods=['post'], detail=True, perms_map={'post': 'mtask.submit'}, serializer_class=Serializer) diff --git a/apps/wpm/filters.py b/apps/wpm/filters.py index ff31b835..0a4b7c97 100644 --- a/apps/wpm/filters.py +++ b/apps/wpm/filters.py @@ -59,5 +59,6 @@ class MlogFilter(filters.FilterSet): "batch": ["exact"], "handle_date": ["exact"], "handle_user": ["exact"], - "mtask__mgroup__belong_dept__name": ["exact"] + "mtask__mgroup__belong_dept__name": ["exact"], + "submit_time": ["isnull"] } diff --git a/apps/wpm/migrations/0024_auto_20231101_1325.py b/apps/wpm/migrations/0024_auto_20231101_1325.py new file mode 100644 index 00000000..96caceb1 --- /dev/null +++ b/apps/wpm/migrations/0024_auto_20231101_1325.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.12 on 2023-11-01 05:25 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wpm', '0023_auto_20231031_1847'), + ] + + operations = [ + migrations.AddField( + model_name='handover', + name='wm', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='handover_wm', to='wpm.wmaterial', verbose_name='关联车间库存'), + ), + migrations.AddField( + model_name='mlog', + name='submit_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='提交时间'), + ), + migrations.AddField( + model_name='mlog', + name='submit_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mlog_submit_user', to=settings.AUTH_USER_MODEL, verbose_name='提交人'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 6ab0eafd..31882c76 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -128,6 +128,10 @@ class Mlog(CommonADModel): material_outs = models.ManyToManyField( Material, verbose_name='多个产出', blank=True, through='wpm.mlogb', related_name='mlog_material_outs') + submit_time = models.DateTimeField('提交时间', null=True, blank=True) + submit_user = models.ForeignKey( + User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_submit_user') + class Mlogb(BaseModel): mlog = models.ForeignKey(Mlog, verbose_name='关联日志', @@ -155,6 +159,8 @@ class Handover(CommonADModel): Dept, verbose_name='接收部门', on_delete=models.CASCADE, related_name='handover_recive_dept') recive_user = models.ForeignKey( User, verbose_name='接收人', on_delete=models.CASCADE, related_name='handover_recive_user') + wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL, + null=True, blank=True, related_name='handover_wm') mlog = models.ForeignKey(Mlog, verbose_name='关联日志记录', on_delete=models.SET_NULL, null=True, blank=True, related_name='handover_mlog') doin_date = models.DateField('加料日期', null=True, blank=True) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 7e2db2c4..4aa0baa1 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -117,7 +117,7 @@ class MlogSerializer(CustomModelSerializer): class Meta: model = Mlog fields = '__all__' - read_only_fields = EXCLUDE_FIELDS + read_only_fields = EXCLUDE_FIELDS + ['submit_time', 'submit_user'] def create(self, validated_data): mtask = validated_data.get('mtask', None) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index d6d8820b..833f7c92 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -2,11 +2,14 @@ import datetime from django.core.cache import cache from django.db.models import Sum -from django.utils.timezone import localtime +from datetime import datetime +from django.utils import timezone +from typing import Union from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from rest_framework.exceptions import ParseError +from apps.system.models import User from apps.inm.models import MIO, MIOItem, MIOItemA from apps.pm.models import Mtask from apps.mtm.models import Mgroup, Shift, Material @@ -116,10 +119,14 @@ def do_in(mio: MIO): raise ParseError('车间物料不足') -def mlog_confirm(mlog: Mlog): +def mlog_submit(mlog: Mlog, user: User, now: Union[datetime, None]): """ - 生产日志创建后需要执行的操作 + 生产日志提交后需要执行的操作 """ + if mlog.submit_time is not None: # 说明已经做过操作了 + return + if now is None: + now = timezone.now() mtask = mlog.mtask belong_dept = mtask.mgroup.belong_dept material_out = mtask.material_out @@ -141,6 +148,7 @@ def mlog_confirm(mlog: Mlog): material_has.count = material_has.count - mlog.count_use material_has.save() if material_out.is_hidden is False: # 需要入车间库存 + # 有多个产物的情况 if material_out.brothers and Mlogb.objects.filter(mlog=mlog).exists(): for item in Mlogb.objects.filter(mlog=mlog): wmaterial, _ = WMaterial.objects.get_or_create(batch=mlog.batch, material=item.material_out, belong_dept=belong_dept, defaults={ @@ -154,6 +162,9 @@ def mlog_confirm(mlog: Mlog): }) wmaterial.count = wmaterial.count + mlog.count_ok wmaterial.save() + mlog.submit_time = now + mlog.submit_user = user + mlog.save() def update_mtask(mtask: Mtask):