testrecord update接口

This commit is contained in:
caoqianming 2021-12-16 10:19:50 +08:00
parent 759062e3a2
commit 2062ee7b75
3 changed files with 40 additions and 74 deletions

View File

@ -62,7 +62,6 @@ class TestRecord(CommonADModel):
form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE) form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE)
type = models.PositiveSmallIntegerField(choices=type_choice, default=TEST_PROCESS) type = models.PositiveSmallIntegerField(choices=type_choice, default=TEST_PROCESS)
is_testok = models.BooleanField('是否合格', default=True) is_testok = models.BooleanField('是否合格', default=True)
is_testok_robot = models.BooleanField('自动判定的是否合格', default=True)
number = models.CharField('产品编号', null=True, blank=True, max_length=50) 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') 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) 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) field_value = models.JSONField('录入值', default=dict, blank=True)
is_hidden = models.BooleanField('是否隐藏', default=False) is_hidden = models.BooleanField('是否隐藏', default=False)
is_testok = models.BooleanField('是否合格', null=True, blank=True) 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') test_record = models.ForeignKey(TestRecord, verbose_name='关联的检验记录', on_delete=models.CASCADE, related_name='item_test_record')

View File

@ -109,10 +109,9 @@ class TestRecordDetailSerializer(serializers.ModelSerializer):
return super().to_representation(instance) return super().to_representation(instance)
class TestRecordItemUpdatexSerializer(serializers.Serializer): class TestRecordItemUpdatexSerializer(serializers.Serializer):
id = serializers.PrimaryKeyRelatedField(queryset=TestRecordItem.objects.all()) class Meta:
field_value = serializers.JSONField(allow_null=True, required=False) model = TestRecordItem
is_testok = serializers.BooleanField(allow_null=True, required=False) fields = ['form_field', 'field_value', 'is_hidden', 'is_testok']
is_hidden = serializers.BooleanField(default=False)
class TestRecordUpdateSerializer(serializers.ModelSerializer): class TestRecordUpdateSerializer(serializers.ModelSerializer):
record_data = TestRecordItemUpdatexSerializer(many=True, write_only=True) record_data = TestRecordItemUpdatexSerializer(many=True, write_only=True)
@ -124,11 +123,23 @@ class TestRecordUpdateSerializer(serializers.ModelSerializer):
record_data = validated_data.pop('record_data') record_data = validated_data.pop('record_data')
for attr, value in validated_data.items(): for attr, value in validated_data.items():
setattr(instance, attr, value) setattr(instance, attr, value)
instance.save() instance.save(self.context['request'].user)
for i in record_data: # 更新items
tri = i['id'] items = TestRecordItem.objects.filter(test_record=instance, is_deleted=False)
tri.field_value = i['field_value'] for m in record_data: # 保存或创建记录详情
tri.is_testok = i['is_testok'] form_field = m['form_field']
tri.is_hidden = i['is_hidden'] for i in items:
tri.save() 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 return instance

View File

@ -188,7 +188,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
@action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestFormInitSerializer) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestFormInitSerializer)
def test_init(self, request, pk=None): def test_init(self, request, pk=None):
""" """
检验表单初始化 检验记录创建及初始化
""" """
serializer = WpmTestFormInitSerializer(data=request.data) serializer = WpmTestFormInitSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
@ -198,74 +198,31 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
if wproduct.test: if wproduct.test:
raise exceptions.APIException('存在进行中检验') 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, 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]: WProduct.WPR_ACT_STATE_TORETEST, WProduct.WPR_ACT_STATE_TOFINALTEST, WProduct.WPR_ACT_STATE_TOCOMBTEST]:
raise exceptions.APIException('该产品当前状态不可检验') raise exceptions.APIException('该产品当前状态不可检验')
if 'is_testok' not in vdata:
raise exceptions.APIException('未填写检验结论')
savedict = dict(create_by = self.request.user, savedict = dict(
material=wproduct.material, number=wproduct.number, subproduction_plan=wproduct.subproduction_plan, step=wproduct.step) 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 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 savedict['type'] = TestRecord.TEST_PROCESS_RE
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOFINALTEST: elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOFINALTEST:
savedict['type'] = TestRecord.TEST_FINAL savedict['type'] = TestRecord.TEST_FINAL
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST:
savedict['type'] = TestRecord.TEST_COMB savedict['type'] = TestRecord.TEST_COMB
obj = serializer.save(**savedict) tr = TestRecord.objects.create(**savedict)
tris = [] return Response(TestRecordDetailSerializer(instance=tr).data)
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()
@action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer)
@transaction.atomic @transaction.atomic
@ -551,7 +508,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
wps = WProduct.objects.filter(ow_wproduct__operation = op) wps = WProduct.objects.filter(ow_wproduct__operation = op)
wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now()) wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now())
else: else:
raise exceptions.APIException('产出物料错误') raise exceptions.APIException('产出物料未填写或填写错误')
op.is_submited = True op.is_submited = True
op.save() op.save()
return Response() return Response()