Files
water_new/modules/User/Http/Controllers/Api/Stock/IndexController.php
2023-03-08 09:16:04 +08:00

181 lines
5.1 KiB
PHP

<?php
namespace Modules\User\Http\Controllers\Api\Stock;
use App\Api\Controllers\Controller;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Jason\Api\Api;
use Modules\Mall\Facades\Item;
use Modules\Mall\Facades\Order as OrderFacade;
use Modules\Mall\Http\Resources\Api\Address\AddressResource;
use Modules\Mall\Http\Resources\Api\Goods\GoodsBaseResource;
use Modules\Mall\Http\Resources\Api\Order\OrderCollection;
use Modules\Mall\Models\Address;
use Modules\Mall\Models\Goods;
use Modules\Mall\Models\GoodsSku;
use Modules\Mall\Models\Order;
use Modules\Mall\Models\Region;
use Modules\User\Http\Resources\stock\UserStockLogCollection;
use Modules\User\Http\Resources\UserIdentityBaseResource;
use Modules\User\Models\Identity;
use Modules\User\Models\UserStockLog;
class IndexController extends Controller
{
/**
* Notes : 订单列表
*
* @Date : 2021/5/13 5:17 下午
* @Author : <Jason.C>
* @param Request $request
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
$state = $request->state ?? '';
$list = Order::byUser(Api::user())
->TypeSample()
->when($state, function ($query) use ($state) {
switch ($state) {
case 'init':
$query->paid()->unPay();
break;
case 'delivered':
$query->delivered();
break;
}
}, function ($query) {
$query->common();
})
->paginate(8);
return $this->success(new OrderCollection($list));
}
/**
* Notes: 提货前置
*
* @Author: 玄尘
* @Date: 2022/8/1 11:32
* @return JsonResponse
*/
public function create(): JsonResponse
{
$user = Api::user();
$addresses = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->get();
$address = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->first();
$data = [
'addresses' => AddressResource::collection($addresses),
'address' => $address ? new AddressResource($address) : '',
'stockData' => $user->getStockData(),
'dientity' => new UserIdentityBaseResource($user->identityFirst())
];
return $this->success($data);
}
/**
* Notes: 提货
*
* @Author: 玄尘
* @Date: 2022/8/1 11:33
* @param Request $request
* @return JsonResponse|mixed
* @throws \Exception
*/
public function store(Request $request)
{
$user = Api::user();
$validator = Validator::make($request->all(), [
'address_id' => 'required|integer',
'qty' => 'required|integer',
], [
'qty.required' => '缺少提货数量',
'qty.integer' => '数量必须是数字',
'address_id.required' => '缺少收货地址',
'address_id.integer' => '收货地址必须是数字',
]);
if ($validator->fails()) {
return $this->failed($validator->errors()->first());
}
$remark = $request->remark ?? '';
$address_id = $request->address_id;
$qty = $request->qty;
$address = Address::find($address_id);
$userIdentity = $user->identityFirst();
if ($userIdentity->job == Identity::JOB_TY) {
$shenzhen = Region::query()->where('name', '深圳市')->first();
if ($address->city_id != $shenzhen->id) {
return $this->failed('体验官收货地址只能选择深圳');
}
}
$goods_sku = GoodsSku::query()
->whereHas('goods', function ($q) {
$q->where('channel', Goods::CHANNEL_FREE)->where('status', Goods::STATUS_UP);
})
->first();
if (! $goods_sku) {
return $this->failed('缺少商品');
}
$stockData = $user->getStockData();
if ($qty > $stockData['residue']) {
return $this->failed('用户库存不足');
}
$detail = collect();
$item = new Item($goods_sku, $address, $qty);
$detail->push($item);
$orders = (new OrderFacade)->user($user)
->remark($remark)
->type(Order::TYPE_SAMPLE)
->items($detail)
->address($address)
->create();
//提货自动完成
foreach ($orders as $order) {
if ($order->type == Order::TYPE_SAMPLE) {
$order->pay();
}
}
return $this->success('提货成功');
}
/**
* Notes: 账变记录
*
* @Author: 玄尘
* @Date: 2022/8/3 10:43
*/
public function logs()
{
$user = Api::user();
$logs = UserStockLog::query()
->ByUser($user)
->oldest()
->paginate();
return $this->success(new UserStockLogCollection($logs));
}
}