Prechádzať zdrojové kódy

修改审批节点可以提交人自选审批人

Renxy 2 rokov pred
rodič
commit
0da9524774

+ 5 - 12
src/components/DDComponents/InnerContactField/index.js

@@ -10,23 +10,16 @@ function InnerContactField(props) {
     <Select
       showSearch
       onChange={value => {
-        // onChange(JSON.stringify(['16569001414345099']));
-        if (!value) {
-          message.error('该用户未绑定钉钉userID,请联系管理员。');
-          return;
-        }
         onChange(String(value));
         // onChange(JSON.stringify([value]));
       }}
       filterOption={(input, option) => option.children.toLowerCase().includes(input.toLowerCase())}
     >
-      {(userList || [])
-        .filter(item => item.DingUserId)
-        .map(item => (
-          <Option key={item.ID} value={item.ID}>
-            {item.CName}
-          </Option>
-        ))}
+      {(userList || []).map(item => (
+        <Option key={item.ID} value={item.ID}>
+          {item.CName}
+        </Option>
+      ))}
     </Select>
   );
 }

+ 2 - 2
src/components/Flow/index.tsx

@@ -91,8 +91,8 @@ export const Demo: React.FC<IProps> = props => {
                   curNode.type == TYPE.JUDGE && !curNode.formItems ? '[]' : curNode.formItems,
                 priority: curNode.priority,
                 //审批节点
-                roleID: curNode.roleID,
-                audits: curNode.audits,
+                initiator: curNode.type == TYPE.INITIATOR ? curNode.initiator : null,
+                audits: curNode.type == TYPE.AUDIT ? curNode.audits : null,
                 children: children,
               };
               return node;

+ 12 - 8
src/components/Flow/node/auditNode/index.tsx

@@ -1,13 +1,13 @@
 import React, { useMemo } from 'react';
 AuditServe;
-import AuditServe, { TYPE } from './mapServe';
+import AuditServe, { IDTYPE, TYPE } from './mapServe';
 import { connect } from 'dva';
 export { AuditServe };
 
 const CustomRect = props => {
-  const { size = { width: 130, height: 50 }, data, depUserTree, roleList } = props;
+  const { size = { width: 130, height: 50 }, data, depUserTree, roleList, userList } = props;
   const { width, height } = size;
-  const { label, stroke, fill, fontFill, fontSize, type = 2, audits, roleID } = data;
+  const { label, stroke, fill, fontFill, fontSize, type = 2, initiator, audits } = data;
 
   const contentText = useMemo(() => {
     let text = '请选择审批人';
@@ -36,8 +36,8 @@ const CustomRect = props => {
       return name;
     };
     if (type != TYPE.AUDIT) {
-      if (audits?.length > 0) {
-        const list = audits
+      if (initiator?.length > 0) {
+        const list = initiator
           .map(item => {
             return getName(item.value, depUserTree);
           })
@@ -47,13 +47,16 @@ const CustomRect = props => {
         return text;
       }
     } else {
-      if (roleID) {
-        return roleList.find(item => item.ID == roleID)?.Name;
+      if (audits?.length > 0) {
+        return audits[0].type == IDTYPE.ROLE
+          ? roleList.find(item => item.ID == audits[0].value)?.Name
+          : userList.find(item => item.ID == audits[0].value)?.CName;
+        // return roleList.find(item => item.ID == audits[0].value)?.Name;
       } else {
         return text;
       }
     }
-  }, [audits, type, roleID, depUserTree, roleList]);
+  }, [initiator, type, audits, depUserTree, roleList]);
 
   // const type: TYPE = 0;
   const titleDom = () => {
@@ -114,6 +117,7 @@ const CustomRect = props => {
 export default connect(({ user }) => ({
   depUserTree: user.depUserTree,
   roleList: user.roleList,
+  userList: user.list,
 }))(CustomRect);
 
 const enum COLOR {

+ 86 - 27
src/components/Flow/node/auditNode/mapServe.tsx

@@ -1,10 +1,10 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useMemo } from 'react';
 import { FlowchartFormWrapper } from '@antv/xflow';
 import { Position, Size, ColorPicker, InputNumberFiled, InputFiled, SelectField } from '../fields';
 import { PREFIX } from '../constants';
 import { connect } from 'dva';
 import { UnityAction } from '@/utils/utils';
-import { Button, Select, TreeSelect } from 'antd';
+import { Button, Radio, RadioChangeEvent, Select, TreeSelect } from 'antd';
 
 const { Option } = Select;
 
@@ -36,16 +36,24 @@ export interface IConfig {
   flow_node_id?: string;
   process_code?: string;
   type: TYPE;
-  roleID: number;
+  initiator: { type: string; value: number; origin?: string | number; name?: string }[];
+  //审批人目前只支持单选角色或者单选人
   audits: { type: string; value: number; origin?: string | number; name?: string }[];
 }
 
+export const enum IDTYPE {
+  DEP = 'dep',
+  USER = 'user',
+  ROLE = 'role',
+}
+
 const Component = (props: any) => {
   const defaultConfig = {
     type: TYPE.AUDIT,
   };
-  const { config, plugin = {}, depUserTree, roleList } = props;
+  const { config, plugin = {}, depUserTree, roleList, userList } = props;
   const { updateNode } = plugin;
+  const [isRole, setIsRole] = useState(1); ///按角色还是个人
 
   const [nodeConfig, setNodeConfig] = useState<IConfig>({
     ...defaultConfig,
@@ -73,15 +81,22 @@ const Component = (props: any) => {
     }
   };
 
+  useEffect(() => {
+    const bool = nodeConfig.audits?.some(item => item.type == IDTYPE.USER) ? 0 : 1;
+    console.log(bool);
+    setIsRole(bool);
+  }, []);
+  console.log('===================', nodeConfig);
+
   const handleTreeChange = (values: (string | number)[]) => {
     const newValues = values.map(cur => {
       if (typeof cur == 'string' && cur.includes('||')) {
-        return { type: 'user', value: Number(cur.split('||')[0]), origin: cur };
+        return { type: IDTYPE.USER, value: Number(cur.split('||')[0]), origin: cur };
       } else {
-        return { type: 'dep', value: cur, origin: cur };
+        return { type: IDTYPE.DEP, value: cur, origin: cur };
       }
     });
-    onNodeConfigChange('audits', newValues);
+    onNodeConfigChange('initiator', newValues);
   };
 
   const onSave = () => {
@@ -167,14 +182,14 @@ const Component = (props: any) => {
             }}
           />
         </div>
-        <div className="group">
-          <label>{typeOption.find(item => item.value == nodeConfig.type)?.label || '审批人'}</label>
-          {nodeConfig.type != TYPE.AUDIT ? (
+        {nodeConfig.type != TYPE.AUDIT && (
+          <div className="group">
+            <label>{typeOption.find(item => item.value == nodeConfig.type)?.label || '-'}</label>
             <TreeSelect
               showSearch
               multiple
               allowClear
-              defaultValue={nodeConfig.audits?.map(item => item.origin)}
+              value={nodeConfig.initiator?.map(item => item.origin)}
               style={{ width: '80%' }}
               placeholder="请选择"
               treeData={depUserTree}
@@ -182,24 +197,67 @@ const Component = (props: any) => {
                 handleTreeChange(values);
               }}
             />
-          ) : (
-            <Select
-              showSearch
-              style={{ width: '100%' }}
-              filterOption={(input, option) => option.props.children.indexOf(input) >= 0}
-              onChange={value => {
-                onNodeConfigChange('roleID', Number(value));
+          </div>
+        )}
+
+        {nodeConfig.type == TYPE.AUDIT && (
+          <div className={`${PREFIX}-panel-group`}>
+            <h5>审批人</h5>
+            <Radio.Group
+              onChange={(e: RadioChangeEvent) => {
+                console.log(e.target.value);
+                setIsRole(e.target.value);
+                onNodeConfigChange('audits', []);
               }}
+              value={isRole}
             >
-              {roleList &&
-                roleList.map(item => (
-                  <Option key={item.ID} value={item.ID + ''}>
-                    {item.Name}
-                  </Option>
-                ))}
-            </Select>
-          )}
-        </div>
+              <Radio value={1}>发起人自选</Radio>
+              <Radio value={0}>指定人</Radio>
+            </Radio.Group>
+            <div className="group">
+              {isRole ? (
+                <>
+                  <label>审批角色</label>
+                  <Select
+                    showSearch
+                    style={{ width: '100%' }}
+                    value={nodeConfig.audits?.map(item => item.value)}
+                    filterOption={(input, option) => option.props.children.indexOf(input) >= 0}
+                    onChange={value => {
+                      onNodeConfigChange('audits', [{ type: IDTYPE.ROLE, value: Number(value) }]);
+                    }}
+                  >
+                    {roleList &&
+                      roleList.map(item => (
+                        <Option key={item.ID} value={item.ID}>
+                          {item.Name}
+                        </Option>
+                      ))}
+                  </Select>
+                </>
+              ) : (
+                <>
+                  <label>审批人</label>
+                  <Select
+                    showSearch
+                    style={{ width: '100%' }}
+                    value={nodeConfig.audits?.map(item => item.value)}
+                    onChange={value => {
+                      onNodeConfigChange('audits', [{ type: IDTYPE.USER, value: Number(value) }]);
+                    }}
+                    filterOption={(input, option) => option.props.children.indexOf(input) >= 0}
+                  >
+                    {(userList || []).map(item => (
+                      <Option key={item.ID} value={item.ID}>
+                        {item.CName}
+                      </Option>
+                    ))}
+                  </Select>
+                </>
+              )}
+            </div>
+          </div>
+        )}
       </div>
 
       <Button style={{ marginTop: 20 }} type="primary" onClick={onSave}>
@@ -221,4 +279,5 @@ export default connect(({ xflow, flow, user }) => ({
   auditList: xflow.auditList,
   depUserTree: user.depUserTree,
   roleList: user.roleList,
+  userList: user.list,
 }))(RecthServe);

+ 206 - 15
src/pages/PurchaseAdmin/PurchaseList/Detail/CommitAuditModal.js

@@ -1,8 +1,23 @@
-import React, { useEffect, useState, useRef, useMemo } from 'react';
+import React, { useEffect, useState, useRef, useMemo, useCallback } from 'react';
 import '@ant-design/compatible/assets/index.css';
-import { Modal, Input, Select, message, Cascader, Form, Tabs, Row, Col, Empty, Button } from 'antd';
+import {
+  Modal,
+  Input,
+  Select,
+  message,
+  Cascader,
+  Form,
+  Tabs,
+  Row,
+  Col,
+  Empty,
+  Button,
+  Steps,
+  Popover,
+} from 'antd';
+import { PlusOutlined } from '@ant-design/icons';
 import { connect } from 'dva';
-import { isArray, result } from 'lodash';
+import { isArray, result, set } from 'lodash';
 import { useForm } from 'rc-field-form';
 import { async } from '@antv/x6/lib/registry/marker/async';
 import AuditDetailed from './AuditDetailed';
@@ -11,15 +26,17 @@ import { queryDingSchema, queryProcessFlows } from '@/services/boom';
 import { Form as Form3x } from '@ant-design/compatible';
 import { getCurrentUser } from '@/utils/authority';
 import DDCode from '@/components/DDComponents/DDCode';
-import { uploadFile } from '@/services/boom';
+import { uploadFile, queryUserListByRoleID } from '@/services/boom';
 
 const { TextArea } = Input;
 const { Option } = Select;
 const { TabPane } = Tabs;
+const { Step } = Steps;
 
 // 提交
 function CommitAuditModal(props) {
   const {
+    dispatch,
     visible,
     onClose,
     onOk,
@@ -29,6 +46,7 @@ function CommitAuditModal(props) {
     flowDetail,
     currentUser,
     luckysheet,
+    userList,
   } = props;
   const [auditId, setAuditId] = useState();
   const [data, setData] = useState([]);
@@ -37,6 +55,9 @@ function CommitAuditModal(props) {
   const [auditList, setAuditList] = useState([]); //用于创建Tabs表单
   const [formComponentValues, setFormComponentValues] = useState({}); //用于创建Tabs表单
   const [form] = Form.useForm();
+  const [approvalProcess, setApprovalProcess] = useState({});
+  const [selectUserList, setSelectUserList] = useState([]);
+  const [curNodeIdx, setCurNodeIdx] = useState(-1);
 
   useEffect(() => {
     if (!visible) return;
@@ -137,9 +158,76 @@ function CommitAuditModal(props) {
 
   const onChange = value => {
     changeAudit(value[value.length - 1]);
-
     setAuditListFun();
   };
+
+  const getReComputeAudit = (items, changedValues) => {
+    const id = Object.keys(changedValues)[0];
+    const formItem = items?.find(item => item.props.id == id);
+    if (formItem && formItem.props?.required) return true;
+    return false;
+  };
+
+  //填写表单实时计算审批流程
+  const advanceSubmit = async () => {
+    console.log('重重新计算审批流程');
+    var fieldsValue = await form.validateFields();
+    let hasFlowId = true; //是否都绑定审批节点
+
+    let result = Object.values(fieldsValue)
+      .map(item => {
+        if (item && Array.isArray(item)) return item;
+      })
+      .filter(item => item);
+    const formList = await getFromData(result);
+    let params = {
+      desc: fieldsValue.desc,
+      // 审核流程id
+      flow_id: 0,
+      node_level_id: 0,
+      id: version.id,
+      project_id: version.project_id,
+      cur_template_node_id: version.template_node_id * 1, // 当前节点
+      next_template_node_id: 0, // 审核完成后的业务节点
+      template_node_id: null, // 将要流转的节点审批节点
+      flow_path: null, //审批节点数组
+      // 模板id.一致就行
+      template_id: version.template_id,
+      cur_template_id: version.template_id,
+      next_template_id: version.template_id,
+      form_list: formList,
+    };
+
+    const ddd = {
+      '778': [
+        { type: 'user', value: 448, origin: 0 },
+        { type: 'role', value: 82, origin: 0 },
+        { type: 'role', value: 61, origin: 0 },
+      ],
+      '791': [
+        { type: 'user', value: 448, origin: 0 },
+        { type: 'role', value: 82, origin: 0 },
+        { type: 'role', value: 61, origin: 0 },
+      ],
+      '792': [
+        { type: 'user', value: 448, origin: 0 },
+        { type: 'role', value: 82, origin: 0 },
+        { type: 'role', value: 29, origin: 0 },
+      ],
+    };
+
+    dispatch({
+      type: 'detail/advanceSubmitNextNode',
+      payload: params, //values,
+      callback: data => {
+        if (data) {
+          setApprovalProcess(data);
+        }
+        console.log('=======================================', data);
+      },
+    });
+  };
+
   //处理tabs页
   const setAuditListFun = async () => {
     var fieldsValue = await form.validateFields();
@@ -193,6 +281,7 @@ function CommitAuditModal(props) {
               }
             })
             .filter(item => item);
+          if (getReComputeAudit(items, changedValues)) advanceSubmit();
           console.log('==================================', { ...formComponentValues });
           setFormComponentValues({ ...formComponentValues });
         },
@@ -225,14 +314,43 @@ function CommitAuditModal(props) {
         flow_id: approvalNode.flow_id,
         template_node_id: approvalNode.Id,
         formComponentValues: [...values], //{ name: '附件', value: JSON.stringify(attachment) }
+        audit_list: approvalProcess[approvalNode.Id]?.map(item => item[0].value) || [],
       };
       result.push(JSON.stringify(formItem));
     });
     return result;
   };
+
+  const getFlowPath = node => {
+    //[134, 135]
+    let itemData = {};
+    const Function = (curId, index) => {
+      if (!curId) return;
+      let data = {};
+      let approvalNode = flowDetail.nodes.find?.(item => item.Id == curId);
+      data.template_id = version.template_id;
+      data.flow_id = approvalNode?.flow_id || 0;
+      data.node_level_id = approvalNode?.flow_id ? 1 : 0;
+      data.template_node_id = approvalNode?.Id;
+      index++;
+      if (approvalNode?.Id) {
+        if (!approvalNode?.flow_id) {
+          hasFlowId = false;
+        }
+      }
+      const res = Function(node[index], index);
+      if (res) {
+        data.flow_path = [res];
+      }
+      return data;
+    };
+    itemData = Function(node[0], 0);
+    return itemData;
+  };
+
   const onFinish = async () => {
+    console.log(approvalProcess);
     var fieldsValue = await form.validateFields();
-    console.log();
     let hasFlowId = true; //是否都绑定审批节点
     const getFlowPath = node => {
       //[134, 135]
@@ -315,6 +433,7 @@ function CommitAuditModal(props) {
       message.error('当前存在审批节点未绑定审批流程!请联系管理员。');
       return;
     }
+    console.log(params);
     onOk(params);
   };
   const CascaderNode = index => {
@@ -353,6 +472,74 @@ function CommitAuditModal(props) {
     }
   };
 
+  const renderSteps = id => {
+    const list = approvalProcess[id];
+    list?.forEach(item => {
+      if (item.length > 1 && item[0].type == 'user') {
+        item.forEach(curUser => {
+          curUser.name = userList.find(user => user.ID == curUser.value)?.CName || '-';
+        });
+      } else if (item.length == 1 && item[0].type == 'user') {
+        item[0].name = userList.find(user => user.ID == item[0].value)?.CName || '-';
+      } else {
+        item[0].name = null;
+      }
+    });
+    console.log(list);
+
+    const onStepsChange = async (current, list) => {
+      const itemNode = list[current][0];
+      if (itemNode.type !== 'role') return;
+      const data = await queryUserListByRoleID({ role_id: itemNode.value });
+      console.log(data);
+      setCurNodeIdx(current);
+      setSelectUserList(data);
+    };
+
+    const selectedUserId = userId => {
+      const name = userList.find(user => user.ID == userId)?.CName || '-';
+      const data = { type: 'user', value: Number(userId), name };
+      list[curNodeIdx][0] = data;
+      console.log(list);
+      setApprovalProcess({ ...approvalProcess, [id]: list });
+      // const newData = userIdData[id] || [];
+      // newData[curNodeIdx] = userId;
+      // setUserIdData({ ...userIdData, [id]: newData });
+      // console.log(userId, curNodeIdx, { ...userIdData, [id]: newData });
+    };
+
+    return (
+      <>
+        <Steps current={-1} direction="vertical" onChange={value => onStepsChange(value, list)}>
+          {list?.map(item => (
+            <Step
+              key={item[0]?.value}
+              icon={
+                item[0]?.name ? null : (
+                  // <Popover
+                  //   placement="rightTop"
+                  //   title={'选择审批人'}
+                  //   content={selectUserList.map(item => {
+                  //     <div>{item.c_name}</div>;
+                  //   })}
+                  //   trigger="click"
+                  // >
+                  //   <PlusOutlined />
+                  // </Popover>
+                  <PlusOutlined />
+                )
+              }
+              title={item[0]?.name}
+            />
+          ))}
+        </Steps>
+        {selectUserList.map(item => (
+          <Button onClick={() => selectedUserId(item.user_id)}>{item.c_name}</Button>
+        ))}
+      </>
+    );
+  };
+
   return (
     <Modal
       confirmLoading={loading}
@@ -394,17 +581,20 @@ function CommitAuditModal(props) {
             <Row>
               <Col span={17}>{item.FormComponents}</Col>
               <Col offset={1} span={4}>
-                {!formComponentValues[item.nodeId] ? (
+                {!formComponentValues[item.nodeId] || !approvalProcess[item.nodeId] ? (
                   <Empty description="请先填写表单" />
                 ) : (
-                  <AuditFlow
-                    processCode={item.formCode}
-                    formComponentValues={formComponentValues[item.nodeId]}
-                    direction={'vertical'}
-                    deptId={'14237557'}
-                    userId={currentUser.DingUserId || getCurrentUser()?.DingUserId}
-                  />
-                )}
+                  renderSteps(item.nodeId)
+                )
+                // ({renderSteps(item.nodeId)})
+                // <AuditFlow
+                //   processCode={item.formCode}
+                //   formComponentValues={formComponentValues[item.nodeId]}
+                //   direction={'vertical'}
+                //   deptId={'14237557'}
+                //   userId={currentUser.DingUserId || getCurrentUser()?.DingUserId}
+                // />
+                }
               </Col>
             </Row>
           </TabPane>
@@ -418,4 +608,5 @@ export default connect(({ xflow, detail, user }) => ({
   flowDetail: xflow.flowDetail,
   versionList: detail.versionList,
   currentUser: user.currentUser,
+  userList: user.list,
 }))(CommitAuditModal);

+ 45 - 5
src/pages/PurchaseAdmin/PurchaseList/Detail/Index.js

@@ -132,13 +132,14 @@ function Detail(props) {
     return data;
   }, [auditList, version]);
   const active_audit = flow.active_audit;
-
+  console.log(flow);
   const isAuditor = useMemo(() => {
     const getUserRole = () => {
-      let roleID = flow.currentNode?.AuditRoleInfo?.ID;
-      let item = currentUser.roleList.find(role => role.ID == roleID);
-      if (item) return true;
-      return false;
+      return flow.currentNode.auditor == currentUser.ID;
+      // let roleID = flow.currentNode?.AuditRoleInfo?.ID;
+      // let item = currentUser.roleList.find(role => role.ID == roleID);
+      // if (item) return true;
+      // return false;
     };
     return active_audit == 1 && getUserRole();
   }, [active_audit, flow, currentUser]);
@@ -899,6 +900,44 @@ function Detail(props) {
   };
 
   const onSubmitNextNode = values => {
+    const ddd = {
+      id: 1117,
+      project_id: 76,
+      cur_template_node_id: 777,
+      next_template_node_id: 779,
+      template_id: 47,
+      cur_template_id: 47,
+      next_template_id: 47,
+      template_node_id: 791,
+      flow_path: [
+        {
+          template_id: 47,
+          flow_id: 2,
+          node_level_id: 1,
+          template_node_id: 791,
+          flow_path: [{ template_id: 47, flow_id: 2, node_level_id: 1, template_node_id: 778 }],
+        },
+        {
+          template_id: 47,
+          flow_id: 2,
+          node_level_id: 1,
+          template_node_id: 792,
+          flow_path: [{ template_id: 47, flow_id: 2, node_level_id: 1, template_node_id: 778 }],
+        },
+      ],
+      form_list: [
+        '{"flow_id":2,"template_node_id":791,"formComponentValues":[{"name":"联系人","id":"InnerContactField_8dd67dc0-3a12-47ca-9cd9-ec80c2189ede","value":["448"]},{"name":"单选框","id":"DDSelectField_1fcb0fa7-7123-42d2-951e-d99b4ab61367","value":["111"]},{"name":"多选框","id":"DDMultiSelectField_7b7cebd4-6495-490e-ab39-c1d79137d807","value":["555"]},{"name":"数字输入框","id":"NumberField_f7b96ef8-ab94-4f99-93b5-663d1619e7f8","value":["2"]}]}',
+        '{"flow_id":2,"template_node_id":792,"formComponentValues":[{"name":"联系人","id":"InnerContactField_8dd67dc0-3a12-47ca-9cd9-ec80c2189ede","value":["67"]},{"name":"单选框","id":"DDSelectField_1fcb0fa7-7123-42d2-951e-d99b4ab61367","value":["222"]},{"name":"多选框","id":"DDMultiSelectField_7b7cebd4-6495-490e-ab39-c1d79137d807","value":["333","444"]},{"name":"数字输入框","id":"NumberField_f7b96ef8-ab94-4f99-93b5-663d1619e7f8","value":["2"]}]}',
+        '{"flow_id":2,"template_node_id":778,"formComponentValues":[{"name":"联系人","id":"InnerContactField_8dd67dc0-3a12-47ca-9cd9-ec80c2189ede","value":["448"]},{"name":"单选框","id":"DDSelectField_1fcb0fa7-7123-42d2-951e-d99b4ab61367","value":["111"]},{"name":"多选框","id":"DDMultiSelectField_7b7cebd4-6495-490e-ab39-c1d79137d807","value":["333","444"]},{"name":"数字输入框","id":"NumberField_f7b96ef8-ab94-4f99-93b5-663d1619e7f8","value":["3"]}]}',
+      ],
+    };
+    // dispatch({
+    //   type: 'detail/advanceSubmitNextNode',
+    //   payload: ddd, //values,
+    //   callback: data => {
+    //     console.log('=======================================', JSON.stringify(data));
+    //   },
+    // });
     dispatch({
       type: 'detail/submitNextNode',
       payload: values,
@@ -1012,6 +1051,7 @@ function Detail(props) {
 
   return (
     <Spin spinning={false}>
+      <Button onClick={onSubmitNextNode}>测试</Button>
       <div className={styles.top}>
         <div>
           <Button type="primary" style={{ marginRight: 20 }} onClick={() => setFlowVisible(true)}>

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/TimeNode.js

@@ -22,7 +22,7 @@ function TimeNode(props) {
             <Step
               key={item.id}
               title={item.node}
-              description={`审批角色:${item?.AuditRoleInfo.Name || '-'}`}
+              // description={`审批角色:${item?.AuditRoleInfo.Name || '-'}`}
             />
           ))}
         </Steps>

+ 20 - 0
src/pages/PurchaseAdmin/PurchaseList/Detail/models/detail.js

@@ -24,6 +24,7 @@ import {
   queryHistoryList,
   queryHistoryDetail,
   submitNextNode,
+  advanceSubmitNextNode,
   addBomComment,
   queryBomComment,
   approve,
@@ -223,6 +224,25 @@ export default {
         });
       }
     },
+    // 实时计算审批人
+    *advanceSubmitNextNode({ payload, callback }, { call, put }) {
+      let response = yield call(advanceSubmitNextNode, payload);
+      if (response) {
+        console.log(response);
+        callback?.(response.data);
+
+        // message.success('提交成功');
+        // yield put({
+        //   type: 'queryVersionsList',
+        //   payload: {
+        //     project_id: payload.project_id,
+        //   },
+        //   callback: () => {
+        //     callback(response.data);
+        //   },
+        // });
+      }
+    },
     *queryDetail({ payload, callback }, { call, put }) {
       const sheet = yield call(queryDetail, payload);
       if (sheet) {

+ 3 - 0
src/pages/PurchaseAdmin/PurchaseList/Flow/Audit.js

@@ -38,6 +38,9 @@ function Audit(props) {
     dispatch({
       type: 'user/getRoleList',
     });
+    dispatch({
+      type: 'user/fetch',
+    });
 
     dispatch({
       type: 'user/fetchDepV2',

+ 12 - 0
src/services/boom.js

@@ -70,6 +70,12 @@ export async function submitNextNode(params) {
     body: params,
   });
 }
+export async function advanceSubmitNextNode(params) {
+  return request(`/api/v1/purchase/next/node/advance-submit`, {
+    method: 'POST',
+    body: params,
+  });
+}
 
 export async function queryDetail(params) {
   let response = await request(`/purchase/record?${stringify(params)}`);
@@ -380,6 +386,12 @@ export async function queryProcessFlows(params) {
   let res = await request(`/purchase/process/get-flows?${stringify(params)}`, {
     method: 'GET',
   });
+  return res.data;
+}
 
+export async function queryUserListByRoleID(params) {
+  let res = await request(`/api/v1/purchase/process/get-role-user?${stringify(params)}`, {
+    method: 'GET',
+  });
   return res.data;
 }