feat: mlogbin时从单个拆分为多个批次

This commit is contained in:
caoqianming 2025-03-10 16:00:01 +08:00
parent f295956c69
commit 85cc38c842
2 changed files with 53 additions and 50 deletions

View File

@ -686,6 +686,13 @@ class MlogbInSerializer(CustomModelSerializer):
raise ParseError('生产日志已提交不可编辑')
with transaction.atomic():
ins:Mlogb = super().create(validated_data)
if mlog.is_fix:
if mlog.material_in is None:
mlog.material_in = ins.material_in
mlog.save(update_fields="material_in")
elif mlog.material_in != ins.material_in:
raise ParseError('返修记录必须使用同一物料')
if mlogbdefect is not None and ins.material_in.tracking == Material.MA_TRACKING_BATCH:
mlogb_defect_objects = [
MlogbDefect(**{**item, "mlogb": ins, "id": idWorker.get_id()})

View File

@ -565,8 +565,9 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
mlogbin: Mlogb = serializer.save()
mlog:Mlog = mlogbin.mlog
route:Route = mlog.route
mgroup:Mgroup = mlog.mgroup
mtype = route.process.mtype if route else None
is_fix = mlog.is_fix
qct = mlog.qct
# 以及mlogbw
material_in:Material = mlogbin.material_in
# 如果是返修,则输出和输入相同
@ -583,58 +584,53 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
}
m_dict['batch'] = generate_new_batch(mlogbin.batch, mlog)
wm_in: WMaterial = mlogbin.wm_in
mlogbout, is_create = Mlogb.objects.get_or_create(**m_dict, defaults=
{"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom})
if is_create:
d_count_real = 0
d_count_ok = 0
if route:
if route.process.mtype == Process.PRO_NORMAL:
d_count_real = mlogbin.count_use
d_count_ok = mlogbin.count_use
elif route.process.mtype == Process.PRO_DIV:
xcount = mlogbin.count_use * route.div_number
d_count_real = xcount
d_count_ok = xcount
elif route.process.mtype == Process.PRO_MERGE:
xcount = math.floor( mlogbin.count_use / route.div_number)
d_count_real = xcount
d_count_ok = xcount
elif is_fix:
d_count_real = mlogbin.count_use
d_count_ok = mlogbin.count_use
# 找寻质检表
if is_fix and mgroup.process.type == Process.PRO_PROD:
# 如果是生产返修,则忽略质检
pass
elif mlogbout.qct is None:
mlogbout.qct = Qct.get(mlogbout.material_out, "process") if mlog.qct is None else mlog.qct
if mlogbout.qct is not None and mlog.qct is None:
mlog.qct = mlogbout.qct
mlog.save(update_fields=["qct"])
mlogbout.count_real = d_count_real
mlogbout.count_ok = d_count_ok
mlogbout.save()
mlogbin.mlogb_to = mlogbout
mlogbin.save()
if material_in.tracking == Material.MA_TRACKING_SINGLE:
m_out_t = material_out.tracking
if mlogbin.count_use == wm_in.count: # 自动创建mlogbw
for wpr in Wpr.objects.filter(wm=wm_in).order_by("number"):
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number})
if m_out_t == Material.MA_TRACKING_SINGLE:
if route:
if route.process.mtype == Process.PRO_NORMAL:
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number})
elif route.process.mtype == Process.PRO_DIV:
for i in range(route.div_number):
Mlogbw.objects.get_or_create(mlogb=mlogbout, number=f'{wpr.number}-{i+1}')
else:
raise ParseError("不支持的生产类型")
elif is_fix:
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number})
else:
raise ParseError("不支持的生产类型1")
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number})
else:
raise ParseError("请提供消耗物料详细编号")
if qct is None and not (is_fix and mtype == Process.PRO_PROD):
mlog.qct = Qct.get(material_out, "process")
mlog.save(update_fields = ["qct"])
if mtype == Process.PRO_NORMAL:
d_count_real = mlogbin.count_use
d_count_ok = mlogbin.count_use
mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults=
{"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct})
elif mtype == Process.PRO_DIV:
for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"):
mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults=
{"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct})
elif mtype == Process.PRO_MERGE:
xcount = math.floor( mlogbin.count_use / route.div_number)
d_count_real = xcount
d_count_ok = xcount
mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults=
{"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct})
elif is_fix:
d_count_real = mlogbin.count_use
d_count_ok = mlogbin.count_use
mlogbout, _ = Mlogb.objects.get_or_create(**m_dict, defaults=
{"batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, "count_real": d_count_real, "count_ok": d_count_ok, "qct": qct})
else:
raise ParseError("不支持生成产出物料!")
if material_out.tracking == Material.MA_TRACKING_SINGLE:
for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"):
wpr = mlogbwin.wpr
if mtype == Process.PRO_NORMAL:
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number})
elif mtype == Process.PRO_DIV:
for i in range(route.div_number):
Mlogbw.objects.get_or_create(mlogb=mlogbout, number=f'{wpr.number}-{i+1}')
elif is_fix:
Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbout, defaults={"number": wpr.number})
else:
raise ParseError("不支持的生产类型1")
class MlogbOutViewSet(UpdateModelMixin, CustomGenericViewSet):