135 行
5.9 KiB
PHP
135 行
5.9 KiB
PHP
<?php
|
||
|
||
namespace scripts;
|
||
|
||
define('APP_PATH', __DIR__ . '/../application/');
|
||
define('ROOT_PATH', dirname(realpath(APP_PATH)) . '/');
|
||
require_once __DIR__ . '/../thinkphp/base.php';
|
||
require_once __DIR__ . '/../thinkphp/helper.php';
|
||
require_once __DIR__ . '/../application/common.php';
|
||
|
||
\think\Config::set(\think\Config::load(APP_PATH . 'config.php'));
|
||
\think\Config::set(include APP_PATH . 'database.php', 'database');
|
||
\think\Loader::addNamespace('app', APP_PATH);
|
||
require_once __DIR__ . '/../addons/shopro/helper/helper.php';
|
||
|
||
use think\Db;
|
||
use addons\shopro\service\Wallet;
|
||
use addons\shopro\service\partner\PartnerConfig;
|
||
use app\admin\model\shopro\commission\Agent as AgentModel;
|
||
use app\admin\model\shopro\partner\Reward as RewardModel;
|
||
use app\admin\model\shopro\order\Order as OrderModel;
|
||
use app\admin\model\shopro\user\WalletLog;
|
||
|
||
/**
|
||
* 订单 202612025075018794002500 (ID: 12) 区县统筹奖安全补发脚本
|
||
* 严格具备幂等性与事务保护
|
||
*/
|
||
class RepairOrder12CountyReward
|
||
{
|
||
const TARGET_ORDER_ID = 12;
|
||
const TARGET_USER_ID = 20;
|
||
const REWARD_AMOUNT = 50.00;
|
||
|
||
public function run($isCommit = false)
|
||
{
|
||
echo "========================================================\n";
|
||
echo " 订单 12 区县统筹奖安全补偿执行 (" . ($isCommit ? "正式执行" : "预检模拟") . ")\n";
|
||
echo "========================================================\n\n";
|
||
|
||
// 1. 校验目标订单
|
||
$order = OrderModel::where('id', self::TARGET_ORDER_ID)->find();
|
||
if (!$order) {
|
||
echo " [✗ 错误] 目标订单不存在!\n";
|
||
return 1;
|
||
}
|
||
echo " [✓] 目标订单: ID {$order->id}, 单号 {$order->order_sn}, 实付 {$order->pay_fee} 元, 买家 {$order->user_id}\n";
|
||
|
||
// 2. 校验受益人分销商身份
|
||
$agent = AgentModel::where('user_id', self::TARGET_USER_ID)->find();
|
||
if (!$agent || !$agent->is_county) {
|
||
echo " [✗ 错误] 用户 " . self::TARGET_USER_ID . " 不是有效的区县代理!\n";
|
||
return 1;
|
||
}
|
||
echo " [✓] 受益区县代理: User ID {$agent->user_id}, 等级 V{$agent->level}, 酒道馆: {$agent->is_venue}, 区县代: {$agent->is_county}, 现有累计收益: {$agent->total_income}\n";
|
||
|
||
// 3. 幂等性核查:检查是否已经发放过
|
||
$existingWalletLog = WalletLog::where('user_id', self::TARGET_USER_ID)
|
||
->where('event', 'team_county')
|
||
->where('ext', 'like', '%"order_id":' . self::TARGET_ORDER_ID . '%')
|
||
->find();
|
||
if ($existingWalletLog) {
|
||
echo " [!] 警告:钱包日志中已存在该订单的 team_county 记录 (Log ID: {$existingWalletLog->id}, 金额: {$existingWalletLog->amount}),无需重复补发!\n";
|
||
return 0;
|
||
}
|
||
|
||
// 4. 检查跳过的流水记录 ID 631
|
||
$skipReward = RewardModel::where('order_id', self::TARGET_ORDER_ID)
|
||
->where('reward_type', 'team_county')
|
||
->find();
|
||
if (!$skipReward) {
|
||
echo " [✗ 错误] 未找到订单 {$order->id} 的 team_county 流水记录!\n";
|
||
return 1;
|
||
}
|
||
echo " [✓] 找到流水记录: ID {$skipReward->id}, 当前状态: {$skipReward->status}, 金额: {$skipReward->amount}, 原归属: {$skipReward->user_id}\n";
|
||
|
||
if ($skipReward->status == 1 && (float)$skipReward->amount > 0 && $skipReward->user_id == self::TARGET_USER_ID) {
|
||
echo " [!] 流水记录已经是发放状态,跳过执行。\n";
|
||
return 0;
|
||
}
|
||
|
||
$walletType = PartnerConfig::rewardWalletType();
|
||
echo " [✓] 结算钱包类型: {$walletType}, 计划补发金额: ¥ " . number_format(self::REWARD_AMOUNT, 2) . "\n";
|
||
|
||
if (!$isCommit) {
|
||
echo "\n>>> 预检通过!若要正式执行并入账,请使用参数 --commit 执行。\n";
|
||
return 0;
|
||
}
|
||
|
||
// 5. 开启事务执行补发
|
||
try {
|
||
Db::startTrans();
|
||
|
||
// 5.1 更新流水记录为正常入账
|
||
$skipReward->user_id = self::TARGET_USER_ID;
|
||
$skipReward->role = 'county';
|
||
$skipReward->amount = self::REWARD_AMOUNT;
|
||
$skipReward->base_amount = self::REWARD_AMOUNT;
|
||
$skipReward->status = 1;
|
||
$extData = is_array($skipReward->ext) ? $skipReward->ext : (json_decode($skipReward->ext ?: '[]', true) ?: []);
|
||
$extData['original_skip_reason'] = $extData['skip_reason'] ?? 'not_county';
|
||
$extData['formula'] = '区县统筹奖 50(馆兼县补发)';
|
||
$extData['repaired_at'] = time();
|
||
$extData['repair_note'] = '修复双重身份查找起始索引缺陷后补发';
|
||
$skipReward->ext = $extData;
|
||
$skipReward->save();
|
||
|
||
// 5.2 变动钱包
|
||
Wallet::change(self::TARGET_USER_ID, $walletType, self::REWARD_AMOUNT, 'team_county', [
|
||
'partner_reward_id' => (string) $skipReward->id,
|
||
'order_id' => self::TARGET_ORDER_ID,
|
||
], '区县统筹奖补发');
|
||
|
||
// 5.3 累计分销商收益
|
||
AgentModel::where('user_id', self::TARGET_USER_ID)->setInc('total_income', self::REWARD_AMOUNT);
|
||
|
||
Db::commit();
|
||
echo " [✓ SUCCESS] 事务提交成功!订单 " . self::TARGET_ORDER_ID . " 区县统筹奖 50 元已入账 user_id: " . self::TARGET_USER_ID . "\n";
|
||
|
||
// 输出更新后的数据
|
||
$updatedAgent = AgentModel::where('user_id', self::TARGET_USER_ID)->find();
|
||
echo " [✓] 更新后分销商累计收益: {$updatedAgent->total_income}\n";
|
||
return 0;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
echo " [✗ FAIL] 执行异常回滚: " . $e->getMessage() . "\n";
|
||
return 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
// CLI 执行入口
|
||
$isCommit = in_array('--commit', $argv ?? []);
|
||
$repair = new RepairOrder12CountyReward();
|
||
exit($repair->run($isCommit));
|