|
|
|
@ -267,8 +267,7 @@ import { ProjectTypeVO } from '@/api/oa/erp/projectType/types';
|
|
|
|
import { listUser } from '@/api/system/user';
|
|
|
|
import { listUser } from '@/api/system/user';
|
|
|
|
import { UserQuery } from '@/api/system/user/types';
|
|
|
|
import { UserQuery } from '@/api/system/user/types';
|
|
|
|
import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum';
|
|
|
|
import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum';
|
|
|
|
import { listProjectContracts, addProjectContracts, delProjectContracts, getErpProjectContractsList } from '@/api/oa/erp/projectContracts';
|
|
|
|
import { getErpProjectContractsList } from '@/api/oa/erp/projectContracts';
|
|
|
|
import { ProjectContractsForm, ProjectContractsQuery } from '@/api/oa/erp/projectContracts/types';
|
|
|
|
|
|
|
|
import { listContractInfo } from '@/api/oa/erp/contractInfo';
|
|
|
|
import { listContractInfo } from '@/api/oa/erp/contractInfo';
|
|
|
|
import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types';
|
|
|
|
import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types';
|
|
|
|
import { getInfo } from '@/api/login';
|
|
|
|
import { getInfo } from '@/api/login';
|
|
|
|
@ -337,6 +336,7 @@ type ProjectInfoFormEx = ProjectInfoForm & {
|
|
|
|
flowCode?: string;
|
|
|
|
flowCode?: string;
|
|
|
|
variables?: any;
|
|
|
|
variables?: any;
|
|
|
|
bizExt?: any;
|
|
|
|
bizExt?: any;
|
|
|
|
|
|
|
|
projectContractsList?: any[];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const initFormData: ProjectInfoFormEx = {
|
|
|
|
const initFormData: ProjectInfoFormEx = {
|
|
|
|
@ -363,7 +363,8 @@ const initFormData: ProjectInfoFormEx = {
|
|
|
|
activeFlag: '1',
|
|
|
|
activeFlag: '1',
|
|
|
|
flowCode: undefined,
|
|
|
|
flowCode: undefined,
|
|
|
|
variables: undefined,
|
|
|
|
variables: undefined,
|
|
|
|
bizExt: undefined
|
|
|
|
bizExt: undefined,
|
|
|
|
|
|
|
|
projectContractsList: []
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
|
|
|
|
const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
|
|
|
|
@ -373,6 +374,11 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
|
|
|
|
projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],
|
|
|
|
projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],
|
|
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
|
|
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }],
|
|
|
|
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' }]
|
|
|
|
projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -534,6 +540,8 @@ onMounted(async () => {
|
|
|
|
// 加载项目关联的合同列表
|
|
|
|
// 加载项目关联的合同列表
|
|
|
|
await getProjectContractsList();
|
|
|
|
await getProjectContractsList();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 新增模式:初始化空数组
|
|
|
|
|
|
|
|
(form.value as any).projectContractsList = [];
|
|
|
|
// 新增模式:获取登录用户信息并自动赋值
|
|
|
|
// 新增模式:获取登录用户信息并自动赋值
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const userInfoRes = await getInfo();
|
|
|
|
const userInfoRes = await getInfo();
|
|
|
|
@ -581,7 +589,10 @@ const approvalVerifyOpen = async () => {
|
|
|
|
|
|
|
|
|
|
|
|
// ================== 项目关联合同相关 ==================
|
|
|
|
// ================== 项目关联合同相关 ==================
|
|
|
|
const contractLoading = ref(false);
|
|
|
|
const contractLoading = ref(false);
|
|
|
|
const projectContractsList = ref<any[]>([]);
|
|
|
|
// 使用计算属性从 form 中获取项目关联合同列表
|
|
|
|
|
|
|
|
const projectContractsList = computed(() => {
|
|
|
|
|
|
|
|
return (form.value as any).projectContractsList || [];
|
|
|
|
|
|
|
|
});
|
|
|
|
const contractDialog = reactive({ visible: false });
|
|
|
|
const contractDialog = reactive({ visible: false });
|
|
|
|
const contractTableRef = ref();
|
|
|
|
const contractTableRef = ref();
|
|
|
|
const contractSelectLoading = ref(false);
|
|
|
|
const contractSelectLoading = ref(false);
|
|
|
|
@ -605,8 +616,8 @@ const getProjectContractsList = async () => {
|
|
|
|
contractLoading.value = true;
|
|
|
|
contractLoading.value = true;
|
|
|
|
const params = { projectId: form.value.projectId } as any;
|
|
|
|
const params = { projectId: form.value.projectId } as any;
|
|
|
|
const res = await getErpProjectContractsList(params);
|
|
|
|
const res = await getErpProjectContractsList(params);
|
|
|
|
// 后端已经通过left join返回了完整的合同信息
|
|
|
|
// 后端已经通过left join返回了完整的合同信息,保存到 form 中
|
|
|
|
projectContractsList.value = res.data || [];
|
|
|
|
(form.value as any).projectContractsList = res.data || [];
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('查询项目关联合同失败:', error);
|
|
|
|
console.error('查询项目关联合同失败:', error);
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
@ -651,47 +662,62 @@ const handleContractSelectionChange = (selection: ContractInfoVO[]) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 提交合同关联 */
|
|
|
|
/** 提交合同关联 */
|
|
|
|
const submitContractRelation = async () => {
|
|
|
|
const submitContractRelation = () => {
|
|
|
|
if (selectedContracts.value.length === 0) {
|
|
|
|
if (selectedContracts.value.length === 0) {
|
|
|
|
proxy?.$modal.msgWarning('请至少选择一个合同');
|
|
|
|
proxy?.$modal.msgWarning('请至少选择一个合同');
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
// 确保 projectContractsList 存在
|
|
|
|
contractButtonLoading.value = true;
|
|
|
|
if (!(form.value as any).projectContractsList) {
|
|
|
|
// 批量添加关联关系
|
|
|
|
(form.value as any).projectContractsList = [];
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将选中的合同添加到本地数组
|
|
|
|
|
|
|
|
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) => {
|
|
|
|
const handleDeleteContract = async (row: any) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
await proxy?.$modal.confirm(`是否确认删除与合同"${row.contractName}"的关联关系?`);
|
|
|
|
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('删除关联成功');
|
|
|
|
proxy?.$modal.msgSuccess('删除关联成功');
|
|
|
|
// 刷新列表
|
|
|
|
|
|
|
|
await getProjectContractsList();
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('删除合同关联失败:', error);
|
|
|
|
console.error('删除合同关联失败:', error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|