From 5ea7980a1b716678ff99f7fab8dc77c26b30d3f5 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 20 Oct 2025 10:09:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mloguser=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wpm/migrations/0124_auto_20251020_1009.py | 25 +++++++++++++++++++ apps/wpm/models.py | 3 +++ apps/wpm/serializers.py | 9 ++++++- apps/wpm/services.py | 6 ++++- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 apps/wpm/migrations/0124_auto_20251020_1009.py diff --git a/apps/wpm/migrations/0124_auto_20251020_1009.py b/apps/wpm/migrations/0124_auto_20251020_1009.py new file mode 100644 index 00000000..7b1dede5 --- /dev/null +++ b/apps/wpm/migrations/0124_auto_20251020_1009.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2025-10-20 02:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('em', '0022_equipment_cd_req_addr'), + ('wpm', '0123_mlogbdefect_count_has'), + ] + + operations = [ + migrations.AddField( + model_name='mloguser', + name='equipment', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mloguser_equipment', to='em.equipment', verbose_name='生产设备'), + ), + migrations.AddField( + model_name='mloguser', + name='work_start_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='生产开始时间'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index f1712de2..458caafe 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -368,6 +368,9 @@ class MlogUser(BaseModel): mlog = models.ForeignKey(Mlog, verbose_name='关联日志', on_delete=models.CASCADE) handle_user = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) process = models.ForeignKey(Process, verbose_name='子工序', on_delete=models.CASCADE) + work_start_time = models.DateTimeField('生产开始时间', null=True, blank=True) + equipment = models.ForeignKey( + Equipment, verbose_name='生产设备', on_delete=models.CASCADE, null=True, blank=True, related_name='mloguser_equipment') shift = models.ForeignKey(Shift, verbose_name='关联班次', on_delete=models.CASCADE) handle_date = models.DateField('操作日期') diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 09458f32..8143d366 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -1492,10 +1492,17 @@ class MlogUserSerializer(CustomModelSerializer): class Meta: model = MlogUser fields = "__all__" - read_only_fields = EXCLUDE_FIELDS_BASE + read_only_fields = EXCLUDE_FIELDS_BASE + ["shift", "handle_date"] + extra_kwargs = { + "work_start_time": {"required": True} + } def create(self, validated_data): mlog:Mlog = validated_data["mlog"] + work_start_time:datetime = validated_data["work_start_time"] + if mlog.work_start_time < mlog.work_start_time: + raise ParseError("操作时间不能早于日志开始时间") + validated_data["handle_date"], validated_data["shift"] = mlog.mgroup.get_shift(work_start_time) if mlog.submit_time is not None: raise ParseError("该日志已提交") process:Process = validated_data["process"] diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 7bca34cb..14272d61 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -11,7 +11,7 @@ from apps.system.models import User from apps.pm.models import Mtask from apps.mtm.models import Mgroup, Shift, Material, Route, RoutePack, Team, Srule -from .models import SfLog, WMaterial, Mlog, Mlogb, Mlogbw, Handover, Handoverb, Handoverbw, MlogbDefect, BatchLog, BatchSt +from .models import SfLog, WMaterial, Mlog, Mlogb, Mlogbw, Handover, Handoverb, Handoverbw, MlogbDefect, BatchLog, BatchSt, MlogUser from apps.mtm.services_2 import cal_material_count from apps.wf.models import Ticket from apps.wf.services import WfService @@ -1026,6 +1026,10 @@ def mlog_submit_validate(ins: Mlog): raise ParseError('该日志未指定消耗!') if Mlogb.objects.filter(material_out__isnull=False, count_real=0, mlog=ins).exists(): raise ParseError('产出数量不能为0!') + if ins.is_fix is False and ins.route: + process = ins.route.process + if Process.objects.filter(parent=process).exists() and not MlogUser.objects.filter(mlog=ins).exists(): + raise ParseError('该日志子工序信息未完善!') def bind_mlog(ticket: Ticket, transition, new_ticket_data: dict): ins = Mlog.objects.get(id=new_ticket_data['t_id'])