factory/apps/qm/services.py

116 lines
4.4 KiB
Python

from apps.qm.models import FtestWork
from apps.wpm.models import WMaterial
from apps.system.models import User
from rest_framework.exceptions import ParseError
from django.utils import timezone
from apps.wf.models import Ticket
from apps.qm.models import NotOkOption
def ftestwork_submit_validate(ins: FtestWork):
wm:WMaterial = ins.wm
if ins.need_update_wm:
if wm.state == WMaterial.WM_TEST:
xcount = wm.count - ins.count
if xcount < 0:
raise ParseError("超过待检数量")
else:
xcount = wm.count - ins.count_notok
if xcount < 0:
raise ParseError("不合格数不可大于批次数量")
def ftestwork_submit(ins:FtestWork, user: User):
wm:WMaterial = ins.wm
if ins.need_update_wm:
if wm.state == WMaterial.WM_TEST:
# 更新对应的车间库存
wm.count = wm.count - ins.count
if wm.count >= 0:
# 已检测的数量
wm.count_xtest = wm.count_xtest + ins.count
wm.save()
else:
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
for k, v in count_notok_json.items():
if v > 0:
notok_sign = k.replace('count_n_', '')
astate = WMaterial.WM_NOTOK
if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b':
astate = WMaterial.WM_OK
wm_n, new_create = WMaterial.objects.get_or_create(
material=wm.material,
batch=wm.batch,
mgroup=wm.mgroup,
belong_dept=wm.belong_dept,
notok_sign=notok_sign,
state=astate,
defaults={
'count': v,
'material': wm.material,
'batch': wm.batch,
'mgroup': wm.mgroup,
'belong_dept': wm.belong_dept,
'notok_sign': notok_sign,
'state': astate,
}
)
if not new_create:
wm_n.count = wm_n.count + v
wm_n.save()
ins.submit_user = user
ins.submit_time = timezone.now()
ins.save()
def bind_ftestwork(ticket: Ticket, transition, new_ticket_data: dict):
ins = FtestWork.objects.get(id=new_ticket_data['t_id'])
if ins.submit_time is not None:
raise ParseError('该检验工作不可提交审批')
ftestwork_submit_validate(ins)
ticket_data = ticket.ticket_data
ticket_data.update({
't_model': 'ftestwork',
't_id': ins.id,
})
ticket.ticket_data = ticket_data
ticket.create_by = ins.create_by
ticket.save()
if ins.ticket is None:
ins.ticket = ticket
ins.save()
def ftestwork_audit_end(ticket: Ticket):
ins = FtestWork.objects.get(id=ticket.ticket_data['t_id'])
ftestwork_submit(ins, ticket.create_by)