diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index a57c6a45..e29bf174 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -98,6 +98,17 @@ class QuaStatSerializer(CustomModelSerializer): return attrs +class UpdateRatePassTSerializer(serializers.Serializer): + material_id = serializers.IntegerField(required=True) + testitem_id = serializers.IntegerField(required=True) + rate_pass_t = serializers.FloatField(required=True) + month_s = serializers.IntegerField(required=True) + + def validate_rate_pass_t(self, value): + if value < 0 or value > 100: + raise serializers.ValidationError("Rate pass must be between 0 and 100.") + return value + class QuaStatUpdateSerializer(CustomModelSerializer): belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) diff --git a/apps/qm/tasks.py b/apps/qm/tasks.py index a1d14b47..646e0062 100644 --- a/apps/qm/tasks.py +++ b/apps/qm/tasks.py @@ -157,7 +157,6 @@ ORDER BY mgroup.sort, mtma.sort, qmt.sort sql_q4 = f"""SELECT mtma."id" AS material, mtma."name" AS material_name, -qmq."rate_pass_t" as rate_g, qmt."id" AS testitem, qmt."name" AS testitem_name, CAST(SUM(num_test * val_avg) AS FLOAT)/NULLIF(SUM(num_test), 0) AS val_avg, @@ -175,7 +174,7 @@ and mgroup.id = '{mgroup.id}' and qmq.val_avg is not NULL and qmq.num_test is not NULL and qmq.num_ok is not NULL -GROUP BY mgroup."id", mtma."id", qmt."id", qmq."rate_pass_t", mgroup.sort, mtma.sort, qmt.sort +GROUP BY mgroup."id", mtma."id", qmt."id", mgroup.sort, mtma.sort, qmt.sort ORDER BY mgroup.sort, mtma.sort, qmt.sort """ res4 = query_all_dict(sql_q4) diff --git a/apps/qm/views.py b/apps/qm/views.py index b3e8d7b4..f8575a38 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -7,7 +7,7 @@ from apps.qm.models import QuaStat, NotOkOption, Ftest, Ptest, FtestWork from apps.qm.models import TestItem, Defect, Qct, QctTestItem, QctMat, QctDefect from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \ FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctTestItemSerializer, QctDefectSerializer, QctMatSerializer, \ - QctDetailSerializer + QctDetailSerializer, UpdateRatePassTSerializer from apps.qm.tasks import cal_quastat_sflog from rest_framework.response import Response from apps.utils.mixins import BulkUpdateModelMixin @@ -146,18 +146,34 @@ class QuaStatViewSet(ListModelMixin, BulkUpdateModelMixin, CustomGenericViewSet) # 根据物料ID和检测项目ID rate_pass_t @action(detail=False, methods=['post'], url_path='update_rate_pass_t', perms_map={'post': 'quastat.submit'}) def update_rate_pass_t(self, request, *args, **kwargs): - material_id = request.data.get("material_id") - testitem_id = request.data.get("testitem_id") - new_rate_pass_t = request.data.get("rate_pass_t") + # material_id = request.data.get("material_id") + # testitem_id = request.data.get("testitem_id") + # new_rate_pass_t = request.data.get("rate_pass_t") + # # update_start = datetime.datetime.strptime(request.data.get("update_start_time"), "%Y-%m-%d") + # # update_end = datetime.datetime.strptime(request.data.get("update_end_time"), "%Y-%m-%d") + # month_s = request.data.get("month_s") + serializer = UpdateRatePassTSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + material_id = serializer.validated_data.get("material_id") + testitem_id = serializer.validated_data.get("testitem_id") + new_rate_pass_t = serializer.validated_data.get("rate_pass_t") + month_s = serializer.validated_data.get("month_s") if not (material_id and testitem_id and new_rate_pass_t is not None): return Response( {"detail": "Missing required fields: material_id, testitem_id, rate_pass_t"}, status=400 ) - update_count = QuaStat.objects.filter(material_id=material_id, testitem_id=testitem_id).update(rate_pass_t=new_rate_pass_t) - sfLogIds= QuaStat.objects.filter(material_id=material_id, testitem_id=testitem_id).values_list('sflog', flat=True) - for sflogId in sfLogIds: - cal_quastat_sflog.delay(sflogId) + # 先根据查询物料查询 sflogids 然后再过滤 work_data ,返回在时间段内的sflogids,再更新quaStat + qua_data = QuaStat.objects.filter( + material_id=material_id, + testitem_id=testitem_id, + sflog__work_date__month=month_s, + + ) + sflog_ids = qua_data.values_list('sflog', flat=True).distinct() + update_count = qua_data.update(rate_pass_t=new_rate_pass_t) + for i in sflog_ids: + cal_quastat_sflog.delay(i) return Response({"rate_pass_t": new_rate_pass_t}, status=200)