From 6678e39518fbc4aa2735399d689a6a876504d2c4 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Apr 2025 11:29:32 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=E9=87=87=E8=B4=AD=E5=92=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E5=85=A5=E5=BA=93=E5=8F=AF=E5=85=A5=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E6=89=B9=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index d736b355..2aaff0de 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -242,7 +242,10 @@ class InmService: BatchLog.clear(mio=instance) else: for item in MIOItem.objects.filter(mio=instance): - BatchSt.g_create(batch=item.batch, mio=instance, material_start=item.material) + if item.mb: # 说明录入到已有批次 + BatchSt.g_create(batch=item.batch) + else: + BatchSt.g_create(batch=item.batch, mio=instance, material_start=item.material) from apps.pum.services import PumService if is_reverse: cls.update_mb(instance, -1) @@ -254,7 +257,10 @@ class InmService: BatchLog.clear(mio=instance) else: for item in MIOItem.objects.filter(mio=instance): - BatchSt.g_create(batch=item, mio=instance, material_start=item.material) + if item.mb: + BatchSt.g_create(batch=item.batch) + else: + BatchSt.g_create(batch=item, mio=instance, material_start=item.material) if is_reverse: cls.update_mb(instance, -1) else: From 2b9e3322ac2826df273fe33fb052c20b1e376fe8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Apr 2025 14:13:34 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20update=5Fmaterial=5Fcount=E6=97=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BB=84=E5=90=88=E4=BB=B6=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 5 +++-- apps/inm/views.py | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index 2aaff0de..351fa122 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -228,8 +228,9 @@ class InmService: 更新物料数量 """ # 统计物料数量 - m_ids = MIOItem.objects.filter(mio=instance).values_list('material_id', flat=True) - cal_material_count(m_ids) + m_ids = list(MIOItem.objects.filter(mio=instance).values_list('material_id', flat=True)) + m_ids2 = list(MIOItemA.objects.filter(mioitem__mio=instance).values_list('material_id', flat=True)) + cal_material_count(m_ids+m_ids2) @classmethod def update_inm(cls, instance: MIO, is_reverse: bool = False): diff --git a/apps/inm/views.py b/apps/inm/views.py index 57e05bf3..51fe7854 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -286,6 +286,7 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode sr.save() # 开始变动库存 InmService.update_mb_item(ins, -1, 'count_notok') + InmService.update_material_count(ins.mio) return Response() @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=serializers.Serializer) @@ -303,6 +304,7 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode pass ins.test_date = None ins.save() + InmService.update_material_count(ins.mio) return Response() @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemPurInTestSerializer) @@ -320,6 +322,7 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode sr = MIOItemPurInTestSerializer(instance=ins, data=request.data) sr.is_valid(raise_exception=True) sr.save() + InmService.update_material_count(ins.mio) return Response() @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MioItemAnaSerializer) From 1e379d412c9baa22366bb2ae91e24907da102410 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Apr 2025 14:18:41 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E7=89=A9=E6=96=99=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E9=87=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/views.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/mtm/views.py b/apps/mtm/views.py index 30810262..f942419a 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -59,6 +59,18 @@ class MaterialViewSet(CustomModelViewSet): daoru_material(settings.BASE_DIR + request.data.get('path', '')) return Response() + @action(methods=['post'], detail=True, serializer_class=Serializer, perms_map={'post': 'material.create'}) + @transaction.atomic + def cal_count(self, request, *args, **kwargs): + """统计数量 + + 统计数量 + """ + ins = self.get_object() + from apps.mtm.services_2 import cal_material_count + cal_material_count([ins.id]) + return Response() + @action(methods=['put'], detail=True, serializer_class=Serializer, perms_map={'put': '*'}) @transaction.atomic def set_week_esitimate_consume(self, request, *args, **kwargs): From 00e352d8ef20237445c6d15b2761e4f1da4e81b3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Apr 2025 14:52:03 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=E6=94=B9=E7=89=88=E4=BA=A4?= =?UTF-8?q?=E6=8E=A5=E9=9C=80=E8=A6=81=E8=A7=A6=E5=8F=91=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/services.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 410b22fe..cbfa4562 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -23,6 +23,7 @@ from ..qm.models import Defect, Ftest from django.db.models import Count, Q from apps.utils.tasks import ctask_run from apps.mtm.models import Process +from apps.mtm.services_2 import cal_material_count myLogger = logging.getLogger('log') @@ -719,9 +720,11 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, raise ParseError("合并批次时请提供新批次号") new_target = None + mids = [] for item in handoverb_list: wmId, xcount, handover_or_b = item wm_from = WMaterial.objects.get(id=wmId) + mids.append(wm_from.material.id) # 合并为新批 if mtype == Handover.H_MERGE: @@ -893,6 +896,12 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, if batches: for batch in batches: MyThread(target=get_alldata_with_batch_and_store, args=(batch,)).start() + + # 如果是改版交接需要触发统计数量 + if handover.type == Handover.H_CHANGE: + mids.append(handover.material_changed.id) + cal_material_count(mids) + def handover_revert(handover:Handover): BatchLog.clear(handover=handover) From adcde59bd1ca48fa76ddae67ddb5d111d3638e6c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 19 Apr 2025 21:23:21 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix:=20=E5=85=B6=E4=BB=96=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E6=97=B6batchst.g=5Fcreate=E4=BC=A0=E5=8F=82=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index 351fa122..6f27159a 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -261,7 +261,7 @@ class InmService: if item.mb: BatchSt.g_create(batch=item.batch) else: - BatchSt.g_create(batch=item, mio=instance, material_start=item.material) + BatchSt.g_create(batch=item.batch, mio=instance, material_start=item.material) if is_reverse: cls.update_mb(instance, -1) else: From e24d92fe9bd620c8038a7f0c4d9412309df72b0b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 19 Apr 2025 22:41:26 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20base=E5=A2=9E=E5=8A=A0PositiveDecim?= =?UTF-8?q?alField?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/utils/fields.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/utils/fields.py b/apps/utils/fields.py index f93a46d5..f29fb573 100644 --- a/apps/utils/fields.py +++ b/apps/utils/fields.py @@ -1,5 +1,9 @@ from django.conf import settings from rest_framework import serializers +from django.db.models import DecimalField +from django.core.validators import MinValueValidator +from django.utils.functional import cached_property +from decimal import Decimal class MyFilePathField(serializers.CharField): @@ -8,3 +12,9 @@ class MyFilePathField(serializers.CharField): if 'http' in value: return str(value) return settings.BASE_URL + str(value) + +class PositiveDecimalField(DecimalField): + + @cached_property + def validators(self): + return [MinValueValidator(Decimal('0.0'))] + super().validators \ No newline at end of file From 0489a545e883429fdc965b40d050a8ad5d3659eb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 19 Apr 2025 23:24:43 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20inm=E6=A0=A1=E9=AA=8C=E9=9D=9E?= =?UTF-8?q?=E6=AD=A3=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index 6f27159a..edcdb208 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -63,6 +63,8 @@ def do_out(item: MIOItem): xbatch:str = al[1] xcount:str = al[2] xbatches.append(xbatch) + if xcount <= 0: + raise ParseError("存在非正数!") mb = None if not is_zhj: try: @@ -140,6 +142,8 @@ def do_in(item: MIOItem): xbatchs = [] for al in action_list: xmaterial, xbatch, xcount = al + if xcount <= 0: + raise ParseError("存在非正数!") xbatchs.append(xbatch) # 扣减车间库存 wm_qs = WMaterial.objects.filter( @@ -353,7 +357,7 @@ class InmService: for material, warehouse, batch, change_count, defect, mioitem in m_list: if change_count <= 0: - continue + raise ParseError("存在非正数!") state = WMaterial.WM_OK if defect: state = WMaterial.WM_NOTOK From 181d47742522d135567ccc21af03cd011e22b8cc Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 19 Apr 2025 23:40:42 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20=E6=97=A5=E5=BF=97=E5=92=8C=E4=BA=A4?= =?UTF-8?q?=E6=8E=A5=E8=AE=B0=E5=BD=95=E6=93=8D=E4=BD=9C=E6=95=B0=E6=AD=A3?= =?UTF-8?q?=E5=80=BC=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/services.py | 66 ++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index cbfa4562..ac167bf8 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -196,6 +196,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): m_ins_list = [(material_in, mlog.batch, mlog.count_use, None, mlog)] for mi in m_ins_list: mi_ma, mi_batch, mi_count, defect, mlog_or_b = mi + if mi_count <= 0: + raise ParseError('存在非正数!') # 需要判断领用数是否合理 # 优先使用工段库存 if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in: @@ -235,18 +237,19 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if need_store_notok: for item in m_ins_bl_list: material, batch, count, defect, mi_ = item - if count> 0: - lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK} - wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={"belong_dept": belong_dept}) - wm.count = wm.count + count - if is_create: - wm.create_by = user - wm.batch_ofrom = mi_.batch_ofrom - wm.material_ofrom = mi_.material_ofrom - wm.update_by = user - wm.save() - if material.tracking == Material.MA_TRACKING_SINGLE: - raise ParseError("加工前不良的物料暂不支持单件追踪") + if count <= 0: + raise ParseError('存在非正数!') + lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK} + wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={"belong_dept": belong_dept}) + wm.count = wm.count + count + if is_create: + wm.create_by = user + wm.batch_ofrom = mi_.batch_ofrom + wm.material_ofrom = mi_.material_ofrom + wm.update_by = user + wm.save() + if material.tracking == Material.MA_TRACKING_SINGLE: + raise ParseError("加工前不良的物料暂不支持单件追踪") if material_out or is_fix: # 需要入车间库存 @@ -291,7 +294,9 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): # 一次填写的暂时不处理不合格品 for mo in m_outs_list: mo_ma, mo_batch, mo_count, mo_count_eweight, notok_sign_or_defect, mlog_or_b = mo - if mo_count <= 0: + if mo_count < 0: + raise ParseError('存在负数!') + elif mo_count == 0: continue if is_fix: wm_state = WMaterial.WM_REPAIRED @@ -432,7 +437,9 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): for mo in m_outs_list: mo_ma, mo_batch, mo_count, _, notok_sign_or_defect, mlog_or_b = mo - if mo_count == 0: + if mo_count < 0: + raise ParseError('存在负数!') + elif mo_count == 0: continue if is_fix: wm_state = WMaterial.WM_REPAIRED @@ -497,6 +504,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): m_ins_list = [(material_in, mlog.batch, mlog.count_use, mlog.wm_in, mlog)] for mi in m_ins_list: mi_ma, mi_batch, mi_count, defect_or, mlog_or_b = mi + if mi_count <= 0: + raise ParseError('存在非正数!') if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in: wm = WMaterial.objects.get(id=mlog_or_b.wm_in.id) else: @@ -528,19 +537,20 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if stored_notok: for item in m_ins_bl_list: material, batch, count, defect, mi_ = item - if count> 0: - lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK} - wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept}) - wm.count = wm.count - count - if wm.count < 0: - raise ParseError('加工前不良数量大于库存量') - if is_create: - wm.create_by = user - else: - wm.update_by = user - wm.save() - if material.tracking == Material.MA_TRACKING_SINGLE: - raise ParseError("加工前不良的物料暂不支持单件回退") + if count <= 0: + raise ParseError('存在非正数!') + lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK} + wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept}) + wm.count = wm.count - count + if wm.count < 0: + raise ParseError('加工前不良数量大于库存量') + if is_create: + wm.create_by = user + else: + wm.update_by = user + wm.save() + if material.tracking == Material.MA_TRACKING_SINGLE: + raise ParseError("加工前不良的物料暂不支持单件回退") mlog.submit_time = None mlog.submit_user = None @@ -723,6 +733,8 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, mids = [] for item in handoverb_list: wmId, xcount, handover_or_b = item + if xcount <= 0: + raise ParseError("存在非正数!") wm_from = WMaterial.objects.get(id=wmId) mids.append(wm_from.material.id)