6
0
Fork 0
jiqu-library-server/app/Services/AfterSaleService.php

314 lines
9.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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('该售后订单状态异常');
}
}
}