Merge branch 'main' of http://192.168.65.198:3000/Front_Team/SPDM
This commit is contained in:
@@ -37,3 +37,9 @@ npm run build
|
||||
```sh
|
||||
npm run lint
|
||||
```
|
||||
|
||||
### 部署到 161 测试环境
|
||||
|
||||
```sh
|
||||
npm run deploy:test
|
||||
```
|
||||
39
readme.md
39
readme.md
@@ -1,39 +0,0 @@
|
||||
# spdm
|
||||
|
||||
This template should help get you started developing with Vue 3 in Vite.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
|
||||
|
||||
## Type Support for `.vue` Imports in TS
|
||||
|
||||
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
|
||||
|
||||
## Customize configuration
|
||||
|
||||
See [Vite Configuration Reference](https://vite.dev/config/).
|
||||
|
||||
## Project Setup
|
||||
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
### Compile and Hot-Reload for Development
|
||||
|
||||
```sh
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Type-Check, Compile and Minify for Production
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Lint with [ESLint](https://eslint.org/)
|
||||
|
||||
```sh
|
||||
npm run lint
|
||||
```
|
||||
@@ -38,14 +38,14 @@
|
||||
</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<el-tooltip :content="$t('表格.导出')" placement="top" >
|
||||
<el-tooltip v-if="exportApi" :content="$t('表格.导出')" placement="top" >
|
||||
<div v-if="exportApi" class="icon-btn" @click="exportFun">
|
||||
<el-icon :size="18">
|
||||
<Download />
|
||||
</el-icon>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip :content="$t('表格.导入')" placement="top" >
|
||||
<el-tooltip v-if="showImport" :content="$t('表格.导入')" placement="top" >
|
||||
<div v-if="showImport" class="icon-btn" @click="formDiaVisible = true">
|
||||
<el-icon :size="18">
|
||||
<Upload />
|
||||
|
||||
@@ -181,3 +181,9 @@ const removeFun = (key: string, val: any) => {
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.upload-btn {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
<div class="item">
|
||||
<div class="btns">
|
||||
<slot name="leftOptions" />
|
||||
<el-tooltip :content="$t('表格.导出')" placement="top" >
|
||||
<el-tooltip v-if="exportApi" :content="$t('表格.导出')" placement="top" >
|
||||
<div v-if="exportApi" class="icon-btn" @click="exportFun">
|
||||
<el-icon :size="18">
|
||||
<Download />
|
||||
</el-icon>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip :content="$t('表格.导入')" placement="top" >
|
||||
<el-tooltip v-if="showImport" :content="$t('表格.导入')" placement="top" >
|
||||
<div v-if="showImport" class="icon-btn" @click="formDiaVisible = true">
|
||||
<el-icon :size="18">
|
||||
<Upload />
|
||||
|
||||
@@ -55,7 +55,7 @@ import emitter from '@/utils/eventBus';
|
||||
const taskStatusObj: any = {}; // 更具uploadTaskId和businessId记录所以任务文件的上传状态
|
||||
const listVisible = ref(false);
|
||||
const listData = ref<any>([]);
|
||||
const chunkSize = 1024 * 1024 * 5; // 每片5MB
|
||||
const chunkSize = 1024 * 1024 * 10; // 每片10MB
|
||||
const UPLOAD_FILE_STATUS: any = { // TODO
|
||||
'-1': '上传失败',
|
||||
'0': '待上传',
|
||||
|
||||
@@ -95,9 +95,9 @@ onMounted(() => {
|
||||
|
||||
.operate-form {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
|
||||
.el-form {
|
||||
display: flex;
|
||||
@@ -114,7 +114,7 @@ onMounted(() => {
|
||||
|
||||
.task-img-box {
|
||||
width: 100%;
|
||||
height: calc(100% - 50px);
|
||||
height: calc(100% - 60px);
|
||||
margin-top: 10px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
@@ -58,8 +58,8 @@ import { initEcharts } from '../common/echartCard/echartsOptions';
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
});
|
||||
const runTreeData = ref<any>([]);
|
||||
@@ -130,16 +130,19 @@ const getCheckedNodesCurveFun = async () => {
|
||||
});
|
||||
|
||||
if (res && res.code === 200) {
|
||||
curveList.value = res.data.data.map((item: any, index: any) => {
|
||||
curveList.value = res.data?.data?.map((item: any, index: any) => {
|
||||
return {
|
||||
...item,
|
||||
num: index + 1,
|
||||
};
|
||||
});
|
||||
}
|
||||
const list = curveList.value.map((item: any) => item.num);
|
||||
curveNumData.value = Array.from(new Set(list));
|
||||
getCommonNumCurveFun();
|
||||
|
||||
if (curveList.value.length) {
|
||||
const list = curveList.value.map((item: any) => item.num);
|
||||
curveNumData.value = Array.from(new Set(list));
|
||||
getCommonNumCurveFun();
|
||||
}
|
||||
|
||||
console.log(curveNumData.value, 'curveNumData.value');
|
||||
};
|
||||
@@ -260,7 +263,7 @@ onMounted(() => {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
// align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
// :deep(.is-disabled) {
|
||||
|
||||
@@ -34,8 +34,13 @@
|
||||
|
||||
<FilePreview v-model="previewVisible" :fileId="currentRow?.id" />
|
||||
|
||||
<uploadDeliverableFilePage v-if="uploadFileVisible" :curentTaskInfo="taskInfo" @close="uploadFileVisible = false" @update="updateTableDataFun"></uploadDeliverableFilePage>
|
||||
</div>
|
||||
|
||||
<Teleport to="body">
|
||||
<uploadDeliverableFilePage v-if="uploadFileVisible" :curentTaskInfo="taskInfo" @close="uploadFileVisible = false" @update="updateTableDataFun"></uploadDeliverableFilePage>
|
||||
|
||||
</Teleport>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
||||
@@ -1,168 +1,132 @@
|
||||
<template>
|
||||
<div class="task-performance-page">
|
||||
<el-form class="form-style" :model="taskFormData" labelPosition="left" labelWidth="120">
|
||||
<el-form-item label="任务名称">
|
||||
<el-input v-model="taskFormData.nodeName"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="英文名">
|
||||
<el-input v-model="taskFormData.englishName"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务状态">
|
||||
<el-select v-model="taskFormData.exeStatus">
|
||||
<el-option v-for="item in exeStatusList" :label="item.name" :value="item.value" :key="item.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="风险状态">
|
||||
<el-select v-model="taskFormData.achieveStatus">
|
||||
<el-option
|
||||
v-for="item in achieveStatusList"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
:key="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务编号">
|
||||
<el-input v-model="taskFormData.nodeCode"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="任务描述">
|
||||
<el-input type="textarea" v-model="taskFormData.description" :rows="4"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="计划开始时间">
|
||||
|
||||
<el-date-picker
|
||||
v-model="taskFormData.beginTime"
|
||||
type="date"
|
||||
placeholder="选择计划开始时间"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="计划完成时间">
|
||||
|
||||
<el-date-picker
|
||||
v-model="taskFormData.endTime"
|
||||
type="date"
|
||||
placeholder="选择计划开完成时间"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<TableForm
|
||||
ref="tableFormRef"
|
||||
tableName="PROJECT_TASK_MODAL"
|
||||
showDisabled
|
||||
:colNum="2"
|
||||
:rule-data="ruleData"
|
||||
>
|
||||
<template #form-flowTemplate>
|
||||
<flowTemplateSelect v-model="selectedFlowTemplate" />
|
||||
</template>
|
||||
<template #form-standard>
|
||||
<knowledgeSelect v-model="standard"/>
|
||||
</template>
|
||||
</TableForm>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, reactive } from 'vue';
|
||||
import { ref, onMounted, reactive, watch, nextTick } from 'vue';
|
||||
import TableForm from '@/components/common/table/tableForm.vue';
|
||||
import { getTagKeyMap, NODE_TYPE } from '@/utils/enum/node';
|
||||
import { getMemberListIds } from '@/utils/task';
|
||||
import flowTemplateSelect from '@/components/common/treeCaseTable/flowTemplateSelect.vue';
|
||||
import knowledgeSelect from '@/components/common/treeCaseTable/knowledgeSelect.vue';
|
||||
import { disposeTagKey } from '@/views/task/projectDetail/components/project';
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
},
|
||||
taskInfo: {
|
||||
type: Object,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
const tableFormRef = ref();
|
||||
|
||||
const taskFormData = reactive<any>({
|
||||
id: '',
|
||||
nodeName: '',
|
||||
englishName: '',
|
||||
exeStatus: '',
|
||||
achieveStatus: '',
|
||||
nodeType: '',
|
||||
nodeCode: '',
|
||||
memberList: '',
|
||||
beginTime: '',
|
||||
endTime: '',
|
||||
flowTemplateName: '',
|
||||
workRate: '',
|
||||
standard: '',
|
||||
days: '',
|
||||
performanceType: '',
|
||||
difficult: '',
|
||||
analyseSoftware: '',
|
||||
imageFileId: '',
|
||||
bCapacity: '',
|
||||
method: '',
|
||||
highValue: '',
|
||||
value: '',
|
||||
unit: '',
|
||||
department: '',
|
||||
section: '',
|
||||
group: '',
|
||||
description: '',
|
||||
operation: '',
|
||||
const localDetail = ref<any>({});
|
||||
|
||||
const ruleData = ref<any>({
|
||||
highValue: [
|
||||
{
|
||||
message: '指标类型为数值时,目标值应为数字',
|
||||
trigger: 'change',
|
||||
validator: (val: unknown) => {
|
||||
if (val === null || val === undefined || val === '') {
|
||||
return true;
|
||||
}
|
||||
const formData = tableFormRef.value?.getFormDataFun();
|
||||
if (formData.nodeType === NODE_TYPE.PERFORMANCE) {
|
||||
if (formData.performanceType === '1') {
|
||||
const s = String(val ?? '').trim();
|
||||
return s !== '' && Number.isFinite(Number(s));
|
||||
} else if (formData.performanceType === '2') {
|
||||
return true;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
},
|
||||
|
||||
],
|
||||
});
|
||||
|
||||
const exeStatusList = ref([
|
||||
{
|
||||
name: '未开始',
|
||||
value: '0',
|
||||
},
|
||||
{
|
||||
name: '进行中',
|
||||
value: '1',
|
||||
},
|
||||
{
|
||||
name: '已完成',
|
||||
value: '2',
|
||||
},
|
||||
{
|
||||
name: '延期',
|
||||
value: '3',
|
||||
},
|
||||
{
|
||||
name: '终止',
|
||||
value: '4',
|
||||
},
|
||||
]);
|
||||
|
||||
const achieveStatusList = ref([
|
||||
{
|
||||
name: '不合格',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
name: '风险可控',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
name: '未分析',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
name: '合格',
|
||||
value: 4,
|
||||
},
|
||||
]);
|
||||
|
||||
const getTaskInfoFun = () => {
|
||||
|
||||
if (props.taskInfo) {
|
||||
|
||||
for (const key in taskFormData) {
|
||||
taskFormData[key] = props.taskInfo[key];
|
||||
}
|
||||
// 流程模板相关
|
||||
const selectedFlowTemplate = ref<any>(null);
|
||||
const standard = ref();
|
||||
watch(() => props.taskInfo, (newVal) => {
|
||||
if (newVal) {
|
||||
localDetail.value = newVal;
|
||||
|
||||
nextTick(() => {
|
||||
tableFormRef.value?.setFormDataFun({ ...localDetail.value, eMemberList: getMemberListIds(localDetail.value.eMemberList), pMemberList: getMemberListIds(localDetail.value.pMemberList) });
|
||||
standard.value = localDetail.value.standard;
|
||||
if (localDetail.value.flowTemplate) {
|
||||
selectedFlowTemplate.value = localDetail.value.flowTemplate;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
console.log('根据任务id获取任务详情数据' + taskFormData);
|
||||
}, {
|
||||
immediate: true,
|
||||
deep: true,
|
||||
});
|
||||
|
||||
const getFormData = async () => {
|
||||
const valid = await tableFormRef.value?.validateFun();
|
||||
|
||||
if (valid) {
|
||||
const formData = tableFormRef.value?.getFormDataFun();
|
||||
|
||||
formData.standard = standard.value;
|
||||
if (selectedFlowTemplate.value) {
|
||||
formData.flowTemplate = selectedFlowTemplate.value;
|
||||
}
|
||||
if (localDetail.value?.tagKeyList) {
|
||||
const tagKeyList = disposeTagKey(formData, localDetail.value?.tagKeyList || [], getTagKeyMap());
|
||||
console.log('tagKeyList', tagKeyList);
|
||||
} else {
|
||||
formData.tagKeyList = [];
|
||||
}
|
||||
// 处理时间范围
|
||||
if (formData.planTime) {
|
||||
formData.beginTime = formData.planTime[0];
|
||||
formData.endTime = formData.planTime[1];
|
||||
}
|
||||
formData.pMemberIds = '';
|
||||
if (formData.pMemberList?.length > 0) {
|
||||
formData.pMemberIds = formData.pMemberList;
|
||||
}
|
||||
formData.eMemberIds = '';
|
||||
if (formData.eMemberList?.length > 0) {
|
||||
formData.eMemberIds = formData.eMemberList;
|
||||
}
|
||||
|
||||
return formData;
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
defineExpose({
|
||||
taskFormData,
|
||||
getFormData,
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
getTaskInfoFun();
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
@@ -46,8 +46,8 @@ import UploadFile from '@/components/common/uploadFile/index.vue';
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
showFilter: {
|
||||
type: Boolean,
|
||||
|
||||
@@ -50,8 +50,8 @@ import addTaskPerformance from './addTaskPerformance.vue';
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
runInfo: {
|
||||
type: Object,
|
||||
|
||||
@@ -44,8 +44,8 @@ import UploadFile from '@/components/common/uploadFile/index.vue';
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
showFilter: {
|
||||
type: Boolean,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
diaTitle="上传交付物"
|
||||
:width="'70%'"
|
||||
:height="'70%'"
|
||||
:zIndex="100"
|
||||
:zIndex="101"
|
||||
@close="handleCloseFun"
|
||||
show-footer
|
||||
>
|
||||
|
||||
@@ -201,3 +201,14 @@ export const exportFile = (api: any, tableName: string, fileName: string, params
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据文件id下载文件
|
||||
* @param fileId
|
||||
*/
|
||||
export const downloadFileById = (fileId: number) => {
|
||||
const link = document.createElement('a');
|
||||
link.href = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${fileId}`;
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
};
|
||||
|
||||
@@ -18,6 +18,7 @@ const lang = {
|
||||
'上一步': 'Previous',
|
||||
'下一步': 'Next',
|
||||
'查看': 'View',
|
||||
'审批类型': 'Approval Type',
|
||||
},
|
||||
'菜单': {
|
||||
'首页': 'Home',
|
||||
|
||||
@@ -18,6 +18,7 @@ const lang = {
|
||||
'上一步': '上一步',
|
||||
'下一步': '下一步',
|
||||
'查看': '查看',
|
||||
'审批类型': '审批类型',
|
||||
},
|
||||
'菜单': {
|
||||
'首页': '首页',
|
||||
|
||||
@@ -146,9 +146,9 @@ import i18n from '@/utils/i18n';
|
||||
import FilePreview from '@/components/common/filePreview/index.vue';
|
||||
import emitter from '@/utils/eventBus';
|
||||
import { TABLE_NAME } from '@/utils/enum/tableName';
|
||||
import { downloadFileById } from '@/utils/file';
|
||||
|
||||
const { KNOWLEDGE_APPROVE_STATUS, KNOWLEDGE_APPROVE_TYPE } = useDict('KNOWLEDGE_APPROVE_STATUS', 'KNOWLEDGE_APPROVE_TYPE');
|
||||
const env = import.meta.env;
|
||||
type Data = RenderContentContext['data']
|
||||
const fileTreeRef = ref<any>();
|
||||
const baseTableRef = ref<any>();
|
||||
@@ -253,7 +253,7 @@ const actionList = computed(() => {
|
||||
title: i18n?.global?.t('通用.下载'),
|
||||
type: 'primary',
|
||||
click: (row: any) => {
|
||||
downloadFileFun(row);
|
||||
downloadFileById(row.id);
|
||||
},
|
||||
hide: (row: any) => {
|
||||
return row.dataType !== 2;
|
||||
@@ -398,10 +398,7 @@ const previewFileFun = (row: any) => {
|
||||
currentRow.value = row;
|
||||
previewVisible.value = true;
|
||||
};
|
||||
const downloadFileFun = (row: any) => {
|
||||
const downloadUrl = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${row.id}`;
|
||||
window.open(downloadUrl, '_blank');
|
||||
};
|
||||
|
||||
const editFileFun = (row: any) => {
|
||||
currentRow.value = row;
|
||||
visible.value = true;
|
||||
|
||||
@@ -166,7 +166,8 @@
|
||||
import { ref, onMounted } from 'vue';
|
||||
import FileTree from '@/components/common/dataFileTree/index.vue';
|
||||
import { getSimulationNodeTreeApi, getAllTemplateApi } from '@/api/data/dimensionTemplate';
|
||||
import { addNodeForDataApi, addTaskForDataApi } from '@/api/project/node';
|
||||
import { addNodeForDataApi, addTaskForDataApi, getNodeDetailForDataApi } from '@/api/project/node';
|
||||
import { getTaskDetailApi } from '@/api/project/task';
|
||||
import { dataOverViewListSimulationNodeFilesApi, dataOverViewDeleteSimulationNodeFilesApi, dataOverViewUploadSimulationNodeFilesApi } from '@/api/data/dataOverView';
|
||||
import BaseTable from '@/components/common/table/baseTable.vue';
|
||||
import Configuration from './components/configuration.vue';
|
||||
@@ -246,6 +247,7 @@ const editFun = () => {
|
||||
ElMessage.warning('请选择一个目录');
|
||||
return;
|
||||
}
|
||||
nodeType.value = currentData.value.relatedResourceUuidOwnType;
|
||||
if (currentData.value.relatedResourceUuidOwnType === NODE_TYPE.PROJECT) {
|
||||
editId.value = currentData.value.relatedResourceUuid;
|
||||
showProjectInfoDialog.value = true;
|
||||
@@ -254,15 +256,29 @@ const editFun = () => {
|
||||
editId.value = currentData.value.relatedParentUuid;
|
||||
showNodeInfoDialog.value = true;
|
||||
}
|
||||
if (currentData.value.relatedResourceUuidOwnType === NODE_TYPE.WORKSPACE) {
|
||||
if ([NODE_TYPE.WORKSPACE, NODE_TYPE.MACHINE].includes(currentData.value.relatedResourceUuidOwnType)) {
|
||||
editId.value = currentData.value.relatedParentUuid;
|
||||
editData.value = {
|
||||
nodeName: currentData.value.originalName,
|
||||
englishName: '',
|
||||
nodeCode: '',
|
||||
nodeType: currentData.value.relatedResourceUuidOwnType,
|
||||
const params = {
|
||||
relatedResourceUuid: currentData.value.relatedResourceUuid,
|
||||
};
|
||||
modalVisible.value = true;
|
||||
getNodeDetailForDataApi(params).then((res: any) => {
|
||||
if (res.code === 200) {
|
||||
editData.value = res.data;
|
||||
}
|
||||
modalVisible.value = true;
|
||||
});
|
||||
}
|
||||
if ([NODE_TYPE.TASK].includes(currentData.value.relatedResourceUuidOwnType)) {
|
||||
editId.value = currentData.value.relatedParentUuid;
|
||||
const params = {
|
||||
relatedResourceUuid: currentData.value.relatedResourceUuid,
|
||||
};
|
||||
getTaskDetailApi(params).then((res: any) => {
|
||||
if (res.code === 200) {
|
||||
editData.value = res.data;
|
||||
}
|
||||
modalVisible.value = true;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<div class="header">
|
||||
<div class="label">{{ $t('通用.审批类型') }}</div>
|
||||
<div class="content">
|
||||
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, watchEffect } from 'vue';
|
||||
|
||||
interface Props {
|
||||
data: any;
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
data: {},
|
||||
});
|
||||
|
||||
const contents = ref<string>('');
|
||||
const approveAction = ref<any>();
|
||||
const tagTypeMap: any = {
|
||||
1: 'success',
|
||||
2: 'primary',
|
||||
3: 'danger',
|
||||
};
|
||||
|
||||
watchEffect(() => {
|
||||
if (props.data) {
|
||||
const approveContents = JSON.parse(props.data?.approveContents || '{}');
|
||||
contents.value = approveContents.contents || '';
|
||||
approveAction.value = props.data?.approveAction || '';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header {
|
||||
margin-bottom: 24px;
|
||||
display: flex;
|
||||
}
|
||||
.label {
|
||||
font-weight: 600;
|
||||
margin-right: 16px;
|
||||
}
|
||||
.content {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
</style>
|
||||
@@ -1,10 +1,5 @@
|
||||
<template>
|
||||
<div class="header">
|
||||
<div class="label">审批类型</div>
|
||||
<div class="content">
|
||||
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
<approvalTypeHeader :data="data" />
|
||||
<BaseTable
|
||||
ref="baseTableRef"
|
||||
tableName="TASK_DELIVERABLE"
|
||||
@@ -31,6 +26,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, watchEffect } from 'vue';
|
||||
import BaseTable from '@/components/common/table/baseTable.vue';
|
||||
import approvalTypeHeader from './approvalTypeHeader.vue';
|
||||
import i18n from '@/utils/i18n';
|
||||
import { formatFileSize } from '@/utils/file';
|
||||
import FilePreview from '@/components/common/filePreview/index.vue';
|
||||
@@ -44,20 +40,11 @@ const props = withDefaults(defineProps<Props>(), {
|
||||
});
|
||||
const env = import.meta.env;
|
||||
const knowledgeList = ref<any[]>([]);
|
||||
const contents = ref<string>('');
|
||||
const approveAction = ref<any>();
|
||||
const tagTypeMap:any = {
|
||||
1: 'success',
|
||||
2: 'primary',
|
||||
3: 'danger',
|
||||
};
|
||||
const baseTableRef = ref<any>(null);
|
||||
watchEffect(() => {
|
||||
if (props.data) {
|
||||
const approveContents = JSON.parse(props.data?.approveContents || '{}');
|
||||
knowledgeList.value = approveContents.afterData || approveContents.beforeData || null;
|
||||
contents.value = approveContents.contents || '';
|
||||
approveAction.value = props.data?.approveAction || '';
|
||||
if (baseTableRef.value && knowledgeList.value) {
|
||||
baseTableRef.value?.setDataFun(knowledgeList.value);
|
||||
}
|
||||
@@ -99,17 +86,3 @@ const actionList = computed(() => {
|
||||
|
||||
});
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.header {
|
||||
margin-bottom: 24px;
|
||||
display: flex;
|
||||
}
|
||||
.label {
|
||||
font-weight: 600;
|
||||
margin-right: 16px;
|
||||
}
|
||||
.content {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
<template>
|
||||
<div class="header">
|
||||
<div class="label">审批类型</div>
|
||||
<div class="content">
|
||||
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
<approvalTypeHeader :data="data" />
|
||||
<BaseTable
|
||||
ref="baseTableRef"
|
||||
:tableName="TABLE_NAME.SIMULATION_KNOWLEDGE_APPROVE_PREVIEW"
|
||||
@@ -31,10 +26,12 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, watchEffect } from 'vue';
|
||||
import BaseTable from '@/components/common/table/baseTable.vue';
|
||||
import approvalTypeHeader from './approvalTypeHeader.vue';
|
||||
import i18n from '@/utils/i18n';
|
||||
import { formatFileSize } from '@/utils/file';
|
||||
import FilePreview from '@/components/common/filePreview/index.vue';
|
||||
import { TABLE_NAME } from '@/utils/enum/tableName';
|
||||
import { downloadFileById } from '@/utils/file';
|
||||
|
||||
interface Props {
|
||||
data: any;
|
||||
@@ -43,22 +40,12 @@ interface Props {
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
data: {},
|
||||
});
|
||||
const env = import.meta.env;
|
||||
const knowledgeList = ref<any[]>([]);
|
||||
const contents = ref<string>('');
|
||||
const approveAction = ref<any>();
|
||||
const tagTypeMap:any = {
|
||||
1: 'success',
|
||||
2: 'primary',
|
||||
3: 'danger',
|
||||
};
|
||||
const baseTableRef = ref<any>(null);
|
||||
watchEffect(() => {
|
||||
if (props.data) {
|
||||
const approveContents = JSON.parse(props.data?.approveContents || '{}');
|
||||
knowledgeList.value = approveContents.afterData || approveContents.beforeData || null;
|
||||
contents.value = approveContents.contents || '';
|
||||
approveAction.value = props.data?.approveAction || '';
|
||||
if (baseTableRef.value && knowledgeList.value) {
|
||||
baseTableRef.value?.setDataFun(knowledgeList.value);
|
||||
}
|
||||
@@ -70,10 +57,7 @@ const previewFileFun = (row: any) => {
|
||||
currentRow.value = row;
|
||||
previewVisible.value = true;
|
||||
};
|
||||
const downloadFileFun = (row: any) => {
|
||||
const downloadUrl = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${row.id}`;
|
||||
window.open(downloadUrl, '_blank');
|
||||
};
|
||||
|
||||
const actionList = computed(() => {
|
||||
return [
|
||||
{
|
||||
@@ -90,7 +74,7 @@ const actionList = computed(() => {
|
||||
title: i18n?.global?.t('通用.下载'),
|
||||
type: 'primary',
|
||||
click: (row: any) => {
|
||||
downloadFileFun(row);
|
||||
downloadFileById(row.id);
|
||||
},
|
||||
hide: (row: any) => {
|
||||
return row.dataType !== 2;
|
||||
@@ -100,17 +84,3 @@ const actionList = computed(() => {
|
||||
|
||||
});
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.header {
|
||||
margin-bottom: 24px;
|
||||
display: flex;
|
||||
}
|
||||
.label {
|
||||
font-weight: 600;
|
||||
margin-right: 16px;
|
||||
}
|
||||
.content {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</div>
|
||||
|
||||
<div class="run-flow-box">
|
||||
|
||||
<FlowView v-if="runInfo.flowTemplate" :show-config-page="false" :flow-uuid="runInfo.flowTemplate" @detail="getNodeTailFun"></FlowView>
|
||||
</div>
|
||||
|
||||
<div class="run-info-box">
|
||||
@@ -131,6 +131,7 @@ import taskPerformance from '@/components/taskDetail/taskPerformance.vue';
|
||||
import runLogs from './runPagecomponent/runLogs.vue';
|
||||
import ModelReview from './runPagecomponent/3DModelReview.vue';
|
||||
import runVersionTree from './runPagecomponent/runVersionTree.vue';
|
||||
import FlowView from '@/components/common/flow/flowView.vue';
|
||||
|
||||
const props = defineProps({
|
||||
runInfo: {
|
||||
@@ -154,6 +155,11 @@ const handleRightClickFun = () => {
|
||||
|
||||
};
|
||||
|
||||
const getNodeTailFun = (node:any) => {
|
||||
console.log(node, 'node');
|
||||
|
||||
};
|
||||
|
||||
const currentRunNodeInfo = ref<any>({});
|
||||
|
||||
watch(() => props.runInfo, (newVal) => {
|
||||
@@ -240,16 +246,17 @@ watch(() => props.runInfo, (newVal) => {
|
||||
|
||||
.run-flow-box {
|
||||
width: 100%;
|
||||
height: 30%;
|
||||
height: 300px;
|
||||
background-color: #fff;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.run-info-box {
|
||||
width: 100%;
|
||||
height: calc(70% - 70px);
|
||||
height: calc(100% - 370px);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
:taskId="currentTaskInfo.id"
|
||||
:current-task-info="currentTaskInfo"
|
||||
@closeFn="showTaskDetailDialog = false"
|
||||
@updateFn="updateTaskInfoFun"
|
||||
>
|
||||
</taskDetail>
|
||||
</div>
|
||||
@@ -108,9 +109,10 @@
|
||||
import { onMounted, ref } from 'vue';
|
||||
import { getTaskTreeFun } from './projectApi';
|
||||
import { NODE_TYPE } from '@/utils/enum/node';
|
||||
import { getChildrenNodeListApi } from '@/api/project/node';
|
||||
import { getChildrenNodeListApi, modifyNodeTaskPerformanceApi } from '@/api/project/node';
|
||||
import taskDetail from './taskDetail.vue';
|
||||
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
|
||||
import { getTagMapList } from '@/utils/task';
|
||||
|
||||
const props = defineProps<{
|
||||
projectUuid: string;
|
||||
@@ -186,6 +188,30 @@ const openTaskDetailDialogFun = (row?: any) => {
|
||||
showTaskDetailDialog.value = true;
|
||||
};
|
||||
|
||||
const updateTaskInfoFun = async (info:any) => {
|
||||
const { flag, data }:any = info;
|
||||
|
||||
console.log(flag, 'flag');
|
||||
console.log(data, 'data');
|
||||
|
||||
if (flag === 'info') {
|
||||
const res:any = await modifyNodeTaskPerformanceApi({
|
||||
addNodeList: [],
|
||||
editNodeList: [data],
|
||||
deleteNodeList: [],
|
||||
ownRootNodeUuid: data.tag1,
|
||||
tagMap: getTagMapList(),
|
||||
});
|
||||
|
||||
if (res && res.code === 200) {
|
||||
await getTaskTreeList();
|
||||
}
|
||||
}
|
||||
|
||||
showTaskDetailDialog.value = false;
|
||||
|
||||
};
|
||||
|
||||
const refreshPhaseList = () => {
|
||||
getPhaseListApi();
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="comp-content">
|
||||
<Dialog v-model="dialogVisible" diaTitle="任务详情" :width="'70%'" :height="700" @close="closeFun" show-footer>
|
||||
<Dialog v-model="dialogVisible" diaTitle="任务详情" :width="'70%'" :height="700" @close="closeFun" show-footer :zIndex="100">
|
||||
<el-tabs v-model="activeTab">
|
||||
<el-tab-pane label="任务详情" name="info">
|
||||
<div class="task-tab-content">
|
||||
@@ -8,9 +8,14 @@
|
||||
</taskInfo>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="计算模型" name="model">
|
||||
<div class="task-tab-content">
|
||||
<taskModel v-if="activeTab === 'model'" :task-id="taskId"></taskModel>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="性能指标" name="performance">
|
||||
<div class="task-tab-content">
|
||||
<taskPerformance ref="taskPerformanceRef" v-if="activeTab === 'performance'" :task-id="taskId">
|
||||
<taskPerformance ref="taskPerformanceRef" v-if="activeTab === 'performance'" :task-id="taskId" :param-type="'task'" :run-info="currentTaskInfo" :task-info="currentTaskInfo" :show-save-button="true">
|
||||
</taskPerformance>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
@@ -31,14 +36,10 @@
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="交付物" name="deliverables">
|
||||
<div class="task-tab-content">
|
||||
<taskDeliverable v-if="activeTab === 'deliverables'" :task-id="taskId"></taskDeliverable>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="计算模型" name="model">
|
||||
<div class="task-tab-content">
|
||||
<taskModel v-if="activeTab === 'model'" :task-id="taskId"></taskModel>
|
||||
<taskDeliverable v-if="activeTab === 'deliverables'" :task-id="currentTaskInfo?.id" :task-info="currentTaskInfo"></taskDeliverable>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
</el-tabs>
|
||||
<template #footer>
|
||||
<div>
|
||||
@@ -64,8 +65,8 @@ import taskCurve from '@/components/taskDetail/taskCurve.vue';
|
||||
const emits = defineEmits(['closeFn', 'updateFn']);
|
||||
defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
currentTaskInfo: {
|
||||
type: Object,
|
||||
@@ -89,7 +90,7 @@ const updateFun = async () => {
|
||||
}
|
||||
|
||||
if (activeTab.value === 'info') {
|
||||
data = taskInfoRef.value.taskFormData();
|
||||
data = await taskInfoRef.value.getFormData();
|
||||
}
|
||||
|
||||
emits('updateFn', {
|
||||
@@ -118,6 +119,7 @@ const updateFun = async () => {
|
||||
.task-tab-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 500px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
</div>
|
||||
</template>
|
||||
</BaseTable> -->
|
||||
<taskDetail v-if="showTaskDetailDialog" :taskId="currentTaskInfo.id" @closeFn="showTaskDetailDialog = false">
|
||||
<taskDetail v-if="showTaskDetailDialog" :taskId="currentTaskInfo.id" :currentTaskInfo="currentTaskInfo" @closeFn="showTaskDetailDialog = false" @updateFn="updateTaskInfoFun">
|
||||
</taskDetail>
|
||||
</div>
|
||||
</template>
|
||||
@@ -95,6 +95,15 @@ const showTaskDetailFun = (row:any) => {
|
||||
currentTaskInfo.value = row;
|
||||
};
|
||||
|
||||
const updateTaskInfoFun = async (info:any) => {
|
||||
const { flag, data }:any = info;
|
||||
|
||||
console.log(flag, 'flag');
|
||||
console.log(data, 'data');
|
||||
|
||||
showTaskDetailDialog.value = false;
|
||||
};
|
||||
|
||||
const attentionTaskFun = async(row:any, isAttention:boolean) => {
|
||||
const res:any = await attentionTaskApi(disposeAttentionParams(row.uuid, isAttention));
|
||||
if (res.code === 200) {
|
||||
|
||||
Reference in New Issue
Block a user