import React, {useEffect, useState, useRef, useMemo, memo} from 'react';
import {
Modal,
Input,
Select,
List,
Row,
Col,
Table,
message,
Steps,
Space,
Button,
Popover,
Cascader,
AutoComplete,
Spin,
Tooltip,
} 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 {
queryDelPurchaseExcel, queryDingInstanceDetail, queryRecordSheet, queryTrySeal, queryVserionByNode,
} from '@/services/boom';
import {async} from '@antv/x6/lib/registry/marker/async';
import VersionModal from './VersionModal';
import styles from './Index.less'
const {Option} = Select;
const {Step} = Steps;
const {TextArea} = Input;
const localData = JSON.parse(localStorage.ggDetaiData || '{}');
const PAGE_SIZE = 8;
let controller = new AbortController();
// 提交
function FlowModal(props) {
let token = getToken();
const SELECT_TYPE = {
NAME: '0', TYPE: '1', CREATOR: '2', STATE: '3',
};
const {
visible,
version,
onClose,
onChangeVersion,
form,
loading,
flowDetail,
dispatch,
isOut,
onCommit,
commitLoading,
currentUser,
typeOptions,
userList,
versionList,
templateId,
} = props;
const [data, setData] = useState([]);
const [showData, setShowData] = useState([]);
const [nodeLoading, setNodeLoading] = useState(false);
const [pageSize, setPageSize] = useState(PAGE_SIZE);
const [stepsData, setStepsData] = useState([]);
const [versionVisible, setVersionVisible] = useState(false);
const [selectType, setSelectType] = useState(SELECT_TYPE.NAME);
const [inputValue, setInputValue] = useState();
const [expandedRowKey, setExpandedRowKey] = useState([])
const [sealLoading, setSealLoading] = useState(false);
// const [currentTempNodeId, setCurrentTempNodeId] = useState();
const currentTempNodeId = useRef();
const graphData = useMemo(() => {
if (!flowDetail) return;
let nodes = flowDetail.nodes?.map(item => ({
...item, isCheck: item.Id == version.template_node_id,
}));
return {
nodes, edges: flowDetail.edges,
};
}, [flowDetail, version.template_node_id]);
useEffect(() => {
if (!visible) updateSteps([]);
}, [visible, version]);
useEffect(() => {
if (stepsData.length <= 0) {
setPageSize(PAGE_SIZE);
} else {
setPageSize(PAGE_SIZE - stepsData.length);
}
}, [stepsData]);
const handleSelectNode = args => {
const id = args.nodeId || args.nodeIds[0];
if (!id) return;
let node = graphData.nodes.find(item => item.id == id);
//清除上次的筛选条件
clearSelected();
initData(node.Id);
};
const onDelVersion = data => {
Modal.confirm({
title: '提示', content: `是否确认删除清单?`, okText: '确定', cancelText: '取消', onOk: async () => {
const res = await queryDelPurchaseExcel(data);
if (res.code == 200) {
message.success('删除成功');
dispatch({
type: 'xflow/queryBoomFlowDetail', payload: {
id: templateId,
},
});
}
},
});
};
const initData = async template_node_id => {
try {
if (controller) {
// 中止上一次请求
controller.abort();
}
setNodeLoading(true);
controller = new AbortController();
const res = await queryVserionByNode({
template_node_id: template_node_id,
}, controller.signal);
controller = null;
let data = [];
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}];
} else {
data = [...data, arr];
}
});
data.sort((a, b) => b.id - a.id);
data.forEach((item, id) => {
//解决key报错问题
data[id].key = `${id}-${item.name}`;
item.isParent = true;
});
// console.log(data);
currentTempNodeId.current = template_node_id;
setData(data);
} catch (error) {
// console.log(error);
}
setNodeLoading(false);
updateSteps([]);
};
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 = 0;
let status = 'process';
itemDataList.forEach(item => {
if (item.audit_status == 3) curid++;
if (item.audit_status == 2) status = 'error';
});
let curNode = flowDetail.nodes.find(item => item.Id == itemDataList[0].template_node_id);
const seqList = itemDataList[0].FlowInfo.FlowNodes.filter(item => item.template_node_id == template_node_id).sort((a, b) => a.seq - b.seq);
let obj = {
status, current: curid, list: seqList, name: curNode?.label || itemDataList[0].FlowInfo.name,
};
return obj;
});
setStepsData(dataList);
};
const handleChangeClick = item => {
let file = isOut ? 'list' : 'detail';
let type = item.flow_id ? '/queryAuditRecord' : '/queryAuditExcel';
// console.log(`${file}${type}`, item);
dispatch({
type: `${file}${type}`, payload: {
excel_id: item.id, pageSize: 100,
}, callback: res => {
updateSteps(res, item.template_node_id);
},
});
};
const columns = useMemo(() => {
return [{
title: '名称', width: '20%', render: item => {
return (<>
{(item.id == version.id && !item.isParent) && (