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, } 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'; 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', }; 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 [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); 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 => { if (controller) { // 中止上一次请求 controller.abort(); } try { 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 => ( {item.id == version.id && !item.isParent && ( )} {item.version_no && !item.children?.length ? `${item.version_name}.${item.version_no}` : item.version_name} ), }, { title: '创建人', width: '15%', render: item => { return ( item.isParent && ( {userList.find(cur => cur.ID == item.author)?.CName || '-'} ) ); }, }, { title: '分类', width: '15%', render: item => { return ( item.isParent && ( {typeOptions.find(cur => cur.id == item.classify_id)?.name} ) ); }, }, { title: '状态', width: '15%', render: item => { if (!item.flow_id && item.isParent) return; let style = { color: getColor(item) }; let txt = ''; let dom = ''; switch (item.audit_status) { case 0: txt = '未提交'; break; case 1: txt = '待审批'; break; case 2: txt = '已拒绝'; break; case 3: txt = '已通过'; break; case 4: txt = '已提交'; break; } if (item.status == 1) txt = '已失效'; // 显示拒绝原因 if (item.audit_comment) { dom = ( {txt} ); } else { dom = txt; } return item.audit_status != 0 ? ( ) : ( {dom} ); }, }, { title: '印章申请', width: '15%', render: item => { if (!item.flow_id && item.isParent) return; let txt = ''; //申请印章成功 1 默认0 失败2 switch (item.is_seal_succeed) { case 0: txt = '-'; break; case 1: txt = '成功'; break; case 2: txt = '失败'; break; } return ( {txt} {item.is_seal_succeed == 2 && handleRetryClick(item.id)}>重试} ); }, }, { title: '操作', width: '20%', render: item => (item.flow_id || !item.isParent) && item.id != version.id && ( { console.log(item); onChangeVersion(item); onClose(); }} > 加载 {item.audit_status == 0 && item.author == currentUser.ID && ( //自己创建的&&未提交的清单自己可以删除 { onDelVersion({ excel_id: item.id }); }} > 删除 )} ), }, ]; }, [version]); const handleRetryClick = async id => { setNodeLoading(true); const res = await queryTrySeal({ excel_id: id }); setNodeLoading(false); if (res.data?.errcode != 0) { message.error(res.data?.errmsg); } else { message.success('用印成功'); if (currentTempNodeId.current) initData(currentTempNodeId.current); } }; const onChange = value => { updateSteps([]); }; useEffect(() => { if (!inputValue) { setShowData(data); return; } let resultData = [...data]; switch (selectType) { case SELECT_TYPE.NAME: resultData = data.filter(item => item.version_name.includes(inputValue)); break; case SELECT_TYPE.TYPE: resultData = data.filter(item => item.classify_id == inputValue); break; case SELECT_TYPE.CREATOR: resultData = data.filter(item => item.AuthorInfo?.CName.includes(inputValue)); break; } setShowData(resultData); }, [inputValue, data]); return ( <> { setSelectType(SELECT_TYPE.NAME); setInputValue(''); onClose(); }} footer={false} width="98%" // bodyStyle={{ maxHeight: '660px', overflow: 'auto' }} >
清单列表
{selectType != SELECT_TYPE.TYPE && ( setInputValue(e.target.value)} /> )} {selectType == SELECT_TYPE.TYPE && (