BoxController.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Support\Facades\Storage;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Http\Request;
  6. class BoxController extends Controller
  7. {
  8. // 获取用户信息
  9. public function open(Request $request) {
  10. //
  11. $user = unserialize($request->get("account"));
  12. // 校验参数
  13. $num = $request->input("num", 1);
  14. if($num !=1 && $num !=5) {
  15. return [
  16. 'errno'=> 10001,
  17. "errmsg" => '参数错误',
  18. ];
  19. }
  20. $perCoupon = 1;
  21. if($perCoupon * $num > $user->coupon) {
  22. return [
  23. 'errno'=> 10002,
  24. "errmsg" => '请求失败,礼劵不够了',
  25. ];
  26. }
  27. // 获取基本数据
  28. $levelPercent = $this->getLevelPercent();
  29. $levelPaster = $this->getLevelPaster();
  30. $hitCnt = $this->getBoxHit()['hit_cnt'];
  31. // 循环执行
  32. $result = [];
  33. $ids = [];
  34. $mapBoxId = [];
  35. // dd($hitCnt);
  36. $user_last_hit_cnt = $user->last_hit_cnt;
  37. for($i=0;$i<$num;$i++) {
  38. $tmp = $this->getOpenResult($user_last_hit_cnt, $levelPercent, $hitCnt);
  39. if($tmp['level'] == 'SSR') {
  40. $user_last_hit_cnt = 0;
  41. } else {
  42. $user_last_hit_cnt++;
  43. }
  44. $result[] = $tmp;
  45. $ids[] = $tmp['attire_id'];
  46. $mapBoxId[$tmp['attire_id']] = $tmp['id']; // 获取box_id 和 attire_id的映射关系
  47. }
  48. // 获取装扮的数据 名称/正面图片
  49. $attires = \App\Models\Attire::whereIn("id", $ids)
  50. ->get()
  51. ->toArray();
  52. $mapAttire = array_column($attires, null,"id");
  53. //
  54. $existAttire = \App\Models\FittingRoom::where("account_id", $user->id)
  55. ->whereIn("attire_id", $ids)
  56. ->pluck("attire_id")
  57. ->toArray();
  58. unset($ids);
  59. //
  60. $gainIds = [];
  61. $gainAttireIds = [];
  62. $retrieveIds = [];
  63. $retrievePaster = 0;
  64. foreach($result as &$v) {
  65. $tmpAttireId = $v["attire_id"];
  66. $v["name"] = $mapAttire[$tmpAttireId]["name"];
  67. $v["img_1"] = Storage::disk('cosv5')->url($mapAttire[$tmpAttireId]["img_1"]);
  68. //
  69. if($existAttire && in_array($tmpAttireId, $existAttire)) {
  70. $retrieveIds[] = $mapBoxId[$tmpAttireId];
  71. $retrievePaster += (int)$levelPaster[$v["level"]];
  72. $v["is_retrieve"] = 1;
  73. $v["retrieve_paster"] = (int)$levelPaster[$v["level"]];
  74. } else {
  75. $gainIds[] = $mapBoxId[$tmpAttireId];
  76. $gainAttireIds[] = $tmpAttireId;
  77. $v["is_retrieve"] = 0;
  78. $v["retrieve_paster"] = 0;
  79. $existAttire[] = $tmpAttireId;
  80. }
  81. }
  82. unset($v); // 解决php的引用bug
  83. // 使用事务进行处理
  84. DB::transaction(function () use($gainIds, $retrieveIds, $user, $perCoupon, $num, $retrievePaster, $user_last_hit_cnt,$gainAttireIds) {
  85. // 更新未抽中大赏的数量
  86. DB::table('accounts')
  87. ->where('id', $user->id)
  88. ->update(['last_hit_cnt' => $user_last_hit_cnt]);
  89. // 删除花费的礼劵
  90. DB::table('accounts')
  91. ->where("id", $user->id)
  92. ->decrement("coupon", $perCoupon * $num);
  93. // 回收的贴纸数
  94. if($retrievePaster) {
  95. DB::table('accounts')
  96. ->where("id", $user->id)
  97. ->increment("paster", $retrievePaster);
  98. }
  99. // 未回收的加入试衣间
  100. $fittimgRooms = [];
  101. foreach($gainAttireIds as &$v) {
  102. $fittimgRooms[$v] = [
  103. "account_id" => $user->id,
  104. "attire_id" => $v,
  105. 'created_at' =>date("Y-m-d H:i:s"),
  106. 'updated_at' =>date("Y-m-d H:i:s"),
  107. ];
  108. }
  109. if($fittimgRooms) {
  110. \App\Models\FittingRoom::insertOrIgnore(array_values($fittimgRooms));
  111. }
  112. // 礼盒记录
  113. $objBoxRecord = new \App\Models\BoxRecord();
  114. $objBoxRecord->account_id = $user->id;
  115. $objBoxRecord->num = $num;
  116. $objBoxRecord->box_ids = implode(",", $gainIds);
  117. $objBoxRecord->retrieve_pasters = $retrievePaster;
  118. $objBoxRecord->retrieve_box_ids = implode(",", $retrieveIds);
  119. $objBoxRecord->cost_coupons = $perCoupon * $num;
  120. $objBoxRecord->save();
  121. // 礼劵明细记录
  122. $objCouponRecord = new \App\Models\CouponRecord();
  123. $objCouponRecord->account_id = $user->id;
  124. $objCouponRecord->add_cnt = -1 * $perCoupon * $num;
  125. $objCouponRecord->type = 1;
  126. $objCouponRecord->box_record_id = $objBoxRecord->id;
  127. $objCouponRecord->day = date("Y-m-d");
  128. $objCouponRecord->save();
  129. // 贴纸回收记录
  130. if($retrievePaster) {
  131. $objPasterRecord = new \App\Models\PasterRecord();
  132. $objPasterRecord->account_id = $user->id;
  133. $objPasterRecord->add_cnt = $retrievePaster;
  134. $objPasterRecord->type = 1;
  135. $objPasterRecord->box_record_id = $objBoxRecord->id;
  136. $objPasterRecord->day = date("Y-m-d");
  137. $objPasterRecord->save();
  138. }
  139. });
  140. //
  141. return [
  142. 'errno'=> 10000,
  143. "errmsg" => 'ok',
  144. 'data' => $result,
  145. ];
  146. }
  147. // 一次得开礼盒计算
  148. private function getOpenResult($user_last_hit_cnt, $levelPercent, $hitCnt) {
  149. // 获取所有的ssr随机取一个
  150. if($user_last_hit_cnt >= $hitCnt-1) {
  151. $level = 'SSR';
  152. } else {
  153. //
  154. $levels = [];
  155. foreach($levelPercent as $k=>$v) {
  156. for($i=0;$i<$v;$i++) {
  157. $levels[] = $k;
  158. }
  159. }
  160. shuffle($levels);
  161. $idx = array_rand($levels);
  162. $level = $levels[$idx];
  163. }
  164. // 随机取一个
  165. $gifts = \App\Models\GiftBox::whereHas("attire", function($q) use ($level) {
  166. $q->where("level", $level);
  167. })->get(["id","attire_id"])->toArray();
  168. //
  169. foreach($gifts as &$v) {
  170. $v['level'] = $level;
  171. }
  172. shuffle($gifts);
  173. $idx = array_rand($gifts);
  174. $hitGifts = $gifts[$idx];
  175. //
  176. return $hitGifts;
  177. }
  178. //
  179. public function getLevelPercent() {
  180. $obj = \App\Models\Config::where("key", "box_level_percent")->first();
  181. if ($obj && $obj->val) {
  182. $data = json_decode($obj->val, true);
  183. if ($data) {
  184. return $data;
  185. }
  186. }
  187. //
  188. return config("avatar.box_level_percent");
  189. }
  190. //
  191. public function getLevelPaster() {
  192. //
  193. $obj = \App\Models\Config::where("key", "box_level_paster")->first();
  194. if ($obj && $obj->val) {
  195. $data = json_decode($obj->val, true);
  196. if ($data) {
  197. return $data;
  198. }
  199. }
  200. //
  201. return config("avatar.box_level_paster");
  202. }
  203. //
  204. public function getBoxHit() {
  205. //
  206. $obj = \App\Models\Config::where("key", "box_hit_cnt")->first();
  207. if ($obj && $obj->val) {
  208. return ['hit_cnt'=>(int)$obj->val];
  209. }
  210. //
  211. return config("avatar.box_hit_cnt");
  212. }
  213. // 获取礼盒装扮列表
  214. public function gifts(Request $request) {
  215. // 随机取一个
  216. $gifts = \App\Models\GiftBox::with(["attire"])->orderBy("sort","asc")->orderBy("id","asc")->get(["attire_id"])->toArray();
  217. $result = [];
  218. $ret = [];
  219. foreach($gifts as $v) {
  220. $result[$v["attire"]["level"]][] = [
  221. "name" => $v["attire"]["name"],
  222. "img_1" => Storage::disk('cosv5')->url($v["attire"]["img_1"]),
  223. "level" => $v["attire"]["level"],
  224. ];
  225. $ret[] = [
  226. "name" => $v["attire"]["name"],
  227. "img_1" => Storage::disk('cosv5')->url($v["attire"]["img_1"]),
  228. "level" => $v["attire"]["level"],
  229. ];
  230. }
  231. //
  232. // $ret = [];
  233. // $ret = array_merge($ret, $result['SSR']);
  234. // $ret = array_merge($ret, $result['SR']);
  235. // $ret = array_merge($ret, $result['R']);
  236. // $ret = array_merge($ret, $result['N']);
  237. // 获取级别的概率
  238. $levelPercent = \App\Models\Config::where("key", 'box_level_percent')->value("val");
  239. $levelPercent = json_decode($levelPercent, true);
  240. //
  241. $t = [];
  242. $t['SSR'] = sprintf("%g%%", $levelPercent['SSR']);
  243. $t['SR'] = sprintf("%g%%", $levelPercent['SR']);
  244. $t['R'] = sprintf("%g%%", $levelPercent['R']);
  245. $t['N'] = sprintf("%g%%", $levelPercent['N']);
  246. $levelPercent = $t;
  247. //
  248. $hitCnt = \App\Models\Config::where("key", 'box_hit_cnt')->value("val");
  249. $levels = [
  250. [
  251. 'level_name' => 'SSR',
  252. 'percent' => $levelPercent['SSR'],
  253. 'relations' => $result['SSR']
  254. ],
  255. [
  256. 'level_name' => 'SR',
  257. 'percent' => $levelPercent['SR'],
  258. 'relations' => $result['SR']
  259. ],
  260. [
  261. 'level_name' => 'R',
  262. 'percent' => $levelPercent['R'],
  263. 'relations' => $result['R']
  264. ],
  265. [
  266. 'level_name' => 'N',
  267. 'percent' => $levelPercent['N'],
  268. 'relations' => $result['N']
  269. ],
  270. ];
  271. //
  272. return [
  273. 'errno'=> 10000,
  274. "errmsg" => 'ok',
  275. 'data' => $ret,
  276. 'percent_data' => compact('levelPercent','hitCnt','levels'),
  277. ];
  278. }
  279. }