Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
loveisland
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘小敏
loveisland
Commits
8c0ecfc3
Commit
8c0ecfc3
authored
Jul 09, 2026
by
刘小敏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(command): 增强修复佣金脚本并移除订单软删除查询
增强 FixMissedCommission 脚本,支持指定订单ID参数, 排除软删除订单,完善日志明细与汇总统计; 同时移除后台订单列表中不必要的 withTrashed 查询, 并更新 .gitignore 忽略规则。
parent
03afae08
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
326 additions
and
27 deletions
+326
-27
.gitignore
.gitignore
+1
-2
Order.php
application/admin/controller/shopro/order/Order.php
+3
-3
FixMissedCommission.md
application/command/FixMissedCommission.md
+150
-0
FixMissedCommission.php
application/command/FixMissedCommission.php
+172
-22
No files found.
.gitignore
View file @
8c0ecfc3
...
@@ -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
application/admin/controller/shopro/order/Order.php
View file @
8c0ecfc3
...
@@ -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
();
...
...
application/command/FixMissedCommission.md
0 → 100644
View file @
8c0ecfc3
## 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
application/command/FixMissedCommission.php
View file @
8c0ecfc3
...
@@ -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
'warn
ing
'
:
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
))
{
$this
->
customLog
(
'info'
,
"第
{
$page
}
页无数据,遍历结束"
);
if
(
$specifiedOrderId
)
{
$this
->
customLog
(
'error'
,
"订单[
{
$specifiedOrderId
}
]不存在或状态不是已完成(可能已软删除、非商品订单、或未完成)"
);
}
else
{
$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,63 +215,136 @@ class FixMissedCommission extends Command
...
@@ -172,63 +215,136 @@ 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
);
$totalCreated
++
;
// 查询创建的分佣奖励记录,输出明细
$this
->
customLog
(
'info'
,
"订单[
{
$orderId
}
][
{
$orderSn
}
]商品[
{
$itemId
}
]补建分销订单成功,commission_order_id=
{
$commissionOrder
->
id
}
"
);
$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
++
;
$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
(
'warn
ing'
,
"订单[
{
$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
}
━━━"
);
}
}
}
// 如果本页数量少于分页大小,说明已是最后一页
// 如果本页数量少于分页大小,说明已是最后一页
if
(
$pageTotal
<
self
::
PAGE_SIZE
)
{
if
(
$pageTotal
<
self
::
PAGE_SIZE
)
{
$this
->
customLog
(
'info'
,
"第
{
$page
}
页数据不足分页大小,已是最后一页"
);
$this
->
customLog
(
'info'
,
"第
{
$page
}
页数据不足分页大小,已是最后一页"
);
break
;
break
;
...
@@ -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
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment