fix: base 添加wpmw并支持出入库提交

This commit is contained in:
caoqianming 2025-01-02 10:32:36 +08:00
parent 73b1d58b8a
commit def67ebac5
5 changed files with 148 additions and 6 deletions

View File

@ -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 rest_framework.exceptions import ParseError
from apps.mtm.models import Material, Process from apps.mtm.models import Material, Process
from apps.utils.tools import ranstr 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.mtm.services import cal_material_count
from apps.wpm.models import WMaterial from apps.wpm.models import WMaterial
from apps.wpm.services_2 import get_alldata_with_batch_and_store from apps.wpm.services_2 import get_alldata_with_batch_and_store
from apps.wpmw.models import Wpr
def do_out(item: MIOItem): def do_out(item: MIOItem):
""" """
@ -254,9 +257,9 @@ class InmService:
out = -1 out = -1
默认使用count字段做加减 默认使用count字段做加减
""" """
material = i.material material: Material = i.material
warehouse = i.warehouse warehouse = i.warehouse
tracking = material.tracking
ddict = {"count": 0, "supplier": i.mio.supplier} ddict = {"count": 0, "supplier": i.mio.supplier}
if i.material.type in [Material.MA_TYPE_MAINSO]: if i.material.type in [Material.MA_TYPE_MAINSO]:
ddict["batch_ofrom"] = i.batch ddict["batch_ofrom"] = i.batch
@ -271,12 +274,25 @@ class InmService:
if in_or_out == 1: if in_or_out == 1:
mb.count = mb.count + getattr(i, field) mb.count = mb.count + getattr(i, field)
mb.save() 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: elif in_or_out == -1:
mb.count = mb.count - getattr(i, field) mb.count = mb.count - getattr(i, field)
if mb.count < 0: if mb.count < 0:
raise ParseError("批次库存不足,操作失败") raise ParseError("批次库存不足,操作失败")
else: else:
mb.save() 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: else:
raise ParseError("不支持的操作") raise ParseError("不支持的操作")

View File

@ -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,
},
),
]

View File

@ -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='关联产物'),
),
]

View File

@ -1,9 +1,10 @@
from django.db import models from django.db import models
from apps.utils.models import BaseModel from apps.utils.models import BaseModel
from apps.mtm.models import Material from apps.mtm.models import Material
from rest_framework.exceptions import ParseError
# Create your models here. # 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) 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) 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): 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) defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE)
is_main = models.BooleanField("是否主要缺陷", default=False) is_main = models.BooleanField("是否主要缺陷", default=False)

View File

@ -80,7 +80,8 @@ INSTALLED_APPS = [
'apps.edu', 'apps.edu',
'apps.dpm', 'apps.dpm',
'apps.cm', 'apps.cm',
'apps.cms' 'apps.cms',
'apps.wpmw'
] ]
MIDDLEWARE = [ MIDDLEWARE = [