diff --git a/apps/enm/urls.py b/apps/enm/urls.py index f5777809..6d12af13 100644 --- a/apps/enm/urls.py +++ b/apps/enm/urls.py @@ -1,7 +1,8 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.enm.views import (MpointViewSet, MpointStatViewSet, - EnStatViewSet, EnStat2ViewSet, XscriptViewSet, MpLogxAPIView) +from apps.enm.views import (MpointViewSet, MpointStatViewSet, + EnStatViewSet, EnStat2ViewSet, XscriptViewSet, MpLogxAPIView, + WengfuMpLogxAPIView, WengfuMpointListAPIView) API_BASE_URL = 'api/enm/' HTML_BASE_URL = 'dhtml/enm/' @@ -16,4 +17,6 @@ router.register('xscript', XscriptViewSet, basename='xscript') urlpatterns = [ path(API_BASE_URL, include(router.urls)), path(f'{API_BASE_URL}mplogx/', MpLogxAPIView.as_view(), name='mplogx_list'), + path(f'{API_BASE_URL}wengfu_mplogx/', WengfuMpLogxAPIView.as_view(), name='wengfu_mplogx'), + path(f'{API_BASE_URL}wengfu_mpoints/', WengfuMpointListAPIView.as_view(), name='wengfu_mpoints'), ] \ No newline at end of file diff --git a/apps/enm/views.py b/apps/enm/views.py index 11a74a1b..04542e74 100644 --- a/apps/enm/views.py +++ b/apps/enm/views.py @@ -265,6 +265,134 @@ class MpLogxAPIView(APIView): +class WengfuMpLogxAPIView(APIView): + perms_map = {"get": "*", "post": "*"} + + def _get_conn(self): + from apps.utils.sql import DbConnection + return DbConnection( + host='10.0.11.52', user='postgres', + password='zcDsj@2024', database='hfnf', dbtype='pg' + ) + + def get(self, request, *args, **kwargs): + mpoint_ids = request.query_params.get("mpoint_ids", None) + timex_gte = request.query_params.get("timex__gte", None) + timex_lte = request.query_params.get("timex__lte", None) + page = int(request.query_params.get("page", 1)) + page_size = int(request.query_params.get("page_size", 20)) + + conditions = [] + params = [] + + if mpoint_ids: + ids = [x.strip() for x in mpoint_ids.split(",") if x.strip()] + placeholders = ",".join(["%s"] * len(ids)) + conditions.append(f"m.mpoint_id IN ({placeholders})") + params.extend(ids) + if timex_gte: + conditions.append("m.timex >= %s") + params.append(timex_gte) + if timex_lte: + conditions.append("m.timex <= %s") + params.append(timex_lte) + + where = ("WHERE " + " AND ".join(conditions)) if conditions else "" + + with self._get_conn() as cur: + count_sql = f"""SELECT COUNT(*) FROM mplogx_wengfu m {where}""" + cur.execute(count_sql, params) + total = cur.fetchone()[0] + + data_sql = f""" + SELECT m.mpoint_id, n.point_name AS mpoint_name, m.timex, + m.val_float AS val, m.val_bool + FROM mplogx_wengfu m + LEFT JOIN cj_mpoint_name n ON n.mpoint_id = m.mpoint_id AND n.company = '瓮福' + {where} + ORDER BY m.timex DESC + LIMIT %s OFFSET %s + """ + cur.execute(data_sql, params + [page_size, (page - 1) * page_size]) + columns = [desc[0] for desc in cur.description] + results = [] + for row in cur.fetchall(): + d = dict(zip(columns, row)) + if d.get("timex"): + d["timex"] = d["timex"].strftime("%Y-%m-%d %H:%M:%S") + results.append(d) + + return Response({"count": total, "results": results}) + + def post(self, request, *args, **kwargs): + """导出或图表数据(不分页)""" + mpoint_ids = request.data.get("mpoint_ids", []) + timex_gte = request.data.get("timex__gte") + timex_lte = request.data.get("timex__lte") + + if not mpoint_ids or not timex_gte or not timex_lte: + raise ParseError("mpoint_ids, timex__gte, timex__lte are required") + + conditions = [] + params = [] + placeholders = ",".join(["%s"] * len(mpoint_ids)) + conditions.append(f"m.mpoint_id IN ({placeholders})") + params.extend(mpoint_ids) + conditions.append("m.timex >= %s") + params.append(timex_gte) + conditions.append("m.timex <= %s") + params.append(timex_lte) + + where = "WHERE " + " AND ".join(conditions) + + with self._get_conn() as cur: + sql = f""" + SELECT m.mpoint_id, n.point_name AS mpoint_name, m.timex, m.val_float AS val, m.val_bool + FROM mplogx_wengfu m + LEFT JOIN cj_mpoint_name n ON n.mpoint_id = m.mpoint_id AND n.company = '瓮福' + {where} + ORDER BY m.timex ASC + """ + cur.execute(sql, params) + columns = [desc[0] for desc in cur.description] + results = [] + for row in cur.fetchall(): + d = dict(zip(columns, row)) + if d.get("timex"): + d["timex"] = d["timex"].strftime("%Y-%m-%d %H:%M:%S") + results.append(d) + + return Response(results) + + +class WengfuMpointListAPIView(APIView): + """瓮福测点列表(供下拉选择)""" + perms_map = {"get": "*"} + + def get(self, request, *args, **kwargs): + keyword = request.query_params.get("keyword", "") + page = int(request.query_params.get("page", 1)) + page_size = int(request.query_params.get("page_size", 50)) + from apps.utils.sql import DbConnection + with DbConnection(host='10.0.11.52', user='postgres', + password='zcDsj@2024', database='hfnf', dbtype='pg') as cur: + conditions = ["company = '瓮福'"] + params = [] + if keyword: + conditions.append("(mpoint_id ILIKE %s OR point_name ILIKE %s)") + params.extend([f"%{keyword}%", f"%{keyword}%"]) + where = "WHERE " + " AND ".join(conditions) + cur.execute(f"SELECT COUNT(*) FROM cj_mpoint_name {where}", params) + total = cur.fetchone()[0] + cur.execute(f""" + SELECT mpoint_id, point_name FROM cj_mpoint_name + {where} ORDER BY mpoint_id LIMIT %s OFFSET %s + """, params + [page_size, (page - 1) * page_size]) + columns = [desc[0] for desc in cur.description] + results = [dict(zip(columns, row)) for row in cur.fetchall()] + return Response({"count": total, "results": results}) + + class MpLogxViewSet(CustomListModelMixin, CustomGenericViewSet): """ list: 测点采集数据