fix: 主要是wpmw change_or_new的修正
This commit is contained in:
parent
726946979c
commit
8d0d5ebcd0
|
@ -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("不支持的操作")
|
||||
|
||||
|
|
|
@ -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('单个编号')
|
||||
|
|
|
@ -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__"
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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__'
|
|
@ -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"]
|
Loading…
Reference in New Issue