Files
hyperf_service/app/Service/Amqp/Refund/RefundService.php
2025-02-24 15:06:26 +08:00

218 lines
5.1 KiB
PHP

<?php
namespace App\Service\Amqp\Refund;
use App\Constants\Common\OrderCode;
use App\Constants\Common\PayCode;
use App\Constants\Common\RefundCode;
use App\Lib\Log;
use App\Model\Order;
use App\Model\PayOrder;
use App\Model\RefundOrder;
use App\Service\Common\Pay\Wx\WxJsRechargeOrderService;
use Exception;
use Hyperf\Di\Annotation\Inject;
class RefundService
{
/**
* @var int
*/
public int $orderId;
/**
* @var int
*/
protected int $type;
/**
* @var PayOrder
*/
#[Inject]
protected PayOrder $payOrderModel;
/**
* @var Order
*/
#[Inject]
protected Order $orderModel;
/**
* @var RefundOrder
*/
#[Inject]
protected RefundOrder $refundOrderModel;
/**
* @var Log
*/
#[Inject]
protected Log $log;
/**
* @var mixed
*/
protected mixed $payInfo;
/**
* @var mixed
*/
protected mixed $orderInfo;
/**
* @var mixed
*/
protected mixed $refundInfo;
/**
* @var float
*/
public float $refundAmount;
/**
* @var float
*/
protected float $isRefundMoney;
/**
*
*/
public function handle(): void
{
$errMsg = null;
try {
$this->getOrderInfo();
$this->checkOrder();
$this->getPayAndRefundOrder();
$this->getAllRefundMoneyByOrderId();
$this->checkRefundAmount();
$this->refund();
} catch (Exception $e) {
$this->log->error('RefundOrderConsumer:RefundService:error:'.$e->getMessage());
$errArr = explode(":", $e->getMessage());
$errMsg = $errArr[0];
}
$this->updateRefund($errMsg);
}
/**
* @return void
* @throws Exception
*/
protected function getPayAndRefundOrder(): void
{
$this->payInfo = $this->payOrderModel->getInfoByOrderIdAndType($this->orderId, $this->type);
$this->refundInfo = $this->refundOrderModel->getInfoByOrderIdAndTypeWaitRefund($this->orderId,$this->type);
if (!$this->payInfo || !$this->refundInfo) throw new Exception('订单信息不存在');
}
/**
* @return void
*/
protected function getOrderInfo()
{
$this->orderInfo = match ($this->type) {
OrderCode::ORDER_TYPE_GOOD => $this->orderModel->getInfoById($this->orderId),
default => null,
};
}
/**
* @return void
* @throws Exception
*/
protected function checkOrder()
{
if (empty($orderInfo)) throw new Exception('订单信息不存在:'.json_encode(['order_id' => $this->orderId,'order_type' => $this->type]));
if (!in_array($orderInfo->status,OrderCode::CAN_REFUND_STATUS)) throw new Exception('订单状态不能退款:'.json_encode($this->orderInfo->toArray()));
//余额订单必须退款全部金额
if ($this->type == OrderCode::ORDER_TYPE_BALANCE && $this->refundAmount != $this->orderInfo->actual_price) throw new Exception('余额订单必须退款全部金额:'.json_encode($this->orderInfo->toArray()));
}
/**
* @return void
*/
protected function getAllRefundMoneyByOrderId(): void
{
$this->isRefundMoney = $this->refundOrderModel->getSuccessMoneyByOrderId($this->orderId,$this->type);
}
protected function getUser()
{
//todo 获取用户信息
}
/**
* @return void
* @throws Exception
*/
protected function checkRefundAmount(): void
{
// 等于支付金额 减去 已退款金额 减去 本次退款金额 小于 0 就是错误的 大于等于 0 就是正确的
if ($this->orderInfo->actual_price - $this->isRefundMoney - $this->refundAmount < 0) throw new Exception('退款金额不能大于订单金额');
$this->refundAmount = 0;
}
/**
* @return void
*/
protected function updateRefund($errMsg = null)
{
$status = RefundCode::REFUND_FAIL;
if (empty($errMsg)) {
$status = RefundCode::WAIT_BY_PAY_TOOL;
$errMsg = '等待支付工具退款';
}
$this->refundOrderModel->where('id',$this->refundInfo->id)->update([
'refund_status' => $status,
'remark' => $errMsg
]);
}
protected function refund()
{
$rechargeService = match ($this->refundInfo->refund_type)
{
PayCode::ALIPAY => $this->setAliPayRefund(),
PayCode::WECHAT_PAY => $this->setWechatPayRefund(),
};
$rechargeService->setConfig();
$rechargeService->setNotify();
$payData = $rechargeService->pay(
(float)$this->orderInfo->actual_price,
$this->request->input('body','订单支付'),
$this->orderInfo->order_no,
$this->userId
);
}
protected function setAliPayRefund()
{
return null;
}
/**
* @return WxJsRechargeOrderService
*/
protected function setWechatPayRefund(): WxJsRechargeOrderService
{
return new WxJsRechargeOrderService();
}
}