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,
Steps,
Popover,
Upload,
Table,
Divider,
Collapse,
} from 'antd';
import { PlusOutlined, UploadOutlined } from '@ant-design/icons';
import { connect } from 'dva';
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';
import AuditFlow from './AuditFlow';
import {
queryDingSchema,
queryGetBomForm,
queryProcessFlows,
querySaveBomForm,
} from '@/services/boom';
import { Form as Form3x } from '@ant-design/compatible';
import { getCurrentUser } from '@/utils/authority';
import DDCode from '@/components/DDComponents/DDCode';
import { uploadFile, queryUserListByRoleID } from '@/services/boom';
import ApprovalProcess from './ApprovalProcess';
import { uuidv4 } from '@antv/xflow';
import AliyunOSSUpload from '@/components/OssUpload/AliyunOssUploader';
import AttachmentTable from '@/components/AttachmentTable';
import { getToken } from '@/utils/utils';
import LuckyExcel from 'luckyexcel';
const { TextArea } = Input;
const { Option } = Select;
const { TabPane } = Tabs;
const { Step } = Steps;
// 提交
function CommitAuditModal(props) {
const {
dispatch,
visible,
onClose,
// loading,
version,
versionList,
flowDetail,
currentUser,
luckysheet,
userList,
templateId,
OSSData,
} = props;
// console.log(loading);
const [auditId, setAuditId] = useState();
const [data, setData] = useState([]);
const [length, setLength] = useState(1);
const [formData, setFromData] = useState({});
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);
const [dataSource, setDataSource] = useState([]);
const [loading, setLoading] = useState(false);
const uploadList = useRef([]);
useEffect(() => {
if (!visible) return;
const { edges, nodes } = flowDetail;
// initFormList().then(approvalProcess => {
let Id = version.template_node_id;
const currentId = flowDetail.nodes.find?.(item => item.Id == Id)?.node_id;
const data = treeData(currentId);
console.log('===============审批节点======', data);
const nextNodes = getNextNodes(currentId, 'custom-rect');
if (data.length <= 0 || nextNodes.length > 0) {
setAuditId(currentId);
} else {
let defaultValues = {};
if (data.length == 1) {
let value = getDataValue(data[0]);
defaultValues[`circle`] = value;
} else {
data.forEach((item, index) => {
let value = getDataValue(item);
defaultValues[`circle${index}`] = value;
});
}
// 设置延迟,等待组件渲染
setTimeout(async () => {
form.setFieldsValue(defaultValues);
const approvalProcess = await initFormList();
Object.values(defaultValues).forEach(value => onChange(value, approvalProcess || {}));
}, 200);
}
setData(data);
// });
}, [version.template_node_id, visible]);
useEffect(() => {
if (!visible) return;
dispatch({
type: 'detail/getChartOSSData',
payload: {
projectId: version.project_id,
},
});
}, [visible]);
useEffect(() => {
form.resetFields();
setAuditList([]);
}, [visible]);
// const OnModelFileDone = file => {
// var path = OSSData.host + '/' + file.url;
// uploadList.current = [...uploadList.current, path];
// console.log(uploadList.current);
// };
const setUploadList = files => {
uploadList.current = files.map(file => OSSData.host + '/' + file.url);
console.log(uploadList.current);
};
const OnUploading = file => {};
const uploadProps = {
OSSData: OSSData,
// onDone: OnModelFileDone,
onUploading: OnUploading,
noStyle: false,
onChange: setUploadList,
// showUploadList: false,
};
const initFormList = async () => {
const res = await queryGetBomForm({
project_id: version.project_id,
node_id: version.template_node_id,
});
if (res.data) {
const formList = JSON.parse(res.data.json);
setApprovalProcess(formList.approvalProcess || {});
return formList.approvalProcess;
// setFormComponentValues(defaultFormData);
}
};
const treeData = currentId => {
const list = getNextNodes(currentId, 'custom-circle');
const fun = nodes => {
const re = nodes?.forEach((item, idx) => {
const data = getNextNodes(item.Id, 'custom-circle');
if (data || data.length > 0) list.push(...data);
fun(data);
});
};
fun(list);
const fun2 = list => {
const parents = list.filter(item => list.findIndex(node => node.Id == item.parentId) == -1);
let translator = (parents, children) => {
setLength(length + 1);
parents.forEach(parent => {
children.forEach((current, index) => {
if (current.parentId === parent.Id) {
let temp = JSON.parse(JSON.stringify(children));
temp.splice(index, 1);
translator([current], temp);
if (!parent.children.find(item => item.Id == current.Id))
parent.children.push(current);
}
});
});
};
translator(parents, list);
return parents;
};
return fun2(list);
};
const currentNodeId = useMemo(() => {
let Id = version.template_node_id;
setAuditId(currentNodeId);
return flowDetail.nodes.find?.(item => item.Id == Id)?.node_id;
}, [flowDetail, version]);
/**
*
* @param {*} currentId 当前节点
* @param {*} type 下一个节点的类型 custom-circle: 审批节点 custom-rect: 业务节点
* @returns
*/
const getNextNodes = (currentId, type) => {
const { edges, nodes } = flowDetail;
if (!currentId) return [];
//删除虚线通向的节点
// let targetIds = edges
// .filter(edge => {
// let line = edge.attrs?.line?.strokeDasharray?.split(' ');
// return edge.source.cell == currentId && line && line[0] == '0';
// })
// .map(item => item.target.cell);
console.log(
'---------',
edges.filter(edge => edge.source.cell == currentId)
);
let targetIds = edges
.filter(edge => edge.source.cell == currentId)
.map(item => item.target.cell);
edges.filter(edge => edge.source.cell == currentId);
let auditNodes = nodes.filter(node => {
if (type && node.name != type) {
return false;
}
return targetIds.indexOf(node.id) != -1;
});
const result = auditNodes.map(item => {
return {
label: item.label,
value: item.Id,
Id: item.node_id,
parentId: currentId,
children: [],
};
});
return result || [];
};
const nextNodesList = useMemo(() => {
if (!auditId && !currentNodeId) return [];
return getNextNodes(auditId || currentNodeId, 'custom-rect');
}, [auditId, currentNodeId, flowDetail]);
const changeAudit = id => {
let node = flowDetail.nodes.find?.(item => item.Id == id);
setAuditId(node?.node_id);
};
const onChange = (value) => {
if (value) {
changeAudit(value[value.length - 1]);
setAuditListFun(approvalProcess);
} else {
changeAudit('');
setAuditList([]);
setApprovalProcess({});
}
form.setFieldValue('next_template_node_id', '');
};
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,
};
dispatch({
type: 'detail/advanceSubmitNextNode',
payload: params, //values,
callback: data => {
if (data) {
setApprovalProcess(data);
}
},
});
};
//处理tabs页
const setAuditListFun = async (approvalProcess = {}) => {
var fieldsValue = await form.validateFields();
let addAuditList = [];
let result = Object.values(fieldsValue)
.map(item => {
if (item && Array.isArray(item)) return item;
})
.filter(item => item)
.flat(Infinity);
let nodeList = [...new Set(result)]
.map(Id => {
return flowDetail.nodes.find?.(item => item.Id == Id);
})
.filter(item => item);
let flowIds = [...new Set(nodeList.map(item => item.flow_id))].join(',');
let data = await queryProcessFlows({ ids: flowIds });
if (data && data?.length > 0) {
let newlist = nodeList.map(node => {
let curData = data.find(item => item.id == node.flow_id);
let newItem = {
name: curData?.name,
nodeId: node.Id,
items: JSON.parse(curData.form_json || '[]'),
};
return newItem;
});
addAuditList = [...addAuditList, ...newlist];
}
addAuditList.forEach((item, index) => {
let Components = Form3x.create({
onValuesChange: (props, changedValues, allValues) => {
const { items } = props;
formComponentValues[item.nodeId] = items
.map(item => {
const itemProps = item.props;
let val = allValues[itemProps.id];
if (!itemProps.label || val === '') return;
if (val instanceof Object) {
return {
name: itemProps.label,
id: itemProps.id,
value: [...val],
};
} else if (allValues[itemProps.id]) {
return {
name: itemProps.label,
id: itemProps.id,
value: [allValues[itemProps.id]] || undefined,
};
}
})
.filter(item => item);
if (getReComputeAudit(items, changedValues)) advanceSubmit();
setFormComponentValues({ ...formComponentValues });
},
})(AuditDetailed);
item.FormComponents =