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 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("不支持的操作")

View File

@ -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('单个编号')

View File

@ -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__"

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) 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:

View File

@ -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

View File

@ -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

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"]