This commit is contained in:
2026-04-17 14:09:27 +08:00
35 changed files with 354 additions and 64 deletions

View File

@@ -89,3 +89,12 @@ export const stopHpcJobAdapterApi = (params: any) => {
export const delHpcJobsAdapterApi = (params: any) => {
return post(`${PREFIX}pbs/delHpcJobsAdapter`, params);
};
/**
* mockSubmit-中车hpc提交
* @param params
* @returns
*/
export const mockSubmitApi = (params: any) => {
return post(`${PREFIX}pbs/mockSubmit`, params);
};

View File

@@ -9,7 +9,9 @@
:disabled="disabled"
@change="changeFun"
>
<el-button type="primary" :disabled="disabled">选择文件</el-button>
<el-button type="primary" :disabled="disabled || (limit && fileList.length >= limit)">
选择文件
</el-button>
<template #file="{ file, index }">
<div class="file-item">
<FileIcon :fileName="file.name" />
@@ -57,6 +59,7 @@ interface Props {
modelValue: any;
disabled?: boolean;
multiple?: boolean;
limit?: any;
attrs?: any;
}
@@ -64,6 +67,7 @@ const props = withDefaults(defineProps<Props>(), {
modelValue: [],
disabled: false,
multiple: true,
limit: null,
attrs: {},
});

View File

@@ -137,6 +137,7 @@
v-model="formData[item.searchKey || item.key]"
:disabled="attrs.disabled || (item.disabled && showDisabled)"
:multiple="attrs.multiple"
:limit="attrs.limit"
@change="(val: any) => changeFun(item.key, val)"
@remove="(val: any) => removeFun(item.key, val)"
/>

View File

@@ -54,6 +54,7 @@
:belongProject="belongProject"
:parentCategoryPath="parentNodeCategoryPath"
:existingNodeCodes="existingNodeCodes"
:existingSiblingNodeNames="existingSiblingNodeNames"
:showNodeExtraInfo="showNodeExtraInfo"
@confirm="onNodeDetailConfirmFun"
v-bind="$attrs"
@@ -77,6 +78,7 @@ import {
findNodePath,
extractCategoryNodeTypes,
collectNodeCodes,
collectSiblingNodeNames,
generateFakeId,
} from '@/utils/node';
import nodeDetailDialog from './nodeDetailDialog.vue';
@@ -98,6 +100,7 @@ const addNodeDisabled = ref<any>({});
const parentNodeCategoryPath = ref<string[]>([]);
const existingNodeCodes = ref<string[]>([]);
const existingSiblingNodeNames = ref<string[]>([]); // 同层级节点名称列表
interface Props {
data: any;
@@ -211,15 +214,20 @@ const addRowFun = (nodeType?: any) => {
const checkRowData = getVxeRef()?.getCheckboxRecords(true);
let categoryPath: string[] = [];
let parentFakeId: string | null = null;
if (checkRowData && checkRowData.length > 0) {
const { fullData } = getVxeRef().getTableData();
const nodePath = findNodePath(fullData, checkRowData[0]);
if (nodePath) {
categoryPath = extractCategoryNodeTypes(nodePath);
}
parentFakeId = checkRowData[0].fakeId;
}
existingNodeCodes.value = collectNodeCodes(props.data);
const { fullData } = getVxeRef()?.getTableData() || { fullData: [] };
existingNodeCodes.value = collectNodeCodes(fullData || props.data);
existingSiblingNodeNames.value = collectSiblingNodeNames(fullData || props.data, parentFakeId);
operationType.value = OPERATION_TYPE.ADD;
modalNodeType.value = nodeType;
modalDetail.value = null;
@@ -228,7 +236,13 @@ const addRowFun = (nodeType?: any) => {
};
const openNodeModalFun = (row: any, type: OPERATION_TYPE) => {
existingNodeCodes.value = collectNodeCodes(props.data, row.fakeId);
const { fullData } = getVxeRef()?.getTableData() || { fullData: [] };
existingNodeCodes.value = collectNodeCodes(fullData || props.data, row.fakeId);
existingSiblingNodeNames.value = collectSiblingNodeNames(
fullData || props.data,
row.parentId || null,
row.fakeId
);
operationType.value = type;
modalNodeType.value = row.nodeType;
modalDetail.value = {

View File

@@ -152,6 +152,7 @@ interface Props {
belongProject?: boolean;
parentCategoryPath?: string[];
existingNodeCodes?: string[];
existingSiblingNodeNames?: string[];
enableSelectCode?: boolean;
showNodeExtraInfo?: boolean;
}
@@ -171,6 +172,7 @@ const props = withDefaults(defineProps<Props>(), {
belongProject: false,
parentCategoryPath: () => [],
existingNodeCodes: () => [],
existingSiblingNodeNames: () => [],
enableSelectCode: false,
showNodeExtraInfo: false,
});
@@ -570,16 +572,28 @@ watch(
);
const ruleData = computed(() => ({
nodeName: [
{
message: t('工况库.同层级名称已存在'),
trigger: 'blur',
validator: (val: unknown) => {
if (!val) {
return true;
}
return !props.existingSiblingNodeNames?.includes(val as string);
},
},
],
nodeCode: [
// {
// message: t('工况库.编号已存在'),
// trigger: 'blur',
// validator: (val: unknown) => {
// if (!val) return true;
// if (formData.value.nodeType === NODE_TYPE.DISCIPLINE) return true;
// return !props.existingNodeCodes?.includes(val as string);
// },
// },
{
message: t('工况库.编号已存在'),
trigger: 'blur',
validator: (val: unknown) => {
if (!val) return true;
if (formData.value.nodeType === NODE_TYPE.DISCIPLINE) return true;
return !props.existingNodeCodes?.includes(val as string);
},
},
],
nodeType: [
{

View File

@@ -9,7 +9,9 @@
:disabled="disabled"
@change="changeFun"
>
<el-button type="primary">上传文件</el-button>
<el-button type="primary" :disabled="disabled || (limit && fileList.length >= limit)">
上传文件
</el-button>
<template #file="{ file, index }">
<div :key="index" class="file-item">
<div class="file-icon">

View File

@@ -28,7 +28,9 @@
>
<el-button
type="primary"
v-else-if="flowNodeParamData.nodeTypeValue === '3'"
v-else-if="
flowNodeParamData.nodeTypeValue === '3' || flowNodeParamData.label === '动力学计算'
"
@click="flowClickFun('startOtherNodeFun')"
>计算</el-button
>

View File

@@ -425,9 +425,9 @@ const refrehFun = () => {
onMounted(async () => {
await getAppInfo();
timer.value = setInterval(() => {
refrehFun();
}, 60 * 1000);
// timer.value = setInterval(() => {
refrehFun();
// }, 60 * 1000);
});
onBeforeUnmount(() => {

View File

@@ -7,7 +7,12 @@
<el-button type="primary" icon="finished" @click="openAddApproveUserFun">
{{ $t('工况库.提交评审') }}
</el-button>
<el-button type="danger" icon="delete" @click="openDelPoolFun">
<el-button
v-if="!enableConfigByTenant([TENANT_ENUM.LYRIC])"
type="danger"
icon="delete"
@click="openDelPoolFun"
>
{{ $t('工况库.删除库') }}
</el-button>
<div class="pool-select select-form">
@@ -68,6 +73,7 @@
</div>
</el-tooltip>
<el-tooltip
v-if="!enableConfigByTenant([TENANT_ENUM.LYRIC])"
:content="$t('工况库.切换至一维表格视图')"
placement="top"
:disabled="currentTableType !== TableViewType.CARD"
@@ -153,7 +159,10 @@
</div>
</el-tooltip>
<el-tooltip
v-if="currentTableType === TableViewType.TREE"
v-if="
currentTableType === TableViewType.TREE &&
!enableConfigByTenant([TENANT_ENUM.LYRIC])
"
:content="$t('工况库.切换至一维表格视图')"
placement="top"
ref="switchFromTreeToListTooltipRef"
@@ -330,6 +339,7 @@ import { TABLE_NAME } from '@/utils/enum/tableName';
import { CommonStore } from '@/stores/common';
import { useTaskStore } from '@/stores/taskPool';
import { jumpPage } from '@/utils/common';
import { enableConfigByTenant, TENANT_ENUM } from '@/tenants/tenant';
const commonStore = CommonStore();
const taskStore = useTaskStore();
@@ -544,6 +554,32 @@ const validateFun = (): boolean => {
ElMessage.warning(t('工况库.编号不能为空', { names }));
return false;
}
const normalizeParentId = (parentId: any) => {
return parentId === null || parentId === undefined || parentId === '' ? '__ROOT__' : parentId;
};
const sameLevelNameMap = new Map<string, string[]>();
visibleData.forEach((n: any) => {
const nodeName = String(n.nodeName || '').trim();
if (!nodeName) {
return;
}
const key = `${normalizeParentId(n.parentId)}__${nodeName}`;
sameLevelNameMap.set(key, [...(sameLevelNameMap.get(key) || []), n.fakeId]);
});
const duplicateNameNode = visibleData.find((n: any) => {
const nodeName = String(n.nodeName || '').trim();
if (!nodeName) {
return false;
}
const key = `${normalizeParentId(n.parentId)}__${nodeName}`;
return (sameLevelNameMap.get(key) || []).length > 1;
});
if (duplicateNameNode) {
ElMessage.warning(t('工况库.同一层级下存在重复的名称', { names: duplicateNameNode.nodeName }));
return false;
}
const codeSet = new Set<string>();
const duplicates: string[] = [];
visibleData.forEach((n: any) => {
@@ -558,8 +594,8 @@ const validateFun = (): boolean => {
}
});
if (duplicates.length > 0) {
// ElMessage.warning(t('标准场景库.存在重复的编号', { codes: duplicates.join(', ') }));
// return false;
ElMessage.warning(t('工况库.存在重复的编号', { codes: duplicates.join(', ') }));
return false;
}
if (!isEmptyPool.value && !isHaveNotSave()) {
ElMessage.warning(t('工况库.没有修改的数据需要提交审批'));
@@ -796,6 +832,7 @@ const createTaskPoolFun = async (formData: any) => {
approvePreviewInfo: {
isCreate: true,
isUpdate: false,
currentVersion: '',
columns,
finalFullData: fullData,
originalFullData: null,
@@ -858,6 +895,7 @@ const updateTaskPoolFun = async (formData: any) => {
approvePreviewInfo: {
isCreate: false,
isUpdate: true,
currentVersion: currentPoolBriefVersion.value?.poolVersion || '',
columns,
originalFullData: cloneDeep(originalSnapshot),
finalFullData: cloneDeep(fullData),

View File

@@ -157,9 +157,11 @@ const lang = {
: 'Please add in order ({order})',
: 'Target value must be a number when indicator type is numeric',
: 'Code already exists',
: 'Name already exists at the same level, please modify',
: 'Name cannot be empty',
: 'Code cannot be empty for: {names}',
: 'Duplicate codes found: {codes}',
: 'Duplicate names found at the same level: {names}',
: 'Delete',
: 'Create Map Pool',
Excel: 'Import Excel',

View File

@@ -156,9 +156,11 @@ const lang = {
: '请按照顺序({order})添加',
: '指标类型为数值时,目标值应为数字',
: '编号已存在',
: '同层级名称已存在,请修改名称',
: '名称不能为空',
: '以下节点编号不能为空:{names}',
: '存在重复的编号:{codes}',
: '同一层级下存在重复的名称:{names}',
: '删除',
: '创建地图库',
Excel: '导入Excel',

View File

@@ -468,6 +468,41 @@ export const collectNodeCodes = (nodes: TreeNode[], excludeFakeId?: string): str
return codes;
};
export const collectSiblingNodeNames = (
nodes: TreeNode[],
parentFakeId: string | null,
excludeFakeId?: string
): string[] => {
const names: string[] = [];
if (parentFakeId === null) {
nodes.forEach((node) => {
if (node.nodeName && node.fakeId !== excludeFakeId) {
names.push(node.nodeName);
}
});
return names;
}
let siblingNodes: TreeNode[] = [];
traverseTree(
nodes,
(node) => {
if (node.fakeId === parentFakeId) {
siblingNodes = Array.isArray(node.children) ? node.children : [];
}
},
null
);
siblingNodes.forEach((child) => {
if (child.nodeName && child.fakeId !== excludeFakeId) {
names.push(child.nodeName);
}
});
return names;
};
export const STANDARD_SCENE_POOL_NAME = '标准场景库';
export const VIRTUAL_NODE_NAME = '__VIRTUAL_ROOT_NODE_NAME__';

View File

@@ -451,6 +451,32 @@ const validateFun = (): boolean => {
ElMessage.warning(t('工况库.编号不能为空', { names }));
return false;
}
const normalizeParentId = (parentId: any) => {
return parentId === null || parentId === undefined || parentId === '' ? '__ROOT__' : parentId;
};
const sameLevelNameMap = new Map<string, string[]>();
visibleData.forEach((n: any) => {
const nodeName = String(n.nodeName || '').trim();
if (!nodeName) {
return;
}
const key = `${normalizeParentId(n.parentId)}__${nodeName}`;
sameLevelNameMap.set(key, [...(sameLevelNameMap.get(key) || []), n.fakeId]);
});
const duplicateNameNode = visibleData.find((n: any) => {
const nodeName = String(n.nodeName || '').trim();
if (!nodeName) {
return false;
}
const key = `${normalizeParentId(n.parentId)}__${nodeName}`;
return (sameLevelNameMap.get(key) || []).length > 1;
});
if (duplicateNameNode) {
ElMessage.warning(t('工况库.同一层级下存在重复的名称', { names: duplicateNameNode.nodeName }));
return false;
}
const codeSet = new Set<string>();
const duplicates: string[] = [];
visibleData.forEach((n: any) => {
@@ -465,8 +491,8 @@ const validateFun = (): boolean => {
}
});
if (duplicates.length > 0) {
// ElMessage.warning(t('工况库.存在重复的编号', { codes: duplicates.join(', ') }));
// return false;
ElMessage.warning(t('工况库.存在重复的编号', { codes: duplicates.join(', ') }));
return false;
}
if (!isEmptyPool.value && !isHaveNotSave()) {
ElMessage.warning(t('工况库.没有修改的数据需要提交审批'));
@@ -583,6 +609,7 @@ const createTaskPoolFun = async (formData: any) => {
approvePreviewInfo: {
isCreate: true,
isUpdate: false,
currentVersion: '',
columns,
finalFullData: fullData,
originalFullData: null,
@@ -640,6 +667,7 @@ const updateTaskPoolFun = async (formData: any) => {
approvePreviewInfo: {
isCreate: false,
isUpdate: true,
currentVersion: currentPoolBriefVersion.value?.poolVersion || '',
columns,
originalFullData: cloneDeep(originalSnapshot),
finalFullData: cloneDeep(fullData),

View File

@@ -322,7 +322,7 @@ import { exportToPdf } from '@/utils/exportPdf';
import { CommonStore } from '@/stores/common';
import dayjs from 'dayjs';
import { getPageStorage, setPageStorage } from '@/utils/common';
import { getOptions } from './libs';
import { getOptions } from './lib';
const commonStore = CommonStore();

View File

@@ -871,7 +871,7 @@ const reloadFun = () => {
const reloadNodeFun = () => {
FileTreeRef.value?.reloadNodeFun(currentData.value.id);
BaseTableRef.value?.resetFun();
// BaseTableRef.value?.resetFun();
};
const AddFileRef = ref<any>();

View File

@@ -4,7 +4,7 @@
<div class="label">
<span v-if="isCreatePool">{{ $t('工况库.新增') }}</span
><span v-else>{{ $t('工况库.编辑') }}</span
>{{ $t('工况库.仿真地图库') }}
>{{ poolName === STANDARD_SCENE_POOL_NAME ? STANDARD_SCENE_POOL_NAME : '仿真地图库' }}
</div>
<div class="content">
<span size="large" type="success" v-if="isCreatePool"> {{ poolName }}</span>
@@ -25,6 +25,10 @@
</div>
</div>
</div>
<div v-if="!isCreatePool && currentVersionText" class="preview-desc">
基于{{ poolName === STANDARD_SCENE_POOL_NAME ? STANDARD_SCENE_POOL_NAME : '仿真地图库' }}版本
{{ currentVersionText }} 修改内容如下
</div>
<div class="body">
<loadCaseTable
:editMode="false"
@@ -46,6 +50,7 @@ import { nextTick, onMounted, ref, watchEffect } from 'vue';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
import type { VxeTablePropTypes } from 'vxe-table';
import { TABLE_NAME } from '@/utils/enum/tableName';
import { STANDARD_SCENE_POOL_NAME } from '@/utils/node';
interface Props {
data: any;
@@ -62,6 +67,7 @@ enum PreviewAction {
}
const poolName = ref();
const currentVersionText = ref('');
const approveContents = ref<any>(null);
const mergedPreviewTree = ref<any>([]);
@@ -228,6 +234,7 @@ const initPreviewData = () => {
mergedPreviewTree.value = previewData;
poolName.value = approveContents.value?.poolBrief?.poolName;
currentVersionText.value = approvePreviewInfo.currentVersion || '';
isCreatePool.value = Boolean(approvePreviewInfo.isCreate);
expandAllFun();
};
@@ -259,6 +266,12 @@ watchEffect(() => {
flex-direction: column;
}
.preview-desc {
padding: 12px 0;
font-size: 14px;
color: #303133;
}
.header {
height: 20px;
display: flex;

View File

@@ -435,6 +435,7 @@ import analysisResult from './runPagecomponent/analysisResult.vue';
import vehicleStabilityAnalysis_Demo from './runPagecomponent/vehicleStabilityAnalysis_Demo.vue';
import rollingWheelForceAnalysis_Demo from './runPagecomponent/rollingWheelForceAnalysis_Demo.vue';
import vibrationSignalAnalysis_Demo from './runPagecomponent/vibrationSignalAnalysis_Demo.vue';
import { mockSubmitApi } from '@/api/pbs/pbs';
const props = defineProps({
runInfo: {
@@ -838,6 +839,26 @@ const continueStartRunJobFun = async () => {
taskDefinitionKey: flowNodeData.value.nodeId,
flowelementType: flowNodeData.value.nodeDetailInfo.type,
});
if (flowNodeData.value.nodeName === '动力学计算') {
await skipCurrentNodeFlowFun();
await mockSubmitApi({
runId: props.runInfo.uuid,
uuid: 'd03cb60715b1ee61c585b3e31405e7de',
type: 'single',
softwareId: flowNodeData.value.nodeId,
software: flowNodeData.value.nodeName,
jobName: '测试单一任务0326',
coreNum: 4,
jobDesc: 'HPC任务单独提交',
hpcGroup: 'HPC_PACK',
params: {
licience: 'test',
},
});
}
if (res && res.code === 200) {
refreshFlowPage();
}
@@ -1313,6 +1334,11 @@ const getDictionaryDataFun = async () => {
};
const skipCurrentNodeFlowFun = async () => {
await updateFlowNodeDataInfoFun();
if (!flowNodeData.value?.nodeDetailInfo.asyncTaskId) {
return;
}
const params = {
asyncTaskId: flowNodeData.value?.nodeDetailInfo.asyncTaskId,
resultJson: 'success',

View File

@@ -8,7 +8,9 @@
<div class="app-icon app-text" v-else>{{ appProperty?.name.split('')[0] }}</div>
<div class="app-info">
<div class="app-name" :title="appProperty.name">{{ appProperty.name }}</div>
<div class="app-tag">{{ appProperty.type }}</div>
<div class="app-tag">
{{ appProperty.name === '动力学计算' ? '计算节点' : appProperty.type }}
</div>
</div>
<div class="app-status">
<div class="round" :style="{ background: getStyleFun(appProperty.status).color }"></div>
@@ -53,12 +55,12 @@ const applist = ref<any>([
// };
const getStyleFun = (flag: any) => {
if (applist.value.includes(appProperty.name)) {
return {
color: '#67c23a',
title: '已完成',
};
}
// if (applist.value.includes(appProperty.name)) {
// return {
// color: '#67c23a',
// title: '已完成',
// };
// }
const styles: any = {
active: {
color: '#409eff',

View File

@@ -157,10 +157,10 @@ const initGraph = async () => {
panning: {
enabled: true,
},
interacting: {
// 禁用画布拖拽
nodeMovable: false,
},
// interacting: {
// // 禁用画布拖拽
// nodeMovable: false,
// },
container: document.getElementById('flow-view-content') as HTMLElement,
autoResize: true,
// 画布的最小最大缩放级别

View File

@@ -43,7 +43,7 @@
</template>
<template #software="{ row }">
<div calss="img-box">
<img width="14" :src="getAppImg(row)" alt="" />
<img width="20" class="mar5" :src="getAppImg(row)" alt="" />
<span>{{ row.software }}</span>
</div>
</template>
@@ -457,4 +457,13 @@ onBeforeUnmount(() => {
align-items: center;
justify-content: center;
}
.img-box{
display: flex;
align-items: center;
}
.mar5{
margin-right: 5px;
}
</style>

View File

@@ -675,7 +675,7 @@ const queryDirDataFun = async (param: any) => {
const list = res.data.data.map((item: any) => {
return {
...item,
id: item.fileId,
// id: item.fileId,
originalName: item.name,
};
});
@@ -809,6 +809,9 @@ const submitFun = async () => {
...uploadFIleFormData,
};
console.log(paramData, 'paramData');
console.log(uploadFIleFormData, 'uploadFIleFormData');
if (fileList.length) {
const file = fromData.uploadFile[0].raw;
@@ -880,6 +883,7 @@ const actionList = ref([
click: (row: any) => {
visible.value = true;
currentFileInfo.value = row;
nextTick(async () => {
tableFormRef.value.setFormDataFun(currentFileInfo.value);
fileList.value = [];
@@ -1400,11 +1404,11 @@ const submitFun2 = async () => {
})?.label;
const paramXQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === tableData2.value[i].xQuantityType;
return item.name === tableData2.value[i].xquantityType;
})?.label;
const paramYQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === tableData2.value[i].yQuantityType;
return item.name === tableData2.value[i].yquantityType;
})?.label;
if (paramQuantityType) {
@@ -1417,6 +1421,9 @@ const submitFun2 = async () => {
params.yQuantityType = paramYQuantityType;
}
params.xUnits = params.xunits;
params.yUnits = params.yunits;
delete params.xUnitsList;
delete params.yunitsList;
delete params.xunitsList;
@@ -1433,6 +1440,7 @@ const submitFun2 = async () => {
ElMessage.success('上传成功');
reloadFun();
}
tableData2.value = [];
uploadFileVisible.value = false;
};

View File

@@ -139,22 +139,24 @@
</taskPerformance>
</div>
<div class="task-tab-content set-tab-content" v-if="keyResultType === 'resultImage'">
<resultImage
<taskResultImage
v-if="keyResultType === 'resultImage'"
:task-id="currentTaskInfo?.uuid"
:taskData="currentTaskInfo"
:task-data="currentTaskInfo"
:show-checkbox="showCheckbox"
:no-auth="noAuth"
:show-left-options="showLeftOptions"
:canUpdate="isPMemberOrEMember"
></resultImage>
></taskResultImage>
</div>
<div class="task-tab-content set-tab-content" v-if="keyResultType === 'curveView'">
<taskCurve
<taskResultCsv
v-if="keyResultType === 'curveView'"
:task-id="currentTaskInfo?.uuid"
:taskData="currentTaskInfo"
:task-data="currentTaskInfo"
:show-checkbox="showCheckbox"
:no-auth="noAuth"
:show-left-options="showLeftOptions"
:canUpdate="isPMemberOrEMember"
></taskCurve>
></taskResultCsv>
</div>
<div class="task-tab-content set-tab-content" v-if="keyResultType === 'video'">
<videoFile
@@ -319,10 +321,8 @@ import { onMounted, reactive, ref, watch, provide } from 'vue';
import Dialog from '@/components/common/dialog/index.vue';
import taskInfo from '@/components/taskDetail/taskInfo.vue';
import taskPerformance from '@/components/taskDetail/taskPerformance.vue';
import resultImage from '@/components/taskDetail/resultImage.vue';
import taskReport from '@/components/taskDetail/taskReport.vue';
import taskModel from '@/components/taskDetail/taskModel.vue';
import taskCurve from '@/components/taskDetail/taskCurve.vue';
import task3DModel from '@/components/taskDetail/task3DModel.vue';
import { ElMessage } from 'element-plus';
import { deliverableApproveApi } from '@/api/project/run';
@@ -339,6 +339,8 @@ import { enableConfigByTenant, TENANT_ENUM } from '@/tenants/tenant';
import BaseTable from '@/components/common/table/baseTable.vue';
import { pageApi } from '@/api/system/systemLog';
import DemandPreview from '@/views/task/simulationTask/newDemand/components/preview.vue';
import taskResultImage from '@/views/task/execution/components/taskDetailPage/components/taskResultImage.vue';
import taskResultCsv from '@/views/task/execution/components/taskDetailPage/components/taskResultCsv.vue';
const emits = defineEmits(['closeFn', 'updateFn']);
const props = defineProps({
@@ -370,6 +372,14 @@ const props = defineProps({
type: Boolean,
default: true,
},
noAuth: {
type: Boolean,
default: false,
},
showCheckbox: {
type: Boolean,
default: true,
},
});
watch(

View File

@@ -173,6 +173,13 @@ const actionList = ref([
planTime: [row.beginTime, row.endTime],
};
},
hide: (row: any) => {
return (
row.exeStatus === TASK_PROCESS_STATUS.REJECTED ||
row.exeStatus === TASK_PROCESS_STATUS.CLOSED_LOOP ||
row.exeStatus === TASK_PROCESS_STATUS.CANCELED
);
},
},
...props.actionList,
{

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-animation">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="动画仿真" />
</div>
<div class="form">
@@ -51,11 +51,15 @@ import {
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -133,6 +137,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
if (key === 'endTime') {

View File

@@ -10,6 +10,7 @@
<Robot
v-if="currentName === 'robot'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"
@@ -17,6 +18,7 @@
<Animation
v-if="currentName === 'animation'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"
@@ -24,6 +26,7 @@
<FiniteElement
v-if="currentName === 'finiteElement'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"
@@ -31,6 +34,7 @@
<Industry
v-if="currentName === 'industry'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"
@@ -38,6 +42,7 @@
<Logistics
v-if="currentName === 'logistics'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"
@@ -45,6 +50,7 @@
<Tolerance
v-if="currentName === 'tolerance'"
ref="CurrentRef"
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
@submit="submitFun"

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-finite-element">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="有限元仿真" />
</div>
<div class="form">
@@ -76,11 +76,15 @@ import {
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -168,6 +172,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
if (key === 'endTime') {

View File

@@ -70,38 +70,44 @@
<Animation
v-if="currentName === 'animation'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
<FiniteElement
v-if="currentName === 'finiteElement'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
<Industry
v-if="currentName === 'industry'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
<Logistics
v-if="currentName === 'logistics'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
<Robot
v-if="currentName === 'robot'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
<Tolerance
v-if="currentName === 'tolerance'"
ref="CurrentRef"
@submit="submitFun"
:simulationType="diaTitle"
:deptOptions="deptOptions"
@submit="submitFun"
/>
</div>
<template #footer>

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-industry">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="工业设计" />
</div>
<div class="form">
@@ -50,11 +50,15 @@ import {
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -131,6 +135,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
};

View File

@@ -255,11 +255,12 @@ export const toggleMaterialNo = (data: any) => {
// 设置确认人
export const setPMemberName = async (data: any) => {
const { formData = {} } = data;
const { formData = {}, simulationType } = data;
const { projectUndertaker, simType } = formData;
const params = {
deptName: projectUndertaker,
discipline: simType,
simulationType,
};
if (!(projectUndertaker && simType)) {
formData.pMemberName = '';

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-logistics">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="物流仿真" />
</div>
<div class="form">
@@ -54,11 +54,15 @@ import dayjs from 'dayjs';
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -138,6 +142,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
if (key === 'endTime') {

View File

@@ -4,6 +4,8 @@
v-if="currentName === 'robot'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -11,6 +13,8 @@
v-if="currentName === 'animation'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -18,6 +22,8 @@
v-if="currentName === 'finiteElement'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -25,6 +31,8 @@
v-if="currentName === 'industry'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -32,6 +40,8 @@
v-if="currentName === 'logistics'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -39,6 +49,8 @@
v-if="currentName === 'tolerance'"
ref="CurrentRef"
type="preview"
hideTips
:simulationType="diaTitle"
:data="detailData"
:deptOptions="deptOptions"
/>
@@ -64,6 +76,7 @@ const props = withDefaults(defineProps<Props>(), {
demandId: '',
});
const diaTitle = ref('');
const deptOptions = ref<any>([]);
onMounted(() => {
@@ -92,6 +105,7 @@ const getDetailFun = () => {
};
getDemandDetailApi(params).then((res: any) => {
if (res.code === 200) {
diaTitle.value = res.data.demandType;
detailData.value = res.data;
currentName.value = titleMap[res.data.demandType];
}

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-robot">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="机器人仿真" />
</div>
<div class="form">
@@ -51,11 +51,15 @@ import {
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -140,6 +144,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
if (key === 'endTime') {

View File

@@ -1,7 +1,7 @@
<template>
<div class="comp-tolerance">
<div class="content">
<div class="tips">
<div v-if="!hideTips" class="tips">
<PlanningInformation data="公差分析" />
</div>
<div class="form">
@@ -48,11 +48,15 @@ import {
interface Props {
data?: any;
type?: string;
hideTips?: boolean;
simulationType?: string;
}
const props = withDefaults(defineProps<Props>(), {
data: null,
type: 'edit',
hideTips: false,
simulationType: '',
});
const disabled = ref(props.type === 'preview');
@@ -133,6 +137,7 @@ const changeFun = async (cbData: any) => {
if (key === 'simType') {
setPMemberName({
formData: editFormInfo.value,
simulationType: props.simulationType,
});
}
if (key === 'endTime') {

View File

@@ -109,6 +109,13 @@ const actionList = ref([
formVisible.value = true;
// visibleDialog(false, row);
},
hide: (row: any) => {
return (
row.demandStatus === TASK_PROCESS_STATUS.REJECTED ||
row.demandStatus === TASK_PROCESS_STATUS.CLOSED_LOOP ||
row.demandStatus === TASK_PROCESS_STATUS.CANCELED
);
},
},
{
title: '删除',