Files
huangjingfen/pro_v3.5.1/app/services/hjf/MemberLevelServices.php
mac d0cd7e4667 fix(fsgx): 伞下人数与待释放积分发放链路
- spread/people 增加 umbrellaCount、umbrellaOrderCount;MemberLevelServices 递归统计伞下人数
- 佣金记录页使用新字段展示团队业绩
- 报单积分改由 HjfOrderPayJob 在等级升级后发放,避免 grade=0 时序问题
- PointsRewardServices::reward 按 points_release_log 幂等防重复
- 移除 backOrderBrokerage 内同步 grantFrozenPointsByBrokerage

Made-with: Cursor
2026-03-24 23:27:55 +08:00

163 lines
5.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace app\services\hjf;
use app\services\agent\AgentLevelServices;
use app\services\agent\AgentLevelTaskServices;
use app\services\BaseServices;
use app\services\user\UserServices;
use think\annotation\Inject;
use think\facade\Db;
use think\facade\Log;
/**
* 会员等级升级服务(改造复用版)
*
* 基于 CRMEB Pro 的团队分销等级功能进行改造:
* - 使用 eb_user.agent_level (FK → eb_agent_level.id) 代替独立的 member_level
* - 升级条件通过 eb_agent_level_task 的 type 6/7/8 定义
* - 升级逻辑委托给 AgentLevelServices::checkUserLevelFinish()
*
* 本服务保留为薄封装层,提供 HJF 特有的查询方法供控制器调用。
*
* Class MemberLevelServices
* @package app\services\hjf
*/
class MemberLevelServices extends BaseServices
{
#[Inject]
protected AgentLevelServices $agentLevelServices;
#[Inject]
protected AgentLevelTaskServices $agentLevelTaskServices;
/**
* 检查并执行升级(异步触发入口)
*
* 委托给 CRMEB 的 AgentLevelServices 复用原有升级检测流程,
* 该流程已支持 type 6/7/8 的 HJF 任务类型。
*/
public function checkUpgrade(int $uid): void
{
try {
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->getUserCacheInfo($uid);
if (!$userInfo) {
return;
}
$spreadUid = $userServices->getSpreadUid($uid, $userInfo);
$twoSpreadUid = 0;
if ($spreadUid > 0 && $oneUserInfo = $userServices->getUserCacheInfo($spreadUid)) {
$twoSpreadUid = $userServices->getSpreadUid($spreadUid, $oneUserInfo, false);
}
$uids = array_unique([$uid, $spreadUid, $twoSpreadUid]);
$this->agentLevelServices->checkUserLevelFinish($uid, $uids);
} catch (\Throwable $e) {
Log::error("[MemberLevel] checkUpgrade uid={$uid}: " . $e->getMessage());
}
}
/**
* 获取用户当前会员等级 grade0=普通, 1=创客, 2=云店, 3=服务商, 4=分公司)
*/
public function getUserGrade(int $uid): int
{
$agentLevel = (int)Db::name('user')->where('uid', $uid)->value('agent_level');
return $this->agentLevelServices->getGradeByLevelId($agentLevel);
}
/**
* 获取用户当前等级名称
*/
public function getUserLevelName(int $uid): string
{
$agentLevel = (int)Db::name('user')->where('uid', $uid)->value('agent_level');
if ($agentLevel <= 0) {
return '普通会员';
}
$maps = $this->agentLevelServices->loadHjfUserListLevelMaps();
$info = $this->agentLevelServices->pickHjfLevelRowForUserListDisplay($agentLevel, $maps);
return $info['name'] ?? '普通会员';
}
/**
* 获取直推用户的报单订单数
*/
public function getDirectQueueOrderCount(int $uid): int
{
return $this->agentLevelTaskServices->getDirectQueueOrderCount($uid);
}
/**
* 获取直推人数
*/
public function getDirectSpreadCount(int $uid): int
{
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
return (int)$userServices->count(['spread_uid' => $uid]);
}
/**
* 获取伞下总报单订单数(含业绩分离逻辑)
*/
public function getUmbrellaQueueOrderCount(int $uid): int
{
return $this->agentLevelTaskServices->getUmbrellaQueueOrderCount($uid);
}
/**
* 递归统计伞下总人数DFS最大深度 8 层,不含本人)
*/
public function getUmbrellaMemberCount(int $uid, int $maxDepth = 8): int
{
return $this->recursiveUmbrellaMemberCount($uid, $maxDepth);
}
private function recursiveUmbrellaMemberCount(int $uid, int $remainDepth): int
{
if ($remainDepth <= 0) {
return 0;
}
$children = Db::name('user')
->where('spread_uid', $uid)
->column('uid');
if (empty($children)) {
return 0;
}
$count = count($children);
foreach ($children as $childUid) {
$count += $this->recursiveUmbrellaMemberCount((int)$childUid, $remainDepth - 1);
}
return $count;
}
/**
* 手动设置会员等级(管理后台使用)
*
* @param int $uid 用户 ID
* @param int $grade 目标等级 grade (0-4)
*/
public function setUserLevel(int $uid, int $grade): void
{
$agentLevelId = 0;
if ($grade > 0) {
$agentLevelId = $this->agentLevelServices->getLevelIdByGrade($grade);
if ($agentLevelId <= 0) {
throw new \think\exception\ValidateException("等级 grade={$grade} 在 eb_agent_level 中不存在");
}
}
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userServices->update($uid, ['agent_level' => $agentLevelId]);
Log::info("[MemberLevel] 手动设置 uid={$uid} agent_level={$agentLevelId} (grade={$grade})");
}
}