| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- namespace app\models\user;
- use app\admin\model\system\SystemUserAgentLevel;
- use app\models\user\User; // 假设用户表模型为User
- use crmeb\basic\BaseModel;
- use crmeb\traits\ModelTrait;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\DbException;
- use think\db\exception\ModelNotFoundException;
- use think\Model;
- /**
- * 用户代理等级记录模型(对应表:user_agent_level)
- * 作用:管理用户与代理等级的关联关系(有效期、状态等)
- */
- class UserAgentLevel extends BaseModel
- {
- /**
- * 数据表主键
- * @var string
- */
- protected $pk = 'id';
- /**
- * 模型关联的数据表名
- * @var string
- */
- protected $name = 'user_agent_level';
- use ModelTrait;
- /**
- * 设置“有效且未删除”的查询条件
- * @param string $alias 表别名(联查时用)
- * @param Model|null $model 模型实例(可选,用于链式调用)
- * @return UserAgentLevel
- */
- public static function validWhere($alias = '', $model = null)
- {
- $model = is_null($model) ? new self() : $model;
- if ($alias) {
- $model = $model->alias($alias);
- $alias .= '.';
- }
- return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
- }
- /**
- * 为用户设置代理等级(支持“续期”或“新增”)
- * @param int $uid 用户ID
- * @param int $levelId 要设置的代理等级ID
- * @return bool|Model 成功返回模型实例,失败返回false
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws DbException
- */
- public static function setUserAgentLevel($uid, $levelId)
- {
- // 1. 验证代理等级配置是否存在
- $agentLevel = SystemUserAgentLevel::get($levelId);
- if (!$agentLevel) return false;
- // 2. 验证用户是否存在
- $user = User::find($uid);
- if (!$user) return false;
- // 3. 计算有效期(支持“永久”或“按天续期”)
- // $addValidTime = (int)$agentLevel->valid_days * 86400; // 有效天数 → 秒数
- $userAgentInfo = self::validWhere()->where('uid', $uid)->where('level_id', $levelId)->find();
- if ($userAgentInfo) {
- // 若已存在该等级记录:计算剩余有效期并叠加
- $stayTime = 0;
- // if (time() < $userAgentInfo->valid_time) {
- // $stayTime = $userAgentInfo->valid_time - time();
- // }
- // $addValidTime = $stayTime + $addValidTime + time();
- $data = [
- 'is_forever' => $agentLevel->is_forever,
- // 'valid_time' => $addValidTime
- ];
- // 更新用户表的代理等级标识(假设用户表有`agent_level`字段)
- User::where('uid', $uid)->update(['agent_level' => $levelId]);
- return self::where('uid', $uid)->where('level_id', $levelId)->update($data);
- } else {
- // 若不存在该等级记录:新增代理等级关联
- $data = [
- 'is_forever' => $agentLevel->is_forever,
- 'status' => 1,
- 'is_del' => 0,
- 'grade' => $agentLevel->grade,
- 'uid' => $uid,
- 'add_time' => time(),
- 'level_id' => $levelId,
- 'discount' => $agentLevel->discount,
- 'mark' => "用户【{$user['nickname']}】于" . date('Y-m-d H:i:s') . "成为【{$agentLevel['name']}】代理"
- ];
- // if ($data['is_forever']) {
- // $data['valid_time'] = 0; // 永久有效
- // } else {
- // $data['valid_time'] = $addValidTime + time(); // 计算过期时间戳
- // }
- $res = self::create($data);
- if (!$res) return false;
- // 更新用户表的代理等级
- User::where('uid', $uid)->update(['agent_level' => $levelId]);
- return $res;
- }
- }
- /**
- * 获取用户当前“有效代理等级ID”(自动处理过期逻辑)
- * @param int $uid 用户ID
- * @param int $grade 等级排序(用于递归查找更低等级,默认0)
- * @return bool|int 有效等级ID,无则返回false
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws DbException
- */
- public static function getUserAgentLevel($uid, $grade = 0)
- {
- $model = self::validWhere();
- if ($grade) {
- $model = $model->where('grade', '<', $grade);
- }
- $level = $model->where('uid', $uid)
- ->order('grade desc')
- ->field('id, is_forever, status, grade')
- ->find();
- if (!$level) return false;
- if ($level->is_forever) {
- return $level->id; // 永久有效,直接返回
- }
- // 检查是否过期
- // if (time() > $level->valid_time) {
- // if ($level->status == 1) {
- // $level->status = 0; // 标记为“过期”
- // $level->save();
- // }
- // // 递归查找“更低等级”的有效代理等级
- // return self::getUserAgentLevel($uid, $level->grade);
- // } else {
- // return $level->id; // 未过期,返回当前等级
- // }
- }
- /**
- * 获取代理等级详细信息(关联代理等级配置表)
- * @param int $id 用户代理等级记录ID
- * @param string $keyName 需单独获取的字段名(可选,如只取`discount`)
- * @return array|mixed|string|Model|null 等级详情数组,或指定字段值
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws DbException
- */
- public static function getUserAgentLevelInfo($id, $keyName = '')
- {
- $agentInfo = self::validWhere('ual')
- ->where('ual.id', $id)
- ->field('al.id, ual.add_time, al.discount, ual.level_id, al.name, al.direct_rebates, al.icon')
- ->join('system_user_agent_level al', 'ual.level_id = al.id')
- ->find();
- if ($keyName && $agentInfo) {
- return $agentInfo[$keyName] ?? '';
- }
- return $agentInfo;
- }
- /**
- * 获取用户已拥有的“代理等级ID集合”(去重)
- * @param int $uid 用户ID
- * @return array 格式:[等级ID => 等级ID, ...]
- */
- public static function getUserAgentLevelIds($uid)
- {
- return self::validWhere()
- ->group('level_id')
- ->where('uid', $uid)
- ->order('grade asc')
- ->column('level_id', 'level_id');
- }
- }
|