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)
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')

View File

@ -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

View File

@ -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()