diff --git a/src/views/oa/erp/projectInfo/edit.vue b/src/views/oa/erp/projectInfo/edit.vue index 3e8b32f..ac439d9 100644 --- a/src/views/oa/erp/projectInfo/edit.vue +++ b/src/views/oa/erp/projectInfo/edit.vue @@ -267,8 +267,7 @@ import { ProjectTypeVO } from '@/api/oa/erp/projectType/types'; import { listUser } from '@/api/system/user'; import { UserQuery } from '@/api/system/user/types'; import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum'; -import { listProjectContracts, addProjectContracts, delProjectContracts, getErpProjectContractsList } from '@/api/oa/erp/projectContracts'; -import { ProjectContractsForm, ProjectContractsQuery } from '@/api/oa/erp/projectContracts/types'; +import { getErpProjectContractsList } from '@/api/oa/erp/projectContracts'; import { listContractInfo } from '@/api/oa/erp/contractInfo'; import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types'; import { getInfo } from '@/api/login'; @@ -337,6 +336,7 @@ type ProjectInfoFormEx = ProjectInfoForm & { flowCode?: string; variables?: any; bizExt?: any; + projectContractsList?: any[]; }; const initFormData: ProjectInfoFormEx = { @@ -363,7 +363,8 @@ const initFormData: ProjectInfoFormEx = { activeFlag: '1', flowCode: undefined, variables: undefined, - bizExt: undefined + bizExt: undefined, + projectContractsList: [] }; const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({ @@ -373,6 +374,11 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({ projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }], projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }], businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }], + projectTypeId: [{ required: true, message: '项目类型不能为空', trigger: 'change' }], + deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }], + managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }], + deputyId: [{ required: true, message: '分管副总不能为空', trigger: 'change' }], + chargeId: [{ required: true, message: '部门负责人不能为空', trigger: 'change' }], projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }] } }); @@ -534,6 +540,8 @@ onMounted(async () => { // 加载项目关联的合同列表 await getProjectContractsList(); } else { + // 新增模式:初始化空数组 + (form.value as any).projectContractsList = []; // 新增模式:获取登录用户信息并自动赋值 try { const userInfoRes = await getInfo(); @@ -581,7 +589,10 @@ const approvalVerifyOpen = async () => { // ================== 项目关联合同相关 ================== const contractLoading = ref(false); -const projectContractsList = ref([]); +// 使用计算属性从 form 中获取项目关联合同列表 +const projectContractsList = computed(() => { + return (form.value as any).projectContractsList || []; +}); const contractDialog = reactive({ visible: false }); const contractTableRef = ref(); const contractSelectLoading = ref(false); @@ -605,8 +616,8 @@ const getProjectContractsList = async () => { contractLoading.value = true; const params = { projectId: form.value.projectId } as any; const res = await getErpProjectContractsList(params); - // 后端已经通过left join返回了完整的合同信息 - projectContractsList.value = res.data || []; + // 后端已经通过left join返回了完整的合同信息,保存到 form 中 + (form.value as any).projectContractsList = res.data || []; } catch (error) { console.error('查询项目关联合同失败:', error); } finally { @@ -651,47 +662,62 @@ const handleContractSelectionChange = (selection: ContractInfoVO[]) => { }; /** 提交合同关联 */ -const submitContractRelation = async () => { +const submitContractRelation = () => { if (selectedContracts.value.length === 0) { proxy?.$modal.msgWarning('请至少选择一个合同'); return; } - try { - contractButtonLoading.value = true; - // 批量添加关联关系 - const promises = selectedContracts.value.map((contract, index) => { - const data: ProjectContractsForm = { - projectId: form.value.projectId, - contractId: contract.contractId, - sortOrder: projectContractsList.value.length + index + 1, - activeFlag: '1' - }; - return addProjectContracts(data); - }); - - await Promise.all(promises); - proxy?.$modal.msgSuccess('添加关联成功'); - contractDialog.visible = false; - selectedContracts.value = []; - // 刷新列表 - await getProjectContractsList(); - } catch (error) { - console.error('添加合同关联失败:', error); - proxy?.$modal.msgError('添加关联失败'); - } finally { - contractButtonLoading.value = false; + // 确保 projectContractsList 存在 + if (!(form.value as any).projectContractsList) { + (form.value as any).projectContractsList = []; } + + // 将选中的合同添加到本地数组 + selectedContracts.value.forEach((contract, index) => { + const newContract = { + projectContractsId: Date.now() + index, // 临时ID,用于区分新增项 + projectId: form.value.projectId, + contractId: contract.contractId, + contractCode: contract.contractCode, + contractName: contract.contractName, + totalPrice: contract.totalPrice, + businessDirection: contract.businessDirection, + contractStatus: contract.contractStatus, + sortOrder: projectContractsList.value.length + index + 1, + activeFlag: '1', + remark: undefined + }; + (form.value as any).projectContractsList.push(newContract); + }); + + proxy?.$modal.msgSuccess('添加关联成功'); + contractDialog.visible = false; + selectedContracts.value = []; + // 清空表格选择 + contractTableRef.value?.clearSelection(); }; -/** 删除合同关联 */ +/** 删除合同关联 - 仅从本地数组删除,不调用接口 */ const handleDeleteContract = async (row: any) => { try { await proxy?.$modal.confirm(`是否确认删除与合同"${row.contractName}"的关联关系?`); - await delProjectContracts(row.projectContractsId); + + // 确保 projectContractsList 存在 + if (!(form.value as any).projectContractsList) { + (form.value as any).projectContractsList = []; + return; + } + + // 从本地数据中删除 + const index = (form.value as any).projectContractsList.findIndex( + (item: any) => item.contractId === row.contractId + ); + if (index !== -1) { + (form.value as any).projectContractsList.splice(index, 1); + } + proxy?.$modal.msgSuccess('删除关联成功'); - // 刷新列表 - await getProjectContractsList(); } catch (error) { console.error('删除合同关联失败:', error); } diff --git a/src/views/oa/erp/projectInfo/index.vue b/src/views/oa/erp/projectInfo/index.vue index 88bbd1a..f0e7b90 100644 --- a/src/views/oa/erp/projectInfo/index.vue +++ b/src/views/oa/erp/projectInfo/index.vue @@ -60,13 +60,17 @@ @@ -96,14 +100,14 @@ - + - +