diff --git a/apps/wpm/migrations/0109_auto_20250416_1130.py b/apps/wpm/migrations/0109_auto_20250416_1130.py new file mode 100644 index 00000000..430a708f --- /dev/null +++ b/apps/wpm/migrations/0109_auto_20250416_1130.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2025-04-16 03:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0108_auto_20250414_2244'), + ] + + operations = [ + migrations.AddField( + model_name='mlogb', + name='count_json_from', + field=models.JSONField(blank=True, default=list, verbose_name='层布局数据'), + ), + migrations.AddField( + model_name='mlogb', + name='count_json_wx', + field=models.JSONField(blank=True, default=list, verbose_name='外协自定义数据'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 9d6de7c5..9a6bcd2d 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -372,6 +372,9 @@ class Mlogb(BaseModel): count_n_qt = models.DecimalField('其他', default=0, max_digits=11, decimal_places=1) count_notok_json = models.JSONField('不合格情况', default=list, blank=True) count_json = models.JSONField('各物料数量', default=list, blank=True) + count_json_from = models.JSONField("层布局数据", default=list, blank=True) + count_json_wx = models.JSONField('外协自定义数据', default=list, blank=True) + def get_tracking(self): if self.material_in: return "in", self.material_in.tracking diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 86aa66db..195dcd43 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -658,21 +658,22 @@ class MlogChangeSerializer(CustomModelSerializer): class CountJsonSerializer(serializers.Serializer): count_use = serializers.IntegerField(min_value=0, required=True) floor = serializers.IntegerField(min_value=1, required=True) - -class CountJson2Serializer(serializers.Serializer): - count_use = serializers.IntegerField(min_value=0, required=True) - floor = serializers.IntegerField(min_value=1, required=True) count_test = serializers.IntegerField(min_value=0, required=True) count_notok = serializers.IntegerField(min_value=0, required=True) +class CountJsonFromSerializer(serializers.Serializer): + start = serializers.IntegerField(min_value=0, required=True) + end = serializers.IntegerField(min_value=0, required=True) + count_t = serializers.IntegerField(min_value=0, required=True, label="总数") + class MlogbInSerializer(CustomModelSerializer): mlogbdefect = MlogbDefectSerializer(many=True, required=False) - count_json = CountJsonSerializer(required=False, many=True) + count_json_from = CountJsonFromSerializer(required=False, many=True) class Meta: model = Mlogb fields = ['id', 'mlog', 'mtask', 'wm_in', 'count_use', 'count_pn_jgqbl', - 'count_break', 'note', "parent", "mlogbdefect", "count_json"] + 'count_break', 'note', "parent", "mlogbdefect", "count_json_from"] extra_kwargs = {'count_use': {'required': True}, 'mtask': {'required': False}, 'wm_in': {'required': True, "allow_empty": False}} @@ -721,7 +722,7 @@ class MlogbInSerializer(CustomModelSerializer): if mlog.material_in is None: mlog.material_in = ins.material_in mlog.material_out = ins.material_in - mlog.save(update_fields="material_in") + mlog.save(update_fields=["material_in", "material_out"]) elif mlog.material_in != ins.material_in: raise ParseError('该记录必须使用同一物料') @@ -813,7 +814,7 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): class MlogbOutUpdateSerializer(CustomModelSerializer): mlogbdefect = MlogbDefectSerializer(many=True, required=False) - count_json = CountJson2Serializer(required=False, many=True) + count_json = CountJsonSerializer(required=False, many=True) class Meta: model = Mlogb @@ -1061,7 +1062,9 @@ class HandoverSerializer(CustomModelSerializer): if mtype == Handover.H_DIV: if not item["batch"]: raise ParseError(f'第{ind+1}行-请提供拆批批次号') - handoverb = Handoverb.objects.create(handover=ins, batch=item["batch"], count=count, wm=wm) + if wm is not None: + raise ParseError("拆批错误") + handoverb = Handoverb.objects.create(handover=ins, batch=item["batch"], count=count, wm=ins.wm) else: handoverb = Handoverb.objects.create(handover=ins, wm=wm, count=count, batch=wm.batch) if wm.material.tracking == Material.MA_TRACKING_SINGLE: diff --git a/apps/wpm/services.py b/apps/wpm/services.py index b9dd0862..db90b492 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -731,6 +731,7 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, target, _ = BatchSt.g_create(batch=batch, handover=handover, material_start=material) if handover.wm is None: raise ParseError('拆批请选择车间库存') + wm_from = handover.wm source, _ = BatchSt.g_create(batch=handover.wm.batch) BatchLog.g_create(source=source, target=target, handover=handover, relation_type="split") else: diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 7ec5f557..ec1d0a8c 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -605,8 +605,8 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust d_count_ok = mlogbin.count_use mlogbout, _ = Mlogb.objects.get_or_create(mlogb_from=mlogbin, defaults= update_dict(m_dict, {"count_real": d_count_real, "count_ok": d_count_ok})) - mlogbout.count_json = mlogbin.count_json - mlogbout.save(update_fields=["count_json"]) + mlogbout.count_json_from = mlogbin.count_json_from + mlogbout.save(update_fields=["count_json_from"]) if material_in.tracking == Material.MA_TRACKING_SINGLE and material_out.tracking == Material.MA_TRACKING_SINGLE: for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"): wpr_ = mlogbwin.wpr @@ -630,15 +630,15 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust d_count_real = mlogbin.count_use * div_number d_count_ok = d_count_real mlogbout, _ = Mlogb.objects.get_or_create(mlogb_from=mlogbin, defaults=update_dict(m_dict,{"count_real": d_count_real, "count_ok": d_count_ok})) - mlogbout.count_json = mlogbin.count_json - mlogbout.save(update_fields=["count_json"]) + mlogbout.count_json_from = mlogbin.count_json_from + mlogbout.save(update_fields=["count_json_from"]) elif mtype == Process.PRO_MERGE: # 支持批到批 xcount = math.floor( mlogbin.count_use / route.div_number) d_count_real = xcount d_count_ok = xcount mlogbout, _ = Mlogb.objects.get_or_create(mlogb_from=mlogbin, defaults=update_dict(m_dict, {"count_real": d_count_real, "count_ok": d_count_ok})) - mlogbout.count_json = mlogbin.count_json - mlogbout.save(update_fields=["count_json"]) + mlogbout.count_json_from = mlogbin.count_json_from + mlogbout.save(update_fields=["count_json_from"]) elif is_fix:# 支持批到批,个到个 d_count_real = mlogbin.count_use d_count_ok = mlogbin.count_use