feat: mlogbw增加质检统计

This commit is contained in:
caoqianming 2025-01-08 16:21:18 +08:00
parent 2331bec13b
commit 5f88433a25
3 changed files with 27 additions and 15 deletions

View File

@ -346,6 +346,11 @@ class Mlogb(BaseModel):
count_notok_json = models.JSONField('不合格情况', default=list, blank=True)
defects = models.ManyToManyField("qm.defect", verbose_name='不合格缺陷',
through="wpm.mlogbdefect", blank=True)
def get_tracking(self):
if self.material_in:
return "in", self.material_in.tracking
elif self.material_out:
return "out", self.material_out.tracking
def cal_count(self):
self.count_notok = MlogbDefect.objects.filter(

View File

@ -580,12 +580,12 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer):
def validate(self, attrs):
mlogb:Mlogb = attrs["mlogb"]
material_in:Material = mlogb.material_in
material_out:Material = mlogb.material_out
if material_in and material_in.tracking != Material.MA_TRACKING_SINGLE:
raise ParseError("非追踪单件无需填写")
if material_out and material_out.tracking != Material.MA_TRACKING_SINGLE:
raise ParseError("非追踪单件无需填写")
wpr:Wpr = attrs.get("wpr", None)
in_or_out, tracking = mlogb.get_tracking()
if tracking != Material.MA_TRACKING_SINGLE:
raise ValidationError('非单件追踪不可使用')
if in_or_out == 'in' and not wpr:
raise ValidationError('请选择相应产品')
return attrs
def update(self, instance, validated_data):
@ -887,3 +887,10 @@ class MlogbDefectSerializer(CustomModelSerializer):
model = MlogbDefect
fields = "__all__"
read_only_fields = EXCLUDE_FIELDS_BASE
def create(self, validated_data):
defect = validated_data["defect"]
mlogb = validated_data["mlogb"]
if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists():
raise ParseError('该缺陷已填写')
return super().create(validated_data)

View File

@ -586,18 +586,18 @@ class MlogbwViewSet(CustomModelViewSet):
def filter_queryset(self, queryset):
if not self.detail and not self.request.query_params.get('mlogb', None):
raise ParseError('请指定所属日志明细')
raise ParseError('请指定所属消耗/产出明细')
return super().filter_queryset(queryset)
def cal_mlogb_count(self, mlogb):
count = Mlogbw.objects.filter(mlogb=mlogb).count()
# 此处先不管检验问题
# todo
if mlogb.material_in:
mlogb.count_use = count
elif mlogb.material_out:
mlogb.count_real = count
mlogb.count_ok = count
mlogb.count_notok = 0
mlogb.save()
@transaction.atomic
@ -613,10 +613,13 @@ class MlogbwViewSet(CustomModelViewSet):
mlogb_to = mlogb.mlogb_to
material_out:Material = mlogb.mlog.material_out
if mlogb_to and material_out.tracking == Material.MA_TRACKING_SINGLE:
for item in Mlogbw.objects.filter(mlogb=mlogb).order_by("number"):
Mlogbw.objects.get_or_create(mlogb=mlogb_to, wpr=item.wpr, defaults={"number": item.number})
Mlogbw.objects.get_or_create(mlogb=mlogb_to, wpr=ins.wpr, defaults={"number": ins.number})
self.cal_mlogb_count(mlogb_to)
@transaction.atomic
def perform_update(self, serializer):
mlogbw = serializer.save()
@transaction.atomic
def perform_destroy(self, instance:Mlogbw):
mlogb = instance.mlogb
@ -626,16 +629,13 @@ class MlogbwViewSet(CustomModelViewSet):
if instance.ftest:
instance.ftest.delete()
self.cal_mlogb_count(mlogb)
# 如果是输入且输出追踪到个,需同步创建
# 如果是输入且输出追踪到个,需同步删除
material_in: Material = mlogb.material_in
if material_in is not None:
mlogb_to = mlogb.mlogb_to
material_out: Material = mlogb.mlog.material_out
if mlogb_to and material_out.tracking == Material.MA_TRACKING_SINGLE:
number_list = Mlogbw.objects.filter(mlogb=mlogb).values_list("number", flat=True)
wprId_list = Mlogbw.objects.filter(mlogb=mlogb).values_list("wpr__id", flat=True)
Mlogbw.objects.filter(mlogb=mlogb_to, number__in=number_list).delete()
Mlogbw.objects.filter(mlogb=mlogb_to, wpr__id__in=wprId_list).delete()
Mlogbw.objects.filter(mlogb=mlogb_to, wpr=instance.wpr).delete()
self.cal_mlogb_count(mlogb_to)