1.1.16 把项目计划阶段的回款关联从字典字段改为回款阶段主键(后端 SQL联表、多页面前端与合同回款逻辑)

dev
yinq 2 weeks ago
parent 45a7cb6d77
commit afbe755d60

@ -323,14 +323,18 @@ export interface ContractCollectionStageDetailVO {
contractId: string | number;
paymentStageId: string | number;
stageName: string;
collectionStage: string;
/** base_payment_stage.collection_stage可选 */
collectionStage?: string;
repaymentRate: number;
paymentPercentage: number;
paymentAmount: number;
paymentDeadline: number;
paymentDescription: string;
planStageId: string | number;
repaymentAmount?: number;
receivableDate: string;
actualRepaymentAmount: number;
actualRepaymentRate?: number;
collectionConfirmUserId: string | number;
collectionConfirmTime: string;
collectionConfirmStatus: string;

@ -30,9 +30,13 @@ export interface ErpProjectPlanStageVO {
planEndTime: string;
/**
*
* ID base_payment_stage
*/
collectionStage: string;
paymentStageId?: string | number;
/**
*
*/
paymentStageName?: string;
/**
* (%)
@ -99,6 +103,11 @@ export interface ErpProjectPlanStageVO {
*/
actualRepaymentAmount: number;
/**
* (%)
*/
actualRepaymentRate: number;
/**
*
*/
@ -153,9 +162,10 @@ export interface ErpProjectPlanStageForm extends BaseEntity {
planEndTime?: string;
/**
*
* ID
*/
collectionStage?: string;
paymentStageId?: string | number;
paymentStageName?: string;
/**
* (%)
@ -222,6 +232,11 @@ export interface ErpProjectPlanStageForm extends BaseEntity {
*/
actualRepaymentAmount?: number;
/**
* (%)
*/
actualRepaymentRate?: number;
/**
*
*/
@ -272,9 +287,9 @@ export interface ErpProjectPlanStageQuery extends PageQuery {
planEndTime?: string;
/**
*
* ID
*/
collectionStage?: string;
paymentStageId?: string | number;
/**
* (%)
@ -336,6 +351,11 @@ export interface ErpProjectPlanStageQuery extends PageQuery {
*/
actualRepaymentAmount?: number;
/**
* (%)
*/
actualRepaymentRate?: number;
/**
*
*/

@ -250,8 +250,8 @@
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="回款阶段" width="220" align="center">
<template #default="scope">
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%" :disabled="isFormDisabled">
<el-option v-for="stage in paymentStageList" :key="stage.paymentStageId" :label="stage.paymentMethod" :value="stage.paymentStageId" />
<el-select v-model="scope.row.paymentStageId" placeholder="请选择回款阶段" clearable style="width: 100%" :disabled="isFormDisabled">
<el-option v-for="stage in paymentStageList" :key="stage.paymentStageId" :label="stage.stageName" :value="String(stage.paymentStageId)" />
</el-select>
</template>
</el-table-column>
@ -775,10 +775,7 @@ const paymentStageList = ref<PaymentStageVO[]>([]);
const getPaymentStageList = async () => {
try {
const res = await getBasePaymentStageList({ pageNum: 1, pageSize: 9999 });
paymentStageList.value = (res.data || []).map((item: any) => ({
...item,
paymentStageId: item.paymentStageId != null ? String(item.paymentStageId) : item.paymentStageId
}));
paymentStageList.value = res.data || [];
} catch (error) {
console.error('查询回款阶段列表失败:', error);
paymentStageList.value = [];
@ -1055,7 +1052,6 @@ const loadContractInfo = async () => {
const list = (contractData as any).contractPaymentMethodList;
if (list && Array.isArray(list) && list.length > 0) {
planStageList.value = list.map((pm: any, index: number) => {
const stage = paymentStageList.value.find((s: PaymentStageVO) => String(s.paymentStageId) === String(pm.paymentStageId));
return {
planStageId: undefined,
projectId: form.value.projectId,
@ -1063,7 +1059,7 @@ const loadContractInfo = async () => {
projectPhases: '',
planStartTime: undefined,
planEndTime: undefined,
collectionStage: stage.paymentStageId,
paymentStageId: pm.paymentStageId != null && pm.paymentStageId !== '' ? String(pm.paymentStageId) : undefined,
repaymentRate: pm.paymentPercentage ?? undefined,
repaymentAmount: undefined,
repaymentTime: getDefaultRepaymentDate(pm),
@ -1205,7 +1201,7 @@ const getPlanStageList = async () => {
projectPhases: item.projectPhases || '',
planStartTime: item.planStartTime || undefined,
planEndTime: item.planEndTime || undefined,
collectionStage: item.collectionStage || '',
paymentStageId: item.paymentStageId != null && item.paymentStageId !== '' ? String(item.paymentStageId) : undefined,
repaymentRate: item.repaymentRate || undefined,
repaymentAmount: item.repaymentAmount || undefined,
repaymentTime: item.repaymentTime || undefined,
@ -1233,7 +1229,7 @@ const handleAddPlanStage = () => {
projectPhases: '',
planStartTime: undefined,
planEndTime: undefined,
collectionStage: '',
paymentStageId: undefined,
repaymentRate: undefined,
repaymentAmount: undefined,
repaymentTime: undefined,

@ -137,10 +137,22 @@
/>
</template>
</el-table-column>
<el-table-column label="回款阶段" width="150" align="center">
<el-table-column label="回款阶段" width="180" align="center">
<template #default="scope">
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" style="width: 100%" :disabled="!isBasicEditable">
<el-option v-for="dict in collection_stage" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-select
v-model="scope.row.paymentStageId"
placeholder="请选择回款阶段"
style="width: 100%"
filterable
clearable
:disabled="!isBasicEditable"
>
<el-option
v-for="stage in paymentStageOptions"
:key="stage.paymentStageId"
:label="stage.stageName"
:value="stage.paymentStageId"
/>
</el-select>
</template>
</el-table-column>
@ -290,6 +302,8 @@ import { useRoute, useRouter } from 'vue-router';
import { addErpProjectPlan, getErpProjectPlan, projectPlanSubmitAndFlowStart, updateErpProjectPlan } from '@/api/oa/erp/erpProjectPlan';
import { ErpProjectPlanForm } from '@/api/oa/erp/erpProjectPlan/types';
import { queryProjectChangeByProjectPlanId } from '@/api/oa/erp/erpProjectChange';
import { getBasePaymentStageList } from '@/api/oa/base/paymentStage';
import type { PaymentStageVO } from '@/api/oa/base/paymentStage/types';
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
import SubmitVerify from '@/components/Process/submitVerify.vue';
@ -300,8 +314,8 @@ import { useUserStore } from '@/store/modules/user';
import { FlowCodeEnum } from '@/enums/OAEnum';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { project_plan_status, project_phases, collection_stage, project_change_status } = toRefs<any>(
proxy?.useDict('project_plan_status', 'project_phases', 'collection_stage', 'project_change_status')
const { project_plan_status, project_phases, project_change_status } = toRefs<any>(
proxy?.useDict('project_plan_status', 'project_phases', 'project_change_status')
);
const route = useRoute();
const router = useRouter();
@ -352,6 +366,7 @@ const selectedProjectCode = ref<string>(''); // 展示选中项目的编号
const selectedProjectName = ref<string>(''); //
const baseDataLoaded = ref(false);
const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
const paymentStageOptions = ref<PaymentStageVO[]>([]);
//
const projectChangeList = ref<any[]>([]); //
@ -398,11 +413,21 @@ const getProjectInfoList = async () => {
projectInfoList.value = (res.data || []) as Partial<ProjectInfoVO>[];
};
const loadPaymentStageOptions = async () => {
try {
const res = await getBasePaymentStageList({ pageNum: 1, pageSize: 9999 });
paymentStageOptions.value = res.data || [];
} catch {
paymentStageOptions.value = [];
}
};
const initBaseData = async () => {
if (baseDataLoaded.value) {
return;
}
await getProjectInfoList();
await loadPaymentStageOptions();
baseDataLoaded.value = true;
};
@ -441,7 +466,7 @@ const handleAddStage = () => {
projectPhases: undefined,
planStartTime: undefined,
planEndTime: undefined,
collectionStage: undefined,
paymentStageId: undefined,
repaymentRate: undefined,
repaymentAmount: undefined,
repaymentTime: undefined,

@ -222,8 +222,8 @@ import ApprovalRecord from '@/components/Process/approvalRecord.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute();
const router = useRouter();
const { active_flag, project_plan_status, project_phases, collection_stage, wf_business_status } = toRefs<any>(
proxy?.useDict('active_flag', 'project_plan_status', 'project_phases', 'collection_stage', 'wf_business_status')
const { active_flag, project_plan_status, project_phases, wf_business_status } = toRefs<any>(
proxy?.useDict('active_flag', 'project_plan_status', 'project_phases', 'wf_business_status')
);
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();

@ -29,8 +29,8 @@
placeholder="请选择计划结束时间"
/>
</el-form-item>
<el-form-item label="回款阶段" prop="collectionStage">
<el-input v-model="queryParams.collectionStage" placeholder="请输入回款阶段" clearable @keyup.enter="handleQuery" />
<el-form-item label="付款节点ID" prop="paymentStageId">
<el-input v-model="queryParams.paymentStageId" placeholder="请输入付款节点ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="预计回款比例(%)" prop="repaymentRate">
<el-input v-model="queryParams.repaymentRate" placeholder="请输入预计回款比例(%)" clearable @keyup.enter="handleQuery" />
@ -131,7 +131,11 @@
<span>{{ parseTime(scope.row.planEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="回款阶段" align="center" prop="collectionStage" v-if="columns[7].visible"/>
<el-table-column label="回款阶段" align="center" prop="paymentStageName" min-width="140" v-if="columns[7].visible">
<template #default="scope">
<span>{{ scope.row.paymentStageName || scope.row.paymentStageId || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="预计回款比例(%)" align="center" prop="repaymentRate" v-if="columns[8].visible"/>
<el-table-column label="预计回款金额" align="center" prop="repaymentAmount" v-if="columns[9].visible"/>
<el-table-column label="预计回款时间" align="center" prop="repaymentTime" width="180" v-if="columns[10].visible">
@ -208,9 +212,9 @@
placeholder="请选择计划结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="回款阶段" prop="collectionStage">
<el-select v-model="form.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%">
<el-option v-for="dict in collection_stage" :key="dict.value" :label="dict.label" :value="dict.value"/>
<el-form-item label="回款阶段" prop="paymentStageId">
<el-select v-model="form.paymentStageId" placeholder="请选择回款阶段" clearable filterable style="width: 100%">
<el-option v-for="stage in paymentStageOptions" :key="stage.paymentStageId" :label="stage.stageName" :value="stage.paymentStageId"/>
</el-select>
</el-form-item>
<el-form-item label="预计回款比例(%)" prop="repaymentRate">
@ -290,9 +294,13 @@
<script setup name="ErpProjectPlanStage" lang="ts">
import { listErpProjectPlanStage, getErpProjectPlanStage, delErpProjectPlanStage, addErpProjectPlanStage, updateErpProjectPlanStage } from '@/api/oa/erp/erpProjectPlanStage';
import { ErpProjectPlanStageVO, ErpProjectPlanStageQuery, ErpProjectPlanStageForm } from '@/api/oa/erp/erpProjectPlanStage/types';
import { getBasePaymentStageList } from '@/api/oa/base/paymentStage';
import type { PaymentStageVO } from '@/api/oa/base/paymentStage/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { active_flag, project_plan_status , project_phases, collection_stage} = toRefs<any>(proxy?.useDict('active_flag', 'project_plan_status', 'project_phases', 'collection_stage'));
const { active_flag, project_plan_status , project_phases} = toRefs<any>(proxy?.useDict('active_flag', 'project_plan_status', 'project_phases'));
const paymentStageOptions = ref<PaymentStageVO[]>([]);
const erpProjectPlanStageList = ref<ErpProjectPlanStageVO[]>([]);
const buttonLoading = ref(false);
@ -348,7 +356,7 @@
projectPhases: undefined,
planStartTime: undefined,
planEndTime: undefined,
collectionStage: undefined,
paymentStageId: undefined,
repaymentRate: undefined,
repaymentAmount: undefined,
repaymentTime: undefined,
@ -372,7 +380,7 @@
projectPhases: undefined,
planStartTime: undefined,
planEndTime: undefined,
collectionStage: undefined,
paymentStageId: undefined,
repaymentRate: undefined,
repaymentAmount: undefined,
repaymentTime: undefined,
@ -505,7 +513,17 @@
}, `erpProjectPlanStage_${new Date().getTime()}.xlsx`)
}
const loadPaymentStageOptions = async () => {
try {
const res = await getBasePaymentStageList({ pageNum: 1, pageSize: 9999 });
paymentStageOptions.value = res.data || [];
} catch {
paymentStageOptions.value = [];
}
};
onMounted(() => {
loadPaymentStageOptions();
getList();
});
</script>

@ -253,7 +253,7 @@
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="回款阶段" width="220" align="center">
<template #default="scope">
{{ getPaymentStageName(scope.row.collectionStage) }}
{{ scope.row.paymentStageName || getPaymentStageName(scope.row.paymentStageId) }}
</template>
</el-table-column>
<el-table-column label="预计回款比例(%)" width="160" align="center" prop="repaymentRate" />
@ -642,7 +642,8 @@ const loadPlanStageList = async () => {
const res = await getErpProjectPlanStageList({ projectId: projectId.value });
planStageList.value = (res.data || []).map((item: any) => ({
...item,
collectionStage: item.collectionStage || '',
paymentStageId: item.paymentStageId,
paymentStageName: item.paymentStageName,
repaymentRate: item.repaymentRate || undefined,
repaymentTime: item.repaymentTime || undefined,
remark: item.remark || ''
@ -656,10 +657,10 @@ const loadPlanStageList = async () => {
};
/** 获取回款阶段名称 */
const getPaymentStageName = (stageId: string | number) => {
if (!stageId) return '-';
const getPaymentStageName = (stageId: string | number | undefined) => {
if (stageId === undefined || stageId === null || stageId === '') return '-';
const stage = paymentStageList.value.find((s) => String(s.paymentStageId) === String(stageId));
return stage?.paymentMethod || '-';
return stage?.stageName || '-';
};
/** Tab 切换 */

Loading…
Cancel
Save