feat: mioitemw等增加wpr字段

This commit is contained in:
caoqianming 2025-01-03 16:53:42 +08:00
parent 84525c03c8
commit 437501b668
8 changed files with 85 additions and 19 deletions

View File

@ -0,0 +1,20 @@
# Generated by Django 3.2.12 on 2025-01-03 08:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('wpmw', '0001_initial'),
('inm', '0023_auto_20250102_0858'),
]
operations = [
migrations.AddField(
model_name='mioitemw',
name='wpr',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wpr_mioitemw', to='wpmw.wpr', verbose_name='关联产品'),
),
]

View File

@ -178,6 +178,8 @@ class MIOItemw(BaseModel):
单件记录
"""
number = models.TextField('编号')
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw'
, null=True, blank=True)
mioitem = models.ForeignKey(MIOItem, verbose_name='关联出入库明细', on_delete=models.CASCADE, related_name='w_mioitem')
note = models.TextField('备注', null=True, blank=True)

View File

@ -153,15 +153,18 @@ class MIOItemCreateSerializer(CustomModelSerializer):
else:
raise ParseError('缺少组合件')
if material.tracking == Material.MA_TRACKING_SINGLE:
if count == 1 and len(mioitemw) == 0:
MIOItemw.objects.create(mioitem=instance, number=batch)
elif count == 1 and len(mioitemw) >= 1:
MIOItemw.objects.create(mioitem=instance, number=mioitemw[0]['number'], note=mioitemw[0]['note'])
elif count > 1 and len(mioitemw) == count:
for item in mioitemw:
MIOItemw.objects.create(mioitem=instance, number=item['number'], note=item['note'])
if mio.type == MIO.MIO_TYPE_PUR_IN:
if count == 1 and len(mioitemw) == 0:
MIOItemw.objects.create(mioitem=instance, number=batch)
elif count == 1 and len(mioitemw) >= 1:
MIOItemw.objects.create(mioitem=instance, number=mioitemw[0]['number'], note=mioitemw[0]['note'])
elif count > 1 and len(mioitemw) == count:
for item in mioitemw:
MIOItemw.objects.create(mioitem=instance, number=item['number'], note=item['note'])
else:
raise ParseError('单个明细信息不匹配')
else:
raise ParseError('单个明细信息不匹配')
raise ParseError("暂只支持采购入库")
return instance

View File

@ -94,7 +94,7 @@ def do_out(item: MIOItem):
if mioitemws.count() != item.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(mioitemw.number, mb=None, wm=wm, old_mb=mb)
Wpr.change_or_new(wpr=mioitemw.wpr, wm=wm, old_mb=mb)
# 触发批次统计分析
xbatches = list(set(xbatches))
@ -291,7 +291,12 @@ class InmService:
if mioitemws.count() != mb.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(number=mioitemw.number, mb=mb)
if mioitemw.wpr:
Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb)
else:
wpr = Wpr.change_or_new(number=mioitemw.number, mb=mb)
mioitemw.wpr = wpr
mioitemw.save()
elif in_or_out == -1:
mb.count = mb.count - getattr(i, field)
@ -304,7 +309,7 @@ class InmService:
if mioitemws.count() != mb.count:
raise ParseError("出入库与明细数量不一致,操作失败")
for mioitemw in mioitemws:
Wpr.change_or_new(number=mioitemw.number, old_mb=mb)
Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb)
else:
raise ParseError("不支持的操作")

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.12 on 2025-01-03 08:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('wpmw', '0001_initial'),
('wpm', '0078_auto_20250102_0958'),
]
operations = [
migrations.AddField(
model_name='handoverbw',
name='wpr',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wpr_handoverbw', to='wpmw.wpr', verbose_name='关联产品'),
),
migrations.AddField(
model_name='mlogbw',
name='wpr',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wpr_mlogbw', to='wpmw.wpr', verbose_name='关联产品'),
),
]

View File

@ -338,6 +338,8 @@ class Mlogb(BaseModel):
class Mlogbw(BaseModel):
number = models.TextField('单个编号')
mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE)
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL
, related_name='wpr_mlogbw', null=True, blank=True)
note = models.TextField('备注', null=True, blank=True)
@ -397,6 +399,8 @@ class Handoverb(BaseModel):
class Handoverbw(BaseModel):
handoverb = models.ForeignKey(Handoverb, verbose_name='关联交接记录', on_delete=models.CASCADE)
number = models.TextField('单个编号')
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.CASCADE
, related_name='wpr_handoverbw', null=True, blank=True)
note = models.TextField('备注', null=True, blank=True)
class AttLog(CommonADModel):

View File

@ -201,7 +201,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if mlogbws.count() != mi_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlogbws:
Wpr.change_or_new(number=item.number, old_wm=wm)
Wpr.change_or_new(wpr=item.wpr, old_wm=wm)
# 针对加工前不良的暂时额外处理
for item in m_ins_bl_list:
@ -271,7 +271,10 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if mlogbws.count() != mo_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlogbws:
Wpr.change_or_new(number=item.number, wm=wm)
if item.wpr:
Wpr.change_or_new(wpr=item.wpr, wm=wm)
else:
Wpr.change_or_new(number=item.number, wm=wm)
mlog.submit_time = now
mlog.submit_user = user
@ -356,7 +359,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if mlogbws.count() != mo_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlogbws:
Wpr.change_or_new(number=item.number, old_wm=wm)
Wpr.change_or_new(wpr=item.wpr, old_wm=wm)
# 再生成消耗
if material_in: # 领用数退回
@ -393,7 +396,10 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if mlogbws.count() != mi_count:
raise ParseError("日志与明细数量不一致,操作失败")
for item in mlogbws:
Wpr.change_or_new(number=item.number, wm=wm)
if item.wpr:
Wpr.change_or_new(wpr=item.wpr, wm=wm)
else:
Wpr.change_or_new(number=item.number, wm=wm)
# 针对加工前不良的暂时额外处理
for item in m_ins_bl_list:

View File

@ -18,14 +18,14 @@ class Wpr(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, mb=None, wm=None, old_mb=None, old_wm=None):
def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None):
if wpr is None and number is None:
raise ParseError("id和number不能同时为空")
if mb and wm:
raise ParseError("所属仓库批次和车间批次不可同时存在")
ins = cls.objects.filter(number=number).first()
ins = wpr if wpr else cls.objects.filter(number=number).first()
if ins is None:
ins = cls(number=number)
@ -41,6 +41,7 @@ class Wpr(BaseModel):
if wm:
ins.material = wm.material
ins.save()
return ins
@classmethod
def clear(cls, number_list):