feat: 采购入库支持检验
This commit is contained in:
parent
adf3341f4b
commit
8bcd6b4f69
|
@ -37,6 +37,7 @@ class MaterialBatchSerializer(CustomModelSerializer):
|
|||
supplier_name = serializers.StringRelatedField(
|
||||
source='supplier', read_only=True)
|
||||
material_ = MaterialSerializer(source='material', read_only=True)
|
||||
defect_name = serializers.CharField(source="defect.name", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = MaterialBatch
|
||||
|
|
|
@ -9,6 +9,8 @@ from apps.mtm.services import cal_material_count
|
|||
from apps.wpm.models import WMaterial
|
||||
from apps.wpm.services_2 import get_alldata_with_batch_and_store
|
||||
from apps.wpmw.models import Wpr
|
||||
from apps.qm.models import FtestDefect, Defect
|
||||
from django.db.models import Count
|
||||
|
||||
def do_out(item: MIOItem):
|
||||
"""
|
||||
|
@ -225,6 +227,7 @@ class InmService:
|
|||
in_or_out = -1
|
||||
|
||||
if instance.type == MIO.MIO_TYPE_PUR_IN: # 需要更新订单
|
||||
# 这里还需要对入厂检验进行处理
|
||||
from apps.pum.services import PumService
|
||||
cls.update_mb(instance, in_or_out)
|
||||
PumService.mio_purin(instance, is_reverse)
|
||||
|
@ -284,42 +287,66 @@ class InmService:
|
|||
if i.material.type in [Material.MA_TYPE_MAINSO]:
|
||||
ddict["batch_ofrom"] = i.batch
|
||||
ddict["material_ofrom"] = i.material
|
||||
mb, _ = MaterialBatch.objects.get_or_create(
|
||||
material=material,
|
||||
warehouse=warehouse,
|
||||
batch=i.batch,
|
||||
defaults=ddict
|
||||
)
|
||||
|
||||
if in_or_out == 1:
|
||||
mb.count = mb.count + getattr(i, field)
|
||||
mb.save()
|
||||
if tracking == Material.MA_TRACKING_SINGLE:
|
||||
mioitemws = MIOItemw.objects.filter(mioitem=i)
|
||||
if mioitemws.count() != mb.count:
|
||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||
for mioitemw in mioitemws:
|
||||
if mioitemw.wpr:
|
||||
Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb)
|
||||
else:
|
||||
wpr = Wpr.change_or_new(number=mioitemw.number, mb=mb)
|
||||
mioitemw.wpr = wpr
|
||||
mioitemw.save()
|
||||
|
||||
elif in_or_out == -1:
|
||||
mb.count = mb.count - getattr(i, field)
|
||||
if mb.count < 0:
|
||||
raise ParseError("批次库存不足,操作失败")
|
||||
else:
|
||||
|
||||
m_list = [(material, warehouse, i.batch, getattr(i, field), None, i)] # getattr主要是兼容原有逻辑
|
||||
if tracking == Material.MA_TRACKING_SINGLE:
|
||||
m_list = []
|
||||
# 获取所有主要的不合格项
|
||||
mw_qs = MIOItemw.objects.filter(mioitem=i)
|
||||
defectIds= FtestDefect.objects.filter(ftest_mioitemw_ftest__in=mw_qs, is_main=True, has=True).values_list("defect__id", flat=True).distinct()
|
||||
defects_map = {d.id: d for d in Defect.objects.filter(id__in=defectIds)}
|
||||
# 过滤并统计相关数据
|
||||
filtered_mw_qs = mw_qs.filter(
|
||||
ftest__defects_ftest__defect__id__in=defects_map.keys(),
|
||||
ftest__defects_ftest__has=True,
|
||||
ftest__defects_ftest__is_main=True
|
||||
).values('ftest__defects_ftest__defect__id').annotate(xcount=Count('id'))
|
||||
for defect_data in filtered_mw_qs:
|
||||
defect_id = defect_data['ftest__defects_ftest__defect__id']
|
||||
xcount = defect_data['xcount']
|
||||
if xcount > 0:
|
||||
defect = defects_map[defect_id]
|
||||
m_list.append((material, warehouse, i.batch, xcount, defect, i))
|
||||
for material, warehouse, batch, change_count, defect, mioitem in m_list:
|
||||
if change_count <= 0:
|
||||
continue
|
||||
mb, _ = MaterialBatch.objects.get_or_create(
|
||||
material=material,
|
||||
warehouse=warehouse,
|
||||
batch=batch,
|
||||
defect=defect,
|
||||
defaults=ddict
|
||||
)
|
||||
|
||||
if in_or_out == 1:
|
||||
mb.count = mb.count + change_count
|
||||
mb.save()
|
||||
if tracking == Material.MA_TRACKING_SINGLE:
|
||||
mioitemws = MIOItemw.objects.filter(mioitem=i)
|
||||
if mioitemws.count() != mb.count:
|
||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||
for mioitemw in mioitemws:
|
||||
Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb)
|
||||
else:
|
||||
raise ParseError("不支持的操作")
|
||||
if mioitemw.wpr:
|
||||
Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb)
|
||||
else:
|
||||
wpr = Wpr.change_or_new(number=mioitemw.number, mb=mb)
|
||||
mioitemw.wpr = wpr
|
||||
mioitemw.save()
|
||||
|
||||
elif in_or_out == -1:
|
||||
mb.count = mb.count - change_count
|
||||
if mb.count < 0:
|
||||
raise ParseError("批次库存不足,操作失败")
|
||||
else:
|
||||
mb.save()
|
||||
if tracking == Material.MA_TRACKING_SINGLE:
|
||||
mioitemws = MIOItemw.objects.filter(mioitem=i)
|
||||
if mioitemws.count() != mb.count:
|
||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||
for mioitemw in mioitemws:
|
||||
Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb)
|
||||
else:
|
||||
raise ParseError("不支持的操作")
|
||||
|
||||
|
||||
def daoru_mb(path: str):
|
||||
|
|
|
@ -345,11 +345,10 @@ class MIOItemwViewSet(CustomModelViewSet):
|
|||
raise ParseError('请指定所属出入库记录明细')
|
||||
return super().filter_queryset(queryset)
|
||||
|
||||
def cal_mioitem_count(self, mioitem):
|
||||
def cal_mioitem_count(self, mioitem:MIOItem):
|
||||
count = MIOItemw.objects.filter(mioitem=mioitem).count()
|
||||
mioitem.count = count
|
||||
mioitem.count_notok = MIOItemw.objects.filter(mioitem=mioitem, ftest__is_ok=False).count()
|
||||
mioitem.count_ok = count - mioitem.count_notok
|
||||
mioitem.save()
|
||||
|
||||
@transaction.atomic
|
||||
|
|
Loading…
Reference in New Issue