mod 项目利润结算文档优化
parent
563db197b3
commit
7e83fc530c
|
|
@ -21,6 +21,7 @@ export interface ProjectVO {
|
||||||
projectRecord: string // 项目备案
|
projectRecord: string // 项目备案
|
||||||
powerSupplyReply: string // 供电答复单
|
powerSupplyReply: string // 供电答复单
|
||||||
investmentAgreement: string // 合作投资协议
|
investmentAgreement: string // 合作投资协议
|
||||||
|
investmentAgreementDate?: Date | number[] // 合作投资协议日期
|
||||||
investmentShareAgreement: string // 合作投资分成协议
|
investmentShareAgreement: string // 合作投资分成协议
|
||||||
supplementaryMaterials: string // 其他补充材料文件路径
|
supplementaryMaterials: string // 其他补充材料文件路径
|
||||||
cooperationAgreementConfig?: number // 场地租赁合同配置
|
cooperationAgreementConfig?: number // 场地租赁合同配置
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,7 @@
|
||||||
type="date"
|
type="date"
|
||||||
placeholder="选择合作投资协议日期"
|
placeholder="选择合作投资协议日期"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
popper-class="full-width-datepicker"
|
popper-class="full-width-datepicker"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -179,6 +180,7 @@
|
||||||
v-model:partners="formData.partners"
|
v-model:partners="formData.partners"
|
||||||
:disabled="formLoading"
|
:disabled="formLoading"
|
||||||
:price="formData.totalInvestment"
|
:price="formData.totalInvestment"
|
||||||
|
:id="formData.id"
|
||||||
/>
|
/>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
|
|
@ -292,7 +294,6 @@ import * as ContractApi from '@/api/crm/contract'
|
||||||
import * as StationSiteApi from '@/api/crm/stationsite'
|
import * as StationSiteApi from '@/api/crm/stationsite'
|
||||||
import ProjectPartnerForm from './component/ProjectPartnerForm.vue'
|
import ProjectPartnerForm from './component/ProjectPartnerForm.vue'
|
||||||
import ProjectRevenueSharePartnerForm from './component/ProjectRevenueSharePartnerForm.vue'
|
import ProjectRevenueSharePartnerForm from './component/ProjectRevenueSharePartnerForm.vue'
|
||||||
import { totalCountFormat } from '@/views/mall/promotion/coupon/formatter'
|
|
||||||
import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
|
import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
|
||||||
|
|
||||||
/** CRM 项目信息 表单 */
|
/** CRM 项目信息 表单 */
|
||||||
|
|
@ -314,13 +315,13 @@ const formData = ref({
|
||||||
purchaseContractId: undefined,
|
purchaseContractId: undefined,
|
||||||
cooperationAgreement:undefined,
|
cooperationAgreement:undefined,
|
||||||
epcContractId: undefined,
|
epcContractId: undefined,
|
||||||
buildPermit: undefined,
|
buildPermit: '',
|
||||||
ownershipProof: undefined,
|
ownershipProof: '',
|
||||||
projectRecord: undefined,
|
projectRecord: '',
|
||||||
powerSupplyReply: undefined,
|
powerSupplyReply: '',
|
||||||
investmentAgreement: undefined,
|
investmentAgreement: '',
|
||||||
investmentAgreementDate: undefined,
|
investmentAgreementDate: undefined,
|
||||||
investmentShareAgreement: undefined,
|
investmentShareAgreement: '',
|
||||||
supplementaryMaterials: [],
|
supplementaryMaterials: [],
|
||||||
partners:[],
|
partners:[],
|
||||||
revenueSharePartners:[],
|
revenueSharePartners:[],
|
||||||
|
|
@ -377,7 +378,13 @@ const open = async (type: string, id?: number) => {
|
||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
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 {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
|
|
@ -408,7 +415,16 @@ const submitForm = async () => {
|
||||||
// 提交请求
|
// 提交请求
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
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') {
|
if (formType.value === 'create') {
|
||||||
await ProjectApi.createProject(data)
|
await ProjectApi.createProject(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
|
|
@ -434,13 +450,13 @@ const resetForm = () => {
|
||||||
purchaseContractId: undefined,
|
purchaseContractId: undefined,
|
||||||
cooperationAgreement:undefined,
|
cooperationAgreement:undefined,
|
||||||
epcContractId: undefined,
|
epcContractId: undefined,
|
||||||
buildPermit: undefined,
|
buildPermit: '',
|
||||||
ownershipProof: undefined,
|
ownershipProof: '',
|
||||||
projectRecord: undefined,
|
projectRecord: '',
|
||||||
powerSupplyReply: undefined,
|
powerSupplyReply: '',
|
||||||
investmentAgreement: undefined,
|
investmentAgreement: '',
|
||||||
investmentAgreementDate: undefined,
|
investmentAgreementDate: undefined,
|
||||||
investmentShareAgreement: undefined,
|
investmentShareAgreement: '',
|
||||||
supplementaryMaterials: [],
|
supplementaryMaterials: [],
|
||||||
partners:[],
|
partners:[],
|
||||||
revenueSharePartners:[],
|
revenueSharePartners:[],
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ import * as UserApi from '@/api/system/user'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
id?: number,
|
||||||
partners: any[]
|
partners: any[]
|
||||||
disabled: boolean
|
disabled: boolean
|
||||||
price: number
|
price: number
|
||||||
|
|
@ -118,7 +119,9 @@ onMounted(async () => {
|
||||||
|
|
||||||
|
|
||||||
const handleAdd = () => {
|
const handleAdd = () => {
|
||||||
|
console.log(formData)
|
||||||
const row = {
|
const row = {
|
||||||
|
id: undefined,
|
||||||
userId: undefined,
|
userId: undefined,
|
||||||
ratio: undefined,
|
ratio: undefined,
|
||||||
investment: undefined
|
investment: undefined
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ import * as CustomerApi from '@/api/crm/customer'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
id?: number,
|
||||||
partners: any[]
|
partners: any[]
|
||||||
disabled: boolean
|
disabled: boolean
|
||||||
}>()
|
}>()
|
||||||
|
|
@ -101,6 +102,7 @@ onMounted(async () => {
|
||||||
const handleAdd = () => {
|
const handleAdd = () => {
|
||||||
formData.value.push()
|
formData.value.push()
|
||||||
const row = {
|
const row = {
|
||||||
|
id: undefined,
|
||||||
customerId: undefined,
|
customerId: undefined,
|
||||||
ratio: undefined,
|
ratio: undefined,
|
||||||
investment: undefined
|
investment: undefined
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="formData.settlementDate"
|
v-model="formData.settlementDate"
|
||||||
type="date"
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
placeholder="选择结算日期"
|
placeholder="选择结算日期"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
popper-class="full-width-datepicker"
|
popper-class="full-width-datepicker"
|
||||||
|
|
@ -55,6 +56,7 @@
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="formData.startDate"
|
v-model="formData.startDate"
|
||||||
type="date"
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
placeholder="选择结算开始时间"
|
placeholder="选择结算开始时间"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
popper-class="full-width-datepicker"
|
popper-class="full-width-datepicker"
|
||||||
|
|
@ -66,6 +68,7 @@
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="formData.endDate"
|
v-model="formData.endDate"
|
||||||
type="date"
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
placeholder="选择结算结束时间"
|
placeholder="选择结算结束时间"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
popper-class="full-width-datepicker"
|
popper-class="full-width-datepicker"
|
||||||
|
|
@ -86,6 +89,19 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="对账回执" prop="proofAttachment">
|
||||||
|
<UploadFile
|
||||||
|
v-model="formData.proofAttachment"
|
||||||
|
:isShowTip="true"
|
||||||
|
:limit="1"
|
||||||
|
:file-size="20"
|
||||||
|
:file-type="['pdf', 'jpg', 'jpeg', 'png', 'doc', 'docx', 'xls', 'xlsx']"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
|
@ -97,6 +113,7 @@
|
||||||
import * as ProjectSettlementApi from '@/api/crm/project/settlement'
|
import * as ProjectSettlementApi from '@/api/crm/project/settlement'
|
||||||
import * as ProjectApi from '@/api/crm/project'
|
import * as ProjectApi from '@/api/crm/project'
|
||||||
import ElQuarterPicker from '@/components/ElQuarterPicker/index.vue'
|
import ElQuarterPicker from '@/components/ElQuarterPicker/index.vue'
|
||||||
|
import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
|
|
||||||
/** 项目利润结算 表单 */
|
/** 项目利润结算 表单 */
|
||||||
|
|
@ -112,14 +129,14 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
const formData = ref({
|
const formData = ref({
|
||||||
id: undefined,
|
id: undefined,
|
||||||
projectId: undefined,
|
projectId: undefined,
|
||||||
settlementPeriod: undefined,
|
settlementPeriod: undefined as string | undefined,
|
||||||
period: undefined,
|
period: undefined,
|
||||||
startDate: undefined,
|
startDate: undefined as string | undefined,
|
||||||
endDate: undefined,
|
endDate: undefined as string | undefined,
|
||||||
settlementDate: undefined,
|
settlementDate: undefined,
|
||||||
incomeRemark: undefined,
|
incomeRemark: undefined,
|
||||||
expenseRemark: undefined,
|
expenseRemark: undefined,
|
||||||
proofAttachment: undefined,
|
proofAttachment: '',
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
})
|
})
|
||||||
const formRules = reactive({
|
const formRules = reactive({
|
||||||
|
|
@ -140,7 +157,12 @@ const open = async (type: string, id?: number) => {
|
||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
formData.value = await ProjectSettlementApi.getProjectSettlement(id)
|
const data = await ProjectSettlementApi.getProjectSettlement(id)
|
||||||
|
formData.value = {
|
||||||
|
...data,
|
||||||
|
// 将Date对象转换为YYYY-MM-DD格式的字符串
|
||||||
|
settlementDate: data.settlementDate ? new Date(data.settlementDate).toISOString().split('T')[0] : undefined
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
|
|
@ -186,7 +208,7 @@ const resetForm = () => {
|
||||||
settlementDate: undefined,
|
settlementDate: undefined,
|
||||||
incomeRemark: undefined,
|
incomeRemark: undefined,
|
||||||
expenseRemark: undefined,
|
expenseRemark: undefined,
|
||||||
proofAttachment: undefined,
|
proofAttachment: '',
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
}
|
}
|
||||||
formRef.value?.resetFields()
|
formRef.value?.resetFields()
|
||||||
|
|
@ -203,7 +225,7 @@ watch(
|
||||||
}
|
}
|
||||||
// 解析季度
|
// 解析季度
|
||||||
// 期望格式: "2024-2"
|
// 期望格式: "2024-2"
|
||||||
const [yearStr, quarterStr] = val.split('-')
|
const [yearStr, quarterStr] = val!.split('-')
|
||||||
const year = Number(yearStr)
|
const year = Number(yearStr)
|
||||||
const quarter = Number(quarterStr)
|
const quarter = Number(quarterStr)
|
||||||
let startMonth = 0
|
let startMonth = 0
|
||||||
|
|
|
||||||
|
|
@ -20,33 +20,33 @@
|
||||||
</ProjectSettlementDetailsHeader>
|
</ProjectSettlementDetailsHeader>
|
||||||
|
|
||||||
<div class="settlement-detail-section">
|
<div class="settlement-detail-section">
|
||||||
<h4>一、收入项</h4>
|
<div>一、收入项</div>
|
||||||
<el-table :data="incomeTable" border style="width: 100%; margin-bottom: 16px;">
|
<el-table :data="incomeTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
<el-table-column prop="name" label="科目名称" />
|
<el-table-column prop="name" label="科目名称" />
|
||||||
<el-table-column prop="amount" label="金额/元" />
|
<el-table-column prop="amount" label="金额/元" />
|
||||||
<el-table-column prop="remark" label="说明" />
|
<el-table-column prop="remark" label="说明" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<div v-if="settlement.incomeRemark">备注:{{ settlement.incomeRemark }}</div>
|
<div v-if="settlement.incomeRemark" class="remark-text">备注:{{ settlement.incomeRemark }}</div>
|
||||||
<div style="margin-bottom: 12px;">收入合计:<b>{{ settlement.totalIncome?.toFixed(2) ?? '--' }}</b></div>
|
<div style="margin-bottom: 12px;">收入合计:<b>{{ settlement.totalIncome?.toFixed(2) ?? '--' }}</b></div>
|
||||||
|
|
||||||
<h4 style="margin-top: 32px;">二、支出项</h4>
|
<div style="margin-top: 32px;">二、支出项</div>
|
||||||
<el-table :data="expenseTable" border style="width: 100%; margin-bottom: 16px;">
|
<el-table :data="expenseTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
<el-table-column prop="name" label="科目名称" />
|
<el-table-column prop="name" label="科目名称" />
|
||||||
<el-table-column prop="amount" label="金额/元" />
|
<el-table-column prop="amount" label="金额/元" />
|
||||||
<el-table-column prop="remark" label="说明" />
|
<el-table-column prop="remark" label="说明" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<div v-if="settlement.expenseRemark">备注:{{ settlement.expenseRemark }}</div>
|
<div v-if="settlement.expenseRemark" class="remark-text">备注:{{ settlement.expenseRemark }}</div>
|
||||||
<div style="margin-bottom: 12px;">支出合计:<b>{{ settlement.totalExpenses?.toFixed(2) ?? '--' }}</b></div>
|
<div style="margin-bottom: 12px;">支出合计:<b>{{ settlement.totalExpenses?.toFixed(2) ?? '--' }}</b></div>
|
||||||
|
|
||||||
<h4 style="margin-top: 32px;">三、利润计算</h4>
|
<div style="margin-top: 32px;">三、利润计算</div>
|
||||||
<el-table :data="profitTable" border style="width: 100%; margin-bottom: 16px;">
|
<el-table :data="profitTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
<el-table-column prop="name" label="科目名称" />
|
<el-table-column prop="name" label="科目名称" />
|
||||||
<el-table-column prop="amount" label="金额/元" />
|
<el-table-column prop="amount" label="金额/元" />
|
||||||
<el-table-column prop="remark" label="说明" />
|
<el-table-column prop="remark" label="说明" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<div>备注:当期利润如有亏损则自动结转至下一季度支出项</div>
|
<div class="remark-text">备注:当期利润如有亏损则自动结转至下一季度支出项</div>
|
||||||
|
|
||||||
<h4 style="margin-top: 32px;">四、利润分配</h4>
|
<div style="margin-top: 32px;">四、利润分配</div>
|
||||||
<el-table :data="profitDistributionTable" border style="width: 100%; margin-bottom: 16px;">
|
<el-table :data="profitDistributionTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
<el-table-column prop="name" label="投资人" />
|
<el-table-column prop="name" label="投资人" />
|
||||||
<el-table-column prop="ratio" label="出资比例" />
|
<el-table-column prop="ratio" label="出资比例" />
|
||||||
|
|
@ -56,13 +56,31 @@
|
||||||
</el-table>
|
</el-table>
|
||||||
<div style="margin-bottom: 12px;">合计:100%</div>
|
<div style="margin-bottom: 12px;">合计:100%</div>
|
||||||
|
|
||||||
<h4 style="margin-top: 32px;">五、往来款平账利润分配</h4>
|
<div style="margin-top: 32px;">五、往来款平账利润分配</div>
|
||||||
<el-table :data="clearingDistributionTable" border style="width: 100%; margin-bottom: 16px;">
|
<el-table :data="clearingDistributionTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
<el-table-column prop="name" label="投资人" />
|
<el-table-column prop="name" label="投资人" />
|
||||||
<el-table-column prop="lastUnbalancedAmount" label="上期往来款未平账金额/元" />
|
<el-table-column prop="previousUnbalancedAmount" label="上期往来款未平账金额/元" />
|
||||||
<el-table-column prop="afterSettlementAmount" label="本期结算平账后金额/元" />
|
<el-table-column prop="afterSettlementAmount" label="本期结算平账后金额/元" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<div style="margin-bottom: 12px;">备注:未平账期间,利润分配通过甲方法定代表人个人向乙方支付,平账后按发票结算方式执行。</div>
|
<div style="margin-bottom: 12px;" class="remark-text">备注:未平账期间,利润分配通过甲方法定代表人个人向乙方支付,平账后按发票结算方式执行。</div>
|
||||||
|
|
||||||
|
<div style="margin-top: 32px;">六、其他纪要</div>
|
||||||
|
<div style="margin-bottom: 16px; color: #666;">
|
||||||
|
<p>本利润结算分配表按照双方于{{ investmentAgreementDateText }}签订的《充电站投资合作协议》约定的条款执行。本充电站项目总投资额为 <b>{{ settlement.totalInvestment ? (settlement.totalInvestment ).toFixed(2) : '--' }}</b> 万元,具体如下:</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table :data="investmentTable" border style="width: 100%; margin-bottom: 16px;">
|
||||||
|
<el-table-column prop="investor" label="投资人" />
|
||||||
|
<el-table-column prop="amount" label="出资金额/元" />
|
||||||
|
<el-table-column prop="ratio" label="占比" />
|
||||||
|
<el-table-column prop="method" label="出资日期" />
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<div style="margin-bottom: 16px;">
|
||||||
|
<p class="remark-text">备注:乙方确认,本项目乙方出资款项将专项用于充电站固定资产购置及建设,自实际出资到位之日起即转化为项目固定资产,不设赎回机制。乙方承诺其出资行为具有不可撤销性,且不得单方撤回出资、不得主张分割项目资产、不得要求返还投资本金。乙方按照实缴出资比例共享项目经营收益,承担项目经营亏损的连带责任。乙方已充分知悉新能源基础设施投资周期长、回报率受政策及市场因素影响等风险特征,承诺不因短期未实现盈利要求终止合作或主张权益。</p>
|
||||||
|
<p class="remark-text">不可分割的公摊费包括:公司税费、公司人员工资开支、公司管理费、公司接待及福利开支、安保费、日常设备维保费等不能摊入具体项目的各项开支。</p>
|
||||||
|
<p class="remark-text">所有成本项需提供合法发票或支付凭证,否则不予列支。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -78,11 +96,16 @@ interface Partner {
|
||||||
ratio: number;
|
ratio: number;
|
||||||
shareAmount: number;
|
shareAmount: number;
|
||||||
payableAmount: number;
|
payableAmount: number;
|
||||||
lastUnbalancedAmount: number;
|
previousUnbalancedAmount: number;
|
||||||
afterSettlementAmount: number;
|
afterSettlementAmount: number;
|
||||||
|
investmentDate?: number[] | number | null;
|
||||||
|
actualInvestment?: number | null;
|
||||||
|
investment?: number | null;
|
||||||
}
|
}
|
||||||
interface ProjectSettlementWithPartners extends ProjectSettlementApi.ProjectSettlementVO {
|
interface ProjectSettlementWithPartners extends ProjectSettlementApi.ProjectSettlementVO {
|
||||||
partners?: Partner[];
|
partners?: Partner[];
|
||||||
|
totalInvestment?: number;
|
||||||
|
investmentAgreementDate?: number[];
|
||||||
}
|
}
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
defineOptions({ name: 'CrmProjectSettlementDetail' })
|
defineOptions({ name: 'CrmProjectSettlementDetail' })
|
||||||
|
|
@ -185,7 +208,7 @@ const expenseTable = computed(() => [
|
||||||
|
|
||||||
// 利润表格数据
|
// 利润表格数据
|
||||||
const profitTable = 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' },
|
{ name: '当期可分配利润', amount: settlement.value.shareAmount && settlement.value.shareAmount < 0 ? 0 : (settlement.value.shareAmount ?? 0), remark: '当期利润亏损时填0' },
|
||||||
])
|
])
|
||||||
const profitDistributionTable = computed(() => {
|
const profitDistributionTable = computed(() => {
|
||||||
|
|
@ -213,14 +236,81 @@ const clearingDistributionTable = computed(() => {
|
||||||
const partners = settlement.value.partners || [];
|
const partners = settlement.value.partners || [];
|
||||||
return partners.map((p) => ({
|
return partners.map((p) => ({
|
||||||
name: p.userName ? `${p.userName}` : '',
|
name: p.userName ? `${p.userName}` : '',
|
||||||
lastUnbalancedAmount: p.lastUnbalancedAmount?.toFixed(2) ?? '',
|
previousUnbalancedAmount: p.previousUnbalancedAmount?.toFixed(2) ?? '',
|
||||||
afterSettlementAmount: p.afterSettlementAmount?.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;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.settlement-detail-section {
|
.settlement-detail-section {
|
||||||
margin: 24px 0 0 0;
|
margin: 24px 0 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.remark-text {
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,21 @@
|
||||||
<dict-tag :type="DICT_TYPE.CRM_PROJECT_SETTLEMENT_STATUS" :value="scope.row.settlementStatus" />
|
<dict-tag :type="DICT_TYPE.CRM_PROJECT_SETTLEMENT_STATUS" :value="scope.row.settlementStatus" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column label="对账回执" align="center" prop="proofAttachment" width="200px">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="scope.row.proofAttachment"
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openFile(scope.row.proofAttachment)"
|
||||||
|
class="text-blue-500 hover:text-blue-700"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:document" class="mr-1" />
|
||||||
|
下载回执
|
||||||
|
</el-button>
|
||||||
|
<span v-else class="text-gray-400">暂无回执</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" width="180px" fixed="right">
|
<el-table-column label="操作" align="center" width="180px" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
|
|
@ -167,7 +182,8 @@ import * as ProjectSettlementApi from '@/api/crm/project/settlement'
|
||||||
import * as ProjectApi from '@/api/crm/project'
|
import * as ProjectApi from '@/api/crm/project'
|
||||||
import ProjectSettlementForm from './ProjectSettlementForm.vue'
|
import ProjectSettlementForm from './ProjectSettlementForm.vue'
|
||||||
import ElQuarterPicker from '@/components/ElQuarterPicker/index.vue'
|
import ElQuarterPicker from '@/components/ElQuarterPicker/index.vue'
|
||||||
import { DICT_TYPE,getIntDictOptions } from '@/utils/dict'
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
|
||||||
// 结算周期格式化:'2024-1' => '2024年第一季度'
|
// 结算周期格式化:'2024-1' => '2024年第一季度'
|
||||||
function formatQuarterPeriod(val?: string) {
|
function formatQuarterPeriod(val?: string) {
|
||||||
|
|
@ -283,6 +299,54 @@ function goDetail(row: ProjectSettlementApi.ProjectSettlementVO) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 打开文件 */
|
||||||
|
const openFile = (fileUrl: string) => {
|
||||||
|
if (!fileUrl) {
|
||||||
|
message.warning('文件链接不存在')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件名
|
||||||
|
const fileName = fileUrl.split('/').pop() || '未知文件'
|
||||||
|
|
||||||
|
// 获取文件扩展名
|
||||||
|
const fileExtension = fileName.split('.').pop()?.toLowerCase()
|
||||||
|
|
||||||
|
// 根据文件类型处理
|
||||||
|
if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExtension || '')) {
|
||||||
|
// 图片文件:在新窗口中打开
|
||||||
|
window.open(fileUrl, '_blank')
|
||||||
|
} else if (['pdf'].includes(fileExtension || '')) {
|
||||||
|
// PDF文件:在新窗口中打开
|
||||||
|
window.open(fileUrl, '_blank')
|
||||||
|
} else if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'].includes(fileExtension || '')) {
|
||||||
|
// Office文件:直接下载
|
||||||
|
downloadFile(fileUrl, fileName)
|
||||||
|
} else {
|
||||||
|
// 其他文件:提示用户选择操作
|
||||||
|
ElMessageBox.confirm('是否下载该文件?', '文件操作', {
|
||||||
|
confirmButtonText: '下载',
|
||||||
|
cancelButtonText: '在线查看',
|
||||||
|
type: 'info'
|
||||||
|
}).then(() => {
|
||||||
|
downloadFile(fileUrl, fileName)
|
||||||
|
}).catch(() => {
|
||||||
|
window.open(fileUrl, '_blank')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 下载文件 */
|
||||||
|
const downloadFile = (url: string, fileName: string) => {
|
||||||
|
const link = document.createElement('a')
|
||||||
|
link.href = url
|
||||||
|
link.download = fileName
|
||||||
|
link.target = '_blank'
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click()
|
||||||
|
document.body.removeChild(link)
|
||||||
|
}
|
||||||
|
|
||||||
/** 初始化 **/
|
/** 初始化 **/
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await getList()
|
await getList()
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,12 @@ const open = async (type: string, id?: number) => {
|
||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
formData.value = await ProjectTransactionDetailApi.getProjectTransactionDetail(id)
|
const data = await ProjectTransactionDetailApi.getProjectTransactionDetail(id)
|
||||||
|
formData.value = {
|
||||||
|
...data,
|
||||||
|
// 将Date对象转换为YYYY-MM-DD格式的字符串
|
||||||
|
date: data.date ? new Date(data.date).toISOString().split('T')[0] : undefined
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -206,7 +206,7 @@ const getTotal = async () => {
|
||||||
const data = await ProjectTransactionDetailApi.getProjectTransactionDetailTotal(queryParams)
|
const data = await ProjectTransactionDetailApi.getProjectTransactionDetailTotal(queryParams)
|
||||||
totalInvestmentAmount.value = data.totalInvestmentAmount || 0
|
totalInvestmentAmount.value = data.totalInvestmentAmount || 0
|
||||||
totalSaveAmount.value = data.totalSaveAmount || 0
|
totalSaveAmount.value = data.totalSaveAmount || 0
|
||||||
totalDiff.value = (data.totalSaveAmount || 0) - (data.totalInvestmentAmount || 0)
|
totalDiff.value = data.totalDiff || 0
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue