From 2f544b9288f7ca2554fd3970d5b6465a28f3417a Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:37:16 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BB=BF=E7=9C=9F=E7=AD=96=E5=88=92?= =?UTF-8?q?=E6=97=B6=E6=94=AF=E6=8C=81=E5=AF=BC=E5=85=A5=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectList/components/taskDialog.vue | 87 +++++++++++++++++-- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/src/views/task/projectList/components/taskDialog.vue b/src/views/task/projectList/components/taskDialog.vue index 724e525..617a1a3 100644 --- a/src/views/task/projectList/components/taskDialog.vue +++ b/src/views/task/projectList/components/taskDialog.vue @@ -3,7 +3,7 @@ v-model="dialogVisible" diaTitle="任务创建" width="90%" - height="800" + height="600" :loading="loadingInterface" @close="closeFun" show-footer @@ -19,7 +19,17 @@
- + + + + + + - + + + + {{ $t('知识库.上传') }} + +
+ +
@@ -171,7 +203,7 @@ import { canAddChild, transformPoolNodesToTree } from '@/utils/node'; import { ElMessage, ElMessageBox } from 'element-plus'; import { cloneDeep } from 'lodash-es'; import { v4 as uuidv4 } from 'uuid'; -import { getAllTaskPoolApi, getTaskPoolApi, getTaskPoolVersionsApi } from '@/api/task/taskpool'; +import { getAllTaskPoolApi, getTaskPoolApi, getTaskPoolVersionsApi, importTaskPoolApi } from '@/api/task/taskpool'; import { NODE_TYPE, getTagKeyMap, tagSortList } from '@/utils/enum/node'; import nodeLevel2Select from '@/components/project/nodeLevel2Select.vue'; import { getTaskTreeFun } from '../../projectDetail/components/projectApi'; @@ -185,6 +217,7 @@ import { getMemberListIds } from '@/utils/task'; import { getUserTenantId } from '@/utils/user'; import ProjectSelect from '@/components/common/projectSelect/index.vue'; import { TABLE_NAME } from '@/utils/enum/tableName'; +import { taskPoolDictOptions } from '@/utils/project'; const props = defineProps<{ showTaskDialog: boolean; @@ -207,7 +240,11 @@ const getRightVxeRef = () => { const getLeftVxeRef = () => { if (selectMethod.value === 'template') { - return leftPoolTableRef?.value?.loadcaseTableRef?.TreeTableRef?.treeTableRef; + if (planMode.value === 'lib') { + return leftPoolTableRef?.value?.loadcaseTableRef?.TreeTableRef?.treeTableRef; + } else { + return leftExcelTableRef?.value?.loadcaseTableRef?.TreeTableRef?.treeTableRef; + } } else { return leftProjectTableRef?.value?.loadcaseTableRef?.TreeTableRef?.treeTableRef; } @@ -771,10 +808,8 @@ const queryTaskPoolFun = async () => { version: currentLoadcaseLibVersionInfo.value.poolVersion, }; const res: any = await getTaskPoolApi(req); - let tree = []; if (res.code === 200 && res.data.poolBrief && res.data && res.data.nodes) { - tree = transformPoolNodesToTree(res.data.nodes); - leftPoolTableDataList.value = tree; + leftPoolTableDataList.value = transformPoolNodesToTree(res.data.nodes); nextTick(() => { // 待修改 // leftPoolTableRef.value?.changeLevel('全部展开'); @@ -785,6 +820,42 @@ const queryTaskPoolFun = async () => { leftTableLoading.value = false; }; +/** + * @lib lib 工况库导入 + * @excel excel 外部表单导入 + */ +const planMode = ref('lib'); + +const planModeOptions = [{ label: '工况库导入', value: 'lib' }, { label: '外部表单导入', value: 'excel' }]; + +const leftExcelTableData = ref(); +const leftExcelLoading = ref(false); + +const leftExcelTableRef = ref(); + +const uploadExcelFileFun = async(file:any) => { + console.log('file', file); + leftExcelLoading.value = true; + const dict = { + bCapacity: taskPoolDictOptions.value.capacityOptions, + unit: taskPoolDictOptions.value.performanceUnitOptions, + department: taskPoolDictOptions.value.departmentListOptions, + section: taskPoolDictOptions.value.sectionListOptions, + group: taskPoolDictOptions.value.groupListOptions, + }; + const req = { + poolName: '外部临时表单', + file: file.raw, + dicts: JSON.stringify(dict), + }; + const res: any = await importTaskPoolApi(req); + if (res.code === 200) { + leftExcelTableData.value = transformPoolNodesToTree(res.data.nodes); + + } + leftExcelLoading.value = false; +}; + setTimeout(() => { // rightTableData.value = [ // { From 5b1b414983359dc88e89cf35ffab301ce0da3df3 Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:37:37 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=20135?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/task/projectList/components/taskDialog.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/task/projectList/components/taskDialog.scss b/src/views/task/projectList/components/taskDialog.scss index 13ec212..be2fcd3 100644 --- a/src/views/task/projectList/components/taskDialog.scss +++ b/src/views/task/projectList/components/taskDialog.scss @@ -1,6 +1,6 @@ .task-content { // height: 100%; - height: 800px; + height: 70vh; width: 100%; .select-method { height: 32px; From 1ff8e2a6fd2caf64eaf9a9351f2ef6a66ce76f1c Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:39:17 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creation/components/nodeEvents.ts | 65 +++++++++++++++---- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/src/views/simulation/creation/components/nodeEvents.ts b/src/views/simulation/creation/components/nodeEvents.ts index a71e202..4c90bdb 100644 --- a/src/views/simulation/creation/components/nodeEvents.ts +++ b/src/views/simulation/creation/components/nodeEvents.ts @@ -1,5 +1,6 @@ import { reactive, ref } from 'vue'; import { FLOW_CREATE_ID } from './initGraph'; +import { ElMessage } from 'element-plus'; // 控制连接桩显示/隐藏 const showPorts = (ports: NodeListOf, show: boolean) => { @@ -77,6 +78,7 @@ export const initNodeEvents = (graph: any) => { export const useNodeEvents = () => { return { undoFun, + deleteFun, zoomInFun, zoomOutFun, yAlign, @@ -89,6 +91,11 @@ const undoFun = (graph: any) => { graph.undo(); }; +const deleteFun = (graph: any) => { + const nodes = graph.getSelectedCells(); + graph.removeCells(nodes); +}; + const zoomInFun = (graph: any) => { graph.zoom(-0.2); }; @@ -97,29 +104,59 @@ const zoomOutFun = (graph: any) => { graph.zoom(0.2); }; +/** + * 全部左对齐 + * @param graph + */ +// const xAlign = (graph: any) => { +// const nodes = graph.getSelectedCells(); +// let x = 0; +// for (let index = 0; index < nodes.length; index++) { +// if (x === 0 || x > nodes[index].position().x) { +// x = nodes[index].position().x; +// } +// } +// for (let index = 0; index < nodes.length; index++) { +// nodes[index].position(x, nodes[index].position().y); +// } +// }; + +/** + * 横向分布 + * @param graph + */ const xAlign = (graph: any) => { const nodes = graph.getSelectedCells(); - let x = 0; - for (let index = 0; index < nodes.length; index++) { - if (x === 0 || x > nodes[index].position().x) { - x = nodes[index].position().x; + if (nodes.length > 2) { + nodes.sort((a:any, b:any) => { + return a.position().x - b.position().x; + }); + const xLength = nodes[1].position().x - nodes[0].position().x - nodes[0].size().width; + for (let index = 2; index < nodes.length; index++) { + nodes[index].position(nodes[index - 1].position().x + nodes[index - 1].size().width + xLength, nodes[index].position().y); } + } else { + ElMessage.warning('请框选超过 2 个节点!'); } - for (let index = 0; index < nodes.length; index++) { - nodes[index].position(x, nodes[index].position().y); - } + // for (let index = 0; index < nodes.length; index++) { + // nodes[index].position(x, nodes[index].position().y); + // } }; const yAlign = (graph: any) => { const nodes = graph.getSelectedCells(); - let y = 0; - for (let index = 0; index < nodes.length; index++) { - if (y === 0 || y > nodes[index].position().y) { - y = nodes[index].position().y; + if (nodes.length > 1) { + let y = 0; + for (let index = 0; index < nodes.length; index++) { + if (y === 0 || y > nodes[index].position().y) { + y = nodes[index].position().y; + } } - } - for (let index = 0; index < nodes.length; index++) { - nodes[index].position(nodes[index].position().x, y); + for (let index = 0; index < nodes.length; index++) { + nodes[index].position(nodes[index].position().x, y); + } + } else { + ElMessage.warning('请框选超过 1 个节点!'); } }; From 19d12e627b08ed61c85754e94228bc315bfea998 Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:40:46 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=8A=82=E7=82=B9=EF=BC=8C=E4=BF=AE=E5=A4=8Dbug=20108?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dragFlow/{删除.svg => delete-black.svg} | 0 .../dragFlow/{delete.svg => delete-red.svg} | 0 src/views/simulation/creation/index.scss | 3 ++ src/views/simulation/creation/index.vue | 43 ++++++++++++++++--- 4 files changed, 40 insertions(+), 6 deletions(-) rename src/assets/imgs/dragFlow/{删除.svg => delete-black.svg} (100%) rename src/assets/imgs/dragFlow/{delete.svg => delete-red.svg} (100%) diff --git a/src/assets/imgs/dragFlow/删除.svg b/src/assets/imgs/dragFlow/delete-black.svg similarity index 100% rename from src/assets/imgs/dragFlow/删除.svg rename to src/assets/imgs/dragFlow/delete-black.svg diff --git a/src/assets/imgs/dragFlow/delete.svg b/src/assets/imgs/dragFlow/delete-red.svg similarity index 100% rename from src/assets/imgs/dragFlow/delete.svg rename to src/assets/imgs/dragFlow/delete-red.svg diff --git a/src/views/simulation/creation/index.scss b/src/views/simulation/creation/index.scss index 95fb328..46e0bca 100644 --- a/src/views/simulation/creation/index.scss +++ b/src/views/simulation/creation/index.scss @@ -8,6 +8,9 @@ .no-padding { padding: 0 !important; } + #delete-btn { + width: 16px; + } .header-box { display: flex; diff --git a/src/views/simulation/creation/index.vue b/src/views/simulation/creation/index.vue index 758035c..b83d407 100644 --- a/src/views/simulation/creation/index.vue +++ b/src/views/simulation/creation/index.vue @@ -23,11 +23,42 @@
- - - - - + + + + + + + + + + + + + + + + + +
保存草稿 @@ -94,7 +125,7 @@ const currentVersion = ref(); const flowVersionOptions = ref([]); const { drawerVisible, nodeAttribute } = useNodeAttribute(); -const { undoFun, zoomInFun, zoomOutFun, xAlign, yAlign } = useNodeEvents(); +const { undoFun, deleteFun, zoomInFun, zoomOutFun, xAlign, yAlign } = useNodeEvents(); // 注册连线 // registerCustomConnector(); From 1e957c2d51d1ba0a90d4fdadce99a9e222cff75f Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:41:34 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E7=94=9F=E6=88=90=E7=9A=84json=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/enum/flow.ts | 19 ++++++ .../simulation/creation/components/flow.ts | 67 ++++++++++++------- .../creation/components/initGraph.ts | 3 +- .../components/pageConfig/DraggableItem.vue | 2 +- .../components/pageConfig/RightPanel.vue | 2 +- .../simulation/creation/components/stencil.ts | 3 + 6 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/utils/enum/flow.ts b/src/utils/enum/flow.ts index f1e53b1..7b11190 100644 --- a/src/utils/enum/flow.ts +++ b/src/utils/enum/flow.ts @@ -1,3 +1,22 @@ +export enum FLOW_APP_TYPE { + /** + * 本地应用 + */ + LOCAL = '1', + /** + * 云应用 + */ + CLOUD = '2', + /** + * HPC + */ + HPC = '3', + /** + * 脚本节点 + */ + SCRIPT_NODE = '5' +} + export enum FLOW_USE_STATUS { /** * 禁用 diff --git a/src/views/simulation/creation/components/flow.ts b/src/views/simulation/creation/components/flow.ts index f938a88..f95e4c2 100644 --- a/src/views/simulation/creation/components/flow.ts +++ b/src/views/simulation/creation/components/flow.ts @@ -1,4 +1,4 @@ -import { FLOW_NODE_TYPE_ENUM } from '@/utils/enum/flow'; +import { FLOW_APP_TYPE, FLOW_NODE_TYPE_ENUM } from '@/utils/enum/flow'; import { ElMessage } from 'element-plus'; import { useNodeAttribute } from './nodeEvents'; @@ -20,7 +20,7 @@ export const getRelationNodeAndVerifyFlowFun = (cells:any, templateName:string, const nodeArr = []; const edgeArr = []; for (let index = 0; index < cells.length; index++) { - if (cells[index].shape === 'edge') { + if (cells[index].shape === 'edge' || cells[index].shape === 'agent-edge') { edgeArr.push({ target: cells[index].target.cell, source: cells[index].source.cell, @@ -64,7 +64,7 @@ const sortNodeAndEdge = (nodeArr: any, edgeArr: any) => { console.log('生成一个树结构的节点数据'); getNodeRelation(startNode, [startNode.id], nodeArr, edgeArr); const relationNode = startNode; - // console.log('relationNode', startNode); + console.log('relationNode', startNode); const repeatNodeObj:any = {}; for (let index = 0; index < edgeArr.length; index++) { @@ -202,7 +202,8 @@ const formatNodeAndEdge = (edgeArr:any[], nodeArr:any[]) => { }); nodeArr.forEach((node:any) => { const formatItem:any = { - id: node.id, type: node.type, + id: node.id, + type: node.type, nodeType: node.nodeType, name: node.label, }; @@ -227,49 +228,65 @@ const formatNodeAndEdge = (edgeArr:any[], nodeArr:any[]) => { postScripts: node.postScripts, preScripts: node.preScripts, uuid: node.uuid, + exeMethod: node.exeMethod, }; - if (node.type === '本地应用') { + if (node.nodeTypeValue === FLOW_APP_TYPE.LOCAL) { formatItem['extensionElements']['executeConfig'].type = 'localApp'; formatItem['extensionElements']['executeConfig'].executeType = 'localApp'; } - if (node.type === '云应用') { + if (node.nodeTypeValue === FLOW_APP_TYPE.CLOUD) { formatItem['extensionElements']['executeConfig'].type = 'cloudApp'; formatItem['extensionElements']['executeConfig'].executeType = 'cloudApp'; } - if (node.type === 'HPC') { + if (node.nodeTypeValue === FLOW_APP_TYPE.HPC) { formatItem['extensionElements']['executeConfig'].type = 'HPC'; formatItem['extensionElements']['executeConfig'].executeType = 'HPC'; + formatItem['extensionElements']['executeConfig'].waitUser = node.exeMethod !== 'serviceTask'; + formatItem['extensionElements']['executeConfig'].asyncCallback = true; + } else { + formatItem['extensionElements']['executeConfig'].asyncCallback = false; } - if (node.type === '脚本节点') { + if (node.nodeTypeValue === FLOW_APP_TYPE.SCRIPT_NODE) { formatItem['extensionElements']['executeConfig'].type = 'scriptNode'; - formatItem['extensionElements']['executeConfig'].executeType = 'scriptNode'; + formatItem['extensionElements']['executeConfig'].executeType = 'exportWordScript'; + } + + if (node.nodeTypeValue === FLOW_APP_TYPE.HPC) { + // HPC节点异步回调为true + // formatItem.asyncCallback = true; + // formatItem.waitUser = node.exeMethod === 'serviceTask'; + // HPC节点type为serviceTask + formatItem.type = 'serviceTask'; + } else { + // 非HPC节点异步回调为false + // formatItem.asyncCallback = false; + // 非HPC节点type为userTask + formatItem.type = 'userTask'; + } + + if (node.nodeTypeValue === FLOW_APP_TYPE.SCRIPT_NODE) { + formatItem.type = 'serviceTask'; } delete formatItem['extensionElements']['executeConfig']['iconUrl']; delete formatItem['extensionElements']['executeConfig']['children']; delete formatItem['extensionElements']['executeConfig']['children']; + + if (formatItem.nodeType === FLOW_NODE_TYPE_ENUM.START) { + formatItem.type = 'startEvent'; + delete formatItem['extensionElements']; + } + if (formatItem.nodeType === FLOW_NODE_TYPE_ENUM.END) { + formatItem.type = 'endEvent'; + delete formatItem['extensionElements']; + } + delete formatItem.iconUrl; delete formatItem.pageConfigList; delete formatItem.children; delete formatItem.preNode; delete formatItem.nodeType; - if (formatItem.nodeType === FLOW_NODE_TYPE_ENUM.START) { - formatItem.type = 'startEvent'; - } - if (formatItem.nodeType === FLOW_NODE_TYPE_ENUM.END) { - formatItem.type = 'endEvent'; - } - if (node.exeMethod === 'userTask') { - formatItem.type = 'userTask'; - } - else if (node.exeMethod === 'serviceTask') { - formatItem.type = 'serviceTask'; - } else { - // 默认自动执行 - formatItem.type = 'serviceTask'; - } - nodeFormatArr.push(formatItem); }); return [...nodeFormatArr, ...edgeFormatArr]; diff --git a/src/views/simulation/creation/components/initGraph.ts b/src/views/simulation/creation/components/initGraph.ts index a06302f..bb83624 100644 --- a/src/views/simulation/creation/components/initGraph.ts +++ b/src/views/simulation/creation/components/initGraph.ts @@ -7,6 +7,7 @@ import { History } from '@antv/x6-plugin-history'; import { keyboardEvents } from './keyboard'; import { stencilRegister } from './stencil'; import { initNodeEvents } from './nodeEvents'; +import { v4 as uuidv4 } from 'uuid'; export const FLOW_CREATE_ID = 'flow-create-content'; @@ -50,7 +51,7 @@ export const initGraph = async () => { allowLoop: false, highlight: true, createEdge(): Edge { - return graph.createEdge({ shape: 'agent-edge' }); + return graph.createEdge({ shape: 'agent-edge', id: 'uuid-edge-' + uuidv4() }); }, validateConnection({ targetMagnet }) { return !!targetMagnet; diff --git a/src/views/simulation/creation/components/pageConfig/DraggableItem.vue b/src/views/simulation/creation/components/pageConfig/DraggableItem.vue index e1eeee2..5185a57 100644 --- a/src/views/simulation/creation/components/pageConfig/DraggableItem.vue +++ b/src/views/simulation/creation/components/pageConfig/DraggableItem.vue @@ -3,7 +3,7 @@ import { defineComponent, useAttrs, watch } from 'vue'; import Render from './render.vue'; import { CopyDocument, Delete } from '@element-plus/icons-vue'; import Draggable from 'vuedraggable'; -import deleteIcon from '@/assets/imgs/dragFlow/delete.svg'; +import deleteIcon from '@/assets/imgs/dragFlow/delete-red.svg'; import editIcon from '@/assets/imgs/dragFlow/edit.svg'; const Layouts = defineComponent({ diff --git a/src/views/simulation/creation/components/pageConfig/RightPanel.vue b/src/views/simulation/creation/components/pageConfig/RightPanel.vue index d2336a8..6b4edd9 100644 --- a/src/views/simulation/creation/components/pageConfig/RightPanel.vue +++ b/src/views/simulation/creation/components/pageConfig/RightPanel.vue @@ -1026,7 +1026,7 @@ const changeLabel = (activeData: any) => { .el-date-editor { width: 227px; } - ::v-deep .el-icon-time { + .el-icon-time { display: none; } } diff --git a/src/views/simulation/creation/components/stencil.ts b/src/views/simulation/creation/components/stencil.ts index ef24876..5a84529 100644 --- a/src/views/simulation/creation/components/stencil.ts +++ b/src/views/simulation/creation/components/stencil.ts @@ -9,6 +9,7 @@ import stencilStartImg from '@/assets/imgs/dragFlow/dragIcon/stencil_start.svg'; import stencilEndImg from '@/assets/imgs/dragFlow/dragIcon/stencil_end.svg'; import { FLOW_CREATE_ID } from './initGraph'; import { FLOW_NODE_TYPE_ENUM } from '@/utils/enum/flow'; +import { v4 as uuidv4 } from 'uuid'; const commonStore = CommonStore(); @@ -81,6 +82,7 @@ export const stencilRegister = async (graph: any) => { stencil.dnd.options.getDropNode = (node: any) => { console.log('node', node); return graph.createNode({ + id: 'uuid-node-' + uuidv4(), shape: node.data.isApp ? 'custom-app-vue-node' : 'custom-local-vue-node', // shape: 'custom-app-vue-node', data: { ...node.data }, @@ -110,6 +112,7 @@ export const createNode = (nodeListObj:any, graph:any, stencil?:any) => { uuid: item.isLocal ? '' : item.uuid, type: item.isLocal ? nodeListObj[key].type : nodeListObj[key].label, nodeType: item.isLocal ? item.nodeType : nodeListObj[key].label, + nodeTypeValue: nodeListObj[key].type, iconUrl: item.isLocal ? item.appImage : FileUtil.getFilePreviewImgPathUrl(item.appImage), preScripts: [], postScripts: [], From 1f7de49d250961edaf970ec63f97365a748ef078 Mon Sep 17 00:00:00 2001 From: weibl Date: Mon, 1 Dec 2025 13:59:00 +0800 Subject: [PATCH 6/6] =?UTF-8?q?loadcaseTable=E5=8A=A0=E4=B8=8Areadonly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/treeCaseTable/loadCaseTable.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/common/treeCaseTable/loadCaseTable.vue b/src/components/common/treeCaseTable/loadCaseTable.vue index 78444d0..9cf51b9 100644 --- a/src/components/common/treeCaseTable/loadCaseTable.vue +++ b/src/components/common/treeCaseTable/loadCaseTable.vue @@ -423,6 +423,9 @@ const deleteTableRowFun = async(row: any) => { // }); }; const actionList = computed(() => { + if (props.readonly) { + return []; + } if (!props.hasOperationColumn) { return []; }