UserAgentLevel.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace app\models\user;
  3. use app\admin\model\system\SystemUserAgentLevel;
  4. use app\models\user\User; // 假设用户表模型为User
  5. use crmeb\basic\BaseModel;
  6. use crmeb\traits\ModelTrait;
  7. use think\db\exception\DataNotFoundException;
  8. use think\db\exception\DbException;
  9. use think\db\exception\ModelNotFoundException;
  10. use think\Model;
  11. /**
  12. * 用户代理等级记录模型(对应表:user_agent_level)
  13. * 作用:管理用户与代理等级的关联关系(有效期、状态等)
  14. */
  15. class UserAgentLevel extends BaseModel
  16. {
  17. /**
  18. * 数据表主键
  19. * @var string
  20. */
  21. protected $pk = 'id';
  22. /**
  23. * 模型关联的数据表名
  24. * @var string
  25. */
  26. protected $name = 'user_agent_level';
  27. use ModelTrait;
  28. /**
  29. * 设置“有效且未删除”的查询条件
  30. * @param string $alias 表别名(联查时用)
  31. * @param Model|null $model 模型实例(可选,用于链式调用)
  32. * @return UserAgentLevel
  33. */
  34. public static function validWhere($alias = '', $model = null)
  35. {
  36. $model = is_null($model) ? new self() : $model;
  37. if ($alias) {
  38. $model = $model->alias($alias);
  39. $alias .= '.';
  40. }
  41. return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
  42. }
  43. /**
  44. * 为用户设置代理等级(支持“续期”或“新增”)
  45. * @param int $uid 用户ID
  46. * @param int $levelId 要设置的代理等级ID
  47. * @return bool|Model 成功返回模型实例,失败返回false
  48. * @throws DataNotFoundException
  49. * @throws ModelNotFoundException
  50. * @throws DbException
  51. */
  52. public static function setUserAgentLevel($uid, $levelId)
  53. {
  54. // 1. 验证代理等级配置是否存在
  55. $agentLevel = SystemUserAgentLevel::get($levelId);
  56. if (!$agentLevel) return false;
  57. // 2. 验证用户是否存在
  58. $user = User::find($uid);
  59. if (!$user) return false;
  60. // 3. 计算有效期(支持“永久”或“按天续期”)
  61. // $addValidTime = (int)$agentLevel->valid_days * 86400; // 有效天数 → 秒数
  62. $userAgentInfo = self::validWhere()->where('uid', $uid)->where('level_id', $levelId)->find();
  63. if ($userAgentInfo) {
  64. // 若已存在该等级记录:计算剩余有效期并叠加
  65. $stayTime = 0;
  66. // if (time() < $userAgentInfo->valid_time) {
  67. // $stayTime = $userAgentInfo->valid_time - time();
  68. // }
  69. // $addValidTime = $stayTime + $addValidTime + time();
  70. $data = [
  71. 'is_forever' => $agentLevel->is_forever,
  72. // 'valid_time' => $addValidTime
  73. ];
  74. // 更新用户表的代理等级标识(假设用户表有`agent_level`字段)
  75. User::where('uid', $uid)->update(['agent_level' => $levelId]);
  76. return self::where('uid', $uid)->where('level_id', $levelId)->update($data);
  77. } else {
  78. // 若不存在该等级记录:新增代理等级关联
  79. $data = [
  80. 'is_forever' => $agentLevel->is_forever,
  81. 'status' => 1,
  82. 'is_del' => 0,
  83. 'grade' => $agentLevel->grade,
  84. 'uid' => $uid,
  85. 'add_time' => time(),
  86. 'level_id' => $levelId,
  87. 'discount' => $agentLevel->discount,
  88. 'mark' => "用户【{$user['nickname']}】于" . date('Y-m-d H:i:s') . "成为【{$agentLevel['name']}】代理"
  89. ];
  90. // if ($data['is_forever']) {
  91. // $data['valid_time'] = 0; // 永久有效
  92. // } else {
  93. // $data['valid_time'] = $addValidTime + time(); // 计算过期时间戳
  94. // }
  95. $res = self::create($data);
  96. if (!$res) return false;
  97. // 更新用户表的代理等级
  98. User::where('uid', $uid)->update(['agent_level' => $levelId]);
  99. return $res;
  100. }
  101. }
  102. /**
  103. * 获取用户当前“有效代理等级ID”(自动处理过期逻辑)
  104. * @param int $uid 用户ID
  105. * @param int $grade 等级排序(用于递归查找更低等级,默认0)
  106. * @return bool|int 有效等级ID,无则返回false
  107. * @throws DataNotFoundException
  108. * @throws ModelNotFoundException
  109. * @throws DbException
  110. */
  111. public static function getUserAgentLevel($uid, $grade = 0)
  112. {
  113. $model = self::validWhere();
  114. if ($grade) {
  115. $model = $model->where('grade', '<', $grade);
  116. }
  117. $level = $model->where('uid', $uid)
  118. ->order('grade desc')
  119. ->field('id, is_forever, status, grade')
  120. ->find();
  121. if (!$level) return false;
  122. if ($level->is_forever) {
  123. return $level->id; // 永久有效,直接返回
  124. }
  125. // 检查是否过期
  126. // if (time() > $level->valid_time) {
  127. // if ($level->status == 1) {
  128. // $level->status = 0; // 标记为“过期”
  129. // $level->save();
  130. // }
  131. // // 递归查找“更低等级”的有效代理等级
  132. // return self::getUserAgentLevel($uid, $level->grade);
  133. // } else {
  134. // return $level->id; // 未过期,返回当前等级
  135. // }
  136. }
  137. /**
  138. * 获取代理等级详细信息(关联代理等级配置表)
  139. * @param int $id 用户代理等级记录ID
  140. * @param string $keyName 需单独获取的字段名(可选,如只取`discount`)
  141. * @return array|mixed|string|Model|null 等级详情数组,或指定字段值
  142. * @throws DataNotFoundException
  143. * @throws ModelNotFoundException
  144. * @throws DbException
  145. */
  146. public static function getUserAgentLevelInfo($id, $keyName = '')
  147. {
  148. $agentInfo = self::validWhere('ual')
  149. ->where('ual.id', $id)
  150. ->field('al.id, ual.add_time, al.discount, ual.level_id, al.name, al.direct_rebates, al.icon')
  151. ->join('system_user_agent_level al', 'ual.level_id = al.id')
  152. ->find();
  153. if ($keyName && $agentInfo) {
  154. return $agentInfo[$keyName] ?? '';
  155. }
  156. return $agentInfo;
  157. }
  158. /**
  159. * 获取用户已拥有的“代理等级ID集合”(去重)
  160. * @param int $uid 用户ID
  161. * @return array 格式:[等级ID => 等级ID, ...]
  162. */
  163. public static function getUserAgentLevelIds($uid)
  164. {
  165. return self::validWhere()
  166. ->group('level_id')
  167. ->where('uid', $uid)
  168. ->order('grade asc')
  169. ->column('level_id', 'level_id');
  170. }
  171. }