User.php 10 KB

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