diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index 6e82b8e..7f0f558 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -62,7 +62,6 @@ class TestRecord(CommonADModel): form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE) type = models.PositiveSmallIntegerField(choices=type_choice, default=TEST_PROCESS) is_testok = models.BooleanField('是否合格', default=True) - is_testok_robot = models.BooleanField('自动判定的是否合格', default=True) number = models.CharField('产品编号', null=True, blank=True, max_length=50) wproduct = models.ForeignKey('wpm.wproduct', verbose_name='关联的动态产品', on_delete=models.CASCADE, null=True, blank=True, related_name='test_wproduct') material = models.ForeignKey('mtm.material', verbose_name='关联的物料状态', on_delete=models.CASCADE, null=True, blank=True) @@ -82,5 +81,4 @@ class TestRecordItem(BaseModel): field_value = models.JSONField('录入值', default=dict, blank=True) is_hidden = models.BooleanField('是否隐藏', default=False) is_testok = models.BooleanField('是否合格', null=True, blank=True) - is_testok_robot = models.BooleanField('自动判定的是否合格', null=True, blank=True) test_record = models.ForeignKey(TestRecord, verbose_name='关联的检验记录', on_delete=models.CASCADE, related_name='item_test_record') \ No newline at end of file diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 6785b0c..ef73911 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -109,10 +109,9 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): return super().to_representation(instance) class TestRecordItemUpdatexSerializer(serializers.Serializer): - id = serializers.PrimaryKeyRelatedField(queryset=TestRecordItem.objects.all()) - field_value = serializers.JSONField(allow_null=True, required=False) - is_testok = serializers.BooleanField(allow_null=True, required=False) - is_hidden = serializers.BooleanField(default=False) + class Meta: + model = TestRecordItem + fields = ['form_field', 'field_value', 'is_hidden', 'is_testok'] class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = TestRecordItemUpdatexSerializer(many=True, write_only=True) @@ -124,11 +123,23 @@ class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = validated_data.pop('record_data') for attr, value in validated_data.items(): setattr(instance, attr, value) - instance.save() - for i in record_data: - tri = i['id'] - tri.field_value = i['field_value'] - tri.is_testok = i['is_testok'] - tri.is_hidden = i['is_hidden'] - tri.save() + instance.save(self.context['request'].user) + # 更新items + items = TestRecordItem.objects.filter(test_record=instance, is_deleted=False) + for m in record_data: # 保存或创建记录详情 + form_field = m['form_field'] + for i in items: + if i.form_field == form_field: + # 更新操作 + i.field_value = m['field_value'] + i.is_testok = m['is_testok'] + i.is_hidden = m['is_hidden'] + i.save() + else: + TestRecordItem.objects.create( + form_field=form_field, + field_value=m['field_value'], + is_testok = m['is_testok'], + is_hidden = m['is_hidden'], + test_record=instance) return instance diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 98f51ad..94c0bda 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -188,7 +188,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestFormInitSerializer) def test_init(self, request, pk=None): """ - 检验表单初始化 + 检验记录创建及初始化 """ serializer = WpmTestFormInitSerializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -198,74 +198,31 @@ class WProductViewSet(ListModelMixin, GenericViewSet): if wproduct.test: raise exceptions.APIException('存在进行中检验') - data = RecordFormDetailSerializer(instance=form).data - data['origin_test'] = None - data['form'] = form.id - # 如果是复检, 需要带入原数据 - if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: - # 查找最近一条检验记录 - trs = wproduct.last_process_test - if trs: - origin_test = TestRecordDetailSerializer(instance=trs).data - data['origin_test_'] = origin_test - data['origin_test'] = origin_test.get('id', None) - o_dict = {} - for i in origin_test['record_data']: - o_dict[i['field_key']] = i['field_value'] - for i in data['form_fields']: - i['origin_value'] = o_dict[i['field_key']] if i['field_key'] in o_dict else None - i['is_hidden'] = o_dict[i['is_hidden']] if i['is_hidden'] in o_dict else False - else: - raise exceptions.APIException('原工序检验记录不存在') - - # 后续加入系统自带数据 - return Response(data) - - @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestRecordCreateSerializer) - @transaction.atomic - def test(self, request, pk=None): - """ - 检验记录提交 - """ - serializer = WpmTestRecordCreateSerializer(data=request.data) - serializer.is_valid(raise_exception=True) - vdata = serializer.validated_data - record_data = vdata.pop('record_data') - wproduct = vdata['wproduct'] + # 根据情况创建一条检验记录 if wproduct.act_state not in [WProduct.WPR_ACT_STATE_TOTEST, WProduct.WPR_ACT_STATE_TORETEST, WProduct.WPR_ACT_STATE_TOFINALTEST, WProduct.WPR_ACT_STATE_TOCOMBTEST]: raise exceptions.APIException('该产品当前状态不可检验') - if 'is_testok' not in vdata: - raise exceptions.APIException('未填写检验结论') - - savedict = dict(create_by = self.request.user, - material=wproduct.material, number=wproduct.number, subproduction_plan=wproduct.subproduction_plan, step=wproduct.step) + + savedict = dict( + create_by = self.request.user, + material=wproduct.material, + number=wproduct.number, + subproduction_plan=wproduct.subproduction_plan, + step=wproduct.step, + form=form) if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: - if not vdata['origin_test']: - raise exceptions.APIException('自检记录不存在') + # 查找最近一条检验记录 + trs = wproduct.last_process_test + savedict['origin_test'] = trs + if not trs: + raise exceptions.APIException('原工序检验记录不存在') savedict['type'] = TestRecord.TEST_PROCESS_RE elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOFINALTEST: savedict['type'] = TestRecord.TEST_FINAL elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: savedict['type'] = TestRecord.TEST_COMB - obj = serializer.save(**savedict) - tris = [] - for m in record_data: # 保存记录详情 - m['is_testok'] = m['is_testok'] if 'is_testok' in m else None - m['is_hidden'] = m['is_hidden'] if 'is_hidden' in m else None - m['test_record'] = obj - tris.append(TestRecordItem(**m)) - TestRecordItem.objects.bulk_create(tris) - - # 如果提交检验 - if obj.is_submited: - WpmServies.update_wproduct_by_test(obj, request.user) - else: - # 保存当前检验 - wproduct.test = obj - wproduct.update_by = request.user - wproduct.save() - return Response() + tr = TestRecord.objects.create(**savedict) + return Response(TestRecordDetailSerializer(instance=tr).data) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer) @transaction.atomic @@ -551,7 +508,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd wps = WProduct.objects.filter(ow_wproduct__operation = op) wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now()) else: - raise exceptions.APIException('产出物料错误') + raise exceptions.APIException('产出物料未填写或填写错误') op.is_submited = True op.save() return Response()