feat: 重新梳理计算物料总数量

This commit is contained in:
caoqianming 2024-07-04 10:04:49 +08:00
parent ffc9f0ee4d
commit 7381a65c24
4 changed files with 72 additions and 33 deletions

View File

@ -6,8 +6,29 @@ from apps.wpm.services import do_out, do_in
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
from apps.system.models import Dept from apps.system.models import Dept
from apps.utils.thread import MyThread
def cal_material_count(materialId_list: list = []):
"""
计算物料总数量
"""
from apps.inm.models import MaterialBatch
from apps.wpm.models import WMaterial
if materialId_list:
objs = Material.objects.filter(id__in=set(materialId_list))
else:
objs = Material.objects.all()
for material in objs:
mb_count = MaterialBatch.objects.filter(material=material).aggregate(total=Sum("count"))["total"]
wm_count = WMaterial.objects.filter(material=material).aggregate(total=Sum("count"))["total"]
if mb_count is None:
mb_count = 0
if wm_count is None:
wm_count = 0
Material.objects.filter(id=material.id).update(
count_wm=wm_count,
count_mb=mb_count,
count=mb_count + wm_count)
class InmService: class InmService:
@classmethod @classmethod
def update_inm(cls, instance: MIO, is_reverse: bool = False): def update_inm(cls, instance: MIO, is_reverse: bool = False):
@ -42,19 +63,13 @@ class InmService:
do_in(instance) do_in(instance)
else: else:
do_out(instance) do_out(instance)
else:
raise ParseError('不支持该出入库操作')
# 统计物料数量
m_ids = MIOItem.objects.filter(mio=instance).values_list('material_id', flat=True)
MyThread(target=cal_material_count, args=(m_ids, ), daemon=True, log_err=True).start()
@classmethod
def cal_mat_count(cls, material: Material):
mb_count = MaterialBatch.objects.filter(material=material).aggregate(total=Sum("count"))["total"]
from apps.wpm.models import WMaterial
wm_count = WMaterial.objects.filter(material=material).aggregate(total=Sum("count"))["total"]
if mb_count is None:
mb_count = 0
if wm_count is None:
wm_count = 0
Material.objects.filter(id=material.id).update(
count_mb=mb_count,
count=mb_count + wm_count)
@classmethod @classmethod
def update_mb(cls, instance: MIO, in_or_out: int = 1): def update_mb(cls, instance: MIO, in_or_out: int = 1):
@ -68,7 +83,7 @@ class InmService:
raise ParseError("未填写物料明细") raise ParseError("未填写物料明细")
type = instance.type type = instance.type
belong_dept = instance.belong_dept belong_dept = instance.belong_dept
for i in MIOItem.objects.filter(mio=instance): for i in mioitems:
cls.update_mb_item(i, in_or_out, 'count', type, belong_dept) cls.update_mb_item(i, in_or_out, 'count', type, belong_dept)
@classmethod @classmethod
@ -112,7 +127,6 @@ class InmService:
mb.save() mb.save()
else: else:
raise ParseError("不支持的操作") raise ParseError("不支持的操作")
cls.cal_mat_count(material)
def daoru_mb(path: str): def daoru_mb(path: str):

View File

@ -2,16 +2,3 @@ from __future__ import absolute_import, unicode_literals
from apps.utils.tasks import CustomTask from apps.utils.tasks import CustomTask
from celery import shared_task from celery import shared_task
from apps.mtm.models import Material from apps.mtm.models import Material
@shared_task(base=CustomTask)
def correct_material_count(materialId: str = ''):
"""
矫正现有物料总数量
"""
from apps.inm.services import InmService
if materialId:
objs = Material.objects.filter(id=materialId)
else:
objs = Material.objects.all()
for m in objs:
InmService.cal_mat_count(m)

View File

@ -0,0 +1,38 @@
# Generated by Django 3.2.12 on 2024-07-04 02:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mtm', '0032_auto_20240702_1409'),
]
operations = [
migrations.AddField(
model_name='material',
name='count_wm',
field=models.DecimalField(decimal_places=3, default=0, max_digits=14, verbose_name='车间库存'),
),
migrations.AlterField(
model_name='material',
name='count',
field=models.DecimalField(decimal_places=3, default=0, max_digits=14, verbose_name='总库存'),
),
migrations.AlterField(
model_name='material',
name='count_mb',
field=models.DecimalField(decimal_places=3, default=0, max_digits=14, verbose_name='仓库库存'),
),
migrations.AlterField(
model_name='material',
name='count_safe',
field=models.DecimalField(blank=True, decimal_places=3, max_digits=14, null=True, verbose_name='安全库存数'),
),
migrations.AlterField(
model_name='material',
name='week_esitimate_consume',
field=models.DecimalField(blank=True, decimal_places=3, max_digits=14, null=True, verbose_name='周消耗预估'),
),
]

View File

@ -57,11 +57,11 @@ class Material(CommonAModel):
testitems = models.JSONField('检测项目', default=list, blank=True) testitems = models.JSONField('检测项目', default=list, blank=True)
sort = models.PositiveSmallIntegerField('排序', default=1) sort = models.PositiveSmallIntegerField('排序', default=1)
unit = models.CharField('基准计量单位', default='', max_length=10) unit = models.CharField('基准计量单位', default='', max_length=10)
count = models.PositiveIntegerField('总库存', default=0) count = models.DecimalField('总库存', max_digits=14, decimal_places=3, default=0)
count_mb = models.PositiveIntegerField('仓库总数', default=0) count_mb = models.DecimalField('仓库库存', max_digits=14, decimal_places=3, default=0)
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True) count_wm = models.DecimalField('车间库存', max_digits=14, decimal_places=3, default=0)
week_esitimate_consume = models.PositiveIntegerField( count_safe = models.DecimalField('安全库存数', max_digits=14, decimal_places=3, null=True, blank=True)
'周消耗预估', null=True, blank=True) week_esitimate_consume = models.DecimalField('周消耗预估', max_digits=14, decimal_places=3, null=True, blank=True)
process = models.ForeignKey( process = models.ForeignKey(
Process, verbose_name='所用工序', on_delete=models.CASCADE, null=True, blank=True) Process, verbose_name='所用工序', on_delete=models.CASCADE, null=True, blank=True)
parent = models.ForeignKey( parent = models.ForeignKey(