This commit is contained in:
2026-02-03 11:28:04 +08:00
19 changed files with 336 additions and 53 deletions

View File

@@ -169,8 +169,7 @@ export const queryProjectPdtApi = (params: any) => {
return get(`${PREFIX}node/queryProjectPdt`, params);
};
/**
* queryType: 区分人员状态的标识为空代表查询所有状态的人员0存在, 1删除 , 2冻结
* @param params
* @param params queryType: 区分人员状态的标识为空代表查询所有状态的人员0存在, 1删除 , 2冻结
* @returns
*/
export const queryProjectMemberApi = (params: any) => {
@@ -210,5 +209,5 @@ export const batchUpdateWorkspaceExtraApi = (params: any) => {
* @returns
*/
export const modifyWithApproveAPi = (params: any) => {
return post(`${PREFIX}node/modifyWithApprove`, params);
return post(`${PREFIX}project/modifyWithApprove`, params);
};

View File

@@ -157,9 +157,9 @@
</BaseTable>
</div>
<div class="operate-box">
<el-button type="primary" @click="referenceParamFun">引用参数</el-button>
<el-button type="primary" @click="paramToLibFun">参数入库</el-button>
<el-button type="primary" @click="saveNodeParamFun">保存参数</el-button>
<el-button type="" @click="referenceParamFun">引用参数</el-button>
<!-- <el-button type="primary" @click="saveNodeParamFun">保存参数</el-button> -->
</div>
<parameterArchive

View File

@@ -27,8 +27,10 @@
<el-tag v-else type="primary">{{ WORK_STATUS.O[row.jobStatus] }}</el-tag>
</template>
<template #software="{ row }">
<img width="20" :src="getAppImg(row)" alt="" />
<span>{{ row.software }}</span>
<div class="img-box">
<img width="14" :src="getAppImg(row)" alt="" />
<span>{{ row.software }}</span>
</div>
</template>
</BaseTable>
</div>
@@ -145,4 +147,16 @@ onMounted(async () => {
height: 100%;
}
}
.img-box {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
.img {
border-radius: 2px;
}
}
</style>

View File

@@ -24,6 +24,7 @@ const props = defineProps({
const params = computed(() => {
return {
projectId: props.nodeId,
queryType: 0,
};
});

View File

@@ -47,8 +47,8 @@ export const tagSortList = [
'tag6',
'tag7',
'tag8',
'tag9',
'tag10',
// 'tag9',
// 'tag10',
];
export const getTagKeyMap = () => {

View File

@@ -322,7 +322,7 @@ const lang = {
: 'Scheme Maintenance',
: 'Batch Information',
线: 'Production Line Information',
PDT: 'Project PDT',
: 'Project User',
: 'Workspace Time',
},
};

View File

@@ -317,7 +317,7 @@ const lang = {
: '方案维护',
: '批次信息',
线: '产线信息',
PDT: '项目PDT',
: '项目参与人员',
: '工位时间维护',
},
};

View File

@@ -74,6 +74,7 @@ export const getTaskAchieveStyleClass = (status: number) => {
};
/**
* 需要修改members
* 专门处理任务的人员,防止后续任务再加人
* @param disposeKey
* @param row

View File

@@ -0,0 +1,126 @@
<template>
<div class="approval-page">
<div class="approval-page-content">
<loadCaseTable
:editMode="false"
ref="treeTableRef"
readonly
tableName="PROJECT_TASK_PLANNING"
:data="mergedPreviewTree"
:hasOperationColumn="false"
:showCheckBox="false"
:rowClassName="rowClassName"
>
</loadCaseTable>
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
import { getTaskTreeFun } from '@/views/task/projectDetail/components/projectApi';
const props = defineProps({
pageData: {
type: Object,
default: () => {},
},
});
const mergedPreviewTree = ref<any>([]);
const addUuids = ref<any>([]);
const delUuids = ref<any>([]);
const editUuids = ref<any>([]);
const isCreatePool = ref(false);
// 获取审批内容
const getapprovalCOntentFun = async (data: any) => {
const approveContents = JSON.parse(data?.approveContents as string);
const { phaseNodeId, projectNodeId, deleteNodeList, editNodeList, addNodeList } = approveContents;
getUUids(deleteNodeList, delUuids.value);
getUUids(editNodeList, editUuids.value);
getUUids(addNodeList, addUuids.value);
const treeData = await getTaskTreeFun(projectNodeId, phaseNodeId);
if (treeData.length) {
mergedPreviewTree.value = treeData;
isCreatePool.value = false;
} else {
mergedPreviewTree.value = addNodeList;
isCreatePool.value = true;
}
};
const getUUids = (list: any, arr: any) => {
for (let i = 0; i < list.length; i++) {
if (list[i].uuid) {
arr.push(list[i].uuid);
}
if (list[i].nodeId) {
arr.push(list[i].nodeId);
}
if (list[i]?.children?.length) {
getUUids(list[i]?.children, arr);
}
}
};
const rowClassName: any = ({ row }: any) => {
if (!row) return '';
if (isCreatePool.value) {
return 'preview-added';
}
if (addUuids.value.includes(row.uuid) || addUuids.value.includes(row.nodeId)) {
return 'preview-added';
} else if (editUuids.value.includes(row.uuid) || editUuids.value.includes(row.nodeId)) {
return 'preview-updated';
} else if (delUuids.value.includes(row.uuid) || delUuids.value.includes(row.nodeId)) {
return 'preview-deleted';
}
return '';
};
onMounted(async () => {
if (props.pageData) {
getapprovalCOntentFun(props.pageData);
console.log(props.pageData, 'props.pageData');
}
});
</script>
<style lang="scss" scoped>
.approval-page {
width: 100%;
height: 100%;
background-color: #fff;
.approval-page-tooltips {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: flex-end;
}
.approval-page-content {
width: 100%;
// height: calc(100% - 40px);
height: 100%;
}
}
.legend-color.added {
background-color: var(--el-color-success-light-7);
}
.legend-color.updated {
background-color: var(--el-color-primary-light-7);
}
.legend-color.deleted {
background-color: var(--el-color-danger-light-7);
}
</style>

View File

@@ -7,6 +7,7 @@
<DeliverableFile v-else-if="data.approveType === 4" :data="data" />
<Parameter v-else-if="data.approveType === 5" :data="data" />
<reportDetail v-else-if="data.approveType === 6" :data="data" />
<simulationPlan v-else-if="data.approveType === 7" :page-data="data"></simulationPlan>
<div v-else>其他审核预览{{ data.cidFlowId }}</div>
</div>
</div>
@@ -22,6 +23,7 @@ import FlowView from '@/components/common/flow/flowView.vue';
import DeliverableFile from './components/deliverableFile.vue';
import Parameter from './components/parameter.vue';
import reportDetail from './components/reportDetail.vue';
import simulationPlan from '@/views/index/approvalPreview/components/simulationPlan.vue';
const w: any = window;
const $wujie: any = w.$wujie;

View File

@@ -35,7 +35,7 @@ import { ref } from 'vue';
const configList = [
{
label: '部配置',
label: '事业部配置',
value: 'department',
},
{

View File

@@ -601,7 +601,7 @@ const createRunFun = async (data: any) => {
const runUuid = res.data;
const runInfo = await getRunDetailInfoFun(runUuid);
await createRunResultDirFun(runUuid);
createRunResultDirFun(runUuid);
// 创建完算例后创建算例下的文件夹
// info.label = info.runNames;

View File

@@ -57,8 +57,9 @@
@click="startTaskRunJobFun"
>开始</el-button
>
<el-button type="primary" @click="visible = true">HPC列表</el-button>
<el-button @click="refreshFun">刷新</el-button>
<el-button @click="visible = true">HPC列表</el-button>
</div>
</div>
@@ -754,6 +755,7 @@ const justStartLocalAppFun = async () => {
if (res2 && res2.code === 200) {
}
ElMessage.success('应用正在启动中,请等待');
refreshFun();
} else {
}
}
@@ -1156,13 +1158,23 @@ watch(
}
);
const timer = ref<any>(null);
onMounted(async () => {
await getDictionaryDataFun();
emitter.on('UPLOAD_FINISHED', uploadFinishedFun);
// 5分钟自动刷新一次流程信息
timer.value = setInterval(
() => {
refreshFun();
},
5 * 60 * 1000
);
});
onBeforeUnmount(() => {
emitter.off('UPLOAD_FINISHED', uploadFinishedFun);
clearInterval(timer.value);
});
onActivated(() => {

View File

@@ -1,7 +1,6 @@
<template>
<div class="run-job-page">
<BaseTable
showIndex
ref="baseTableRef"
tableName="RUN_JOB_TABLE"
:api="queryJobsApi"
@@ -28,15 +27,17 @@
<el-tag v-else type="primary">{{ WORK_STATUS.O[row.jobStatus] }}</el-tag>
</template>
<template #software="{ row }">
<img width="20" :src="getAppImg(row)" alt="" />
<span>{{ row.software }}</span>
<div calss="img-box">
<img width="14" :src="getAppImg(row)" alt="" />
<span>{{ row.software }}</span>
</div>
</template>
</BaseTable>
</div>
</template>
<script setup lang="ts">
import { onBeforeMount, onMounted, ref } from 'vue';
import { onBeforeUnmount, onMounted, ref } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import { queryJobsApi, stopHpcJobApi } from '@/api/pbs/pbs';
import { useDict } from '@/utils/useDict';
@@ -110,7 +111,7 @@ const getAppInfo = async () => {
};
const refrehFun = () => {
baseTableRef.value.resetFun();
baseTableRef.value?.resetFun();
};
defineExpose({
@@ -129,7 +130,7 @@ onMounted(async () => {
await getAppInfo();
});
onBeforeMount(() => {
onBeforeUnmount(() => {
clearInterval(timer.value);
});
</script>
@@ -139,4 +140,16 @@ onBeforeMount(() => {
width: 100%;
height: 100%;
}
.img-box {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
.img {
border-radius: 2px;
}
}
</style>

View File

@@ -32,16 +32,13 @@
:action-list="actionList"
:show-setting="false"
>
<template #leftOptions>
<!-- <template #leftOptions>
<el-button @click="ArchiveRunDataFun">归档</el-button>
<el-button type="primary" v-if="getdirNameFun() != '报告结果'" @click="viewFun"
>查看</el-button
>
<el-button @click="openFun">上传文件</el-button>
<!-- <el-upload :show-file-list="false" :before-upload="beforeUploadFun">
<el-button>上传文件</el-button>
</el-upload> -->
</template>
</template> -->
</BaseTable>
</div>
<div class="operate-box">

View File

@@ -224,7 +224,9 @@ const submitApprovalFun = async () => {
};
const systemApproveQueryApproveFlowTempalteFun = async () => {
const res: any = await systemApproveQueryApproveFlowTempalteApi({});
const res: any = await systemApproveQueryApproveFlowTempalteApi({
moduleCode: 'SIMULATION_TASK_APPROVAL',
});
if (res && res.code === 200) {
templateList.value = res.data;

View File

@@ -112,7 +112,7 @@
</template>
</div>
</el-tab-pane>
<el-tab-pane v-if="enableConfigByTenant([TENANT_ENUM.LYRIC])" :label="$t('项目详情页.项目PDT')" name="PDT">
<el-tab-pane v-if="enableConfigByTenant([TENANT_ENUM.LYRIC])" :label="$t('项目详情页.项目参与人员')" name="PDT">
<PDT
ref="productionLineRef"
v-if="displayedTabs.includes('PDT') && projectUuid"

View File

@@ -203,6 +203,16 @@
:currentPhase="currentPhase"
></nodeLevel2Select>
</el-form-item>
<el-form-item label="版本:">
<el-select v-model="currentProjectPhaseTaskTreeVersion">
<el-option
v-for="item in projectPhaseVersionList"
:key="item.id"
:label="item.currentVersion"
:value="item.currentVersion"
></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="right-table">
@@ -277,6 +287,13 @@
</div>
</template>
</Dialog>
<AddApprove
v-model="dialogApproveUserVisible"
:isInitial="isEmptyPool"
:moduleCode="'SIMULATION_PLAN_APPROVAL'"
@confirm="onAddApproveConfirmFun"
/>
</template>
<script lang="ts" setup>
import Dialog from '@/components/common/dialog/index.vue';
@@ -297,7 +314,7 @@ import nodeLevel2Select from '@/components/project/nodeLevel2Select.vue';
import { getTaskTreeFun } from '../../projectDetail/components/projectApi';
import { disposeTagKey } from '../../projectDetail/components/project';
import { disposeTaskMembers, getTagMapList } from '@/utils/task';
import { modifyNodeTaskPerformanceApi } from '@/api/project/node';
import { modifyNodeTaskPerformanceApi, modifyWithApproveAPi } from '@/api/project/node';
import { TASK_CALCULATE_STATUS, TASK_PROCESS_STATUS } from '@/utils/enum/task';
import dayjs from 'dayjs';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
@@ -307,6 +324,8 @@ import ProjectSelect from '@/components/common/projectSelect/index.vue';
import { TABLE_NAME } from '@/utils/enum/tableName';
import TableForm from '@/components/common/table/tableForm.vue';
import { CommonStore } from '@/stores/common';
import AddApprove from '@/views/competenceCenter/condition/components/addApprove.vue';
import { queryDesignVersionsApi } from '@/api/project/project';
const commonStore = CommonStore();
@@ -321,6 +340,8 @@ const props = defineProps<{
projectEndTime: string;
currentPhase: string;
}>();
const dialogApproveUserVisible = ref(false);
const isEmptyPool = ref(true);
const dialogVisible = computed(() => {
return props.showTaskDialog;
@@ -396,6 +417,7 @@ const updateNodeLevel2Uuid = async ({ phaseUuid, type }: any) => {
await getNodeLevel3TreeByLevel2Uuid();
}
expandTree(rightTableRef.value);
await queryDesignVersionsFun();
};
const getNodeLevel3TreeByLevel2Uuid = async () => {
@@ -740,6 +762,8 @@ function flattenTreeData(treeData: any[], parentId = '', pUuid = '', pTagKeyList
return result;
}
const approveParam = ref<any>({});
const addOrEditTaskFun = async () => {
loadingInterface.value = true;
const { insertRecords, removeRecords, updateRecords }: any =
@@ -785,6 +809,15 @@ const addOrEditTaskFun = async () => {
// });
// await updateTreeDataApi([{ ...props.nodeLevel1Info, children: nodeLevel2Tree }], [], []);
// } else {
approveParam.value = {
insertTreeList,
removeRecords,
updateList,
};
dialogApproveUserVisible.value = true;
return;
const modifyRes = await updateTreeDataApi(insertTreeList, removeRecords, updateList);
// }
loadingInterface.value = false;
@@ -793,6 +826,61 @@ const addOrEditTaskFun = async () => {
closeFun();
}
};
const onAddApproveConfirmFun = async (formData: any) => {
// dialogApproveUserVisible.value = false;
console.log(formData, 'formData');
const deleteNodeList = getListIds(
approveParam.value.removeRecords.map((item: any) => {
return { ...item, children: [] };
})
);
disposeTreeTagKey(approveParam.value.insertTreeList);
if (
approveParam.value.insertTreeList.length === 0 &&
approveParam.value.updateList.length === 0 &&
deleteNodeList.length === 0
) {
dialogApproveUserVisible.value = false;
loadingInterface.value = false;
ElMessage.success('请更改仿真策划内容后再进行审批');
return;
}
const param = {
addNodeList: approveParam.value.insertTreeList,
editNodeList: approveParam.value.updateList,
deleteNodeList,
ownRootNodeUuid: props.nodeLevel1Uuid,
tagMap: getTagMapList(),
projectNodeId: props.nodeLevel1Uuid,
phaseNodeId: nodeLevel2Uuid.value,
...formData,
};
try {
const res: any = await modifyWithApproveAPi(param);
if (res && res.code === 200) {
dialogApproveUserVisible.value = false;
ElMessage.success('操作成功');
loadingInterface.value = false;
emits('taskComplete', 'taskPlanPage');
} else {
dialogApproveUserVisible.value = false;
loadingInterface.value = false;
ElMessage.warning('操作失败');
}
} catch {
dialogApproveUserVisible.value = false;
loadingInterface.value = false;
}
};
// 调接口更新任务树的数据
const updateTreeDataApi = async (insertList: any[], deleteList: any[], updateList: any[]) => {
const deleteNodeList = getListIds(
@@ -1168,6 +1256,34 @@ const leftCheckboxChangeFun = (checkInfo: any) => {
// }
// );
// 当前任务树的版本
const currentProjectPhaseTaskTreeVersion = ref('');
const projectPhaseVersionList = ref<any>([]);
// 查询 项目阶段的仿真策划版本
const queryDesignVersionsFun = async () => {
const param = {
projectId: props.nodeLevel1Uuid,
phaseId: nodeLevel2Uuid.value,
};
try {
const res: any = await queryDesignVersionsApi(param);
if (res && res.code === 200) {
projectPhaseVersionList.value = res.data;
if (res.data?.length) {
projectPhaseVersionList.value = [res.data[0]];
currentProjectPhaseTaskTreeVersion.value = projectPhaseVersionList.value[0]?.currentVersion;
isEmptyPool.value = false;
} else {
isEmptyPool.value = true;
}
}
} catch {}
};
onMounted(async () => {
queryPoolListFun();
});

View File

@@ -218,27 +218,34 @@ const showTaskDetailDialog = ref(false);
const currentTaskInfo = ref({ id: '', uuid: '', nodeType: 'task' });
const actionList = ref<any>([
// {
// title: '启动',
// type: 'primary',
// click: (row: any) => {
// changeTaskStatus(row, TASK_PROCESS_STATUS.IN_PROGRESS);
// },
// hide: (row: any) => {
// return !(
// row.exeStatus === TASK_PROCESS_STATUS.NO_STARTED ||
// row.exeStatus === TASK_PROCESS_STATUS.PAUSED
// );
// },
// },
// {
// title: '暂停',
// type: 'warning',
// click: (row: any) => {
// changeTaskStatus(row, TASK_PROCESS_STATUS.PAUSED);
// },
// hide: (row: any) => {
// return !(row.exeStatus === TASK_PROCESS_STATUS.IN_PROGRESS);
// },
// },
{
title: '启动',
title: '仿真',
type: 'primary',
click: (row: any) => {
changeTaskStatus(row, TASK_PROCESS_STATUS.IN_PROGRESS);
},
hide: (row: any) => {
return !(
row.exeStatus === TASK_PROCESS_STATUS.NO_STARTED ||
row.exeStatus === TASK_PROCESS_STATUS.PAUSED
);
},
},
{
title: '暂停',
type: 'warning',
click: (row: any) => {
changeTaskStatus(row, TASK_PROCESS_STATUS.PAUSED);
},
hide: (row: any) => {
return !(row.exeStatus === TASK_PROCESS_STATUS.IN_PROGRESS);
jumpToTaskExecutionFun(row);
},
},
...props.actionList,
@@ -285,13 +292,6 @@ const actionList = ref<any>([
return !(row.exeStatus === TASK_PROCESS_STATUS.NO_STARTED);
},
},
{
title: '跳转',
type: 'primary',
click: (row: any) => {
jumpToTaskExecutionFun(row);
},
},
]);
const hideKeys = ref();