mod 项目利润结算文档优化
parent
563db197b3
commit
7e83fc530c
|
|
@ -21,6 +21,7 @@ export interface ProjectVO {
|
|||
projectRecord: string // 项目备案
|
||||
powerSupplyReply: string // 供电答复单
|
||||
investmentAgreement: string // 合作投资协议
|
||||
investmentAgreementDate?: Date | number[] // 合作投资协议日期
|
||||
investmentShareAgreement: string // 合作投资分成协议
|
||||
supplementaryMaterials: string // 其他补充材料文件路径
|
||||
cooperationAgreementConfig?: number // 场地租赁合同配置
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@
|
|||
type="date"
|
||||
placeholder="选择合作投资协议日期"
|
||||
style="width: 100%"
|
||||
format="YYYY-MM-DD"
|
||||
popper-class="full-width-datepicker"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
|
@ -179,6 +180,7 @@
|
|||
v-model:partners="formData.partners"
|
||||
:disabled="formLoading"
|
||||
:price="formData.totalInvestment"
|
||||
:id="formData.id"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
|
@ -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:[],
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
<el-date-picker
|
||||
v-model="formData.settlementDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择结算日期"
|
||||
style="width: 100%"
|
||||
popper-class="full-width-datepicker"
|
||||
|
|
@ -55,6 +56,7 @@
|
|||
<el-date-picker
|
||||
v-model="formData.startDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择结算开始时间"
|
||||
style="width: 100%"
|
||||
popper-class="full-width-datepicker"
|
||||
|
|
@ -66,6 +68,7 @@
|
|||
<el-date-picker
|
||||
v-model="formData.endDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择结算结束时间"
|
||||
style="width: 100%"
|
||||
popper-class="full-width-datepicker"
|
||||
|
|
@ -86,6 +89,19 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
</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>
|
||||
<template #footer>
|
||||
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||
|
|
@ -97,6 +113,7 @@
|
|||
import * as ProjectSettlementApi from '@/api/crm/project/settlement'
|
||||
import * as ProjectApi from '@/api/crm/project'
|
||||
import ElQuarterPicker from '@/components/ElQuarterPicker/index.vue'
|
||||
import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
|
||||
import dayjs from 'dayjs'
|
||||
|
||||
/** 项目利润结算 表单 */
|
||||
|
|
@ -112,14 +129,14 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|||
const formData = ref({
|
||||
id: undefined,
|
||||
projectId: undefined,
|
||||
settlementPeriod: undefined,
|
||||
settlementPeriod: undefined as string | undefined,
|
||||
period: undefined,
|
||||
startDate: undefined,
|
||||
endDate: undefined,
|
||||
startDate: undefined as string | undefined,
|
||||
endDate: undefined as string | undefined,
|
||||
settlementDate: undefined,
|
||||
incomeRemark: undefined,
|
||||
expenseRemark: undefined,
|
||||
proofAttachment: undefined,
|
||||
proofAttachment: '',
|
||||
remark: undefined,
|
||||
})
|
||||
const formRules = reactive({
|
||||
|
|
@ -140,7 +157,12 @@ const open = async (type: string, id?: number) => {
|
|||
if (id) {
|
||||
formLoading.value = true
|
||||
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 {
|
||||
formLoading.value = false
|
||||
}
|
||||
|
|
@ -186,7 +208,7 @@ const resetForm = () => {
|
|||
settlementDate: undefined,
|
||||
incomeRemark: undefined,
|
||||
expenseRemark: undefined,
|
||||
proofAttachment: undefined,
|
||||
proofAttachment: '',
|
||||
remark: undefined,
|
||||
}
|
||||
formRef.value?.resetFields()
|
||||
|
|
@ -203,7 +225,7 @@ watch(
|
|||
}
|
||||
// 解析季度
|
||||
// 期望格式: "2024-2"
|
||||
const [yearStr, quarterStr] = val.split('-')
|
||||
const [yearStr, quarterStr] = val!.split('-')
|
||||
const year = Number(yearStr)
|
||||
const quarter = Number(quarterStr)
|
||||
let startMonth = 0
|
||||
|
|
|
|||
|
|
@ -20,33 +20,33 @@
|
|||
</ProjectSettlementDetailsHeader>
|
||||
|
||||
<div class="settlement-detail-section">
|
||||
<h4>一、收入项</h4>
|
||||
<div>一、收入项</div>
|
||||
<el-table :data="incomeTable" border style="width: 100%; margin-bottom: 16px;">
|
||||
<el-table-column prop="name" label="科目名称" />
|
||||
<el-table-column prop="amount" label="金额/元" />
|
||||
<el-table-column prop="remark" label="说明" />
|
||||
</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>
|
||||
|
||||
<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-column prop="name" label="科目名称" />
|
||||
<el-table-column prop="amount" label="金额/元" />
|
||||
<el-table-column prop="remark" label="说明" />
|
||||
</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>
|
||||
|
||||
<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-column prop="name" label="科目名称" />
|
||||
<el-table-column prop="amount" label="金额/元" />
|
||||
<el-table-column prop="remark" label="说明" />
|
||||
</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-column prop="name" label="投资人" />
|
||||
<el-table-column prop="ratio" label="出资比例" />
|
||||
|
|
@ -56,13 +56,31 @@
|
|||
</el-table>
|
||||
<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-column prop="name" label="投资人" />
|
||||
<el-table-column prop="lastUnbalancedAmount" label="上期往来款未平账金额/元" />
|
||||
<el-table-column prop="previousUnbalancedAmount" label="上期往来款未平账金额/元" />
|
||||
<el-table-column prop="afterSettlementAmount" label="本期结算平账后金额/元" />
|
||||
</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>
|
||||
</template>
|
||||
|
|
@ -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;
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.settlement-detail-section {
|
||||
margin: 24px 0 0 0;
|
||||
}
|
||||
|
||||
.remark-text {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -117,6 +117,21 @@
|
|||
<dict-tag :type="DICT_TYPE.CRM_PROJECT_SETTLEMENT_STATUS" :value="scope.row.settlementStatus" />
|
||||
</template>
|
||||
</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">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
|
|
@ -167,7 +182,8 @@ import * as ProjectSettlementApi from '@/api/crm/project/settlement'
|
|||
import * as ProjectApi from '@/api/crm/project'
|
||||
import ProjectSettlementForm from './ProjectSettlementForm.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年第一季度'
|
||||
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 () => {
|
||||
await getList()
|
||||
|
|
|
|||
|
|
@ -114,7 +114,12 @@ const open = async (type: string, id?: number) => {
|
|||
if (id) {
|
||||
formLoading.value = true
|
||||
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 {
|
||||
formLoading.value = false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ const getTotal = async () => {
|
|||
const data = await ProjectTransactionDetailApi.getProjectTransactionDetailTotal(queryParams)
|
||||
totalInvestmentAmount.value = data.totalInvestmentAmount || 0
|
||||
totalSaveAmount.value = data.totalSaveAmount || 0
|
||||
totalDiff.value = (data.totalSaveAmount || 0) - (data.totalInvestmentAmount || 0)
|
||||
totalDiff.value = data.totalDiff || 0
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue