add 项目利润结算

pull/853/head
wersd 2025-08-28 22:06:38 +08:00
parent b90b6a1cb8
commit e43b61da12
4 changed files with 77 additions and 40 deletions

View File

@ -127,18 +127,18 @@
@sort-change="handleSortChange" @sort-change="handleSortChange"
> >
<el-table-column label="项目名称" align="center" prop="projectName" min-width="150px"/> <el-table-column label="项目名称" align="center" prop="projectName" fixed="left" min-width="200px"/>
<el-table-column label="枪数" align="center" prop="estimatedPiles" width="100px"/> <el-table-column label="枪数" align="center" prop="estimatedPiles" width="100px"/>
<el-table-column label="统计月份" align="center" prop="statMonth" sortable="custom" /> <el-table-column label="统计月份" align="center" prop="statMonth" sortable="custom" width="160px"/>
<el-table-column label="总充电量(度)" align="center" prop="chargingQuantity" sortable="custom"/> <el-table-column label="总充电量(度)" align="center" prop="chargingQuantity" sortable="custom" width="160px"/>
<el-table-column label="总营收(元)" align="center" prop="totalIncome" sortable="custom"/> <el-table-column label="总营收(元)" align="center" prop="totalIncome" sortable="custom" width="160px"/>
<el-table-column label="总电费(元)" align="center" prop="totalElectricityCost" sortable="custom"/> <el-table-column label="总电费(元)" align="center" prop="totalElectricityCost" sortable="custom" width="160px"/>
<el-table-column label="总服务费(元)" align="center" prop="grossProfit" sortable="custom"/> <el-table-column label="总服务费(元)" align="center" prop="grossProfit" sortable="custom" width="160px"/>
<el-table-column label="毛利率(%)" align="center" prop="grossProfitRate" sortable="custom"/> <el-table-column label="毛利率(%)" align="center" prop="grossProfitRate" sortable="custom" width="160px"/>
<el-table-column label="单枪充电量(度)" align="center" prop="perGunCharging" sortable="custom"/> <el-table-column label="单枪充电量(度)" align="center" prop="perGunCharging" sortable="custom" width="160px"/>
<el-table-column label="单枪服务费(元)" align="center" prop="perGunProfit" sortable="custom"/> <el-table-column label="单枪服务费(元)" align="center" prop="perGunProfit" sortable="custom" width="160px"/>
<el-table-column label="度电服务费(元)" align="center" prop="electricityServiceFee" sortable="custom"/> <el-table-column label="度电服务费(元)" align="center" prop="electricityServiceFee" sortable="custom" width="160px"/>
<el-table-column label="操作" align="center" min-width="120px"> <el-table-column label="操作" align="center" fixed="right" min-width="120px">
<template #default="scope"> <template #default="scope">
<!-- {{ scope.row }} --> <!-- {{ scope.row }} -->
<el-button <el-button

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="40%"> <Dialog :title="dialogTitle" v-model="dialogVisible" width="60%">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
@ -9,7 +9,7 @@
> >
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目" prop="projectId"> <el-form-item label="项目" prop="projectId" min-width="260px">
<el-select <el-select
v-model="formData.projectId" v-model="formData.projectId"
filterable filterable
@ -26,15 +26,6 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="结算周期" prop="settlementPeriod">
<el-quarter-picker v-model="formData.settlementPeriod" placeholder="选择季度" value-format="yyyy-q" clearable style="width: 100%"
popper-class="full-width-datepicker" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="结算日期" prop="settlementDate"> <el-form-item label="结算日期" prop="settlementDate">
<el-date-picker <el-date-picker
v-model="formData.settlementDate" v-model="formData.settlementDate"
@ -45,6 +36,20 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="结算周期" prop="settlementPeriod">
<el-quarter-picker
v-model="formData.settlementPeriod"
placeholder="选择季度"
value-format="yyyy-q"
clearable
style="width: 100%"
popper-class="full-width-datepicker"
/>
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="结算开始时间" prop="startDate"> <el-form-item label="结算开始时间" prop="startDate">
<el-date-picker <el-date-picker
@ -64,6 +69,7 @@
placeholder="选择结算结束时间" placeholder="选择结算结束时间"
style="width: 100%" style="width: 100%"
popper-class="full-width-datepicker" popper-class="full-width-datepicker"
:disabled="true"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -91,6 +97,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 dayjs from 'dayjs'
/** 项目利润结算 表单 */ /** 项目利润结算 表单 */
defineOptions({ name: 'ProjectSettlementForm' }) defineOptions({ name: 'ProjectSettlementForm' })
@ -184,4 +191,33 @@ const resetForm = () => {
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
//
watch(
() => formData.value.settlementPeriod,
(val) => {
if (!val) {
formData.value.startDate = undefined
formData.value.endDate = undefined
return
}
//
// : "2024-2"
const [yearStr, quarterStr] = val.split('-')
const year = Number(yearStr)
const quarter = Number(quarterStr)
let startMonth = 0
switch (quarter) {
case 1: startMonth = 0; break // 1
case 2: startMonth = 3; break // 4
case 3: startMonth = 6; break // 7
case 4: startMonth = 9; break // 10
default: startMonth = 0
}
const startDate = dayjs(new Date(year, startMonth, 1))
const endDate = startDate.add(2, 'month').endOf('month')
formData.value.startDate = startDate.format('YYYY-MM-DD')
formData.value.endDate = endDate.format('YYYY-MM-DD')
}
)
</script> </script>

View File

@ -12,7 +12,7 @@
</ProjectSettlementDetailsHeader> </ProjectSettlementDetailsHeader>
<div class="settlement-detail-section"> <div class="settlement-detail-section">
<h2>收入项</h2> <h4>收入项</h4>
<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="金额/元" />
@ -21,7 +21,7 @@
<div v-if="settlement.incomeRemark">{{ settlement.incomeRemark }}</div> <div v-if="settlement.incomeRemark">{{ 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>
<h2 style="margin-top: 32px;">支出项</h2> <h4 style="margin-top: 32px;">支出项</h4>
<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="金额/元" />
@ -30,7 +30,7 @@
<div v-if="settlement.expenseRemark">{{ settlement.expenseRemark }}</div> <div v-if="settlement.expenseRemark">{{ 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>
<h2 style="margin-top: 32px;">利润计算</h2> <h4 style="margin-top: 32px;">利润计算</h4>
<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="金额/元" />
@ -120,8 +120,8 @@ const incomeRemarkTable = computed(() => [
// //
const expenseTable = computed(() => [ const expenseTable = computed(() => [
{ name: '电费成本', amount: settlement.value.electricityCost, remark: '以电力公司账单为准' }, { name: '电费成本', amount: settlement.value.electricityCost, remark: '以电力公司账单为准' },
{ name: '场地租金', amount: settlement.value.venueRent, remark: '按《场地租赁协议》约定' }, { name: '场地租金', amount: settlement.value.venueRent, remark: '按《场地租赁协议》约定 (退回为负值)' },
{ name: '场地押金', amount: settlement.value.venueDeposit, remark: '按《场地租赁协议》约定' }, { name: '场地押金', amount: settlement.value.venueDeposit, remark: '按《场地租赁协议》约定 (退回为负值)' },
{ name: '项目推介费', amount: settlement.value.projectPromotion, remark: '付给项目推荐人' }, { name: '项目推介费', amount: settlement.value.projectPromotion, remark: '付给项目推荐人' },
{ name: '设备更新购置费', amount: settlement.value.equipmentUpgrade, remark: '同一场站设备更新' }, { name: '设备更新购置费', amount: settlement.value.equipmentUpgrade, remark: '同一场站设备更新' },
{ name: '管理费用', amount: settlement.value.managementCost, remark: '按120元/抢/月计算(用于不可分割的公摊费用)' }, { name: '管理费用', amount: settlement.value.managementCost, remark: '按120元/抢/月计算(用于不可分割的公摊费用)' },

View File

@ -8,10 +8,11 @@
:inline="true" :inline="true"
label-width="68px" label-width="68px"
> >
<el-form-item labssel="项目" prop="projectId"> <el-form-item label="项目" prop="projectId">
<el-select <el-select
v-model="queryParams.projectId" v-model="queryParams.projectId"
clearable clearable
filterable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
> >
@ -80,38 +81,38 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="项目名称" align="center" prop="projectName"> <el-table-column label="项目名称" align="center" prop="projectName" fixed="left" min-width="200px">
<template #default="scope"> <template #default="scope">
<el-link type="primary" @click="goDetail(scope.row)">{{ scope.row.projectName }}</el-link> <el-link type="primary" @click="goDetail(scope.row)">{{ scope.row.projectName }}</el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="枪数" align="center" prop="piles" /> <el-table-column label="枪数" align="center" prop="piles" width="200px"/>
<el-table-column label="结算周期" align="center" prop="settlementPeriod" > <el-table-column label="结算周期" align="center" prop="settlementPeriod" width="200px">
<template #default="scope"> <template #default="scope">
{{ formatQuarterPeriod(scope.row.settlementPeriod) }} {{ formatQuarterPeriod(scope.row.settlementPeriod) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="结算开始时间" align="center" prop="startDate"> <el-table-column label="总期数" align="center" prop="period" width="200px"/>
<el-table-column label="结算开始时间" align="center" prop="startDate" width="200px">
<template #default="scope"> <template #default="scope">
{{ scope.row.startDate ? formatDate(scope.row.startDate, 'YYYY-MM-DD') : '' }} {{ scope.row.startDate ? formatDate(scope.row.startDate, 'YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="结算结束时间" align="center" prop="endDate"> <el-table-column label="结算结束时间" align="center" prop="endDate" width="200px">
<template #default="scope"> <template #default="scope">
{{ scope.row.endDate ? formatDate(scope.row.endDate, 'YYYY-MM-DD') : '' }} {{ scope.row.endDate ? formatDate(scope.row.endDate, 'YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="结算日期" align="center" prop="settlementDate"> <el-table-column label="毛利润" align="center" prop="grossProfit" width="200px"/>
<el-table-column label="上期亏损转结" align="center" prop="previousLossCarryover" width="200px" />
<el-table-column label="净利润" align="center" prop="netProfit" width="200px"/>
<!-- <el-table-column label="结算状态" align="center" prop="settlementStatus" /> -->
<el-table-column label="结算日期" align="center" prop="settlementDate" width="200px">
<template #default="scope"> <template #default="scope">
{{ scope.row.settlementDate ? formatDate(scope.row.settlementDate, 'YYYY-MM-DD') : '' }} {{ scope.row.settlementDate ? formatDate(scope.row.settlementDate, 'YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="总期数" align="center" prop="period" /> <el-table-column label="操作" align="center" width="180px" fixed="right">
<el-table-column label="毛利润" align="center" prop="grossProfit" />
<el-table-column label="上期亏损转结" align="center" prop="previousLossCarryover" />
<el-table-column label="净利润" align="center" prop="netProfit" />
<el-table-column label="结算状态" align="center" prop="settlementStatus" />
<el-table-column label="操作" align="center" min-width="180px" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link