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

354 lines
11 KiB
PHP

<?php
namespace App\Services;
use App\Exceptions\BizException;
use App\Helpers\Order as OrderHelper;
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
{
// if (is_null($orderProduct->after_expire_at)) {
// throw new BizException('该订单商品还未签收无法发起售后');
// }
// // 校验这个订单商品是否还能发起售后-待完成
// if ($orderProduct->after_expire_at < now()) {
// throw new BizException('该订单商品已过售后时间');
// }
// //校验该订单商品不能有已完成、处理中的售后记录
// if ($orderProduct->after_sale_state > 0) {
// throw new BizException('该订单商品已申请售后');
// }
if (!$orderProduct->can_after_sale) {
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,
]));
$orderProduct->after_sale_state = 1;
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([
'tracking_number'=>$params['tracking_number'],
'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 shippingFail(AfterSale $afterSale, $remarks ='物流收货未通过')
{
if ($this->isWaitShipping($afterSale)) {
$afterSale->update([
'state' => $afterSale::STATE_VERIFY,
'remarks' => $remarks,
]);
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,
'name' => '仓库审核',
'desc' => $remarks,
]);
} 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-执行实际退款操作;
$order = $afterSale->order;
$order->refundTasks()->create([
'sn' => OrderHelper::serialNumber(),
'amount' => $order->total_amount,
'reason' => '取消订单',
]);
} 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('该售后订单状态异常');
}
}
}