diff --git a/apps/wpm/services.py b/apps/wpm/services.py index a2da6f0a..fc20c934 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -198,7 +198,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): wm.save() if material_in.tracking == Material.MA_TRACKING_SINGLE: mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b) - if mlogbws.count() != mi.count: + if mlogbws.count() != mi_count: raise ParseError("日志与明细数量不一致,操作失败") 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 belong_dept = mgroup.belong_dept - material_out = mlog.material_out - material_in = mlog.material_in + material_out:Material = mlog.material_out + material_in:Material = mlog.material_in stored_notok = mlog.stored_notok 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: # 产物退回 # 有多个产物的情况 # 需要考虑不合格品退回的情况 m_outs = Mlogb.objects.filter(mlog=mlog, material_out__isnull=False) 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: for item in m_outs: for f in Mlogb._meta.fields: if 'count_n_' in f.name and getattr(item, f.name) > 0: 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: - 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: - 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: continue 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: wm.update_by = user 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_user = None mlog.save()