浏览代码

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

xujunjie 2 年之前
父节点
当前提交
61645343ca

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Approval/Auth.js

@@ -73,7 +73,7 @@ function Auth(props) {
     */
     {
       title: '流程',
-      dataIndex: 'FlowInfo.name',
+      dataIndex: ['FlowInfo', 'name'],
     },
     {
       title: '状态',

+ 15 - 19
src/pages/PurchaseAdmin/PurchaseList/Approval/DetailModal.js

@@ -37,28 +37,24 @@ function DetailModal(props) {
             {data.TypeInfo?.name}
           </Form.Item>
         )}
-        {data.IndustryInfo && (
-          <Form.Item className={styles.formItem} label="行业名称">
-            {data.IndustryInfo?.name}
-          </Form.Item>
-        )}
         <Form.Item className={styles.formItem} label="流程">
           {flowList.find(item => item.id == data.flow_id)?.name}
         </Form.Item>
-        {data.location && (
-          <Form.Item className={styles.formItem} label="项目地区">
-            {data.location}({data.location_code})
-          </Form.Item>
-        )}
-        {data.name && (
-          <Form.Item className={styles.formItem} label="项目简称">
-            {data.name}
-          </Form.Item>
-        )}
-        {data.version && (
-          <Form.Item className={styles.formItem} label="项目批次">
-            {data.version}期
-          </Form.Item>
+        {data.type_id != 7 && (
+          <>
+            <Form.Item className={styles.formItem} label="行业名称">
+              {data.IndustryInfo?.name}
+            </Form.Item>
+            <Form.Item className={styles.formItem} label="项目地区">
+              {data.location}({data.location_code})
+            </Form.Item>
+            <Form.Item className={styles.formItem} label="项目简称">
+              {data.name}
+            </Form.Item>
+            <Form.Item className={styles.formItem} label="项目批次">
+              {data.version}期
+            </Form.Item>
+          </>
         )}
         {data.AuthorUser && (
           <Form.Item className={styles.formItem} label="售前项目经理">

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Approval/List.js

@@ -89,7 +89,7 @@ function List(props) {
     */
     {
       title: '流程',
-      dataIndex: 'FlowInfo.name',
+      dataIndex: ['FlowInfo', 'name'],
     },
     {
       title: '状态',

+ 0 - 2
src/pages/PurchaseAdmin/PurchaseList/Detail/CommitAuditModal.js

@@ -64,7 +64,6 @@ function CommitAuditModal(props) {
 
   const currentNodeId = useMemo(() => {
     let Id = version.template_node_id;
-    console.log("+++++++++++++++++++++", version)
     setAuditId(currentNodeId)
     return flowDetail.nodes.find?.(item => item.Id == Id)?.node_id;
   }, [flowDetail, version]);
@@ -157,7 +156,6 @@ function CommitAuditModal(props) {
       params.template_node_id = result[0][0]; // 将要流转的节点审批节点
       params.flow_path = result.map(item=>getFlowPath(item));
     }
-    console.log("flow_path    ",params)
 
     
     //   if (approvalNode?.Id) {

+ 88 - 59
src/pages/PurchaseAdmin/PurchaseList/Detail/FlowModal.js

@@ -11,15 +11,15 @@ const { Step } = Steps;
 
 const { TextArea } = Input;
 const localData = JSON.parse(localStorage.ggDetaiData || '{}');
+const PAGE_SIZE = 8
 
 // 提交
 function FlowModal(props) {
   const { visible, version, onClose, onChangeVersion, form, loading, flowDetail, dispatch } = props;
   const [data, setData] = useState([]);
   const [nodeLoading, setNodeLoading] = useState(false);
-  const [pageSize, setPageSize] = useState(9)
+  const [pageSize, setPageSize] = useState(PAGE_SIZE)
   const [stepsData, setStepsData] = useState([])
-  const [auditvisible, setAuditVisible] = useState(false);
   // const app = useXFlowApp();
   // const appRef = userRef()
 
@@ -35,9 +35,17 @@ function FlowModal(props) {
   }, [flowDetail, version.template_node_id]);
 
   useEffect(() => {
-    if(!visible) setAuditVisible(false);
+    if(!visible) updateSteps([]);
   }, [visible, version])
 
+  useEffect(()=>{
+    if(stepsData.length <= 0){
+      setPageSize(PAGE_SIZE);
+    }else{
+      setPageSize(PAGE_SIZE - stepsData.length)
+    }
+  },[stepsData])
+
   const handleSelectNode = async args => {
     let res;
     const id = args.nodeId || args.nodeIds[0];
@@ -45,72 +53,90 @@ function FlowModal(props) {
     let node = graphData.nodes.find(item => item.id == id);
     setNodeLoading(true);
     try {
-      res = await queryVserionByNode({ template_node_id: node.Id });
+      res = await queryVserionByNode({ template_node_id: node.Id});
       let data = [];
-      Object.values(res.data.excel_version).map(arr => {
+      res.data.excel_version_tree.map(arr => {
         if (res.data.flow_id) {
-          data = [...data, {...arr[0], flow_id:res.data.flow_id}];
-          console.log(data)
+          data = [...data, {...arr, flow_id:res.data.flow_id}];
         } else {
-          data = [...data, ...arr];
+          data = [...data, arr];
         }
       });
-      //解决key报错问题
-      data.forEach((item, id)=>data[id].key=`${id}-${item.name}`)
-      console.log(data.length)
+      data.sort((a,b) => a.id - b.id)
+      data.forEach((item, id)=>{
+        //解决key报错问题
+        data[id].key=`${id}-${item.name}`;
+        item.isParent = true;
+      })
       setData(data);
     } catch (error) {
       console.log(error);
     }
     setNodeLoading(false);
-    setAuditVisible(false);
+    updateSteps([]);
   };
 
-  const updateSteps = (data) => {
-    let newData = []
-    data?.forEach(item => {
-      let list = {
-        current: item.audit_status == 0 ? item.audit_status : item.audit_status-1,
-        list:item.FlowInfo.FlowNodes,
-        name:item.FlowInfo.name,
+  const updateSteps = (data, curNodeId) => {
+    let newData = [];
+    let set = new Set()
+    data.forEach(item=>set.add(item.template_node_id));
+    let list = [...set];
+    if(set.has(curNodeId)){
+      set.delete(curNodeId);
+      list = [curNodeId, ...set]
+    } 
+    let dataList = list.map(template_node_id=>{
+      let itemDataList = data.filter(item => item.template_node_id == template_node_id)
+      let  curid = 3
+      let status = 'process';
+      itemDataList.forEach(item=>{
+        if(item.audit_status != 3 && item.node_id <= curid) curid = item.node_id - 1;
+        if(item.audit_status == 2) status = 'error';
+      })
+      let curNode = flowDetail.nodes.find(item=>item.Id == itemDataList[0].template_node_id)
+      let obj = { 
+        status,
+        current:curid,
+        list: itemDataList[0].FlowInfo.FlowNodes,
+        name: curNode?.label || itemDataList[0].FlowInfo.name,
       }
-      newData.push(list);
+      itemDataList.forEach((itemData, idx) => {
+        if(idx >= obj.list.length) return;
+        obj.list[idx].auditor = itemData.AuthorInfo.CName;
+      })
+      return obj
     })
-    setStepsData(newData)
-    setPageSize(pageSize - data.length)
+    setStepsData(dataList)
   };
 
   const handleChangeClick = (item) => {
-    message.success('哈哈哈哈')
+    let type = item.flow_id ? 'detail/queryAuditRecord' : 'detail/queryAuditExcel'
     dispatch({
-      type: 'detail/queryAuditExcel',
+      type,
       payload: {
         excel_id: item.id,
-        // project_id: item.project_id,
-        // template_id:item.template_id,
-        // template_node_id:item.template_node_id,
+        pageSize: 100,
       },
       callback: res => {
-        updateSteps(res);
+        updateSteps(res, item.template_node_id);
       },
     });
-    setAuditVisible(true)
   }
   const columns = useMemo(() => {
     return [
       {
         title: '名称',
-        width: '33%',
+        // width: '33%',
         render: item => (
-          <div style={{ color: item.audit_status != 0 ? '#9b9b9b' : '' }}>
+          <span style={{ color: item.audit_status != 0 ? '#9b9b9b' : '' }}>
             {item.id == version.id && <CheckOutlined style={{ marginRight: 10 }} />}
-            {item.version_name}
-          </div>
+            {item.version_no && !item.isParent ? `${item.version_name}.${item.version_no}` : item.version_name}
+          </span>
         ),
       },
       {
         title: '状态',
-        width: '33%',
+        width: '30%',
         render: item => {
           let style = {  color: getColor(item) };
           let txt = '';
@@ -122,24 +148,24 @@ function FlowModal(props) {
               txt = '待审批';
               break;
             case 2:
-              txt = '拒绝';
+              txt = '拒绝';
               break;
             case 3:
-              txt = '通过';
+              txt = '通过';
               break;
             case 4:
               txt = '已提交';
               break;
           }
-          return <Button onClick={()=>handleChangeClick(item)}>{txt}</Button>
-          // (item.audit_status == 1 || item.audit_status == 4) ? 
-          //   <Button onClick={()=>handleChangeClick(item)}>{txt}</Button> :
-          //   <span style={style} >{txt}</span>
-              
+          if(item.status == 1)  txt = '已失效';
+          return  item.audit_status != 0  ? 
+            <Button onClick={()=>handleChangeClick(item)}>{txt}</Button> :
+            <span style={style} >{txt}</span>
         },
       },
       {
         title: '操作',
+        width: '20%',
         render: item =>
           item.id != version.id && (
             <a
@@ -148,13 +174,17 @@ function FlowModal(props) {
                 onClose();
               }}
             >
-              切换
+              加载
             </a>
           ),
       },
     ];
   }, [version]);
 
+  const onChange = () => {
+    updateSteps([]);
+  }
+
   return (
     <Modal
       confirmLoading={loading}
@@ -166,26 +196,25 @@ function FlowModal(props) {
       width="98%"
     >
       <Row gutter={8}>
-        <Col span={18}>
+        <Col span={16}>
           <Flow meta={{ type: 'view' }} flowDetail={graphData} onSelectNode={handleSelectNode} />
         </Col>
-        <Col span={6} >
-          <div style={{width:'100%'}}>
-            <Table style={{maxHeight:'90%'}} columns={columns} dataSource={data} loading={nodeLoading} bordered={false} pagination={{ pageSize}}/>
+        <Col span={8} >
+          <div style={{width:'100%'}}>         
+            <Table style={{maxHeight:'90%'}} columns={columns} dataSource={data} loading={nodeLoading} bordered={false} pagination={{pageSize:8,  onChange}} scroll={{ y: 65*pageSize }}/>
           </div>
-          <Space direction="vertical" size='8' style={{ display: auditvisible ? 'flex' : 'none' }}>
-            {stepsData.map((item ,idx)=> <div key={`${item.name}_${idx}`} style={{marginBottom:'8px'}}>
-              <div style={{marginBottom:'4px'}}>{item.name}</div>
-              <Steps size='small' current={item.current} >
-                {item.list.map(node => 
-                  <Step
-                    key={`${node.id}_${node.node}`}
-                    title={node.node}
-                  />
-                )}
-              </Steps>
-            </div>)}
-          </Space>
+          {stepsData.map((item ,idx)=> <div key={`${item.name}_${idx}`} style={{marginBottom:'20px'}}>
+            <div style={{marginBottom:'4px'}}>{item.name}</div>
+            <Steps size='small' current={item.current} status={item.status} >
+              {item.list.map(node => 
+                <Step
+                  key={`${node.id}_${node.node}`}
+                  title={node.node}
+                  description={`审批人:${node.auditor || '-'}`}
+                />
+              )}
+            </Steps>
+          </div>)}
         </Col>
       </Row>
     </Modal>

+ 22 - 31
src/pages/PurchaseAdmin/PurchaseList/Detail/HistoryDrawer.js

@@ -10,53 +10,43 @@ import CommentContent from '@/components/CommentContent';
 // 评论
 function HistoryDrawer(props) {
   const {
+    flowDetail,
     visible,
     onClose,
     version,
     loading,
     dispatch,
     versionTree,
+    onChangeVersion,
   } = props;
   const columns = useMemo(() => {
     return [
       {
         title: '名称',
-        width: '33%',
         render: item => (
           <div style={{ color: '#9b9b9b'}}>
-            {/* {item.id == version.id && <dix style={{ marginRight: 10 }} />} */}
-            {`${item.version_name}.${item.version_no}`}
+            {item.version_no ? `${item.version_name}.${item.version_no}` : item.version_name}
           </div>
         ),
       },
-      // {
-      //   title: '状态',
-      //   width: '33%',
-      //   render: item => {
-      //     let style = { color: getColor(item) };
-      //     let txt = '';
-      //     switch (item.audit_status) {
-      //       case 0:
-      //         txt = '未提交';
-      //         break;
-      //       case 1:
-      //         txt = '待审批';
-      //         break;
-      //       case 2:
-      //         txt = '拒绝';
-      //         break;
-      //       case 3:
-      //         txt = '通过';
-      //         break;
-      //       case 4:
-      //         txt = '已提交';
-      //         break;
-      //     }
-      //     return <span style={style}>{txt}</span>;
-      //   },
-      // },
+      {
+        title: '业务节点',
+        width: '20%',
+        render: item => {
+          let node = flowDetail.Nodes.find(cur => cur.Id == item.template_node_id)
+          return <span style={{ color: '#9b9b9b'}}>{node?.label ? node.label : '-'}</span>;
+        },
+      },
+      {
+        title:'提交人',
+        width: '20%',
+        render: item => {
+          return <span style={{ color: '#9b9b9b'}}>{item.AuthorInfo?.UserName ? item.AuthorInfo?.UserName : '-'}</span>
+        }
+      },
       {
         title: '操作',
+        width: '20%',
         render: item =>
           item.id != version.id && (
             <a
@@ -65,7 +55,7 @@ function HistoryDrawer(props) {
                 onClose();
               }}
             >
-              切换
+              加载
             </a>
           ),
       },
@@ -113,9 +103,10 @@ function HistoryDrawer(props) {
     </Drawer>
   );
 }
-export default connect(({ detail, user, loading }) => ({
+export default connect(({ detail, xflow, user, loading }) => ({
   comment: detail.comment,
   userList: user.list,
   bomComment: detail.bomComment,
+  flowDetail: xflow.flowDetail,
   loading: loading,
 }))(HistoryDrawer);

+ 41 - 14
src/pages/PurchaseAdmin/PurchaseList/Detail/Index.js

@@ -218,7 +218,6 @@ function Detail(props) {
   };
 
   const onCommit = (values, id) => {
-    console.log("=================================", values, id)
     let currentNode = flowDetail.nodes.find?.(item => item.Id == version.template_node_id);
     let currentData = sheetRef.current.getSheetJson().data;
     let sheets = JSON.parse(JSON.stringify(currentData));
@@ -332,8 +331,28 @@ function Detail(props) {
     let isSingle = false;
     let serviceNode;
     const flowNode = flow.currentNode;
+    const getLastTemplateNodeId = (data) => {
+      let result;
+      const getFun = (item) => {
+        if(item.flow_path?.length > 0){
+          getFun(item.flow_path[0])
+        }else{
+          result = item.template_node_id;
+        }
+      }
+      if(!data) return version.template_node_id
+      getFun(data[0])
+      return result;
+    }
+    let lastTemplateNodeId = version.template_node_id;
+    if(version.flow_path){
+      //如果多节点审批  获取当前是否审批流程的最后一个审批节点
+      let flowPathList = JSON.parse(version.flow_path)
+      lastTemplateNodeId = getLastTemplateNodeId(flowPathList)
+    }
+    
     // 判断是否为最后一个审批节点
-    if (flow.current == flow.list.FlowNodes.length - 1) {
+    if (lastTemplateNodeId == version.template_node_id && flow.current == flow.list.FlowNodes.length - 1) {
       serviceNode = flowDetail.nodes.find?.(item => item.Id == version.next_template_node_id);
       if (!serviceNode.muti_version) {
         //audit_status=4 表示为清单推进后留存的副本.不计入多清单计算
@@ -535,20 +554,20 @@ function Detail(props) {
       <Menu.Item key="attachment">附件</Menu.Item>,
     ];
     // version.audit_status:4 为副本。不可操作
-    if (version.audit_status != 4) {
+    if (version.audit_status != 4 ) {
       //判断权限配置,如果配置了,就指定权限的人可提交,没配置就全部人都可提交
       const getIsSubmit = () => {
         const nodeId = version.template_node_id;
         if (!flowDetail?.nodes || !nodeId) return;
         const node = flowDetail.nodes.find(item => item.Id == nodeId);
         if(node.name=='custom-circle') return ;
-        if( node?.role_list && node?.role_list.length > 0){
+        if( node?.role_list ){
           return node.role_list.split(",").some(id=> currentUser.roleList?.find(role=>role.ID == id))
         } 
         return true;
       }
-      console.log('是否有权限提交流转',getIsSubmit())
-      if(getIsSubmit()) menuList.push(<Menu.Item key="commitAudit">提交流转</Menu.Item>);
+      console.log("是否有权限提交流转   ", getIsSubmit())
+      if(getIsSubmit() && version.audit_status != 3) menuList.push(<Menu.Item key="commitAudit">提交流转</Menu.Item>);
       
 
       if (!isAuditor && canEdit() && !version.flow_id) {
@@ -576,10 +595,12 @@ function Detail(props) {
 
   const renderAlert = () => {
     const audit_comment = history.list[0]?.audit_comment;
-    let item = '';
+    let item = ''; 
     switch (active_audit) {
       case 0:
-        return;
+        if (!flow.list || flow.list.FlowNodes?.length == 0) return
+        item = <Alert message="审批拒绝" type="error" />;
+        break;
       case 1:
         item = <Alert message="等待审核中" type="info" />;
         break;
@@ -597,7 +618,7 @@ function Detail(props) {
         item = <Alert message="审批通过" type="success" />;
         break;
     }
-
+    
     return <div style={{ marginTop: 20 }}>{item}</div>;
   };
 
@@ -779,7 +800,12 @@ function Detail(props) {
     const nodeId = version.template_node_id;
     if (!flowDetail?.nodes || !nodeId) return;
     const node = flowDetail.nodes.find(item => item.Id == nodeId);
-    return `当前清单:${version.version_name || '-'};    当前节点:${node?.label || '-'}`;
+    // return `当前清单:${version.version_name || '-'};    当前节点:${node?.label || '-'}`;
+    return(
+      <span className={styles.curTitle}>
+        当前清单: <span>{version.version_name || '-'}</span>当前节点: <span>{node?.label || '-'}</span>
+      </span>
+    )
   };
 
   const handleSubmitCell = (value, callback) => {
@@ -852,7 +878,7 @@ function Detail(props) {
               新建清单
             </Button>
           )}
-          <span style={{ marginLeft: 20 }}>{renderNode()}</span>
+         {renderNode()}
         </div>
         <div className={styles.btns}> 
           <Button type="primary" style={{ marginRight: 20 }} onClick={() => setVersionTreeVisible(true)}>
@@ -904,9 +930,10 @@ function Detail(props) {
 
       <HistoryDrawer 
         versionTree={versionTree}
-         version={version}
-         visible={versionTreeVisible}
-         onClose={() => setVersionTreeVisible(false)}
+        version={version}
+        visible={versionTreeVisible}
+        onChangeVersion={version => changeVersion(version)}
+        onClose={() => setVersionTreeVisible(false)}
       />
 
       <CommentContent

+ 7 - 0
src/pages/PurchaseAdmin/PurchaseList/Detail/Index.less

@@ -47,3 +47,10 @@
 .historyList {
   padding: 0 10px;
 }
+.curTitle  {
+  margin-left: 20px;
+ span {
+  color: #1890FF;
+  margin-right: 10px;
+ }
+}

+ 2 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/LuckySheet.js

@@ -116,12 +116,13 @@ class LuckySheet extends React.Component {
         //   }, 300);
         // },
       };
+      console.log(version)
       if(version.flow_id) {
         option.authority = {
           sheet: true,
           hintText: '当前处于审批节点,禁止编辑!'
         }
-      } else if(version.audit_status != 0) {
+      } else if(version.audit_status != 0 || version.status == 1) {
         option.authority = {
           sheet: true,
           hintText: '当前清单不可编辑!'

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

@@ -14,10 +14,10 @@ function TimeNode(props) {
     onApprove,
   } = props;
 
-  if (active !== 0) {
+  if (!list || list.FlowNodes?.length != 0) {
     return (
       <div className={styles.top}>
-        <Steps current={current}>
+        <Steps current={current} status={active == 0 ? 'error' : 'process'}>
           {list.FlowNodes.map(item => (
             <Step
               key={item.id}
@@ -27,7 +27,7 @@ function TimeNode(props) {
           ))}
         </Steps>
         <div className={styles.btns} style={{ marginLeft: 80 }}>
-          {isAuditor && (
+          {isAuditor && active != 0 && (
             <>
               <Button type="primary" onClick={() => onApprove(true)}>
                 审批通过

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

@@ -30,6 +30,7 @@ import {
   queryAuthority,
   queryVersionsTree,
   queryAuditExcel,
+  queryAuditRecord,
 } from '@/services/boom';
 import { queryRole } from '@/services/SysAdmin';
 import { setCurrentUser } from '@/utils/authority';
@@ -506,6 +507,12 @@ export default {
         callback && callback(response.data?.all);
       }
     },
+    *queryAuditRecord({ payload,  callback  }, { call, put }) {
+      const response = yield call(queryAuditRecord, payload);
+      if (response) {
+        callback && callback(response.data?.all);
+      }
+    },
   },
 
   reducers: {

+ 1 - 5
src/pages/PurchaseAdmin/PurchaseList/WorkingHours/AuthWorkList.js

@@ -30,11 +30,7 @@ function AuthWorkList(props) {
     },
     {
       title: '提交人',
-      dataIndex: 'User.CName',
-      // render: (project_id, item) => {
-      //   if (item.zIndex === 0) return '';
-      //   return project.find(p => p.ID == project_id)?.Name || '-';
-      // },
+      dataIndex: ['User', 'CName'],
     },
     {
       title: '审核状态',

+ 4 - 1
src/services/boom.js

@@ -93,13 +93,16 @@ export async function queryBoomFlowList(params) {
 }
 //请求历史版本
 export async function queryVersionsTree(params){
-  console.log("============================", stringify(params))
   return request(`/api/v1/purchase/record/version/tree?${stringify(params)}`);
 }
 //查询业务节点的审核记录
 export async function queryAuditExcel(params){
   return request(`/api/v1/purchase/audit/excel?${stringify(params)}`);
 }
+//查询审批节点的审核记录
+export async function queryAuditRecord(params){
+  return request(`/api/v1/purchase/audit/record?${stringify(params)}`);
+}
 /**
  * 查看项目流程列表
  * project_id