feat: ftestwork的submit支持defect

This commit is contained in:
caoqianming 2025-01-13 11:23:42 +08:00
parent 942e54a7e4
commit 69daa63ea6
2 changed files with 94 additions and 67 deletions

View File

@ -181,7 +181,7 @@ class FtestWorkCreateUpdateSerializer(CustomModelSerializer):
with transaction.atomic(): with transaction.atomic():
ins: FtestWork = super().create(validated_data) ins: FtestWork = super().create(validated_data)
for ftestworkdefect in ftestworkdefect: for ftestworkdefect in ftestworkdefect:
FtestworkDefect.objects.create(ftest=ins, **ftestworkdefect) FtestworkDefect.objects.create(ftestwork=ins, **ftestworkdefect)
if ftestworkdefect: if ftestworkdefect:
ins.cal_count() ins.cal_count()

View File

@ -1,10 +1,10 @@
from apps.qm.models import FtestWork from apps.qm.models import FtestWork, FtestworkDefect
from apps.wpm.models import WMaterial from apps.wpm.models import WMaterial
from apps.system.models import User from apps.system.models import User
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from django.utils import timezone from django.utils import timezone
from apps.wf.models import Ticket from apps.wf.models import Ticket
from apps.qm.models import NotOkOption from apps.qm.models import NotOkOption, Defect
from apps.utils.thread import MyThread from apps.utils.thread import MyThread
from apps.wpm.services_2 import get_alldata_with_batch_and_store from apps.wpm.services_2 import get_alldata_with_batch_and_store
@ -24,74 +24,101 @@ def ftestwork_submit_validate(ins: FtestWork):
def ftestwork_submit(ins:FtestWork, user: User): def ftestwork_submit(ins:FtestWork, user: User):
wm:WMaterial = ins.wm wm:WMaterial = ins.wm
if ins.need_update_wm: if ins.need_update_wm:
if wm.state == WMaterial.WM_TEST: if ins.qct is None:
# 更新对应的车间库存 if wm.state == WMaterial.WM_TEST:
wm.count = wm.count - ins.count # 更新对应的车间库存
if wm.count >= 0: wm.count = wm.count - ins.count
# 已检测的数量 if wm.count >= 0:
wm.count_xtest = wm.count_xtest + ins.count # 已检测的数量
wm.save() wm.count_xtest = wm.count_xtest + ins.count
else: wm.save()
raise ParseError("超过待检数量") else:
# 寻找count_notok_json中的b类不合格不进行处理 raise ParseError("超过待检数量")
# 寻找count_notok_json中的b类不合格不进行处理
count_notok_json = ins.count_notok_json
need_move_count = 0
for k, v in count_notok_json.items():
if v > 0:
notok_sign = k.replace('count_n_', '')
if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b': # b类不合格在后续处理
need_move_count = need_move_count + v
count_ok = ins.count_ok - need_move_count
if count_ok > 0:
wm, new_create = WMaterial.objects.get_or_create(
material=wm.material,
batch=wm.batch,
mgroup=wm.mgroup,
belong_dept=wm.belong_dept,
state=WMaterial.WM_OK,
notok_sign=None,
defaults={
'count': count_ok,
}
)
if not new_create:
wm.count = wm.count + count_ok
wm.save()
else: # 如果直接对工段库存检验 , 则直接扣减不合格数
wm.count = wm.count - ins.count_notok
if wm.count >= 0:
wm.save()
else:
raise ParseError("不合格数不可大于批次数量")
# 生成不合格的
count_notok_json = ins.count_notok_json count_notok_json = ins.count_notok_json
need_move_count = 0
for k, v in count_notok_json.items(): for k, v in count_notok_json.items():
if v > 0: if v > 0:
notok_sign = k.replace('count_n_', '') notok_sign = k.replace('count_n_', '')
if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b': # b类不合格在后续处理 astate = WMaterial.WM_NOTOK
need_move_count = need_move_count + v if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b':
count_ok = ins.count_ok - need_move_count astate = WMaterial.WM_OK
if count_ok > 0: wm_n, new_create = WMaterial.objects.get_or_create(
wm, new_create = WMaterial.objects.get_or_create( material=wm.material,
material=wm.material, batch=wm.batch,
batch=wm.batch, mgroup=wm.mgroup,
mgroup=wm.mgroup, belong_dept=wm.belong_dept,
belong_dept=wm.belong_dept, notok_sign=notok_sign,
state=WMaterial.WM_OK, state=astate,
notok_sign=None, defaults={
defaults={ 'count': v,
'count': count_ok, 'material': wm.material,
} 'batch': wm.batch,
) 'mgroup': wm.mgroup,
if not new_create: 'belong_dept': wm.belong_dept,
wm.count = wm.count + count_ok 'notok_sign': notok_sign,
wm.save() 'state': astate,
else: # 如果直接对工段库存检验 , 则直接扣减不合格数 }
wm.count = wm.count - ins.count_notok )
if wm.count >= 0: if not new_create:
wm.save() wm_n.count = wm_n.count + v
else: wm_n.save()
raise ParseError("不合格数不可大于批次数量") else:
wm:WMaterial = ins.wm
# 生成不合格的 # 此时调用了qct表
count_notok_json = ins.count_notok_json for item in FtestworkDefect.objects.filter(ftestwork=ins):
for k, v in count_notok_json.items(): item:FtestworkDefect = item
if v > 0: if item.count > 0 and item.defect.okcate == Defect.DEFECT_NOTOK:
notok_sign = k.replace('count_n_', '') ins.count = ins.count - item.count
astate = WMaterial.WM_NOTOK if ins.count < 0:
if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b': raise ParseError("数量不足,扣减失败")
astate = WMaterial.WM_OK wm, new_create = WMaterial.objects.get_or_create(
wm_n, new_create = WMaterial.objects.get_or_create( material=wm.material,
material=wm.material, batch=wm.batch,
batch=wm.batch, mgroup=wm.mgroup,
mgroup=wm.mgroup, belong_dept=wm.belong_dept,
belong_dept=wm.belong_dept, state=WMaterial.WM_NOTOK,
notok_sign=notok_sign, notok_sign=None,
state=astate, defect=item.defect,
defaults={ defaults={
'count': v, 'count': item.count,
'material': wm.material, }
'batch': wm.batch, )
'mgroup': wm.mgroup, if not new_create:
'belong_dept': wm.belong_dept, wm.count = wm.count + item.count
'notok_sign': notok_sign, wm.save()
'state': astate, ins.save()
}
)
if not new_create:
wm_n.count = wm_n.count + v
wm_n.save()
ins.submit_user = user ins.submit_user = user
ins.submit_time = timezone.now() ins.submit_time = timezone.now()
ins.save() ins.save()