311 lines
9.7 KiB
PHP
311 lines
9.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Exceptions\BizException;
|
|
use App\Models\AfterSale;
|
|
use App\Models\AfterSaleLog;
|
|
use App\Models\OrderProduct;
|
|
use App\Models\User;
|
|
|
|
class AfterSaleService
|
|
{
|
|
/**
|
|
* 创建售后单
|
|
*
|
|
* @param User $user
|
|
* @param OrderProduct $orderProduct
|
|
* @param integer $type
|
|
* @param integer $num
|
|
* @param array $params
|
|
* @return AfterSale
|
|
*/
|
|
public function create(User $user, OrderProduct $orderProduct, int $type, int $num, array $params): AfterSale
|
|
{
|
|
// todo 校验这个订单商品是否还能发起售后-待完成
|
|
// if (1) {
|
|
// throw new BizException('该订单商品已过售后时间');
|
|
// }
|
|
|
|
//校验该订单商品不能有已完成、处理中的售后记录
|
|
if (AfterSale::where('order_product_id', $orderProduct->id)->where('state', '<', AfterSale::STATE_CANCEL)->exists()) {
|
|
throw new BizException('该订单商品已申请售后');
|
|
}
|
|
//校验申请数量不能超过订单商品数量
|
|
if ($num > $orderProduct->quantity) {
|
|
throw new BizException('申请售后的数量不能大于订单商品数量');
|
|
}
|
|
|
|
$amount = ($num == $orderProduct->quantity) ? $orderProduct->total_amount : bcmul(bcdiv($orderProduct->total_amount, $orderProduct->quantity), $num);
|
|
|
|
$afterSale = AfterSale::create(array_merge($params, [
|
|
'user_id' => $user->id,
|
|
'order_id' => $orderProduct->order_id,
|
|
'amount' => $amount,
|
|
'state' => AfterSale::STATE_VERIFY,
|
|
]));
|
|
return $afterSale;
|
|
}
|
|
|
|
/**
|
|
* 是否待审核
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @return boolean
|
|
*/
|
|
protected function isWaitVerify(AfterSale $afterSale)
|
|
{
|
|
return $afterSale->state == $afterSale::STATE_VERIFY;
|
|
}
|
|
|
|
/**
|
|
* 是否待补充资料
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @return boolean
|
|
*/
|
|
protected function isWaitApply(AfterSale $afterSale)
|
|
{
|
|
return $afterSale->state == $afterSale::STATE_APPLY;
|
|
}
|
|
|
|
/**
|
|
* 是否待确认
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @return boolean
|
|
*/
|
|
protected function isWaitAgree(AfterSale $afterSale)
|
|
{
|
|
return $afterSale->state == $afterSale::STATE_AGREE;
|
|
}
|
|
|
|
/**
|
|
* 是否待确认收货
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @return boolean
|
|
*/
|
|
protected function isWaitShipping(AfterSale $afterSale)
|
|
{
|
|
return $afterSale->state == $afterSale::STATE_SHIPPING;
|
|
}
|
|
|
|
/**
|
|
* 是否待打款
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @return boolean
|
|
*/
|
|
protected function isWaitFinance(AfterSale $afterSale)
|
|
{
|
|
return $afterSale->state == $afterSale::STATE_FINANCE;
|
|
}
|
|
|
|
/**
|
|
* 补充资料申请
|
|
*
|
|
* @param [AfterSale] $afterSale
|
|
* @param array $params
|
|
* @return AfterSale
|
|
*/
|
|
public function apply(AfterSale $afterSale, array $params): AfterSale
|
|
{
|
|
if ($this->isWaitApply($afterSale)) {
|
|
$afterSale->update(array_merge($params, [
|
|
'state' => AfterSale::STATE_VERIFY,
|
|
]));
|
|
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '补充资料',
|
|
'desc' => $afterSale->description,
|
|
'images' => $afterSale->images,
|
|
]);
|
|
return $afterSale;
|
|
} else {
|
|
throw new BizException('售后订单状态异常,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 审核通过
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @param string $remarks
|
|
* @return void
|
|
*/
|
|
public function verify(AfterSale $afterSale, string $remarks, int $amount)
|
|
{
|
|
if ($this->isWaitVerify($afterSale)) {
|
|
switch ($afterSale->type) {
|
|
case AfterSale::TYPE_REFUND_AND_RETURN:
|
|
$afterSale->update([
|
|
'amount' => $amount,
|
|
'state' => $afterSale::STATE_AGREE,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客服审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_REFUND:
|
|
$afterSale->update([
|
|
'amount' => $amount,
|
|
'state' => $afterSale::STATE_AGREE,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客服审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_CHANGE:
|
|
$afterSale->update([
|
|
'state' => $afterSale::STATE_AGREE,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客服审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_FILL:
|
|
$afterSale->update([
|
|
'state' => $afterSale::STATE_AGREE,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客服审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
break;
|
|
}
|
|
} else {
|
|
throw new BizException('该售后订单状态异常');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 补充资料
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @param string $remarks
|
|
* @return void
|
|
*/
|
|
public function backApply(AfterSale $afterSale, string $remarks)
|
|
{
|
|
if ($this->isWaitVerify($afterSale)) {
|
|
$afterSale->update([
|
|
'state' => $afterSale::STATE_APPLY,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客服审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
} else {
|
|
throw new BizException('该售后订单状态异常');
|
|
}
|
|
}
|
|
|
|
public function agree(AfterSale $afterSale, array $params, $remarks = '用户已同意客服审核结果')
|
|
{
|
|
if ($this->isWaitAgree($afterSale)) {
|
|
switch ($afterSale->type) {
|
|
case AfterSale::TYPE_REFUND_AND_RETURN:
|
|
$afterSale->update([
|
|
'tracking_number'=>$params['tracking_number'],
|
|
'remarks'=> $remarks,
|
|
'state' => AfterSale::STATE_SHIPPING,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_REFUND://退款订单
|
|
$afterSale->update([
|
|
'remarks'=> $remarks,
|
|
'state' => AfterSale::STATE_FINANCE,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_CHANGE:
|
|
$afterSale->update([
|
|
'remarks' => $remarks,
|
|
'state' => AfterSale::STATE_SHIPPING,
|
|
]);
|
|
break;
|
|
case AfterSale::TYPE_FILL:
|
|
$afterSale->update([
|
|
'remarks' => $remarks,
|
|
'state' => AfterSale::STATE_FINISH,
|
|
]);
|
|
break;
|
|
}
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '客户确认',
|
|
'desc' => $remarks,
|
|
]);
|
|
return $afterSale;
|
|
} else {
|
|
throw new BizException('售后订单状态异常,请稍后再试');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 物流确认收货
|
|
*
|
|
* @param AfterSale $afterSale
|
|
* @param string $remarks
|
|
* @return void
|
|
*/
|
|
public function shipping(AfterSale $afterSale, $remarks ='物流确认收货')
|
|
{
|
|
if ($this->isWaitShipping($afterSale)) {
|
|
$afterSale->update([
|
|
'state' => $afterSale::STATE_FINANCE,
|
|
'remarks' => $remarks,
|
|
]);
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '仓库审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
} else {
|
|
throw new BizException('该售后订单状态异常');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 财务确认退款
|
|
*
|
|
* @return void
|
|
*/
|
|
public function finance(AfterSale $afterSale, $remarks ='退款成功')
|
|
{
|
|
if ($this->isWaitFinance($afterSale)) {
|
|
if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) {
|
|
//todo-执行实际退款操作;
|
|
} elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程
|
|
//todo-执行生成新的订单,发货单操作;
|
|
}
|
|
|
|
AfterSaleLog::create([
|
|
'after_sale_id' => $afterSale->id,
|
|
'name' => '财务审核',
|
|
'desc' => $remarks,
|
|
]);
|
|
$afterSale->update([
|
|
'state' => $afterSale::STATE_FINISH,
|
|
'remarks' => $remarks,
|
|
]);
|
|
} else {
|
|
throw new BizException('该售后订单状态异常');
|
|
}
|
|
}
|
|
}
|