2025-10-30 19:30:06 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="comp-content">
|
|
|
|
|
<Dialog
|
|
|
|
|
:loading="loadingInterface"
|
|
|
|
|
v-model="dialogVisible"
|
|
|
|
|
diaTitle="项目信息"
|
|
|
|
|
:width="500"
|
|
|
|
|
:height="500"
|
|
|
|
|
@close="closeFun"
|
|
|
|
|
show-footer
|
|
|
|
|
>
|
|
|
|
|
<!-- <el-form :model="projectForm" label-width="100px">
|
|
|
|
|
<el-form-item label="项目名称">
|
|
|
|
|
<el-input v-model="projectForm.nodeName" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="项目代号">
|
|
|
|
|
<el-input v-model="projectForm.nodeCode" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="项目类型">
|
|
|
|
|
<el-select v-model="projectForm.nodeSubType" placeholder="请选择项目类型">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="user in PROJECT_TYPE.A"
|
|
|
|
|
:key="user.value"
|
|
|
|
|
:label="user.label"
|
|
|
|
|
:value="user.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="项目经理">
|
|
|
|
|
<el-select multiple value-key="identity" v-model="projectForm.memberList" placeholder="请选择项目经理">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="user in userOptions"
|
|
|
|
|
:key="user.identity"
|
|
|
|
|
:label="user.name"
|
|
|
|
|
:value="user"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="计划开始时间">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="projectForm.beginTime"
|
|
|
|
|
type="datetime"
|
|
|
|
|
placeholder="选择日期"
|
|
|
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="计划结束时间">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="projectForm.endTime"
|
|
|
|
|
type="datetime"
|
|
|
|
|
placeholder="选择日期"
|
|
|
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item type="textarea" label="项目描述">
|
|
|
|
|
<el-input v-model="projectForm.description" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form> -->
|
2025-11-06 15:28:23 +08:00
|
|
|
<TableForm @load="loadFun" ref="tableFormRef" tableName="NODE_LIST_LEVEL1" />
|
2025-11-04 09:56:26 +08:00
|
|
|
<template #footer>
|
|
|
|
|
<div>
|
|
|
|
|
<el-button @click="closeFun">取消</el-button>
|
2025-11-06 10:51:33 +08:00
|
|
|
<el-button type="primary" :loading="loadingInterface" @click="addOrEditProject">完成</el-button>
|
2025-11-04 09:56:26 +08:00
|
|
|
</div>
|
2025-10-30 19:30:06 +08:00
|
|
|
</template>
|
|
|
|
|
</Dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script lang='ts' setup>
|
2025-11-07 11:49:35 +08:00
|
|
|
import { addNodeApi, editNodeApi, getNodeDetailApi } from '@/api/project/node';
|
2025-10-30 19:30:06 +08:00
|
|
|
import Dialog from '@/components/common/dialog/index.vue';
|
|
|
|
|
import { getTagKeyMap, NODE_TYPE } from '@/utils/enum/node';
|
|
|
|
|
import { ElMessage } from 'element-plus';
|
2025-11-07 11:49:35 +08:00
|
|
|
import { computed, reactive, ref, watch } from 'vue';
|
2025-11-06 11:46:47 +08:00
|
|
|
import { getProjectExeStatus, getTagMapList } from '@/views/task/projectDetail/components/project';
|
2025-10-30 19:30:06 +08:00
|
|
|
import TableForm from '@/components/common/table/tableForm.vue';
|
2025-11-06 11:46:47 +08:00
|
|
|
import { PROJECT_EXE_STATUS_CODE } from '@/utils/enum/project';
|
2025-11-24 15:03:50 +08:00
|
|
|
import { getMemberListIds } from '@/utils/task';
|
2025-10-30 19:30:06 +08:00
|
|
|
|
|
|
|
|
const props = defineProps<{
|
2025-11-06 11:46:47 +08:00
|
|
|
modelValue: boolean;
|
2025-10-30 19:30:06 +08:00
|
|
|
nodeLevel1List: Array<any>;
|
2025-11-07 11:49:35 +08:00
|
|
|
projectId?: string;
|
2025-10-30 19:30:06 +08:00
|
|
|
}>();
|
|
|
|
|
|
|
|
|
|
const tableFormRef = ref();
|
|
|
|
|
|
|
|
|
|
const loadingInterface = ref(false);
|
|
|
|
|
|
|
|
|
|
const dialogVisible = computed(() => {
|
2025-11-06 11:46:47 +08:00
|
|
|
return props.modelValue;
|
2025-10-30 19:30:06 +08:00
|
|
|
});
|
2025-11-06 11:46:47 +08:00
|
|
|
const emits = defineEmits(['update:modelValue', 'update:currentProjectBaseInfo', 'nextPageFun', 'completeFun']);
|
2025-10-30 19:30:06 +08:00
|
|
|
// const projectForm = reactive<any>({
|
|
|
|
|
// nodeName: '',
|
|
|
|
|
// nodeCode: '',
|
|
|
|
|
// nodeSubType: '',
|
|
|
|
|
// memberList: [],
|
|
|
|
|
// beginTime: '',
|
|
|
|
|
// endTime: '',
|
|
|
|
|
// description: '',
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
const addOrEditProject = async () => {
|
|
|
|
|
console.log('tableFormRef.value', tableFormRef.value);
|
|
|
|
|
if (await tableFormRef.value.validateFun()) {
|
|
|
|
|
loadingInterface.value = true;
|
2025-11-21 16:16:35 +08:00
|
|
|
console.log('projectForm', tableFormRef.value.getFormDataFun());
|
|
|
|
|
const projectForm = tableFormRef.value.getFormDataFun();
|
|
|
|
|
|
|
|
|
|
if (projectForm.planTime) {
|
|
|
|
|
projectForm.beginTime = projectForm.planTime[0];
|
|
|
|
|
projectForm.endTime = projectForm.planTime[1];
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-07 18:00:39 +08:00
|
|
|
if (!props?.projectId) {
|
2025-11-21 16:16:35 +08:00
|
|
|
await createProject(projectForm);
|
2025-10-30 19:30:06 +08:00
|
|
|
} else {
|
|
|
|
|
// console.log('编辑项目', projectForm);
|
2025-11-21 16:16:35 +08:00
|
|
|
await editNode(projectForm);
|
2025-10-30 19:30:06 +08:00
|
|
|
emits('update:currentProjectBaseInfo', { ...tableFormRef.value.getFormDataFun() });
|
|
|
|
|
}
|
|
|
|
|
loadingInterface.value = false;
|
|
|
|
|
emits('completeFun', 'projectBasePage');
|
|
|
|
|
|
|
|
|
|
closeFun();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-21 16:16:35 +08:00
|
|
|
const createProject = async(projectForm:any) => {
|
2025-10-30 19:30:06 +08:00
|
|
|
// console.log('projectForm', projectForm);
|
|
|
|
|
// const memberList = projectForm.memberList.map((item: any) => {
|
|
|
|
|
// return JSON.parse(item);
|
|
|
|
|
// });
|
|
|
|
|
// if (projectForm.memberList) {
|
|
|
|
|
// projectForm.memberList = projectForm.memberList.map((item: any) => {
|
|
|
|
|
// return {
|
|
|
|
|
// name: item.nickname,
|
|
|
|
|
// identity: item.id,
|
|
|
|
|
// };
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
const tagKeyMap = getTagKeyMap();
|
|
|
|
|
const res:any = await addNodeApi(
|
|
|
|
|
{
|
|
|
|
|
addNodeList: [{ ...projectForm, pid: '', nodeType: NODE_TYPE.PROJECT, [tagKeyMap.get(NODE_TYPE.PROJECT)]: null }],
|
|
|
|
|
tagMap: getTagMapList(),
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
if (res && res.code === 200) {
|
|
|
|
|
emits('update:currentProjectBaseInfo', { ...projectForm, nodeType: NODE_TYPE.PROJECT, id: res.data[0].uuid, uuid: res.data[0].uuid });
|
|
|
|
|
ElMessage.success('创建项目成功');
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(res.msg || '创建项目失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-21 16:16:35 +08:00
|
|
|
const editNode = async(projectForm:any) => {
|
2025-10-30 19:30:06 +08:00
|
|
|
// const memberList = projectForm.memberList.map((item: any) => {
|
|
|
|
|
// return JSON.parse(item);
|
|
|
|
|
// });
|
|
|
|
|
// if (projectForm.memberList) {
|
|
|
|
|
// projectForm.memberList = projectForm.memberList.map((item: any) => {
|
|
|
|
|
// return {
|
|
|
|
|
// name: item.nickname,
|
|
|
|
|
// identity: item.id,
|
|
|
|
|
// };
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
const res:any = await editNodeApi({ editNodeList: [{ ...projectForm }] });
|
|
|
|
|
if (res && res.code === 200) {
|
|
|
|
|
ElMessage.success('编辑项目成功');
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(res.msg || '编辑项目失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const closeFun = () => {
|
|
|
|
|
console.log('关闭弹窗');
|
2025-11-06 11:46:47 +08:00
|
|
|
emits('update:modelValue', false);
|
2025-10-30 19:30:06 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// const nextPageFun = () => {
|
|
|
|
|
// if (hasSameValue()) return;
|
|
|
|
|
// emits('update:currentProjectBaseInfo', { ...tableFormRef.value.getFormDataFun(), nodeType: NODE_TYPE.PROJECT });
|
|
|
|
|
// emits('nextPageFun', 'basePage');
|
|
|
|
|
// };
|
|
|
|
|
|
2025-11-07 11:49:35 +08:00
|
|
|
// const setEditForm = (val: any) => {
|
|
|
|
|
// console.log('val', val, tableFormRef.value);
|
|
|
|
|
// nextTick(() => {
|
2025-11-24 15:03:50 +08:00
|
|
|
// const memberStr = getMemberListIds(val?.memberList);
|
2025-11-07 11:49:35 +08:00
|
|
|
// tableFormRef.value.setFormDataFun({ ...val, memberList: memberStr });
|
|
|
|
|
// });
|
|
|
|
|
// };
|
2025-10-30 19:30:06 +08:00
|
|
|
|
|
|
|
|
const setOptionsFun = (key: string, options: any[]) => {
|
|
|
|
|
console.log('key options', key, options);
|
|
|
|
|
tableFormRef.value.setOptionsFun(key, options);
|
|
|
|
|
};
|
2025-11-07 11:49:35 +08:00
|
|
|
const loadFun = async() => {
|
|
|
|
|
await getNodeDetailFun();
|
2025-11-06 15:28:23 +08:00
|
|
|
initTableForm();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const initTableForm = () => {
|
|
|
|
|
console.log('tableFormRef.value', tableFormRef.value);
|
|
|
|
|
if (tableFormRef.value) {
|
|
|
|
|
let statusList = [];
|
2025-11-07 11:49:35 +08:00
|
|
|
if (!props?.projectId) {
|
2025-11-06 15:28:23 +08:00
|
|
|
statusList = [{ label: '未开始', value: PROJECT_EXE_STATUS_CODE.NOT_STARTED }];
|
|
|
|
|
tableFormRef.value.resetFun();
|
2025-11-07 11:49:35 +08:00
|
|
|
// setEditForm({ exeStatus: PROJECT_EXE_STATUS_CODE.NOT_STARTED });
|
2025-11-06 15:28:23 +08:00
|
|
|
} else {
|
2025-11-07 11:49:35 +08:00
|
|
|
// setEditForm({ ...props.currentRow });
|
|
|
|
|
statusList = getProjectExeStatus(projectInfo.exeStatus as PROJECT_EXE_STATUS_CODE);
|
2025-11-06 15:28:23 +08:00
|
|
|
}
|
|
|
|
|
tableFormRef.value.setOptionsFun('exeStatus', statusList);
|
|
|
|
|
}
|
|
|
|
|
};
|
2025-10-30 19:30:06 +08:00
|
|
|
|
2025-11-07 11:49:35 +08:00
|
|
|
const projectInfo = reactive<any>({});
|
|
|
|
|
|
|
|
|
|
const getNodeDetailFun = async() => {
|
|
|
|
|
if (tableFormRef.value) {
|
|
|
|
|
if (!props?.projectId ) {
|
|
|
|
|
for (const key in projectInfo) {
|
|
|
|
|
projectInfo[key] = '';
|
|
|
|
|
}
|
|
|
|
|
tableFormRef.value.setFormDataFun({ exeStatus: PROJECT_EXE_STATUS_CODE.NOT_STARTED });
|
|
|
|
|
} else {
|
|
|
|
|
const res:any = await getNodeDetailApi({ projectNodeId: props.projectId });
|
|
|
|
|
if (res.code === 200) {
|
|
|
|
|
for (const key in res.data) {
|
|
|
|
|
projectInfo[key] = res.data[key];
|
|
|
|
|
}
|
2025-11-24 15:03:50 +08:00
|
|
|
console.log('123', { ...projectInfo, planTime: [projectInfo.beginTime, projectInfo.endTime], memberList: getMemberListIds(projectInfo.memberList) });
|
|
|
|
|
tableFormRef.value.setFormDataFun({ ...projectInfo, planTime: [projectInfo.beginTime, projectInfo.endTime], memberList: getMemberListIds(projectInfo.memberList) });
|
2025-11-07 11:49:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-06 11:46:47 +08:00
|
|
|
watch(
|
|
|
|
|
() => props.modelValue,
|
2025-11-07 11:49:35 +08:00
|
|
|
async (val: any) => {
|
2025-11-06 11:46:47 +08:00
|
|
|
if (val) {
|
2025-11-07 11:49:35 +08:00
|
|
|
await getNodeDetailFun();
|
2025-11-06 15:28:23 +08:00
|
|
|
initTableForm();
|
2025-11-06 11:46:47 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
immediate: true,
|
|
|
|
|
});
|
2025-11-06 15:28:23 +08:00
|
|
|
// onMounted(() => {
|
|
|
|
|
// setOptions('onMounted');
|
|
|
|
|
// });
|
2025-11-06 11:46:47 +08:00
|
|
|
|
2025-10-30 19:30:06 +08:00
|
|
|
defineExpose({
|
|
|
|
|
// projectForm,
|
|
|
|
|
createProject,
|
|
|
|
|
setOptionsFun,
|
|
|
|
|
});
|
|
|
|
|
</script>
|