feat(fsgx): 完成全部24项开发任务 Phase1-7

Phase1 后端核心:
- 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess)
- SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机)
- StoreOrderCreateServices 周期循环佣金计算
- StoreOrderTakeServices 佣金发放后同步冻结积分
- StoreProductServices/StoreProduct 保存 is_queue_goods

Phase2 后端接口:
- GET /api/hjf/brokerage/progress 佣金周期进度
- GET /api/hjf/assets/overview 资产总览
- HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务
- PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口
- GET /adminapi/hjf/points/release_log 积分日志接口

Phase3 前端清理:
- hjfCustom.js 路由精简(仅保留 points/log)
- hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口
- pages.json 公排→推荐佣金/佣金记录/佣金规则

Phase4-5 前端改造:
- queue/status.vue 推荐佣金进度页整体重写
- 商品详情/订单确认/支付结果页文案与逻辑改造
- 个人中心/资产页/引导页/规则页文案改造
- HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造
- 推广中心嵌入佣金进度摘要
- hjfMockData.js 全量更新(公排字段→佣金字段)

Phase6 Admin 增强:
- 用户列表新增 frozen_points/available_points 列及不考核操作按钮
- hjfPoints.js USE_MOCK=false 对接真实积分日志接口

Phase7 配置文档:
- docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单

Made-with: Cursor
This commit is contained in:
apple
2026-03-23 22:32:19 +08:00
parent 788ee0c0c0
commit 434aa8c69d
13098 changed files with 2008990 additions and 961 deletions

View File

@@ -294,12 +294,55 @@ class StoreOrderTakeServices extends BaseServices
$res2 = $userServices->bcInc($one_spread_uid, 'brokerage_price', $brokeragePrice, 'uid');
//给上级发送获得佣金的模板消息
$this->sendBackOrderBrokerage($orderInfo, $one_spread_uid, $brokeragePrice);
// fsgx: 若推荐人有分销等级(创客及以上),在佣金发放时同步发放积分到 frozen_points
$this->grantFrozenPointsByBrokerage($one_spread_uid, $brokeragePrice, $orderInfo);
// 一级返佣成功 跳转二级返佣
$res = $res1 && $res2 && $this->backOrderBrokerageTwo($orderInfo, $userInfo, $isSelfBrokerage, $frozen_time);
return $res;
}
/**
* fsgx: 佣金发放后,根据推荐人分销等级给予待释放积分奖励
* 积分奖励规则每获得1元佣金发放100积分到 frozen_points可在后台配置调整
* @param int $spreadUid 推荐人uid
* @param string|float $brokeragePrice 本次佣金金额
* @param array $orderInfo 订单信息
*/
protected function grantFrozenPointsByBrokerage(int $spreadUid, $brokeragePrice, array $orderInfo): void
{
try {
if ($spreadUid <= 0 || $brokeragePrice <= 0) return;
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$spreadUser = $userServices->get($spreadUid, ['uid', 'agent_level', 'frozen_points']);
// 只有拥有分销等级(创客及以上 agent_level > 0的用户才获得积分
if (!$spreadUser || (int)($spreadUser['agent_level'] ?? 0) <= 0) return;
// 积分换算每1元佣金 → 100积分可通过后台配置 brokerage_points_ratio 调整
$pointsRatio = (int)sys_config('brokerage_points_ratio', 100);
$points = (int)bcmul((string)$brokeragePrice, (string)$pointsRatio, 0);
if ($points <= 0) return;
// 写入 frozen_points
$userServices->bcInc($spreadUid, 'frozen_points', $points, 'uid');
// 写积分日志(使用 UserBill
/** @var \app\services\user\UserBillServices $userBillServices */
$userBillServices = app()->make(\app\services\user\UserBillServices::class);
$userBillServices->income('frozen_points_brokerage', $spreadUid, [
'number' => $points,
'mark' => '推荐佣金赠积分,订单号:' . ($orderInfo['order_id'] ?? ''),
'balance' => (int)(($spreadUser['frozen_points'] ?? 0) + $points),
'type' => 'integral',
'title' => '推荐佣金',
'pm' => 1,
], (int)(($spreadUser['frozen_points'] ?? 0) + $points), $orderInfo['id'] ?? 0);
} catch (\Throwable $e) {
// 积分发放失败不影响主流程
\think\facade\Log::error('fsgx grantFrozenPointsByBrokerage error: ' . $e->getMessage());
}
}
/**
* 二级推广返佣
* @param $orderInfo