diff --git a/apps/inm/services.py b/apps/inm/services.py index 35bd46a5..55cc5b98 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -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("不支持的操作") diff --git a/apps/wpm/models.py b/apps/wpm/models.py index b57c471d..169571df 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -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('单个编号') diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index d4767f24..1bfab152 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -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__" diff --git a/apps/wpm/services.py b/apps/wpm/services.py index fc20c934..4f6ff39f 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -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: diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 3cdf9e36..fffbaf60 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -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 diff --git a/apps/wpmw/models.py b/apps/wpmw/models.py index 2f7c8139..995fef43 100644 --- a/apps/wpmw/models.py +++ b/apps/wpmw/models.py @@ -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 diff --git a/apps/wpmw/serializers.py b/apps/wpmw/serializers.py new file mode 100644 index 00000000..6a049e1e --- /dev/null +++ b/apps/wpmw/serializers.py @@ -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__' \ No newline at end of file diff --git a/apps/wpmw/urls.py b/apps/wpmw/urls.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 91ea44a2..2f54dd60 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -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"] \ No newline at end of file