This commit is contained in:
18631081161 2026-03-04 01:23:15 +08:00
parent 962920b2b0
commit b22af4f96d
3 changed files with 81 additions and 9 deletions

View File

@ -57,6 +57,14 @@
<span class="statistics-label">比索成本</span>
<span class="statistics-value cost">{{ statistics.totalCostPeso }}</span>
</div>
<div class="statistics-item">
<span class="statistics-label">人民币佣金</span>
<span class="statistics-value commission">¥{{ statistics.totalCommissionRmb }}</span>
</div>
<div class="statistics-item">
<span class="statistics-label">比索佣金</span>
<span class="statistics-value commission">{{ statistics.totalCommissionPeso }}</span>
</div>
<div class="statistics-item">
<span class="statistics-label">人民币营利</span>
<span class="statistics-value profit">¥{{ statistics.profitRmb }}</span>
@ -106,9 +114,9 @@
<el-table-column label="营利金额" width="140">
<template #default="{ row }">
<div class="amount-info">
<span v-if="row.amountPeso" class="amount profit">{{ (parseFloat(row.amountPeso || 0) - parseFloat(row.costPeso || 0)).toFixed(2) }}</span>
<span v-if="row.amountRmb" class="amount profit">¥{{ (parseFloat(row.amountRmb || 0) - parseFloat(row.costRmb || 0)).toFixed(2) }}</span>
<span v-if="!row.amountPeso && !row.amountRmb && row.amount" class="amount profit">¥{{ (parseFloat(row.amount || 0)).toFixed(2) }}</span>
<span v-if="row.amountPeso" class="amount profit">{{ calcProfit(row, 'peso') }}</span>
<span v-if="row.amountRmb" class="amount profit">¥{{ calcProfit(row, 'rmb') }}</span>
<span v-if="!row.amountPeso && !row.amountRmb && row.amount" class="amount profit">¥{{ calcProfit(row, 'legacy') }}</span>
</div>
</template>
</el-table-column>
@ -346,6 +354,8 @@ const statistics = reactive({
totalPeso: '0.00',
totalCostRmb: '0.00',
totalCostPeso: '0.00',
totalCommissionRmb: '0.00',
totalCommissionPeso: '0.00',
profitRmb: '0.00',
profitPeso: '0.00',
})
@ -403,6 +413,8 @@ async function fetchOrders() {
statistics.totalPeso = response.data.data.statistics.totalPeso || '0.00'
statistics.totalCostRmb = response.data.data.statistics.totalCostRmb || '0.00'
statistics.totalCostPeso = response.data.data.statistics.totalCostPeso || '0.00'
statistics.totalCommissionRmb = response.data.data.statistics.totalCommissionRmb || '0.00'
statistics.totalCommissionPeso = response.data.data.statistics.totalCommissionPeso || '0.00'
statistics.profitRmb = response.data.data.statistics.profitRmb || '0.00'
statistics.profitPeso = response.data.data.statistics.profitPeso || '0.00'
} else {
@ -410,6 +422,8 @@ async function fetchOrders() {
statistics.totalPeso = '0.00'
statistics.totalCostRmb = '0.00'
statistics.totalCostPeso = '0.00'
statistics.totalCommissionRmb = '0.00'
statistics.totalCommissionPeso = '0.00'
statistics.profitRmb = '0.00'
statistics.profitPeso = '0.00'
}
@ -622,6 +636,26 @@ async function handleCancel(row) {
}
}
function calcProfit(row, type) {
let amount = 0, cost = 0, commission = 0
if (type === 'peso') {
amount = parseFloat(row.amountPeso || 0)
cost = parseFloat(row.costPeso || 0)
if (row.commissions) {
row.commissions.filter(c => c.currency === 'PHP').forEach(c => { commission += parseFloat(c.amount || 0) })
}
} else if (type === 'rmb') {
amount = parseFloat(row.amountRmb || 0)
cost = parseFloat(row.costRmb || 0)
if (row.commissions) {
row.commissions.filter(c => c.currency !== 'PHP').forEach(c => { commission += parseFloat(c.amount || 0) })
}
} else {
amount = parseFloat(row.amount || 0)
}
return (amount - cost - commission).toFixed(2)
}
function formatDate(date) {
if (!date) return '-'
return new Date(date).toLocaleString('zh-CN')
@ -675,6 +709,10 @@ onMounted(() => {
color: #f56c6c;
}
&.commission {
color: #e6a23c;
}
&.profit {
color: #67c23a;
}

View File

@ -398,11 +398,11 @@ const getAllCommissions = async (options = {}) => {
if (currency === 'PHP') {
costAmount = parseFloat(po.costPeso || 0);
const payAmt = parseFloat(po.amountPeso || 0);
profitAmount = payAmt - costAmount;
profitAmount = payAmt - costAmount - parseFloat(commission.commissionAmount || 0);
} else {
costAmount = parseFloat(po.costRmb || 0);
const payAmt = parseFloat(po.amountRmb || 0) || parseFloat(po.amount || 0);
profitAmount = payAmt - costAmount;
profitAmount = payAmt - costAmount - parseFloat(commission.commissionAmount || 0);
}
}

View File

@ -250,6 +250,39 @@ const getPaymentOrders = async (options = {}) => {
const { count, rows } = ordersResult;
// Get all commissions for active orders to calculate total commission amounts
const Commission = require('../models/Commission');
const Op2 = require('sequelize').Op;
// Query total commissions for active orders (for statistics)
const activeOrderIds = await PaymentOrder.findAll({
where: { ...where, status: 'active' },
attributes: ['id'],
raw: true,
});
const activeIds = activeOrderIds.map(o => o.id);
let totalCommissionRmb = 0;
let totalCommissionPeso = 0;
if (activeIds.length > 0) {
const commissionStats = await Commission.findAll({
where: {
paymentOrderId: activeIds,
status: 'credited',
},
attributes: ['currency', [sequelize.fn('SUM', sequelize.col('commission_amount')), 'total']],
group: ['currency'],
raw: true,
});
commissionStats.forEach(cs => {
if (cs.currency === 'PHP') {
totalCommissionPeso = parseFloat(cs.total || 0);
} else {
totalCommissionRmb = parseFloat(cs.total || 0);
}
});
}
// Format statistics with two decimal places
const totalRmb = parseFloat(statisticsResult?.totalRmb || 0);
const totalPeso = parseFloat(statisticsResult?.totalPeso || 0);
@ -261,12 +294,13 @@ const getPaymentOrders = async (options = {}) => {
totalPeso: totalPeso.toFixed(2),
totalCostRmb: totalCostRmb.toFixed(2),
totalCostPeso: totalCostPeso.toFixed(2),
profitRmb: (totalRmb - totalCostRmb).toFixed(2),
profitPeso: (totalPeso - totalCostPeso).toFixed(2),
totalCommissionRmb: totalCommissionRmb.toFixed(2),
totalCommissionPeso: totalCommissionPeso.toFixed(2),
profitRmb: (totalRmb - totalCostRmb - totalCommissionRmb).toFixed(2),
profitPeso: (totalPeso - totalCostPeso - totalCommissionPeso).toFixed(2),
};
// Get all commissions for each order (dual-currency support)
const Commission = require('../models/Commission');
// Get commissions for current page orders
const orderIds = rows.map(o => o.id);
const commissions = await Commission.findAll({
where: { paymentOrderId: orderIds },