|
@@ -1,30 +1,43 @@
|
|
|
-import React, { useEffect, useState, useRef, useMemo } from 'react';
|
|
|
+import React, { useEffect, useState, useRef, useMemo, memo } from 'react';
|
|
|
import { Modal, Input, Select, List, Row, Col, Table, message, Steps, Space, Button } from 'antd';
|
|
|
import Flow from '@/components/Flow/index';
|
|
|
import { connect } from 'dva';
|
|
|
import { GetTokenFromUrl, getToken } from '@/utils/utils';
|
|
|
import { MODELS, useXFlowApp, useModelAsync } from '@antv/xflow';
|
|
|
import { CheckOutlined } from '@ant-design/icons';
|
|
|
-import { queryVserionByNode } from '@/services/boom';
|
|
|
+import { queryRecordSheet, queryVserionByNode } from '@/services/boom';
|
|
|
import { async } from '@antv/x6/lib/registry/marker/async';
|
|
|
+import VersionModal from './VersionModal';
|
|
|
const { Step } = Steps;
|
|
|
|
|
|
const { TextArea } = Input;
|
|
|
const localData = JSON.parse(localStorage.ggDetaiData || '{}');
|
|
|
-const PAGE_SIZE = 8
|
|
|
+const PAGE_SIZE = 8;
|
|
|
|
|
|
// 提交
|
|
|
function FlowModal(props) {
|
|
|
- const { visible, version, onClose, onChangeVersion, form, loading, flowDetail, dispatch } = props;
|
|
|
+ const {
|
|
|
+ visible,
|
|
|
+ version,
|
|
|
+ onClose,
|
|
|
+ onChangeVersion,
|
|
|
+ form,
|
|
|
+ loading,
|
|
|
+ flowDetail,
|
|
|
+ dispatch,
|
|
|
+ isOut,
|
|
|
+ onCommit,
|
|
|
+ } = props;
|
|
|
const [data, setData] = useState([]);
|
|
|
const [nodeLoading, setNodeLoading] = useState(false);
|
|
|
- const [pageSize, setPageSize] = useState(PAGE_SIZE)
|
|
|
- const [stepsData, setStepsData] = useState([])
|
|
|
- // const app = useXFlowApp();
|
|
|
- // const appRef = userRef()
|
|
|
+ const [pageSize, setPageSize] = useState(PAGE_SIZE);
|
|
|
+ const [stepsData, setStepsData] = useState([]);
|
|
|
+ const [versionVisible, setVersionVisible] = useState(false);
|
|
|
+ let token = getToken();
|
|
|
|
|
|
const graphData = useMemo(() => {
|
|
|
- let nodes = flowDetail.nodes.map(item => ({
|
|
|
+ if (!flowDetail) return;
|
|
|
+ let nodes = flowDetail.nodes?.map(item => ({
|
|
|
...item,
|
|
|
isCheck: item.Id == version.template_node_id,
|
|
|
}));
|
|
@@ -35,16 +48,16 @@ function FlowModal(props) {
|
|
|
}, [flowDetail, version.template_node_id]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
- if(!visible) updateSteps([]);
|
|
|
- }, [visible, version])
|
|
|
+ if (!visible) updateSteps([]);
|
|
|
+ }, [visible, version]);
|
|
|
|
|
|
- useEffect(()=>{
|
|
|
- if(stepsData.length <= 0){
|
|
|
+ useEffect(() => {
|
|
|
+ if (stepsData.length <= 0) {
|
|
|
setPageSize(PAGE_SIZE);
|
|
|
- }else{
|
|
|
- setPageSize(PAGE_SIZE - stepsData.length)
|
|
|
+ } else {
|
|
|
+ setPageSize(PAGE_SIZE - stepsData.length);
|
|
|
}
|
|
|
- },[stepsData])
|
|
|
+ }, [stepsData]);
|
|
|
|
|
|
const handleSelectNode = async args => {
|
|
|
let res;
|
|
@@ -53,21 +66,23 @@ 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 = [];
|
|
|
- res.data.excel_version_tree.map(arr => {
|
|
|
+ if (!res.data.excel_version_tree) setData([]);
|
|
|
+ res.data.excel_version_tree?.map(arr => {
|
|
|
if (res.data.flow_id) {
|
|
|
- data = [...data, {...arr, flow_id:res.data.flow_id}];
|
|
|
+ data = [...data, { ...arr, flow_id: res.data.flow_id }];
|
|
|
} else {
|
|
|
data = [...data, arr];
|
|
|
}
|
|
|
});
|
|
|
- data.sort((a,b) => a.id - b.id)
|
|
|
- data.forEach((item, id)=>{
|
|
|
+ data.sort((a, b) => a.id - b.id);
|
|
|
+ data.forEach((item, id) => {
|
|
|
//解决key报错问题
|
|
|
- data[id].key=`${id}-${item.name}`;
|
|
|
+ data[id].key = `${id}-${item.name}`;
|
|
|
item.isParent = true;
|
|
|
- })
|
|
|
+ });
|
|
|
+ console.log(data);
|
|
|
setData(data);
|
|
|
} catch (error) {
|
|
|
console.log(error);
|
|
@@ -78,39 +93,39 @@ function FlowModal(props) {
|
|
|
|
|
|
const updateSteps = (data, curNodeId) => {
|
|
|
let newData = [];
|
|
|
- let set = new Set()
|
|
|
- data.forEach(item=>set.add(item.template_node_id));
|
|
|
+ let set = new Set();
|
|
|
+ data.forEach(item => set.add(item.template_node_id));
|
|
|
let list = [...set];
|
|
|
- if(set.has(curNodeId)){
|
|
|
+ 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
|
|
|
+ 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 = {
|
|
|
+ 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,
|
|
|
+ current: curid,
|
|
|
list: itemDataList[0].FlowInfo.FlowNodes,
|
|
|
name: curNode?.label || itemDataList[0].FlowInfo.name,
|
|
|
- }
|
|
|
+ };
|
|
|
itemDataList.forEach((itemData, idx) => {
|
|
|
- if(idx >= obj.list.length) return;
|
|
|
+ if (idx >= obj.list.length) return;
|
|
|
obj.list[idx].auditor = itemData.AuthorInfo.CName;
|
|
|
- })
|
|
|
- return obj
|
|
|
- })
|
|
|
- setStepsData(dataList)
|
|
|
+ });
|
|
|
+ return obj;
|
|
|
+ });
|
|
|
+ setStepsData(dataList);
|
|
|
};
|
|
|
|
|
|
- const handleChangeClick = (item) => {
|
|
|
- let type = item.flow_id ? 'detail/queryAuditRecord' : 'detail/queryAuditExcel'
|
|
|
+ const handleChangeClick = item => {
|
|
|
+ let type = item.flow_id ? 'detail/queryAuditRecord' : 'detail/queryAuditExcel';
|
|
|
dispatch({
|
|
|
type,
|
|
|
payload: {
|
|
@@ -121,7 +136,8 @@ function FlowModal(props) {
|
|
|
updateSteps(res, item.template_node_id);
|
|
|
},
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
+
|
|
|
const columns = useMemo(() => {
|
|
|
return [
|
|
|
{
|
|
@@ -130,7 +146,9 @@ function FlowModal(props) {
|
|
|
render: item => (
|
|
|
<span style={{ color: item.audit_status != 0 ? '#9b9b9b' : '' }}>
|
|
|
{item.id == version.id && <CheckOutlined style={{ marginRight: 10 }} />}
|
|
|
- {item.version_no && !item.isParent ? `${item.version_name}.${item.version_no}` : item.version_name}
|
|
|
+ {item.version_no && !item.isParent
|
|
|
+ ? `${item.version_name}.${item.version_no}`
|
|
|
+ : item.version_name}
|
|
|
</span>
|
|
|
),
|
|
|
},
|
|
@@ -138,7 +156,7 @@ function FlowModal(props) {
|
|
|
title: '状态',
|
|
|
width: '30%',
|
|
|
render: item => {
|
|
|
- let style = { color: getColor(item) };
|
|
|
+ let style = { color: getColor(item) };
|
|
|
let txt = '';
|
|
|
switch (item.audit_status) {
|
|
|
case 0:
|
|
@@ -157,10 +175,12 @@ function FlowModal(props) {
|
|
|
txt = '已提交';
|
|
|
break;
|
|
|
}
|
|
|
- if(item.status == 1) txt = '已失效';
|
|
|
- return item.audit_status != 0 ?
|
|
|
- <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>
|
|
|
+ );
|
|
|
},
|
|
|
},
|
|
|
{
|
|
@@ -183,41 +203,71 @@ function FlowModal(props) {
|
|
|
|
|
|
const onChange = () => {
|
|
|
updateSteps([]);
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
return (
|
|
|
- <Modal
|
|
|
- confirmLoading={loading}
|
|
|
- destroyOnClose
|
|
|
- title="流程图"
|
|
|
- visible={visible}
|
|
|
- onCancel={onClose}
|
|
|
- footer={false}
|
|
|
- width="98%"
|
|
|
- >
|
|
|
- <Row gutter={8}>
|
|
|
- <Col span={16}>
|
|
|
- <Flow meta={{ type: 'view' }} flowDetail={graphData} onSelectNode={handleSelectNode} />
|
|
|
- </Col>
|
|
|
- <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>
|
|
|
- {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>
|
|
|
+ <>
|
|
|
+ <Modal
|
|
|
+ confirmLoading={loading}
|
|
|
+ destroyOnClose
|
|
|
+ title="流程图"
|
|
|
+ visible={visible}
|
|
|
+ onCancel={onClose}
|
|
|
+ footer={false}
|
|
|
+ width="98%"
|
|
|
+ >
|
|
|
+ <Row gutter={8}>
|
|
|
+ <Col span={16}>
|
|
|
+ <Flow meta={{ type: 'view' }} flowDetail={graphData} onSelectNode={handleSelectNode} />
|
|
|
+ </Col>
|
|
|
+ <Col span={8}>
|
|
|
+ {isOut && data.length == 1 && !data[0].children && (
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ style={{ float: 'right', marginBottom: '10px' }}
|
|
|
+ onClick={() => setVersionVisible(true)}
|
|
|
+ >
|
|
|
+ 新建清单
|
|
|
+ </Button>
|
|
|
+ )}
|
|
|
+ <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>
|
|
|
+ {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>
|
|
|
+ <VersionModal
|
|
|
+ // loading={getLoading()}
|
|
|
+ visible={versionVisible}
|
|
|
+ onClose={() => setVersionVisible(false)}
|
|
|
+ onOk={values => {
|
|
|
+ onCommit?.(values);
|
|
|
+ setVersionVisible(false);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </>
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -243,6 +293,7 @@ const getColor = item => {
|
|
|
return color;
|
|
|
};
|
|
|
|
|
|
-export default connect(({ xflow, detail }) => ({
|
|
|
- flowDetail: xflow.flowDetail,
|
|
|
-}))(FlowModal);
|
|
|
+// export default connect(({ xflow, detail }) => ({
|
|
|
+// flowDetail: xflow.flowDetail,
|
|
|
+// }))(FlowModal);
|
|
|
+export default FlowModal;
|