文件
Henglianshutong/scripts/repair_order_12_county_reward.php

135 行
5.9 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?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));