middleware('checkUserPermission'); } /** * 配置枚举 * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource */ public function enums() { $data = trans('enums'); $enums = []; foreach ($data as $key => $val) { $k = last(str2arr($key, '\\')); $enums[$k] = $val; } return $this->response->success($enums); } /** * 清空缓存 * @return mixed * @Author: Mead */ public function clear() { Cache::flush(); return $this->response->ok('操作成功'); } /** * 测试 * @return */ public function test(Request $request) { $data['user_id'] = random_int(1, 100); //校检积分 $goods = Arr::random([1, 2, 3], random_int(1, 3)); $totalJifen = 0; $totalNums = 0; $a = Cache::increment("mead:nums"); $com_goods = []; foreach ($goods as $good_id) { $goodModel = ShopGood::byIdGetOrder($good_id); if (!$goodModel) abort("找不到该商品"); $good['nums'] = random_int(1, 2); // if ($goodModel->nums < $good['nums']) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "{$goodModel->name}库存不足"); $tj = bcmul($goodModel['jifen'], $good['nums'], 0); $com_goods[] = [ 'good_id' => $goodModel->id, 'jifen' => $goodModel->jifen, 'nums' => $good['nums'], 'total_jifen' => $tj, 'model' => $goodModel ]; $totalJifen = bcadd($tj, $totalJifen, 0); $totalNums += (int)$good['nums']; } // if ((int)$data['jifen'] !== (int)$totalJifen) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '积分计算不正确'); // if ((int)$data['nums'] !== (int)$totalNums) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '商品数量计算不正确'); $user = User::query()->where('id', $data['user_id'])->where('status', ModelStatusEnum::OK)->first(); if (!$user) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到该用户'); // // if ($user->jifen < $totalJifen) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '积分不足'); // // $address = UserAddress::query()->where('id', $data['address_id'])->where('status', ModelStatusEnum::OK)->where('user_id', $user->id)->first(); // if (!$address) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '无效的收货地址'); $address = UserAddress::query()->first(); //检测商品是否存在缓存[强制锁住] // Cache::lock("lock:shopOrder:has:kucun")->get(function () use ($com_goods) { // foreach ($com_goods as $good) { // $good_id = $good['good_id']; // //检测商品是否存在缓存 // if (!Cache::has("model:good:nums:{$good_id}")) { // ShopGood::reloadKuCun($good_id); // } // } // return true; // }); $isChaoKuCun = true; $kuCunGoods = []; foreach ($com_goods as $k => $good) { $good_id = $good['good_id']; $good_nums = $good['nums']; //检测商品是否存在缓存[没有缓存的时候可能会超卖] // if (!Cache::has("model:good:nums:{$good_id}")) { // ShopGood::reloadKuCun($good_id); // } $isChaoKuCun = Cache::lock("lock:shopOrder:good:{$good_id}")->get(function () use ($good_id, $good_nums) { $kuCunNums = Cache::get("model:good:nums:{$good_id}", 0); if (!$kuCunNums || $kuCunNums < $good_nums) { return false; } Cache::decrement("model:good:nums:{$good_id}", $good_nums); return true; }); if (!$isChaoKuCun) { //存在超库时恢复其他商品的库存 foreach ($kuCunGoods as $g) { $good_id = $g['good_id']; $good_nums = $g['nums']; Cache::lock("lock:shopOrder:good:{$good_id}")->get(function () use ($good_id, $good_nums) { Cache::increment("model:good:nums:{$good_id}", $good_nums); return true; }); } break; } $kuCunGoods[] = $good; } if (!$isChaoKuCun) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '库存不足'); $order = DB::transaction(function () use ($com_goods, $user, $totalJifen, $totalNums, $data, $address) { $order = ShopOrder::query()->create([ 'order_no' => ShopOrder::makeNo(), 'day' => date('Y-m-d'), 'user_id' => $user['id'], 'order_time' => Carbon::now()->toDateTimeString(), 'jifen' => $totalJifen, 'nums' => $totalNums, 'address_id' => $address['id'], 'sjr_name' => $address['name'], 'sjr_mobile' => $address['mobile'], 'sjr_mobile_encryption' => $address['mobile_encryption'], 'sjr_mobile_code' => $address['mobile_code'], 'sjr_address_province' => $address['province'], 'sjr_address_city' => $address['city'], 'sjr_address_area' => $address['area'], 'sjr_address' => $address['address'], 'check_status' => CheckStatusEnum::WAIT, 'status' => ShopOrderStatusEnum::wait_check ]); $user->jifen = bcsub($user->jifen, $totalJifen, 0); $user->xiaofei_jifen = bcadd($user->xiaofei_jifen, $totalJifen, 0); $user->save(); UserJifen::query()->create([ 'day' => date('Y-m-d'), 'user_id' => $user->id, 'jifen' => -$totalJifen, 'type' => UserJifenTypeEnum::lipinduihuan, 'source_id' => $order->id, 'source_type' => ShopOrder::class, 'user_jifen' => $user->jifen, 'is_reward' => ModelStatusEnum::PAUSE, 'status' => ModelStatusEnum::OK, ]); foreach ($com_goods as $good) { ShopOrderGood::query()->create([ 'order_id' => $order->id, 'user_id' => $order->user_id, 'good_id' => $good['good_id'], 'nums' => $good['nums'], 'total_jifen' => $good['total_jifen'], 'jifen' => $good['jifen'], ]); ShopGood::query()->where('id', $good['good_id'])->decrement('nums', $good['nums']); ShopGood::query()->where('id', $good['good_id'])->increment('duihuan_nums', $good['nums']); } $order['user_jifen'] = $user->jifen; return $order; }); return $this->response->success([], '请求成功'); } }