From 7e83fc530c5b0c59bfc349506f33b4de9dc15d10 Mon Sep 17 00:00:00 2001 From: wersd <1523826083@qq.com> Date: Sat, 4 Oct 2025 11:00:24 +0800 Subject: [PATCH] =?UTF-8?q?mod=20=E9=A1=B9=E7=9B=AE=E5=88=A9=E6=B6=A6?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E6=96=87=E6=A1=A3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/crm/project/index.ts | 1 + src/views/crm/project/ProjectForm.vue | 46 ++++--- .../project/component/ProjectPartnerForm.vue | 3 + .../ProjectRevenueSharePartnerForm.vue | 2 + .../settlement/ProjectSettlementForm.vue | 36 ++++-- .../crm/project/settlement/detail/index.vue | 116 ++++++++++++++++-- src/views/crm/project/settlement/index.vue | 66 +++++++++- .../ProjectTransactionDetailForm.vue | 7 +- src/views/crm/project/transaction/index.vue | 2 +- 9 files changed, 241 insertions(+), 38 deletions(-) diff --git a/src/api/crm/project/index.ts b/src/api/crm/project/index.ts index 44d3f30a3..97216f754 100644 --- a/src/api/crm/project/index.ts +++ b/src/api/crm/project/index.ts @@ -21,6 +21,7 @@ export interface ProjectVO { projectRecord: string // 项目备案 powerSupplyReply: string // 供电答复单 investmentAgreement: string // 合作投资协议 + investmentAgreementDate?: Date | number[] // 合作投资协议日期 investmentShareAgreement: string // 合作投资分成协议 supplementaryMaterials: string // 其他补充材料文件路径 cooperationAgreementConfig?: number // 场地租赁合同配置 diff --git a/src/views/crm/project/ProjectForm.vue b/src/views/crm/project/ProjectForm.vue index ac7b4c415..490ed1396 100644 --- a/src/views/crm/project/ProjectForm.vue +++ b/src/views/crm/project/ProjectForm.vue @@ -165,6 +165,7 @@ type="date" placeholder="选择合作投资协议日期" style="width: 100%" + format="YYYY-MM-DD" popper-class="full-width-datepicker" /> @@ -179,6 +180,7 @@ v-model:partners="formData.partners" :disabled="formLoading" :price="formData.totalInvestment" + :id="formData.id" /> @@ -292,7 +294,6 @@ import * as ContractApi from '@/api/crm/contract' import * as StationSiteApi from '@/api/crm/stationsite' import ProjectPartnerForm from './component/ProjectPartnerForm.vue' import ProjectRevenueSharePartnerForm from './component/ProjectRevenueSharePartnerForm.vue' -import { totalCountFormat } from '@/views/mall/promotion/coupon/formatter' import UploadFile from '@/components/UploadFile/src/UploadFile.vue' /** CRM 项目信息 表单 */ @@ -314,13 +315,13 @@ const formData = ref({ purchaseContractId: undefined, cooperationAgreement:undefined, epcContractId: undefined, - buildPermit: undefined, - ownershipProof: undefined, - projectRecord: undefined, - powerSupplyReply: undefined, - investmentAgreement: undefined, + buildPermit: '', + ownershipProof: '', + projectRecord: '', + powerSupplyReply: '', + investmentAgreement: '', investmentAgreementDate: undefined, - investmentShareAgreement: undefined, + investmentShareAgreement: '', supplementaryMaterials: [], partners:[], revenueSharePartners:[], @@ -377,7 +378,13 @@ const open = async (type: string, id?: number) => { if (id) { formLoading.value = true try { - formData.value = await ProjectApi.getProject(id) + const projectData = await ProjectApi.getProject(id) + // 处理日期格式转换 + if (projectData.investmentAgreementDate && Array.isArray(projectData.investmentAgreementDate)) { + const [year, month, day] = projectData.investmentAgreementDate + projectData.investmentAgreementDate = new Date(year, month - 1, day) // month需要减1,因为Date的月份是从0开始的 + } + formData.value = projectData } finally { formLoading.value = false } @@ -408,7 +415,16 @@ const submitForm = async () => { // 提交请求 formLoading.value = true try { - const data = formData.value as unknown as ProjectApi.ProjectVO + const data = { ...formData.value } as unknown as ProjectApi.ProjectVO + // 处理日期格式转换 - 将Date对象转换为后端期望的数组格式 + if (data.investmentAgreementDate && data.investmentAgreementDate instanceof Date) { + const date = data.investmentAgreementDate + data.investmentAgreementDate = [ + date.getFullYear(), + date.getMonth() + 1, // month需要加1,因为Date的月份是从0开始的 + date.getDate() + ] as any + } if (formType.value === 'create') { await ProjectApi.createProject(data) message.success(t('common.createSuccess')) @@ -434,13 +450,13 @@ const resetForm = () => { purchaseContractId: undefined, cooperationAgreement:undefined, epcContractId: undefined, - buildPermit: undefined, - ownershipProof: undefined, - projectRecord: undefined, - powerSupplyReply: undefined, - investmentAgreement: undefined, + buildPermit: '', + ownershipProof: '', + projectRecord: '', + powerSupplyReply: '', + investmentAgreement: '', investmentAgreementDate: undefined, - investmentShareAgreement: undefined, + investmentShareAgreement: '', supplementaryMaterials: [], partners:[], revenueSharePartners:[], diff --git a/src/views/crm/project/component/ProjectPartnerForm.vue b/src/views/crm/project/component/ProjectPartnerForm.vue index e7e328032..f5c348cc2 100644 --- a/src/views/crm/project/component/ProjectPartnerForm.vue +++ b/src/views/crm/project/component/ProjectPartnerForm.vue @@ -69,6 +69,7 @@ import * as UserApi from '@/api/system/user' import { ElMessage } from 'element-plus' const props = defineProps<{ + id?: number, partners: any[] disabled: boolean price: number @@ -118,7 +119,9 @@ onMounted(async () => { const handleAdd = () => { + console.log(formData) const row = { + id: undefined, userId: undefined, ratio: undefined, investment: undefined diff --git a/src/views/crm/project/component/ProjectRevenueSharePartnerForm.vue b/src/views/crm/project/component/ProjectRevenueSharePartnerForm.vue index 94bf32aae..7afeca467 100644 --- a/src/views/crm/project/component/ProjectRevenueSharePartnerForm.vue +++ b/src/views/crm/project/component/ProjectRevenueSharePartnerForm.vue @@ -63,6 +63,7 @@ import * as CustomerApi from '@/api/crm/customer' import { ElMessage } from 'element-plus' const props = defineProps<{ + id?: number, partners: any[] disabled: boolean }>() @@ -101,6 +102,7 @@ onMounted(async () => { const handleAdd = () => { formData.value.push() const row = { + id: undefined, customerId: undefined, ratio: undefined, investment: undefined diff --git a/src/views/crm/project/settlement/ProjectSettlementForm.vue b/src/views/crm/project/settlement/ProjectSettlementForm.vue index 61fe5b589..13d1a9ea6 100644 --- a/src/views/crm/project/settlement/ProjectSettlementForm.vue +++ b/src/views/crm/project/settlement/ProjectSettlementForm.vue @@ -30,6 +30,7 @@ + + + + + + + @@ -78,11 +96,16 @@ interface Partner { ratio: number; shareAmount: number; payableAmount: number; - lastUnbalancedAmount: number; + previousUnbalancedAmount: number; afterSettlementAmount: number; + investmentDate?: number[] | number | null; + actualInvestment?: number | null; + investment?: number | null; } interface ProjectSettlementWithPartners extends ProjectSettlementApi.ProjectSettlementVO { partners?: Partner[]; + totalInvestment?: number; + investmentAgreementDate?: number[]; } import download from '@/utils/download' defineOptions({ name: 'CrmProjectSettlementDetail' }) @@ -185,7 +208,7 @@ const expenseTable = computed(() => [ // 利润表格数据 const profitTable = computed(() => [ - { name: '当期利润/亏损', amount: settlement.value.grossProfit, remark: '收入合计-支出合计' }, + { name: '当期利润/亏损', amount: settlement.value.netProfit, remark: '收入合计-支出合计' }, { name: '当期可分配利润', amount: settlement.value.shareAmount && settlement.value.shareAmount < 0 ? 0 : (settlement.value.shareAmount ?? 0), remark: '当期利润亏损时填0' }, ]) const profitDistributionTable = computed(() => { @@ -213,14 +236,81 @@ const clearingDistributionTable = computed(() => { const partners = settlement.value.partners || []; return partners.map((p) => ({ name: p.userName ? `${p.userName}` : '', - lastUnbalancedAmount: p.lastUnbalancedAmount?.toFixed(2) ?? '', + previousUnbalancedAmount: p.previousUnbalancedAmount?.toFixed(2) ?? '', afterSettlementAmount: p.afterSettlementAmount?.toFixed(2) ?? '' })); }); + +// 投资协议日期格式化 +const investmentAgreementDateText = computed(() => { + const date = settlement.value.investmentAgreementDate; + if (date && date.length >= 3) { + return `${date[0]}年${date[1]}月${date[2]}日`; + } + return ' 年 月 日'; +}); + +// 投资信息表格数据 +const investmentTable = computed(() => { + const partners = settlement.value.partners || []; + const totalInvestment = settlement.value.totalInvestment || 0; + const totalInvestmentYuan = totalInvestment * 10000; // 转换为元 + + // 计算甲方比例 + const totalPartnerRatio = partners.reduce((sum, p) => sum + (typeof p.ratio === 'number' ? p.ratio : Number(p.ratio) || 0), 0); + const mainRatio = 100 - totalPartnerRatio; + + const table = [ + { + investor: '杭州速捷新能源运营管理有限公司(甲方)', + amount: `${(totalInvestmentYuan * mainRatio / 100).toFixed(2)}`, + ratio: `${mainRatio.toFixed(1)}%`, + method: '——' + } + ]; + + partners.forEach((p, index) => { + const investmentAmount = totalInvestmentYuan * (p.ratio || 0) / 100; + + // 处理投资日期 + let dateText = ' 年 月 日'; + if (p.investmentDate) { + if (Array.isArray(p.investmentDate) && p.investmentDate.length >= 3) { + // 如果是数组格式 [2025, 10, 2] + dateText = `${p.investmentDate[0]}年${p.investmentDate[1]}月${p.investmentDate[2]}日`; + } else if (typeof p.investmentDate === 'number') { + // 如果是时间戳 + const investmentDate = new Date(p.investmentDate); + dateText = `${investmentDate.getFullYear()}年${investmentDate.getMonth() + 1}月${investmentDate.getDate()}日`; + } + } + + // 构建method字段,包含实际投资信息 + let methodText = ''; + if (p.actualInvestment !== undefined && p.actualInvestment !== null) { + methodText = `${dateText}`; + } + + table.push({ + investor: `${p.userName}(乙方${index + 1})`, + amount: `${investmentAmount.toFixed(2)}`, + ratio: `${p.ratio || 0}%`, + method: methodText + }); + }); + + return table; +}); diff --git a/src/views/crm/project/settlement/index.vue b/src/views/crm/project/settlement/index.vue index ef9ba2b3f..f397beaf2 100644 --- a/src/views/crm/project/settlement/index.vue +++ b/src/views/crm/project/settlement/index.vue @@ -117,6 +117,21 @@ + + +