fix: mlogbupdate bug

This commit is contained in:
caoqianming 2025-03-03 15:47:53 +08:00
parent 666fbd306b
commit 7e40596665
1 changed files with 29 additions and 29 deletions

View File

@ -707,45 +707,45 @@ class MlogbOutUpdateSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS_BASE + ['mlog', 'mtask', 'wm_in', 'material_in', 'material_out', read_only_fields = EXCLUDE_FIELDS_BASE + ['mlog', 'mtask', 'wm_in', 'material_in', 'material_out',
'count_use', 'count_break', 'count_pn_jgqbl', 'mlogbdefect', "qct"] 'count_use', 'count_break', 'count_pn_jgqbl', 'mlogbdefect', "qct"]
def create(self, validated_data): # def create(self, validated_data):
material_out:Material = validated_data["material_out"] # material_out:Material = validated_data["material_out"]
mlogbdefect = validated_data.pop("mlogbdefect", []) # mlogbdefect = validated_data.pop("mlogbdefect", [])
with transaction.atomic(): # with transaction.atomic():
ins = super().create(validated_data) # ins = super().create(validated_data)
if mlogbdefect and material_out.tracking == Material.MA_TRACKING_BATCH: # if mlogbdefect and material_out.tracking == Material.MA_TRACKING_BATCH:
count_notok = 0 # count_notok = 0
mlogbdefect_new = [item for item in mlogbdefect if item["count"] > 0] # mlogbdefect_new = [item for item in mlogbdefect if item["count"] > 0]
for item in mlogbdefect_new: # for item in mlogbdefect_new:
defect:Defect = item["defect"] # defect:Defect = item["defect"]
MlogbDefect.objects.create(mlogb=ins, **item) # MlogbDefect.objects.create(mlogb=ins, **item)
if defect.cate == Defect.DEFECT_NOTOK: # if defect.cate == Defect.DEFECT_NOTOK:
count_notok +=1 # count_notok +=1
ins.count_notok = count_notok # ins.count_notok = count_notok
ins.count_ok = ins.count_real - ins.count_notok # ins.count_ok = ins.count_real - ins.count_notok
ins.save() # ins.save()
else: # else:
raise ParseError("mlogbdefect仅支持批次件") # raise ParseError("mlogbdefect仅支持批次件")
return ins # return ins
def update(self, instance, validated_data): def update(self, instance, validated_data):
material_out:Material = instance.material_out
mlogbdefect = validated_data.pop("mlogbdefect", []) mlogbdefect = validated_data.pop("mlogbdefect", [])
with transaction.atomic(): with transaction.atomic():
ins:Mlogb = super().update(instance, validated_data) ins:Mlogb = super().update(instance, validated_data)
if mlogbdefect and material_out.tracking == Material.MA_TRACKING_BATCH: if (instance.qct or mlogbdefect) and instance.material_out.tracking == Material.MA_TRACKING_BATCH:
count_notok = 0 count_notok = 0
md_ids = [] md_ids = []
for item in mlogbdefect: for item in mlogbdefect:
defect = item["defect"] defect:Defect = item["defect"]
insb, _ = MlogbDefect.objects.get_or_create(mlogb=ins, defect=defect, floor=item.get('floor', None)) if item["count"] > 0:
insb.count = item["count"] insb, _ = MlogbDefect.objects.get_or_create(mlogb=ins, defect=defect, floor=item.get('floor', None))
insb.save(update_fields=["count"]) insb.count = item["count"]
if defect.cate == Defect.DEFECT_NOTOK: insb.save(update_fields=["count"])
count_notok +=1 if defect.okcate == Defect.DEFECT_NOTOK:
count_notok += item["count"]
md_ids.append(insb.id) md_ids.append(insb.id)
Mlogbw.objects.filter(mlogb=ins).exclude(id__in=md_ids).delete() MlogbDefect.objects.filter(mlogb=ins).exclude(id__in=md_ids).delete()
ins.count_notok = count_notok ins.count_notok = count_notok
ins.count_ok = ins.count_real ins.count_ok = ins.count_real - ins.count_notok
ins.save() ins.save()
return ins return ins