feat: mlogrever支持单件回退
This commit is contained in:
parent
426be9d805
commit
70e344ed68
|
@ -198,7 +198,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
wm.save()
|
wm.save()
|
||||||
if material_in.tracking == Material.MA_TRACKING_SINGLE:
|
if material_in.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
if mlogbws.count() != mi.count:
|
if mlogbws.count() != mi_count:
|
||||||
raise ParseError("日志与明细数量不一致,操作失败")
|
raise ParseError("日志与明细数量不一致,操作失败")
|
||||||
Wpr.clear([item.number for item in mlogbws])
|
Wpr.clear([item.number for item in mlogbws])
|
||||||
|
|
||||||
|
@ -299,75 +299,33 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
|
|
||||||
mgroup = mlog.mgroup
|
mgroup = mlog.mgroup
|
||||||
belong_dept = mgroup.belong_dept
|
belong_dept = mgroup.belong_dept
|
||||||
material_out = mlog.material_out
|
material_out:Material = mlog.material_out
|
||||||
material_in = mlog.material_in
|
material_in:Material = mlog.material_in
|
||||||
stored_notok = mlog.stored_notok
|
stored_notok = mlog.stored_notok
|
||||||
stored_mgroup = mlog.stored_mgroup
|
stored_mgroup = mlog.stored_mgroup
|
||||||
if material_in:
|
|
||||||
# 领用数退回
|
|
||||||
m_ins_list = []
|
|
||||||
m_ins_bl_list = []
|
|
||||||
into_wm_mgroup = material_in.process.into_wm_mgroup if material_in.process else False
|
|
||||||
m_ins = Mlogb.objects.filter(mlog=mlog, material_in__isnull=False)
|
|
||||||
if m_ins.exists():
|
|
||||||
for mi in m_ins.all():
|
|
||||||
m_ins_list.append((mi.material_in, mi.batch, mi.count_use, mi.wm_in))
|
|
||||||
if mi.count_pn_jgqbl > 0:
|
|
||||||
m_ins_bl_list.append((mi.material_in, mi.batch, mi.count_pn_jgqbl))
|
|
||||||
else:
|
|
||||||
m_ins_list = [(material_in, mlog.batch, mlog.count_use, mlog.wm_in)]
|
|
||||||
for mi in m_ins_list:
|
|
||||||
mi_ma, mi_batch, mi_count, mi_wm_in = mi
|
|
||||||
if mi_wm_in:
|
|
||||||
mi_wm_in.count = mi_wm_in.count + mi_count
|
|
||||||
mi_wm_in.update_by = user
|
|
||||||
mi_wm_in.save()
|
|
||||||
else:
|
|
||||||
# 针对光子的情况,实际上必须需要wm_in
|
|
||||||
lookup = {'batch': mi_batch, 'material': mi_ma, 'mgroup': None, 'state': WMaterial.WM_OK}
|
|
||||||
if into_wm_mgroup:
|
|
||||||
# 退回到本工段
|
|
||||||
lookup['mgroup'] = mgroup
|
|
||||||
else:
|
|
||||||
lookup['belong_dept'] = belong_dept
|
|
||||||
|
|
||||||
wm, _ = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
|
|
||||||
wm.count = wm.count + mi_count
|
|
||||||
wm.update_by = user
|
|
||||||
wm.save()
|
|
||||||
# 针对加工前不良的暂时额外处理
|
|
||||||
for item in m_ins_bl_list:
|
|
||||||
material, batch, count_pn_jgqbl = item
|
|
||||||
if count_pn_jgqbl> 0:
|
|
||||||
lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'notok_sign': 'jgqbl', 'state': WMaterial.WM_NOTOK}
|
|
||||||
wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
|
|
||||||
wm.count = wm.count - count_pn_jgqbl
|
|
||||||
if wm.count < 0:
|
|
||||||
raise ParseError('加工前不良数量大于库存量')
|
|
||||||
if is_create:
|
|
||||||
wm.create_by = user
|
|
||||||
else:
|
|
||||||
wm.update_by = user
|
|
||||||
wm.save()
|
|
||||||
|
|
||||||
|
# 先回退产物
|
||||||
if material_out: # 产物退回
|
if material_out: # 产物退回
|
||||||
# 有多个产物的情况
|
# 有多个产物的情况
|
||||||
# 需要考虑不合格品退回的情况
|
# 需要考虑不合格品退回的情况
|
||||||
m_outs = Mlogb.objects.filter(mlog=mlog, material_out__isnull=False)
|
m_outs = Mlogb.objects.filter(mlog=mlog, material_out__isnull=False)
|
||||||
if m_outs.exists():
|
if m_outs.exists():
|
||||||
m_outs_list = [(mo.material_out, mo.batch if mo.batch else mlog.batch, mo.count_ok, mlog.count_real_eweight, None) for mo in m_outs.all()]
|
m_outs_list = [
|
||||||
|
(mo.material_out, mo.batch if mo.batch else mlog.batch, mo.count_ok, mlog.count_real_eweight, None, mo)
|
||||||
|
for mo in m_outs.all()]
|
||||||
if stored_notok:
|
if stored_notok:
|
||||||
for item in m_outs:
|
for item in m_outs:
|
||||||
for f in Mlogb._meta.fields:
|
for f in Mlogb._meta.fields:
|
||||||
if 'count_n_' in f.name and getattr(item, f.name) > 0:
|
if 'count_n_' in f.name and getattr(item, f.name) > 0:
|
||||||
notok_sign = f.name.replace('count_n_', '')
|
notok_sign = f.name.replace('count_n_', '')
|
||||||
m_outs_list.append( (item.material_out, item.batch if item.batch else mlog.batch, getattr(item, f.name), mlog.count_real_eweight, notok_sign))
|
m_outs_list.append((item.material_out, item.batch if item.batch else mlog.batch,
|
||||||
|
getattr(item, f.name), mlog.count_real_eweight, notok_sign, item))
|
||||||
else:
|
else:
|
||||||
m_outs_list = [(material_out, mlog.batch, mlog.count_ok, mlog.count_real_eweight, None)]
|
m_outs_list = [(material_out, mlog.batch, mlog.count_ok, mlog.count_real_eweight, None, mlog)]
|
||||||
# 一次填写的暂时不处理不合格品
|
# 一次填写的暂时不处理不合格品
|
||||||
|
|
||||||
for mo in m_outs_list:
|
for mo in m_outs_list:
|
||||||
mo_ma, mo_batch, mo_count, _, notok_sign = mo
|
mo_ma, mo_batch, mo_count, _, notok_sign, mlog_or_b = mo
|
||||||
if mo_count == 0:
|
if mo_count == 0:
|
||||||
continue
|
continue
|
||||||
wm_state = WMaterial.WM_OK if notok_sign is None else WMaterial.WM_NOTOK
|
wm_state = WMaterial.WM_OK if notok_sign is None else WMaterial.WM_NOTOK
|
||||||
|
@ -392,6 +350,66 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
elif wm.count >= 0:
|
elif wm.count >= 0:
|
||||||
wm.update_by = user
|
wm.update_by = user
|
||||||
wm.save()
|
wm.save()
|
||||||
|
if material_out.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
|
if mlogbws.count() != mo_count:
|
||||||
|
raise ParseError("日志与明细数量不一致,操作失败")
|
||||||
|
Wpr.clear([item.number for item in mlogbws])
|
||||||
|
|
||||||
|
# 再生成消耗
|
||||||
|
if material_in: # 领用数退回
|
||||||
|
m_ins_list = []
|
||||||
|
m_ins_bl_list = []
|
||||||
|
into_wm_mgroup = material_in.process.into_wm_mgroup if material_in.process else False
|
||||||
|
m_ins = Mlogb.objects.filter(mlog=mlog, material_in__isnull=False)
|
||||||
|
if m_ins.exists():
|
||||||
|
for mi in m_ins.all():
|
||||||
|
m_ins_list.append((mi.material_in, mi.batch, mi.count_use, mi.wm_in, mi))
|
||||||
|
if mi.count_pn_jgqbl > 0:
|
||||||
|
m_ins_bl_list.append((mi.material_in, mi.batch, mi.count_pn_jgqbl, mi))
|
||||||
|
else:
|
||||||
|
m_ins_list = [(material_in, mlog.batch, mlog.count_use, mlog.wm_in, mlog)]
|
||||||
|
for mi in m_ins_list:
|
||||||
|
mi_ma, mi_batch, mi_count, mi_wm_in, mlog_or_b = mi
|
||||||
|
if mi_wm_in:
|
||||||
|
wm = mi_wm_in
|
||||||
|
else:
|
||||||
|
# 针对光子的情况,实际上必须需要wm_in
|
||||||
|
lookup = {'batch': mi_batch, 'material': mi_ma, 'mgroup': None, 'state': WMaterial.WM_OK}
|
||||||
|
if into_wm_mgroup:
|
||||||
|
# 退回到本工段
|
||||||
|
lookup['mgroup'] = mgroup
|
||||||
|
else:
|
||||||
|
lookup['belong_dept'] = belong_dept
|
||||||
|
|
||||||
|
wm, _ = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
|
||||||
|
wm.count = wm.count + mi_count
|
||||||
|
wm.update_by = user
|
||||||
|
wm.save()
|
||||||
|
if material_in.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
|
mlgbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
|
if mlgbws.count() != mi_count:
|
||||||
|
raise ParseError("日志与明细数量不一致,操作失败")
|
||||||
|
for item in mlgbws:
|
||||||
|
Wpr.change_or_new(item.number, material_in, mb=None, wm=wm)
|
||||||
|
|
||||||
|
# 针对加工前不良的暂时额外处理
|
||||||
|
for item in m_ins_bl_list:
|
||||||
|
material, batch, count_pn_jgqbl = item
|
||||||
|
if count_pn_jgqbl> 0:
|
||||||
|
lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'notok_sign': 'jgqbl', 'state': WMaterial.WM_NOTOK}
|
||||||
|
wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
|
||||||
|
wm.count = wm.count - count_pn_jgqbl
|
||||||
|
if wm.count < 0:
|
||||||
|
raise ParseError('加工前不良数量大于库存量')
|
||||||
|
if is_create:
|
||||||
|
wm.create_by = user
|
||||||
|
else:
|
||||||
|
wm.update_by = user
|
||||||
|
wm.save()
|
||||||
|
if material.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
|
raise ParseError("加工前不良的物料暂不支持单件回退")
|
||||||
|
|
||||||
mlog.submit_time = None
|
mlog.submit_time = None
|
||||||
mlog.submit_user = None
|
mlog.submit_user = None
|
||||||
mlog.save()
|
mlog.save()
|
||||||
|
|
Loading…
Reference in New Issue