314 lines
9.8 KiB
PHP
314 lines
9.8 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_FINISH)->exists()) {
|
||
throw new BizException('该订单商品已申请售后');
|
||
}
|
||
//校验申请数量不能超过订单商品数量
|
||
if ($num > $orderProduct->quantity) {
|
||
throw new BizException('申请售后的数量不能大于订单商品数量');
|
||
}
|
||
|
||
switch ($type) {
|
||
case in_array($type, [3, 4])://换货,漏发退款金额为0
|
||
$amount = 0;
|
||
break;
|
||
default:
|
||
// dd(bcmul(bcdiv(10, 3, 2), 3, 2));如果数量相等,则直接取总额
|
||
$amount = ($num == $orderProduct->quantity) ? $orderProduct->total_amount : bcmul(bcdiv($orderProduct->total_amount, $orderProduct->quantity, 2), $num, 2);
|
||
break;
|
||
}
|
||
$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)
|
||
{
|
||
if ($this->isWaitVerify($afterSale)) {
|
||
switch ($afterSale->type) {
|
||
case AfterSale::TYPE_REFUND_AND_RETURN:
|
||
$afterSale->update([
|
||
'state' => $afterSale::STATE_AGREE,
|
||
'remarks' => $remarks,
|
||
]);
|
||
AfterSaleLog::create([
|
||
'after_sale_id' => $afterSale->id,
|
||
'name' => '客服审核',
|
||
'desc' => $remarks,
|
||
]);
|
||
break;
|
||
case AfterSale::TYPE_REFUND:
|
||
$afterSale->update([
|
||
'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_FINISH,
|
||
]);
|
||
//todo - 生成新订单以及发货单;
|
||
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)) {
|
||
|
||
//todo-执行实际退款操作;
|
||
|
||
AfterSaleLog::create([
|
||
'after_sale_id' => $afterSale->id,
|
||
'name' => '财务审核',
|
||
'desc' => $remarks,
|
||
]);
|
||
$afterSale->update([
|
||
'state' => $afterSale::STATE_FINISH,
|
||
'remarks' => $remarks,
|
||
]);
|
||
} else {
|
||
throw new BizException('该售后订单状态异常');
|
||
}
|
||
}
|
||
}
|