feat(order): 订单详情增加佣金分成明细查询与展示(分销商佣金、区域代理分红及通道分账)

这个提交包含在:
wikiboss
2026-09-30 10:23:34 +08:00
父节点 2151439d45
当前提交 d8be55a4f7
共有 4 个文件被更改,包括 457 次插入 和 3 次删除

查看文件

@@ -486,10 +486,19 @@ class Order extends Base
}
}
// 查询佣金分成明细
$commissions = $this->getOrderCommissions($id, $row);
$commissionTotal = 0;
foreach ($commissions as $comm) {
$commissionTotal += (float)$comm['commission'];
}
return $this->success('获取成功', null, [
'order' => $row,
'item' => $row['item'],
'express' => $row['express']
'order' => $row,
'item' => $row['item'],
'express' => $row['express'],
'commissions' => $commissions,
'commission_total' => number_format($commissionTotal, 2, '.', ''),
]);
}
@@ -497,6 +506,148 @@ class Order extends Base
return $this->view->fetch();
}
/**
* 查询订单关联的佣金分成明细(包括分销商佣金、区域代理分红及通道分账)
*/
protected function getOrderCommissions($orderId, $order = null)
{
$commissions = [];
// 建立商品项名称映射
$itemMap = [];
if (!empty($order['item'])) {
foreach ($order['item'] as $it) {
$sku = !empty($it['goods_sku_text']) ? ' (' . $it['goods_sku_text'] . ')' : '';
$itemMap[$it['id']] = $it['goods_title'] . $sku;
}
}
// 1. 分销佣金明细 (shopro_commission_reward)
try {
$commissionRewards = \app\admin\model\shopro\commission\Reward::with(['agent', 'buyer'])
->where('order_id', $orderId)
->order('id', 'asc')
->select();
foreach ($commissionRewards as $reward) {
$awardTypeName = $reward['award_type_name'] ?? '推广差价';
$levelText = !empty($reward['commission_level']) ? $reward['commission_level'] . '级分销' : '分销奖励';
$commissions[] = [
'id' => $reward['id'],
'category' => 'commission',
'category_text' => '分销佣金',
'award_type_name' => $awardTypeName,
'level_text' => $levelText,
'user' => $reward['agent'] ? [
'id' => $reward['agent']['id'],
'nickname' => $reward['agent']['nickname'],
'avatar' => $reward['agent']['avatar'],
'mobile' => $reward['agent']['mobile'],
] : null,
'commission' => number_format((float)$reward['commission'], 2, '.', ''),
'type_text' => $reward['type_text'] ?: '余额',
'status' => $reward['status'],
'status_text' => $reward['status_text'] ?: '待结算',
'goods_title' => $itemMap[$reward['order_item_id']] ?? '整单',
'order_item_id' => $reward['order_item_id'],
'createtime' => $reward['createtime'],
'createtime_text' => $reward['createtime'] ? date('Y-m-d H:i:s', is_numeric($reward['createtime']) ? $reward['createtime'] : strtotime($reward['createtime'])) : '',
];
}
} catch (\Exception $e) {
}
// 2. 区域代理佣金明细 (shopro_regional_agent_reward)
try {
$regionalRewards = \app\admin\model\shopro\regional_agent\Reward::with(['agentUser', 'agent', 'regionalOrder'])
->where('order_id', $orderId)
->order('id', 'asc')
->select();
foreach ($regionalRewards as $reward) {
$agent = $reward['agent'] ?? null;
$areaText = '';
if ($agent) {
$areaText = $agent['area_name'] ?? '';
if ($agent['area_level'] == 1) {
$areaText .= ' (省代理)';
} elseif ($agent['area_level'] == 2) {
$areaText .= ' (市代理)';
} elseif ($agent['area_level'] == 3) {
$areaText .= ' (区县代理)';
}
}
if (!$areaText && !empty($reward['regionalOrder'])) {
$ro = $reward['regionalOrder'];
$areaText = ($ro['area_name'] ?? '') ?: ($ro['area_id'] ? '区域ID:' . $ro['area_id'] : '区域代理');
}
$commissions[] = [
'id' => $reward['id'],
'category' => 'regional',
'category_text' => '区域代理佣金',
'award_type_name' => '区域分红',
'level_text' => $areaText ?: '区域代理',
'user' => $reward['agentUser'] ? [
'id' => $reward['agentUser']['id'],
'nickname' => $reward['agentUser']['nickname'],
'avatar' => $reward['agentUser']['avatar'],
'mobile' => $reward['agentUser']['mobile'],
] : null,
'commission' => number_format((float)$reward['commission'], 2, '.', ''),
'type_text' => ($reward['type'] == 'money' ? '余额' : ($reward['type'] ?: '余额')),
'status' => $reward['status'],
'status_text' => $reward['status_text'] ?: '待入账',
'goods_title' => $itemMap[$reward['order_item_id']] ?? '整单',
'order_item_id' => $reward['order_item_id'],
'createtime' => $reward['createtime'],
'createtime_text' => $reward['createtime'] ? date('Y-m-d H:i:s', is_numeric($reward['createtime']) ? $reward['createtime'] : strtotime($reward['createtime'])) : '',
];
}
} catch (\Exception $e) {
}
// 3. 通道分账明细 (shopro_split_order,若有)
try {
if (class_exists('\\addons\\shopro\\model\\split\\SplitOrder')) {
$splitOrders = \addons\shopro\model\split\SplitOrder::with(['receivers'])
->where('order_id', $orderId)
->select();
foreach ($splitOrders as $so) {
if (!empty($so['receivers'])) {
foreach ($so['receivers'] as $rec) {
$commissions[] = [
'id' => $rec['id'],
'category' => 'split',
'category_text' => '通道分账',
'award_type_name' => ($so['channel'] ?? '') === 'huifu' ? '汇付分账' : '微信分账',
'level_text' => $rec['description'] ?: ($rec['role_type'] ?? '分账方'),
'user' => [
'id' => $rec['receiver_account'] ?? '',
'nickname' => $rec['receiver_name'] ?: ($rec['receiver_account'] ?? '分账接收方'),
'avatar' => '',
'mobile' => '',
],
'commission' => number_format((float)$rec['amount'], 2, '.', ''),
'type_text' => ($so['channel'] ?? '') === 'huifu' ? '汇付渠道' : '微信渠道',
'status' => $rec['status'],
'status_text' => $rec['status'] == 1 ? '分账成功' : ($rec['status'] == 2 ? '分账失败' : '待分账'),
'goods_title' => '整单分账',
'order_item_id' => 0,
'createtime' => $so['createtime'],
'createtime_text' => $so['createtime'] ? date('Y-m-d H:i:s', is_numeric($so['createtime']) ? $so['createtime'] : strtotime($so['createtime'])) : '',
];
}
}
}
}
} catch (\Exception $e) {
}
return $commissions;
}
/**
* 拆分商品
* @throws PDOException