diff --git a/apps/mtm/migrations/0058_process_wpr_number_rule.py b/apps/mtm/migrations/0058_process_wpr_number_rule.py new file mode 100644 index 00000000..9d524df2 --- /dev/null +++ b/apps/mtm/migrations/0058_process_wpr_number_rule.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2025-05-16 07:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0057_process_number_to_batch'), + ] + + operations = [ + migrations.AddField( + model_name='process', + name='wpr_number_rule', + field=models.TextField(blank=True, null=True, verbose_name='单个编号规则'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index c1dde7f9..2c3fa008 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -32,6 +32,7 @@ class Process(CommonBModel): mstate_json = models.JSONField('中间状态', default=list, blank=True) parent = models.ForeignKey('self', verbose_name='父工序', on_delete=models.CASCADE, null=True, blank=True) number_to_batch = models.BooleanField('个号转批号', default=False) + wpr_number_rule = models.TextField("单个编号规则", null=True, blank=True) class Meta: verbose_name = '工序' diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 947a1a59..a78f74f2 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -656,15 +656,24 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust 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_from = mlogbin.count_json_from mlogbout.save(update_fields=["count_json_from"]) + wpr_number_rule = process.wpr_number_rule if material_out.tracking == Material.MA_TRACKING_SINGLE: number = mlogbin.batch if mlogbin.number_from: number = mlogbin.number_from if d_count_real == 1: + if wpr_number_rule: + number = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out) Mlogbw.objects.get_or_create(number=number, mlogb=mlogbout) else: + if wpr_number_rule: + number_list = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out, gen_count=d_count_real) for i in range(d_count_real): - Mlogbw.objects.get_or_create(number=f'{number}-{i+1}', mlogb=mlogbout) + if wpr_number_rule: + numberx = number_list[i] + else: + numberx = f'{number}-{i+1}' + Mlogbw.objects.get_or_create(number=numberx, mlogb=mlogbout) elif is_fix:# 支持批到批,个到个 d_count_real = mlogbin.count_use-mlogbin.count_pn_jgqbl d_count_ok = d_count_real @@ -676,6 +685,22 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust else: raise ParseError("不支持生成产出物料!") + @classmethod + def gen_number_with_rule(cls, rule, material_out:Material, gen_count=1): + from apps.wpmw.models import Wpr + now = timezone.now() + c_year = now.year + c_month = now.month + m_model = material_out.model + wps_qs = Wpr.objects.filter(material_start=material_out, create_time__year=c_year, create_time__month=c_month).order_by("create_time") + n_count = wps_qs.count() + 1 + try: + if gen_count == 1: + return rule.format(c_year=c_year, c_month=c_month, m_model=m_model, n_count=n_count) + else: + return [rule.format(c_year=c_year, c_month=c_month, m_model=m_model, n_count=n_count+i) for i in range(gen_count)] + except (KeyError, ValueError) as e: + raise ParseError(f"个号生成错误: {e}") class MlogbOutViewSet(UpdateModelMixin, CustomGenericViewSet): perms_map = {"put": "mlog.update"}