|
@@ -1,1175 +0,0 @@
|
|
|
-import React, { useEffect, useState, useRef, useMemo } from 'react';
|
|
|
-import { UnorderedListOutlined, PlusOutlined } from '@ant-design/icons';
|
|
|
-import { Button, Modal, message, Alert, Avatar, Spin, Select, Menu, Dropdown } from 'antd';
|
|
|
-import { connect } from 'dva';
|
|
|
-import styles from './Index.less';
|
|
|
-import LuckySheet from './LuckySheet';
|
|
|
-import router from 'umi/router';
|
|
|
-import AuditModal from './AuditModal';
|
|
|
-// import CommentDrawer from './CommentDrawer';
|
|
|
-import RightDrawer from './RightDrawer';
|
|
|
-import CommitModal from './CommitModal';
|
|
|
-import CompareModal from './CompareModal';
|
|
|
-import ExportModal from './ExportModal';
|
|
|
-import FlowModal from './FlowModal';
|
|
|
-import HistoryModal from './HistoryModal';
|
|
|
-import TimeNode from './TimeNode';
|
|
|
-import FilesModal from './FilesModal';
|
|
|
-import VersionModal from './VersionModal';
|
|
|
-import CommitAuditModal from './CommitAuditModal';
|
|
|
-import CommentContent from '@/components/CommentContent';
|
|
|
-import MergeModal from './MergeModal';
|
|
|
-import { GetTokenFromUrl, getToken } from '@/utils/utils';
|
|
|
-import { queryDetail, queryDingInstanceExecute } from '@/services/boom';
|
|
|
-import HistoryDrawer from './HistoryDrawer';
|
|
|
-import AuditFlow from './AuditFlow';
|
|
|
-import { getCurrentUser } from '@/utils/authority';
|
|
|
-import { async } from '@antv/x6/es/registry/marker/async';
|
|
|
-const LocalData = localStorage.luckysheet;
|
|
|
-
|
|
|
-const { Option } = Select;
|
|
|
-
|
|
|
-function Detail(props) {
|
|
|
- const {
|
|
|
- dispatch,
|
|
|
- comment,
|
|
|
- history,
|
|
|
- loading,
|
|
|
- currentUser,
|
|
|
- fileList,
|
|
|
- roleList,
|
|
|
- template,
|
|
|
- versionList,
|
|
|
- auditList,
|
|
|
- flowDetail,
|
|
|
- versionTree,
|
|
|
- match: { params },
|
|
|
- instanceDetail,
|
|
|
- } = props;
|
|
|
- const [versionTreeVisible, setVersionTreeVisible] = useState(false);
|
|
|
- const [commentVisible, setCommentVisible] = useState(false);
|
|
|
- const [mergeVisible, setMergeVisible] = useState(false);
|
|
|
- const [compareVisible, setCompareVisible] = useState(false);
|
|
|
- const [exportVisible, setExportVisible] = useState(false);
|
|
|
- const [commitVisible, setCommitVisible] = useState(false);
|
|
|
- const [auditVisible, setAuditVisible] = useState(false);
|
|
|
- const [flowVisible, setFlowVisible] = useState(false);
|
|
|
- const [versionVisible, setVersionVisible] = useState(false);
|
|
|
- const [commitAuditVisible, setCommitAuditVisible] = useState(false);
|
|
|
- const [sheet, setSheet] = useState({});
|
|
|
- const [compareList, setCompareList] = useState([]);
|
|
|
- const [edit, setEdit] = useState(false);
|
|
|
- const [isMerge, setIsMerge] = useState(false);
|
|
|
- const [version, setVersion] = useState({});
|
|
|
- const [user, setUser] = useState([]);
|
|
|
- const [updateCount, setUpdateCount] = useState({
|
|
|
- diff: 0,
|
|
|
- add: 0,
|
|
|
- });
|
|
|
- const [fileVisible, setFileVisible] = useState(false);
|
|
|
- const [exportDate, setExportData] = useState([]);
|
|
|
- const sheetRef = useRef();
|
|
|
- const sheetRef2 = useRef();
|
|
|
- const sheetRef3 = useRef();
|
|
|
- const fileRef = useRef();
|
|
|
- const userRef = useRef();
|
|
|
- const statusRef = useRef({
|
|
|
- edit: false,
|
|
|
- compare: false,
|
|
|
- });
|
|
|
- const cellPosition = useRef({});
|
|
|
-
|
|
|
- const projectId = parseInt(params.projectId);
|
|
|
- const templateId = parseInt(params.templateId);
|
|
|
-
|
|
|
- const auditDetail = useMemo(() => {
|
|
|
- let data = {
|
|
|
- processCode: '',
|
|
|
- deptId: '14169890',
|
|
|
- tasks: [],
|
|
|
- // userId: '16569001414345099',
|
|
|
- // deptId: currentUser.DingDepId || getCurrentUser()?.DingDepId,
|
|
|
- userId: currentUser.DingUserId || getCurrentUser()?.DingUserId,
|
|
|
- formComponentValues: [],
|
|
|
- activityId: '',
|
|
|
- cc_userids: [],
|
|
|
- status: version.audit_status,
|
|
|
- };
|
|
|
- if (version?.flow_id && instanceDetail?.tasks && instanceDetail.tasks?.length > 0) {
|
|
|
- let item = flowDetail.nodes.find(item => item.Id == version.template_node_id);
|
|
|
- if (!item) return data;
|
|
|
- const { tasks, form_component_values, cc_userids } = instanceDetail;
|
|
|
- data.processCode = item.process_code;
|
|
|
- data.activityId = tasks[tasks.length - 1]?.activity_id;
|
|
|
- data.tasks = tasks || [];
|
|
|
- data.cc_userids = cc_userids;
|
|
|
- data.formComponentValues = form_component_values?.filter(item => item.name);
|
|
|
- if (version.status == 1) data.status = -1;
|
|
|
- }
|
|
|
- return data;
|
|
|
- }, [instanceDetail, version]);
|
|
|
-
|
|
|
- const flow = useMemo(() => {
|
|
|
- let data = {
|
|
|
- active: 0,
|
|
|
- active_id: null,
|
|
|
- current: 0,
|
|
|
- currentNode: {},
|
|
|
- list: {
|
|
|
- FlowNodes: [],
|
|
|
- },
|
|
|
- };
|
|
|
- if (version?.flow_id && auditList?.length > 0) {
|
|
|
- let item = auditList.find(item => item.list.id == version.flow_id);
|
|
|
- if (!item) return data;
|
|
|
- // 查询当前节点
|
|
|
- let current = item.list.FlowNodes.findIndex(node => node.seq == item.active);
|
|
|
- item.current = current == -1 ? 0 : current;
|
|
|
- // 保存当前所处节点
|
|
|
- item.currentNode = item.list.FlowNodes[item.current];
|
|
|
- data = item;
|
|
|
- }
|
|
|
- return data;
|
|
|
- }, [auditList, version]);
|
|
|
- const active_audit = flow.active_audit;
|
|
|
- console.log(flow);
|
|
|
- const isAuditor = useMemo(() => {
|
|
|
- const getUserRole = () => {
|
|
|
- return flow.currentNode.auditor == currentUser.ID;
|
|
|
- // let roleID = flow.currentNode?.AuditRoleInfo?.ID;
|
|
|
- // let item = currentUser.roleList.find(role => role.ID == roleID);
|
|
|
- // if (item) return true;
|
|
|
- // return false;
|
|
|
- };
|
|
|
- return active_audit == 1 && getUserRole();
|
|
|
- }, [active_audit, flow, currentUser]);
|
|
|
-
|
|
|
- const onSave = () => {
|
|
|
- let sheet1 = compareList[0];
|
|
|
- Modal.confirm({
|
|
|
- title: '提示',
|
|
|
- content: `是否确认保存【${sheet1.version_name || sheet1.name}】`,
|
|
|
- okText: '确定',
|
|
|
- cancelText: '取消',
|
|
|
- onOk() {
|
|
|
- let sheetData = sheetRef3.current.getSheetJson().data;
|
|
|
- sheetData.forEach(sheet => {
|
|
|
- delete sheet.data;
|
|
|
- });
|
|
|
- let params = {
|
|
|
- ...sheet1,
|
|
|
- data: JSON.stringify(sheetData),
|
|
|
- };
|
|
|
- dispatch({
|
|
|
- type: 'detail/commitSheet',
|
|
|
- payload: params,
|
|
|
- callback: () => {
|
|
|
- onCompare(false);
|
|
|
- },
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onCompare = async checkSheets => {
|
|
|
- if (checkSheets) {
|
|
|
- const [sheet1, sheet2] = checkSheets;
|
|
|
- sheet1.data = (
|
|
|
- await queryDetail({
|
|
|
- excel_id: sheet1.id,
|
|
|
- })
|
|
|
- ).data;
|
|
|
- sheet2.data = (
|
|
|
- await queryDetail({
|
|
|
- excel_id: sheet2.id,
|
|
|
- })
|
|
|
- ).data;
|
|
|
-
|
|
|
- setCompareList(checkSheets);
|
|
|
- statusRef.current.compare = true;
|
|
|
- } else {
|
|
|
- let index = compareList.findIndex(item => item.id == sheet.id);
|
|
|
- // 退出比对模式
|
|
|
- if (index == 0) {
|
|
|
- sheetRef3.current.toggleCompare(false);
|
|
|
- } else if (index == 1) {
|
|
|
- sheetRef2.current.toggleCompare(false);
|
|
|
- }
|
|
|
-
|
|
|
- setIsMerge(false);
|
|
|
- setCompareList([]);
|
|
|
- setSheet({
|
|
|
- ...sheet,
|
|
|
- });
|
|
|
- setUpdateCount({
|
|
|
- diff: 0,
|
|
|
- add: 0,
|
|
|
- });
|
|
|
- statusRef.current.compare = false;
|
|
|
- }
|
|
|
- setCommentVisible(false);
|
|
|
- };
|
|
|
-
|
|
|
- const renderSheetDom = (item, index) => {
|
|
|
- return (
|
|
|
- <div key={item?.id || 'temp'} className={styles.sheetItem}>
|
|
|
- <h3>{item.version_name || item?.name}</h3>
|
|
|
- <LuckySheet
|
|
|
- className={styles.sheet}
|
|
|
- ref={!index ? sheetRef3 : sheetRef2}
|
|
|
- data={item.data || null}
|
|
|
- // onClickCell={onClickCell}
|
|
|
- />
|
|
|
- </div>
|
|
|
- );
|
|
|
- };
|
|
|
-
|
|
|
- const onClickCell = (cell, position, s) => {
|
|
|
- console.log(cell);
|
|
|
- if (cell?.cid && !statusRef.current.edit) {
|
|
|
- let payload = {
|
|
|
- sheet_id: s.order || '0',
|
|
|
- excel_id: version.id,
|
|
|
- cid: cell.cid,
|
|
|
- };
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryComment',
|
|
|
- payload,
|
|
|
- });
|
|
|
- cellPosition.current = {
|
|
|
- ...payload,
|
|
|
- sheet_index: (s.seq || 0) + '',
|
|
|
- };
|
|
|
- // setCommentVisible(true);
|
|
|
- }
|
|
|
- // 比对模式下双excl同步选中
|
|
|
- // if (statusRef.current.compare) {
|
|
|
- // sheetRef3.current.selectCell(position.r, position.c, s.order);
|
|
|
- // sheetRef2.current.selectCell(position.r, position.c, s.order);
|
|
|
- // }
|
|
|
- };
|
|
|
-
|
|
|
- const onCommit = (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));
|
|
|
- if (!currentNode.muti_version) {
|
|
|
- // audit_status=4 表示为清单推进后留存的副本.不计入多清单计算
|
|
|
- let serviceVersion = versionList.find(
|
|
|
- item => item.audit_status != 4 && item.template_node_id == currentNode.Id
|
|
|
- );
|
|
|
- if (serviceVersion) {
|
|
|
- message.error(`新建清单失败!业务节点【${currentNode.label}】只能有一个清单!`);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- sheets.forEach(item => {
|
|
|
- delete item.data;
|
|
|
- });
|
|
|
- console.log(sheets);
|
|
|
- let params = {
|
|
|
- ...values,
|
|
|
- id: id,
|
|
|
- project_id: version.project_id,
|
|
|
- name: version.name,
|
|
|
- guid: version.guid,
|
|
|
- template_id: version.template_id,
|
|
|
- template_node_id: version.template_node_id,
|
|
|
- flow_id: version.flow_id,
|
|
|
- node_id: version.node_id,
|
|
|
- new_version: '0',
|
|
|
- audit_status: 0,
|
|
|
- data: JSON.stringify(sheets),
|
|
|
- base_id: version.id,
|
|
|
- };
|
|
|
- dispatch({
|
|
|
- type: 'detail/commitSheet',
|
|
|
- payload: params,
|
|
|
- callback: newVersion => {
|
|
|
- onCompare(false);
|
|
|
- setCommitVisible(false);
|
|
|
- setVersionVisible(false);
|
|
|
- changeVersion(newVersion);
|
|
|
-
|
|
|
- // 更新flow流程图
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onUpdate = () => {
|
|
|
- if (flow.active != 0) return;
|
|
|
- let currentData = sheetRef.current.getSheetJson().data;
|
|
|
- let sheets = JSON.parse(JSON.stringify(currentData));
|
|
|
- sheets.forEach(item => {
|
|
|
- delete item.data;
|
|
|
- });
|
|
|
- console.log(sheets);
|
|
|
- let params = {
|
|
|
- ...version,
|
|
|
- data: JSON.stringify(sheets),
|
|
|
- };
|
|
|
- dispatch({
|
|
|
- type: 'detail/saveSheet',
|
|
|
- payload: params,
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onAudit = ({ audit_comment }) => {
|
|
|
- const flowNode = flow.currentNode;
|
|
|
- dispatch({
|
|
|
- type: 'detail/approve',
|
|
|
- payload: {
|
|
|
- id: flow.active_id,
|
|
|
- project_id: projectId,
|
|
|
- audit_status: 2,
|
|
|
- flow_id: flowNode.flow_id,
|
|
|
- node_id: flowNode.seq,
|
|
|
- audit_comment,
|
|
|
- },
|
|
|
- callback: newVersion => {
|
|
|
- setAuditVisible(false);
|
|
|
- // 更新flow流程图
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
- localStorage.excelId = newVersion.id;
|
|
|
- setVersion({
|
|
|
- ...version,
|
|
|
- flow_id: newVersion.flow_id,
|
|
|
- id: newVersion.id,
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onApprove = flag => {
|
|
|
- if (!flag) {
|
|
|
- setAuditVisible(true);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- 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 (
|
|
|
- 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 表示为清单推进后留存的副本.不计入多清单计算
|
|
|
- isSingle = versionList.find(
|
|
|
- item => item.audit_status != 4 && item.template_node_id == serviceNode.Id
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
- Modal.confirm({
|
|
|
- title: '提示',
|
|
|
- content: isSingle
|
|
|
- ? `节点【${serviceNode.label}】只能拥有一个清单,是否覆盖?`
|
|
|
- : `是否通过审批。`,
|
|
|
- okText: '确定',
|
|
|
- cancelText: '取消',
|
|
|
- onOk: () => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/approve',
|
|
|
- payload: {
|
|
|
- id: flow.active_id,
|
|
|
- project_id: projectId,
|
|
|
- audit_status: 3,
|
|
|
- flow_id: flowNode.flow_id,
|
|
|
- node_id: flowNode.seq,
|
|
|
- },
|
|
|
- callback: newVersion => {
|
|
|
- // 更新flow流程图
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
-
|
|
|
- // 更新审批流
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryAuditList',
|
|
|
- payload: {
|
|
|
- template_id: version.template_id,
|
|
|
- template_node_id: version.template_node_id,
|
|
|
- flow_id: version.flow_id,
|
|
|
- version_id: version.version_id,
|
|
|
- },
|
|
|
- });
|
|
|
- if (flow.current == flow.list.FlowNodes.length - 1) {
|
|
|
- // 最后一个审核节点通过后 需要更新version id 不更不更,留在原地
|
|
|
- // localStorage.excelId = newVersion.id;
|
|
|
- // setVersion({
|
|
|
- // ...version,
|
|
|
- // flow_id: newVersion.flow_id,
|
|
|
- // id: newVersion.id,
|
|
|
- // });
|
|
|
- }
|
|
|
- },
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onApprove1 = (flag, taskId) => {
|
|
|
- const callback = () => {
|
|
|
- // 更新flow流程图
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
-
|
|
|
- // 更新审批流
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryDingInstanceDetail',
|
|
|
- payload: {
|
|
|
- process_instance_id: version.ding_instance_id, //创建表单成功返回的id
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const request = async () => {
|
|
|
- let param = {
|
|
|
- request: {
|
|
|
- process_instance_id: version.ding_instance_id,
|
|
|
- result: flag ? 'agree' : 'refuse',
|
|
|
- actioner_userid: currentUser.DingUserId || getCurrentUser()?.DingUserId,
|
|
|
- task_id: taskId,
|
|
|
- },
|
|
|
- };
|
|
|
- let res = await queryDingInstanceExecute(param);
|
|
|
- if (res?.data?.result) {
|
|
|
- callback();
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- let tipText = '是否通过审批。';
|
|
|
- if (!flag) {
|
|
|
- tipText = '是否拒绝审批。';
|
|
|
- // request();
|
|
|
- // return;
|
|
|
- }
|
|
|
-
|
|
|
- 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 (
|
|
|
- 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 表示为清单推进后留存的副本.不计入多清单计算
|
|
|
- isSingle = versionList.find(
|
|
|
- item => item.audit_status != 4 && item.template_node_id == serviceNode.Id
|
|
|
- );
|
|
|
- if (isSingle) tipText = `节点【${serviceNode.label}】只能拥有一个清单,是否覆盖?`;
|
|
|
- }
|
|
|
- }
|
|
|
- Modal.confirm({
|
|
|
- title: '提示',
|
|
|
- content: tipText,
|
|
|
- okText: '确定',
|
|
|
- cancelText: '取消',
|
|
|
- onOk: () => {
|
|
|
- request();
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onMerge = () => {
|
|
|
- const [sheet1, sheet2] = compareList;
|
|
|
- Modal.confirm({
|
|
|
- title: '提示',
|
|
|
- content: `是否确认将【${sheet2.version_name}】改动的内容同步至【${sheet1.version_name ||
|
|
|
- sheet1.name}】`,
|
|
|
- okText: '确定',
|
|
|
- cancelText: '取消',
|
|
|
- onOk() {
|
|
|
- // let sheet2Data = sheetRef2.current.getSheetJson()
|
|
|
- sheetRef3.current.mergeExcl(sheetRef2.current.updateCell);
|
|
|
- // setCompareList([...compareList]);
|
|
|
- // let currentData = sheetRef3.current.getSheetJson()
|
|
|
- // // 更新后重新比对
|
|
|
- // sheetRef2.current.toggleCompare(false);
|
|
|
- // sheetRef2.current.toggleCompare(true, currentData);
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const onMergeVersion = async sheet2 => {
|
|
|
- // const [sheet1, sheet2] = checkSheets;
|
|
|
- const sheet1 = version;
|
|
|
- if (!sheet1.data) {
|
|
|
- sheet1.data = (
|
|
|
- await queryDetail({
|
|
|
- excel_id: sheet1.id,
|
|
|
- })
|
|
|
- ).data;
|
|
|
- }
|
|
|
- if (!sheet2.data) {
|
|
|
- sheet2.data = (
|
|
|
- await queryDetail({
|
|
|
- excel_id: sheet2.id,
|
|
|
- })
|
|
|
- ).data;
|
|
|
- }
|
|
|
-
|
|
|
- setIsMerge(true);
|
|
|
- setCompareList([sheet1, sheet2]);
|
|
|
- // setTimeout(() => {
|
|
|
- // sheetRef3.current.mergeExcl(sheet.data);
|
|
|
- // }, 400);
|
|
|
- };
|
|
|
-
|
|
|
- const handleClickFile = () => {
|
|
|
- fileRef.current.click();
|
|
|
- };
|
|
|
-
|
|
|
- const handleMenuClick = e => {
|
|
|
- console.log('click', e);
|
|
|
- switch (e.key) {
|
|
|
- case 'back':
|
|
|
- // 返回
|
|
|
- router.push(`/bom`);
|
|
|
- break;
|
|
|
- // case 'version':
|
|
|
- // // 清单
|
|
|
- // queryHistory();
|
|
|
- // setCommentVisible(false);
|
|
|
- // setHistoryVisible(true);
|
|
|
- // break;
|
|
|
- case 'bomDetail':
|
|
|
- // 清单
|
|
|
- setCommentVisible(true);
|
|
|
- break;
|
|
|
- case 'export':
|
|
|
- // 导出
|
|
|
- handleExportClick();
|
|
|
- break;
|
|
|
- case 'commitAudit':
|
|
|
- // 提交流转
|
|
|
- setCommitAuditVisible(true);
|
|
|
- break;
|
|
|
- case 'flow':
|
|
|
- // 查看流程
|
|
|
- setFlowVisible(true);
|
|
|
- break;
|
|
|
- case 'compare':
|
|
|
- // 比对
|
|
|
- setCompareVisible(true);
|
|
|
- break;
|
|
|
- case 'template':
|
|
|
- // 模板
|
|
|
- handleClickFile();
|
|
|
- break;
|
|
|
- // case 'auditSuccess':
|
|
|
- // // 审核通过
|
|
|
- // onApprove(true);
|
|
|
- // break;
|
|
|
- // case 'auditFailed':
|
|
|
- // // 审核拒绝
|
|
|
- // onApprove(false);
|
|
|
- // break;
|
|
|
- // case 'edit':
|
|
|
- // // 编辑
|
|
|
- // handleEdit(true);
|
|
|
- case 'merge':
|
|
|
- // 同步清单
|
|
|
- setMergeVisible(true);
|
|
|
- break;
|
|
|
- case 'commit':
|
|
|
- // 提交
|
|
|
- // handleClickCommit();
|
|
|
- setCommitVisible(true);
|
|
|
- setCommentVisible(false);
|
|
|
- break;
|
|
|
- case 'attachment':
|
|
|
- // 附件
|
|
|
- setFileVisible(true);
|
|
|
- queryFiles();
|
|
|
- break;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const renderBtns = () => {
|
|
|
- // 判断是否为比对模式
|
|
|
- if (compareList.length == 2) {
|
|
|
- // 判断是否为同步最新清单的比对
|
|
|
- if (isMerge) {
|
|
|
- return (
|
|
|
- <>
|
|
|
- <Button type="primary" onClick={() => onSave()}>
|
|
|
- 保存
|
|
|
- </Button>
|
|
|
- <Button onClick={() => onMerge()}>同步新增内容</Button>
|
|
|
- <Button onClick={() => onCompare(false)}>取消同步</Button>
|
|
|
- </>
|
|
|
- );
|
|
|
- } else {
|
|
|
- return <Button onClick={() => onCompare(false)}>取消比对</Button>;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const menuList = [
|
|
|
- <Menu.Item key="back">返回</Menu.Item>,
|
|
|
- <Menu.Item key="bomDetail">详情</Menu.Item>,
|
|
|
- <Menu.Item key="export">导出</Menu.Item>,
|
|
|
- <Menu.Item key="compare">比对</Menu.Item>,
|
|
|
- <Menu.Item key="attachment">附件</Menu.Item>,
|
|
|
- ];
|
|
|
- // 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 || node.name == 'custom-circle') return;
|
|
|
- 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() && version.audit_status != 3)
|
|
|
- menuList.push(<Menu.Item key="commitAudit">提交流转</Menu.Item>);
|
|
|
-
|
|
|
- if (!isAuditor && canEdit() && !version.flow_id) {
|
|
|
- // menuList.push(<Menu.Item key="edit">编辑</Menu.Item>);
|
|
|
- menuList.push(<Menu.Item key="merge">同步</Menu.Item>);
|
|
|
- // menuList.push(<Menu.Item key="commit">提交</Menu.Item>);
|
|
|
- // if (history.list.length > 0) {
|
|
|
- // menuList.push(<Menu.Item key="approval">申请审批</Menu.Item>);
|
|
|
- // }
|
|
|
- }
|
|
|
- }
|
|
|
- return (
|
|
|
- <>
|
|
|
- <Dropdown overlay={<Menu onClick={handleMenuClick}>{menuList}</Menu>}>
|
|
|
- <UnorderedListOutlined style={{ fontSize: 30, cursor: 'pointer' }} />
|
|
|
- </Dropdown>
|
|
|
- </>
|
|
|
- );
|
|
|
- };
|
|
|
-
|
|
|
- const canEdit = () => {
|
|
|
- if (flow.list.FlowNodes.length - 1 == flow.current && active_audit == 3) return false;
|
|
|
- return active_audit != 1;
|
|
|
- };
|
|
|
-
|
|
|
- const renderAlert = () => {
|
|
|
- const audit_comment = history.list[0]?.audit_comment;
|
|
|
- let item = '';
|
|
|
- switch (active_audit) {
|
|
|
- case 0:
|
|
|
- if (!flow.list || flow.list.FlowNodes?.length == 0) return;
|
|
|
- item = <Alert message="审批拒绝" type="error" />;
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- item = <Alert message="等待审核中" type="info" />;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- item = (
|
|
|
- <Alert
|
|
|
- message={`审批被拒绝${
|
|
|
- audit_comment ? `,拒绝原因:${audit_comment}` : ''
|
|
|
- }。请修改后重新提交`}
|
|
|
- type="error"
|
|
|
- />
|
|
|
- );
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- item = <Alert message="审批通过" type="success" />;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return <div style={{ marginTop: 20 }}>{item}</div>;
|
|
|
- };
|
|
|
-
|
|
|
- const exportExcl = files => {
|
|
|
- sheetRef.current.uploadExcel(files, () => {
|
|
|
- fileRef.current.value = null;
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const getRowOneList = () => {
|
|
|
- const obj = sheetRef.current.getSheetJson();
|
|
|
- console.log(obj);
|
|
|
- const list = [];
|
|
|
- obj.data.forEach(item => {
|
|
|
- list.push(item.data[0]);
|
|
|
- });
|
|
|
- return list;
|
|
|
- };
|
|
|
-
|
|
|
- //点击导出弹出选择导出列弹框
|
|
|
- const handleExportClick = () => {
|
|
|
- setExportData(sheetRef.current.getSheetJson());
|
|
|
- setExportVisible(true);
|
|
|
- };
|
|
|
-
|
|
|
- const downloadExcel = checkValue => {
|
|
|
- sheetRef.current.downloadExcel(checkValue);
|
|
|
- setExportVisible(false);
|
|
|
- };
|
|
|
-
|
|
|
- const queryHistory = id => {
|
|
|
- return new Promise(reslove => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryHistory',
|
|
|
- payload: {
|
|
|
- // excel_id: id || excelId,
|
|
|
- project_id: projectId,
|
|
|
- },
|
|
|
- callback: reslove,
|
|
|
- });
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const queryFiles = () => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryFiles',
|
|
|
- payload: {
|
|
|
- // excel_id: id || excelId,
|
|
|
- excel_id: version.id,
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const getUploadProps = () => {
|
|
|
- const token = getToken() || GetTokenFromUrl();
|
|
|
- const uploadProps = {
|
|
|
- name: 'file',
|
|
|
- showUploadList: false,
|
|
|
- action: `/api/v1/purchase/attachment/${version.id}`,
|
|
|
- headers: {
|
|
|
- 'JWT-TOKEN': token,
|
|
|
- },
|
|
|
- onChange(info) {
|
|
|
- if (info.file.status !== 'uploading') {
|
|
|
- console.log(info.file, info.fileList);
|
|
|
- }
|
|
|
- if (info.file.status === 'done') {
|
|
|
- message.success(`${info.file.name} 文件上传成功`);
|
|
|
- queryFiles();
|
|
|
- } else if (info.file.status === 'error') {
|
|
|
- message.error(`${info.file.name} 文件上传失败`);
|
|
|
- }
|
|
|
- },
|
|
|
- };
|
|
|
- return uploadProps;
|
|
|
- };
|
|
|
-
|
|
|
- const deleteFile = id => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/deleteFiles',
|
|
|
- id: id,
|
|
|
- callback: () => {
|
|
|
- queryFiles();
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const queryHistoryDetail = async item => {
|
|
|
- return new Promise(resolve => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryHistoryDetail',
|
|
|
- payload: {
|
|
|
- excel_id: item.excel_id,
|
|
|
- history_id: item.id,
|
|
|
- },
|
|
|
- callback: sheet => {
|
|
|
- resolve(sheet);
|
|
|
- },
|
|
|
- });
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const getLoading = () => {
|
|
|
- let effects = loading.effects;
|
|
|
- return !loading.effects['detail/queryComment'] && loading.models.detail;
|
|
|
- };
|
|
|
-
|
|
|
- const getFilesLoading = () => {
|
|
|
- let effects = loading.effects;
|
|
|
- return loading.effects['detail/queryFiles'];
|
|
|
- };
|
|
|
-
|
|
|
- const downloadFile = record => {
|
|
|
- window.location.href = `${record.url}`;
|
|
|
- };
|
|
|
-
|
|
|
- const changeVersion = id => {
|
|
|
- let version;
|
|
|
- if (typeof id == 'object') {
|
|
|
- version = id;
|
|
|
- localStorage.excelId = version.id;
|
|
|
- localStorage.excelItem = JSON.stringify(version);
|
|
|
- } else {
|
|
|
- version = versionList.find(item => item.id == id);
|
|
|
- if (!version) return;
|
|
|
- localStorage.excelId = id;
|
|
|
- }
|
|
|
- setVersion(version);
|
|
|
- //请求历史版本
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryVersionsTree',
|
|
|
- payload: {
|
|
|
- excel_id: version.id || localStorage.excelId,
|
|
|
- },
|
|
|
- });
|
|
|
-
|
|
|
- // 判断是否审批节点
|
|
|
- if (version.flow_id) {
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryAuditList',
|
|
|
- payload: {
|
|
|
- template_id: version.template_id,
|
|
|
- template_node_id: version.template_node_id,
|
|
|
- flow_id: version.flow_id,
|
|
|
- version_id: version.version_id,
|
|
|
- },
|
|
|
- });
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const onSubmitNextNode = values => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/submitNextNode',
|
|
|
- payload: values,
|
|
|
- callback: newVersion => {
|
|
|
- setCommitAuditVisible(false);
|
|
|
- // 更新version
|
|
|
- // localStorage.excelId = newVersion.id;
|
|
|
- // changeVersion({
|
|
|
- // ...version,
|
|
|
- // ...newVersion,
|
|
|
- // version_id: version.id
|
|
|
- // });
|
|
|
- // 更新flow流程图
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- const getUser = newUser => {
|
|
|
- try {
|
|
|
- if (JSON.stringify(newUser) != JSON.stringify(userRef.current)) {
|
|
|
- userRef.current = newUser;
|
|
|
- setUser(newUser);
|
|
|
- }
|
|
|
- } catch (error) {}
|
|
|
- };
|
|
|
-
|
|
|
- const renderNode = () => {
|
|
|
- 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 (
|
|
|
- <span className={styles.curTitle}>
|
|
|
- 当前清单: <span>{version.version_name || '-'}</span>当前节点:{' '}
|
|
|
- <span>{node?.label || '-'}</span>
|
|
|
- </span>
|
|
|
- );
|
|
|
- };
|
|
|
-
|
|
|
- const handleSubmitCell = (value, callback) => {
|
|
|
- if (!value) return;
|
|
|
- dispatch({
|
|
|
- type: 'detail/addComment',
|
|
|
- payload: {
|
|
|
- ...cellPosition.current,
|
|
|
- comment: value,
|
|
|
- },
|
|
|
- callback,
|
|
|
- });
|
|
|
- };
|
|
|
- useEffect(() => {
|
|
|
- dispatch({
|
|
|
- type: 'detail/queryProjectRecord',
|
|
|
- payload: {
|
|
|
- project_id: projectId,
|
|
|
- },
|
|
|
- });
|
|
|
- dispatch({
|
|
|
- type: 'xflow/queryBoomFlowDetail',
|
|
|
- payload: {
|
|
|
- id: templateId,
|
|
|
- },
|
|
|
- });
|
|
|
- dispatch({
|
|
|
- type: 'user/getRoleList',
|
|
|
- });
|
|
|
- dispatch({
|
|
|
- type: 'user/fetch',
|
|
|
- });
|
|
|
- dispatch({
|
|
|
- type: 'user/fetchDepV2',
|
|
|
- });
|
|
|
- // dispatch({
|
|
|
- // type: 'detail/queryListParentByUser',
|
|
|
- // payload: {
|
|
|
- // userid: currentUser.DingUserId || getCurrentUser()?.DingUserId,
|
|
|
- // },
|
|
|
- // });
|
|
|
- }, []);
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- if (compareList.length == 2) {
|
|
|
- const callback = ({ diff, add }) => {
|
|
|
- setUpdateCount(updateCount => {
|
|
|
- return {
|
|
|
- diff: diff.length,
|
|
|
- add: updateCount.add + add.length,
|
|
|
- };
|
|
|
- });
|
|
|
- };
|
|
|
- var update1 = sheetRef3.current.toggleCompare(true, compareList[1].data, callback);
|
|
|
- var update2 = sheetRef2.current.toggleCompare(true, compareList[0].data, callback);
|
|
|
- }
|
|
|
- }, [compareList]);
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- if (versionList.length == 0) return;
|
|
|
- if (!version.id) {
|
|
|
- const excelId = localStorage.excelItem
|
|
|
- ? JSON.parse(localStorage.excelItem)
|
|
|
- : localStorage.excelId;
|
|
|
- changeVersion(excelId);
|
|
|
- } else {
|
|
|
- changeVersion(version.id);
|
|
|
- }
|
|
|
- }, [versionList]);
|
|
|
-
|
|
|
- return (
|
|
|
- <Spin spinning={false}>
|
|
|
- <div className={styles.top}>
|
|
|
- <div>
|
|
|
- <Button type="primary" style={{ marginRight: 20 }} onClick={() => setFlowVisible(true)}>
|
|
|
- 查看流程
|
|
|
- </Button>
|
|
|
-
|
|
|
- {/* 非审批节点可以创建清单 */}
|
|
|
- {flow?.active == 0 && (
|
|
|
- <Button type="primary" onClick={() => setVersionVisible(true)}>
|
|
|
- 新建清单
|
|
|
- </Button>
|
|
|
- )}
|
|
|
- {renderNode()}
|
|
|
- </div>
|
|
|
- <div className={styles.btns}>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- style={{ marginRight: 20 }}
|
|
|
- onClick={() => setVersionTreeVisible(true)}
|
|
|
- >
|
|
|
- 历史版本
|
|
|
- </Button>
|
|
|
- <Avatar.Group style={{ marginRight: 20 }}>
|
|
|
- {user.map((item, id) => (
|
|
|
- <Avatar
|
|
|
- key={`${id}-${item.name}`}
|
|
|
- style={{ backgroundColor: '#008dff' }}
|
|
|
- size="large"
|
|
|
- >
|
|
|
- {item.Name}
|
|
|
- </Avatar>
|
|
|
- ))}
|
|
|
- </Avatar.Group>
|
|
|
- {renderBtns()}
|
|
|
- </div>
|
|
|
- <input
|
|
|
- type="file"
|
|
|
- ref={fileRef}
|
|
|
- style={{ display: 'none' }}
|
|
|
- onChange={e => exportExcl(e.target.files)}
|
|
|
- />
|
|
|
- </div>
|
|
|
- <TimeNode flow={flow} isAuditor={isAuditor} onApprove={onApprove}></TimeNode>
|
|
|
- {/* {version.flow_id ? (
|
|
|
- <AuditFlow {...auditDetail} canShowAudit={true} onApprove={onApprove} />
|
|
|
- ) : null} */}
|
|
|
-
|
|
|
- {/* {renderAlert()} */}
|
|
|
- {/* 判断是否为比对模式 */}
|
|
|
- {compareList.length == 2 ? (
|
|
|
- <>
|
|
|
- <Alert
|
|
|
- message={`比对结果:${updateCount.diff}项差异。${updateCount.add}项新增`}
|
|
|
- type="info"
|
|
|
- />
|
|
|
- <div className={styles.sheetBox}>{compareList.map(renderSheetDom)}</div>
|
|
|
- </>
|
|
|
- ) : (
|
|
|
- <div className={styles.sheetBox}>
|
|
|
- {version.id && (
|
|
|
- <LuckySheet
|
|
|
- className={styles.sheet}
|
|
|
- ref={sheetRef}
|
|
|
- onClickCell={onClickCell}
|
|
|
- version={version}
|
|
|
- templateId={templateId}
|
|
|
- getUser={getUser}
|
|
|
- onUpdate={onUpdate}
|
|
|
- />
|
|
|
- )}
|
|
|
- </div>
|
|
|
- )}
|
|
|
-
|
|
|
- <HistoryDrawer
|
|
|
- versionTree={versionTree}
|
|
|
- version={version}
|
|
|
- visible={versionTreeVisible}
|
|
|
- onChangeVersion={version => changeVersion(version)}
|
|
|
- onClose={() => setVersionTreeVisible(false)}
|
|
|
- />
|
|
|
-
|
|
|
- <CommentContent
|
|
|
- title="单元格沟通记录"
|
|
|
- comment={comment}
|
|
|
- onSubmit={handleSubmitCell}
|
|
|
- loading={loading.effects['detail/queryComment'] || loading.effects['detail/addComment']}
|
|
|
- />
|
|
|
-
|
|
|
- <RightDrawer
|
|
|
- version={version}
|
|
|
- visible={commentVisible}
|
|
|
- onClose={() => setCommentVisible(false)}
|
|
|
- />
|
|
|
- <CompareModal
|
|
|
- visible={compareVisible}
|
|
|
- version={version}
|
|
|
- onClose={() => setCompareVisible(false)}
|
|
|
- onOk={onCompare}
|
|
|
- />
|
|
|
- <MergeModal
|
|
|
- visible={mergeVisible}
|
|
|
- version={version}
|
|
|
- onClose={() => setMergeVisible(false)}
|
|
|
- onOk={onMergeVersion}
|
|
|
- />
|
|
|
- <ExportModal
|
|
|
- visible={exportVisible}
|
|
|
- sheet={exportDate.data}
|
|
|
- onClose={() => setExportVisible(false)}
|
|
|
- onOk={downloadExcel}
|
|
|
- />
|
|
|
- <FlowModal
|
|
|
- flowDetail={flowDetail}
|
|
|
- visible={flowVisible}
|
|
|
- onClose={() => setFlowVisible(false)}
|
|
|
- version={version}
|
|
|
- onChangeVersion={version => changeVersion(version)}
|
|
|
- />
|
|
|
- <AuditModal
|
|
|
- loading={getLoading()}
|
|
|
- visible={auditVisible}
|
|
|
- onClose={() => setAuditVisible(false)}
|
|
|
- onOk={onAudit}
|
|
|
- />
|
|
|
- <FilesModal
|
|
|
- loading={getFilesLoading()}
|
|
|
- visible={fileVisible}
|
|
|
- onClose={() => setFileVisible(false)}
|
|
|
- uploadProps={getUploadProps()}
|
|
|
- DeleteFile={deleteFile}
|
|
|
- downloadFile={downloadFile}
|
|
|
- data={fileList}
|
|
|
- />
|
|
|
- <VersionModal
|
|
|
- loading={getLoading()}
|
|
|
- visible={versionVisible}
|
|
|
- onClose={() => setVersionVisible(false)}
|
|
|
- onOk={values => onCommit(values)}
|
|
|
- />
|
|
|
- <CommitAuditModal
|
|
|
- loading={getLoading()}
|
|
|
- visible={commitAuditVisible}
|
|
|
- version={version}
|
|
|
- onClose={() => setCommitAuditVisible(false)}
|
|
|
- onOk={onSubmitNextNode}
|
|
|
- luckysheet={sheetRef}
|
|
|
- />
|
|
|
- </Spin>
|
|
|
- );
|
|
|
-}
|
|
|
-
|
|
|
-export default connect(({ detail, user, xflow, loading }) => ({
|
|
|
- flowDetail: xflow.flowDetail,
|
|
|
- auditList: detail.auditList,
|
|
|
- fileList: detail.fileList,
|
|
|
- history: detail.history,
|
|
|
- comment: detail.comment,
|
|
|
- instanceDetail: detail.dingInstanceDetail,
|
|
|
- currentUser: user.currentUser,
|
|
|
- roleList: detail.roleList,
|
|
|
- versionList: detail.versionList,
|
|
|
- versionTree: detail.versionTree,
|
|
|
- loading,
|
|
|
-}))(Detail);
|