统计更新

This commit is contained in:
磷叶 2025-05-22 13:39:44 +08:00
parent af44a7aa49
commit f433f5f423
7 changed files with 60 additions and 128 deletions

View File

@ -81,7 +81,7 @@
<script>
import { listSuit, listSuitByIds } from "@/api/bst/suit";
import CheckDialog from "@/components/CheckDialog/index.vue";
import { isEmpty } from '@/utils/index'
import { isEmpty } from '@/utils/index';
export default {
name: "SuitDialog",
@ -142,7 +142,7 @@ export default {
{key: 'id', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'name', visible: true, label: '名称', minWidth: "200", sortable: true, overflow: false, align: 'left', width: null},
{key: 'userName', visible: true, label: '运营商', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'depositAmount', visible: true, label: '预存', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'depositAmount', visible: true, label: '押金', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'rentalUnit', visible: true, label: '租赁单位', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'freeRideTime', visible: true, label: '免费时长', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},

View File

@ -75,7 +75,7 @@
<template #append></template>
</el-input>
</form-col>
<!-- <form-col :span="span * 2" label="超时断电" prop="timeoutLock" tip="风险操作!!!开启后,当订单的预存不足时,将会对车辆进行断电">
<!-- <form-col :span="span * 2" label="超时断电" prop="timeoutLock" tip="风险操作!!!开启后,当订单的押金不足时,将会对车辆进行断电">
<el-switch v-model="form.timeoutLock" active-text="开启" inactive-text="关闭" @change="onChangeTimeoutLock"/>
</form-col> -->
</el-row>
@ -87,17 +87,17 @@
<template #append></template>
</el-input>
</form-col>
<form-col :span="span * 2" label="停车点外调度费" prop="dispatchFee" label-width="9em" tip="用户在停车点外还车时,从预存中扣取的调度费。若预存不足,则取最大可扣除的金额。">
<form-col :span="span * 2" label="停车点外调度费" prop="dispatchFee" label-width="9em" tip="用户在停车点外还车时收取的调度费。">
<el-input v-model="form.dispatchFee" placeholder="请输入停车点外调度费" type="number">
<template #append></template>
</el-input>
</form-col>
<form-col :span="span * 2" label="运营区外调度费" prop="vehicleManagementFee" label-width="9em" tip="用户在运营区外还车时,从预存中扣取的调度费。若预存不足,则取最大可扣除的金额。">
<el-input v-model="form.vehicleManagementFee" placeholder="请输入运营区外调度费" type="number">
<form-col :span="span * 2" label="运营区外管理费" prop="vehicleManagementFee" label-width="9em" tip="用户在运营区外还车时收取的管理费。">
<el-input v-model="form.vehicleManagementFee" placeholder="请输入运营区外管理费" type="number">
<template #append></template>
</el-input>
</form-col>
<form-col :span="span * 2" label="还车审核" prop="returnVerify" tip="开启后,用户还车时需要审核后才能退还剩余的预存款">
<form-col :span="span * 2" label="还车审核" prop="returnVerify" tip="开启后,用户还车时需要审核后才能退还剩余的押金">
<el-switch v-model="form.returnVerify" active-text="需要审核" inactive-text="无需审核"/>
</form-col>
<form-col :span="span * 2" label="强制停车点还车" prop="parkingReturn" label-width="9em" tip="开启后,用户必须在停车点才允许还车">
@ -117,12 +117,12 @@
</template>
<script>
import { getArea, addArea, updateArea } from "@/api/bst/area";
import FormCol from "@/components/FormCol/index.vue";
import EditHeader from "@/components/EditHeader/index.vue";
import { addArea, getArea, updateArea } from "@/api/bst/area";
import UserInput from '@/components/Business/User/UserInput.vue';
import CollapsePanel from '@/components/CollapsePanel/index.vue';
import {UserType, AreaStatus, RoleKeys} from '@/utils/enums';
import EditHeader from "@/components/EditHeader/index.vue";
import FormCol from "@/components/FormCol/index.vue";
import { AreaStatus, RoleKeys, UserType } from '@/utils/enums';
import { mapGetters } from 'vuex';
export default {

View File

@ -2,13 +2,13 @@
<div class="stat-container">
<statistics-card
class="stat-card"
:value="todayStat.orderActualAmount"
:value="todayStat.orderActualReceivedAmount"
label="今日订单实收"
icon="el-icon-s-finance"
start-color="#61DDAA"
end-color="#4CAF50"
sub-label="累计实收"
:sub-value="stat.orderActualAmount"
:sub-value="stat.orderActualReceivedAmount"
:precision="2"
:show-value-change="false"
/>

View File

@ -28,14 +28,14 @@
trigger="hover"
>
<div>
<div>订单实收 = 结算支付金额结算时间 - 支付退款金额退款时间</div>
<div>结算支付金额{{ stat.orderFinishedPayAmount | fix2 | dv }} </div>
<div>支付退款金额{{ stat.orderRefundAmount | fix2 | dv }} </div>
<div>订单实收 = 结算金额支付时间 - 人工退款金额退款时间</div>
<div>结算金额{{ stat.orderActualAmount | fix2 | dv }} </div>
<div>人工退款金额{{ stat.orderAdminRefundAmount | fix2 | dv }} </div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="stat-value">{{ stat.orderActualAmount | fix2 | dv }}</div>
<div class="stat-value">{{ stat.orderActualReceivedAmount | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="12" class="stat-card income-card">
@ -86,90 +86,43 @@
<el-col :sm="24" :md="13" class="detail-stat-row">
<el-row>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg blue"><i class="el-icon-bicycle"></i></div>
<div class="stat-info">
<div class="mini-label">
骑行费
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>用户结束订单后实际收取到的骑行费</div>
<div>骑行费不会超过预存款</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderRiddingFee | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg green"><i class="el-icon-truck"></i></div>
<div class="stat-info">
<div class="mini-label">
调度费
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>用户结束订单后实际收取到的调度费</div>
<div>预存款 - 骑行费不足以支付调度费时</div>
<div>将剩余金额全部收取为调度费</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderDispatchFee | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg orange"><i class="el-icon-setting"></i></div>
<div class="stat-info">
<div class="mini-label">
管理费
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>用户结束订单后实际收取到的管理费</div>
<div>预存款 - 骑行费不足以支付管理费时</div>
<div>将剩余金额全部收取为管理费</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderManageFee | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg purple"><i class="el-icon-warning"></i></div>
<div class="stat-info">
<div class="mini-label">
车损费
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>当商户进行还车审核时填写的车损费</div>
<div>预存款 - 骑行费不足以支付车损费时</div>
<div>将剩余金额全部收取为车损费</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderDeductionFee | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg blue"><i class="el-icon-bank-card"></i></div>
<div class="stat-info">
<div class="mini-label">
@ -182,52 +135,14 @@
<div>
<div>结算金额 = 骑行费 + 调度费 + 管理费 + 车损费</div>
<div>仅当订单结束后结算金额才会更新</div>
<div>结算金额不会超过预存款支付金额</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderActualTotalAmount | fix2 | dv }}</div>
<div class="mini-value">{{ stat.orderActualAmount | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<div class="icon-bg blue"><i class="el-icon-s-finance"></i></div>
<div class="stat-info">
<div class="mini-label">
支付金额
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>支付金额包含预存款是当天支付的金额而非结算金额</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderPayAmount | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<div class="icon-bg cyan"><i class="el-icon-refresh"></i></div>
<div class="stat-info">
<div class="mini-label">自动退款
<el-popover
placement="right"
width="fit-content"
trigger="hover"
>
<div>
<div>订单结束后将自动退款若退款失败则需要人工退款</div>
</div>
<i slot="reference" class="el-icon-question" />
</el-popover>
</div>
<div class="mini-value">{{ stat.orderAutoRefundAmount | fix2 | dv }}</div>
</div>
</el-col>
<el-col :span="6" class="mini-stat-card">
<el-col :span="miniSpan" class="mini-stat-card">
<div class="icon-bg red"><i class="el-icon-user"></i></div>
<div class="stat-info">
<div class="mini-label">人工退款
@ -274,6 +189,7 @@ export default {
return {
loading: false,
span: 4,
miniSpan: 8,
DatePickerOptions,
OrderStatus,
queryParams: {

View File

@ -192,9 +192,11 @@
<div>调度费{{d.row.actualDispatchFee | fix2 | dv}} </div>
<div>管理费{{d.row.actualManageFee | fix2 | dv}} </div>
<div>车损费{{d.row.actualDeductionFee | fix2 | dv}} </div>
<div v-if="d.row.depositDeductionAmount"><br/>押金抵扣{{d.row.depositDeductionAmount | fix2 | dv}} </div>
<br/>
<div>合计{{d.row.actualAmount | fix2 | dv}} </div>
<div v-if="d.row.depositDeductionAmount">押金抵扣{{d.row.depositDeductionAmount | fix2 | dv}} </div>
</div>
<div slot="reference">实收{{d.row.actualAmount | fix2 | dv}} <i class="el-icon-info" /></div>
<div slot="reference">实收{{d.row.actualReceivedAmount | fix2 | dv}} <i class="el-icon-info" /></div>
</el-popover>
</el-col>
<el-col :span="24" v-if="d.row.adminRefundAmount" style="color: red;">

View File

@ -12,7 +12,7 @@
</el-statistic>
</el-col>
<el-col>
<el-statistic title="预存" :value="detail.depositFee" :precision="2" suffix="元">
<el-statistic title="押金" :value="detail.depositFee" :precision="2" suffix="元">
<template slot="prefix">
<i class="el-icon-money" style="color: #67C23A"></i>
</template>
@ -38,16 +38,30 @@
</el-popover>
</el-col>
<el-col v-if="OrderStatus.finishedList().includes(detail.status)">
<el-statistic
<el-popover placement="bottom" width="200" trigger="hover">
<div>
<div>骑行费{{detail.actualRidingFee | fix2 | dv}} </div>
<div>调度费{{detail.actualDispatchFee | fix2 | dv}} </div>
<div>管理费{{detail.actualManageFee | fix2 | dv}} </div>
<div>车损费{{detail.actualDeductionFee | fix2 | dv}} </div>
<br/>
<div>合计{{detail.actualAmount | fix2 | dv}} </div>
<div v-if="detail.depositDeductionAmount">押金抵扣{{detail.depositDeductionAmount | fix2 | dv}} </div>
</div>
<el-statistic slot="reference"
title="实收"
:value="detail.actualAmount"
:value="detail.actualReceivedAmount"
:precision="2"
suffix="元"
value-style="color: #67C23A">
<template slot="prefix">
<i class="el-icon-success" style="color: #67C23A"></i>
</template>
<template slot="title">
实收 <i class="el-icon-info" style="color: #909399; margin-left: 4px; cursor: pointer"></i>
</template>
</el-statistic>
</el-popover>
</el-col>
<el-col>
<el-statistic
@ -234,7 +248,7 @@
<pay :query="{bstId: detail.id, bstTypes: [PayBstType.ORDER, PayBstType.ORDER_RIDE]}"/>
</el-tab-pane>
<el-tab-pane label="退款信息" v-if="checkPermi(['bst:refund:list'])">
<refund :query="{payBstId: detail.id, payBstType: PayBstType.ORDER}"/>
<refund :query="{payBstId: detail.id, payBstTypes: [PayBstType.ORDER, PayBstType.ORDER_RIDE]}"/>
</el-tab-pane>
<el-tab-pane label="命令日志" v-if="checkPermi(['bst:commandLog:list'])">
<command-log :query="{orderId: detail.id}"/>

View File

@ -72,7 +72,7 @@
{{d.row[column.key]}}
</template>
<template v-else-if="column.key === 'reason'">
<order-link v-if="PayBstType.ORDER === d.row.payBstType" :id="d.row.payBstId" :text="d.row.reason" />
<order-link v-if="[PayBstType.ORDER, PayBstType.ORDER_RIDE].includes(d.row.payBstType)" :id="d.row.payBstId" :text="d.row.reason" />
<span v-else>{{d.row.reason | dv}}</span>
<dict-tag :options="dict.type.refund_type" :value="d.row.type" size="mini" style="margin-left: 4px;"/>
<dict-tag :options="dict.type.refund_status" :value="d.row.status" size="mini" style="margin-left: 4px;"/>
@ -104,12 +104,12 @@
</template>
<script>
import { listRefund, getRefund, delRefund, addRefund, updateRefund } from "@/api/bst/refund";
import { $showColumns } from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import UserLink from '@/components/Business/User/UserLink.vue'
import { addRefund, delRefund, getRefund, listRefund, updateRefund } from "@/api/bst/refund";
import OrderLink from '@/components/Business/Order/OrderLink.vue';
import UserLink from '@/components/Business/User/UserLink.vue';
import FormCol from "@/components/FormCol/index.vue";
import { PayBstType } from '@/utils/enums';
import { $showColumns } from '@/utils/mixins';
//
const defaultSort = {