任务新增所属学科

This commit is contained in:
weibl
2026-01-15 16:51:13 +08:00
parent 2a75c9b889
commit 31d89a804d
7 changed files with 108 additions and 36 deletions

View File

@@ -4,7 +4,7 @@
v-model="dialogVisible"
diaTitle="推送报告"
width="80%"
:height="500"
height="80%"
@close="closeFun"
show-footer
>
@@ -102,6 +102,6 @@ onMounted(() => {});
</script>
<style lang="scss" scoped>
.table-box {
height: 50vh;
height: 100%;
}
</style>

View File

@@ -20,10 +20,20 @@
<div class="attachments">
<div class="file" v-for="item in attachmentFiles" :key="item.id">
<span>{{ item.name }}</span>
<el-icon @click="downloadFileById(item.id)"><Download /></el-icon>
<el-icon size="18" @click="downloadFileById(item.id)"><Download /></el-icon>
</div>
</div>
</template>
<template #form-pMemberList>
<el-select disabled v-model="demandInfo.pMemberList" filterable placeholder="请选择">
<el-option
v-for="item in deptOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</TableForm>
<template #footer>
<div>
@@ -43,12 +53,16 @@ import { getDemandDetailApi } from '@/api/project/demand';
import { getMemberListIds } from '@/utils/task';
import { dataQueryDirApi } from '@/api/data/data';
import { downloadFileById } from '@/utils/file';
import { CommonStore } from '@/stores/common';
import { listDeptApi } from '@/api/system/departMent';
const props = defineProps<{
showDialog: boolean;
demandUid: string;
}>();
const commonStore = CommonStore();
const dialogVisible = computed({
get() {
return props.showDialog;
@@ -80,6 +94,8 @@ const getDemandInfo = async () => {
tableFormRef.value.setOptionsFun('phaseId', [
{ label: res.data.phaseName, value: res.data.phaseId },
]);
const simTypeList: any = commonStore.getDictData(res.data.demandType);
tableFormRef.value.setOptionsFun('simType', simTypeList.A);
}
};
@@ -96,13 +112,25 @@ const getAttachments = async () => {
};
}) || [];
};
const deptOptions = ref<any[]>([]);
const getListDept = async () => {
const res: any = await listDeptApi({ current: 1, size: 999 });
if (res.code === 200) {
deptOptions.value = res.data.data.map((item: { deptName: any; userId: any }) => {
return {
label: item.deptName,
value: String(item.userId),
};
});
}
};
watch(
() => props.demandUid,
(val) => {
if (val) {
getDemandInfo();
getAttachments();
getListDept();
}
}
);

View File

@@ -14,7 +14,7 @@
:exportParams="{ ...params, sortOrder: 1 }"
fullHeight
:exportDict="{
demandType: 'DEMANED_TYPE',
demandType: 'DEMAND_TYPE',
simType: 'DEMAND_TYPE1',
achieveStatus: 'RESULT_ACHIEVE_STATUS',
demandStatus: 'DEMAND_EXE_STATUS',

View File

@@ -46,7 +46,9 @@
<template #actualProgress="{ row }">
{{ TASK_PROGRESS_STATUS.O[row.actualProgress] }}
</template>
<template #discipline="{ row }">
{{ DISCIPLINE_TYPE.O[row.discipline] }}
</template>
<template #taskName="{ row }">
<span class="task-name" @click="nameClickFun(row)">
{{ row.taskName }}
@@ -203,10 +205,11 @@ const props = defineProps({
const emits = defineEmits(['show']);
const { TASK_APPROVE_STATUS, TASK_PROGRESS_STATUS, TASK_ABNORMAL } = useDict(
const { TASK_APPROVE_STATUS, TASK_PROGRESS_STATUS, TASK_ABNORMAL, DISCIPLINE_TYPE } = useDict(
'TASK_APPROVE_STATUS',
'TASK_PROGRESS_STATUS',
'TASK_ABNORMAL'
'TASK_ABNORMAL',
'DISCIPLINE_TYPE'
);
const commonStore = CommonStore();

View File

@@ -9,7 +9,6 @@
show-footer
>
<BaseTable
:loading="loadingInterface"
ref="tableRef"
showIndex
:headData="headData"
@@ -42,6 +41,16 @@
</el-tree-select>
</div>
</template>
<template #discipline="{ row }">
<el-select class="loadcase-lib" v-show="row.insertMode !== 'lib'" v-model="row.discipline">
<el-option
v-for="item in DISCIPLINE_TYPE.A"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
<template #insertMode="{ row }">
<el-radio-group v-model="row.insertMode">
<el-radio value="lib" size="large">从工况库选任务</el-radio>
@@ -89,9 +98,11 @@
</el-select>
</template>
<template #selectTask="{ row }">
<!-- {{ row.libTaskList }} -->
<div class="line-content" v-show="row.insertMode === 'lib'">
<span class="required-tag" v-if="row.insertMode === 'lib'">*</span>
<el-select-v2
v-if="row.libTaskList"
v-model="row.chooseTaskList"
:options="row.libTaskList"
placeholder="请选择"
@@ -144,7 +155,7 @@
</Dialog>
</template>
<script lang="ts" setup>
import { computed, nextTick, onMounted, ref } from 'vue';
import { computed, onMounted, ref } from 'vue';
import Dialog from '@/components/common/dialog/index.vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import {
@@ -159,6 +170,7 @@ import { filterTask, getIdMap } from '@/views/task/projectDetail/components/proj
import { tagSortList } from '@/utils/enum/node';
import { getMemberListIds } from '@/utils/task';
import { issuedTaskApi } from '@/api/project/demand';
import { useDict } from '@/utils/useDict';
const props = defineProps({
diaVisible: {
@@ -166,12 +178,14 @@ const props = defineProps({
default: false,
},
checkedList: {
type: Array,
type: Array as any,
default: () => [],
},
});
const emits = defineEmits(['update:diaVisible']);
const { DISCIPLINE_TYPE } = useDict('DISCIPLINE_TYPE');
const tableRef = ref();
const diaVisible = computed({
@@ -194,7 +208,7 @@ const headData = ref<any[]>([
required: true,
},
{
title: '上层节点',
title: '上层节点1',
key: 'insertLevel',
isShow: true,
inputMode: 'input',
@@ -202,6 +216,15 @@ const headData = ref<any[]>([
inForm: false,
required: true,
},
{
title: '所属学科2',
key: 'discipline',
isShow: true,
inputMode: 'input',
type: 1,
inForm: false,
required: true,
},
{
title: '插入模式',
key: 'insertMode',
@@ -300,6 +323,7 @@ const confirmFun = async () => {
endTime: demandItem.endTime,
eMemberList: demandItem.eMemberList,
pMemberList: pMemberListStr,
aMemberList: getMemberListIds(demandItem.aMemberList),
};
});
params.push({
@@ -318,6 +342,8 @@ const confirmFun = async () => {
eMemberList: demandItem.eMemberList,
pMemberList: pMemberListStr,
nodeId: parentNodeInfo.uuid,
discipline: demandItem.discipline,
aMemberList: getMemberListIds(demandItem.aMemberList),
},
],
demandId: demandItem.uuid,
@@ -361,13 +387,18 @@ const queryPoolListFun = async () => {
loadcaseLibList.value = [];
}
if (loadcaseLibList.value.length > 0) {
for (let index = 0; index < props.checkedList.length; index++) {
(props.checkedList[index] as any).indexTreeData = await getIndexTreeData(
props.checkedList[index]
const poolInfo = { currentLoadcaseLib: loadcaseLibList.value[0] };
queryLoadcaseLibVersionsFun(poolInfo);
for (let index = 0; index < checkedDemandList.value.length; index++) {
(checkedDemandList.value[index] as any).indexTreeData = await getIndexTreeData(
checkedDemandList.value[index]
);
(props.checkedList[index] as any).currentLoadcaseLib = loadcaseLibList.value[0];
queryLoadcaseLibVersionsFun(props.checkedList[index]);
// (props.checkedList[index] as any).currentLoadcaseLib = loadcaseLibList.value[0];
const newCheckedInfo: any = { ...checkedDemandList.value[index], ...poolInfo };
checkedDemandList.value[index] = newCheckedInfo;
}
console.log('poolInfo', poolInfo);
}
};
const getIndexTreeData = async (info: any) => {
@@ -406,27 +437,24 @@ const getLoadcaseList = async (row: any) => {
});
}
};
const checkedDemandList = ref<any[]>([]);
onMounted(async () => {
checkedDemandList.value = props.checkedList.map((item: any) => {
return {
...item,
insertMode: 'lib',
taskName: item.demandName,
chooseTaskList: [],
eMemberList: getMemberListIds(item.eMemberList),
planTime: [item.beginTime, item.endTime],
};
});
loadingInterface.value = true;
await queryPoolListFun();
loadingInterface.value = false;
setTimeout(() => {
nextTick(() => {
tableRef.value.setDataFun(
props.checkedList.map((item: any) => {
return {
...item,
insertMode: 'lib',
taskName: item.demandName,
chooseTaskList: [],
eMemberList: getMemberListIds(item.eMemberList),
planTime: [item.beginTime, item.endTime],
};
})
);
});
tableRef.value.setDataFun(checkedDemandList.value);
}, 500);
});
</script>

View File

@@ -11,7 +11,6 @@
:api="demandListApi"
exportFileName="我确认的需求"
:actionList="actionList"
@show="sendTaskFun"
>
<template #leftOptions>
<el-button
@@ -59,6 +58,16 @@
</template>
</el-tree-select>
</el-form-item>
<el-form-item label="所属学科:">
<el-select class="loadcase-lib" :teleported="false" v-model="sendForm.discipline">
<el-option
v-for="item in DISCIPLINE_TYPE.A"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="插入模式:">
<el-radio-group v-model="insertTaskMode">
<el-radio value="lib" size="large">从工况库选任务</el-radio>
@@ -132,7 +141,7 @@
<el-form-item label="计划开始时间">
<el-date-picker
v-model="sendForm.beginTime"
type="datetime"
type="datetimerange"
placeholder="选择日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
@@ -187,6 +196,7 @@ import batchSendTask from './components/batchSendTask.vue';
import { getMemberListIds } from '@/utils/task';
import { enableConfigByTenant, TENANT_ENUM } from '@/tenants/tenant';
import { syncDemandList } from '../taskPage';
import { useDict } from '@/utils/useDict';
// const commonStore = CommonStore();
const taskParams = ref({ type: 1 });
@@ -197,6 +207,8 @@ const attachmentsVisible = ref(false);
const loadingInterface = ref(false);
const { DISCIPLINE_TYPE } = useDict('DISCIPLINE_TYPE');
const actionList = ref([
{
title: '分发',
@@ -332,6 +344,7 @@ const sendTaskConfirmFun = () => {
endTime: sendForm.endTime,
pMemberList: pMemberListStr,
eMemberList: sendForm.eMemberList,
aMemberList: getMemberListIds(sendForm.aMemberList),
};
});
params = {
@@ -350,6 +363,7 @@ const sendTaskConfirmFun = () => {
endTime: sendForm.endTime,
pMemberList: pMemberListStr,
eMemberList: sendForm.eMemberList,
aMemberList: getMemberListIds(sendForm.aMemberList),
},
],
demandId: sendForm.uuid,
@@ -382,6 +396,7 @@ const sendTaskFun = async (row: any) => {
sendForm.beginTime = '';
sendForm.endTime = '';
sendForm.eMemberList = '';
sendForm.aMemberList = row.aMemberList;
const taskTree = await getTaskTreeFun(row.projectId, row.phaseId);
indexTreeData.value = filterTask(taskTree);

View File

@@ -59,7 +59,5 @@ export const syncDemandList = async () => {
});
if (res.code === 200) {
ElMessage.success('同步成功');
} else {
ElMessage.error(res.message || '同步失败');
}
};