User.php 5.9 KB

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