From d9f66d29708b7f715c4c63980fa1fc2dc6594abd Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 May 2025 10:49:13 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E6=A3=80?= =?UTF-8?q?=E9=AA=8C=E6=A8=A1=E6=9D=BF=E5=8F=AA=E7=94=A8=E5=8D=95=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/models.py | 4 ++-- apps/qm/views.py | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/qm/models.py b/apps/qm/models.py index b6c693c0..8685db69 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -177,7 +177,7 @@ class Qct(CommonAModel): qct = Qct.objects.get(qctmat__material=material, tags__contains=tag) except Qct.DoesNotExist: try: - qct = Qct.objects.ge(name="通用检验表") + qct = Qct.objects.get(name="默认检验表") except Qct.DoesNotExist: qct = None except Qct.MultipleObjectsReturned: @@ -198,7 +198,7 @@ class Qct(CommonAModel): def get_qs(cls, materialId:str, tag:str): qct_qs = Qct.objects.filter(qctmat__material__id=materialId, tags__contains=tag) if not qct_qs.exists(): - qct_qs = Qct.objects.filter(tags__contains="default") + qct_qs = Qct.objects.filter(name="默认检验表") return qct_qs class QctTestItem(BaseModel): diff --git a/apps/qm/views.py b/apps/qm/views.py index a8d0948b..6b4c8ada 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -53,10 +53,15 @@ class QctViewSet(CustomModelViewSet): @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=QctGetSerializer) @transaction.atomic - def get_qs(self, request, *args, **kwargs): + def get_qct(self, request, *args, **kwargs): + """ + 获取检验模板 + + 获取检验模板 + """ data = request.data - qct_qs = Qct.get_qs(data["material"], data["tag"]) - return QctSerializer(instance=qct_qs, many=True).data + qct = Qct.get(data["material"], data["tag"]) + return QctSerializer(instance=qct).data class QctTestItemViewSet(CustomModelViewSet): From 57dfab3bb9bae4802f4219b5d8dc4a08b02425f8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 May 2025 11:01:21 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E8=8E=B7=E5=8F=96=E6=A3=80=E9=AA=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8F=AA=E7=94=A8=E5=8D=95=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qm/views.py b/apps/qm/views.py index 6b4c8ada..89662bb5 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -61,7 +61,7 @@ class QctViewSet(CustomModelViewSet): """ data = request.data qct = Qct.get(data["material"], data["tag"]) - return QctSerializer(instance=qct).data + return Response(QctSerializer(instance=qct).data) class QctTestItemViewSet(CustomModelViewSet): From f32adf3702cae5528ac60d8d2703e501a3e047ac Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 May 2025 11:04:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E8=8E=B7=E5=8F=96=E6=A3=80=E9=AA=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8F=AA=E7=94=A8=E5=8D=95=E4=B8=AA2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/models.py | 4 ++-- apps/qm/views.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/qm/models.py b/apps/qm/models.py index 8685db69..be9d9cc4 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -172,9 +172,9 @@ class Qct(CommonAModel): return QctMat.objects.filter(qct=self) @classmethod - def get(cls, material:Material, tag:str): + def get(cls, materialId:str, tag:str): try: - qct = Qct.objects.get(qctmat__material=material, tags__contains=tag) + qct = Qct.objects.get(qctmat__material__id=materialId, tags__contains=tag) except Qct.DoesNotExist: try: qct = Qct.objects.get(name="默认检验表") diff --git a/apps/qm/views.py b/apps/qm/views.py index 89662bb5..b65a8357 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -61,7 +61,7 @@ class QctViewSet(CustomModelViewSet): """ data = request.data qct = Qct.get(data["material"], data["tag"]) - return Response(QctSerializer(instance=qct).data) + return Response(QctDetailSerializer(instance=qct).data) class QctTestItemViewSet(CustomModelViewSet): From 356310db3f83d72818a1415f74cd4fb6207758d8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 May 2025 12:57:11 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=E8=A7=A6=E5=8F=91=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E7=BB=9F=E8=AE=A1=E5=88=86=E6=9E=90=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E9=87=8Csleep=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 16 ++++------------ apps/qm/services.py | 6 ++---- apps/qm/views.py | 12 ++++-------- apps/wpm/services.py | 18 +++++++----------- apps/wpm/services_2.py | 16 ++++++++++++++++ 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index 081adc9b..93b36002 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -4,10 +4,9 @@ from apps.inm.models import (MIO, MIOItem, from rest_framework.exceptions import ParseError from apps.mtm.models import Material, Process from apps.utils.tools import ranstr -from apps.utils.thread import MyThread from apps.mtm.services_2 import cal_material_count from apps.wpm.models import WMaterial, BatchSt, BatchLog -from apps.wpm.services_2 import get_alldata_with_batch_and_store +from apps.wpm.services_2 import ana_batch_thread from apps.wpmw.models import Wpr from apps.qm.models import Ftest, Defect from django.db.models import Count, Q @@ -123,10 +122,7 @@ def do_out(item: MIOItem): Wpr.change_or_new(wpr=mioitemw.wpr, wm=wm, old_mb=mb) # 触发批次统计分析 - xbatches = list(set(xbatches)) - if xbatches: - for xbatch in xbatches: - MyThread(target=get_alldata_with_batch_and_store, args=(xbatch,)).start() + ana_batch_thread(xbatches) def do_in(item: MIOItem): @@ -257,9 +253,7 @@ def do_in(item: MIOItem): MaterialBatchA.objects.create(mb=mb, material=mia.material, batch=mia.batch, rate=mia.rate) # 批次统计分析 - xbatchs = list(set(xbatchs)) - for xbatch in xbatchs: - MyThread(target=get_alldata_with_batch_and_store, args=(xbatch,)).start() + ana_batch_thread(xbatchs) class InmService: @@ -442,9 +436,7 @@ class InmService: raise ParseError("不支持的操作") # 批次统计分析 - xbatchs = list(set(xbatchs)) - for xbatch in xbatchs: - MyThread(target=get_alldata_with_batch_and_store, args=(xbatch,)).start() + ana_batch_thread(xbatchs) def daoru_mb(path: str): """ diff --git a/apps/qm/services.py b/apps/qm/services.py index 3a390340..faab192d 100644 --- a/apps/qm/services.py +++ b/apps/qm/services.py @@ -5,8 +5,7 @@ from rest_framework.exceptions import ParseError from django.utils import timezone from apps.wf.models import Ticket from apps.qm.models import NotOkOption, Defect -from apps.utils.thread import MyThread -from apps.wpm.services_2 import get_alldata_with_batch_and_store +from apps.wpm.services_2 import ana_batch_thread def ftestwork_submit_validate(ins: FtestWork): wm:WMaterial = ins.wm @@ -149,5 +148,4 @@ def bind_ftestwork(ticket: Ticket, transition, new_ticket_data: dict): def ftestwork_audit_end(ticket: Ticket): ins = FtestWork.objects.get(id=ticket.ticket_data['t_id']) ftestwork_submit(ins, ticket.create_by) - if ins.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(ins.batch,)).start() \ No newline at end of file + ana_batch_thread(xbatchs=[ins.batch]) \ No newline at end of file diff --git a/apps/qm/views.py b/apps/qm/views.py index b65a8357..40428bd2 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -18,8 +18,7 @@ from apps.wpm.models import SfLog from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter, QctFilter, FtestFilter from django.db import transaction from apps.qm.services import ftestwork_submit -from apps.utils.thread import MyThread -from apps.wpm.services_2 import get_alldata_with_batch_and_store +from apps.wpm.services_2 import ana_batch_thread from apps.wf.models import State # Create your views here. @@ -287,8 +286,7 @@ class FtestWorkViewSet(CustomModelViewSet): raise ParseError('审批单已进行,无法修改') x = super().update(request, *args, **kwargs) # 触发批次统计分析 - if ins.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(ins.batch,)).start() + ana_batch_thread(xbatchs=[ins.batch]) return x def destroy(self, request, *args, **kwargs): @@ -299,15 +297,13 @@ class FtestWorkViewSet(CustomModelViewSet): raise ParseError('存在审批, 无法删除') x = super().destroy(request, *args, **kwargs) # 触发批次统计分析 - if ins.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(ins.batch,)).start() + ana_batch_thread(xbatchs=[ins.batch]) return x def perform_create(self, serializer): ins = serializer.save() # 触发批次统计分析 - if ins.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(ins.batch,)).start() + ana_batch_thread(xbatchs=[ins.batch]) @action(methods=['post'], detail=True, perms_map={'post': 'ftestwork.submit'}, serializer_class=Serializer) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 48df5540..9e13d04d 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -14,9 +14,8 @@ from apps.mtm.models import Mgroup, Shift, Material, Route, RoutePack, Team, Sru from .models import SfLog, WMaterial, Mlog, Mlogb, Mlogbw, Handover, Handoverb, Handoverbw, MlogbDefect, BatchLog, BatchSt from apps.mtm.services_2 import cal_material_count from apps.wf.models import Ticket -from apps.utils.thread import MyThread import logging -from apps.wpm.services_2 import get_alldata_with_batch_and_store +from apps.wpm.services_2 import ana_batch_thread from datetime import timedelta from apps.wpmw.models import Wpr, WprDefect from ..qm.models import Defect, Ftest @@ -379,8 +378,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): cal_material_count_from_mlog(mlog) # 触发批次统计分析 - if mlog.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(mlog.batch,)).start() + xbatches = list(Mlogb.objects.filter(mlog=mlog).values_list('batch', flat=True)) + ana_batch_thread(xbatches) def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): @@ -590,8 +589,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): BatchLog.clear(mlog=mlog) # 触发批次统计分析 - if mlog.batch: - MyThread(target=get_alldata_with_batch_and_store, args=(mlog.batch,)).start() + xbatches = list(Mlogb.objects.filter(mlog=mlog).values_list('batch', flat=True)) + ana_batch_thread(xbatches) def cal_mtask_progress_from_mlog(mlog): """ @@ -924,15 +923,12 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, handover.recive_user = user handover.save() - batches = list(set(batches)) - 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) + + ana_batch_thread(xbatchs=batches) def handover_revert(handover:Handover): diff --git a/apps/wpm/services_2.py b/apps/wpm/services_2.py index 6e7fedf9..284618ef 100644 --- a/apps/wpm/services_2.py +++ b/apps/wpm/services_2.py @@ -9,9 +9,25 @@ from django.conf import settings import json from apps.utils.tools import MyJSONEncoder import decimal +from apps.utils.thread import MyThread import logging +import time myLogger = logging.getLogger('log') +# 批次统计分析 + +def ana_batch_thread(xbatchs: list): + MyThread(target=ana_batch, args=(xbatchs,)).start() + +def ana_batch(xbatchs: list): + """ + 批次统计分析 + """ + time.sleep(3) + xbatchs = list(set(xbatchs)) + for xbatch in xbatchs: + get_alldata_with_batch_and_store(xbatch) + def get_alldata_with_batch_and_store(batch: str): """ 获取某个批次的整体生产数据并保存