Riddle.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php namespace App\Http\Controllers\Api\Lottery;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Models\Lottery\Riddle as Model;
  4. use App\Models\Lottery\RiddleUsable;
  5. use App\Models\Custom;
  6. use App\Models\CustomCoupon;
  7. use App\Models\CustomScore;
  8. use App\Models\CustomAmount;
  9. use App\Models\Lottery\RiddleRecord;
  10. use App\Models\Lottery\RiddleReward as RiddleReward;
  11. use App\Models\OrdersProduct;
  12. use App\Models\WeiBan\Tags as WeiBanTags;
  13. use Illuminate\Support\Facades\DB;
  14. /**
  15. * 积分抽奖
  16. *
  17. * @author 刘相欣
  18. *
  19. * */
  20. class Riddle extends Api{
  21. /**
  22. * 获取抽奖配置 /api/lottery_riddle/get_detail
  23. *
  24. *
  25. * */
  26. public function get_detail(Model $Model,Custom $Custom,RiddleReward $RiddleReward,RiddleUsable $RiddleUsable){
  27. // 接口验签
  28. // $this->verify_sign();
  29. // 检查登录
  30. $uid = $this->checkLogin();
  31. // 获取客户信息
  32. $custom = $Custom->getOne($uid);
  33. // 如果存在的话
  34. if( !$custom ) return json_send(['code'=>'no_login','msg'=>'请登录','data'=>['error'=>'无对应客户']]);
  35. // 接收参数
  36. $id = request('id',0);
  37. // 获取活动
  38. $data = $Model->getOne($id);
  39. // 如果存在的话
  40. if( !$data ) return json_send(['code'=>'error','msg'=>'暂无活动','data'=>$data]);
  41. // 奖品
  42. $reward = $RiddleReward->getListByLottery($data['id']);
  43. // 活动暂无奖品
  44. if( !$reward ) return json_send(['code'=>'error','msg'=>'活动暂未配置奖品','data'=>$data]);
  45. // logo
  46. $data['logo'] = $data['logo'] ? path_compat($data['logo']) : '';
  47. // 通过活动ID,查询奖品
  48. $data['reward_list'] = [];
  49. // 奖品数据
  50. foreach ($reward as $value) {
  51. // 奖项
  52. $data['reward_list'][] = ['id'=>$value['id'],'name'=>$value['reward_name'],'img'=>$value['reward_thumb'],'reward_type'=>$value['reward_type']];
  53. }
  54. // 查询用户可用抽奖次数
  55. $number = $RiddleUsable->query()->where([['custom_uid','=',$uid],['lottery_id','=',$id]])->value('number');
  56. // 最少为0,避免显示异常
  57. $data['number'] = $number < 0 ? 0 : $number;
  58. // 时间处理
  59. $data['start_date'] = date('Y/m/d H:i',$data['start_time']);
  60. // 时间处理
  61. $data['end_date'] = date('Y/m/d H:i',$data['end_time']);
  62. // 返回结果
  63. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  64. }
  65. /**
  66. * 抽奖 /api/lottery_riddle/get_reward
  67. *
  68. * */
  69. public function get_reward(Model $Model,Custom $Custom,RiddleRecord $RiddleRecord,RiddleReward $RiddleReward,CustomCoupon $CustomCoupon,OrderRecord $OrderRecord,CustomScore $CustomScore,RiddleUsable $RiddleUsable,CustomAmount $CustomAmount){
  70. // 接口验签
  71. // $this->verify_sign();
  72. // 检查登录
  73. //$uid = $this->checkLogin();
  74. $uid = 6601;
  75. // 获取活动
  76. $lotteryId = request('lottery_id',0);
  77. // 如果存在的话
  78. if( !$lotteryId ) return json_send(['code'=>'error','msg'=>'请选择参与的活动','data'=>['error'=>"抽奖活动ID有误"]]);
  79. // 获取客户信息
  80. $custom = $Custom->getOne($uid);
  81. // 如果存在的话
  82. if( !$custom ) return json_send(['code'=>'no_login','msg'=>'请登录','data'=>['error'=>'无对应客户']]);
  83. // 通过活动ID,查询奖品
  84. $data = $Model->getOne($lotteryId);
  85. // 如果存在的话
  86. if( !$data ) return json_send(['code'=>'error','msg'=>'活动不存在或未开始','data'=>$data]);
  87. // 活动时间判断
  88. if( $data['start_time'] > time() ) return json_send(['code'=>'error','msg'=>'活动暂未开始','data'=>$data]);
  89. // 活动时间判断
  90. if( $data['end_time'] < time() ) return json_send(['code'=>'error','msg'=>'活动已结束','data'=>$data]);
  91. // 奖品
  92. $reward = $RiddleReward->getListByLottery($data['id']);
  93. // 活动暂无奖品
  94. if( !$reward ) return json_send(['code'=>'error','msg'=>'活动暂未配置奖品','data'=>$data]);
  95. // 查询用户可用抽奖次数
  96. $usable = $RiddleUsable->query()->where([['custom_uid','=',$uid],['lottery_id','=',$lotteryId]])->first();
  97. if (!$usable) return json_send(['code'=>'error','msg'=>'抽奖次数已用完','data'=>['error'=>'抽奖次数已用完']]);
  98. // 最少为0,避免显示异常
  99. $data['join_num'] = $usable['number'] < 0 ? 0 : $usable['number'];
  100. // 如果次数不够
  101. if( $data['join_num'] <= 0 ) return json_send(['code'=>'error','msg'=>'抽奖次数已用完','data'=>['error'=>'抽奖次数已用完']]);
  102. // 组合数据,写入订单表,子表
  103. DB::beginTransaction();
  104. try{
  105. // 扣减次数
  106. $result = $RiddleUsable->query()->where(['lottery_id'=>$data['id'],'custom_uid'=>$uid])->update(['number'=>$usable['number']-1,'use_number'=>$usable['use_number']+1]);
  107. // 如果积分扣减失败
  108. if( !$result ) {
  109. // 回退数据
  110. DB::rollBack();
  111. return json_send(['code'=>'error','msg'=>'抽奖次数扣减失败','data'=>['error'=>'抽奖次数扣减失败']]);
  112. }
  113. //查询用户是否已中过奖
  114. $rewardData = $RiddleRecord->query()->where(['lottery_id'=>$data['id'],'custom_uid'=>$uid])->first();
  115. $rewardIndex = 0;
  116. if (!$rewardData) {
  117. // 获取奖励结果
  118. $rewardIndex = $RiddleReward->getRewardResult($reward);
  119. }
  120. // 如果中奖,下标不是0
  121. if( $rewardIndex ) {
  122. // 获取奖品
  123. $rewardResult = $reward[$rewardIndex];
  124. // 奖品记录ID
  125. if( !empty($rewardResult['id']) ){
  126. // 记录,默认状态为1,进行中
  127. $record = ['custom_uid'=>$uid,'lottery_id'=>$lotteryId,'reward_id'=>$rewardResult['id'],'reward_name'=>$rewardResult['reward_name'],'status'=>1];
  128. // 如果是积分
  129. if( $rewardResult['reward_type'] == 1 ){
  130. // 积分大于0
  131. if( $rewardResult['reward_info'] > 0 ){
  132. // 积分发放
  133. $result = $CustomScore->trade($uid,$lotteryId,$rewardResult['reward_info'],7,2);
  134. // 发放失败,改为未中奖
  135. if( isset($result['error']) ) $rewardIndex = 0;
  136. // 发放成功,状态为已完成
  137. $record['status']= 8;
  138. }
  139. }
  140. // 优惠券,先进行发放
  141. if( $rewardResult['reward_type'] == 2 ){
  142. // 优惠券存在ID
  143. if( $rewardResult['reward_info'] > 0 ){
  144. // 积分给与
  145. $result = $CustomCoupon->giveCoupon($rewardResult['reward_info'],$uid);
  146. // 发放失败,改为未中奖
  147. if( !$result ) $rewardIndex = 0;
  148. // 发放成功,状态为已完成
  149. $record['status']= 8;
  150. }
  151. }
  152. // 红包
  153. if( $rewardResult['reward_type'] == 3 ){
  154. // 积分大于0
  155. if( $rewardResult['reward_info'] > 0 ){
  156. // 积分发放
  157. $result = $CustomAmount->trade($uid,$lotteryId,$rewardResult['reward_info'],4,1,'灯谜抽奖');
  158. // 发放失败,改为未中奖
  159. if( isset($result['error']) ) $rewardIndex = 0;
  160. // 发放成功,状态为已完成
  161. $record['status']= 8;
  162. }
  163. }
  164. // 如果是实物,要求填写地址,状态设置为0
  165. if( $rewardResult['reward_type'] == 5 ) $record['status'] = 0;
  166. // 中奖才进行记录
  167. if( $rewardIndex ) {
  168. // 奖品数量减少
  169. $RiddleReward->edit($rewardResult['id'],['reward_total'=>DB::raw('reward_total+-1')]);
  170. // 扣减数量
  171. $RiddleRecord->add($record);
  172. }
  173. }
  174. }
  175. // 提交事务
  176. DB::commit();
  177. // 通过活动ID,查询奖品
  178. $rewardList = [];
  179. // 奖品数据
  180. foreach ($reward as $value) {
  181. $rewardList[] = ['id'=>$value['id'],'name'=>$value['reward_name'],'img'=>$value['reward_thumb'],'reward_type'=>$value['reward_type']];
  182. }
  183. // 返回结果
  184. return json_send(['code'=>'success','msg'=>'抽奖成功','data'=>['reward_list'=>$rewardList,'reward_index'=>$rewardIndex,'join_num'=>$data['join_num']-1]]);
  185. // 异常处理
  186. } catch (\Throwable $th) {
  187. // 回退数据
  188. DB::rollBack();
  189. // 下单失败提示
  190. return json_send(['code'=>'error','msg'=>'抽奖失败,请重试','data'=>['error'=>$th->getMessage().$th->getLine()]]);
  191. }
  192. }
  193. }