Commit 8c0ecfc3 authored by 刘小敏's avatar 刘小敏

feat(command): 增强修复佣金脚本并移除订单软删除查询

增强 FixMissedCommission 脚本,支持指定订单ID参数, 排除软删除订单,完善日志明细与汇总统计; 同时移除后台订单列表中不必要的 withTrashed 查询, 并更新 .gitignore 忽略规则。
parent 03afae08
...@@ -12,5 +12,4 @@ composer.lock ...@@ -12,5 +12,4 @@ composer.lock
.user.ini .user.ini
/public/uploads /public/uploads
.codebuddy/memory/2025-07-07.md .codebuddy/memory/
.codebuddy/memory/2026-07-08.md
...@@ -51,7 +51,7 @@ class Order extends Common ...@@ -51,7 +51,7 @@ class Order extends Common
return $this->view->fetch(); return $this->view->fetch();
} }
$orders = $this->model->withTrashed()->sheepFilter()->with(['user', 'items', 'address', 'activity_orders']) $orders = $this->model->sheepFilter()->with(['user', 'items', 'address', 'activity_orders'])
->paginate(request()->param('list_rows', 10))->each(function ($order) { ->paginate(request()->param('list_rows', 10))->each(function ($order) {
$order->pay_types = $order->pay_types; $order->pay_types = $order->pay_types;
$order->pay_types_text = $order->pay_types_text; $order->pay_types_text = $order->pay_types_text;
...@@ -80,12 +80,12 @@ class Order extends Common ...@@ -80,12 +80,12 @@ class Order extends Common
// 查询各个状态下的订单数量 // 查询各个状态下的订单数量
$searchStatus = $this->model->searchStatusList(); $searchStatus = $this->model->searchStatusList();
// 所有的数量 // 所有的数量
$result['all'] = $this->model->withTrashed()->sheepFilter(true, function ($filters) { $result['all'] = $this->model->sheepFilter(true, function ($filters) {
unset($filters['status']); unset($filters['status']);
return $filters; return $filters;
})->count(); })->count();
foreach ($searchStatus as $status => $text) { foreach ($searchStatus as $status => $text) {
$result[$status] = $this->model->withTrashed()->sheepFilter(true, function ($filters) use ($status) { $result[$status] = $this->model->sheepFilter(true, function ($filters) use ($status) {
$filters['status'] = $status; $filters['status'] = $status;
return $filters; return $filters;
})->count(); })->count();
......
## FixMissedCommission 脚本完整流程拆解
### 脚本目的
遍历所有已完成的订单,检查分销佣金是否有遗漏,自动补全缺失的分销数据。可重复执行,已有记录不会重复操作。
**执行命令**: `php think shopro:fix-missed-commission`
---
### 整体流程分 4 层
```
外层循环: 分页遍历已完成的订单
└─ 每笔订单: 两步处理
├─ 第一步: 创建分销订单 + 佣金计划(模拟支付成功)
└─ 第二步: 执行佣金拨款结算(模拟订单完成)
```
---
### 第 1 层:分页查询已完成订单(第 96-113 行)
- 每页 100 条(`PAGE_SIZE = 100`
- 查询条件:`status = completed` + `type != score`(排除纯积分商品订单)
- 查询字段:`id, user_id, order_sn, deduct_score`
-`id` 升序排列
- 当某页数据不足 100 条时,说明已是最后一页,退出循环
---
### 第 2 层:每笔订单的前置处理(第 115-133 行)
进入订单循环后,先做 2 件事:
| 步骤 | 内容 |
|------|------|
| ① 查询订单商品 | 查询 `shopro_order_item` 表,条件:`order_id = $orderId` + `refund_status = 0`(未退款) |
| ② 判断商品是否为空 | 没有未退款商品 → 跳过整笔订单 |
---
### 第 3 层 A:积分抵扣修正(第 135-143 行)
这是之前修复的 Bug:`order_item.pay_fee` 不含积分抵扣,需要手动扣减。
| 条件 | 操作 |
|------|------|
| `deduct_score = 0` | 无需修正,跳过 |
| `deduct_score > 0` | `积分抵扣金额 = deduct_score ÷ 100`(100 积分 = 1 元),汇总所有 item 的 `pay_fee` 总额 |
---
### 第 3 层 B:第一步 — 创建分销订单(第 145-216 行)
**目的**:为没有 `commission_order` 记录的商品补建分销订单和佣金计划(模拟"订单支付成功"事件)。
遍历每个 `order_item`,执行以下检查链:
```
商品 item → 检查1: ext.is_commission 标记
→ 是 → 跳过(标记不参与分销)
→ 否 → 检查2: shopro_commission_order 表是否已有记录
→ 有 → 跳过(已存在分佣记录)
→ 无 → 检查3: 积分抵扣修正 pay_fee
→ 按比例分摊:itemScoreDeduction = 积分抵扣金额 × (item.pay_fee / 各item.pay_fee总和)
→ 调整后 pay_fee = 原始 pay_fee - itemScoreDeduction
→ 检查4: OrderService.checkAndSetCommission()
→ 不满足 → 跳过(无分销商/无佣金规则等)
→ 满足 → 步骤4a: createCommissionOrder()
→ 失败 → 跳过
→ 成功 → 步骤4b: runCommissionPlan()
→ 递归向上创建所有上级分销商的佣金奖励(commission_reward)
```
**关键代码调用链**
- `new OrderService($item)` — 传入商品 item,内部会调用 `getGoodsCommissionAmount()` 拿到调整后的 `pay_fee`
- `checkAndSetCommission()` — 检查购买者是否有上级分销商、商品是否有佣金规则等
- `createCommissionOrder()` — 写入 `shopro_commission_order`
- `runCommissionPlan()` — 递归计算各级分销佣金,写入 `shopro_commission_reward`
---
### 第 3 层 C:第二步 — 执行拨款结算(第 221-266 行)
**目的**:对已有 `commission_order` 但佣金状态为"待结算"的记录,执行拨款(模拟"订单完成"事件)。
```
查所有 commission_order(order_id = $orderId)
→ 无 → 跳过第二步
→ 有 → 遍历每条分佣单:
→ 状态 != 待结算 → 跳过(已结算/已取消/已退款)
→ 状态 = 待结算 → RewardService('admin').runCommissionRewardByOrder()
→ 成功 → 写入钱包余额(total_income + 对应金额)
→ 失败 → 记录 warning
```
**关键点**:使用 `RewardService('admin')` 而非正常事件(如 `confirm`/`finish`),因为 `admin` 事件不受 `reward_event` 配置限制,确保一定能拨款。
---
### 第 4 层:统计汇总(第 278-290 行)
循环全部结束后输出汇总:
| 统计项 | 含义 |
|--------|------|
| `totalOrders` | 遍历的已完成订单总数 |
| `totalCreated` | 新创建的分销订单 `commission_order` 数 |
| `totalSettled` | 新执行的拨款结算数 |
| `totalSkipped` | 已结算/已取消跳过的分佣单数 |
---
### 可重复执行的安全性
| 保护机制 | 说明 |
|----------|------|
| `order_item_id` 唯一检查 | 已有 `commission_order` 记录的不重复创建 |
| 状态过滤 | 已结算/已取消/已退款的 `commission_order` 跳过拨款 |
| `is_commission` 标记 | 商品标记不参与分销的不处理 |
| 退款商品过滤 | `refund_status != 0` 的不处理 |
---
### 流程图总结
```
开始
分页查询 shopro_order (status=completed, type!=score)
遍历每笔订单 ──→ 无未退款商品 → 跳过
↓ 有
积分抵扣修正: 按比例从 item.pay_fee 扣减 deduct_score/100
【第一步】遍历 item:
├─ ext.is_commission=false → 跳过
├─ commission_order 已存在 → 跳过
├─ checkAndSetCommission 不满足 → 跳过
└─ ✓ createCommissionOrder → runCommissionPlan → 创建成功
【第二步】遍历 commission_order:
├─ 状态 != 待结算 → 跳过
└─ 待结算 → runCommissionRewardByOrder → 拨款到钱包
下一页 / 结束汇总
```
\ No newline at end of file
...@@ -3,6 +3,7 @@ namespace app\command; ...@@ -3,6 +3,7 @@ namespace app\command;
use think\console\Command; use think\console\Command;
use think\console\Input; use think\console\Input;
use think\console\input\Option;
use think\console\Output; use think\console\Output;
use think\Db; use think\Db;
use app\admin\model\shopro\commission\Order as CommissionOrderModel; use app\admin\model\shopro\commission\Order as CommissionOrderModel;
...@@ -20,6 +21,7 @@ use addons\shopro\service\commission\Reward as RewardService; ...@@ -20,6 +21,7 @@ use addons\shopro\service\commission\Reward as RewardService;
* 执行奖励拨款(使用 admin 事件,绕过 reward_event 匹配限制) * 执行奖励拨款(使用 admin 事件,绕过 reward_event 匹配限制)
* *
* 命令:php think shopro:fix-missed-commission * 命令:php think shopro:fix-missed-commission
* php think shopro:fix-missed-commission --order_id=123 (指定订单)
* *
* 使用场景: * 使用场景:
* - 历史订单漏掉分销商分佣时,一次性补填数据 * - 历史订单漏掉分销商分佣时,一次性补填数据
...@@ -44,13 +46,14 @@ class FixMissedCommission extends Command ...@@ -44,13 +46,14 @@ class FixMissedCommission extends Command
protected function configure() protected function configure()
{ {
$this->setName('shopro:fix-missed-commission') $this->setName('shopro:fix-missed-commission')
->setDescription('补漏分销商分佣:遍历已完成订单,补充遗漏的分销佣金记录并结算'); ->setDescription('补漏分销商分佣:遍历已完成订单,补充遗漏的分销佣金记录并结算')
->addOption('order_id', null, Option::VALUE_OPTIONAL, '指定订单ID(只处理该订单)', null);
} }
/** /**
* 自定义日志记录方法 * 自定义日志记录方法
* *
* @param string $level 日志级别: info/warning/error * @param string $level 日志级别: info/warning-warn/error
* @param string $message 日志内容 * @param string $message 日志内容
*/ */
protected function customLog($level, $message) protected function customLog($level, $message)
...@@ -63,7 +66,7 @@ class FixMissedCommission extends Command ...@@ -63,7 +66,7 @@ class FixMissedCommission extends Command
case 'error': case 'error':
$this->output->writeln("<error>{$formattedMessage}</error>"); $this->output->writeln("<error>{$formattedMessage}</error>");
break; break;
case 'warning': case 'warn':
$this->output->writeln("<comment>{$formattedMessage}</comment>"); $this->output->writeln("<comment>{$formattedMessage}</comment>");
break; break;
default: default:
...@@ -84,7 +87,14 @@ class FixMissedCommission extends Command ...@@ -84,7 +87,14 @@ class FixMissedCommission extends Command
protected function execute(Input $input, Output $output) protected function execute(Input $input, Output $output)
{ {
$this->output = $output; $this->output = $output;
// 指定订单ID(可选参数)
$specifiedOrderId = $input->getOption('order_id');
$this->customLog('info', '========== 开始补漏分销商分佣 =========='); $this->customLog('info', '========== 开始补漏分销商分佣 ==========');
if ($specifiedOrderId) {
$this->customLog('info', "指定订单模式: 仅处理订单[{$specifiedOrderId}]");
}
try { try {
$page = 1; $page = 1;
...@@ -92,19 +102,37 @@ class FixMissedCommission extends Command ...@@ -92,19 +102,37 @@ class FixMissedCommission extends Command
$totalCreated = 0; // 新创建的分销订单数 $totalCreated = 0; // 新创建的分销订单数
$totalSettled = 0; // 新结算的奖励数 $totalSettled = 0; // 新结算的奖励数
$totalSkipped = 0; // 已结算跳过的 $totalSkipped = 0; // 已结算跳过的
$totalNoAction = 0; // 无需任何操作的订单(无商品/无分销/无待结算)
// 详情记录:用于最后汇总输出
$createdDetails = []; // 新建分销订单: "订单ID[order_sn] → commission_order_id=X"
$settledDetails = []; // 拨款结算: "订单ID[order_sn] → commission_order_id=X"
$skippedDetails = []; // 已结算跳过: "订单ID[order_sn] → commission_order_id=X (状态)"
$noActionDetails = []; // 无需处理: "订单ID[order_sn] 原因"
while (true) { while (true) {
// 分页查询已完成的订单(排除积分商品订单) // 分页查询已完成的订单(排除积分商品订单 + 已软删除订单
$orders = Db::name('shopro_order') $query = Db::name('shopro_order')
->where('status', 'completed') ->where('status', 'completed')
->where('type', '<>', 'score') ->where('type', '<>', 'score')
->whereNull('deletetime')
->field('id, user_id, order_sn, deduct_score') ->field('id, user_id, order_sn, deduct_score')
->order('id', 'asc') ->order('id', 'asc');
->page($page, self::PAGE_SIZE)
->select(); if ($specifiedOrderId) {
$query->where('id', $specifiedOrderId);
} else {
$query->page($page, self::PAGE_SIZE);
}
$orders = $query->select();
if (empty($orders)) { if (empty($orders)) {
if ($specifiedOrderId) {
$this->customLog('error', "订单[{$specifiedOrderId}]不存在或状态不是已完成(可能已软删除、非商品订单、或未完成)");
} else {
$this->customLog('info', "第{$page}页无数据,遍历结束"); $this->customLog('info', "第{$page}页无数据,遍历结束");
}
break; break;
} }
...@@ -116,6 +144,7 @@ class FixMissedCommission extends Command ...@@ -116,6 +144,7 @@ class FixMissedCommission extends Command
$orderId = $order['id']; $orderId = $order['id'];
$orderUserId = $order['user_id']; $orderUserId = $order['user_id'];
$orderSn = $order['order_sn'] ?? ''; $orderSn = $order['order_sn'] ?? '';
$deductScore = isset($order['deduct_score']) ? intval($order['deduct_score']) : 0;
// 获取订单下所有未退款的商品 // 获取订单下所有未退款的商品
$items = Db::name('shopro_order_item') $items = Db::name('shopro_order_item')
...@@ -125,33 +154,44 @@ class FixMissedCommission extends Command ...@@ -125,33 +154,44 @@ class FixMissedCommission extends Command
->select(); ->select();
if (empty($items)) { if (empty($items)) {
$totalNoAction++;
$noActionDetails[] = "订单[{$orderId}][{$orderSn}] 原因: 无未退款商品";
$this->customLog('warn', "订单[{$orderId}][{$orderSn}]没有未退款商品,跳过(无操作)");
continue; continue;
} }
$this->customLog('info', "━━━ 订单[{$orderId}][{$orderSn}]开始处理 ━━━ 商品数:" . count($items) . " 用户ID:{$orderUserId}" . ($deductScore > 0 ? " 积分抵扣:{$deductScore}" : ""));
// 积分抵扣部分需按比例从佣金基数中扣除 // 积分抵扣部分需按比例从佣金基数中扣除
$deductScore = isset($order['deduct_score']) ? intval($order['deduct_score']) : 0;
$scoreDeductAmount = $deductScore > 0 ? round($deductScore / 100, 2) : 0; $scoreDeductAmount = $deductScore > 0 ? round($deductScore / 100, 2) : 0;
$totalItemsPayFee = 0; $totalItemsPayFee = 0;
if ($scoreDeductAmount > 0) { if ($scoreDeductAmount > 0) {
foreach ($items as $it) { foreach ($items as $it) {
$totalItemsPayFee = bcadd($totalItemsPayFee, $it['pay_fee'], 2); $totalItemsPayFee = bcadd($totalItemsPayFee, $it['pay_fee'], 2);
} }
$this->customLog('info', "订单[{$orderId}][{$orderSn}]积分抵扣金额:{$scoreDeductAmount}元, 商品应付总额:{$totalItemsPayFee}元");
} }
// 第一步:为每个缺失分佣记录的商品创建 commission_order + commission_reward(模拟支付成功流程) // 第一步:为每个缺失分佣记录的商品创建 commission_order + commission_reward(模拟支付成功流程)
$orderStep1Created = 0;
$orderStep1Skipped = 0;
foreach ($items as $item) { foreach ($items as $item) {
$itemId = $item['id']; $itemId = $item['id'];
$goodsTitle = $item['goods_title'] ?? '未知商品';
// 解析 ext 字段,检查 is_commission 标记 // 解析 ext 字段,检查 is_commission 标记
$ext = json_decode($item['ext'], true); $ext = json_decode($item['ext'], true);
if (is_array($ext) && isset($ext['is_commission']) && !$ext['is_commission']) { if (is_array($ext) && isset($ext['is_commission']) && !$ext['is_commission']) {
$this->customLog('info', "订单[{$orderId}][{$orderSn}]商品[{$itemId}]标记为不参与分销,跳过"); $orderStep1Skipped++;
$this->customLog('info', " ├─ 商品[{$itemId}]{$goodsTitle} 标记不参与分销,跳过");
continue; continue;
} }
// 已存在分佣记录则跳过创建 // 已存在分佣记录则跳过创建
$existingCommissionOrder = CommissionOrderModel::where('order_item_id', $itemId)->find(); $existingCommissionOrder = CommissionOrderModel::where('order_item_id', $itemId)->find();
if ($existingCommissionOrder) { if ($existingCommissionOrder) {
$orderStep1Skipped++;
$this->customLog('info', " ├─ 商品[{$itemId}]{$goodsTitle} 已存在分佣记录[{$existingCommissionOrder->id}],跳过");
continue; continue;
} }
...@@ -159,11 +199,14 @@ class FixMissedCommission extends Command ...@@ -159,11 +199,14 @@ class FixMissedCommission extends Command
$item['user_id'] = $orderUserId; $item['user_id'] = $orderUserId;
// 按比例从 pay_fee 中扣减积分抵扣金额 // 按比例从 pay_fee 中扣减积分抵扣金额
$adjustedPayFee = $item['pay_fee'];
if ($scoreDeductAmount > 0 && $totalItemsPayFee > 0) { if ($scoreDeductAmount > 0 && $totalItemsPayFee > 0) {
$itemPayFee = floatval($item['pay_fee']); $itemPayFee = floatval($item['pay_fee']);
$totalPayFee = floatval($totalItemsPayFee); $totalPayFee = floatval($totalItemsPayFee);
$itemScoreDeduction = round($scoreDeductAmount * $itemPayFee / $totalPayFee, 2); $itemScoreDeduction = round($scoreDeductAmount * $itemPayFee / $totalPayFee, 2);
$item['pay_fee'] = round($itemPayFee - $itemScoreDeduction, 2); $adjustedPayFee = round($itemPayFee - $itemScoreDeduction, 2);
$item['pay_fee'] = $adjustedPayFee;
$this->customLog('info', " ├─ 商品[{$itemId}]{$goodsTitle} 原始pay_fee:{$itemPayFee}, 积分抵扣:{$itemScoreDeduction}, 调整后:{$adjustedPayFee}");
} }
try { try {
...@@ -172,60 +215,133 @@ class FixMissedCommission extends Command ...@@ -172,60 +215,133 @@ class FixMissedCommission extends Command
// 检查能否分销 // 检查能否分销
if (!$commission->checkAndSetCommission()) { if (!$commission->checkAndSetCommission()) {
$this->customLog('info', "订单[{$orderId}][{$orderSn}]商品[{$itemId}]不满足分销条件,跳过"); $orderStep1Skipped++;
$this->customLog('warn', " ├─ 商品[{$itemId}]{$goodsTitle} 不满足分销条件,跳过 (核算金额:{$commission->amount})");
continue; continue;
} }
$this->customLog('info', " ├─ 商品[{$itemId}]{$goodsTitle} 核算金额:{$commission->amount} 开始创建分佣...");
// 创建分销订单 // 创建分销订单
$commissionOrder = $commission->createCommissionOrder(); $commissionOrder = $commission->createCommissionOrder();
if (!$commissionOrder) { if (!$commissionOrder) {
$this->customLog('warning', "订单[{$orderId}][{$orderSn}]商品[{$itemId}]创建分销订单失败,跳过"); $orderStep1Skipped++;
$this->customLog('warn', " ├─ 商品[{$itemId}]{$goodsTitle} 创建分销订单失败,跳过");
continue; continue;
} }
// 执行佣金计划(创建 commission_reward 记录) // 执行佣金计划(创建 commission_reward 记录)
$commission->runCommissionPlan($commissionOrder); $commission->runCommissionPlan($commissionOrder);
// 查询创建的分佣奖励记录,输出明细
$rewards = RewardModel::with('agent')->where('commission_order_id', $commissionOrder->id)->select();
$rewardDetails = [];
foreach ($rewards as $reward) {
$agentName = $reward->agent ? ($reward->agent->nickname ?: 'ID:' . $reward->agent_id) : 'ID:' . $reward->agent_id;
$rewardDetails[] = "{$agentName}[{$reward->agent_id}] → {$reward->commission}元 (层级{$reward->commission_level})";
}
$rewardLog = !empty($rewardDetails) ? implode(', ', $rewardDetails) : '无奖励记录';
$orderStep1Created++;
$totalCreated++; $totalCreated++;
$this->customLog('info', "订单[{$orderId}][{$orderSn}]商品[{$itemId}]补建分销订单成功,commission_order_id={$commissionOrder->id}"); $createdDetails[] = "订单[{$orderId}][{$orderSn}] → commission_order_id={$commissionOrder->id} | 分佣: {$rewardLog}";
$this->customLog('info', " ├─ 商品[{$itemId}]{$goodsTitle} ✓ 补建成功 commission_order_id={$commissionOrder->id}");
if (!empty($rewardDetails)) {
foreach ($rewardDetails as $rd) {
$this->customLog('info', " │ 分佣: {$rd}");
}
}
} catch (\Exception $e) { } catch (\Exception $e) {
$this->customLog('error', "订单[{$orderId}][{$orderSn}]商品[{$itemId}]创建分佣记录异常: " . $e->getMessage()); $this->customLog('error', " ├─ 商品[{$itemId}]{$goodsTitle} ✗ 创建分佣异常: " . $e->getMessage()."订单[{$orderId}][{$orderSn}]");
if (function_exists('format_log_error_custom_name')) { if (function_exists('format_log_error_custom_name')) {
format_log_error_custom_name($e, "[FixMissedCommission]创建分佣记录异常", '', 'fix_missed_commission'); format_log_error_custom_name($e, "[FixMissedCommission]创建分佣记录异常", '', 'fix_missed_commission');
} }
} }
} }
// 第一步小结
$this->customLog('info', " └─ 第一步完成: 新建{$orderStep1Created}条, 跳过{$orderStep1Skipped}条");
// 第二步:对订单下所有未结算的分销奖励执行拨款(模拟订单完成流程) // 第二步:对订单下所有未结算的分销奖励执行拨款(模拟订单完成流程)
$commissionOrders = CommissionOrderModel::where('order_id', $orderId)->select(); $commissionOrders = CommissionOrderModel::where('order_id', $orderId)->select();
if (empty($commissionOrders)) { if (empty($commissionOrders)) {
$totalNoAction++;
$noActionDetails[] = "订单[{$orderId}][{$orderSn}] 原因: 无分销订单(无待结算/已结算分佣记录)";
$this->customLog('warn', " └─ 无分销订单,跳过第二步(订单无操作)");
continue; continue;
} }
$this->customLog('info', " ├─ 第二步开始: 共" . count($commissionOrders) . "条分销订单待结算");
$orderStep2Settled = 0;
$orderStep2Skipped = 0;
$rewardService = new RewardService('admin'); // admin 事件不限制 reward_event $rewardService = new RewardService('admin'); // admin 事件不限制 reward_event
foreach ($commissionOrders as $co) { foreach ($commissionOrders as $co) {
$statusText = '';
switch ($co['commission_reward_status']) {
case RewardModel::COMMISSION_REWARD_STATUS_PENDING: $statusText = '待结算'; break;
case 1: $statusText = '已结算'; break;
case -1: $statusText = '已取消'; break;
case -2: $statusText = '已退款'; break;
default: $statusText = "状态[{$co['commission_reward_status']}]";
}
// 仅处理待结算状态,已结算/已退回/已取消的跳过 // 仅处理待结算状态,已结算/已退回/已取消的跳过
if ($co['commission_reward_status'] != RewardModel::COMMISSION_REWARD_STATUS_PENDING) { if ($co['commission_reward_status'] != RewardModel::COMMISSION_REWARD_STATUS_PENDING) {
$orderStep2Skipped++;
$totalSkipped++; $totalSkipped++;
$skippedDetails[] = "订单[{$orderId}][{$orderSn}] → commission_order_id={$co['id']} ({$statusText})";
$this->customLog('info', " │ 分佣单[{$co['id']}] {$statusText}, 跳过");
continue; continue;
} }
try { try {
$result = $rewardService->runCommissionRewardByOrder($co); $result = $rewardService->runCommissionRewardByOrder($co);
if ($result) { if ($result) {
$orderStep2Settled++;
$totalSettled++; $totalSettled++;
$this->customLog('info', "订单[{$orderId}][{$orderSn}]分佣订单[{$co['id']}]拨款成功");
// 查询该分佣单下的奖励记录,输出明细
$rewards = RewardModel::with('agent')->where('commission_order_id', $co['id'])->select();
$rewardDetails = [];
foreach ($rewards as $reward) {
$agentName = $reward->agent ? ($reward->agent->nickname ?: 'ID:' . $reward->agent_id) : 'ID:' . $reward->agent_id;
$rewardDetails[] = "{$agentName}[{$reward->agent_id}] → {$reward->commission}元 (层级{$reward->commission_level})";
}
$rewardLog = !empty($rewardDetails) ? implode(', ', $rewardDetails) : '无奖励记录';
$settledDetails[] = "订单[{$orderId}][{$orderSn}] → commission_order_id={$co['id']} | 拨款: {$rewardLog}";
$this->customLog('info', " │ 分佣单[{$co['id']}] ✓ 拨款成功");
if (!empty($rewardDetails)) {
foreach ($rewardDetails as $rd) {
$this->customLog('info', " │ 拨款: {$rd}");
}
}
} else { } else {
$this->customLog('warning', "订单[{$orderId}][{$orderSn}]分佣订单[{$co['id']}]拨款失败(可能不满足条件)"); $this->customLog('warn', " │ 分佣单[{$co['id']}] 拨款失败(可能不满足 reward_event 条件)");
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$this->customLog('error', "订单[{$orderId}][{$orderSn}]分佣订单[{$co['id']}]拨款异常: " . $e->getMessage()); $this->customLog('error', " │ 分佣单[{$co['id']}] ✗ 拨款异常: " . $e->getMessage());
if (function_exists('format_log_error_custom_name')) { if (function_exists('format_log_error_custom_name')) {
format_log_error_custom_name($e, "[FixMissedCommission]拨款异常", '', 'fix_missed_commission'); format_log_error_custom_name($e, "[FixMissedCommission]拨款异常", '', 'fix_missed_commission');
} }
} }
} }
// 第二步小结
$this->customLog('info', " └─ 第二步完成: 结算{$orderStep2Settled}条, 跳过{$orderStep2Skipped}条");
// 订单处理小结
if ($orderStep1Created > 0 || $orderStep2Settled > 0) {
$this->customLog('info', "━━━ 订单[{$orderId}][{$orderSn}]处理完成 ✓ 新建:{$orderStep1Created} 结算:{$orderStep2Settled} 跳过:{$orderStep1Skipped}+{$orderStep2Skipped} ━━━");
} elseif ($orderStep2Skipped > 0) {
$this->customLog('info', "━━━ 订单[{$orderId}][{$orderSn}]处理完成 - 已有分佣已结算,跳过:{$orderStep1Skipped}+{$orderStep2Skipped} ━━━");
} else {
$totalNoAction++;
$noActionDetails[] = "订单[{$orderId}][{$orderSn}] 原因: 所有商品已有分佣记录或无分销条件";
$this->customLog('info', "━━━ 订单[{$orderId}][{$orderSn}]处理完成 - 无新操作(无需处理),跳过:{$orderStep1Skipped}+{$orderStep2Skipped} ━━━");
}
} }
// 如果本页数量少于分页大小,说明已是最后一页 // 如果本页数量少于分页大小,说明已是最后一页
...@@ -237,8 +353,42 @@ class FixMissedCommission extends Command ...@@ -237,8 +353,42 @@ class FixMissedCommission extends Command
$page++; $page++;
} }
$this->customLog('info', "========== 汇总统计 ==========");
$this->customLog('info', "共处理 {$totalOrders} 个已完成订单"); $this->customLog('info', "共处理 {$totalOrders} 个已完成订单");
$this->customLog('info', "新建分销订单: {$totalCreated}, 拨款结算: {$totalSettled}, 已结算跳过: {$totalSkipped}"); $this->customLog('info', "新建分销订单: {$totalCreated} 条, 拨款结算: {$totalSettled} 条, 已结算跳过: {$totalSkipped} 条, 无需处理: {$totalNoAction} 个订单");
// 输出新建分销订单详情
if (!empty($createdDetails)) {
$this->customLog('info', "--- 新建分销订单({$totalCreated}条) ---");
foreach ($createdDetails as $detail) {
$this->customLog('info', " {$detail}");
}
}
// 输出拨款结算详情
if (!empty($settledDetails)) {
$this->customLog('info', "--- 拨款结算({$totalSettled}条) ---");
foreach ($settledDetails as $detail) {
$this->customLog('info', " {$detail}");
}
}
// 输出已结算跳过详情
if (!empty($skippedDetails)) {
$this->customLog('info', "--- 已结算跳过({$totalSkipped}条) ---");
foreach ($skippedDetails as $detail) {
$this->customLog('info', " {$detail}");
}
}
// 输出无需处理订单详情
if (!empty($noActionDetails)) {
$this->customLog('info', "--- 无需处理订单({$totalNoAction}个) ---");
foreach ($noActionDetails as $detail) {
$this->customLog('info', " {$detail}");
}
}
$this->customLog('info', '========== 补漏分销商分佣完成 =========='); $this->customLog('info', '========== 补漏分销商分佣完成 ==========');
} catch (\Exception $e) { } catch (\Exception $e) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment