diff --git a/apps/mtm/migrations/0034_route_batch_bind.py b/apps/mtm/migrations/0034_route_batch_bind.py new file mode 100644 index 00000000..3792ca7a --- /dev/null +++ b/apps/mtm/migrations/0034_route_batch_bind.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2024-07-11 03:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0033_auto_20240704_1003'), + ] + + operations = [ + migrations.AddField( + model_name='route', + name='batch_bind', + field=models.BooleanField(default=True, verbose_name='是否绑定批次'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 5dbb713c..18d81b2d 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -205,6 +205,7 @@ class Route(CommonADModel): is_count_utask = models.BooleanField('是否主任务统计', default=False) out_rate = models.FloatField('出材率', default=100, blank=True) hour_work = models.FloatField('工时', null=True, blank=True) + batch_bind = models.BooleanField('是否绑定批次', default=True) @staticmethod def get_routes(material: Material): diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 3f0fd76a..a05b58af 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -353,6 +353,24 @@ class MlogChangeSerializer(CustomModelSerializer): return attrs +class MlogbInSerializer(CustomModelSerializer): + class Meta: + model = Mlogb + fields = ['id', 'mlog', 'mtask', 'batch', 'count_use'] + extra_kwargs = {'count_use': {'required': True}, 'mtask': {'required': True}, 'batch': {'required': True, 'allow_blank': False}} + + def validate(self, attrs): + mlog: Mlog = attrs['mlog'] + mtask: Mtask = attrs['mtask'] + if mlog.route != mtask.route: + raise ValidationError('工序不匹配') + route = mlog.route + if route.batch_bind: + if not Mlogb.objects.filter(mtask__utask=mtask.utask, mlog__submit_time__isnull=False, material_out__isnull=False, batch=attrs['batch']).exists(): + raise ValidationError('批次号不匹配') + attrs['material_in'] = mlog.material_in + return attrs + class MlogRevertSerializer(serializers.Serializer): change_reason = serializers.CharField(label='撤回原因') diff --git a/apps/wpm/urls.py b/apps/wpm/urls.py index d52b2b87..8b00048a 100644 --- a/apps/wpm/urls.py +++ b/apps/wpm/urls.py @@ -1,7 +1,9 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.wpm.views import SfLogViewSet, StLogViewSet, SfLogExpViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet, AttlogViewSet, OtherLogViewSet +from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet, + WMaterialViewSet, MlogViewSet, HandoverViewSet, + AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet) API_BASE_URL = 'api/wpm/' @@ -13,6 +15,8 @@ router.register('stlog', StLogViewSet, basename='stlog') router.register('sflogexp', SfLogExpViewSet, basename='sflogexp') router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('mlog', MlogViewSet, basename='mlog') +router.register('mlogb', MlogbViewSet) +router.register('mlogb/in', MlogbInViewSet) router.register('handover', HandoverViewSet, basename='handover') router.register('attlog', AttlogViewSet, basename='attlog') router.register('otherlog', OtherLogViewSet, basename='otherlog') diff --git a/apps/wpm/views.py b/apps/wpm/views.py index d651ae2c..89249fb9 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -3,7 +3,7 @@ from django.db.models import Prefetch from django.shortcuts import render from rest_framework.decorators import action from rest_framework.exceptions import ParseError -from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin +from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin, CreateModelMixin from rest_framework.response import Response from rest_framework.serializers import Serializer from django.db.models import Sum @@ -20,7 +20,8 @@ from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, At from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogRevertSerializer, MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer, GenHandoverSerializer, GenHandoverWmSerializer, MlogAnaSerializer, - AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer) + AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, + MlogbDetailSerializer, MlogbInSerializer) from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog from apps.utils.thread import MyThread from apps.monitor.services import create_auditlog, delete_auditlog @@ -433,3 +434,16 @@ class OtherLogViewSet(CustomModelViewSet): } search_fields = ['product'] ordering = ['-handle_date', '-create_time'] + + +class MlogbViewSet(ListModelMixin, CustomGenericViewSet): + perms_map = {'get': '*'} + queryset = Mlogb.objects.all() + serializer_class = MlogbDetailSerializer + filterset_fields = ['mlog', 'mtask', 'material_in', 'material_out'] + + +class MlogbInViewSet(CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): + perms_map = {'post': 'mlog.update', 'delete': 'mlog.update'} + queryset = Mlogb.objects.all() + serializer_class = MlogbInSerializer \ No newline at end of file