123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Controller;
- use App\Jobs\Dwbs\ImportOrderJob;
- use App\Repositories\Enums\CheckStatusEnum;
- use App\Repositories\Enums\Dwbs\ShopOrderStatusEnum;
- use App\Repositories\Enums\Dwbs\UserJifenTypeEnum;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Models\Base\Role;
- use App\Repositories\Models\Base\User;
- use App\Repositories\Models\Dwbs\Good;
- use App\Repositories\Models\Dwbs\Order;
- use App\Repositories\Models\Dwbs\ShopGood;
- use App\Repositories\Models\Dwbs\ShopOrder;
- use App\Repositories\Models\Dwbs\ShopOrderGood;
- use App\Repositories\Models\Dwbs\UserAddress;
- use App\Repositories\Models\Dwbs\UserJifen;
- use App\Services\Base\DictService;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Redis;
- /**
- * 公共
- */
- class CommonController extends Controller
- {
- /**
- * DictController constructor.
- *
- * @param DictService $dictService
- */
- public function __construct()
- {
- parent::__construct();
- // $this->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([], '请求成功');
- }
- }
|