feat(fsgx): HJF queue merge, brokerage timing, cycle commission, points release

- Add HJF jobs, services, DAOs, models, admin/API controllers, release command
- Respect brokerage_timing (on_pay vs confirm); dispatch HjfOrderPayJob for queue goods
- Queue-only cycle commission and position index fix in StoreOrderCreateServices
- UserBill income types: frozen_points_brokerage, frozen_points_release
- Timer: fsgx_release_frozen_points -> PointsReleaseServices
- Agent tasks: no_assess filtering for direct/umbrella counts
- Migrations: queue_pool, points_release_log, fsgx_v1 checklist updates
- Admin/uniapp: crontab preset, membership level, user list, finance routes, docs

Made-with: Cursor
This commit is contained in:
apple
2026-03-24 11:59:09 +08:00
parent 434aa8c69d
commit 76ccb24679
59 changed files with 2902 additions and 237 deletions

View File

@@ -954,7 +954,11 @@ class StoreOrderCreateServices extends BaseServices
} else {
$is_brokerage = $productInfo['is_brokerage'] ?? 0;
}
if ($is_brokerage == 0) {
// fsgx: is_queue_goods=1 的报单商品,即使 is_brokerage=0 也参与周期佣金计算
$isQueueGoodsProduct = (int)($productInfo['is_queue_goods'] ?? 0);
$brokerageScopeCheck = sys_config('brokerage_scope', 'all');
$queueGoodsBypassBrokerage = ($brokerageScopeCheck === 'queue_only' && $isQueueGoodsProduct === 1);
if ($is_brokerage == 0 && !$queueGoodsBypassBrokerage) {
continue;
}
//指定返佣金额
@@ -999,7 +1003,7 @@ class StoreOrderCreateServices extends BaseServices
if ($useCycleBrokerage && $spread_uid > 0) {
// 统计推荐人下级已完成的有效报单商品订单数,取模得到当前位次
// is_queue_goods 冗余存储在订单表eb_store_order由创建订单时写入
// 注意compute() 在 paid=1 之后执行,当前订单已被计入,需 -1 得到"之前完成单数"
/** @var \app\dao\order\StoreOrderDao $orderDao */
$orderDao = app()->make(\app\dao\order\StoreOrderDao::class);
$completedCount = $orderDao->count([
@@ -1008,7 +1012,7 @@ class StoreOrderCreateServices extends BaseServices
'paid' => 1,
'is_del' => 0,
]);
$position = $completedCount % $cycleCount;
$position = max(0, $completedCount - 1) % $cycleCount;
$cycleRatePercent = isset($cycleRates[$position]) ? (int)$cycleRates[$position] : (int)($cycleRates[0] ?? 0);
if ($cycleRatePercent > 0) {
$brokerageRatio = bcdiv((string)$cycleRatePercent, 100, 4);