mod 项目利润结算文档优化

pull/853/head
wersd 2025-10-04 11:00:24 +08:00
parent 563db197b3
commit 7e83fc530c
9 changed files with 241 additions and 38 deletions

View File

@ -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 // 场地租赁合同配置

View File

@ -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) // month1Date0
}
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, // month1Date0
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:[],

View File

@ -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

View File

@ -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

View File

@ -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,
// DateYYYY-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

View File

@ -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>

View File

@ -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()

View File

@ -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,
// DateYYYY-MM-DD
date: data.date ? new Date(data.date).toISOString().split('T')[0] : undefined
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }

View File

@ -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
} }