From 17697d6482faa49400784f8ea58c2db6aca83431 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 2 Dec 2024 13:39:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0batchst=E8=B7=AF?= =?UTF-8?q?=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 10 +++++++-- apps/wpm/services_2.py | 45 ++++++++++++++++++++++++++++------------- apps/wpm/urls.py | 3 ++- apps/wpm/views.py | 22 ++++++++++++++++---- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 886d6a17..3e424df2 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -5,7 +5,7 @@ from rest_framework.exceptions import ValidationError, ParseError from datetime import datetime from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog, - Handover, Handoverb, Mlogb, AttLog, OtherLog, Fmlog) + Handover, Handoverb, Mlogb, AttLog, OtherLog, Fmlog, BatchSt) from apps.system.models import Dept, User from apps.system.serializers import UserSimpleSerializer from apps.pm.models import Mtask, Mtaskb @@ -811,4 +811,10 @@ class FmlogUpdateSerializer(CustomModelSerializer): class MlogTCreateSerializer(CustomModelSerializer): - pass \ No newline at end of file + pass + + +class BatchStSerializer(CustomModelSerializer): + class Meta: + model = BatchSt + fields = "__all__" \ No newline at end of file diff --git a/apps/wpm/services_2.py b/apps/wpm/services_2.py index d7c16677..c483a021 100644 --- a/apps/wpm/services_2.py +++ b/apps/wpm/services_2.py @@ -1,9 +1,18 @@ -from apps.wpm.models import Mlog -from apps.mtm.models import Material, Mgroup +from apps.wpm.models import Mlog, BatchSt +from apps.mtm.models import Mgroup from apps.system.models import Dept from apps.inm.models import MIOItem from apps.qm.models import FtestWork +def get_alldata_with_batch_and_store(batch: str): + """ + 获取某个批次某个仓库的整体生产数据并保存 + """ + data = get_alldata_with_batch(batch) + bobj, _ = BatchSt.objects.get_or_create(batch=batch) + bobj.data = data + bobj.save() + def get_alldata_with_batch(batch: str): """ 获取某个批次的整体生产数据 @@ -23,8 +32,10 @@ def get_alldata_with_batch(batch: str): data["棒料成型-备注"] = "" for item in mlogs_blcx_qs: data["产品规格"].append(item.material_out) # 对象 - data["棒料成型-出料人"].append(item.handle_user) # 对象 - data["棒料成型-切料人"].append(item.handle_user_2) # 对象 + if item.handle_user: + data["棒料成型-出料人"].append(item.handle_user) # 对象 + if item.handle_user_2: + data["棒料成型-切料人"].append(item.handle_user_2) # 对象 if item.note: data["棒料成型-备注"] = ";".join([data["棒料成型-备注"], item.note]) for field in mlog_count_fields: @@ -51,14 +62,16 @@ def get_alldata_with_batch(batch: str): data["7车间入库-仓库执行人"] = [] for item in mioitem_qs: data["7车间入库-日期"].append(item.mio.inout_date) - data["7车间入库-车间执行人"].append(item.mio.mio_user) - data["7车间入库-仓库执行人"].append(item.mio.do_user) + if item.mio.mio_user: + data["7车间入库-车间执行人"].append(item.mio.mio_user) + if item.mio.do_user: + data["7车间入库-仓库执行人"].append(item.mio.do_user) for field in mioitem_count_fields: if getattr(item, field) > 0: if f'7车间入库-{field}' not in data: - data[f'7车间入库-{field}'] = getattr(item, field) + data[f'7车间入库-{field}'] = int(getattr(item, field)) else: - data[f'7车间入库-{field}'] += getattr(item, field) + data[f'7车间入库-{field}'] += int(getattr(item, field)) data["7车间入库-合格率"] = round((data["7车间入库-count"] - data["7车间入库-count_notok"]) * 100/ data["7车间入库-count"], 1) data["7车间入库-日期"] = list(set(data["7车间入库-日期"])) data["7车间入库-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["7车间入库-日期"]]) @@ -78,9 +91,9 @@ def get_alldata_with_batch(batch: str): for field in mioitem_count_fields: if getattr(item, field) > 0: if f'6车间生产领料-{field}' not in data: - data[f'6车间生产领料-{field}'] = getattr(item, field) + data[f'6车间生产领料-{field}'] = int(getattr(item, field)) else: - data[f'6车间生产领料-{field}'] += getattr(item, field) + data[f'6车间生产领料-{field}'] += int(getattr(item, field)) data["6车间生产领料-日期"] = list(set(data["6车间生产领料-日期"])) data["6车间生产领料-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["6车间生产领料-日期"]]) @@ -93,8 +106,10 @@ def get_alldata_with_batch(batch: str): data[f'6车间-{mgroup_name}-日期'] = [] data[f'6车间-{mgroup_name}-操作人'] = [] for item in mlogs_qs: - data[f'6车间-{mgroup_name}-日期'].append(item.handle_date) - data[f'6车间-{mgroup_name}-操作人'].append(item.handle_user) + if item.handle_date: + data[f'6车间-{mgroup_name}-日期'].append(item.handle_date) + if item.handle_user: + data[f'6车间-{mgroup_name}-操作人'].append(item.handle_user) for field in mlog_count_fields: if getattr(item, field) > 0: if f'6车间-{mgroup_name}-{field}' not in data: @@ -131,8 +146,10 @@ def get_alldata_with_batch(batch: str): data["成品检验-日期"] = [] data['成品检验-检验人'] = [] for item in ftestwork_qs: - data["成品检验-日期"].append(item.test_date) - data['成品检验-检验人'].append(item.test_user) + if item.test_date: + data["成品检验-日期"].append(item.test_date) + if item.test_user: + data['成品检验-检验人'].append(item.test_user) for field in ftestwork_count_fields: if field == 'count_notok_json': for k, v in getattr(item, field).items(): diff --git a/apps/wpm/urls.py b/apps/wpm/urls.py index ec342726..7a5ffc65 100644 --- a/apps/wpm/urls.py +++ b/apps/wpm/urls.py @@ -4,7 +4,7 @@ from rest_framework.routers import DefaultRouter from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet, AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet, - MlogbOutViewSet, FmlogViewSet) + MlogbOutViewSet, FmlogViewSet, BatchStViewSet) from apps.wpm.datax import AnaViewSet @@ -25,6 +25,7 @@ router.register('handover', HandoverViewSet, basename='handover') router.register('attlog', AttlogViewSet, basename='attlog') router.register('otherlog', OtherLogViewSet, basename='otherlog') router.register('ana', AnaViewSet, basename='ana') +router.register('batchst', BatchStViewSet, basename='batchst') urlpatterns = [ path(API_BASE_URL, include(router.urls)), diff --git a/apps/wpm/views.py b/apps/wpm/views.py index a271ad2d..3ce08463 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -13,16 +13,15 @@ from apps.system.models import User from apps.mtm.models import Material, Process from apps.pm.models import Mtask from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet -from apps.utils.mixins import BulkCreateModelMixin from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter, MlogbFilter -from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog, Fmlog +from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog, Fmlog, BatchSt from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogRevertSerializer, MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer, HandoverUpdateSerializer, GenHandoverSerializer, GenHandoverWmSerializer, MlogAnaSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, - MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer) + MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer) from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog from apps.utils.thread import MyThread from apps.monitor.services import create_auditlog, delete_auditlog @@ -510,4 +509,19 @@ class FmlogViewSet(CustomModelViewSet): ins = self.get_object() if Mlog.objects.filter(fmlog=ins).exists(): raise ParseError('因存在二级日志不可删除') - return super().destroy(request, *args, **kwargs) \ No newline at end of file + return super().destroy(request, *args, **kwargs) + + +class BatchStViewSet(ListModelMixin, CustomGenericViewSet): + """ + list: 批次统计数据 + + 批次统计数据 + """ + perms_map = {"get": "*"} + queryset = BatchSt.objects.all() + serializer_class = BatchStSerializer + filterset_fields = { + "batch": ["exact", "contains"], + "update_time": ["exact", "gte", "lte"] + }