feat: mlogbdefect添加count_has 字段

This commit is contained in:
caoqianming 2025-09-04 16:48:41 +08:00
parent 65726e967f
commit 65d47008a4
2 changed files with 34 additions and 4 deletions

View File

@ -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='含有该缺陷的数量'),
),
]

View File

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