|
|
|
@ -63,10 +63,8 @@
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-form-item label="关联合同" prop="contractId">
|
|
|
|
<el-form-item label="项目编号">
|
|
|
|
<el-select v-model="form.contractId" placeholder="请选择合同" filterable clearable :disabled="!isBasicEditable">
|
|
|
|
<el-input v-model="selectedProjectCode" placeholder="选择项目后自动显示" disabled />
|
|
|
|
<el-option v-for="item in contractInfoList" :key="item.contractId" :label="item.contractName" :value="item.contractId"/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
@ -124,7 +122,7 @@
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="回款比例(%)" width="120" align="center">
|
|
|
|
<el-table-column label="回款比例(%)" width="120" align="center">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-input-number v-model="scope.row.repaymentRate" :min="0" :max="100" :precision="2" controls-position="right" style="width: 100%" :disabled="!isBasicEditable" @change="calculateRepaymentAmount(scope.row)"/>
|
|
|
|
<el-input-number v-model="scope.row.repaymentRate" :min="0" :max="100" :precision="2" controls-position="right" style="width: 100%" :disabled="!isBasicEditable"/>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="预计回款金额" width="140" align="center">
|
|
|
|
<el-table-column label="预计回款金额" width="140" align="center">
|
|
|
|
@ -176,7 +174,6 @@ import { getErpProjectPlan, addErpProjectPlan, updateErpProjectPlan, projectPlan
|
|
|
|
import { ErpProjectPlanForm } from '@/api/oa/erp/erpProjectPlan/types';
|
|
|
|
import { ErpProjectPlanForm } from '@/api/oa/erp/erpProjectPlan/types';
|
|
|
|
import { listUser } from '@/api/system/user';
|
|
|
|
import { listUser } from '@/api/system/user';
|
|
|
|
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
|
|
|
|
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
|
|
|
|
import { getErpContractInfoList } from '@/api/oa/erp/contractInfo';
|
|
|
|
|
|
|
|
import SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
import SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
|
|
|
|
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
|
|
|
|
import { useUserStore } from '@/store/modules/user';
|
|
|
|
import { useUserStore } from '@/store/modules/user';
|
|
|
|
@ -289,8 +286,7 @@ const submitLoading = ref(false);
|
|
|
|
const currentAction = ref<'draft' | 'submit' | null>(null);
|
|
|
|
const currentAction = ref<'draft' | 'submit' | null>(null);
|
|
|
|
const projectInfoList = ref<any[]>([]);
|
|
|
|
const projectInfoList = ref<any[]>([]);
|
|
|
|
const userList = ref<any[]>([]);
|
|
|
|
const userList = ref<any[]>([]);
|
|
|
|
const contractInfoList = ref<any[]>([]);
|
|
|
|
const selectedProjectCode = ref<string>(''); // 展示选中项目的编号
|
|
|
|
const contractTotalPrice = ref<number>(0);
|
|
|
|
|
|
|
|
const baseDataLoaded = ref(false);
|
|
|
|
const baseDataLoaded = ref(false);
|
|
|
|
|
|
|
|
|
|
|
|
const createEmptyForm = (): ErpProjectPlanForm => ({
|
|
|
|
const createEmptyForm = (): ErpProjectPlanForm => ({
|
|
|
|
@ -319,7 +315,7 @@ const notifyListRefresh = () => {
|
|
|
|
|
|
|
|
|
|
|
|
const resetForm = () => {
|
|
|
|
const resetForm = () => {
|
|
|
|
form.value = createEmptyForm();
|
|
|
|
form.value = createEmptyForm();
|
|
|
|
contractTotalPrice.value = 0;
|
|
|
|
selectedProjectCode.value = '';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 获取项目列表 */
|
|
|
|
/** 获取项目列表 */
|
|
|
|
@ -334,17 +330,11 @@ const getUserList = async () => {
|
|
|
|
userList.value = res.rows;
|
|
|
|
userList.value = res.rows;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 获取合同列表 */
|
|
|
|
|
|
|
|
const getContractInfoList = async () => {
|
|
|
|
|
|
|
|
const res = await getErpContractInfoList({});
|
|
|
|
|
|
|
|
contractInfoList.value = res.data;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const initBaseData = async () => {
|
|
|
|
const initBaseData = async () => {
|
|
|
|
if (baseDataLoaded.value) {
|
|
|
|
if (baseDataLoaded.value) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
await Promise.all([getProjectInfoList(), getUserList(), getContractInfoList()]);
|
|
|
|
await Promise.all([getProjectInfoList(), getUserList()]);
|
|
|
|
baseDataLoaded.value = true;
|
|
|
|
baseDataLoaded.value = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
@ -380,26 +370,22 @@ const handleDeleteStage = (index: number) => {
|
|
|
|
form.value.planStageList?.splice(index, 1);
|
|
|
|
form.value.planStageList?.splice(index, 1);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 处理项目选择变化,自动填充项目经理和部门负责人 */
|
|
|
|
/** 处理项目选择变化,自动填充项目经理、部门负责人和项目编号 */
|
|
|
|
const handleProjectChange = (projectId: number) => {
|
|
|
|
const handleProjectChange = (projectId: number) => {
|
|
|
|
if (!projectId) {
|
|
|
|
if (!projectId) {
|
|
|
|
form.value.managerId = undefined;
|
|
|
|
form.value.managerId = undefined;
|
|
|
|
form.value.chargeId = undefined;
|
|
|
|
form.value.chargeId = undefined;
|
|
|
|
|
|
|
|
selectedProjectCode.value = '';
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const project = projectInfoList.value.find(p => p.projectId === projectId);
|
|
|
|
const project = projectInfoList.value.find(p => p.projectId === projectId);
|
|
|
|
if (project) {
|
|
|
|
if (project) {
|
|
|
|
form.value.managerId = project.managerId;
|
|
|
|
form.value.managerId = project.managerId;
|
|
|
|
form.value.chargeId = project.chargeId;
|
|
|
|
form.value.chargeId = project.chargeId;
|
|
|
|
|
|
|
|
selectedProjectCode.value = project.projectCode || '';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 根据回款比例计算回款金额 */
|
|
|
|
|
|
|
|
const calculateRepaymentAmount = (row: any) => {
|
|
|
|
|
|
|
|
if (row.repaymentRate && contractTotalPrice.value > 0) {
|
|
|
|
|
|
|
|
row.repaymentAmount = parseFloat((contractTotalPrice.value * row.repaymentRate / 100).toFixed(2));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 根据回款时间与延期天数生成应收款日期 */
|
|
|
|
/** 根据回款时间与延期天数生成应收款日期 */
|
|
|
|
const recalcReceivableDate = (row: any) => {
|
|
|
|
const recalcReceivableDate = (row: any) => {
|
|
|
|
@ -421,17 +407,6 @@ const recalcReceivableDate = (row: any) => {
|
|
|
|
row.receivableDate = proxy?.parseTime ? proxy.parseTime(target, '{y}-{m}-{d}') : target.toISOString().slice(0, 10);
|
|
|
|
row.receivableDate = proxy?.parseTime ? proxy.parseTime(target, '{y}-{m}-{d}') : target.toISOString().slice(0, 10);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 监听合同变化,更新合同总价 */
|
|
|
|
|
|
|
|
watch(() => form.value.contractId, (newContractId) => {
|
|
|
|
|
|
|
|
if (newContractId) {
|
|
|
|
|
|
|
|
const contract = contractInfoList.value.find(c => c.contractId === newContractId);
|
|
|
|
|
|
|
|
if (contract) {
|
|
|
|
|
|
|
|
contractTotalPrice.value = contract.totalPrice || 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
contractTotalPrice.value = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 提交表单 */
|
|
|
|
/** 提交表单 */
|
|
|
|
const submitForm = async (status = 'draft') => {
|
|
|
|
const submitForm = async (status = 'draft') => {
|
|
|
|
@ -587,16 +562,6 @@ const loadFormData = async () => {
|
|
|
|
if (!form.value.planStageList) {
|
|
|
|
if (!form.value.planStageList) {
|
|
|
|
form.value.planStageList = [];
|
|
|
|
form.value.planStageList = [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (form.value.contractId) {
|
|
|
|
|
|
|
|
const contract = contractInfoList.value.find(c => c.contractId === form.value.contractId);
|
|
|
|
|
|
|
|
if (contract) {
|
|
|
|
|
|
|
|
contractTotalPrice.value = contract.totalPrice || 0;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
contractTotalPrice.value = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
contractTotalPrice.value = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
resetForm();
|
|
|
|
resetForm();
|
|
|
|
form.value.flowStatus = 'draft';
|
|
|
|
form.value.flowStatus = 'draft';
|
|
|
|
|