From def67ebac52b1f2fa8fb9fb789e17f3c7d9957b5 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 2 Jan 2025 10:32:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20base=20=E6=B7=BB=E5=8A=A0wpmw=E5=B9=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=87=BA=E5=85=A5=E5=BA=93=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 22 ++++++- .../wpm/migrations/0078_auto_20250102_0958.py | 53 +++++++++++++++++ apps/wpmw/migrations/0001_initial.py | 57 +++++++++++++++++++ apps/wpmw/models.py | 19 ++++++- server/settings.py | 3 +- 5 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 apps/wpm/migrations/0078_auto_20250102_0958.py create mode 100644 apps/wpmw/migrations/0001_initial.py diff --git a/apps/inm/services.py b/apps/inm/services.py index 12023589..ffba32b7 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -1,4 +1,6 @@ -from apps.inm.models import MIO, MIOItem, MaterialBatch, MaterialBatchA, MIOItemA, WareHouse +from apps.inm.models import (MIO, MIOItem, + MaterialBatch, MaterialBatchA, + MIOItemA, WareHouse, MIOItemw) from rest_framework.exceptions import ParseError from apps.mtm.models import Material, Process from apps.utils.tools import ranstr @@ -6,6 +8,7 @@ from apps.utils.thread import MyThread from apps.mtm.services import cal_material_count from apps.wpm.models import WMaterial from apps.wpm.services_2 import get_alldata_with_batch_and_store +from apps.wpmw.models import Wpr def do_out(item: MIOItem): """ @@ -254,9 +257,9 @@ class InmService: out = -1 默认使用count字段做加减 """ - material = i.material + material: Material = i.material warehouse = i.warehouse - + tracking = material.tracking ddict = {"count": 0, "supplier": i.mio.supplier} if i.material.type in [Material.MA_TYPE_MAINSO]: ddict["batch_ofrom"] = i.batch @@ -271,12 +274,25 @@ class InmService: if in_or_out == 1: mb.count = mb.count + getattr(i, field) mb.save() + if tracking == Material.MA_TRACKING_SINGLE: + mioitemws = MIOItemw.objects.filter(mioitem=i) + if mioitemws.count() != mb.count: + raise ParseError("出入库与明细数量不一致,操作失败") + for mioitemw in mioitemws: + Wpr.change_or_new(mioitemw.number, i.material, mb) + elif in_or_out == -1: mb.count = mb.count - getattr(i, field) if mb.count < 0: raise ParseError("批次库存不足,操作失败") else: mb.save() + if tracking == Material.MA_TRACKING_SINGLE: + mioitemws = MIOItemw.objects.filter(mioitem=i) + if mioitemws.count() != mb.count: + raise ParseError("出入库与明细数量不一致,操作失败") + for mioitemw in mioitemws: + Wpr.change_or_new(mioitemw.number, i.material, mb=None) else: raise ParseError("不支持的操作") diff --git a/apps/wpm/migrations/0078_auto_20250102_0958.py b/apps/wpm/migrations/0078_auto_20250102_0958.py new file mode 100644 index 00000000..2a611df5 --- /dev/null +++ b/apps/wpm/migrations/0078_auto_20250102_0958.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.12 on 2025-01-02 01:58 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0032_defect_note'), + ('wpm', '0077_auto_20241206_1758'), + ] + + operations = [ + migrations.AddField( + model_name='wmaterial', + name='defect', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='qm.defect', verbose_name='缺陷'), + ), + migrations.CreateModel( + name='Mlogbw', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.TextField(verbose_name='单个编号')), + ('test_json', models.JSONField(blank=True, default=dict, verbose_name='检验情况')), + ('defect_json', models.JSONField(blank=True, default=list, verbose_name='缺陷情况')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('mlogb', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.mlogb', verbose_name='生产记录')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Handoverbw', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.TextField(verbose_name='单个编号')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('handoverb', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.handoverb', verbose_name='关联交接记录')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/wpmw/migrations/0001_initial.py b/apps/wpmw/migrations/0001_initial.py new file mode 100644 index 00000000..d1e24932 --- /dev/null +++ b/apps/wpmw/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# Generated by Django 3.2.12 on 2025-01-02 01:58 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wpm', '0078_auto_20250102_0958'), + ('inm', '0023_auto_20250102_0858'), + ('mtm', '0048_auto_20241218_1431'), + ('qm', '0032_defect_note'), + ] + + operations = [ + migrations.CreateModel( + name='WpDefect', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('is_main', models.BooleanField(default=False, verbose_name='是否主要缺陷')), + ('defect', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.defect', verbose_name='关联缺陷项')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Wpr', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='编号')), + ('state', models.PositiveSmallIntegerField(choices=[(10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')], default=10, verbose_name='状态')), + ('defects', models.ManyToManyField(through='wpmw.WpDefect', to='qm.Defect', verbose_name='缺陷项')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='当前物料形态')), + ('mb', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='inm.materialbatch', verbose_name='仓库物料')), + ('wm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.wmaterial', verbose_name='车间物料')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='wpdefect', + name='wpr', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpmw.wpr', verbose_name='关联产物'), + ), + ] diff --git a/apps/wpmw/models.py b/apps/wpmw/models.py index e063661e..e4fea4f9 100644 --- a/apps/wpmw/models.py +++ b/apps/wpmw/models.py @@ -1,9 +1,10 @@ from django.db import models from apps.utils.models import BaseModel from apps.mtm.models import Material +from rest_framework.exceptions import ParseError # Create your models here. -class Wp(BaseModel): +class Wpr(BaseModel): """ 动态半成品表 """ @@ -17,7 +18,21 @@ class Wp(BaseModel): mb = models.ForeignKey("inm.materialbatch", verbose_name="仓库物料", on_delete=models.CASCADE, null=True, blank=True) wm = models.ForeignKey("wpm.wmaterial", verbose_name="车间物料", on_delete=models.CASCADE, null=True, blank=True) + + @classmethod + def change_or_new(cls, number, material, mb=None, wm=None, state=10): + ins = cls.objects.filter(number=number).first() + if ins: + ins.material = material + else: + ins = cls(number=number, material=material) + ins.state = state + ins.mb = mb + ins.wm = wm + ins.save() + + class WpDefect(BaseModel): - wp = models.ForeignKey(Wp, verbose_name="关联产物", on_delete=models.CASCADE) + wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE) defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE) is_main = models.BooleanField("是否主要缺陷", default=False) \ No newline at end of file diff --git a/server/settings.py b/server/settings.py index 9c375324..5118b4dc 100755 --- a/server/settings.py +++ b/server/settings.py @@ -80,7 +80,8 @@ INSTALLED_APPS = [ 'apps.edu', 'apps.dpm', 'apps.cm', - 'apps.cms' + 'apps.cms', + 'apps.wpmw' ] MIDDLEWARE = [