ソースを参照

Merge branch 'develop' of http://120.55.44.4:10080/xujunjie/gt_client_pad into develop

ZhaoJun 1 年間 前
コミット
bfb36bddd5

+ 17 - 3
src/app.ts

@@ -6,15 +6,29 @@ import { RequestConfig } from '@umijs/max';
 import { message } from 'antd';
 import dayjs from 'dayjs';
 import 'dayjs/locale/zh-cn';
+import { queryCurrentV2 } from './services/user';
 
 dayjs.locale('zh-cn');
 
 // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
 // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
-export async function getInitialState(): Promise<{ name: string }> {
-  return { name: '@umijs/max' };
-}
+export async function getInitialState(): Promise<any> {
+  const { data: user } = await queryCurrentV2();
 
+  let permission = {};
+  user.Permissions?.forEach((item: any) => {
+    permission = {
+      ...permission,
+      ...item.Menus,
+    };
+  });
+  return {
+    user: {
+      ...user,
+      Permission: permission,
+    },
+  };
+}
 // axios配置
 export const request: RequestConfig = {
   errorConfig: {

+ 1 - 0
src/constants/index.ts

@@ -1 +1,2 @@
 export const DEFAULT_NAME = 'Umi Max';
+export const version = 'v1.0.47';

+ 16 - 4
src/pages/Center/index.js

@@ -1,20 +1,30 @@
-import { useNavigate, useParams } from '@umijs/max';
+import { version } from '@/constants';
+import { useModel, useNavigate, useParams } from '@umijs/max';
 import styles from './index.less';
 const Center = () => {
+  const { initialState } = useModel('@@initialState');
+  const user = initialState?.user || {};
   const navigate = useNavigate();
+
   const { projectId } = useParams();
 
   const handleGoSystem = () => {
     navigate(`/system-daily/${projectId}`);
   };
+  const handleSmartReport = () => {
+    navigate(`/smart-report/${projectId}`);
+  };
 
   return (
     <div className={styles.page}>
       <div className={styles.head}>
         <div className={styles.profile} />
         <div className={styles.textContent}>
-          <div className={styles.name}>张晓丽</div>
-          <div className={styles.photo}>手机号:13576970 系统版本:v1.0.47</div>
+          <div className={styles.name}>{user?.CName}</div>
+          <div className={styles.photo}>
+            手机号:{user?.Mobile}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统版本:
+            {version}
+          </div>
         </div>
       </div>
       <div className={styles.center}>
@@ -25,7 +35,9 @@ const Center = () => {
         <div className={styles.lineItem} onClick={handleGoSystem}>
           系统报告
         </div>
-        <div className={styles.lineItem}>智慧运用报告</div>
+        <div className={styles.lineItem} onClick={handleSmartReport}>
+          智慧运用报告
+        </div>
         <div className={styles.lineItem}>问题反馈备份</div>
         <div className={styles.lineItem}>个人设置</div>
       </div>

+ 3 - 2
src/pages/Home/index.js

@@ -251,7 +251,7 @@ const Scada = () => {
   );
 };
 
-// 能耗监测
+// 待办事项
 const Backlog = (props) => {
   // const { data } = props;
   const { projectId } = useParams();
@@ -280,7 +280,8 @@ const Backlog = (props) => {
               <div className={styles.createTime}>{item.time}</div>
               <div className={styles.item} onClick={() => handleClick(item)}>
                 <div className={styles.point} />
-                {item.title}
+                <div className={styles.titleText}>{item.title}</div>
+                <div className={styles.bottomCon}>{item.content}</div>
               </div>
             </>
           ))}

+ 16 - 3
src/pages/Home/index.less

@@ -21,7 +21,7 @@
   }
 
   .boxTitle {
-    padding-left: 68px;
+    padding-left: 46px;
     margin-bottom: 20px;
     font-size: 26px;
     font-weight: 400;
@@ -133,13 +133,17 @@
   .createTime {
   }
   .item {
-    margin: 4px 0 10px;
+    margin: 8px 0 20px;
     width: 100%;
-    height: 50px;
+    font-size: 22px;
+    // height: 50px;
     background-color: #346194;
     line-height: 50px;
   }
   .point {
+    position: relative;
+    float: left;
+    top: 20px;
     margin: 0 10px;
     display: inline-block;
     width: 10px;
@@ -147,6 +151,15 @@
     border-radius: 50%;
     background-color: yellow;
   }
+  .titleText {
+    margin: 0 20px;
+    border-bottom: 1px solid #eeeeee;
+  }
+  .bottomCon {
+    padding: 0 20px;
+    font-size: 20px;
+    word-wrap: break-word;
+  }
 }
 .count {
   background: #f69040;

+ 12 - 1
src/pages/SmartOps/HistoryRecord.js

@@ -100,6 +100,17 @@ const HistoryRecord = (props) => {
         return text;
       },
     },
+    {
+      title: '设备分析',
+      dataIndex: 'Num4',
+      key: 'Num4',
+      render: (text) => {
+        if (text === undefined || text === null) {
+          return '--';
+        }
+        return text;
+      },
+    },
     {
       title: '操作',
       render: (record) => (
@@ -108,7 +119,7 @@ const HistoryRecord = (props) => {
             navigate(
               `/smart-ops/${projectId}?time=${record.CTime}&idList=${
                 record.Num2
-              }&JWT-TOKEN=${GetTokenFromUrl()}`,
+              }&patrolId=${record.PatrolId}&JWT-TOKEN=${GetTokenFromUrl()}`,
             );
           }}
         >

+ 61 - 49
src/pages/SmartOps/components/DeviceAnalysis.js

@@ -1,26 +1,25 @@
 import TabsContent from '@/components/TabsContent';
+import ThresholdDetail from '@/components/ThresholdDetail';
 import { UnityAction } from '@/utils/utils';
 import { connect } from '@umijs/max';
 import { Spin, Table, Tabs } from 'antd';
 import { useEffect, useMemo, useState } from 'react';
 import styles from './DeviceAnalysis.less';
-import ThresholdBar from './ThresholdBar';
 const { TabPane } = Tabs;
 
 const DeviceAnalysis = (props) => {
   const Status = [
-    { name: '异常', type: '1', data: [] },
-    { name: '全部', type: '2', data: [] },
+    { name: '异常', type: '0', data: [] },
+    { name: '全部', type: '1 ', data: [] },
   ];
 
-  const { list = [], processList, loading } = props;
+  const { loading, autoReport } = props;
   const [selectedRowKeys, setSelectedRowKeys] = useState([]);
   const [tab, setTab] = useState('1');
 
   const columns = [
     {
       title: '设备名称',
-      width: '20%',
       render: (record) => (
         <div>
           {record.DeviceName}({record.DeviceCode})
@@ -30,32 +29,59 @@ const DeviceAnalysis = (props) => {
     {
       title: '巡检项',
       width: '14%',
-      dataIndex: 'ProcessSectionId',
-      render: (id) => {
-        return processList.find((item) => item.id == id)?.name;
-      },
+      dataIndex: 'TemplateItem',
+      render: (TemplateItem) => <div>{TemplateItem.Name}</div>,
     },
     {
       title: '设定值范围',
-      width: '14%',
-      render: (record) => {
-        let thresholds = record.fault_range.split(',');
-        return (
-          <div>
-            {record.fault_range && (
-              <ThresholdBar
-                current={record.fault_result}
-                thresholds={thresholds}
-              />
-            )}
-          </div>
-        );
-      },
+      width: '40%',
+      render: (record) => (
+        <ThresholdDetail
+          current={record.Value || 0}
+          data={record || {}}
+          // onClick={() => onClickThreshold(record)}
+        />
+      ),
     },
     {
       title: '状态',
-      width: '20%',
-      dataIndex: 'Reason',
+      width: '14%',
+      dataIndex: 'Status',
+      render: (Status) => {
+        switch (Status) {
+          case -1:
+          case 0:
+            return (
+              <div>
+                <i
+                  className={styles.iconStatus}
+                  style={{ background: '#12CEB3' }}
+                ></i>
+                正常
+              </div>
+            );
+          case 1:
+            return (
+              <div>
+                <i
+                  className={styles.iconStatus}
+                  style={{ background: '#FE5850' }}
+                ></i>
+                异常
+              </div>
+            );
+          case 2:
+            return (
+              <div>
+                <i
+                  className={styles.iconStatus}
+                  style={{ background: '#FFE26D' }}
+                ></i>
+                警告
+              </div>
+            );
+        }
+      },
     },
   ];
 
@@ -81,27 +107,15 @@ const DeviceAnalysis = (props) => {
   };
 
   const data = useMemo(() => {
-    return Status.map((item, idx) => {
-      const data = list?.filter((cur) => cur.grade_alarm == item.type);
-      return { ...item, data };
-    });
-  }, [list]);
-
-  const handleBtnClick = (plcs, title) => {
-    if (!plcs) return;
-    const msg = JSON.stringify(plcs); //[{ dataitemid: 'Raw_Water_Tank_Level', deviceid: '1436022785' }]
-    UnityAction.sendMsg(
-      'ProcessAnalysisAbout',
-      JSON.stringify({
-        title,
-        data: msg,
-      }),
-    );
-  };
+    return [
+      { name: '异常', type: '1', data: autoReport?.extendWarningData },
+      { name: '全部', type: '2', data: autoReport?.extendWarningAllData },
+    ];
+  }, [autoReport]);
 
   const onTabChange = (tab) => {
     setTab(tab);
-    UnityAction.sendMsg('ProcessAnalysisType', tab);
+    UnityAction.sendMsg('DevAnalysisType', tab);
   };
 
   const rowSelection = {
@@ -143,8 +157,7 @@ const DeviceAnalysis = (props) => {
                 <Table
                   dataSource={item.data}
                   columns={columns}
-                  // rowKey={'DeviceCode'}
-                  // rowSelection={rowSelection}
+                  rowKey="Id"
                   rowClassName={setRowClassName}
                   onRow={(record, index) => ({
                     onClick: () => onSelectRow(record, index),
@@ -161,8 +174,7 @@ const DeviceAnalysis = (props) => {
     </Spin>
   );
 };
-export default connect(({ smartOps, loading }) => ({
-  loading: loading.effects['smartOps/queryList'],
-  list: smartOps.list.list,
-  processList: smartOps.processList,
+export default connect(({ eqSelfInspection, loading }) => ({
+  loading: loading.effects['eqSelfInspection/getPatrolDataById'],
+  autoReport: eqSelfInspection.autoReport,
 }))(DeviceAnalysis);

+ 8 - 0
src/pages/SmartOps/components/DeviceAnalysis.less

@@ -1,3 +1,11 @@
 .tableSelect {
   background: rgba(145, 192, 238, 0.16) !important;
 }
+.iconStatus {
+  width: 20px;
+  height: 20px;
+  vertical-align: middle;
+  margin-right: 10px;
+  border-radius: 50%;
+  display: inline-block;
+}

+ 25 - 19
src/pages/SmartOps/index.js

@@ -31,29 +31,14 @@ const icon07 = require('@/assets/smartOps/icon07.png');
 let timer = '';
 
 function SmartOps(props) {
-  const { list, dispatch, loading } = props;
+  const { list, dispatch, loading, loadingDev, autoReport } = props;
 
   const navigate = useNavigate();
   const { projectId } = useParams();
   const [searchParams, setSearchParams] = useSearchParams();
   const time = searchParams.get('time');
   const idList = searchParams.get('idList');
-
-  // const [eTime, setETime] = useState(time ? time : dayjs().format('YYYY-MM-DD HH:mm:ss'));
-  // const [sTime, setSTime] = useState(
-  //   time
-  //     ? dayjs(time)
-  //         .subtract(10, 'minute')
-  //         .format('YYYY-MM-DD HH:mm:ss')
-  //     : s_time
-  // );
-  // if (ruleList?.indexOf(projectId * 1) != -1) {
-  //   isNewRole = true;
-  // }
-
-  // const showTime = useMemo(() => {
-  //   return dayjs(eTime).format('MM-DD HH:mm');
-  // }, [eTime]);
+  const patrolId = searchParams.get('patrolId');
 
   const [tableData, setTableData] = useState([]);
   const signalRef = useRef();
@@ -105,6 +90,23 @@ function SmartOps(props) {
         UnityAction.sendMsg('ProcessAnalysis', JSON.stringify(data?.list));
       },
     });
+
+    dispatch({
+      type: 'eqSelfInspection/getPatrolDataById',
+      payload: {
+        routeId: patrolId || reportData.PatrolId,
+      },
+      callback: (data) => {
+        console.log(data);
+        const message = data?.extendWarningAllData?.map((item) => {
+          return {
+            DeviceCode: item.DeviceCode,
+            grade_alarm: item.Status === 2 || item.Status === 1 ? 1 : 2,
+          };
+        });
+        UnityAction.sendMsg('DevAnalysis', JSON.stringify(message));
+      },
+    });
   };
 
   const handlerHistoryClick = () => {
@@ -331,7 +333,9 @@ function SmartOps(props) {
               ),
             },
             {
-              label: `设备分析(${loading ? '-' : AnalysisNumber})`,
+              label: `设备分析(${
+                loadingDev ? '-' : autoReport?.extendWarningData?.length
+              })`,
               key: '4',
               children: <DeviceAnalysis />,
             },
@@ -365,8 +369,10 @@ const convertObject2FormData = (params) => {
   return formData;
 };
 
-export default connect(({ smartOps, loading }) => ({
+export default connect(({ smartOps, eqSelfInspection, loading }) => ({
   list: smartOps.list,
   loading: loading.models.smartOps,
   processList: smartOps.processList,
+  autoReport: eqSelfInspection.autoReport,
+  loadingDev: loading.effects['eqSelfInspection/getPatrolDataById'],
 }))(SmartOps);

+ 70 - 14
src/pages/SystemDaily/index.js

@@ -1,22 +1,78 @@
 import PageContent from '@/components/PageContent';
+import { queryDailyWorkReport } from '@/services/user';
+import { useParams, useRequest } from '@umijs/max';
+import { Spin } from 'antd';
+import dayjs from 'dayjs';
 import styles from './index.less';
-const SystemDaily = () => {
+const SystemDaily = (props) => {
+  const { projectId } = useParams();
+
+  const { data = {}, loading } = useRequest(queryDailyWorkReport, {
+    defaultParams: [projectId],
+    onSuccess: (res) => {
+      const data = res.data;
+      const result = {
+        ...data,
+        task_percent:
+          data.push_task !== 0 ? data.push_complete_task / data.push_task : 0,
+        work_percent:
+          data.work_order_task !== 0
+            ? data.work_order_complete_task / data.work_order_task
+            : 0,
+      };
+      return result;
+    },
+  });
+  const {
+    automatic_task = 0,
+    push_optimize_task = 0,
+    self_inspection_task = 0,
+    self_inspection_normal_task = 0,
+    self_inspection_abnormal_task = 0,
+    push_task = 0,
+    task_percent = 0,
+    work_order_task = 0,
+    work_percent = 0,
+    user_name = '',
+    user_name_count = 0,
+  } = data;
   return (
     <PageContent>
-      <div className={styles.main}>
-        <div className={styles.titleContent}>
-          <div className={styles.title}>系统工作日报</div>
-          <div className={styles.time}>11月15日</div>
+      <Spin spinning={loading}>
+        <div className={styles.main}>
+          <div className={styles.titleContent}>
+            <div className={styles.title}>系统工作日报</div>
+            <div className={styles.time}>{dayjs().format('MM月DD日')}</div>
+          </div>
+          <div className={styles.content}>
+            <div className={styles.text}>
+              执行自控指令次数:{automatic_task}次
+            </div>
+            <div className={styles.text}>
+              推送优化建议:{push_optimize_task}条
+            </div>
+            <div className={styles.text}>
+              系统自检次数:{self_inspection_task}条
+              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常次数:
+              {self_inspection_normal_task}条
+              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常次数:
+              {self_inspection_abnormal_task}条
+            </div>
+            <div className={styles.text}>
+              推送任务:{push_task}条&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+              任务完成率:{task_percent}%
+            </div>
+            <div className={styles.text}>
+              工单数量:{work_order_task}条
+              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工单完成率:
+              {work_percent}%
+            </div>
+            <div className={styles.text}>
+              工单完成人员第一名:{user_name}完成{user_name_count}个工单
+            </div>
+          </div>
         </div>
-        <div className={styles.content}>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-          <div className={styles.text}>执行自控指令次数:12次</div>
-        </div>
-      </div>
+      </Spin>
     </PageContent>
   );
 };

+ 1 - 1
src/pages/SystemDaily/index.less

@@ -1,6 +1,6 @@
 .main {
   padding: 50px;
-  width: 80%;
+  width: 90%;
   margin: 60px auto;
   background-color: #ffffff;
   background: rgba(255, 255, 255, 0.78);

+ 8 - 0
src/services/user.js

@@ -3,3 +3,11 @@ import { request } from 'umi';
 export async function queryUserList(param) {
   return request(`/api/v1/user/project/${param.project_id}`);
 }
+export async function queryCurrentV2() {
+  return request('/api/v2/user/current-user', { method: 'GET' });
+}
+
+//系统工作日报
+export async function queryDailyWorkReport(project_id) {
+  return request(`/api/v1//mandate/daily-work-report?project_id=${project_id}`);
+}