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
|
belong_dept = mio.belong_dept
|
||||||
mgroup = mio.mgroup
|
mgroup = mio.mgroup
|
||||||
do_user = mio.do_user
|
do_user = mio.do_user
|
||||||
material = item.material
|
material:Material = item.material
|
||||||
if material.into_wm is False: # 用于混料的原料不与车间库存交互, 这个是配置项目
|
if material.into_wm is False: # 用于混料的原料不与车间库存交互, 这个是配置项目
|
||||||
return
|
return
|
||||||
action_list = []
|
action_list = []
|
||||||
|
@ -50,6 +50,9 @@ def do_out(item: MIOItem):
|
||||||
else:
|
else:
|
||||||
mb.save()
|
mb.save()
|
||||||
|
|
||||||
|
if material.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
|
raise ParseError("组合件暂不支持追踪单件")
|
||||||
|
|
||||||
xbatches = []
|
xbatches = []
|
||||||
for al in action_list:
|
for al in action_list:
|
||||||
xmaterial:Material = al[0]
|
xmaterial:Material = al[0]
|
||||||
|
@ -72,6 +75,7 @@ def do_out(item: MIOItem):
|
||||||
else:
|
else:
|
||||||
mb.save()
|
mb.save()
|
||||||
|
|
||||||
|
|
||||||
# 领到车间库存(或工段)
|
# 领到车间库存(或工段)
|
||||||
wm, new_create = WMaterial.objects.get_or_create(batch=xbatch, material=xmaterial,
|
wm, new_create = WMaterial.objects.get_or_create(batch=xbatch, material=xmaterial,
|
||||||
belong_dept=belong_dept, mgroup=mgroup,
|
belong_dept=belong_dept, mgroup=mgroup,
|
||||||
|
@ -83,12 +87,14 @@ def do_out(item: MIOItem):
|
||||||
wm.count = wm.count + item.count
|
wm.count = wm.count + item.count
|
||||||
wm.update_by = do_user
|
wm.update_by = do_user
|
||||||
wm.save()
|
wm.save()
|
||||||
|
|
||||||
|
# 开始变动wpr
|
||||||
if xmaterial.tracking == Material.MA_TRACKING_SINGLE:
|
if xmaterial.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
mioitemws = MIOItemw.objects.filter(mioitem=item)
|
mioitemws = MIOItemw.objects.filter(mioitem=item)
|
||||||
if mioitemws.count() != item.count:
|
if mioitemws.count() != item.count:
|
||||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||||
for mioitemw in mioitemws:
|
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))
|
xbatches = list(set(xbatches))
|
||||||
|
@ -285,7 +291,7 @@ class InmService:
|
||||||
if mioitemws.count() != mb.count:
|
if mioitemws.count() != mb.count:
|
||||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||||
for mioitemw in mioitemws:
|
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:
|
elif in_or_out == -1:
|
||||||
mb.count = mb.count - getattr(i, field)
|
mb.count = mb.count - getattr(i, field)
|
||||||
|
@ -298,7 +304,7 @@ class InmService:
|
||||||
if mioitemws.count() != mb.count:
|
if mioitemws.count() != mb.count:
|
||||||
raise ParseError("出入库与明细数量不一致,操作失败")
|
raise ParseError("出入库与明细数量不一致,操作失败")
|
||||||
for mioitemw in mioitemws:
|
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:
|
else:
|
||||||
raise ParseError("不支持的操作")
|
raise ParseError("不支持的操作")
|
||||||
|
|
||||||
|
|
|
@ -390,6 +390,10 @@ class Handoverb(BaseModel):
|
||||||
null=True, blank=True, related_name='handoverb_wm')
|
null=True, blank=True, related_name='handoverb_wm')
|
||||||
count = models.PositiveIntegerField('送料数', default=0)
|
count = models.PositiveIntegerField('送料数', default=0)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def handoverbw(self):
|
||||||
|
return Handoverbw.objects.filter(handoverb=self)
|
||||||
|
|
||||||
class Handoverbw(BaseModel):
|
class Handoverbw(BaseModel):
|
||||||
handoverb = models.ForeignKey(Handoverb, verbose_name='关联交接记录', on_delete=models.CASCADE)
|
handoverb = models.ForeignKey(Handoverb, verbose_name='关联交接记录', on_delete=models.CASCADE)
|
||||||
number = models.TextField('单个编号')
|
number = models.TextField('单个编号')
|
||||||
|
|
|
@ -6,7 +6,7 @@ from datetime import datetime
|
||||||
|
|
||||||
from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog,
|
from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog,
|
||||||
Handover, Handoverb, Mlogb, AttLog,
|
Handover, Handoverb, Mlogb, AttLog,
|
||||||
OtherLog, Fmlog, BatchSt, Mlogbw)
|
OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw)
|
||||||
from apps.system.models import Dept, User
|
from apps.system.models import Dept, User
|
||||||
from apps.system.serializers import UserSimpleSerializer
|
from apps.system.serializers import UserSimpleSerializer
|
||||||
from apps.pm.models import Mtask, Mtaskb
|
from apps.pm.models import Mtask, Mtaskb
|
||||||
|
@ -630,9 +630,16 @@ class MlogRelatedSerializer(serializers.Serializer):
|
||||||
class DeptBatchSerializer(serializers.Serializer):
|
class DeptBatchSerializer(serializers.Serializer):
|
||||||
belong_dept_name = serializers.CharField(label='车间名称')
|
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):
|
class HandoverbSerializer(CustomModelSerializer):
|
||||||
batch = serializers.CharField(source='wm.batch', read_only=True)
|
batch = serializers.CharField(source='wm.batch', read_only=True)
|
||||||
notok_sign = serializers.CharField(source='wm.notok_sign', read_only=True)
|
notok_sign = serializers.CharField(source='wm.notok_sign', read_only=True)
|
||||||
|
handoverb = Handoverbwserializer(many=True, required=False)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Handoverb
|
model = Handoverb
|
||||||
fields = "__all__"
|
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)
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
if mlogbws.count() != mi_count:
|
if mlogbws.count() != mi_count:
|
||||||
raise ParseError("日志与明细数量不一致,操作失败")
|
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:
|
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.material_ofrom = mlog_or_b.material_ofrom
|
||||||
wm.save()
|
wm.save()
|
||||||
if material_out.tracking == Material.MA_TRACKING_SINGLE:
|
if material_out.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
mlgbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
if mlgbws.count() != mo_count:
|
if mlogbws.count() != mo_count:
|
||||||
raise ParseError("日志与明细数量不一致,操作失败")
|
raise ParseError("日志与明细数量不一致,操作失败")
|
||||||
for item in mlgbws:
|
for item in mlogbws:
|
||||||
Wpr.change_or_new(item.number, material_out, mb=None, wm=wm)
|
Wpr.change_or_new(number=item.number, wm=wm)
|
||||||
|
|
||||||
mlog.submit_time = now
|
mlog.submit_time = now
|
||||||
mlog.submit_user = user
|
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)
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
if mlogbws.count() != mo_count:
|
if mlogbws.count() != mo_count:
|
||||||
raise ParseError("日志与明细数量不一致,操作失败")
|
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: # 领用数退回
|
if material_in: # 领用数退回
|
||||||
|
@ -387,11 +389,11 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
wm.update_by = user
|
wm.update_by = user
|
||||||
wm.save()
|
wm.save()
|
||||||
if material_in.tracking == Material.MA_TRACKING_SINGLE:
|
if material_in.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
mlgbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
mlogbws = Mlogbw.objects.filter(mlogb=mlog_or_b)
|
||||||
if mlgbws.count() != mi_count:
|
if mlogbws.count() != mi_count:
|
||||||
raise ParseError("日志与明细数量不一致,操作失败")
|
raise ParseError("日志与明细数量不一致,操作失败")
|
||||||
for item in mlgbws:
|
for item in mlogbws:
|
||||||
Wpr.change_or_new(item.number, material_in, mb=None, wm=wm)
|
Wpr.change_or_new(number=item.number, wm=wm)
|
||||||
|
|
||||||
# 针对加工前不良的暂时额外处理
|
# 针对加工前不良的暂时额外处理
|
||||||
for item in m_ins_bl_list:
|
for item in m_ins_bl_list:
|
||||||
|
|
|
@ -546,6 +546,7 @@ class MlogbwViewSet(CustomModelViewSet):
|
||||||
def cal_mlogb_count(self, mlogb):
|
def cal_mlogb_count(self, mlogb):
|
||||||
count_real = Mlogbw.objects.filter(mlogb=mlogb).count()
|
count_real = Mlogbw.objects.filter(mlogb=mlogb).count()
|
||||||
mlogb.count_real = count_real
|
mlogb.count_real = count_real
|
||||||
|
mlogb.count_ok = count_real
|
||||||
mlogb.save()
|
mlogb.save()
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
|
|
|
@ -20,17 +20,26 @@ class Wpr(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@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()
|
ins = cls.objects.filter(number=number).first()
|
||||||
if ins:
|
|
||||||
ins.material = material
|
if ins is None:
|
||||||
elif can_new:
|
ins = cls(number=number)
|
||||||
ins = cls(number=number, material=material)
|
|
||||||
else:
|
if old_mb and ins.mb != old_mb:
|
||||||
raise ParseError("物料不存在")
|
raise ParseError(f"请检查-{ins.number}-所属仓库批次")
|
||||||
ins.state = state
|
if old_wm and ins.wm != old_wm:
|
||||||
|
raise ParseError(f"请检查-{ins.number}-所属车间批次")
|
||||||
|
|
||||||
ins.mb = mb
|
ins.mb = mb
|
||||||
|
if mb:
|
||||||
|
ins.material = mb.material
|
||||||
ins.wm = wm
|
ins.wm = wm
|
||||||
|
if wm:
|
||||||
|
ins.material = wm.material
|
||||||
ins.save()
|
ins.save()
|
||||||
|
|
||||||
@classmethod
|
@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