feat(commission): 添加分账成功后佣金处理功能 添加了新的方法来处理分账成功后的佣金结算: - 新增 runCommissionRewardByOrderWithoutWallet 方法用于分账成功时标记已结算 - 新增 runCommissionRewardWithoutWallet 方法处理不入余额的佣金奖励 - 避免在分账成功时重复将佣金计入用户余额 feat(regional_agent): 添加区域代理分账处理逻辑 - 新增 settleByRegionalOrderWithoutWallet 方法处理区域代理分账 - 新增 settleRewardWithoutWallet 方法处理不入钱包的奖励结算 - 完善区域代理佣金处理流程 refactor(split): 优化分账执行器逻辑 - 修改 SplitExecutor 类以支持延迟钱包结算 - 添加异常处理和事务管理 - 支持根据支付网关类型决定是否延迟钱包结算 feat(split): 实现分账完成后钱包结算机制 - 添加 SplitWalletSettlement 类来管理分账与钱包结算的协调 - 支持在分账成功后延迟钱包入账,失败时回退到钱包 - 修复汇付分账与佣金结算的时间冲突问题 refactor(hook): 调整分账钩子事件处理 - 修改 SplitHook 类的事件参数传递 - 更新各个订单状态变更事件的分账触发逻辑 - 确保分账执行时能正确获取事件类型 docs(tests): 更新分账佣金验证说明 - 更新测试文件中的注释说明 - 明确汇付/微信分账成功后的佣金处理方式 ```
162 行
4.9 KiB
PHP
162 行
4.9 KiB
PHP
<?php
|
|
|
|
namespace addons\shopro\library\regional_agent;
|
|
|
|
use addons\shopro\model\User as UserModel;
|
|
use addons\shopro\model\regional_agent\Agent as AgentModel;
|
|
use addons\shopro\model\regional_agent\Order as RegionalOrderModel;
|
|
use addons\shopro\model\regional_agent\Reward as RewardModel;
|
|
|
|
/**
|
|
* 区域代理佣金结算
|
|
*/
|
|
class Reward
|
|
{
|
|
const STATUS_WAITING = 0;
|
|
const STATUS_ACCOUNTED = 1;
|
|
const STATUS_BACK = -1;
|
|
|
|
public function settleByRegionalOrder($regionalOrderId, $event)
|
|
{
|
|
$regionalOrder = RegionalOrderModel::get($regionalOrderId);
|
|
if (!$regionalOrder || $regionalOrder['commission_reward_status'] !== self::STATUS_WAITING) {
|
|
return false;
|
|
}
|
|
|
|
$regionalOrder->commission_reward_status = self::STATUS_ACCOUNTED;
|
|
$regionalOrder->commission_time = time();
|
|
$regionalOrder->save();
|
|
|
|
$rewards = RewardModel::where('regional_order_id', $regionalOrderId)
|
|
->where('status', self::STATUS_WAITING)
|
|
->select();
|
|
|
|
foreach ($rewards as $reward) {
|
|
$this->settleReward($reward, $event);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function settleByRegionalOrderWithoutWallet($regionalOrderId, $event)
|
|
{
|
|
$regionalOrder = RegionalOrderModel::get($regionalOrderId);
|
|
if (!$regionalOrder || $regionalOrder['commission_reward_status'] !== self::STATUS_WAITING) {
|
|
return false;
|
|
}
|
|
|
|
$regionalOrder->commission_reward_status = self::STATUS_ACCOUNTED;
|
|
$regionalOrder->commission_time = time();
|
|
$regionalOrder->save();
|
|
|
|
$rewards = RewardModel::where('regional_order_id', $regionalOrderId)
|
|
->where('status', self::STATUS_WAITING)
|
|
->select();
|
|
|
|
foreach ($rewards as $reward) {
|
|
$this->settleRewardWithoutWallet($reward, $event);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function settleReward($reward, $event)
|
|
{
|
|
if ($reward['status'] !== self::STATUS_WAITING) {
|
|
return false;
|
|
}
|
|
|
|
$agent = AgentModel::get($reward['agent_id']);
|
|
if (!$agent || $agent['status'] !== AgentModel::STATUS_NORMAL) {
|
|
return false;
|
|
}
|
|
|
|
$agentUser = UserModel::get($reward['agent_user_id']);
|
|
if (!$agentUser) {
|
|
\think\Log::error("[regional_agent] settleReward fail: agent_user_id={$reward['agent_user_id']} not found in fa_user");
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
$agent->setInc('total_income', $reward['commission']);
|
|
UserModel::money($reward['commission'], $reward['agent_user_id'], 'regional_agent_income', $reward['id'], '区域公司差价', $reward);
|
|
|
|
$reward->status = self::STATUS_ACCOUNTED;
|
|
$reward->save();
|
|
return true;
|
|
} catch (\Throwable $e) {
|
|
\think\Log::error("[regional_agent] settleReward money error: " . $e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function settleRewardWithoutWallet($reward, $event)
|
|
{
|
|
if ($reward['status'] !== self::STATUS_WAITING) {
|
|
return false;
|
|
}
|
|
|
|
$agent = AgentModel::get($reward['agent_id']);
|
|
if (!$agent || $agent['status'] !== AgentModel::STATUS_NORMAL) {
|
|
return false;
|
|
}
|
|
|
|
$agentUser = UserModel::get($reward['agent_user_id']);
|
|
if (!$agentUser) {
|
|
return false;
|
|
}
|
|
|
|
$agent->setInc('total_income', $reward['commission']);
|
|
$reward->status = self::STATUS_ACCOUNTED;
|
|
$reward->save();
|
|
return true;
|
|
}
|
|
|
|
public function backByRegionalOrder($regionalOrderId, $event)
|
|
{
|
|
$regionalOrder = RegionalOrderModel::get($regionalOrderId);
|
|
if (!$regionalOrder) {
|
|
return false;
|
|
}
|
|
|
|
if ($regionalOrder['commission_reward_status'] === self::STATUS_ACCOUNTED) {
|
|
$regionalOrder->commission_reward_status = self::STATUS_BACK;
|
|
$regionalOrder->save();
|
|
}
|
|
|
|
$rewards = RewardModel::where('regional_order_id', $regionalOrderId)
|
|
->where('status', self::STATUS_ACCOUNTED)
|
|
->select();
|
|
|
|
foreach ($rewards as $reward) {
|
|
$this->backReward($reward);
|
|
}
|
|
|
|
$agent = AgentModel::get($regionalOrder['agent_id']);
|
|
if ($agent) {
|
|
$agent->setDec('order_money', $regionalOrder['amount']);
|
|
$agent->setDec('order_count', 1);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function backReward($reward)
|
|
{
|
|
if ($reward['status'] !== self::STATUS_ACCOUNTED) {
|
|
return false;
|
|
}
|
|
|
|
$agent = AgentModel::get($reward['agent_id']);
|
|
if ($agent) {
|
|
$agent->setDec('total_income', $reward['commission']);
|
|
}
|
|
|
|
UserModel::money(-$reward['commission'], $reward['agent_user_id'], 'regional_agent_back', $reward['id'], '区域公司差价退回', $reward);
|
|
$reward->status = self::STATUS_BACK;
|
|
$reward->save();
|
|
|
|
return true;
|
|
}
|
|
}
|