diff --git a/apps/wpm/migrations/0123_mlogbdefect_count_has.py b/apps/wpm/migrations/0123_mlogbdefect_count_has.py new file mode 100644 index 00000000..4ef30708 --- /dev/null +++ b/apps/wpm/migrations/0123_mlogbdefect_count_has.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2025-09-04 08:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0122_auto_20250827_1522'), + ] + + operations = [ + migrations.AddField( + model_name='mlogbdefect', + name='count_has', + field=models.DecimalField(decimal_places=1, default=0, max_digits=11, verbose_name='含有该缺陷的数量'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index a1766aec..7baf2930 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -477,6 +477,7 @@ class MlogbDefect(BaseModel): mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE) defect = models.ForeignKey("qm.Defect", verbose_name='缺陷', on_delete=models.CASCADE, null=True, blank=True) count = models.DecimalField('数量', default=0, max_digits=11, decimal_places=1) + count_has = models.DecimalField('含有该缺陷的数量', default=0, max_digits=11, decimal_places=1) @classmethod def get_defect_qs(cls, ftype="all"): @@ -512,7 +513,7 @@ class Mlogbw(BaseModel): @classmethod def cal_count_notok(cls, mlogb: Mlogb): - from apps.qm.models import Defect + from apps.qm.models import Defect, FtestDefect # 锁定mlogb以防止并发修改 # mlogb:Mlogb = Mlogb.objects.select_for_update().get(pk=mlogb.pk) count = Mlogbw.objects.filter(mlogb=mlogb).count() @@ -523,9 +524,13 @@ class Mlogbw(BaseModel): mlogb.count_real = count count_notok = 0 count_notok_full = 0 - tqs = Mlogbw.objects.filter(mlogb=mlogb, ftest__is_ok=False) - tqs_a = Mlogbw.objects.filter(mlogb=mlogb, ftest__is_ok=False).values("ftest__defect_main").annotate(xcount=Count('id')) - defects = {defect.id: defect for defect in Defect.objects.filter(id__in=tqs.values_list("ftest__defect_main", flat=True))} + # 个追踪的合格b类不分批 + tqs = Mlogbw.objects.filter(mlogb=mlogb, ftest__defect_main__isnull=False) + tqs_a = Mlogbw.objects.filter(mlogb=mlogb, ftest__defect_main__isnull=False).values("ftest__defect_main").annotate(xcount=Count('id')) + defect_ids = tqs.values_list("ftest__defect_main", flat=True) + tqs_has_a = FtestDefect.objects.filter(ftest__mlogbw_ftest__mlogb=mlogb, has=True).values("defect").annotate(xcount=Count('id')) + defect_ids = defect_ids.union(tqs_has_a.values_list("defect", flat=True)) + defects = {defect.id: defect for defect in Defect.objects.filter(id__in=defect_ids)} md_ids = [] for t in tqs_a: md, _ = MlogbDefect.objects.get_or_create(mlogb=mlogb, defect=defects[t["ftest__defect_main"]]) @@ -535,6 +540,13 @@ class Mlogbw(BaseModel): count_notok += t["xcount"] if defects[t["ftest__defect_main"]].okcate != 10: count_notok_full += t["xcount"] + + for t2 in tqs_has_a: + md, _ = MlogbDefect.objects.get_or_create(mlogb=mlogb, defect=defects[t2["defect"]], defaults={"count": 0}) + md.count_has = t2["xcount"] + md.save() + md_ids.append(md.id) + MlogbDefect.objects.filter(mlogb=mlogb).exclude(id__in=md_ids).delete() mlogb.count_notok = count_notok mlogb.count_ok = count - mlogb.count_notok