User.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. /**
  3. *
  4. * @copyright ©2020 点小铺
  5. * @author hanj
  6. * @link: https://dyuit.com
  7. * Created by VSCode
  8. */
  9. namespace app\store\model;
  10. use app\common\model\User as UserModel;
  11. use app\store\model\dealer\User as DealerUserModel;
  12. use app\store\model\user\GradeLog as GradeLogModel;
  13. use app\store\model\user\PointsLog as PointsLogModel;
  14. use app\store\model\user\BalanceLog as BalanceLogModel;
  15. use app\common\enum\user\balanceLog\Scene as SceneEnum;
  16. use app\common\enum\user\grade\log\ChangeType as ChangeTypeEnum;
  17. use app\common\library\helper;
  18. /**
  19. * 用户模型
  20. * Class User
  21. * @package app\store\model
  22. */
  23. class User extends UserModel
  24. {
  25. /**
  26. * 获取当前用户总数
  27. * @param null $day
  28. * @return int|string
  29. * @throws \think\Exception
  30. */
  31. public function getUserTotal($day = null)
  32. {
  33. if (!is_null($day)) {
  34. $startTime = strtotime($day);
  35. $this->where('create_time', '>=', $startTime)
  36. ->where('create_time', '<', $startTime + 86400);
  37. }
  38. return $this->where('is_delete', '=', '0')->count();
  39. }
  40. /**
  41. * 获取用户列表
  42. * @param string $nickName 昵称
  43. * @param int $gender 性别
  44. * @param int $grade 会员等级
  45. * @return \think\Paginator
  46. * @throws \think\exception\DbException
  47. */
  48. public function getList($nickName = '', $gender = -1, $grade = null)
  49. {
  50. // 检索:微信昵称
  51. !empty($nickName) && $this->where('nickName', 'like', "%$nickName%");
  52. // 检索:性别
  53. if ($gender !== '' && $gender > -1) {
  54. $this->where('gender', '=', (int)$gender);
  55. }
  56. // 检索:会员等级
  57. $grade > 0 && $this->where('grade_id', '=', (int)$grade);
  58. // 获取用户列表
  59. return $this->with(['grade'])
  60. ->where('is_delete', '=', '0')
  61. ->order(['create_time' => 'desc'])
  62. ->paginate(15, false, [
  63. 'query' => \request()->request()
  64. ]);
  65. }
  66. /**
  67. * 删除用户
  68. * @return bool|mixed
  69. */
  70. public function setDelete()
  71. {
  72. // 判断是否为分销商
  73. if (DealerUserModel::isDealerUser($this['user_id'])) {
  74. $this->error = '当前用户为分销商,不可删除';
  75. return false;
  76. }
  77. return $this->transaction(function () {
  78. // 删除用户推荐关系
  79. (new DealerUserModel)->onDeleteReferee($this['user_id']);
  80. // 标记为已删除
  81. return $this->save(['is_delete' => 1]);
  82. });
  83. }
  84. /**
  85. * 用户充值
  86. * @param string $storeUserName 当前操作人用户名
  87. * @param int $source 充值类型
  88. * @param array $data post数据
  89. * @return bool
  90. */
  91. public function recharge($storeUserName, $source, $data)
  92. {
  93. if ($source == 0) {
  94. return $this->rechargeToBalance($storeUserName, $data['balance']);
  95. } elseif ($source == 1) {
  96. return $this->rechargeToPoints($storeUserName, $data['points']);
  97. }
  98. return false;
  99. }
  100. /**
  101. * 用户充值:余额
  102. * @param $storeUserName
  103. * @param $data
  104. * @return bool
  105. */
  106. private function rechargeToBalance($storeUserName, $data)
  107. {
  108. if (!isset($data['money']) || $data['money'] === '' || $data['money'] < 0) {
  109. $this->error = '请输入正确的金额';
  110. return false;
  111. }
  112. // 判断充值方式,计算最终金额
  113. if ($data['mode'] === 'inc') {
  114. $diffMoney = $data['money'];
  115. } elseif ($data['mode'] === 'dec') {
  116. $diffMoney = -$data['money'];
  117. } else {
  118. $diffMoney = helper::bcsub($data['money'], $this['balance']);
  119. }
  120. // 更新记录
  121. $this->transaction(function () use ($storeUserName, $data, $diffMoney) {
  122. // 更新账户余额
  123. $this->setInc('balance', $diffMoney);
  124. // 新增余额变动记录
  125. BalanceLogModel::add(SceneEnum::ADMIN, [
  126. 'user_id' => $this['user_id'],
  127. 'money' => $diffMoney,
  128. 'remark' => $data['remark'],
  129. ], [$storeUserName]);
  130. });
  131. return true;
  132. }
  133. /**
  134. * 用户充值:积分
  135. * @param $storeUserName
  136. * @param $data
  137. * @return bool
  138. */
  139. private function rechargeToPoints($storeUserName, $data)
  140. {
  141. if (!isset($data['value']) || $data['value'] === '' || $data['value'] < 0) {
  142. $this->error = '请输入正确的积分数量';
  143. return false;
  144. }
  145. // 判断充值方式,计算最终积分
  146. if ($data['mode'] === 'inc') {
  147. $diffMoney = $data['value'];
  148. } elseif ($data['mode'] === 'dec') {
  149. $diffMoney = -$data['value'];
  150. } else {
  151. $diffMoney = $data['value'] - $this['points'];
  152. }
  153. // 更新记录
  154. $this->transaction(function () use ($storeUserName, $data, $diffMoney) {
  155. // 更新账户积分
  156. $this->setInc('points', $diffMoney);
  157. // 新增积分变动记录
  158. PointsLogModel::add([
  159. 'user_id' => $this['user_id'],
  160. 'value' => $diffMoney,
  161. 'describe' => "后台管理员 [{$storeUserName}] 操作",
  162. 'remark' => $data['remark'],
  163. ]);
  164. });
  165. return true;
  166. }
  167. /**
  168. * 修改用户等级
  169. * @param $data
  170. * @return mixed
  171. */
  172. public function updateGrade($data)
  173. {
  174. // 变更前的等级id
  175. $oldGradeId = $this['grade_id'];
  176. return $this->transaction(function () use ($oldGradeId, $data) {
  177. // 更新用户的等级
  178. $status = $this->save(['grade_id' => $data['grade_id']]);
  179. // 新增用户等级修改记录
  180. if ($status) {
  181. (new GradeLogModel)->record([
  182. 'user_id' => $this['user_id'],
  183. 'old_grade_id' => $oldGradeId,
  184. 'new_grade_id' => $data['grade_id'],
  185. 'change_type' => ChangeTypeEnum::ADMIN_USER,
  186. 'remark' => $data['remark']
  187. ]);
  188. }
  189. return $status !== false;
  190. });
  191. }
  192. /**
  193. * 消减用户的实际消费金额
  194. * @param $userId
  195. * @param $expendMoney
  196. * @return int|true
  197. * @throws \think\Exception
  198. */
  199. public function setDecUserExpend($userId, $expendMoney)
  200. {
  201. return $this->where(['user_id' => $userId])->setDec('expend_money', $expendMoney);
  202. }
  203. }