feat: 生产入库和领料支持b类合格品

This commit is contained in:
caoqianming 2025-04-30 14:19:49 +08:00
parent a2cba2128f
commit da69e654bc
1 changed files with 50 additions and 17 deletions

View File

@ -18,6 +18,7 @@ def do_out(item: MIOItem):
""" """
if item.mb and item.mb.defect is not None: if item.mb and item.mb.defect is not None:
raise ParseError("生产领料不支持不合格品") raise ParseError("生产领料不支持不合格品")
from apps.inm.models import MaterialBatch from apps.inm.models import MaterialBatch
mio:MIO = item.mio mio:MIO = item.mio
belong_dept = mio.belong_dept belong_dept = mio.belong_dept
@ -26,6 +27,16 @@ def do_out(item: MIOItem):
material:Material = item.material material:Material = item.material
if material.into_wm is False: # 用于混料的原料不与车间库存交互, 这个是配置项目 if material.into_wm is False: # 用于混料的原料不与车间库存交互, 这个是配置项目
return return
# 获取defect
defect:Defect = None
if item.wm and item.mb:
raise ParseError("车间和仓库库存不能同时存在")
if item.wm:
defect = item.wm.defect
elif item.mb:
defect = item.mb.defect
action_list = [] action_list = []
mias = MIOItemA.objects.filter(mioitem=item) mias = MIOItemA.objects.filter(mioitem=item)
is_zhj = False # 是否组合件领料 is_zhj = False # 是否组合件领料
@ -35,16 +46,18 @@ def do_out(item: MIOItem):
for i in range(len(mias_list)): for i in range(len(mias_list)):
material, batch, rate = mias_list[i] material, batch, rate = mias_list[i]
new_count = rate * item.count # 假设 item.count 存在 new_count = rate * item.count # 假设 item.count 存在
action_list.append([material, batch, new_count]) action_list.append([material, batch, new_count, None])
else: else:
action_list = [[item.material, item.batch, item.count]] action_list = [[item.material, item.batch, item.count, defect]]
if is_zhj: if is_zhj:
try: try:
mb = MaterialBatch.objects.get( mb = MaterialBatch.objects.get(
material=item.material, material=item.material,
warehouse=item.warehouse, warehouse=item.warehouse,
batch=item.batch batch=item.batch,
state=WMaterial.WM_OK,
defect=None
) )
except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e: except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e:
raise ParseError(f"组合件批次错误!{e}") raise ParseError(f"组合件批次错误!{e}")
@ -64,6 +77,8 @@ def do_out(item: MIOItem):
xmaterial:Material = al[0] xmaterial:Material = al[0]
xbatch:str = al[1] xbatch:str = al[1]
xcount:str = al[2] xcount:str = al[2]
defect:Defect = al[3]
xbatches.append(xbatch) xbatches.append(xbatch)
if xcount <= 0: if xcount <= 0:
raise ParseError("存在非正数!") raise ParseError("存在非正数!")
@ -74,8 +89,8 @@ def do_out(item: MIOItem):
material=xmaterial, material=xmaterial,
warehouse=item.warehouse, warehouse=item.warehouse,
batch=xbatch, batch=xbatch,
state=10, state=WMaterial.WM_OK,
defect=None defect=defect
) )
except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e: except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e:
raise ParseError(f"批次错误!{e}") raise ParseError(f"批次错误!{e}")
@ -87,9 +102,10 @@ def do_out(item: MIOItem):
# 领到车间库存(或工段) # 领到车间库存(或工段)
wm, new_create = WMaterial.objects.get_or_create(batch=xbatch, material=xmaterial, wm, new_create = WMaterial.objects.get_or_create(
belong_dept=belong_dept, mgroup=mgroup, batch=xbatch, material=xmaterial,
state=WMaterial.WM_OK) belong_dept=belong_dept, mgroup=mgroup,
state=WMaterial.WM_OK, defect=defect)
if new_create: if new_create:
wm.create_by = do_user wm.create_by = do_user
wm.batch_ofrom = mb.batch if mb else None wm.batch_ofrom = mb.batch if mb else None
@ -118,8 +134,9 @@ def do_in(item: MIOItem):
生产入库后更新车间物料 生产入库后更新车间物料
""" """
mio = item.mio mio = item.mio
if item.wm and item.wm.defect is not None: wmin:WMaterial = item.wm
raise ParseError("不合格物料无法入库") if wmin and wmin.state != WMaterial.WM_OK:
raise ParseError("非合格物料无法入库")
belong_dept = mio.belong_dept belong_dept = mio.belong_dept
mgroup = mio.mgroup mgroup = mio.mgroup
do_user = mio.do_user do_user = mio.do_user
@ -129,15 +146,25 @@ def do_in(item: MIOItem):
action_list = [] action_list = []
mias = MIOItemA.objects.filter(mioitem=item) mias = MIOItemA.objects.filter(mioitem=item)
is_zhj = False # 是否组合件入仓库 is_zhj = False # 是否组合件入仓库
# 获取defect
defect:Defect = None
if item.wm and item.mb:
raise ParseError("车间和仓库库存不能同时存在")
if item.wm:
defect = item.wm.defect
elif item.mb:
defect = item.mb.defect
if mias.exists(): if mias.exists():
is_zhj = True is_zhj = True
mias_list = mias.values_list('material', 'batch', 'rate') mias_list = mias.values_list('material', 'batch', 'rate')
for i in mias_list: for i in mias_list:
material, batch, rate = i material, batch, rate = i
new_count = rate * item.count # 假设 item.count 存在 new_count = rate * item.count # 假设 item.count 存在
action_list.append([material, batch, new_count]) action_list.append([material, batch, new_count, None])
else: else:
action_list = [[item.material, item.batch, item.count]] action_list = [[item.material, item.batch, item.count, defect]]
production_dept = None production_dept = None
@ -145,16 +172,18 @@ def do_in(item: MIOItem):
if is_zhj: if is_zhj:
xbatchs = [item.batch] xbatchs = [item.batch]
for al in action_list: for al in action_list:
xmaterial, xbatch, xcount = al xmaterial, xbatch, xcount, defect = al
if xcount <= 0: if xcount <= 0:
raise ParseError("存在非正数!") raise ParseError("存在非正数!")
xbatchs.append(xbatch) xbatchs.append(xbatch)
# 扣减车间库存
wm_qs = WMaterial.objects.filter( wm_qs = WMaterial.objects.filter(
batch=xbatch, batch=xbatch,
material=xmaterial, material=xmaterial,
belong_dept=belong_dept, belong_dept=belong_dept,
mgroup=mgroup, mgroup=mgroup,
defect=defect,
state=WMaterial.WM_OK) state=WMaterial.WM_OK)
count_x = wm_qs.count() count_x = wm_qs.count()
if count_x == 1: if count_x == 1:
@ -165,6 +194,8 @@ def do_in(item: MIOItem):
else: else:
raise ParseError( raise ParseError(
f'{str(xmaterial)}-{xbatch}-存在多个相同批次!') f'{str(xmaterial)}-{xbatch}-存在多个相同批次!')
# 扣减车间库存
new_count = wm.count - xcount new_count = wm.count - xcount
if new_count >= 0: if new_count >= 0:
wm.count = new_count wm.count = new_count
@ -184,8 +215,8 @@ def do_in(item: MIOItem):
material=xmaterial, material=xmaterial,
warehouse=item.warehouse, warehouse=item.warehouse,
batch=xbatch, batch=xbatch,
state=10, state=WMaterial.WM_OK,
defect=None, defect=defect,
defaults={ defaults={
"count": 0, "count": 0,
"batch_ofrom": wm.batch_ofrom, "batch_ofrom": wm.batch_ofrom,
@ -212,6 +243,8 @@ def do_in(item: MIOItem):
material=item.material, material=item.material,
warehouse=item.warehouse, warehouse=item.warehouse,
batch=item.batch, batch=item.batch,
defect=None,
state=WMaterial.WM_OK,
defaults={"count": 0, "production_dept": production_dept} defaults={"count": 0, "production_dept": production_dept}
) )
if not is_created: if not is_created: