User.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. namespace app\shop\model\user;
  3. use app\common\model\user\UserTag as UserTagModel;
  4. use app\shop\model\user\GradeLog as GradeLogModel;
  5. use app\shop\model\user\BalanceLog as BalanceLogModel;
  6. use app\common\model\user\User as UserModel;
  7. use app\common\enum\user\grade\ChangeTypeEnum;
  8. use app\common\enum\user\balanceLog\BalanceLogSceneEnum as SceneEnum;
  9. use app\shop\model\user\PointsLog as PointsLogModel;
  10. use app\shop\model\plus\agent\User as AgentUserModel;
  11. /**
  12. * 用户模型
  13. */
  14. class User extends UserModel
  15. {
  16. /**
  17. * 获取当前用户总数
  18. */
  19. public function getUserTotal($day = null)
  20. {
  21. $model = $this;
  22. if (!is_null($day)) {
  23. $startTime = strtotime($day);
  24. $model = $model->where('create_time', '>=', $startTime)
  25. ->where('create_time', '<', $startTime + 86400);
  26. }
  27. return $model->where('is_delete', '=', '0')->count();
  28. }
  29. /**
  30. * 获取用户id
  31. * @return \think\Collection
  32. */
  33. public function getUsers($where = null)
  34. {
  35. // 获取用户列表
  36. return $this->where('is_delete', '=', '0')
  37. ->where($where)
  38. ->order(['user_id' => 'asc'])
  39. ->field(['user_id'])
  40. ->select();
  41. }
  42. /**
  43. * 获取用户列表
  44. */
  45. public static function getList($nickName, $grade_id, $reg_date, $gender, $params)
  46. {
  47. $model = new static();
  48. //检索:用户名
  49. if (!empty($nickName)) {
  50. $model = $model->where('user.nickName', 'like', '%' . $nickName . '%');
  51. }
  52. // 检索:会员等级
  53. if ($grade_id > 0) {
  54. $model = $model->where('user.grade_id', '=', (int)$grade_id);
  55. }
  56. //检索:注册时间
  57. if (!empty($reg_date[0])) {
  58. $model = $model->whereTime('user.create_time', 'between', $reg_date);
  59. }
  60. // 检索:性别
  61. if (!empty($gender) && $gender > -1) {
  62. $model = $model->where('user.gender', '=', (int)$gender);
  63. }
  64. // 检索:标签
  65. if (!empty($params['tag_id']) && $params['tag_id'] > 0) {
  66. $model = $model->where('tag.tag_id', '=', (int)$params['tag_id']);
  67. }
  68. // 获取用户列表
  69. return $model->alias('user')->with(['grade'])->distinct(true)->field(['user.*'])
  70. ->where('user.is_delete', '=', '0')
  71. ->join('user_tag tag', 'user.user_id = tag.user_id','left')
  72. ->order(['user.create_time' => 'desc'])
  73. ->hidden(['open_id', 'union_id'])
  74. ->paginate($params);
  75. }
  76. /**
  77. * 软删除
  78. */
  79. public function setDelete()
  80. {
  81. // 判断是否为分销商
  82. if (AgentUserModel::isAgentUser($this['user_id'])) {
  83. $this->error = '当前用户为分销商,不可删除';
  84. return false;
  85. }
  86. return $this->transaction(function () {
  87. // 删除用户推荐关系
  88. (new AgentUserModel)->onDeleteReferee($this['user_id']);
  89. // 标记为已删除
  90. return $this->save(['is_delete' => 1]);
  91. });
  92. }
  93. /**
  94. * 新增记录
  95. */
  96. public function add($data)
  97. {
  98. return $this->save($data);
  99. }
  100. /**
  101. * 修改记录
  102. */
  103. public function edit($data)
  104. {
  105. $data['create_time'] = strtotime($data['create_time']);
  106. $data['update_time'] = time();
  107. return $this->save($data);
  108. }
  109. /**
  110. * 修改用户等级
  111. */
  112. public function updateGrade($data)
  113. {
  114. if (!isset($data['remark'])) {
  115. $data['remark'] = '';
  116. }
  117. // 变更前的等级id
  118. $oldGradeId = $this['grade_id'];
  119. return $this->transaction(function () use ($oldGradeId, $data) {
  120. // 更新用户的等级
  121. $status = $this->save(['grade_id' => $data['grade_id']]);
  122. // 新增用户等级修改记录
  123. if ($status) {
  124. (new GradeLogModel)->save([
  125. 'user_id' => $this['user_id'],
  126. 'old_grade_id' => $oldGradeId,
  127. 'new_grade_id' => $data['grade_id'],
  128. 'change_type' => ChangeTypeEnum::ADMIN_USER,
  129. 'remark' => $data['remark'],
  130. 'app_id' => $this['app_id']
  131. ]);
  132. }
  133. return $status !== false;
  134. });
  135. }
  136. /**
  137. * 消减用户的实际消费金额
  138. */
  139. public function setDecUserExpend($userId, $expendMoney)
  140. {
  141. return $this->where(['user_id' => $userId])->dec('expend_money', $expendMoney)->update();
  142. }
  143. /**
  144. * 用户充值
  145. */
  146. public function recharge($storeUserName, $source, $data)
  147. {
  148. if ($source == 0) {
  149. return $this->rechargeToBalance($storeUserName, $data['balance']);
  150. } elseif ($source == 1) {
  151. return $this->rechargeToPoints($storeUserName, $data['points']);
  152. }
  153. return false;
  154. }
  155. /**
  156. * 用户充值:余额
  157. */
  158. private function rechargeToBalance($storeUserName, $data)
  159. {
  160. if (!isset($data['money']) || $data['money'] === '' || $data['money'] < 0) {
  161. $this->error = '请输入正确的金额';
  162. return false;
  163. }
  164. // 判断充值方式,计算最终金额
  165. $money = 0;
  166. if ($data['mode'] === 'inc') {
  167. $diffMoney = $this['balance'] + $data['money'];
  168. $money = $data['money'];
  169. } elseif ($data['mode'] === 'dec') {
  170. $diffMoney = $this['balance'] - $data['money'] <= 0 ? 0 : $this['balance'] - $data['money'];
  171. $money = -$data['money'];
  172. } else {
  173. $diffMoney = $data['money'];
  174. $money = $diffMoney - $this['balance'];
  175. }
  176. // 更新记录
  177. $this->transaction(function () use ($storeUserName, $data, $diffMoney, $money) {
  178. // 更新账户余额
  179. $this->where('user_id', '=', $this['user_id'])->update(['balance' => $diffMoney]);
  180. // 新增余额变动记录
  181. BalanceLogModel::add(SceneEnum::ADMIN, [
  182. 'user_id' => $this['user_id'],
  183. 'money' => $money,
  184. 'remark' => $data['remark'],
  185. ], [$storeUserName]);
  186. });
  187. return true;
  188. }
  189. /**
  190. * 用户充值:积分
  191. */
  192. private function rechargeToPoints($storeUserName, $data)
  193. {
  194. if (!isset($data['value']) || $data['value'] === '' || $data['value'] < 0) {
  195. $this->error = '请输入正确的积分数量';
  196. return false;
  197. }
  198. $points = 0;
  199. // 判断充值方式,计算最终积分
  200. if ($data['mode'] === 'inc') {
  201. $diffMoney = $this['points'] + $data['value'];
  202. $points = $data['value'];
  203. } elseif ($data['mode'] === 'dec') {
  204. $diffMoney = $this['points'] - $data['value'] <= 0 ? 0 : $this['points'] - $data['value'];
  205. $points = -$data['value'];
  206. } else {
  207. $diffMoney = $data['value'];
  208. $points = $data['value'] - $this['points'];
  209. }
  210. // 更新记录
  211. $this->transaction(function () use ($storeUserName, $data, $diffMoney, $points) {
  212. $totalPoints = $this['total_points'] + $points <= 0? 0 : $this['total_points'] + $points;
  213. // 更新账户积分
  214. $this->where('user_id', '=', $this['user_id'])->update([
  215. 'points' => $diffMoney,
  216. 'total_points' => $totalPoints
  217. ]);
  218. // 新增积分变动记录
  219. PointsLogModel::add([
  220. 'user_id' => $this['user_id'],
  221. 'value' => $points,
  222. 'describe' => "后台管理员 [{$storeUserName}] 操作",
  223. 'remark' => $data['remark'],
  224. ]);
  225. });
  226. event('UserGrade', $this['user_id']);
  227. return true;
  228. }
  229. /**
  230. * 获取用户统计数量
  231. */
  232. public function getUserData($startDate = null, $endDate = null, $type)
  233. {
  234. $model = $this;
  235. if(!is_null($startDate)){
  236. $model = $model->where('create_time', '>=', strtotime($startDate));
  237. }
  238. if(is_null($endDate)){
  239. $model = $model->where('create_time', '<', strtotime($startDate) + 86400);
  240. }else{
  241. $model = $model->where('create_time', '<', strtotime($endDate) + 86400);
  242. }
  243. if($type == 'user_total' || $type == 'user_add'){
  244. return $model->count();
  245. } else if($type == 'user_pay'){
  246. return $model->where('pay_money', '>', '0')->count();
  247. } else if($type == 'user_no_pay'){
  248. return $model->where('pay_money', '=', '0')->count();
  249. }
  250. return 0;
  251. }
  252. public function editTag($data){
  253. // 删除所有标签
  254. (new UserTagModel())->where('user_id', '=', $this['user_id'])
  255. ->delete();
  256. $tag_list = [];
  257. foreach ($data['checkedTag'] as $val) {
  258. $tag_list[] = [
  259. 'user_id' => $this['user_id'],
  260. 'tag_id' => $val,
  261. 'app_id' => self::$app_id
  262. ];
  263. }
  264. return (new UserTagModel())->saveAll($tag_list);
  265. }
  266. }