Explorar el Código

Merge branch 'develop' of http://120.55.44.4:10080/xujunjie/gt_client_pad into develop
解决冲突
# Conflicts:
# src/pages/Center/index.js

Renxy hace 1 año
padre
commit
15e02e145d

+ 19 - 2
src/pages/Center/index.js

@@ -19,6 +19,9 @@ const Center = () => {
   const handleLogOutClick = () => {
     UnityAction.sendMsg('Logout');
   };
+  const toMyTask = (type) => {
+    navigate(`/task-manage/${projectId}?user_id=${user.ID}&tab=${type}`);
+  };
 
   return (
     <div className={styles.page}>
@@ -33,8 +36,22 @@ const Center = () => {
         </div>
       </div>
       <div className={styles.center}>
-        <div className={styles.item}>我的任务</div>
-        <div className={styles.item}>我的工单</div>
+        <div
+          className={styles.item}
+          onClick={() => {
+            toMyTask(1);
+          }}
+        >
+          我的任务
+        </div>
+        <div
+          className={styles.item}
+          onClick={() => {
+            toMyTask(2);
+          }}
+        >
+          我的工单
+        </div>
       </div>
       <div className={styles.bottomContent}>
         <div className={styles.lineItem} onClick={handleGoSystem}>

+ 24 - 3
src/pages/EqSelfInspection/index.js

@@ -1,5 +1,6 @@
 import PageContent from '@/components/PageContent';
 import PageTitle from '@/components/PageTitle';
+import { getMandateIDs } from '@/services/eqSelfInspection';
 import { GetTokenFromUrl, UnityAction } from '@/utils/utils';
 import { connect, history, useLocation, useParams } from '@umijs/max';
 import { Button, Form, Modal, Select, Spin, message } from 'antd';
@@ -73,6 +74,26 @@ const EqSelfInspection = (props) => {
     form.resetFields();
   };
 
+  const openTaskModal = async () => {
+    if (!autoReport.Id) {
+      return;
+    }
+    const mandateIDs = await getMandateIDs({
+      project_id: projectId,
+      id: autoReport.Id,
+    }).catch((err) => {
+      console.log(err);
+    });
+    if (mandateIDs?.length) {
+      UnityAction.sendMsg(
+        'OpenTaskModal',
+        `/task-manage/pop/${projectId}?mandate_id=${mandateIDs.join()}`,
+      );
+    } else {
+      message.info('未查询到相关任务');
+    }
+  };
+
   useEffect(() => {
     if (routeId) {
       dispatch({
@@ -163,8 +184,8 @@ const EqSelfInspection = (props) => {
         <Item name="设备自检" status={patrolStatus}></Item>
         <Item name="工艺自检" status={faultAnalysisStatus}></Item>
         <Item name="安全自检" status={secureStatus}>
-          {secureChildren?.map((item) => (
-            <WarningItem label={item.label} status={item.status} />
+          {secureChildren?.map((item, index) => (
+            <WarningItem key={index} label={item.label} status={item.status} />
           ))}
         </Item>
         <div className={styles.btnContainer}>
@@ -172,7 +193,7 @@ const EqSelfInspection = (props) => {
             className={styles.reportBtn}
             type="primary"
             onClick={() => {
-              // 打开任务弹窗
+              openTaskModal();
             }}
           >
             查看任务

+ 21 - 4
src/pages/Home/index.js

@@ -259,9 +259,20 @@ const Backlog = (props) => {
   const { data, loading } = useRequest(getPendingList, {
     defaultParams: [{ project_id: projectId }],
   });
-  console.log(data);
-  const handleClick = () => {
-    //TODO
+  const handleClick = (item) => {
+    if (item.type === 0) {
+      // task
+      UnityAction.sendMsg(
+        'OpenTaskModal',
+        `/task-manage/pop/${projectId}?mandate_id=${item.origin_id}`,
+      );
+    } else {
+      // order
+      UnityAction.sendMsg(
+        'OpenWorkOrderModal',
+        `/task-manage/pop/work-order/${projectId}?order_id=${item.origin_id}&order_type=${item.origin_type}`,
+      );
+    }
   };
   return (
     <Box
@@ -278,7 +289,13 @@ const Backlog = (props) => {
           {data?.map((item) => (
             <>
               <div className={styles.createTime}>{item.time}</div>
-              <div className={styles.item} onClick={() => handleClick(item)}>
+              <div
+                className={styles.item}
+                onClick={(e) => {
+                  e.stopPropagation();
+                  handleClick(item);
+                }}
+              >
                 <div className={styles.point} />
                 <div className={styles.titleText}>{item.title}</div>
                 <div className={styles.bottomCon}>{item.content}</div>

+ 9 - 2
src/pages/Smart/OptimizationTasks.js

@@ -6,6 +6,7 @@ import {
   queryMandateChildList,
   querySimulationProfit,
 } from '@/services/SmartOps';
+import { UnityAction } from '@/utils/utils';
 import { useParams, useRequest } from '@umijs/max';
 import { Table } from 'antd';
 import dayjs from 'dayjs';
@@ -70,7 +71,10 @@ const Produce = ({ projectId }) => {
     if (!mandateID) {
       return;
     }
-    console.log(mandateID);
+    UnityAction.sendMsg(
+      'OpenTaskModal',
+      `/task-manage/pop/${projectId}?mandate_id=${mandateID}`,
+    );
   };
 
   return (
@@ -168,7 +172,10 @@ const Cost = ({ projectId }) => {
     if (!mandateID) {
       return;
     }
-    console.log(mandateID);
+    UnityAction.sendMsg(
+      'OpenTaskModal',
+      `/task-manage/pop/${projectId}?mandate_id=${mandateID}`,
+    );
   };
 
   return (

+ 7 - 0
src/pages/TaskManage/Detail/TaskList/TaskList.tsx

@@ -33,6 +33,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
   const queryParams = new URLSearchParams(location.search);
   const project_id = Number(queryParams.get('project_id'));
   const mandateType = Number(queryParams.get('mandateType'));
+  const userID = queryParams.get('user_id');
 
   const navigate = useNavigate();
 
@@ -44,6 +45,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
     mandate_type: mandateType,
     pageSize: 20,
     currentPage: 1,
+    responsible_people: userID !== null ? Number(userID) : '',
   });
   const [pagination, setPagination] = useState({
     current: 1,
@@ -126,6 +128,11 @@ const TaskList: React.FC<IPropsType> = (props) => {
       pageSize: 20,
       currentPage: 1,
     };
+
+    if (userID !== null) {
+      params.responsible_people = Number(userID);
+    }
+
     for (let i = 0; i < value.length; i++) {
       if (value[i] !== null && topFiltersConfig[i] !== undefined) {
         params[topFiltersConfig[i].key] = value[i];

+ 69 - 31
src/pages/TaskManage/Detail/TaskOrder/TaskOrder.tsx

@@ -6,6 +6,7 @@ import { OrderStatus, OrderType } from '@/pages/TaskManage/constent';
 import {
   getCraftRecordList,
   getMaintainRecordList,
+  getReagentOrderDetail,
   getRepairRecordList,
   getWorkOrderFlow,
   queryReagentDetail,
@@ -23,7 +24,7 @@ import { PhotoProvider, PhotoView } from 'react-photo-view';
 
 interface IPropsType {
   userList: IUserType[];
-  dispatch: (args: { type: string; payload: object }) => {};
+  dispatch: (args: { type: string; payload: object }) => void;
 }
 
 interface IOrderInfo {
@@ -119,18 +120,19 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
         return;
       }
       const tempDetail: IOrderInfo = {
-        CreateTime: dayjs(temp.CreateTime).format('YYYY-MM-DD HH:mm'),
-        PlanTime: dayjs(temp.PlanTime).format('YYYY-MM-DD HH:mm'),
-        RepairTime:
-          (temp.RepairTime &&
-            dayjs(temp.RepairTime).format('YYYY-MM-DD HH:mm')) ||
-          '-',
+        CreateTime: temp.CreateTime
+          ? dayjs(temp.CreateTime).format('YYYY-MM-DD HH:mm')
+          : '-',
+        PlanTime: temp.PlanTime
+          ? dayjs(temp.PlanTime).format('YYYY-MM-DD HH:mm')
+          : '-',
+        RepairTime: temp.RepairTime
+          ? dayjs(temp.RepairTime).format('YYYY-MM-DD HH:mm')
+          : '-',
         Reason: temp.Reason,
         Repairman: userList.find((item) => item.ID === temp.Repairman) || '-',
         DispatchMan:
-          userList.find((item) => {
-            item.ID === temp.operator_id;
-          }) || '-',
+          userList.find((item) => item.ID === temp.operator_id) || '-',
         OrderStatus:
           OrderStatus.find((item) => item.value === temp.AcceptanceStatus) ||
           '-',
@@ -186,21 +188,45 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
               })
             : [],
       };
-      if (order_type === 5) {
-        queryReagentDetail({ id: temp.id })
-          .then((res) => {
-            if (res) {
-              setAdditionalInfo(res);
-            }
-          })
-          .catch((err) => console.log(err));
-      }
+
       setOrderInfo(tempDetail);
     },
   });
 
+  const { run: getDosingOrder } = useRequest(getReagentOrderDetail, {
+    manual: true,
+    formatResult: (result) => {
+      const temp = {
+        ...result,
+        CreateTime: result?.start_time?.Valid
+          ? dayjs(result?.start_time?.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        PlanTime: result?.plan_end_time?.Valid
+          ? dayjs(result.plan_end_time.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        RepairTime: result?.actual_end_time?.Valid
+          ? dayjs(result.actual_end_time.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        Reason: result.note,
+        Repairman: '-',
+        DispatchMan:
+          userList.find((user) => user.ID === result.operator_id) || '-',
+        OrderStatus:
+          OrderStatus.find((status) => status.value === result.status) || '-',
+      };
+      setOrderInfo(temp);
+      queryReagentDetail({ id: temp.id })
+        .then((res) => {
+          if (res) {
+            setAdditionalInfo(res);
+          }
+        })
+        .catch((err) => console.log(err));
+    },
+  });
+
   // 获取工单流程信息
-  const { run: getOrderFlow } = useRequest(getWorkOrderFlow, {
+  useRequest(getWorkOrderFlow, {
     // manual: true,
     defaultParams: [{ work_type: order_type, work_id: order_id }],
     formatResult(res: IStepInfo[]) {
@@ -220,7 +246,7 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
     switch (order_type) {
       // 工艺
       case 1:
-      case 5:
+
       case 6:
         getCraftDetail({ project_id, work_id: order_id });
         break;
@@ -232,6 +258,9 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
       case 3:
         getMaintainDetail({ project_id, id: order_id });
         break;
+      case 5:
+        getDosingOrder(order_id);
+        break;
     }
   }, []);
 
@@ -239,8 +268,8 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
     return (
       <PhotoProvider>
         <Col className={styles.fontS28} span={18}>
-          {orderInfo?.MandateImages?.map((photo) => (
-            <PhotoView src={photo.src}>
+          {orderInfo?.MandateImages?.map((photo, index) => (
+            <PhotoView key={index} src={photo.src}>
               <img
                 style={{
                   maxWidth: `${Math.floor(
@@ -312,14 +341,7 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
                 {orderInfo?.Reason}
               </Col>
             </Row>
-            {order_type === 5 && (
-              <Row className={styles.rowMarginTop}>
-                <Col className={styles.fontS28}>加药详情:</Col>
-                <Col className={styles.fontS28} span={18}>
-                  {`药剂名称:${additionalInfo?.name} 加药量:${additionalInfo?.dosage}升 浓度:${additionalInfo?.concentration}`}
-                </Col>
-              </Row>
-            )}
+
             {/* @ts-ignore */}
             {orderInfo?.MandateImages?.length > 0 && (
               <Row className={styles.rowMarginTop}>
@@ -358,6 +380,22 @@ const TaskOrder: React.FC<IPropsType> = (props) => {
             </div>
           </div>
         )}
+
+        {order_type === 5 && (
+          <div>
+            <SubTitle title="加药详情" />
+            <div style={{ padding: '15px' }}>
+              <Row>
+                <Col className={styles.fontS28}>加药详情:</Col>
+                <Col className={styles.fontS28} span={18}>
+                  {`药剂名称:${additionalInfo?.name || '-'} 加药量:${
+                    additionalInfo?.dosage || '-'
+                  }升 浓度:${additionalInfo?.concentration || '-'}`}
+                </Col>
+              </Row>
+            </div>
+          </div>
+        )}
         {/* @ts-ignore */}
         {stepInfo?.length > 0 && (
           <div>

+ 102 - 47
src/pages/TaskManage/Detail/WorkOrderList/WorkOrderList.js

@@ -3,7 +3,9 @@ import PageTitle from '@/components/PageTitle';
 import {
   getCraftRecordList,
   getMaintainRecordList,
+  getReagentOrderList,
   getRepairRecordList,
+  getUserWorkOrderList,
 } from '@/services/TaskManage';
 import { connect, useLocation, useNavigate, useRequest } from '@umijs/max';
 import { Button, Col, Empty, Row, Tabs } from 'antd';
@@ -20,6 +22,7 @@ const WorkOrderList = (props) => {
   const queryParams = new URLSearchParams(location.search);
   const project_id = Number(queryParams.get('project_id'));
   const order_type = Number(queryParams.get('order_type'));
+  const userID = queryParams.get('user_id');
 
   const navigate = useNavigate();
 
@@ -84,61 +87,113 @@ const WorkOrderList = (props) => {
     setWorkOrderList(tempNode);
   };
 
+  const formatCreateTime = (order) => {
+    if (order_type === 1 || order_type === 6 || order_type === 7) {
+      if (order?.start_time) {
+        return dayjs(order.start_time).format('YYYY-MM-DD HH:mm');
+      }
+    } else if (order_type === 2 || order_type === 3) {
+      if (order?.CreateTime) {
+        return dayjs(order.CreateTime).format('YYYY-MM-DD HH:mm');
+      }
+    } else if (order_type === 5) {
+      if (order?.start_time?.Valid) {
+        return dayjs(order.start_time.Time).format('YYYY-MM-DD HH:mm');
+      }
+    }
+    return '-';
+  };
+
   const { run: getWorkOrderList } = useRequest(
     (status) => {
-      switch (order_type) {
-        case 1:
-        case 4:
-        case 5:
-        case 6:
-        case 7:
-          return getCraftRecordList({
-            project_id,
-            status: status || 0,
-          });
-        case 2:
-          return getRepairRecordList({
-            project_id,
-            acceptanceStatus: status || 0,
-          });
-        case 3:
-          return getMaintainRecordList({ project_id, status: status || 0 });
+      if (userID !== null) {
+        return getUserWorkOrderList({
+          project_id,
+          work_type: order_type,
+          status: status || 0,
+          user_id: Number(userID),
+        });
+      } else {
+        switch (order_type) {
+          case 1:
+          case 6:
+          case 7:
+            return getCraftRecordList({
+              project_id,
+              status: status || 0,
+              work_type: order_type,
+            });
+          case 2:
+            return getRepairRecordList({
+              project_id,
+              acceptanceStatus: status || 0,
+            });
+          case 3:
+            return getMaintainRecordList({ project_id, status: status || 0 });
+          case 4:
+            return;
+          case 5:
+            return getReagentOrderList({ project_id, status: status || 0 });
+        }
       }
     },
     {
       throwOnError: true,
       formatResult: (result) => {
-        if (result?.data?.list) {
-          const temp = result.data.list.map((item) => {
-            return {
-              ...item,
-              CreateTime: dayjs(item.start_time).format('YYYY-MM-DD HH:mm'),
-              Repairman: userList.find((user) => {
-                let temp = -1;
-                if (order_type === 2) {
-                  temp = item.Repairman;
-                } else if (order_type === 3) {
-                  temp = item.MaintenancePerson;
-                } else {
-                  temp = item.checker_id;
-                }
-                return temp === user.ID;
-              }),
-              OrderStatus: OrderStatus.find((status) => {
-                let temp = -1;
-                if (order_type === 2) {
-                  temp = item.AcceptanceStatus;
-                } else if (order_type === 3) {
-                  temp = item.Status;
-                } else {
-                  temp = item.status;
-                }
-                return status.value === temp;
-              }),
-            };
-          });
-          renderTabPannal(temp);
+        if (userID !== null) {
+          if (result) {
+            const temp = result.map((item) => {
+              return {
+                ...item,
+                CreateTime: item.CreateTime
+                  ? dayjs(item.CreateTime).format('YYYY-MM-DD HH:mm')
+                  : '-',
+                Repairman: userList.find(
+                  (user) => item.Responsible === user.ID,
+                ),
+                OrderStatus: OrderStatus.find(
+                  (status) => status.value === item.Status,
+                ),
+              };
+            });
+            renderTabPannal(temp);
+          }
+        } else {
+          if (result?.data?.list) {
+            const temp = result.data.list.map((item) => {
+              return {
+                ...item,
+                CreateTime: formatCreateTime(item),
+                Repairman: userList.find((user) => {
+                  let temp = -1;
+                  if (order_type === 2) {
+                    temp = item.Repairman;
+                  } else if (order_type === 3) {
+                    temp = item.MaintenancePerson;
+                  } else if (order_type === 5) {
+                    temp = '-';
+                  } else {
+                    temp = item.checker_id;
+                  }
+                  return temp === user.ID;
+                }),
+                OrderStatus: OrderStatus.find((status) => {
+                  let temp = -1;
+                  if (order_type === 2) {
+                    temp = item.AcceptanceStatus;
+                  } else if (order_type === 3) {
+                    temp = item.Status;
+                  } else {
+                    temp = item.status;
+                  }
+                  return status.value === temp;
+                }),
+              };
+            });
+            renderTabPannal(temp);
+          }
         }
+
         if (result?.data?.pagination) {
           setPagination({
             pageSize: result.data.pagination.PageSize,

+ 54 - 2
src/pages/TaskManage/Popup/WorkOrderModal.js

@@ -1,8 +1,10 @@
 import {
   getCraftRecordList,
   getMaintainRecordList,
+  getReagentOrderDetail,
   getRepairRecordList,
   getWorkOrderFlow,
+  queryReagentDetail,
 } from '@/services/TaskManage';
 import { CloseOutlined } from '@ant-design/icons';
 import { connect, useLocation, useParams, useRequest } from '@umijs/max';
@@ -14,6 +16,7 @@ import SubTitle from '../components/SubTitle';
 import { OrderStatus, OrderType } from '../constent';
 import styles from './WorkOrderModal.less';
 
+import { UnityAction } from '@/utils/utils';
 import 'react-photo-view/dist/react-photo-view.css';
 
 const WorkOrderModal = (props) => {
@@ -149,8 +152,39 @@ const WorkOrderModal = (props) => {
       }
     },
   });
+  const { run: getDosingOrder } = useRequest(getReagentOrderDetail, {
+    manual: true,
+    formatResult: (result) => {
+      const temp = {
+        ...result,
+        CreateTime: result?.start_time?.Valid
+          ? dayjs(result?.start_time?.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        PlanTime: result?.plan_end_time?.Valid
+          ? dayjs(result.plan_end_time.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        RepairTime: result?.actual_end_time?.Valid
+          ? dayjs(result.actual_end_time.Time).format('YYYY-MM-DD HH:mm')
+          : '-',
+        Reason: result.note,
+        Repairman: '-',
+        DispatchMan:
+          userList.find((user) => user.ID === result.operator_id) || '-',
+        OrderStatus:
+          OrderStatus.find((status) => status.value === result.status) || '-',
+      };
+      setOrderInfo(temp);
+      queryReagentDetail({ id: temp.id })
+        .then((res) => {
+          if (res) {
+            setAdditionalInfo(res);
+          }
+        })
+        .catch((err) => console.log(err));
+    },
+  });
 
-  const { run: getOrderFlow } = useRequest(getWorkOrderFlow, {
+  useRequest(getWorkOrderFlow, {
     defaultParams: [{ work_type: order_type, work_id: order_id }],
     formatResult(res) {
       if (res && res?.length) {
@@ -161,6 +195,7 @@ const WorkOrderModal = (props) => {
 
   const closePage = () => {
     // ToDo: send message to unity to close this page
+    UnityAction.sendMsg('CloseWorkOrder');
   };
 
   const renderImg = () => {
@@ -189,7 +224,6 @@ const WorkOrderModal = (props) => {
     switch (order_type) {
       case 1:
       case 4:
-      case 5:
       case 6:
         getCraftDetail({ project_id: projectID, work_id: order_id });
         break;
@@ -199,6 +233,9 @@ const WorkOrderModal = (props) => {
       case 3:
         getMaintainDetail({ project_id: projectID, id: order_id });
         break;
+      case 5:
+        getDosingOrder(order_id);
+        break;
       default:
         break;
     }
@@ -301,6 +338,21 @@ const WorkOrderModal = (props) => {
             </div>
           </div>
         )}
+        {order_type === 5 && (
+          <div>
+            <SubTitle title="加药详情" titleFontSize={24} />
+            <div style={{ padding: '15px' }}>
+              <Row>
+                <Col className={styles.fontS24}>加药详情:</Col>
+                <Col className={styles.fontS24} span={18}>
+                  {`药剂名称:${additionalInfo?.name || '-'} 加药量:${
+                    additionalInfo?.dosage || '-'
+                  }升 浓度:${additionalInfo?.concentration || '-'}`}
+                </Col>
+              </Row>
+            </div>
+          </div>
+        )}
         {stepInfo.length > 0 && (
           <div>
             <SubTitle title="工单流程" titleFontSize={24} />

+ 1 - 1
src/pages/TaskManage/Popup/WorkOrderModal.less

@@ -1,5 +1,5 @@
 .modalContainer {
-  padding: 0 30px;
+  padding: 0 30px 30px 30px;
 }
 
 .closeModalBtn {

+ 57 - 1
src/pages/TaskManage/Popup/index.js

@@ -1,5 +1,11 @@
+import {
+  dispatchOrder,
+  ignoreTaskRequest,
+  setTaskAutomation,
+} from '@/services/TaskManage';
+import { UnityAction } from '@/utils/utils';
 import { CloseOutlined } from '@ant-design/icons';
-import { connect, useLocation, useParams } from '@umijs/max';
+import { connect, useLocation, useParams, useRequest } from '@umijs/max';
 import { Button, Tabs } from 'antd';
 import { useEffect, useState } from 'react';
 import MandateDetail from '../components/MandateDetail';
@@ -21,12 +27,56 @@ const TaskModal = (props) => {
   const [tabItems, setTabItems] = useState([]);
   const [activeKey, setActiveKey] = useState();
 
+  const { run: runIgnore } = useRequest(ignoreTaskRequest, {
+    manual: true,
+  });
+
+  const { run: runDispatch } = useRequest(dispatchOrder, {
+    manual: true,
+  });
+
+  const { run: runAutomate } = useRequest(setTaskAutomation, {
+    manual: true,
+  });
+
   const onTabChange = (key) => {
     setActiveKey(String(key));
   };
 
   const closePage = () => {
     // send message to unity close this modal page
+    UnityAction.sendMsg('CloseTask');
+  };
+  // 忽略
+  const onIgnoreTaskConfirm = async (mandateID, reason) => {
+    const params = {
+      Id: mandateID,
+      Status: 4,
+      note: reason,
+    };
+    const result = await runIgnore(params);
+    if (result) {
+      return true;
+    }
+  };
+  // 派单
+  const onDispatchTaskConfirm = async (params) => {
+    const result = await runDispatch(params);
+    if (result) {
+      return true;
+    }
+  };
+  // 自动处理
+  const onAutoHandleTaskConfirm = async (pw, mandate) => {
+    console.log(mandate);
+    const params = {
+      mandate_id: mandate.Id,
+      pw,
+    };
+    const result = runAutomate(params, mandate);
+    if (result) {
+      return true;
+    }
   };
 
   useEffect(() => {
@@ -44,6 +94,9 @@ const TaskModal = (props) => {
                   mandateID={item}
                   userList={userList}
                   projectID={projectID}
+                  ignoreTask={onIgnoreTaskConfirm}
+                  dispatchTask={onDispatchTaskConfirm}
+                  autoHandleTask={onAutoHandleTaskConfirm}
                 />
               ),
             };
@@ -86,6 +139,9 @@ const TaskModal = (props) => {
             mandateID={mandateIDs}
             userList={userList}
             projectID={projectID}
+            ignoreTask={onIgnoreTaskConfirm}
+            dispatchTask={onDispatchTaskConfirm}
+            autoHandleTask={onAutoHandleTaskConfirm}
           />
         </>
       )}

+ 5 - 39
src/pages/TaskManage/Popup/index.less

@@ -1,5 +1,5 @@
 .modalContainer {
-  padding: 0 30px;
+  padding: 0 30px 30px 30px;
 }
 
 .closeModalBtn {
@@ -18,46 +18,12 @@
   padding: 10px 0;
 }
 
-.footerConstainer {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  .footerBtn {
-    height: 50px;
-    width: 125px;
-    font-size: 20px;
-    border: 0;
-    color: #5697e4;
-    background-color: #e5effa;
-  }
+.fontS20 {
+  font-size: 20px;
 }
 
-.footerConstainer > * {
-  margin-left: 10px;
-}
-
-.relatedOrder {
-  margin-bottom: 20px;
-  background-color: #e5effa;
-  border-radius: 8px;
-  display: flex;
-  align-items: center;
-  padding: 15px;
-  .leftInfo {
-    width: 80%;
-  }
-  .leftInfo > * {
-    padding: 5px;
-  }
-  .rightButton {
-    flex: auto;
-    color: #5697e4;
-    font-size: 24px;
-    text-align: center;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-  }
+.fontS22 {
+  font-size: 22px;
 }
 
 .fontS24 {

+ 266 - 40
src/pages/TaskManage/components/MandateDetail.js

@@ -1,9 +1,12 @@
 import { queryMandate } from '@/services/SmartOps';
-import { useRequest } from '@umijs/max';
+import { UnityAction } from '@/utils/utils';
+import { connect, useRequest } from '@umijs/max';
 import {
   Button,
+  Checkbox,
   Col,
   ConfigProvider,
+  DatePicker,
   Divider,
   Form,
   Input,
@@ -15,7 +18,6 @@ import {
 } from 'antd';
 import dayjs from 'dayjs';
 import { useEffect, useState } from 'react';
-import styles from '../Popup/index.less';
 import {
   MandateClass,
   MandateStatus,
@@ -24,17 +26,38 @@ import {
   OrderType,
   ignoreReason,
 } from '../constent';
+import styles from './MandateDetail.less';
 
 import zhCN from 'antd/es/locale/zh_CN';
 
 const MandateDetail = (props) => {
-  const { projectID, mandateID, userList } = props;
+  const {
+    projectID,
+    mandateID,
+    userList,
+    ignoreTask,
+    dispatchTask,
+    autoHandleTask,
+    dispatch,
+  } = props;
+
+  useEffect(() => {
+    if (userList.length === 0) {
+      dispatch({
+        type: 'taskUser/fetchUserList',
+        payload: { project_id: projectID },
+      });
+    }
+  }, []);
+
   const [mandateDetail, setMandateDetail] = useState();
   const [mandateChild, setMandateChild] = useState([]);
   const [handledWorkOrder, setHandledWorkOrder] = useState([]);
 
   const [ignoreModalOpen, setIgnoreModalOpen] = useState(false);
   const [autoHandleModalOpen, setAutoHandleModalOpen] = useState(false);
+  const [mandateSelectModalOpen, setMandateSelectModalOpen] = useState(false);
+  const [selectedTask, setSelectedTask] = useState([]);
   const [dispatchModalOpen, setDispatchModalOpen] = useState(false);
 
   const columns = [
@@ -86,40 +109,84 @@ const MandateDetail = (props) => {
     },
   });
 
-  const onIgnoreClick = () => {
-    setIgnoreModalOpen(true);
-  };
-
-  const onDispatchClick = () => {
-    setDispatchModalOpen(true);
+  // 打开指定弹窗
+  const openSpecifiedModal = (type) => {
+    switch (type) {
+      case 'ignore':
+        setIgnoreModalOpen(true);
+        break;
+      case 'manual':
+        console.log('manual');
+        break;
+      case 'auto':
+        setAutoHandleModalOpen(true);
+        break;
+      case 'dispatch':
+        setMandateSelectModalOpen(true);
+        break;
+    }
   };
 
-  const onAutoHandleClick = () => {
-    setAutoHandleModalOpen(true);
+  // 忽略
+  const onIgnoreConfirm = async (reason) => {
+    const result = await ignoreTask(mandateID, reason);
+    if (result) {
+      setIgnoreModalOpen(false);
+      getMandateInfo({ mandate_id: mandateID });
+    }
   };
 
-  const onManualHandleClick = () => {
-    console.log('manual handle click');
+  const onAutoHandleConfirm = async (pw) => {
+    const result = await autoHandleTask(pw, mandateDetail);
+    if (result) {
+      setAutoHandleModalOpen(false);
+      getMandateInfo({ mandate_id: mandateID });
+    }
   };
 
-  const onIgnoreConfirm = (text) => {
-    console.log(text);
-    // 调用ignore
-    setIgnoreModalOpen(false);
+  const onManualHandleConfirm = () => {
+    console.log('manual handle Confirm');
   };
 
-  const onAutoHandleConfirm = (text) => {
-    console.log(text);
-    setAutoHandleModalOpen(false);
+  const onMandateSelected = (records) => {
+    // 打开派单Form弹窗将选中的任务进行派遣
+    if (records?.length === 0) {
+      message.warning('请先选择要派遣的任务');
+      return;
+    }
+    setSelectedTask(records);
+    setDispatchModalOpen(true);
   };
 
-  const onManualHandleConfirm = () => {
-    console.log('manual handle Confirm');
+  const onDispatchConfirm = async (value) => {
+    const params = {
+      ...value,
+      m_id: Number(mandateID),
+      mc_id: selectedTask.join(),
+      plan_end_time: dayjs(value.plan_end_time).format('YYYY-MM-DD HH:mm:ss'),
+    };
+    if (params.type === 5) {
+      if (params.mc_id.split(',').length > 1) {
+        message.warning('加药工单不可批量派遣');
+        return;
+      }
+      params.note = `${
+        mandateChild.find((mandate) => mandate.Id === Number(params.mc_id))
+          ?.Content
+      } ${params?.note || ''}`;
+    }
+    const result = await dispatchTask(params);
+    if (result) {
+      setDispatchModalOpen(false);
+      getMandateInfo({ mandate_id: mandateID });
+    }
   };
 
-  const onDispatchConfirm = () => {
-    console.log('ignore Confirm');
-    setDispatchModalOpen(false);
+  const openWorkOrderModal = (record) => {
+    UnityAction.sendMsg(
+      'OpenWorkOrderModal',
+      `/task-manage/pop/work-order/${projectID}?order_id=${record.Id}&order_type=${record.RecordType.value}`,
+    );
   };
 
   useEffect(() => {
@@ -146,7 +213,7 @@ const MandateDetail = (props) => {
             任务时间:{mandateDetail?.CreateTime || '-'}
           </Col>
           <Col className={styles.fontS24}>
-            任务类别:{mandateDetail?.MandateClass.label || '-'}
+            任务类别:{mandateDetail?.MandateClass?.label || '-'}
           </Col>
         </Row>
         <Row>
@@ -185,7 +252,12 @@ const MandateDetail = (props) => {
               </Row>
             </div>
             <Divider type="vertical" style={{ height: '40px' }} />
-            <div className={styles.rightButton}>查看工单</div>
+            <div
+              className={styles.rightButton}
+              onClick={() => openWorkOrderModal(item)}
+            >
+              查看工单
+            </div>
           </div>
         );
       })}
@@ -195,33 +267,42 @@ const MandateDetail = (props) => {
           <Button
             className={styles.footerBtn}
             shape="round"
-            onClick={onIgnoreClick}
+            onClick={() => {
+              openSpecifiedModal('ignore');
+            }}
           >
             忽略
           </Button>
           <Button
             className={styles.footerBtn}
             shape="round"
-            onClick={onManualHandleClick}
+            onClick={() => {
+              openSpecifiedModal('manual');
+            }}
           >
             手动处理
           </Button>
           <Button
             className={styles.footerBtn}
             shape="round"
-            onClick={onAutoHandleClick}
+            onClick={() => {
+              openSpecifiedModal('auto');
+            }}
           >
             自动处理
           </Button>
           <Button
             className={styles.footerBtn}
             shape="round"
-            onClick={onDispatchClick}
+            onClick={() => {
+              openSpecifiedModal('dispatch');
+            }}
           >
             派单
           </Button>
         </div>
       )}
+      {/* 弹窗 */}
       <ConfigProvider locale={zhCN}>
         <IgnoreTaskModal
           open={ignoreModalOpen}
@@ -233,17 +314,32 @@ const MandateDetail = (props) => {
           onCancel={() => setAutoHandleModalOpen(false)}
           onOk={onAutoHandleConfirm}
         />
-        <DispatchModa
+        <MandateSelectModal
+          open={mandateSelectModalOpen}
+          onCancel={() => setMandateSelectModalOpen(false)}
+          selectedTask={selectedTask}
+          setSelectedTask={setSelectedTask}
+          onOk={onMandateSelected}
+          list={mandateChild}
+        />
+        <DispatchTaskModal
           open={dispatchModalOpen}
-          onCancel={() => setDispatchModalOpen(false)}
-          onOk={onDispatchConfirm}
+          userList={userList}
+          onCancel={() => {
+            setDispatchModalOpen(false);
+          }}
+          onOK={onDispatchConfirm}
         />
       </ConfigProvider>
     </div>
   );
 };
 
-export default MandateDetail;
+export default connect(({ taskUser }) => {
+  return {
+    userList: taskUser.userList,
+  };
+})(MandateDetail);
 
 const IgnoreTaskModal = (params) => {
   const { open, onCancel, onOk } = params;
@@ -313,7 +409,7 @@ const IgnoreTaskModal = (params) => {
 const AutoHandleModal = (props) => {
   const { open, onCancel, onOk } = props;
 
-  const [automation, setAutomation] = useState('');
+  const [automation, setAutomation] = useState();
 
   const confirmAutoHandle = () => {
     if (automation.length) {
@@ -336,6 +432,8 @@ const AutoHandleModal = (props) => {
           <Form.Item label="口令:">
             {
               <Input
+                autoFocus
+                style={{ width: '100%' }}
                 placeholder="请输入口令"
                 onChange={(e) => {
                   setAutomation(e.target.value);
@@ -349,11 +447,139 @@ const AutoHandleModal = (props) => {
   );
 };
 
-const DispatchModa = (props) => {
-  const { open, onCancel } = props;
+const MandateSelectModal = (props) => {
+  const { open, onCancel, list, onOk, selectedTask, setSelectedTask } = props;
+
+  const [checkOptions, setCheckOptions] = useState([]);
+
+  useEffect(() => {
+    setCheckOptions(
+      list.map((mandate, index) => {
+        return {
+          label: (
+            <Row className={styles.taskCheckItem}>
+              <span
+                style={{
+                  textDecoration: `${
+                    mandate.Status === 0 ? '' : 'line-through'
+                  }`,
+                }}
+              >
+                {`${index + 1}. ${mandate.Title}为${mandate.Content}`}
+              </span>
+            </Row>
+          ),
+          value: mandate.Id,
+          disabled: mandate.Status !== 0,
+        };
+      }),
+    );
+  }, [list]);
+
+  const onDispatchClick = () => {
+    onOk(selectedTask);
+  };
+
+  const handleCheckChange = (checkedValue) => {
+    setSelectedTask(checkedValue);
+  };
+
   return (
-    <Modal title="工单派遣" open={open} onCancel={onCancel}>
-      派单
+    <Modal
+      title={<span className={styles.fontS24}>选择任务</span>}
+      open={open}
+      onCancel={onCancel}
+      width={'95%'}
+      destroyOnClose
+      footer={[
+        <Button key="back" onClick={onCancel}>
+          取消
+        </Button>,
+        <Button key="dispatch" type="primary" onClick={onDispatchClick}>
+          派单
+        </Button>,
+      ]}
+    >
+      <Checkbox.Group
+        className={styles.taskCheckBox}
+        options={checkOptions}
+        onChange={handleCheckChange}
+      />
+    </Modal>
+  );
+};
+
+const DispatchTaskModal = (props) => {
+  const { open, onCancel, onOK, userList } = props;
+
+  const [form] = Form.useForm();
+
+  useEffect(() => {
+    if (!open) {
+      form.resetFields();
+    }
+  }, [open]);
+
+  const handleDispatchConfirm = async () => {
+    const value = await form.validateFields().catch((err) =>
+      err.errorFields.forEach((item) => {
+        message.error(item.errors);
+      }),
+    );
+    if (!value) {
+      return;
+    }
+    onOK(value);
+  };
+
+  return (
+    <Modal
+      title={<span className={styles.fontS24}>派遣任务</span>}
+      onCancel={onCancel}
+      open={open}
+      destroyOnClose
+      style={{ padding: '20px 0' }}
+      onOk={handleDispatchConfirm}
+    >
+      <Form
+        form={form}
+        layout="horizontal"
+        labelCol={{ span: 6 }}
+        wrapperCol={{ span: 18 }}
+      >
+        <Form.Item
+          label="工单类型"
+          name="type"
+          rules={[{ required: true, message: '请选择工单类型' }]}
+        >
+          <Select options={OrderType} placeholder="请选择工单类型" />
+        </Form.Item>
+        <Form.Item
+          label="操作人"
+          name="operator_id"
+          rules={[{ required: true, message: '请选择操作人' }]}
+        >
+          <Select
+            options={userList.map((item) => {
+              return {
+                label: item.CName,
+                value: item.ID,
+              };
+            })}
+            placeholder="请选择操作人"
+          />
+        </Form.Item>
+        <Form.Item
+          label="计划完成时间"
+          name="plan_end_time"
+          rules={[{ required: true, message: '请选择完成时间' }]}
+        >
+          <DatePicker style={{ width: '100%' }} placeholder="请选择完成时间" />
+        </Form.Item>
+        <Form.Item label="备注" name="note">
+          <Input.TextArea placeholder="备注" />
+        </Form.Item>
+      </Form>
     </Modal>
   );
 };

+ 82 - 0
src/pages/TaskManage/components/MandateDetail.less

@@ -0,0 +1,82 @@
+.modalContainer {
+  padding: 0 30px;
+}
+
+.closeModalBtn {
+  position: absolute;
+  top: 15px;
+  right: 20px;
+}
+
+.mandate > * {
+  margin-top: 15px;
+}
+
+.modalTitle {
+  font-size: 28px;
+  font-weight: 600;
+  padding: 10px 0;
+}
+
+.footerConstainer {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-end;
+  .footerBtn {
+    height: 50px;
+    width: 125px;
+    font-size: 20px;
+    border: 0;
+    color: #5697e4;
+    background-color: #e5effa;
+  }
+}
+
+.footerConstainer > * {
+  margin-left: 10px;
+}
+
+.relatedOrder {
+  margin-bottom: 20px;
+  background-color: #e5effa;
+  border-radius: 8px;
+  display: flex;
+  align-items: center;
+  padding: 15px;
+  .leftInfo {
+    width: 80%;
+  }
+  .leftInfo > * {
+    padding: 5px;
+  }
+  .rightButton {
+    flex: auto;
+    color: #5697e4;
+    font-size: 24px;
+    text-align: center;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+}
+
+.taskCheckBox {
+  padding: 10px;
+}
+
+.taskCheckItem {
+  font-size: 20px;
+  padding: 10px;
+}
+
+.fontS20 {
+  font-size: 20px;
+}
+
+.fontS22 {
+  font-size: 22px;
+}
+
+.fontS24 {
+  font-size: 24px;
+}

+ 22 - 7
src/pages/TaskManage/index.tsx

@@ -3,7 +3,7 @@ import TabsContent from '@/components/TabsContent';
 import styles from '@/pages/TaskManage/index.less';
 import { getMandateList } from '@/services/TaskManage';
 import { RightOutlined } from '@ant-design/icons';
-import { useParams } from '@umijs/max';
+import { useLocation, useParams } from '@umijs/max';
 import { List, Spin } from 'antd';
 import { BaseOptionType } from 'rc-select/es/Select';
 import { useEffect, useState } from 'react';
@@ -13,11 +13,17 @@ import { MandateType, OrderType } from './constent';
 const TaskManage = () => {
   const { projectID } = useParams();
   const project_id = Number(projectID === '' ? '0' : projectID);
+
+  const location = useLocation();
+  const queryParams = new URLSearchParams(location.search);
+  const userID = queryParams.get('user_id');
+  const specifiedTab = queryParams.get('tab');
+
   const navigate = useNavigate();
 
   const [mandateCount, setMandateCount] = useState<number[]>([0, 0, 0]);
   const [loading, setLoading] = useState(false);
-  const [tab, setTab] = useState(localStorage.taskTab || '1');
+  const [tab, setTab] = useState(specifiedTab || localStorage.taskTab || '1');
 
   useEffect(() => {
     const requests = [];
@@ -28,6 +34,7 @@ const TaskManage = () => {
           pageSize: 1,
           currentPage: 1,
           mandate_type: i + 1,
+          responsible_people: userID !== null ? Number(userID) : '',
         }),
       );
     }
@@ -52,11 +59,17 @@ const TaskManage = () => {
   }, []);
 
   const goTaskList = (item: number) => {
-    navigate(`/task-manage/list?project_id=${project_id}&mandateType=${item}`);
+    navigate(
+      `/task-manage/list?project_id=${project_id}&mandateType=${item}${
+        userID !== null ? '&user_id=' + userID : ''
+      }`,
+    );
   };
   const goWorkOrderList = (item: number) => {
     navigate(
-      `/task-manage/work-order/list?project_id=${project_id}&order_type=${item}`,
+      `/task-manage/work-order/list?project_id=${project_id}&order_type=${item}${
+        userID !== null ? '&user_id=' + userID : ''
+      }`,
     );
   };
 
@@ -71,16 +84,18 @@ const TaskManage = () => {
         <List.Item.Meta
           title={<span className={styles.fontS28}>{item.label}</span>}
         />
+
         <div className={styles.itemCount}>
           <div className={styles.countNumber}>{mandateCount[index]}</div>
           <div className={styles.fontS22}>任务数量</div>
         </div>
+
         <RightOutlined />
       </List.Item>
     );
   };
 
-  const makeWorkOrderList = (item: BaseOptionType, index: number) => {
+  const makeWorkOrderList = (item: BaseOptionType) => {
     return (
       <List.Item
         className={styles.listItem}
@@ -112,7 +127,7 @@ const TaskManage = () => {
         onChange={onTabChange}
         items={[
           {
-            label: `任务管理`,
+            label: `${userID === null ? '任务管理' : '我的任务'}`,
             key: '1',
             children: (
               <Spin spinning={loading}>
@@ -128,7 +143,7 @@ const TaskManage = () => {
             ),
           },
           {
-            label: `工单管理`,
+            label: `${userID === null ? '工单管理' : '我的工单'}`,
             key: '2',
             children: (
               <Spin spinning={loading}>

+ 68 - 3
src/services/TaskManage.js

@@ -9,6 +9,10 @@ const baseURL = '/api';
  * @returns {Promise<*>}
  */
 export async function getMandateList(data) {
+  if (data.responsible_people === '') {
+    delete data.responsible_people;
+  }
+  console.log(data);
   return request(`${baseURL}/v1/mandate/list?${stringify(data)}`);
 }
 
@@ -38,11 +42,20 @@ export async function getMandateDetail(params) {
  * @param params.pw MD5加密的口令
  * @returns {Promise<*>}
  */
-export async function setTaskAutomation(params) {
-  return request(`${baseURL}/v1/mandate/automation`, {
+export async function setTaskAutomation(params, mandate) {
+  let res = await request(`${baseURL}/v1/mandate/automation`, {
     method: 'POST',
     data: params,
   });
+
+  if (mandate.MandateClass === 2) {
+    res = await SetVarValues(mandate.MandateChild[0].Payload);
+    if (res) {
+      return res;
+    } else {
+      return false;
+    }
+  }
 }
 
 /**
@@ -52,7 +65,7 @@ export async function setTaskAutomation(params) {
  * @param params.note 备注
  * @returns {Promise<*>}
  */
-export async function ignoreTask(params) {
+export async function ignoreTaskRequest(params) {
   const encodeParams = new URLSearchParams(params).toString();
   return request(`${baseURL}/v1/mandate/edit`, {
     method: 'POST',
@@ -139,3 +152,55 @@ export async function getWorkOrderFlow(params) {
   const res = await request(`/api/v1/work_order/flow?${stringify(params)}`);
   return res.data;
 }
+
+export async function SetVarValues(params) {
+  const res = await request(
+    `/api/v1/scada/set-var-values-batch`,
+    'POST',
+    params,
+  );
+  if (res) {
+    console.log('上报成功');
+  }
+  return res;
+}
+
+/**
+ * 获取用户相关的工单列表
+ * @param {Object} params
+ * @param {number} params.project_id 项目id
+ * @param {number} params.work_type 0-全部 1-工艺 2-维修 3-保养
+ * @param {number} params.status -1-全部状态 0-未处理
+ * @param {string} params.stime 开始时间
+ * @param {string} params.etime 结束时间
+ * @param {number} params.user_id 用户id
+ * @returns {Promise<*>}
+ */
+export async function getUserWorkOrderList(params) {
+  const res = await request(`/api/v1/user-mandate/list?${stringify(params)}`);
+  return res.data;
+}
+
+/**
+ *
+ * @param {Object} params
+ * @param {number} params.project_id
+ * @param {string} params.start_time
+ * @param {string} params.end_time
+ * @param {string} params.name
+ * @param {number} params.status
+ */
+export async function getReagentOrderList(params) {
+  const res = await request(`/api/v1/reagent/list?${stringify(params)}`);
+  return res;
+}
+
+/**
+ * 获取加药工单详情
+ * @param {number} id
+ * @returns
+ */
+export async function getReagentOrderDetail(id) {
+  const res = await request(`/api/v1/reagent/detail?id=${id}`);
+  return res.data;
+}

+ 13 - 0
src/services/eqSelfInspection.js

@@ -83,3 +83,16 @@ export async function patrolOverviewPie(params) {
     `/api/v1/patrol/chart-pie/${params.projectId}?${stringify(params)}`,
   );
 }
+
+/**
+ * 获取系统自检相关任务id
+ * @param {object} params
+ * @param {number} params.project_id 项目id
+ * @param {number} params.id 巡检id
+ */
+export async function getMandateIDs(params) {
+  const res = await request(
+    `/api/v1//patrol/relation-task?${stringify(params)}`,
+  );
+  return res?.data?.list || [];
+}