Files
xk-api-yii/common/forms/PrescripRefundForm.php

164 lines
6.4 KiB
PHP

<?php
namespace common\forms;
use common\core\BaseModel;
use common\events\OrderEvent;
use common\helpers\FuncHelper;
use common\models\oldDb\PaymentPrescripOrder;
use common\models\oldDb\PaymentPrescripRefund;
use common\models\oldDb\PrescripOrderRefund;
use common\models\oldDb\Prescription;
use common\services\WechatService;
use yii\base\Exception;
class PrescripRefundForm extends BaseModel
{
public function rules()
{
return [
];
}
public function refund($order_id)
{
$prescription = Prescription::find()->where([
'user_id' =>\Yii::$app->user->identity->getId(),
'id' => $order_id
])->one();
if(!$prescription || $prescription->cancel_status){
throw new Exception('订单不存在');
}
switch($prescription->is_pay){
case 0://未支付
$t = \Yii::$app->db->beginTransaction();
try {
$prescription->cancel_status = 1;
$prescription->cancel_time = time();
$prescription->cancel_remark = '主动取消订单';
$prescription->saveOrFail();
$event = new OrderEvent([
'order' => $prescription,
]);
\Yii::$app->trigger(Prescription::AUTO_EXPIRE, $event);
$t->commit();
return [];
} catch (\Exception $exception) {
$t->rollBack();
throw $exception;
}
case 1://已支付
$config = \Yii::$app->params;
$orderForbiddenRefundTime = isset($config['product_order']['forbidden_refund_time']) ? $config['product_order']['forbidden_refund_time'] :3600*24*7;
if ($prescription->prescription_type==1 || $prescription->prescription_type==3 ){
throw new Exception('中药饮片和配方颗粒禁止退款');
}
if ($prescription->prescription_type==2 &&$prescription->prescription_type==4 ){
if (time()-$prescription->pay_time>=120){
throw new Exception('西药一周之后禁止退款');
}
}
$t = \Yii::$app->db->beginTransaction();
try {
//生成记录
$prescripOrderRefund = new PrescripOrderRefund();
$prescripOrderRefund->user_id = $prescription->user_id;
$prescripOrderRefund->order_id = $prescription->id;
$prescripOrderRefund->refund_no = FuncHelper::generate_order_no('RF');
$prescripOrderRefund->refund_price = $prescription->total_pay_price;
$prescripOrderRefund->remark = '主动取消订单';
$prescripOrderRefund->saveOrFail();
//取消状态
$prescription->cancel_status = 1;
$prescription->cancel_time = time();
$prescription->cancel_remark = '主动取消订单';
//退款状态
$prescription->refund_status = 1;
$prescription->refund_time = time();
$prescription->saveOrFail();
//退款操作
$this->refundMoney($prescripOrderRefund); //可能报错 无效的订单号
$t->commit();
}catch (Exception $exception){
$t->rollBack();
throw $exception;
}
break;
}
}
public function refundMoney($prescripOrderRefund)
{
$orderNo = $prescripOrderRefund->order->order_no;
$prescription = Prescription::findOne([
'order_no' => $orderNo,
'is_pay' => 1
]);
$paymentPrescripOrder = PaymentPrescripOrder::findOne([
'order_no' => $orderNo,
'is_pay' => 1
]);
if (!$prescription || !$paymentPrescripOrder) {
throw new Exception('无效的订单号');
}
$price = $prescripOrderRefund->refund_price;
if(bccomp($paymentPrescripOrder->amount,$price,2)==-1){
throw new Exception('退款金额大于可退款金额');
}
$transaction = \Yii::$app->db->beginTransaction();
try {
$paymentPrescripRefund = new PaymentPrescripRefund();
$paymentPrescripRefund->refund_no = $prescripOrderRefund->refund_no;
$paymentPrescripRefund->amount = $price;
$paymentPrescripRefund->is_pay = 0;
$paymentPrescripRefund->pay_type = 0;
$paymentPrescripRefund->created_at = time();
$paymentPrescripRefund->saveOrFail();
if(bccomp($price,0,2)<=0) {
$paymentPrescripRefund->is_pay = 1;
$paymentPrescripRefund->save();
$prescripOrderRefund->is_refund = 1;
$prescripOrderRefund->refund_time = time();
$prescripOrderRefund->save();
}else{
if(\Yii::$app instanceof \yii\web\Application){
$notifyUrl = \Yii::$app->request->hostInfo."/member/v1/callback/refund-notify/";
}else{
//如果是job中调用的
$notifyUrl = \Yii::$app->getHostInfo()."/member/v1/callback/refund-notify/";
}
$order_amount = bcmul($paymentPrescripOrder->amount,100,0);
$refund_amount = bcmul($price,100,0);
$result = WechatService::getInstance()->payment->refund->byTransactionId($paymentPrescripOrder->transaction_id, $paymentPrescripRefund->refund_no,$order_amount, $refund_amount, [
'refund_desc' => '订单取消退款',
'notify_url' => $notifyUrl
]);
if($result['return_code']!='SUCCESS' || $result['result_code']!='SUCCESS'){
$error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg'];
throw new Exception($error);
}
//其他状态变更在回调
}
$transaction->commit();
return [];
}catch (\Exception $exception){
$transaction->rollBack();
throw $exception;
}
}
}