CommonController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Jobs\Dwbs\ImportOrderJob;
  5. use App\Repositories\Enums\CheckStatusEnum;
  6. use App\Repositories\Enums\Dwbs\ShopOrderStatusEnum;
  7. use App\Repositories\Enums\Dwbs\UserJifenTypeEnum;
  8. use App\Repositories\Enums\ModelStatusEnum;
  9. use App\Repositories\Enums\ResponseCodeEnum;
  10. use App\Repositories\Models\Base\Role;
  11. use App\Repositories\Models\Base\User;
  12. use App\Repositories\Models\Dwbs\Good;
  13. use App\Repositories\Models\Dwbs\Order;
  14. use App\Repositories\Models\Dwbs\ShopGood;
  15. use App\Repositories\Models\Dwbs\ShopOrder;
  16. use App\Repositories\Models\Dwbs\ShopOrderGood;
  17. use App\Repositories\Models\Dwbs\UserAddress;
  18. use App\Repositories\Models\Dwbs\UserJifen;
  19. use App\Services\Base\DictService;
  20. use Carbon\Carbon;
  21. use Illuminate\Http\Request;
  22. use Illuminate\Support\Arr;
  23. use Illuminate\Support\Facades\Cache;
  24. use Illuminate\Support\Facades\DB;
  25. use Illuminate\Support\Facades\Redis;
  26. /**
  27. * 公共
  28. */
  29. class CommonController extends Controller
  30. {
  31. /**
  32. * DictController constructor.
  33. *
  34. * @param DictService $dictService
  35. */
  36. public function __construct()
  37. {
  38. parent::__construct();
  39. // $this->middleware('checkUserPermission');
  40. }
  41. /**
  42. * 配置枚举
  43. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
  44. */
  45. public function enums()
  46. {
  47. $data = trans('enums');
  48. $enums = [];
  49. foreach ($data as $key => $val) {
  50. $k = last(str2arr($key, '\\'));
  51. $enums[$k] = $val;
  52. }
  53. return $this->response->success($enums);
  54. }
  55. /**
  56. * 清空缓存
  57. * @return mixed
  58. * @Author: Mead
  59. */
  60. public function clear()
  61. {
  62. Cache::flush();
  63. return $this->response->ok('操作成功');
  64. }
  65. /**
  66. * 测试
  67. * @return
  68. */
  69. public function test(Request $request)
  70. {
  71. $data['user_id'] = random_int(1, 100);
  72. //校检积分
  73. $goods = Arr::random([1, 2, 3], random_int(1, 3));
  74. $totalJifen = 0;
  75. $totalNums = 0;
  76. $a = Cache::increment("mead:nums");
  77. $com_goods = [];
  78. foreach ($goods as $good_id) {
  79. $goodModel = ShopGood::byIdGetOrder($good_id);
  80. if (!$goodModel) abort("找不到该商品");
  81. $good['nums'] = random_int(1, 2);
  82. // if ($goodModel->nums < $good['nums']) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "{$goodModel->name}库存不足");
  83. $tj = bcmul($goodModel['jifen'], $good['nums'], 0);
  84. $com_goods[] = [
  85. 'good_id' => $goodModel->id,
  86. 'jifen' => $goodModel->jifen,
  87. 'nums' => $good['nums'],
  88. 'total_jifen' => $tj,
  89. 'model' => $goodModel
  90. ];
  91. $totalJifen = bcadd($tj, $totalJifen, 0);
  92. $totalNums += (int)$good['nums'];
  93. }
  94. // if ((int)$data['jifen'] !== (int)$totalJifen) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '积分计算不正确');
  95. // if ((int)$data['nums'] !== (int)$totalNums) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '商品数量计算不正确');
  96. $user = User::query()->where('id', $data['user_id'])->where('status', ModelStatusEnum::OK)->first();
  97. if (!$user) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到该用户');
  98. //
  99. // if ($user->jifen < $totalJifen) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '积分不足');
  100. //
  101. // $address = UserAddress::query()->where('id', $data['address_id'])->where('status', ModelStatusEnum::OK)->where('user_id', $user->id)->first();
  102. // if (!$address) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '无效的收货地址');
  103. $address = UserAddress::query()->first();
  104. //检测商品是否存在缓存[强制锁住]
  105. // Cache::lock("lock:shopOrder:has:kucun")->get(function () use ($com_goods) {
  106. // foreach ($com_goods as $good) {
  107. // $good_id = $good['good_id'];
  108. // //检测商品是否存在缓存
  109. // if (!Cache::has("model:good:nums:{$good_id}")) {
  110. // ShopGood::reloadKuCun($good_id);
  111. // }
  112. // }
  113. // return true;
  114. // });
  115. $isChaoKuCun = true;
  116. $kuCunGoods = [];
  117. foreach ($com_goods as $k => $good) {
  118. $good_id = $good['good_id'];
  119. $good_nums = $good['nums'];
  120. //检测商品是否存在缓存[没有缓存的时候可能会超卖]
  121. // if (!Cache::has("model:good:nums:{$good_id}")) {
  122. // ShopGood::reloadKuCun($good_id);
  123. // }
  124. $isChaoKuCun = Cache::lock("lock:shopOrder:good:{$good_id}")->get(function () use ($good_id, $good_nums) {
  125. $kuCunNums = Cache::get("model:good:nums:{$good_id}", 0);
  126. if (!$kuCunNums || $kuCunNums < $good_nums) {
  127. return false;
  128. }
  129. Cache::decrement("model:good:nums:{$good_id}", $good_nums);
  130. return true;
  131. });
  132. if (!$isChaoKuCun) {
  133. //存在超库时恢复其他商品的库存
  134. foreach ($kuCunGoods as $g) {
  135. $good_id = $g['good_id'];
  136. $good_nums = $g['nums'];
  137. Cache::lock("lock:shopOrder:good:{$good_id}")->get(function () use ($good_id, $good_nums) {
  138. Cache::increment("model:good:nums:{$good_id}", $good_nums);
  139. return true;
  140. });
  141. }
  142. break;
  143. }
  144. $kuCunGoods[] = $good;
  145. }
  146. if (!$isChaoKuCun) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '库存不足');
  147. $order = DB::transaction(function () use ($com_goods, $user, $totalJifen, $totalNums, $data, $address) {
  148. $order = ShopOrder::query()->create([
  149. 'order_no' => ShopOrder::makeNo(),
  150. 'day' => date('Y-m-d'),
  151. 'user_id' => $user['id'],
  152. 'order_time' => Carbon::now()->toDateTimeString(),
  153. 'jifen' => $totalJifen,
  154. 'nums' => $totalNums,
  155. 'address_id' => $address['id'],
  156. 'sjr_name' => $address['name'],
  157. 'sjr_mobile' => $address['mobile'],
  158. 'sjr_mobile_encryption' => $address['mobile_encryption'],
  159. 'sjr_mobile_code' => $address['mobile_code'],
  160. 'sjr_address_province' => $address['province'],
  161. 'sjr_address_city' => $address['city'],
  162. 'sjr_address_area' => $address['area'],
  163. 'sjr_address' => $address['address'],
  164. 'check_status' => CheckStatusEnum::WAIT,
  165. 'status' => ShopOrderStatusEnum::wait_check
  166. ]);
  167. $user->jifen = bcsub($user->jifen, $totalJifen, 0);
  168. $user->xiaofei_jifen = bcadd($user->xiaofei_jifen, $totalJifen, 0);
  169. $user->save();
  170. UserJifen::query()->create([
  171. 'day' => date('Y-m-d'),
  172. 'user_id' => $user->id,
  173. 'jifen' => -$totalJifen,
  174. 'type' => UserJifenTypeEnum::lipinduihuan,
  175. 'source_id' => $order->id,
  176. 'source_type' => ShopOrder::class,
  177. 'user_jifen' => $user->jifen,
  178. 'is_reward' => ModelStatusEnum::PAUSE,
  179. 'status' => ModelStatusEnum::OK,
  180. ]);
  181. foreach ($com_goods as $good) {
  182. ShopOrderGood::query()->create([
  183. 'order_id' => $order->id,
  184. 'user_id' => $order->user_id,
  185. 'good_id' => $good['good_id'],
  186. 'nums' => $good['nums'],
  187. 'total_jifen' => $good['total_jifen'],
  188. 'jifen' => $good['jifen'],
  189. ]);
  190. ShopGood::query()->where('id', $good['good_id'])->decrement('nums', $good['nums']);
  191. ShopGood::query()->where('id', $good['good_id'])->increment('duihuan_nums', $good['nums']);
  192. }
  193. $order['user_jifen'] = $user->jifen;
  194. return $order;
  195. });
  196. return $this->response->success([], '请求成功');
  197. }
  198. }