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

403 lines
14 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\Admin\Services\OrderService;
use App\Exceptions\BizException;
use App\Helpers\Order as OrderHelper;
use App\Models\AfterSale;
use App\Models\AfterSaleLog;
use App\Models\Order;
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)) {
$order = $afterSale->order;
if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) {
//执行实际退款操作;
if ($afterSale->amount > 0) {//退款金额大于0才做实际退款
$order->refundLogs()->create([
'sn' => OrderHelper::serialNumber(),
'amount' => $afterSale->amount,
'reason' => '售后退款',
]);
}
} elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程
//复制一个订单存商品价格支付价格为0;
$changeOrder = new Order();
$changeOrder->user_id = $order->user_id;
$changeOrder->sn = OrderHelper::serialNumber();
$changeOrder->products_total_amount = bcmul($afterSale->orderProduct->sell_price, $afterSale->num);
$changeOrder->coupon_discount_amount = 0;
$changeOrder->vip_discount_amount = bcmul(($afterSale->orderProduct->sell_price-$afterSale->orderProduct->vip_price), $afterSale->num);
$changeOrder->reduced_amount = 0;
$changeOrder->shipping_fee = 0;
$changeOrder->total_amount = 0;
// 收货地址
$changeOrder->consignee_name = $order->consignee_name;
$changeOrder->consignee_telephone = $order->consignee_telephone;
$changeOrder->consignee_zone = $order->consignee_zone;
$changeOrder->consignee_address = $order->consignee_address;
//标记是换货单
$changeOrder->is_change = true;
$changeOrder->save();
OrderProduct::create([
'user_id' => $changeOrder->user_id,
'order_id' => $changeOrder->id,
'spu_id' => $afterSale->orderProduct->spu_id,
'sku_id' => $afterSale->orderProduct->sku_id,
'category_id' => $afterSale->orderProduct->category_id,
'name' => $afterSale->orderProduct->name,
'specs' => $afterSale->orderProduct->specs,
'cover' => $afterSale->orderProduct->cover,
'weight' => $afterSale->orderProduct->weight,
'sell_price' => $afterSale->orderProduct->sell_price,
'vip_price' => $afterSale->orderProduct->vip_price,
'quantity' => $afterSale->num,
'coupon_discount_amount'=> 0,
'vip_discount_amount' => $afterSale->orderProduct->sell_price - $afterSale->orderProduct->vip_price,
'reduced_amount' => 0,
'total_amount' => $afterSale->amount,
]);
$orderService = new OrderService();
$orderService->adminPay($changeOrder);//支付该订单
$changeOrder->update([
'shipping_state' => Order::SHIPPING_STATE_PROCESSING,
]);
}
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,
'name' => '财务审核',
'desc' => $remarks,
]);
$afterSale->update([
'state' => $afterSale::STATE_FINISH,
'remarks' => $remarks,
]);
} else {
throw new BizException('该售后订单状态异常');
}
}
}