fix:数据对比功能bug修复

This commit is contained in:
2025-12-03 16:04:19 +08:00
parent 6539dd007f
commit c9caeed71f
14 changed files with 190 additions and 98 deletions

View File

@@ -17,4 +17,5 @@ VITE_API_PREFIX_PERFORMANCE=/
VITE_API_PREFIX_PROJECT=/local7101/
VITE_API_PREFIX_SYSTEM=/local7103/
VITE_API_PREFIX_TASK=/local7102/
VITE_API_PREFIX_APPLICATION=/local18888/
VITE_API_PREFIX_APPLICATION=/local18888/
VITE_API_PREFIX_FLOWABLE=/local7108/

View File

@@ -18,3 +18,4 @@ VITE_API_PREFIX_PROJECT=/project/
VITE_API_PREFIX_SYSTEM=/system/
VITE_API_PREFIX_TASK=/task/
VITE_API_PREFIX_APPLICATION=/application/
VITE_API_PREFIX_FLOWABLE=/local7108/

View File

@@ -18,3 +18,4 @@ VITE_API_PREFIX_PROJECT=/project/
VITE_API_PREFIX_SYSTEM=/system/
VITE_API_PREFIX_TASK=/task/
VITE_API_PREFIX_APPLICATION=/application/
VITE_API_PREFIX_FLOWABLE=/local7108/

View File

@@ -0,0 +1,13 @@
import { post } from '@/api/request';
const env = import.meta.env;
const PREFIX = env.VITE_API_PREFIX_FLOWABLE;
/**
* 流程节点继续执行(完成人工节点/或者等待用户输入后继续手动执行的节点)
* @param params processInstanceId 流程实例ID taskDefinitionKey 流程节点id flowelementType userTask - 普通用户任务 serviceTask - ServiceTask前置隐藏等待任务
* @returns
*/
export const continueServiceTaskApi = (params: any) => {
return post(`${PREFIX}process/continueServiceTask`, params);
};

View File

@@ -1,15 +1,56 @@
<template>
<div class="upload-page"></div>
<div class="upload-page">
<el-upload class="upload-demo" :auto-upload="false" drag :multiple="row.multiple" v-model:file-list="fileList">
<el-button link type="primary">点击或拖拽文件上传
</el-button>
</el-upload>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { ref, watch } from 'vue';
const props = defineProps({
dirId: {
type: Number,
default: 0,
},
row: {
type: Object,
default: () => { },
},
});
const tempId = ref(String(new Date().getTime()));
const fileList = ref<any>([]);
watch(() => props.row, (newVal) => {
if (newVal) {
console.log(newVal, 'newVal');
}
}, {
immediate: true,
deep: true,
});
</script>
<style lang="scss" scoped>
.upload-page{
.upload-page {
width: 100%;
.upload-demo {
width: 100%;
height: 100%;
:deep(.el-upload-dragger) {
padding:5px !important;
margin-top: 10px;
}
.el-upload-list{
overflow: auto;
}
}
}
</style>

View File

@@ -1,20 +1,16 @@
<template>
<div class="flow-node-param-page">
<BaseTable
ref="baseTableRef"
hide-pagination
tableName="FLOW_NODE_PARAM"
:tree-config="{
ref="baseTableRef" hide-pagination tableName="FLOW_NODE_PARAM" :tree-config="{
transform: true,
expandAll: true,
rowField: 'formId',
parentField: 'parentId',
childrenField: 'children',
}"
>
}">
<template #leftOptions>
<el-button type="primary" >参数入库</el-button>
<el-button type="primary">参数入库</el-button>
<el-button type="primary" @click="saveNodeParamFun">保存参数</el-button>
<el-button type="">引用参数</el-button>
</template>
@@ -24,68 +20,47 @@
<!-- 输入框 -->
<div
class="numInput flex-div"
v-if="(row.tagType === WIDGET_TYPE.INPUTS || row.tagType === WIDGET_TYPE.INPUT) && row.englishLabel"
>
class="numInput flex-div"
v-if="(row.tagType === WIDGET_TYPE.INPUTS || row.tagType === WIDGET_TYPE.INPUT) && row.englishLabel">
<div
class="input-grid"
:style="{
display: row.total === row.column ? 'flex' : 'grid',
gridTemplateColumns: 'repeat(' + row.column + ',1fr)',
}"
>
<div class="flex-align-center mr12" >
class="input-grid" :style="{
display: row.total === row.column ? 'flex' : 'grid',
gridTemplateColumns: 'repeat(' + row.column + ',1fr)',
}">
<div class="flex-align-center mr12">
<el-input class="span-min80" v-model="row.defaultValue"></el-input>
</div>
</div>
</div>
<!-- 2下拉框-->
<el-select
v-if="row.tagType === WIDGET_TYPE.SELECT"
:multiple="row.isMultiple === '1'"
:title="row.defaultValue"
v-model="row.defaultValue"
class="w70p"
collapse-tags
:allow-create="row.importability === '1'"
filterable
default-first-option
>
v-if="row.tagType === WIDGET_TYPE.SELECT" :multiple="row.isMultiple === '1'"
:title="row.defaultValue" v-model="row.defaultValue" class="w70p" collapse-tags
:allow-create="row.importability === '1'" filterable default-first-option>
<el-option
v-for="(item, index) in row?.options || []"
:key="item.value"
:label="item.label"
:value="item.value"
/>
v-for="(item, index) in row?.options || []" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
<!-- 4单选框 -->
<el-checkbox v-if="row.tagType === WIDGET_TYPE.CHECKBOX" v-model="row.defaultValue" true-value="1" false-value="0" />
<el-checkbox
v-if="row.tagType === WIDGET_TYPE.CHECKBOX" v-model="row.defaultValue" true-value="1"
false-value="0" />
<!-- 多选框 -->
<div v-if="row.tagType === WIDGET_TYPE.CHECKBOXS">
<el-checkbox-group v-model="row.defaultValue">
<el-checkbox v-for="item in row.options " :key="item.value" :label="item.label" :value="item.value" />
<el-checkbox v-for="item in row.options" :key="item.value" :label="item.label" :value="item.value" />
</el-checkbox-group>
</div>
<!-- 计数器 -->
<div
class="numInput "
v-if="row.tagType === WIDGET_TYPE.NUMBER_INPUTS || row.tagType === WIDGET_TYPE.NUMBER_INPUT"
>
<div
class="input-grid"
>
class="numInput "
v-if="row.tagType === WIDGET_TYPE.NUMBER_INPUTS || row.tagType === WIDGET_TYPE.NUMBER_INPUT">
<div class="input-grid">
<el-input-number
class="mr10"
controls-position="right"
v-model="row.defaultValue"
></el-input-number>
<span
class="over-ellipsis span-fommat"
:title="row?.units "
>{{ row?.unit }}</span>
<el-input-number class="mr10" controls-position="right" v-model="row.defaultValue"></el-input-number>
<span class="over-ellipsis span-fommat" :title="row?.units">{{ row?.unit }}</span>
</div>
</div>
@@ -94,19 +69,17 @@
{{ row.defaultValue }}
</div>
<!-- 滑块 -->
<div v-if="row.tagType === WIDGET_TYPE.SLIDER" class="slider" >
<div v-if="row.tagType === WIDGET_TYPE.SLIDER" class="slider">
<span class="value">{{ row.defaultValue }}</span>
<el-slider v-model="row.defaultValue" :min="row.min" :max="row.max" size="small" />
</div>
<!-- 9 模型文件选择 local + server-->
<div
class="localServer"
v-if="
row.tagType === WIDGET_TYPE.FILE || row.tagType === NODE_TYPE.SCRIPT || row.tagType === NODE_TYPE.PPT
"
>
class="localServer" v-if="
row.tagType === WIDGET_TYPE.FILE || row.tagType === NODE_TYPE.SCRIPT || row.tagType === NODE_TYPE.PPT
">
<flowFileUpload :row="row" :dir-id="pageInfo?.inputDirId"></flowFileUpload>
</div>
<!-- 行容器 -->
@@ -118,7 +91,7 @@
</template>
<template #label="{row}">
<template #label="{ row }">
<span v-if="row.tagType === WIDGET_TYPE.VIEW && row.tagIcon === 'row'">
{{ row.componentName }}
@@ -136,6 +109,7 @@ import BaseTable from '@/components/common/table/baseTable.vue';
import { NODE_TYPE, WIDGET_TYPE } from '@/utils/enum/flow';
import { saveNodeParamsApi } from '@/api/project/run';
import { cloneDeep } from 'lodash-es';
import flowFileUpload from './flowFileUpload.vue';
const props = defineProps({
nodeParams: {
@@ -154,9 +128,9 @@ const props = defineProps({
const baseTableRef = ref();
const tableData = ref<any>([]);
const formatDataFun = (list:any, parentId:any) => {
const formatDataFun = (list: any, parentId: any) => {
for (let i = 0;i < list.length;i++) {
for (let i = 0; i < list.length; i++) {
list[i].parentId = parentId;
if (list[i]?.children?.length) {
formatDataFun(list[i]?.children, list[i].renderKey);
@@ -170,27 +144,26 @@ const saveNodeParamFun = async () => {
const runNodeInfo = props.currentNode?.store?.data?.data?.flowNodeInfo;
const newParams:any = cloneDeep(tableData.value);
const inputParams:any = {};
const newParams: any = cloneDeep(tableData.value);
const inputParams: any = {};
setDataToParam(newParams, inputParams);
console.log(newParams, 'newParams');
const params:any = {
const params: any = {
nodeUuid: runNodeInfo.uuid,
runId: runNodeInfo.runId,
inputParams,
};
const res:any = await saveNodeParamsApi(params);
const res: any = await saveNodeParamsApi(params);
if (res && res.code === 200) {
}
};
const setDataToParam = (list:any, obj:any) => {
const setDataToParam = (list: any, obj: any) => {
for (let i = 0;i < list.length;i++) {
for (let i = 0; i < list.length; i++) {
if (list[i].englishLabel) {
obj[list[i].englishLabel] = list[i].defaultValue || '';
@@ -200,11 +173,10 @@ const setDataToParam = (list:any, obj:any) => {
};
const nodeParamData = ref<any>([]);
watch(() => props.pageInfo, (newVal) => {
watch(() => props.nodeParams, (newVal) => {
if (newVal) {
const paramData = nodeParamData.value?.pageConfigList || [];
tableData.value = paramData;
// const paramData = nodeParamData.value?.pageConfigList || [];
tableData.value = newVal;
formatDataFun(tableData.value, 0);
nextTick(() => {
baseTableRef.value.setDataFun(tableData.value);
@@ -228,31 +200,32 @@ watch(() => props.pageInfo, (newVal) => {
flex-shrink: 0;
}
.span-min80{
.span-min80 {
min-width: 80px
}
.span-3{
.span-3 {
width: calc(100% / 3)
}
.spanw100{
.spanw100 {
width: 100px
}
}
.slider{
.slider {
display: flex;
align-items: center;
height: 40px;
padding: 0 12px;
}
.value{
.value {
padding-right: 15px;
}
.mr10{
.mr10 {
margin-right: 10px;
}
</style>

View File

@@ -384,7 +384,7 @@ const getFileInfo = async (data: any, fileType: any) => {
const res: any = await getSimulationTaskFileApi({
taskId: '',
runId: data.uuid,
uuid: data.uuid,
fileBizType: fileType,
fileName: '',
startTime: '',

View File

@@ -9,6 +9,7 @@
</template>
</BaseTable>
<FilePreview v-model="previewVisible" :fileId="fileId"></FilePreview>
</div>
</template>
@@ -16,6 +17,7 @@
import { ref, nextTick, watch } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import { objectTypeArrayRemovesDuplicates } from '@/utils/common';
import FilePreview from '@/components/common/filePreview/index.vue';
const props = defineProps({
checkTaskInfo: {
@@ -33,7 +35,8 @@ const props = defineProps({
});
const reportComparisonTableRef = ref();
const showTableContent = ref(false);
const fileId = ref<any>('');
const previewVisible = ref(false);
const tableColumns = ref<any>([
]);
@@ -73,7 +76,7 @@ const getTableColumnFun = (data:any) => {
const obj:any = {
title: `${names}-报告`,
key: `${list[i].taskId}_${list[i].uuid}`,
key: `${list[i].taskId}_${list[i].uuid}_${list[i].id}`,
isShow: true,
};
@@ -89,22 +92,33 @@ const getTableColumnFun = (data:any) => {
}
}
const listData:any = [];
for (let i = 0;i < tableColumns.value.length;i++) {
const obj:any = {};
const str = tableColumns.value[i].key;
obj[str] = [];
for (let j = 0;j < list.length;j++) {
const str2 = list[j].taskId + '_' + list[j].uuid;
const str2 = list[j].taskId + '_' + list[j].uuid + '_' + list[j].id;
if (str2 === str) {
obj[str].push(list[j].id);
}
}
obj[str] = obj[str].join('_');
if (obj[str]) {
tableData.value.push(obj);
listData.push(obj);
}
}
const pngObj:any = {};
for (let i = 0;i < listData.length;i++) {
for (const key in listData[i]) {
pngObj[key] = listData[i][key];
}
}
tableData.value.push(pngObj);
showTableContent.value = true;
nextTick(() => {
@@ -128,7 +142,8 @@ watch(() => props.checkTaskInfo, (newVal) => {
const reviewFileFun = (ids:any) => {
console.log(ids, 'ids');
fileId.value = ids;
previewVisible.value = true;
};
</script>

View File

@@ -821,7 +821,7 @@ const getSimulationTaskFileFun = async (param:any) => {
const params:any = {
...param,
};
params.fileName = params?.name || '';
if (params?.project) {
params.uuid = projectOptions.value.find((item:any) => {
return item.value === params.project;

View File

@@ -179,6 +179,16 @@ const initProjectStorageSpaceStatisticsFun = async () => {
if (res && res.code === 200) {
for (let i = 0;i < res.data.length;i++) {
xData.push(res.data[i].nodeName);
seriesData.push({
type: 'bar',
barWidth: '30%',
name: res.data[i].nodeName,
data: [res.data[i].totalSize],
});
}
}
projectStorageSpaceStatisticsRef.value.commonChartRef.disposeEchartsByKey('chart1');
@@ -247,13 +257,21 @@ const initStatisticsOfSubjectStorageSpaceFun = async () => {
const seriesData:any = [];
const res:any = await getNodeSizeByNodeTypeApi({
queryNodeType: 'discipline',
uuid: projectStorageSpaceStatisticsFormData.nodeId,
uuid: statisticsOfSubjectStorageSpaceFormData.nodeId,
intervalMonths: formData.intervalMonths,
targetYm: formData.targetYm,
});
if (res && res.code === 200) {
for (let i = 0;i < res.data.length;i++) {
xData.push(res.data[i].nodeName);
seriesData.push({
type: 'bar',
barWidth: '30%',
name: res.data[i].nodeName,
data: [res.data[i].totalSize],
});
}
}
statisticsOfSubjectStorageSpaceRef.value.commonChartRef.disposeEchartsByKey('chart2');
@@ -327,7 +345,15 @@ const initUserStorageSpaceStatisticsFun = async () => {
});
if (res && res.code === 200) {
for (let i = 0;i < res.data.length;i++) {
xData.push(res.data[i].userName);
seriesData.push({
type: 'bar',
barWidth: '30%',
name: res.data[i].userName,
data: [res.data[i].totalFileSize],
});
}
}
userStorageSpaceStatisticsRef.value.commonChartRef.disposeEchartsByKey('chart3');
@@ -391,7 +417,7 @@ const getDisciplineOptionsFun = async () => {
disciplineOptions.value = res.data.data.map((item: any) => {
return {
label: item.nodeName,
value: item.id,
value: item.uuid,
};
});
}

View File

@@ -55,7 +55,7 @@
<el-button size="small" type="danger">停止</el-button>
<el-button size="small">刷新</el-button>
<el-button size="small" type="primary" @click="startLocalAppFun">启动应用</el-button>
<el-button size="small" type="primary">继续执行</el-button>
<el-button size="small" type="primary" @click="continueStartRunJobFun">继续执行</el-button>
<el-button size="small" @click="visible = true">查看所有计算</el-button>
</div>
@@ -147,6 +147,7 @@ import HpcList from '@/components/task/hpcList.vue';
import { startProcessInstanceApi } from '@/api/project/run';
import { execApi, getdeviceuuidApi, startupPlugin } from '@/api/application/application';
import { ElMessage } from 'element-plus';
import { continueServiceTaskApi } from '@/api/flowable/process';
const props = defineProps({
runInfo: {
@@ -178,6 +179,8 @@ const flowNodeParamData = ref<any>({});
const changeCurrentFlowNodeFun = (info: any) => {
const { node, data }: any = info;
console.log(info, 'info');
flowNode.value = node;
flowNodeData.value = data;
nodeParamDataList.value = flowNode.value?.store?.data?.data?.pageConfigList || [];
@@ -199,6 +202,19 @@ const startTaskRunJobFun = async () => {
}
};
const continueStartRunJobFun = async () => {
const res:any = await continueServiceTaskApi({
processInstanceId: flowNodeData.value.processInstanceId,
taskDefinitionKey: flowNodeData.value.nodeId,
flowelementType: flowNodeParamData.value.nodeTypeValue === '1' ? 'userTask' : 'serviceTask',
});
if (res && res.code === 200) {
refreshRunFlowInfo();
}
};
// 启动应用
const startLocalAppFun = async () => {

View File

@@ -5,7 +5,7 @@
</template>
<script setup lang="ts">
import { ref, watch, onMounted, nextTick } from 'vue';
import { ref, watch, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import { Graph } from '@antv/x6';
import { queryFlowTemplateDetailApi } from '@/api/capability/flow';
@@ -86,6 +86,9 @@ const getFlowDetail = async(uuid:string) => {
}
}
console.log(dataJson, 'dataJson');
console.log( graph.value, ' graph.value');
setTimeout(() => {
graph.value.fromJSON(dataJson);
graph.value.centerContent();
@@ -155,9 +158,6 @@ const initGraph = async() => {
return item.nodeId === node.id;
});
console.log(node, 'node');
console.log(data, 'data');
emits('change', {
node,
data,

View File

@@ -1,6 +1,6 @@
<template>
<div class="param-set-page">
<flowNodeParamTable :node-params="nodeParamData" :current-node="currentRunFlowNode" :page-info="nodeData" ></flowNodeParamTable>
<flowNodeParamTable :node-params="nodeParamData" :current-node="currentRunFlowNode" :page-info="nodeInfo" ></flowNodeParamTable>
</div>
</template>

View File

@@ -88,6 +88,11 @@ export default defineConfig(({ mode }) => {
changeOrigin: true,
rewrite: (path) => path.replace(/^\/local7107/, ''),
},
'/local7108': { // data文件模块
target: 'http://192.168.65.161:80/api/simulation/flowable', // 开发环境
changeOrigin: true,
rewrite: (path) => path.replace(/^\/local7108/, ''),
},
},
},
};