123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace app\api\controller;
- use app\admin\model\MessageCategory;
- use app\admin\model\Message as MessageModel;
- use app\admin\model\Prize;
- use app\admin\model\PrizeLog;
- use app\admin\model\User as ModelUser;
- use app\admin\model\UserAddress;
- use app\admin\model\UserScoreLog;
- use app\common\controller\Api;
- use think\Db;
- use think\exception\ErrorException;
- /**
- * 积分抽奖
- * @ApiWeigh (5)
- * @package app\api\controller
- */
- class Score extends Api
- {
- protected $noNeedLogin = [];
- protected $noNeedRight = ['*'];
- /**
- * 我的积分
- * @ApiMethod (GET)
- * @ApiParams (name=limit,type="int", required=false,description="每页数量")
- * @ApiParams (name=page,type="int", required=false,description="页数")
- * @ApiReturnParams (name="user_score", type="int", required=true, description="用户可用积分")
- * @ApiReturnParams (name="score_rule", type="string", required=true, description="积分规则")
- * @ApiReturnParams (name="list.memo", type="string", required=true, description="描述")
- * @ApiReturnParams (name="list.score_str", type="string", required=true, description="积分值带符号")
- * @ApiReturnParams (name="list.createtime", type="int", required=true, description="时间")
- * @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"}]}}})
- */
- public function my_score()
- {
- $page = input('page', 1);
- $limit = input('limit');
- $user_id = $this->auth->id;
- $user_score_model = new UserScoreLog();
- $query = $user_score_model->where('user_id', $user_id)->order('id', 'desc');
- $list = $query->paginate($limit, false, ['page' => $page]);
- foreach ($list as &$v) {
- if ($v['after'] - $v['before'] > 0) {
- $v['score_str'] = '+' . $v['score'];
- } else {
- $v['score_str'] = '-' . $v['score'];
- }
- }
- $this->success('ok', ['user_score' => $this->auth->score, 'score_rule' => config('site.score_rule'), 'list' => $list]);
- }
- /**
- * 获取积分抽奖数据
- * @ApiMethod (GET)
- * @ApiReturnParams (name="user_score", type="int", required=true, description="用户可用积分")
- * @ApiReturnParams (name="one_prize_score", type="int", required=true, description="单次抽奖所需积分")
- * @ApiReturnParams (name="score_rule", type="string", required=true, description="积分抽奖规则")
- * @ApiReturnParams (name="list.name", type="string", required=true, description="奖品名称")
- * @ApiReturnParams (name="list.type", type="int", required=true, description="奖品类型:1=实物,2=积分,3=空奖")
- * @ApiReturnParams (name="list.image", type="string", required=true, description="图片")
- * @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"}]}})
- */
- public function prize_list()
- {
- $prize_model = new Prize();
- $list = $prize_model->where('status', 1)->order('weigh', 'desc')->limit(6)->select();
- // 奖品不够,或者未设置抽奖扣除积分
- if (count($list) < 6 || !config('site.one_prize_score')) {
- $this->error('系统设置中');
- }
- $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]);
- }
- /**
- * 立即抽奖
- * @ApiMethod (POST)
- * @ApiReturnParams (name="name", type="string", required=true, description="奖品名称")
- * @ApiReturnParams (name="type", type="int", required=true, description="奖品类型:1=实物,2=积分,3=空奖")
- * @ApiReturnParams (name="image", type="string", required=true, description="图片")
- * @ApiReturnParams (name="score", type="int", required=true, description="积分")
- * @ApiReturnParams (name="prize_log", type="int", required=true, description="中奖记录,type=1实物需要填地址")
- * @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"}})
- */
- public function do_prize()
- {
- $prize_model = new Prize();
- $list = $prize_model->where('status', 1)->order('weigh', 'desc')->limit(6)->select();
- if (count($list) < 6 || !config('site.one_prize_score')) {
- $this->error('系统设置中');
- }
- $arr = $data = [];
- foreach ($list as $key => $val) {
- $arr[$val['id']] = $val['win_rate'];
- $data[$val['id']] = $val;
- }
- $rid = get_prize_rand($arr); //根据概率获取奖项id
- if (!array_key_exists($rid, $data)) {
- $this->error('请刷新后重试');
- }
- $user_id = $this->auth->id;
- //扣除积分 积分变动记录 积分中奖记录 积分奖品增加积分
- Db::startTrans();
- try {
- $user_model = new ModelUser();
- $user_model->where(['id' => $user_id])->setDec('score', config('site.one_prize_score'));
- //积分变动记录
- $insert_score_log[] = [
- 'user_id' => $user_id,
- 'score' => config('site.one_prize_score'),
- 'before' => $this->auth->score,
- 'after' => $this->auth->score - config('site.one_prize_score'),
- 'memo' => '积分抽奖',
- ];
- $data[$rid]['prize_log'] = 0;
- if ($data[$rid]['type'] == 1 || $data[$rid]['type'] == 2) {
- //积分中奖记录
- $status = $data[$rid]['type'] == 1 ? 0 : 1;
- $prize_model = new PrizeLog();
- $insert_prize_log = [
- 'user_id' => $user_id,
- 'name' => $data[$rid]['name'],
- 'p_id' => $data[$rid]['id'],
- 'type' => $data[$rid]['type'],
- 'status' => $status,
- 'createtime' => time(),
- ];
- $data[$rid]['prize_log'] = $prize_model->insertGetId($insert_prize_log);
- }
- // 抽中积分
- if ($data[$rid]['type'] == 2 && $data[$rid]['score']) {
- $user_model->where(['id' => $user_id])->setInc('score', $data[$rid]['score']);
- $user_info = $user_model::get($user_id);
- //积分变动记录
- $insert_score_log[] = [
- 'user_id' => $user_id,
- 'score' => $data[$rid]['score'],
- 'before' => $user_info->score,
- 'after' => $user_info->score + $data[$rid]['score'],
- 'memo' => '积分抽奖中奖',
- ];
- }
- // 积分变动记录 insert
- $user_score_model = new UserScoreLog();
- $user_score_model->saveAll($insert_score_log);
- Db::commit();
- $this->success('ok', $data[$rid]);
- } catch (ErrorException $e) {
- Db::rollback();
- $this->error('请刷新后重试!');
- }
- $this->error('系统设置中');
- }
- /**
- * 积分抽奖-提交地址信息
- * @ApiMethod (POST)
- * @ApiParams (name=address_id,type="int", required=true,description="地址id")
- * @ApiParams (name=prize_log,type="int", required=true,description="中奖记录")
- */
- public function prize_address()
- {
- $user_id = $this->auth->id;
- $input = input();
- if (empty($input['address_id']) || empty($input['prize_log'])) {
- $this->error('参数错误');
- }
- $user_address_model = new UserAddress();
- $address = $user_address_model::get($input['address_id']);
- if (!$address || $address->user_id != $user_id) {
- $this->error('地址错误!');
- }
- $prize_model = new PrizeLog();
- $prize_log = $prize_model::get($input['prize_log']);
- if (!$prize_log || $prize_log->user_id != $user_id || $prize_log->type != 1) {
- $this->error('中奖记录不存在!');
- }
- $data = [
- 'user_name' => $address->name,
- 'phone' => $address->phone,
- 'province_id' => $address->province_id,
- 'city_id' => $address->city_id,
- 'area_id' => $address->area_id,
- 'city' => city_name($address->province_id) . city_name($address->city_id) . city_name($address->area_id),
- 'address' => $address->address,
- 'status' => 2,
- ];
- Db::startTrans();
- try {
- $prize_model->save($data, ['id' => $input['prize_log']]);
- Db::commit();
- $this->success('地址提交成功');
- } catch (ErrorException $e) {
- Db::rollback();
- $this->error('地址提交失败');
- }
- }
- /**
- * 抽奖记录
- * @ApiMethod (GET)
- * @ApiParams (name=limit,type="int", required=false,description="每页数量")
- * @ApiParams (name=page,type="int", required=false,description="页数")
- * @ApiReturnParams (name="name", type="string", required=true, description="名称")
- * @ApiReturnParams (name="createtime", type="int", required=true, description="时间")
- * @ApiReturnParams (name="status_text", type="string", required=true, description="小字部分")
- * @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":"北京北京市东城区地址"}]}})
- */
- public function prize_log()
- {
- $page = input('page', 1);
- $limit = input('limit');
- $user_id = $this->auth->id;
- $prize_log_model = new PrizeLog();
- $query = $prize_log_model->field('*')->where('user_id', $user_id)->order('id', 'desc');
- $list = $query->paginate($limit, false, ['page' => $page]);
- $data = [];
- foreach ($list as $k => $v) {
- $data[$k]['id'] = $v['id'];
- $data[$k]['name'] = $v['name'];
- $data[$k]['createtime'] = $v['createtime'];
- if ($v['status'] == 1) {
- $data[$k]['status_text'] = '已到账';
- } elseif ($v['status'] > 1) {
- $data[$k]['status_text'] = city_name($v['province_id']) . city_name($v['city_id']) . city_name($v['area_id']) . $v['address'];
- }
- }
- $this->success('ok', ['total' => $list->total(), 'per_page' => intval($list->listRows()), 'current_page' => $list->currentPage(), 'last_page' => $list->lastPage(), 'data' => $data]);
- }
- }
|