diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index e659c0c..00b1692 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -30,9 +30,13 @@ def update_inm(instance:FIFO, type:int=1): ip = {} ip['warehouse'] = warehouse ip['batch'] = i.batch - ip['wproduct'] = m.wproduct + wp = m.wproduct + ip['wproduct'] = wp ip['number'] = m.number ip['material'] = m.material + ip['is_mtested'] = wp.is_mtested + ip['is_mtestok'] = wp.is_mtestok + ip['remark_mtest'] = wp.remark_mtest ips2.append(IProduct(**ip)) IProduct.objects.bulk_create(ips2) diff --git a/hb_server/apps/wpm/migrations/0045_auto_20220107_0917.py b/hb_server/apps/wpm/migrations/0045_auto_20220107_0917.py new file mode 100644 index 0000000..9956f38 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0045_auto_20220107_0917.py @@ -0,0 +1,43 @@ +# Generated by Django 3.2.9 on 2022-01-07 01:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0044_auto_20220104_1641'), + ] + + operations = [ + migrations.AddField( + model_name='wproduct', + name='is_mtested', + field=models.BooleanField(default=False, verbose_name='是否军检'), + ), + migrations.AddField( + model_name='wproduct', + name='is_mtestok', + field=models.BooleanField(blank=True, null=True, verbose_name='是否军检合格'), + ), + migrations.AddField( + model_name='wproduct', + name='remark_mtest', + field=models.TextField(blank=True, null=True, verbose_name='军检备注'), + ), + migrations.AddField( + model_name='wproductflow', + name='is_mtested', + field=models.BooleanField(default=False, verbose_name='是否军检'), + ), + migrations.AddField( + model_name='wproductflow', + name='is_mtestok', + field=models.BooleanField(blank=True, null=True, verbose_name='是否军检合格'), + ), + migrations.AddField( + model_name='wproductflow', + name='remark_mtest', + field=models.TextField(blank=True, null=True, verbose_name='军检备注'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index a01de96..d07847a 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -94,6 +94,7 @@ class WProduct(CommonAModel): ng_sign = models.PositiveSmallIntegerField('不合格标记', choices=ng_choices, null=True, blank=True) warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True) + operation = models.ForeignKey('wpm.operation', verbose_name='当前操作', on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_operation') coperation = models.ForeignKey('wpm.operation', verbose_name='创建所关联操作', @@ -103,6 +104,10 @@ class WProduct(CommonAModel): ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_ticket') + is_mtested = models.BooleanField('是否军检', default=False) + is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) + remark_mtest = models.TextField('军检备注', null=True, blank=True) + @property def last_process_test(self): """ @@ -154,6 +159,10 @@ class WproductFlow(CommonAModel): ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True) + is_mtested = models.BooleanField('是否军检', default=False) + is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) + remark_mtest = models.TextField('军检备注', null=True, blank=True) + is_lastlog = models.BooleanField('是否该子计划下的最后一条日志', default=True) change_str = models.CharField('变动描述', default='', max_length=1000) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 2d48b4d..f7ef457 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -4,6 +4,7 @@ from apps.em.models import Equipment from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse from apps.inm.signals import update_inm +from apps.inm.serializers import WareHouseSimpleSerializer from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer @@ -140,6 +141,7 @@ class WProductListSerializer(serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) step_ = StepSimpleSerializer(source='step', read_only=True) subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True) + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) class Meta: model = WProduct fields = '__all__' @@ -452,4 +454,9 @@ class CuttingListSerializer(serializers.ModelSerializer): create_by_ = UserSimpleSerializer(source='operation.create_by', read_only=True) class Meta: model = OperationMaterial - fields = '__all__' \ No newline at end of file + fields = '__all__' + +class WproductMtestSerializer(serializers.ModelSerializer): + class Meta: + model = WProduct + fields = ['remark_mtest', 'is_mtestok'] \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index d0e0986..bf7d149 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -22,7 +22,7 @@ from apps.wf.serializers import WorkflowSimpleSerializer from apps.wpm.filters import CuttingFilterSet, WMaterialFilterSet, WProductFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket -from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer +from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -190,7 +190,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): 半成品 """ perms_map={'*':'*'} - queryset = WProduct.objects.select_related('step', 'material', 'subproduction_plan') + queryset = WProduct.objects.select_related('step', 'material', 'subproduction_plan', 'warehouse') serializer_class = WProductListSerializer filterset_class = WProductFilterSet search_fields = ['number'] @@ -424,7 +424,25 @@ class WProductViewSet(ListModelMixin, GenericViewSet): else: raise exceptions.APIException('未找到对应审批流程') - + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WproductMtestSerializer) + @transaction.atomic + def mtest(self, request, pk=None): + """ + 军检 + """ + obj = self.get_object() + if obj.is_mtested: + raise exceptions.APIException('已进行军检') + if obj.material.type != Material.MA_TYPE_GOOD: + raise exceptions.APIException('军检必须是成品') + obj.remark_mtest = request.data.get('remark_mtest', None) + obj.is_mtested = True + is_mtestok = request.data.get('is_mtestok') + obj.is_mtestok = is_mtestok + if is_mtestok: + WpmServies.update_plan_state_by_mtestok(obj.subproduction_plan.production_plan) + obj.save() + return Response() class WproductTicketViewSet(ListModelMixin, GenericViewSet): """