From e07f9c877c14780d9cd40289cbaca32049b6b0f8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 24 Mar 2025 14:37:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0mloguser=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=8F=8A=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/migrations/0102_mloguser.py | 35 ++++++++++++++++++++++++++++ apps/wpm/models.py | 9 ++++++- apps/wpm/serializers.py | 28 ++++++++++++++++++++-- apps/wpm/urls.py | 3 ++- apps/wpm/views.py | 26 ++++++++++++++++++--- 5 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 apps/wpm/migrations/0102_mloguser.py diff --git a/apps/wpm/migrations/0102_mloguser.py b/apps/wpm/migrations/0102_mloguser.py new file mode 100644 index 00000000..cd991a0f --- /dev/null +++ b/apps/wpm/migrations/0102_mloguser.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.12 on 2025-03-24 06:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0054_process_parent'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wpm', '0101_auto_20250321_1414'), + ] + + operations = [ + migrations.CreateModel( + name='MlogUser', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('handle_date', models.DateField(verbose_name='操作日期')), + ('handle_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='操作人')), + ('mlog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.mlog', verbose_name='关联日志')), + ('process', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='子工序')), + ('shift', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.shift', verbose_name='关联班次')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 713215ec..0feebc9f 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -1,6 +1,6 @@ from django.db import models from apps.utils.models import CommonADModel, CommonBDModel, BaseModel -from apps.mtm.models import Mgroup, Team, Shift, Material, Route +from apps.mtm.models import Mgroup, Team, Shift, Material, Route, Process from apps.pm.models import Mtask, Mtaskb from apps.system.models import User from django.utils.timezone import localtime @@ -302,6 +302,13 @@ class Mlog(CommonADModel): mlog_count_fields.remove("count_ok_full") return mlog_count_fields +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) + shift = models.ForeignKey(Shift, verbose_name='关联班次', on_delete=models.CASCADE) + handle_date = models.DateField('操作日期') + class Mlogb(BaseModel): """ TN: 子级生产/检验日志 diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 8f2c6bbb..9ec5de3b 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -6,13 +6,13 @@ from datetime import datetime from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog, Handover, Handoverb, Mlogb, AttLog, - OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw, MlogbDefect) + OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw, MlogbDefect, MlogUser) from apps.system.models import Dept, User from apps.system.serializers import UserSimpleSerializer from apps.pm.models import Mtask, Mtaskb from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change, cal_exp_duration_sec from apps.wpm.services import get_sflog, find_material_can_change, generate_new_batch -from apps.mtm.models import Mgroup, TeamMember, Shift, Material, Route +from apps.mtm.models import Mgroup, TeamMember, Shift, Material, Route, Process from apps.mtm.serializers import MaterialSimpleSerializer from django.db import transaction from django.utils import timezone @@ -1185,3 +1185,27 @@ class HandoverMgroupSerializer(serializers.Serializer): material = serializers.CharField(label="物料ID") type = serializers.IntegerField(label="交送类型") + +class MlogUserSerializer(CustomModelSerializer): + handle_user_name = serializers.CharField(source='user.name', read_only=True) + process_name = serializers.CharField(source='process.name', read_only=True) + shift_name = serializers.CharField(source='shift.name', read_only=True) + class Meta: + model = MlogUser + fields = "__all__" + read_only_fields = EXCLUDE_FIELDS_BASE + + def create(self, validated_data): + mlog:Mlog = validated_data["mlog"] + if mlog.submit_time is not None: + raise ParseError("该日志已提交") + process:Process = validated_data["process"] + if mlog.route: + p = mlog.route.process + if process.parent != p: + raise ParseError("该步骤不匹配") + else: + raise ParseError("该日志没有工艺步骤") + if MlogUser.objects.filter(mlog=mlog, process=process).exists(): + raise ParseError("该工序已选择") + return super().create(validated_data) \ No newline at end of file diff --git a/apps/wpm/urls.py b/apps/wpm/urls.py index 406d0280..90a39d3d 100644 --- a/apps/wpm/urls.py +++ b/apps/wpm/urls.py @@ -5,7 +5,7 @@ from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet, AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet, MlogbOutViewSet, FmlogViewSet, BatchStViewSet, - MlogbwViewSet) + MlogbwViewSet, MlogUserViewSet) from apps.wpm.datax import AnaViewSet @@ -28,6 +28,7 @@ router.register('otherlog', OtherLogViewSet, basename='otherlog') router.register('ana', AnaViewSet, basename='ana') router.register('batchst', BatchStViewSet, basename='batchst') router.register('mlogbw', MlogbwViewSet, basename='mlogbw') +router.register('mloguser', MlogUserViewSet, basename='mloguser') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 1dbaf0d1..e3e06150 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -16,7 +16,7 @@ from apps.utils.mixins import CustomListModelMixin, BulkCreateModelMixin, BulkDe from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter, MlogbFilter, BatchStFilter from .models import (SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, - Mlogbw, AttLog, OtherLog, Fmlog, BatchSt, MlogbDefect) + Mlogbw, AttLog, OtherLog, Fmlog, BatchSt, MlogbDefect, MlogUser) from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogRevertSerializer, MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer, @@ -25,7 +25,8 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, - MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, MlogbSerializer) + MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, + MlogbSerializer, MlogUserSerializer) from .services import mlog_submit, handover_submit, mlog_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State @@ -775,4 +776,23 @@ class MlogbwViewSet(CustomModelViewSet): if need_cal_mlogb: mlogb_qs = Mlogb.objects.filter(id__in=mlogbIds) for mlogb in mlogb_qs: - Mlogbw.cal_count_notok(mlogb) \ No newline at end of file + Mlogbw.cal_count_notok(mlogb) + +class MlogUserViewSet(BulkCreateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): + perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"} + queryset = MlogUser.objects.all() + serializer_class = MlogUserSerializer + select_related_fields = ["handle_user", "shift", "process"] + filterset_fields = ["mlog"] + + def get_queryset(self): + mlog = self.request.query_params.get("mlog", None) + if not mlog: + raise ParseError("缺少mlog查询参数") + return super().get_queryset() + + def perform_destroy(self, instance): + mlog:Mlog = instance.mlog + if mlog.submit_time is not None: + raise ParseError("不能删除该记录") + return super().perform_destroy(instance) \ No newline at end of file