Score.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. namespace app\api\controller;
  3. use app\admin\model\MessageCategory;
  4. use app\admin\model\Message as MessageModel;
  5. use app\admin\model\Prize;
  6. use app\admin\model\PrizeLog;
  7. use app\admin\model\User as ModelUser;
  8. use app\admin\model\UserAddress;
  9. use app\admin\model\UserScoreLog;
  10. use app\common\controller\Api;
  11. use think\Db;
  12. use think\exception\ErrorException;
  13. /**
  14. * 积分抽奖
  15. * @ApiWeigh (5)
  16. * @package app\api\controller
  17. */
  18. class Score extends Api
  19. {
  20. protected $noNeedLogin = [];
  21. protected $noNeedRight = ['*'];
  22. /**
  23. * 我的积分
  24. * @ApiMethod (GET)
  25. * @ApiParams (name=limit,type="int", required=false,description="每页数量")
  26. * @ApiParams (name=page,type="int", required=false,description="页数")
  27. * @ApiReturnParams (name="user_score", type="int", required=true, description="用户可用积分")
  28. * @ApiReturnParams (name="score_rule", type="string", required=true, description="积分规则")
  29. * @ApiReturnParams (name="list.memo", type="string", required=true, description="描述")
  30. * @ApiReturnParams (name="list.score_str", type="string", required=true, description="积分值带符号")
  31. * @ApiReturnParams (name="list.createtime", type="int", required=true, description="时间")
  32. * @ApiReturn ({"code":1,"msg":"ok","time":"1672199644","data":{"user_score":1,"score_rule": "积分规则说明","list":{"total":1,"per_page":15,"current_page":1,"last_page":1,"data":[{"id":1,"user_id":3,"score":1,"before":0,"after":1,"memo":"注册奖励","createtime":1672198496,"score_str":"+1"}]}}})
  33. */
  34. public function my_score()
  35. {
  36. $page = input('page', 1);
  37. $limit = input('limit');
  38. $user_id = $this->auth->id;
  39. $user_score_model = new UserScoreLog();
  40. $query = $user_score_model->where('user_id', $user_id)->order('id', 'desc');
  41. $list = $query->paginate($limit, false, ['page' => $page]);
  42. foreach ($list as &$v) {
  43. if ($v['after'] - $v['before'] > 0) {
  44. $v['score_str'] = '+' . $v['score'];
  45. } else {
  46. $v['score_str'] = '-' . $v['score'];
  47. }
  48. }
  49. $this->success('ok', ['user_score' => $this->auth->score, 'score_rule' => config('site.score_rule'), 'list' => $list]);
  50. }
  51. /**
  52. * 获取积分抽奖数据
  53. * @ApiMethod (GET)
  54. * @ApiReturnParams (name="user_score", type="int", required=true, description="用户可用积分")
  55. * @ApiReturnParams (name="one_prize_score", type="int", required=true, description="单次抽奖所需积分")
  56. * @ApiReturnParams (name="score_rule", type="string", required=true, description="积分抽奖规则")
  57. * @ApiReturnParams (name="list.name", type="string", required=true, description="奖品名称")
  58. * @ApiReturnParams (name="list.type", type="int", required=true, description="奖品类型:1=实物,2=积分,3=空奖")
  59. * @ApiReturnParams (name="list.image", type="string", required=true, description="图片")
  60. * @ApiReturn ({"code":1,"msg":"ok","time":"1672208267","data":{"user_score":10,"score_prize_rule":"积分抽奖规则说明","one_prize_score":"5","list":[{"id":6,"name":"100","image":"/assets/img/qrcode.png","win_rate":10,"type":2,"weigh":1,"status":1,"createtime":1672206758,"updatetime":1672207256,"deletetime":null,"type_text":"Type 2","status_text":"Status 1"}]}})
  61. */
  62. public function prize_list()
  63. {
  64. $prize_model = new Prize();
  65. $list = $prize_model->where('status', 1)->order('weigh', 'desc')->limit(6)->select();
  66. // 奖品不够,或者未设置抽奖扣除积分
  67. if (count($list) < 6 || !config('site.one_prize_score')) {
  68. $this->error('系统设置中');
  69. }
  70. $this->success('ok', ['user_score' => $this->auth->score, 'score_prize_rule' => config('site.score_prize_rule'), 'one_prize_score' => config('site.one_prize_score'), 'list' => $list]);
  71. }
  72. /**
  73. * 立即抽奖
  74. * @ApiMethod (POST)
  75. * @ApiReturnParams (name="name", type="string", required=true, description="奖品名称")
  76. * @ApiReturnParams (name="type", type="int", required=true, description="奖品类型:1=实物,2=积分,3=空奖")
  77. * @ApiReturnParams (name="image", type="string", required=true, description="图片")
  78. * @ApiReturnParams (name="score", type="int", required=true, description="积分")
  79. * @ApiReturnParams (name="prize_log", type="int", required=true, description="中奖记录,type=1实物需要填地址")
  80. * @ApiReturn ({"code":1,"msg":"ok","time":"1672215684","data":{"id":1,"name":"1积分","image":"/assets/img/qrcode.png","win_rate":300,"type":2,"score":1,"weigh":1,"status":1,"createtime":1672206758,"updatetime":1672207256,"deletetime":null,"type_text":"Type 2","status_text":"Status 1","prize_log": "18"}})
  81. */
  82. public function do_prize()
  83. {
  84. $prize_model = new Prize();
  85. $list = $prize_model->where('status', 1)->order('weigh', 'desc')->limit(6)->select();
  86. if (count($list) < 6 || !config('site.one_prize_score')) {
  87. $this->error('系统设置中');
  88. }
  89. $arr = $data = [];
  90. foreach ($list as $key => $val) {
  91. $arr[$val['id']] = $val['win_rate'];
  92. $data[$val['id']] = $val;
  93. }
  94. $rid = get_prize_rand($arr); //根据概率获取奖项id
  95. if (!array_key_exists($rid, $data)) {
  96. $this->error('请刷新后重试');
  97. }
  98. $user_id = $this->auth->id;
  99. //扣除积分 积分变动记录 积分中奖记录 积分奖品增加积分
  100. Db::startTrans();
  101. try {
  102. $user_model = new ModelUser();
  103. $user_model->where(['id' => $user_id])->setDec('score', config('site.one_prize_score'));
  104. //积分变动记录
  105. $insert_score_log[] = [
  106. 'user_id' => $user_id,
  107. 'score' => config('site.one_prize_score'),
  108. 'before' => $this->auth->score,
  109. 'after' => $this->auth->score - config('site.one_prize_score'),
  110. 'memo' => '积分抽奖',
  111. ];
  112. $data[$rid]['prize_log'] = 0;
  113. if ($data[$rid]['type'] == 1 || $data[$rid]['type'] == 2) {
  114. //积分中奖记录
  115. $status = $data[$rid]['type'] == 1 ? 0 : 1;
  116. $prize_model = new PrizeLog();
  117. $insert_prize_log = [
  118. 'user_id' => $user_id,
  119. 'name' => $data[$rid]['name'],
  120. 'p_id' => $data[$rid]['id'],
  121. 'type' => $data[$rid]['type'],
  122. 'status' => $status,
  123. 'createtime' => time(),
  124. ];
  125. $data[$rid]['prize_log'] = $prize_model->insertGetId($insert_prize_log);
  126. }
  127. // 抽中积分
  128. if ($data[$rid]['type'] == 2 && $data[$rid]['score']) {
  129. $user_model->where(['id' => $user_id])->setInc('score', $data[$rid]['score']);
  130. $user_info = $user_model::get($user_id);
  131. //积分变动记录
  132. $insert_score_log[] = [
  133. 'user_id' => $user_id,
  134. 'score' => $data[$rid]['score'],
  135. 'before' => $user_info->score,
  136. 'after' => $user_info->score + $data[$rid]['score'],
  137. 'memo' => '积分抽奖中奖',
  138. ];
  139. }
  140. // 积分变动记录 insert
  141. $user_score_model = new UserScoreLog();
  142. $user_score_model->saveAll($insert_score_log);
  143. Db::commit();
  144. $this->success('ok', $data[$rid]);
  145. } catch (ErrorException $e) {
  146. Db::rollback();
  147. $this->error('请刷新后重试!');
  148. }
  149. $this->error('系统设置中');
  150. }
  151. /**
  152. * 积分抽奖-提交地址信息
  153. * @ApiMethod (POST)
  154. * @ApiParams (name=address_id,type="int", required=true,description="地址id")
  155. * @ApiParams (name=prize_log,type="int", required=true,description="中奖记录")
  156. */
  157. public function prize_address()
  158. {
  159. $user_id = $this->auth->id;
  160. $input = input();
  161. if (empty($input['address_id']) || empty($input['prize_log'])) {
  162. $this->error('参数错误');
  163. }
  164. $user_address_model = new UserAddress();
  165. $address = $user_address_model::get($input['address_id']);
  166. if (!$address || $address->user_id != $user_id) {
  167. $this->error('地址错误!');
  168. }
  169. $prize_model = new PrizeLog();
  170. $prize_log = $prize_model::get($input['prize_log']);
  171. if (!$prize_log || $prize_log->user_id != $user_id || $prize_log->type != 1) {
  172. $this->error('中奖记录不存在!');
  173. }
  174. $data = [
  175. 'user_name' => $address->name,
  176. 'phone' => $address->phone,
  177. 'province_id' => $address->province_id,
  178. 'city_id' => $address->city_id,
  179. 'area_id' => $address->area_id,
  180. 'city' => city_name($address->province_id) . city_name($address->city_id) . city_name($address->area_id),
  181. 'address' => $address->address,
  182. 'status' => 2,
  183. ];
  184. Db::startTrans();
  185. try {
  186. $prize_model->save($data, ['id' => $input['prize_log']]);
  187. Db::commit();
  188. $this->success('地址提交成功');
  189. } catch (ErrorException $e) {
  190. Db::rollback();
  191. $this->error('地址提交失败');
  192. }
  193. }
  194. /**
  195. * 抽奖记录
  196. * @ApiMethod (GET)
  197. * @ApiParams (name=limit,type="int", required=false,description="每页数量")
  198. * @ApiParams (name=page,type="int", required=false,description="页数")
  199. * @ApiReturnParams (name="name", type="string", required=true, description="名称")
  200. * @ApiReturnParams (name="createtime", type="int", required=true, description="时间")
  201. * @ApiReturnParams (name="status_text", type="string", required=true, description="小字部分")
  202. * @ApiReturn ({"code":1,"msg":"ok","time":"1672219266","data":{"total":14,"per_page":2,"current_page":6,"last_page":7,"data":[{"id":7,"name":"1积分","createtime":1672215640,"status_text":"已到账"},{"id":6,"name":"精品鱼竿一个","createtime":1672215553,"status_text":"北京北京市东城区地址"}]}})
  203. */
  204. public function prize_log()
  205. {
  206. $page = input('page', 1);
  207. $limit = input('limit');
  208. $user_id = $this->auth->id;
  209. $prize_log_model = new PrizeLog();
  210. $query = $prize_log_model->field('*')->where('user_id', $user_id)->order('id', 'desc');
  211. $list = $query->paginate($limit, false, ['page' => $page]);
  212. $data = [];
  213. foreach ($list as $k => $v) {
  214. $data[$k]['id'] = $v['id'];
  215. $data[$k]['name'] = $v['name'];
  216. $data[$k]['createtime'] = $v['createtime'];
  217. if ($v['status'] == 1) {
  218. $data[$k]['status_text'] = '已到账';
  219. } elseif ($v['status'] > 1) {
  220. $data[$k]['status_text'] = city_name($v['province_id']) . city_name($v['city_id']) . city_name($v['area_id']) . $v['address'];
  221. }
  222. }
  223. $this->success('ok', ['total' => $list->total(), 'per_page' => intval($list->listRows()), 'current_page' => $list->currentPage(), 'last_page' => $list->lastPage(), 'data' => $data]);
  224. }
  225. }