6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/AfterSaleController.php

182 lines
5.7 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\AfterSaleLogResource;
use App\Endpoint\Api\Http\Resources\AfterSaleResource;
use App\Endpoint\Api\Http\Resources\AfterSaleSimpleResource;
use App\Exceptions\BizException;
use App\Helpers\Paginator as PaginatorHelper;
use App\Models\AfterSale;
use App\Models\OrderProduct;
use App\Services\AfterSaleService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class AfterSaleController extends Controller
{
/**
* 售后订单列表
*
* @param Request $request
* @return void
*/
public function index(Request $request)
{
$query = AfterSale::query()->with(['order', 'orderProduct']);
$query->where('user_id', $request->user()->id);
if ($request->filled('doing')) {
$doing = (bool) $request->query('doing');
if ($doing) {//获取正在处理中的订单
$query->where('state', '<', AfterSale::STATE_FINISH)->latest('updated_at');
} else {//获取已完成+已取消的售后订单
$query->where('state', '>=', AfterSale::STATE_FINISH)->latest();
}
} else {//获取全部申请记录
$query->latest();
}
$afterSales = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
return AfterSaleSimpleResource::collection($afterSales);
}
/**
* 提交审核
*
* @param Request $request
* @return void
*/
public function store(Request $request, AfterSaleService $afterSaleService)
{
$input = $request->validate([
'order_product_id' => ['bail', 'required', 'integer'],
'num' => ['bail', 'required', 'integer', 'min:1'],
'type' => ['bail', 'required', 'integer', 'min:1', 'max:4'],
'description' => ['bail', 'required', 'string', 'max:255'],
'images' => ['bail', 'required', 'array', 'max:6'],
]);
$orderProduct = OrderProduct::where('user_id', $request->user()->id)->findOrFail($input['order_product_id']);
try {
DB::beginTransaction();
$afterSale = $afterSaleService->create($request->user(), $orderProduct, $input['type'], $input['num'], $input);
DB::commit();
} catch (BizException $th) {
DB::rollBack();
throw new BizException($th->getMessage());
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('申请失败,请稍后再试');
}
return AfterSaleResource::make($afterSale);
}
/**
* 售后订单详情
*
* @param [type] $id
* @param Request $request
* @return void
*/
public function show($id, Request $request)
{
$afterSale = $request->user()->afterSales()->findOrFail($id);
return AfterSaleResource::make($afterSale);
}
/**
* 获取售后单的售后日志
*
* @param [type] $id
* @param Request $request
* @return void
*/
public function logs($id, Request $request)
{
$afterSale = $request->user()->afterSales()->findOrFail($id);
return AfterSaleLogResource::collection($afterSale->logs->sortByDesc('created_at'));
}
/**
* 补充资料
*
* @param Request $request
* @return void
*/
public function update($id, Request $request, AfterSaleService $afterSaleService)
{
$afterSale = $request->user()->afterSales()->where('state', '=', AfterSale::STATE_APPLY)->findOrFail($id);
$input = $request->validate([
'type' => ['bail', 'required', 'integer', 'min:1', 'max:4'],
'description' => ['bail', 'required', 'string', 'max:255'],
'images' => ['bail', 'required', 'array', 'max:6'],
]);
try {
DB::beginTransaction();
$afterSale = $afterSaleService->apply($afterSale, $input);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('提交失败,请稍后再试');
}
return AfterSaleResource::make($afterSale);
}
/**
* 客户同意
*
* @param Request $request
* @return void
*/
public function agree($id, Request $request)
{
$afterSale = $request->user()->afterSales()->where('state', '=', AfterSale::STATE_AGREE)->findOrFail($id);
$input = $request->validate([
'tracking_number' => ['bail', 'string', 'max:255'],
]);
//如果是
if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_CHANGE]) && (!isset($input['tracking_number']) || empty($input['tracking_number']))) {
throw new BizException('请填写物流单号');
}
try {
DB::beginTransaction();
$afterSaleService = new AfterSaleService();
$afterSale = $afterSaleService->agree($afterSale, $input);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('提交失败,请稍后再试');
}
return AfterSaleResource::make($afterSale);
}
/**
* 取消申请
*
* @param Request $request
* @return void
*/
public function cancel($id, Request $request)
{
$afterSale = $request->user()->afterSales()->where('state', '<', 4)->findOrFail($id);
$afterSale->update(
['state'=> AfterSale::STATE_CANCEL, 'remarks'=>'用户取消售后申请']
);
return AfterSaleResource::make($afterSale);
}
}