From 70c5baa56750f84c199c9ecc49cbf4ef53831db6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 31 Jul 2023 16:40:35 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E9=9B=86=E5=9B=A2=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/services.py | 0 server/apps/supervision/urls.py | 2 + server/apps/supervision/views2.py | 79 +++++++++++++++++++++++++++++ server/utils/sql.py | 20 ++++++++ 4 files changed, 101 insertions(+) create mode 100644 server/apps/supervision/services.py create mode 100644 server/apps/supervision/views2.py diff --git a/server/apps/supervision/services.py b/server/apps/supervision/services.py new file mode 100644 index 0000000..e69de29 diff --git a/server/apps/supervision/urls.py b/server/apps/supervision/urls.py index 82f5c96..00bb5bc 100644 --- a/server/apps/supervision/urls.py +++ b/server/apps/supervision/urls.py @@ -3,6 +3,7 @@ from django.urls import path, include from rest_framework import routers from .views import (ContentViewSet, TaskViewSet,RecordViewSet, TaskDeptViewSet, PogalViewSet, Task2ViewSet, Task2DoViewSet, PgoalDeptViewSet, RcViewSet, ComplaintViewSet, PtViewSet, RiskViewSet, OinspectViewSet) +from apps.supervision.views2 import AnalyseViewSet router = routers.DefaultRouter() router.register('content', ContentViewSet, basename="content") @@ -18,6 +19,7 @@ router.register('complaint', ComplaintViewSet, basename='complaint') router.register('pt', PtViewSet, basename='pt') router.register('risk', RiskViewSet, basename='risk') router.register('oinspect', OinspectViewSet, basename='oinspect') +router.register('analyse', AnalyseViewSet, basename='supervision_analyse') urlpatterns = [ path('', include(router.urls)) ] \ No newline at end of file diff --git a/server/apps/supervision/views2.py b/server/apps/supervision/views2.py new file mode 100644 index 0000000..5d7fd34 --- /dev/null +++ b/server/apps/supervision/views2.py @@ -0,0 +1,79 @@ +from rest_framework.viewsets import GenericViewSet +from rest_framework import serializers +from rest_framework.decorators import action +from rest_framework.response import Response +from utils.sql import query_all_dict + +class YearSerializer(serializers.Serializer): + year = serializers.IntegerField(label='年份') + +class AnalyseViewSet(GenericViewSet): + perms_map = {'post': '*'} + serializer_class = YearSerializer + + def is_valid(self, request): + data = request.data + sr = self.get_serializer(data=data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + return vdata + + @action(methods=['post'], detail=False) + def group_by_dept(self, request): + """ + 质量目标集团统计 + + 质量目标集团统计 + """ + vdata = self.is_valid(request) + sql_str = f"""select task2.year as 年份, +dept.name as 单位, +pgoal.pgoal_1 as 重大事故数基础值, +pdept1.goal_value_b as 重大事故数设定值, +SUM(task2do.num_acc) as 重大事故数, +pgoal.pgoal_2 as 报告证书合格率基础值, +pdept2.goal_value_b as 报告证书合格率设定值, +CAST(SUM(task2do.num_issue)-SUM(task2do.num_error) AS FLOAT)/NULLIF(SUM(task2do.num_issue), 0)*100 AS 报告证书合格率, +pgoal.pgoal_3 as 报告证书及时率基础值, +pdept3.goal_value_b as 报告证书及时率设定值, +CAST(SUM(task2do.num_expect)-SUM(task2do.num_overdue) AS FLOAT)/NULLIF(SUM(task2do.num_expect), 0)*100 AS 报告证书及时率, +pgoal.pgoal_4 as 能力验证满意率基础值, +pdept4.goal_value_b as 能力验证满意率设定值, +CAST(SUM(task2do.num_pt_10) AS FLOAT)/NULLIF(SUM(task2do.num_pt), 0)*100 AS 能力验证满意率, +pgoal.pgoal_5 as 客户投诉处理满意率基础值, +pdept5.goal_value_b as 客户投诉处理满意率设定值, +CAST(SUM(task2do.num_complaint_10) AS FLOAT)/NULLIF(SUM(task2do.num_complaint), 0)*100 AS 客户投诉处理满意率, +SUM(task2do.num_issue) as 已发报告数, +SUM(task2do.num_expect) as 应发报告数, +SUM(task2do.num_error) as 不准确报告数, +SUM(task2do.num_overdue) as 超期报告数, +SUM(task2do.num_complaint) as 客户投诉数, +SUM(task2do.num_complaint_10) as 客户投诉满意数, +SUM(task2do.num_pt) as 能力验证数, +SUM(task2do.num_pt_10) as 能力验证满意数, +SUM(task2do.num_risk) as 风险识别数, +SUM(task2do.num_oinspect) as 外部检查数 +from supervision_task2do task2do +LEFT JOIN supervision_task2 task2 on task2.id = task2do.task2_id +left join system_organization dept on dept.id = task2do.belong_dept_id +left join supervision_pgoaldept pdept1 on pdept1.goal_key = 'pgoal_1' and pdept1.year = {vdata['year']} and pdept1.belong_dept_id = task2do.belong_dept_id +left join supervision_pgoaldept pdept2 on pdept2.goal_key = 'pgoal_2' and pdept2.year = {vdata['year']} and pdept2.belong_dept_id = task2do.belong_dept_id +left join supervision_pgoaldept pdept3 on pdept3.goal_key = 'pgoal_3' and pdept3.year = {vdata['year']} and pdept3.belong_dept_id = task2do.belong_dept_id +left join supervision_pgoaldept pdept4 on pdept4.goal_key = 'pgoal_4' and pdept4.year = {vdata['year']} and pdept4.belong_dept_id = task2do.belong_dept_id +left join supervision_pgoaldept pdept5 on pdept5.goal_key = 'pgoal_5' and pdept5.year = {vdata['year']} and pdept5.belong_dept_id = task2do.belong_dept_id +left join supervision_pgoal pgoal on pgoal.year = {vdata['year']} +where task2.year = {vdata['year']} +GROUP BY task2.year, dept.id, +pgoal.pgoal_1, +pgoal.pgoal_2, +pgoal.pgoal_3, +pgoal.pgoal_4, +pgoal.pgoal_5, +pdept1.goal_value_b, +pdept2.goal_value_b, +pdept3.goal_value_b, +pdept4.goal_value_b, +pdept5.goal_value_b +ORDER BY dept.sort + """ + return Response(query_all_dict(sql_str)) \ No newline at end of file diff --git a/server/utils/sql.py b/server/utils/sql.py index af94efd..c378ad7 100644 --- a/server/utils/sql.py +++ b/server/utils/sql.py @@ -1,5 +1,25 @@ from django.db import connection +def execute_raw_sql(sql: str, params=None): + """执行原始sql并返回rows, columns数据 + + Args: + sql (str): 查询语句 + params (_type_, optional): 参数列表. Defaults to None. + """ + with connection.cursor() as cursor: + cursor.execute("SET statement_timeout TO %s;", [30000]) + if params: + cursor.execute(sql, params=params) + else: + cursor.execute(sql) + columns = [desc[0] for desc in cursor.description] + rows = cursor.fetchall() + return columns, rows + +def format_sqldata(columns, rows): + return [columns] + rows, [dict(zip(columns, row)) for row in rows] + def query_all_dict(sql, params=None): ''' 查询所有结果返回字典类型数据 From 39e98f4e69753c7de9fadf1de406bae37b9c1a99 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 1 Aug 2023 11:23:34 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20group=5Fby=5Fdept=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views2.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/apps/supervision/views2.py b/server/apps/supervision/views2.py index 5d7fd34..15a2294 100644 --- a/server/apps/supervision/views2.py +++ b/server/apps/supervision/views2.py @@ -6,6 +6,8 @@ from utils.sql import query_all_dict class YearSerializer(serializers.Serializer): year = serializers.IntegerField(label='年份') + dept_name = serializers.CharField(label='单位名称', default='') + dept_type_name = serializers.CharField(label='单位类型', default='2级公司') class AnalyseViewSet(GenericViewSet): perms_map = {'post': '*'} @@ -28,6 +30,7 @@ class AnalyseViewSet(GenericViewSet): vdata = self.is_valid(request) sql_str = f"""select task2.year as 年份, dept.name as 单位, +dict.name as 单位类型, pgoal.pgoal_1 as 重大事故数基础值, pdept1.goal_value_b as 重大事故数设定值, SUM(task2do.num_acc) as 重大事故数, @@ -61,9 +64,12 @@ left join supervision_pgoaldept pdept2 on pdept2.goal_key = 'pgoal_2' and pdept2 left join supervision_pgoaldept pdept3 on pdept3.goal_key = 'pgoal_3' and pdept3.year = {vdata['year']} and pdept3.belong_dept_id = task2do.belong_dept_id left join supervision_pgoaldept pdept4 on pdept4.goal_key = 'pgoal_4' and pdept4.year = {vdata['year']} and pdept4.belong_dept_id = task2do.belong_dept_id left join supervision_pgoaldept pdept5 on pdept5.goal_key = 'pgoal_5' and pdept5.year = {vdata['year']} and pdept5.belong_dept_id = task2do.belong_dept_id -left join supervision_pgoal pgoal on pgoal.year = {vdata['year']} +left join supervision_pgoal pgoal on pgoal.year = 2023 +left join system_dict dict on dict.id = dept.type_id where task2.year = {vdata['year']} -GROUP BY task2.year, dept.id, +and (dept.name = '{vdata['dept_name']}' or '{vdata['dept_name']}'='') +and (dic.name = '{vdata['dept_type_name']}' or '{vdata['dept_type_name']}'='') +GROUP BY task2.year, dept.id, dict.name, pgoal.pgoal_1, pgoal.pgoal_2, pgoal.pgoal_3, From 861aec80a36d79e85dcb3956b21b88f605c4b723 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 1 Aug 2023 11:26:07 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20group=5Fby=5Fdept=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/views2.py b/server/apps/supervision/views2.py index 15a2294..f86e7aa 100644 --- a/server/apps/supervision/views2.py +++ b/server/apps/supervision/views2.py @@ -68,7 +68,7 @@ left join supervision_pgoal pgoal on pgoal.year = 2023 left join system_dict dict on dict.id = dept.type_id where task2.year = {vdata['year']} and (dept.name = '{vdata['dept_name']}' or '{vdata['dept_name']}'='') -and (dic.name = '{vdata['dept_type_name']}' or '{vdata['dept_type_name']}'='') +and (dict.name = '{vdata['dept_type_name']}' or '{vdata['dept_type_name']}'='') GROUP BY task2.year, dept.id, dict.name, pgoal.pgoal_1, pgoal.pgoal_2, From ff7eefb39b91ba3ae824d834a4c9b6c42f235ec3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 1 Aug 2023 11:28:05 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20group=5Fby=5Fdept=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/apps/supervision/views2.py b/server/apps/supervision/views2.py index f86e7aa..0f239f1 100644 --- a/server/apps/supervision/views2.py +++ b/server/apps/supervision/views2.py @@ -6,8 +6,8 @@ from utils.sql import query_all_dict class YearSerializer(serializers.Serializer): year = serializers.IntegerField(label='年份') - dept_name = serializers.CharField(label='单位名称', default='') - dept_type_name = serializers.CharField(label='单位类型', default='2级公司') + dept_name = serializers.CharField(label='单位名称', default='', allow_null=True) + dept_type_name = serializers.CharField(label='单位类型', default='2级公司', allow_null=True) class AnalyseViewSet(GenericViewSet): perms_map = {'post': '*'} From e1d7167e1d1634dbe3877afb63aa9b01fff00d44 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 1 Aug 2023 11:32:43 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20group=5Fby=5Fdept=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/apps/supervision/views2.py b/server/apps/supervision/views2.py index 0f239f1..96e8225 100644 --- a/server/apps/supervision/views2.py +++ b/server/apps/supervision/views2.py @@ -6,8 +6,8 @@ from utils.sql import query_all_dict class YearSerializer(serializers.Serializer): year = serializers.IntegerField(label='年份') - dept_name = serializers.CharField(label='单位名称', default='', allow_null=True) - dept_type_name = serializers.CharField(label='单位类型', default='2级公司', allow_null=True) + dept_name = serializers.CharField(label='单位名称', default='', allow_blank=True) + dept_type_name = serializers.CharField(label='单位类型', default='2级公司', allow_blank=True) class AnalyseViewSet(GenericViewSet): perms_map = {'post': '*'}