feat: 收益全额直入商城余额、存量结转与奖项名称全局规范化对齐
这个提交包含在:
@@ -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 = [
|
||||
|
||||
在新工单中引用
屏蔽一个用户