fix: 主要是wpmw change_or_new的修正

This commit is contained in:
caoqianming 2025-01-03 14:37:57 +08:00
parent 726946979c
commit 8d0d5ebcd0
9 changed files with 72 additions and 25 deletions

View File

@ -19,7 +19,7 @@ def do_out(item: MIOItem):
belong_dept = mio.belong_dept
mgroup = mio.mgroup
do_user = mio.do_user
material = item.material
material:Material = item.material
if material.into_wm is False: # 用于混料的原料不与车间库存交互, 这个是配置项目
return
action_list = []
@ -49,6 +49,9 @@ def do_out(item: MIOItem):
raise ParseError("组合件批次库存不足,操作失败")
else:
mb.save()
if material.tracking == Material.MA_TRACKING_SINGLE:
raise ParseError("组合件暂不支持追踪单件")
xbatches = []
for al in action_list:
@ -72,6 +75,7 @@ def do_out(item: MIOItem):
else:
mb.save()
# 领到车间库存(或工段)
wm, new_create = WMaterial.objects.get_or_create(batch=xbatch, material=xmaterial,
belong_dept=belong_dept, mgroup=mgroup,
@ -83,12 +87,14 @@ def do_out(item: MIOItem):
wm.count = wm.count + item.count
wm.update_by = do_user
wm.save()
# 开始变动wpr
if xmaterial.tracking == Material.MA_TRACKING_SINGLE:
mioitemws = MIOItemw.objects.filter(mioitem=item)
if mioitemws.count() != item.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(mioitemw.number, item.material, mb=None, wm=wm)
Wpr.change_or_new(mioitemw.number, mb=None, wm=wm, old_mb=mb)
# 触发批次统计分析
xbatches = list(set(xbatches))
@ -285,7 +291,7 @@ class InmService:
if mioitemws.count() != mb.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(mioitemw.number, i.material, mb)
Wpr.change_or_new(number=mioitemw.number, mb=mb)
elif in_or_out == -1:
mb.count = mb.count - getattr(i, field)
@ -298,7 +304,7 @@ class InmService:
if mioitemws.count() != mb.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(mioitemw.number, i.material, mb=None)
Wpr.change_or_new(number=mioitemw.number, old_mb=mb)
else:
raise ParseError("不支持的操作")

View File

@ -390,6 +390,10 @@ class Handoverb(BaseModel):
null=True, blank=True, related_name='handoverb_wm')
count = models.PositiveIntegerField('送料数', default=0)
@property
def handoverbw(self):
return Handoverbw.objects.filter(handoverb=self)
class Handoverbw(BaseModel):
handoverb = models.ForeignKey(Handoverb, verbose_name='关联交接记录', on_delete=models.CASCADE)
number = models.TextField('单个编号')

View File

@ -6,7 +6,7 @@ from datetime import datetime
from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog,
Handover, Handoverb, Mlogb, AttLog,
OtherLog, Fmlog, BatchSt, Mlogbw)
OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw)
from apps.system.models import Dept, User
from apps.system.serializers import UserSimpleSerializer
from apps.pm.models import Mtask, Mtaskb
@ -630,9 +630,16 @@ class MlogRelatedSerializer(serializers.Serializer):
class DeptBatchSerializer(serializers.Serializer):
belong_dept_name = serializers.CharField(label='车间名称')
class Handoverbwserializer(CustomModelSerializer):
class Meta:
model = Handoverbw
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS_BASE + ["handoverb"]
class HandoverbSerializer(CustomModelSerializer):
batch = serializers.CharField(source='wm.batch', read_only=True)
notok_sign = serializers.CharField(source='wm.notok_sign', read_only=True)
handoverb = Handoverbwserializer(many=True, required=False)
class Meta:
model = Handoverb
fields = "__all__"

View File

@ -200,7 +200,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
if mlogbws.count() != mi_count:
raise ParseError("日志与明细数量不一致,操作失败")
Wpr.clear([item.number for item in mlogbws])
for item in mlogbws:
Wpr.change_or_new(number=item.number, old_wm=wm)
# 针对加工前不良的暂时额外处理
for item in m_ins_bl_list:
@ -266,11 +267,11 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
wm.material_ofrom = mlog_or_b.material_ofrom
wm.save()
if material_out.tracking == Material.MA_TRACKING_SINGLE:
mlgbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
if mlgbws.count() != mo_count:
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
if mlogbws.count() != mo_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlgbws:
Wpr.change_or_new(item.number, material_out, mb=None, wm=wm)
for item in mlogbws:
Wpr.change_or_new(number=item.number, wm=wm)
mlog.submit_time = now
mlog.submit_user = user
@ -354,7 +355,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
if mlogbws.count() != mo_count:
raise ParseError("日志与明细数量不一致,操作失败")
Wpr.clear([item.number for item in mlogbws])
for item in mlogbws:
Wpr.change_or_new(number=item.number, old_wm=wm)
# 再生成消耗
if material_in: # 领用数退回
@ -387,11 +389,11 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
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:
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
if mlogbws.count() != mi_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlgbws:
Wpr.change_or_new(item.number, material_in, mb=None, wm=wm)
for item in mlogbws:
Wpr.change_or_new(number=item.number, wm=wm)
# 针对加工前不良的暂时额外处理
for item in m_ins_bl_list:

View File

@ -546,6 +546,7 @@ class MlogbwViewSet(CustomModelViewSet):
def cal_mlogb_count(self, mlogb):
count_real = Mlogbw.objects.filter(mlogb=mlogb).count()
mlogb.count_real = count_real
mlogb.count_ok = count_real
mlogb.save()
@transaction.atomic

View File

@ -20,17 +20,26 @@ class Wpr(BaseModel):
@classmethod
def change_or_new(cls, number, material, can_new=False, mb=None, wm=None, state=10):
def change_or_new(cls, number, mb=None, wm=None, old_mb=None, old_wm=None):
if mb and wm:
raise ParseError("所属仓库批次和车间批次不可同时存在")
ins = cls.objects.filter(number=number).first()
if ins:
ins.material = material
elif can_new:
ins = cls(number=number, material=material)
else:
raise ParseError("物料不存在")
ins.state = state
if ins is None:
ins = cls(number=number)
if old_mb and ins.mb != old_mb:
raise ParseError(f"请检查-{ins.number}-所属仓库批次")
if old_wm and ins.wm != old_wm:
raise ParseError(f"请检查-{ins.number}-所属车间批次")
ins.mb = mb
if mb:
ins.material = mb.material
ins.wm = wm
if wm:
ins.material = wm.material
ins.save()
@classmethod

7
apps/wpmw/serializers.py Normal file
View File

@ -0,0 +1,7 @@
from apps.wpmw.models import Wpr, WprDefect
from apps.utils.serializers import CustomModelSerializer
class WprSerializer(CustomModelSerializer):
class Meta:
model = Wpr
fields = '__all__'

0
apps/wpmw/urls.py Normal file
View File

View File

@ -1,3 +1,14 @@
from django.shortcuts import render
# Create your views here.
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from apps.utils.mixins import CustomListModelMixin
from apps.wpmw.models import Wpr, WprDefect
from apps.wpmw.serializers import WprSerializer
class WprViewSet(CustomListModelMixin, CustomGenericViewSet):
perms_map = {"get": "*"}
queryset = Wpr.objects.all()
serializer_class = WprSerializer
ordering = ["number"]
ordering_fields = ["number", "create_time", "update_time"]