feat: 收益全额直入商城余额、存量结转与奖项名称全局规范化对齐

这个提交包含在:
chen
2026-09-19 11:49:57 +08:00
父节点 85947e43ae
当前提交 aca0d3c671
共有 83 个文件被更改,包括 4146 次插入 和 443 次删除

查看文件

@@ -194,6 +194,7 @@ class Config extends Common
$keys = [
'partner_mode', 'partner_enable', 'partner_count_type', 'partner_active_days',
'partner_chain_max_depth', 'partner_push3_amounts', 'partner_madow_mode',
'partner_show_madow_rate',
'partner_madow_base_rate', 'partner_madow_step_orders', 'partner_voucher_times',
'partner_voucher_days', 'partner_maker_bonus', 'partner_maker_peer_rate',
'partner_maker_overtaken_rate', 'partner_team_total', 'partner_venue_split',
@@ -216,6 +217,7 @@ class Config extends Common
'partner_chain_max_depth' => 50,
'partner_push3_amounts' => [398, 400, 600],
'partner_madow_mode' => 'madow',
'partner_show_madow_rate' => 1,
'partner_madow_base_rate' => '0.00000075',
'partner_madow_step_orders' => 1,
'partner_voucher_times' => 1.5,
@@ -241,6 +243,7 @@ class Config extends Common
$configs[$key] = $value;
}
}
$configs['partner_show_madow_rate'] = isset($configs['partner_show_madow_rate']) ? intval($configs['partner_show_madow_rate']) : 1;
} elseif ('POST' === $this->request->method()) {
check_env('commission');
$params = $this->request->param();
@@ -250,6 +253,22 @@ class Config extends Common
$save[$key] = $params[$key];
}
}
if (isset($save['partner_show_madow_rate'])) {
$save['partner_show_madow_rate'] = intval($save['partner_show_madow_rate']);
}
// 确保数据库存在 partner_show_madow_rate 配置行
$existConfig = ShoproConfig::where('code', 'shop.commission.partner_show_madow_rate')->find();
if (!$existConfig) {
ShoproConfig::create([
'code' => 'shop.commission.partner_show_madow_rate',
'parent_code' => 'shop.commission',
'name' => '显示马币市值',
'description' => '1=显示 0=隐藏',
'type' => 'int',
'value' => '1',
'weigh' => 86
]);
}
foreach (['partner_role_name_taster', 'partner_role_name_maker', 'partner_role_name_venue', 'partner_role_name_county', 'partner_role_name_partner'] as $roleKey) {
if (isset($save[$roleKey])) {
$save[$roleKey] = trim((string) $save[$roleKey]);

查看文件

@@ -749,7 +749,7 @@ class Dashboard extends Common
$structureMap = [
'push3' => [
'key' => 'push3',
'name' => '推荐开拓奖励',
'name' => '推荐提成',
'types' => ['push3'],
'amount' => 0.00,
'count' => 0,
@@ -765,7 +765,7 @@ class Dashboard extends Common
],
'channel' => [
'key' => 'channel',
'name' => '实体统筹协同奖励',
'name' => '渠道管理与平级奖',
'types' => ['team_venue', 'team_county', 'venue_peer', 'county_peer'],
'amount' => 0.00,
'count' => 0,
@@ -773,7 +773,7 @@ class Dashboard extends Common
],
'share' => [
'key' => 'share',
'name' => '全网加权贡献奖励',
'name' => '全网加权分红奖',
'types' => ['venue_share', 'county_share'],
'amount' => 0.00,
'count' => 0,

查看文件

@@ -93,10 +93,14 @@ class Agent extends Common
->where('reward_type', '<>', 'push3')
->sum('amount');
$detail->income_total_cash = number_format((float) $totalCash, 2, '.', '');
$alignedIncome = number_format(max(floatval($detail->total_income ?? 0), (float) $totalCash), 2, '.', '');
$detail->income_total_cash = $alignedIncome;
$detail->total_income = $alignedIncome;
$detail->partner_cash_income = $alignedIncome;
$detail->push3_cash_income = number_format((float) $push3Cash, 2, '.', '');
$detail->partner_exclusive_cash = number_format((float) $partnerExclusiveCash, 2, '.', '');
$detail->partner_cash_income = $detail->income_total_cash;
$detail->user_money = number_format(floatval($detail->user ? $detail->user->money : 0), 2, '.', '');
$detail->user_commission = number_format(floatval($detail->user ? $detail->user->commission : 0), 2, '.', '');
$detail->partner_mode = \addons\shopro\service\partner\PartnerConfig::isPartnerMode() ? 1 : 0;
$rate = (new \addons\shopro\service\partner\RateService())->currentRate();
$detail->madow_value = \addons\shopro\service\partner\IdentityService::formatMoney((float) ($detail->madow ?? 0) * (float) $rate);

查看文件

@@ -58,7 +58,7 @@ class Reward extends Common
$export = new \addons\shopro\library\Export();
$params = [
'file_name' => '佣金明细列表',
'file_name' => '历史分销佣金列表',
'cell_titles' => $cellTitles,
'total' => $total,
'is_sub_cell' => false,

查看文件

@@ -242,7 +242,7 @@ class Order extends Common
// 友好展示金额
if ($type === 'voucher_grant') {
$amountText = number_format($baseAmount, 2, '.', '') . ' 兑换券';
$amountText = number_format($baseAmount, 2, '.', '') . ' 个';
} elseif ($madow > 0) {
$amountText = \addons\shopro\service\partner\IdentityService::formatMadow($madow) . ' 马豆';
} elseif ($amount > 0) {
@@ -270,6 +270,8 @@ class Order extends Common
)),
'formula' => (string) ($row->formula ?? ''),
'skip_reason_text' => (string) ($row->skip_reason_text ?? ''),
'wallet_type' => (string) ($row->wallet_type ?? ($amount > 0 ? \addons\shopro\service\partner\PartnerConfig::rewardWalletType() : 'system')),
'wallet_type_text' => (string) ($row->wallet_type_text ?: ($amount > 0 ? (\addons\shopro\service\partner\PartnerConfig::rewardWalletType() === 'money' ? '商城余额' : '佣金钱包') : '平台留存')),
];
}
@@ -299,6 +301,8 @@ class Order extends Common
'base_amount' => '0.00',
'amount_text' => '¥' . number_format($cCommission, 2, '.', ''),
'madow' => '0.00000000',
'wallet_type' => 'commission',
'wallet_type_text' => '佣金钱包',
'status' => $cStatus,
'status_text' => (string) ($crow->status_text ?: ($cStatus === 1 ? '已入账' : '待入账')),
'formula' => '分销规则佣金',
@@ -393,6 +397,8 @@ class Order extends Common
'total_amount' => number_format($platAmount, 2, '.', ''),
'total_madow' => \addons\shopro\service\partner\IdentityService::formatMadow($platMadow),
'amount_text' => $amountText,
'wallet_type' => 'system',
'wallet_type_text' => '平台留存',
'settle_date' => $settleDate,
'status' => 1,
'status_text' => '已入账',
@@ -424,6 +430,8 @@ class Order extends Common
'total_amount' => number_format($totalAmount, 2, '.', ''),
'total_madow' => \addons\shopro\service\partner\IdentityService::formatMadow($totalMadow),
'amount_text' => $type === 'madow_share' ? ($eachMadow . ' 马豆/人') : ('¥' . $eachAmount . '/人'),
'wallet_type' => $type === 'madow_share' ? 'madow' : \addons\shopro\service\partner\PartnerConfig::rewardWalletType(),
'wallet_type_text' => $type === 'madow_share' ? '分红马豆' : (\addons\shopro\service\partner\PartnerConfig::rewardWalletType() === 'money' ? '商城余额' : '佣金钱包'),
'settle_date' => $settleDate,
'status' => 1,
'status_text' => '已入账',

查看文件

@@ -50,6 +50,7 @@ class Reward extends Common
'reward_type_text' => '奖励类型',
'role_text' => '受益身份',
'amount' => '结算金额',
'wallet_type_text' => '入账账户',
'madow' => '马豆',
'base_amount' => '基数',
'status_text' => '状态',
@@ -83,6 +84,7 @@ class Reward extends Common
'reward_type_text' => $reward['reward_type_text'],
'role_text' => $reward['role_text'] ?? $reward['role'],
'amount' => $reward['amount'],
'wallet_type_text' => $reward['wallet_type_text'] ?? '商城余额',
'madow' => \addons\shopro\service\partner\IdentityService::formatMadow($reward['madow']),
'base_amount' => $reward['base_amount'],
'status_text' => $reward['status_text'],
@@ -102,6 +104,7 @@ class Reward extends Common
'reward_type_text' => '-',
'role_text' => '-',
'amount' => number_format($totalAmount, 2, '.', ''),
'wallet_type_text' => '现金直入余额',
'madow' => $formattedTotalMadow,
'base_amount' => '-',
'status_text' => '已汇总',
@@ -138,7 +141,8 @@ class Reward extends Common
'ext' => ['formula' => '手工补发', 'memo' => $params['memo'], 'manual' => 1],
'status' => 1,
]);
Wallet::change($params['user_id'], 'commission', $amount, 'reward_income', [
$walletType = PartnerConfig::rewardWalletType();
Wallet::change($params['user_id'], $walletType, $amount, 'reward_income', [
'partner_reward_id' => $row->id ?? 0,
'manual' => 1,
], $params['memo']);
@@ -162,7 +166,12 @@ class Reward extends Common
}
Db::transaction(function () use ($row, $memo) {
if ((float) $row->amount > 0 && $row->user_id > 0) {
Wallet::change($row->user_id, 'commission', -$row->amount, 'reward_back', [
$walletLog = \app\admin\model\shopro\user\WalletLog::where('user_id', $row->user_id)
->where('ext', 'like', '%"partner_reward_id":' . intval($row->id) . '%')
->order('id', 'desc')
->find();
$targetWallet = ($walletLog && $walletLog->type === 'commission') ? 'commission' : PartnerConfig::rewardWalletType();
Wallet::change($row->user_id, $targetWallet, -$row->amount, 'reward_back', [
'partner_reward_id' => $row->id,
], $memo);
}
@@ -217,6 +226,8 @@ class Reward extends Common
'user_nickname' => $r->user ? ($r->user->nickname ?: $r->user->mobile) : '平台/买家',
'role_text' => $r->role_text ?: $r->role,
'amount' => $r->amount,
'wallet_type' => $r->wallet_type,
'wallet_type_text' => $r->wallet_type_text,
'madow' => $r->madow,
'base_amount' => $r->base_amount,
'status' => $r->status,
@@ -259,4 +270,30 @@ class Reward extends Common
] : null,
]);
}
/**
* 全量结转收益预览试算
*/
public function transferAllCommissionPreview()
{
$service = new \addons\shopro\service\partner\WalletMigrationService();
$preview = $service->preview();
$this->success('获取成功', null, $preview);
}
/**
* 执行全量结转收益至商城余额
*/
public function transferAllCommission()
{
$isDryRun = (bool) $this->request->param('dry_run', false);
$confirm = (int) $this->request->param('confirm', 0);
if (!$isDryRun && $confirm !== 1) {
$this->error('操作属于高风险批量资金转移,请传递 confirm=1 确认执行');
}
$service = new \addons\shopro\service\partner\WalletMigrationService();
$result = $service->transferAll($isDryRun);
$this->success($isDryRun ? '试算成功' : '结转完成', null, $result);
}
}

查看文件

@@ -142,11 +142,14 @@ class User extends Common
: ('已暂停领取' . ($ago !== null ? '(距今 ' . $ago . ' 天)' : '(从未下单)'));
}
// 累计现金收益统计
// 累计现金收益统计(与 IdentityService 严格对齐,兼顾历史分销与收益中心)
$agentTotalIncome = floatval($agent->total_income ?? 0);
$totalCash = \app\admin\model\shopro\partner\Reward::where('user_id', $id)
->where('status', 1)
->where('amount', '>', 0)
->sum('amount');
$alignedTotalIncome = max($agentTotalIncome, (float) $totalCash);
$push3Cash = \app\admin\model\shopro\partner\Reward::where('user_id', $id)
->where('status', 1)
->where('amount', '>', 0)
@@ -158,9 +161,12 @@ class User extends Common
->where('reward_type', '<>', 'push3')
->sum('amount');
$data['income_total_cash'] = number_format((float) $totalCash, 2, '.', '');
$data['income_total_cash'] = number_format($alignedTotalIncome, 2, '.', '');
$data['total_income'] = number_format($alignedTotalIncome, 2, '.', '');
$data['push3_cash_income'] = number_format((float) $push3Cash, 2, '.', '');
$data['partner_exclusive_cash'] = number_format((float) $partnerExclusiveCash, 2, '.', '');
$data['money'] = number_format(floatval($user->money ?? 0), 2, '.', '');
$data['commission'] = number_format(floatval($user->commission ?? 0), 2, '.', '');
// 兑换券计划资产统计
$voucherTotal = floatval($agent->voucher_total ?? 0);

查看文件

@@ -65,12 +65,26 @@ class WalletLog extends Common
}
/**
* 佣金记录
* 佣金与收益记录
*/
public function commission($id)
{
$list_rows = $this->request->param('list_rows', 10);
$walletLogs = WalletLogModel::where('user_id', $id)->commission()->order('id', 'desc')->paginate($list_rows);
$rewardEvents = [
'push3', 'maker_diff', 'maker_peer', 'maker_overtaken',
'team_venue', 'team_county', 'venue_peer', 'county_peer',
'venue_share', 'county_share', 'reward_income', 'transfer_by_commission', 'transfer_to_money'
];
$walletLogs = WalletLogModel::where('user_id', $id)
->where(function ($query) use ($rewardEvents) {
$query->where('type', 'commission')
->whereOr(function ($sub) use ($rewardEvents) {
$sub->where('type', 'money')->whereIn('event', $rewardEvents);
});
})
->order('id', 'desc')
->paginate($list_rows);
// 多态关联 oper
$morphs = [