RaffleController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace app\controller;
  3. use app\business\LoginBusiness;
  4. use app\business\StreamBusiness;
  5. use Illuminate\Support\Arr;
  6. use Respect\Validation\Validator;
  7. use support\Db;
  8. use support\Redis;
  9. use support\Request;
  10. use hg\apidoc\annotation as Apidoc;
  11. use Webman\Captcha\CaptchaBuilder;
  12. use Webman\Captcha\PhraseBuilder;
  13. #[Apidoc\Title("抽奖管理")]
  14. #[Apidoc\Group("Raffle")]
  15. #[Apidoc\Sort(1)]
  16. class RaffleController
  17. {
  18. #[Apidoc\Title("抽奖列表")]
  19. #[Apidoc\Url("api/raffle.html")]
  20. #[Apidoc\Method("POST")]
  21. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  22. #[Apidoc\Returned(name: "raffle_num", type: "int", require: true, desc: '抽奖次数', default: 10)]
  23. #[Apidoc\Returned(name: "accumulate_raffle_num", type: "int", require: true, desc: '累计抽奖次数', default: 10)]
  24. #[Apidoc\Returned(name: "raffle", type: "array", desc: '抽奖列表', default: '', children: [
  25. ['name' => "id", 'type' => 'int', 'require' => true, 'default' => '奖励标识,抽奖结果会返回', 'desc' => 1],
  26. ['name' => "name", 'type' => 'int', 'require' => true, 'default' => '获奖名称', 'desc' => 1],
  27. ['name' => "img", 'type' => 'int', 'require' => true, 'default' => '获奖图片', 'desc' => 1],
  28. ['name' => "money", 'type' => 'int', 'require' => true, 'default' => '中奖金额', 'desc' => 1],
  29. ])]
  30. public function index(Request $request)
  31. {
  32. $data = Db::table('wa_raffle')
  33. ->where('status', 1)
  34. ->select(['id', 'money', 'img', 'name'])
  35. ->orderBy('sort')
  36. ->get()->toArray();
  37. foreach ($data as $k => $v) {
  38. $data[$k]->img = imageToBase64($v->img);
  39. }
  40. return success([
  41. 'raffle' => $data,
  42. 'raffle_num' => $request->user_data['raffle_num'],
  43. 'accumulate_raffle_num' => $request->user_data['accumulate_raffle_num']
  44. ], '获取成功');
  45. }
  46. #[Apidoc\Title("抽奖")]
  47. #[Apidoc\Url("api/raffle/buy.html")]
  48. #[Apidoc\Method("POST")]
  49. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  50. #[Apidoc\Returned(name: "id", type: "int", require: true, desc: '奖品ID', default: 10)]
  51. #[Apidoc\Returned(name: "name", type: "int", require: true, desc: '名称', default: 10)]
  52. #[Apidoc\Returned(name: "img", type: "int", require: true, desc: '图片', default: 10)]
  53. public function buy(Request $request)
  54. {
  55. $param = $request->param_data;
  56. Db::beginTransaction();
  57. try {
  58. if ($request->user_data['raffle_num'] <= 0) {
  59. throw new \Exception('你当前没有抽奖次数了');
  60. }
  61. $prize_list = Db::table('wa_raffle')->where('status', 1)->get()->toArray();
  62. $arr = [];
  63. foreach ($prize_list as $key => $vo) {
  64. if ($vo->pro >= 1) {
  65. for ($i = 1; $i <= $vo->pro; $i++) {
  66. array_push($arr, (int)$vo->id);
  67. }
  68. }
  69. }
  70. //随机打算数组内中奖id的顺序
  71. shuffle($arr);
  72. $lucky_index = array_rand($arr, 1); //随机从中奖的集合中获取一个中奖的元素(这里返回的是当前元素所在的索引)
  73. $lucky_id = $arr[$lucky_index]; //这里最终确定了抽中的奖品id
  74. $raffledata = Db::table('wa_raffle')->where('id', $lucky_id)->first();
  75. $raffle_log_id = Db::table('wa_raffle_log')->insertGetId([
  76. 'user_id' => $request->user_data['id'],
  77. 'raffle_id' => $lucky_id,
  78. 'type' => $raffledata->type,
  79. 'created_at' => date("Y-m-d H:i:s"),
  80. ]);
  81. if (!empty($raffledata->money)) {
  82. StreamBusiness::addStream($request->user_data['id'], $raffledata->money, streamType12, moldType3, moldTypefild3, $raffle_log_id);
  83. }
  84. /** 减少抽奖次数 */
  85. Db::table('wa_users')->where('id', $request->user_data['id'])->decrement('raffle_num');
  86. } catch (\Throwable $exception) {
  87. Db::rollBack();
  88. return error($exception->getMessage());
  89. }
  90. Db::commit();
  91. return success([
  92. 'id' => $lucky_id,
  93. 'raffle_log_id' => $raffle_log_id,
  94. 'type' => $raffledata->type,
  95. 'name' => $raffledata->name,
  96. 'img' => imageToBase64($raffledata->img),
  97. ], '抽奖成功,恭喜获得:' . $raffledata->name);
  98. }
  99. #[Apidoc\Title("中奖列表")]
  100. #[Apidoc\Url("api/raffle/user_raffle.html")]
  101. #[Apidoc\Method("POST")]
  102. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  103. #[Apidoc\Param("page", type: "int", require: true, desc: "页面", mock: 1)]
  104. #[Apidoc\Param("limit", type: "int", require: true, desc: "输出条数", mock: 10)]
  105. #[Apidoc\Returned(name: "good_name", type: "int", require: true, desc: '产品名称', default: 10)]
  106. #[Apidoc\Returned(name: "created_at", type: "int", require: true, desc: '中奖时间', default: 10)]
  107. #[Apidoc\Returned(name: "name", type: "int", require: true, desc: '收货人', default: 10)]
  108. #[Apidoc\Returned(name: "mobile", type: "int", require: true, desc: '手机号', default: 10)]
  109. #[Apidoc\Returned(name: "address", type: "int", require: true, desc: '收货地址', default: 10)]
  110. #[Apidoc\Returned(name: "type", type: "int", require: true, desc: '类型:1=实物,2=虚拟', default: 10)]
  111. #[Apidoc\Returned(name: "statename", type: "int", require: true, desc: '状态描述', default: 10)]
  112. public function userRaffle(Request $request)
  113. {
  114. $param = $request->param_data;
  115. try {
  116. Validator::input($param, [
  117. 'page' => Validator::notEmpty()->intType()->setName('页面'),
  118. 'limit' => Validator::notEmpty()->intType()->setName('输出条数'),
  119. ]);
  120. $data = Db::table('wa_raffle_log')
  121. ->where('user_id', $request->user_data['id'])
  122. ->orderByDesc('id')
  123. ->paginate(Arr::get($param, 'limit', 10), ['*'], 'page', Arr::get($param, 'page'))
  124. ->toArray();
  125. $arr = [];
  126. foreach ($data['data'] as $k => $v) {
  127. $raffle = Db::table('wa_raffle')->where('id', $v->raffle_id)->first();
  128. if (!empty($raffle->money)) {
  129. $statename = '调货中,请耐心等待';
  130. } else {
  131. $statename = '已发送至银联卡余额';
  132. }
  133. $arr[] = [
  134. 'id' => $v->id,
  135. 'good_name' => $raffle->name,
  136. 'img' => imageToBase64($raffle->img),
  137. 'created_at' => date('Y-m-d', strtotime($v->created_at)),
  138. 'name' => $v->name,
  139. 'mobile' => $v->mobile,
  140. 'address' => $v->address,
  141. 'type' => $v->type,
  142. 'statename' => $statename,
  143. ];
  144. }
  145. } catch (\Throwable $exception) {
  146. return error($exception->getMessage());
  147. }
  148. return success($arr, '成功', 200, $data['total']);
  149. }
  150. #[Apidoc\Title("修改地址")]
  151. #[Apidoc\Url("api/raffle/save_raffle.html")]
  152. #[Apidoc\Method("POST")]
  153. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  154. #[Apidoc\Param("id", type: "int", require: true, desc: "页面", mock: 1)]
  155. #[Apidoc\Param("name", type: "int", require: true, desc: "收货人", mock: 10)]
  156. #[Apidoc\Param("mobile", type: "int", require: true, desc: "手机号", mock: 10)]
  157. #[Apidoc\Param("address", type: "int", require: true, desc: "地址", mock: 10)]
  158. public function save_raffle(Request $request)
  159. {
  160. $param = $request->param_data;
  161. try {
  162. Validator::input($param, [
  163. 'id' => Validator::notEmpty()->setName('id'),
  164. 'name' => Validator::notEmpty()->setName('收货人'),
  165. 'mobile' => Validator::notEmpty()->setName('手机号'),
  166. 'address' => Validator::notEmpty()->setName('收货地址'),
  167. ]);
  168. $rafflelog = Db::table('wa_raffle_log')->where('id', $param['id'])->first();
  169. Db::table('wa_raffle_log')->where('id', $param['id'])->update([
  170. 'name' => Arr::get($param, 'name', $rafflelog->name),
  171. 'number' => Arr::get($param, 'number', $rafflelog->number),
  172. 'mobile' => Arr::get($param, 'mobile', $rafflelog->mobile),
  173. 'address' => Arr::get($param, 'address', $rafflelog->address),
  174. ]);
  175. } catch (\Throwable $exception) {
  176. return error($exception->getMessage());
  177. }
  178. return success();
  179. }
  180. }