From 5409f5d55dea13d7c073f51a00fa4ea8adf7f9cd Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 15 Jan 2025 13:37:28 +0800 Subject: [PATCH] feat: mioitemw test --- apps/inm/models.py | 2 ++ apps/inm/serializers.py | 11 +++----- apps/inm/services.py | 12 ++++++-- apps/inm/views.py | 61 ++++++++++++++++++++++++++++------------- 4 files changed, 58 insertions(+), 28 deletions(-) diff --git a/apps/inm/models.py b/apps/inm/models.py index 21cc1543..6f53a6c1 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -185,5 +185,7 @@ class MIOItemw(BaseModel): wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw' , null=True, blank=True) mioitem = models.ForeignKey(MIOItem, verbose_name='关联出入库明细', on_delete=models.CASCADE, related_name='w_mioitem') + ftest = models.ForeignKey("qm.ftest", verbose_name='关联检验记录', on_delete=models.PROTECT, + related_name='ftest_mioitemw', null=True, blank=True) note = models.TextField('备注', null=True, blank=True) \ No newline at end of file diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index fa1515e9..f0468e08 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -12,6 +12,7 @@ from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBa from django.db import transaction from server.settings import get_sysconfig from apps.wpmw.models import Wpr +from apps.qm.serializers import FtestProcessSerializer class WareHourseSerializer(CustomModelSerializer): @@ -100,16 +101,12 @@ class MIOItemwSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS_BASE + ["mioitem"] class MIOItemwTestSerializer(CustomModelSerializer): + ftest = FtestProcessSerializer(required=False) class Meta: model = MIOItemw - fields = ["test_user", "defect_json", "note", "test_json", "is_testok", "test_time", "qct"] + fields = ["id", "ftest"] extra_kwargs = { - 'test_user': {'required': True}, - 'defect_json': {'required': True}, - 'test_json': {'required': True}, - 'is_testok': {'required': True}, - 'test_time': {'required': True}, - 'qct': {'required': True}, + 'ftest': {'required': True}, } class MIOItemCreateSerializer(CustomModelSerializer): diff --git a/apps/inm/services.py b/apps/inm/services.py index a20df501..8e3771f8 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -14,6 +14,8 @@ def do_out(item: MIOItem): """ 生产领料到车间 """ + if item.mb and item.mb.defect is not None: + raise ParseError("生产领料不支持不合格品") from apps.inm.models import MaterialBatch mio:MIO = item.mio belong_dept = mio.belong_dept @@ -65,7 +67,9 @@ def do_out(item: MIOItem): mb = MaterialBatch.objects.get( material=xmaterial, warehouse=item.warehouse, - batch=xbatch + batch=xbatch, + state=10, + defect=None ) except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e: raise ParseError(f"批次错误!{e}") @@ -108,11 +112,13 @@ def do_in(item: MIOItem): 生产入库后更新车间物料 """ mio = item.mio + if mio.wm and mio.wm.defect is not None: + raise ParseError("不合格物料无法入库") belong_dept = mio.belong_dept mgroup = mio.mgroup do_user = mio.do_user material = item.material - if material.into_wm is False: + if material.into_wm is False: # 根据配置不进行入车间库存的处理 return action_list = [] mias = MIOItemA.objects.filter(mioitem=item) @@ -168,6 +174,8 @@ def do_in(item: MIOItem): material=xmaterial, warehouse=item.warehouse, batch=xbatch, + state=10, + defect=None, defaults={ "count": 0, "batch_ofrom": wm.batch_ofrom, diff --git a/apps/inm/views.py b/apps/inm/views.py index cac5efd2..565b0c2c 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -21,6 +21,8 @@ from apps.utils.mixins import (BulkCreateModelMixin, BulkDestroyModelMixin, Bulk CustomListModelMixin) from apps.utils.permission import has_perm from .filters import MaterialBatchFilter, MioFilter +from apps.qm.serializers import FtestProcessSerializer +from apps.mtm.models import Material # Create your views here. @@ -255,6 +257,8 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode 半成品检验 """ ins: MIOItem = self.get_object() + if ins.material.tracking != Material.MA_TRACKING_BATCH: + raise ParseError('该物料非批次管理') mio = ins.mio if ins.test_date: raise ParseError('该明细已检验') @@ -292,6 +296,8 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode 入厂检验 """ ins: MIOItem = self.get_object() + if ins.material.tracking != Material.MA_TRACKING_BATCH: + raise ParseError('该物料非批次管理') if ins.test_date: raise ParseError('该明细已检验') sr = MIOItemPurInTestSerializer(instance=ins, data=request.data) @@ -325,26 +331,43 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode return Response(res) -class MIOItemwViewSet(CustomGenericViewSet): +class MIOItemwViewSet(CustomListModelMixin, CustomGenericViewSet): queryset = MIOItemw.objects.all() serializer_class = MIOItemwSerializer - # @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemwTestSerializer) - # @transaction.atomic - # def test(self, request, *args, **kwargs): - # """单个检验 - # - # 单个检验 - # """ - # ins: MIOItemw = self.get_object() - # if ins.test_time is not None: - # raise ParseError("该单件已检验") - # sr = MIOItemwTestSerializer(instance=ins, data=request.data) - # sr.is_valid(raise_exception=True) - # sr.save() - # if ins.mioitem.mio.submit_time is not None: - # # 已提交需要更新库存 - # # todo - # pass - # return Response() + def cal_mioitem_count(self, mioitem): + count = MIOItemw.objects.filter(mioitem=mioitem).count() + mioitem.count = count + mioitem.count_notok = MIOItemw.objects.filter(mioitem=mioitem, ftest__is_ok=False).count() + mioitem.count_ok = count - mioitem.count_notok + mioitem.save() + + @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemwTestSerializer) + @transaction.atomic + def test(self, request, *args, **kwargs): + """单个检验 + + 单个检验 + """ + ins: MIOItemw = self.get_object() + sr = MIOItemTestSerializer(instance=ins, data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + ftest_data = vdata.pop("ftest", None) + ftest = ins.ftest + if not ftest: + ftest_sr = FtestProcessSerializer(data=ftest_data) + ftest = ftest_sr.create(ftest_data) + ins.ftest = ftest + ins.save() + mioitem: MIOItem = ins.mioitem + if mioitem.test_user is None: + mioitem.test_user = ftest.test_user + mioitem.test_date = ftest.test_date + mioitem.save() + else: + ftest_sr = FtestProcessSerializer() + ftest_sr.update(instance=ftest, validated_data=ftest_data) + self.cal_mioitem_count(ins.mioitem) + return Response(sr.data) \ No newline at end of file