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'); } }