182 lines
5.7 KiB
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);
|
|
}
|
|
}
|