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

209 lines
8.6 KiB
PHP

<?php
namespace common\forms;
use common\core\BaseModel;
use common\enums\RegisterEnum;
use common\enums\SystemNoticeTypeEnum;
use common\helpers\FuncHelper;
use common\models\oldDb\PaymentRegister;
use common\models\oldDb\PaymentRegisterRefund;
use common\models\oldDb\Register;
use common\models\oldDb\RegisterRefund;
use common\models\oldDb\SystemNotice;
use common\services\EplPayService;
use common\services\WechatService;
use yii\base\Exception;
class RegisterRefundForm extends BaseModel
{
public function rules()
{
return [
];
}
public function refund($register_id)
{
$Register = Register::find()->where([
// 'user_id' => \Yii::$app->user->identity->id,
'id' => $register_id
])->one();
if (!$Register || $Register->is_cancel==1) {
throw new Exception('订单不存在');
}
if ($Register->status == 2 || $Register->status == 3 || $Register->status == 5 || $Register->status == 6) {
throw new Exception('医生接诊后不能取消挂号!!');
}
switch ($Register->is_pay) {
case 0://未支付
$t = \Yii::$app->db->beginTransaction();
try {
$Register->status = RegisterEnum::CANCEL;
$Register->is_cancel = 1;
$Register->cancel_time = time();
$Register->cancel_remark = '您已主动取消订单';
$Register->created_at = time();
$Register->updated_at = time();
$Register->saveOrFail();
//生成系统消息
$SystemNotice = new SystemNotice();
$SystemNotice->content = '您已主动取消订单';
$SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL;
$SystemNotice->scene_type = 1;//用户端
$SystemNotice->user_id = \Yii::$app->user->identity->getId();
$SystemNotice->notice_at = date('Y-m-d H:i:s', time());
$SystemNotice->saveOrFail();
//分账状态更新
$ledgerForm = new LedgerForm();
$ledgerForm->order_id = $Register->id;
$ledgerForm->status = 2;
$ledgerForm->update('register');
// $event = new RegisterEvent([
// 'register' => $Register,
// ]);
// \Yii::$app->trigger(Register::EVENT_CANCELED, $event);
$t->commit();
return [];
} catch (\Exception $exception) {
$t->rollBack();
throw $exception;
}
break;
case 1://已支付
$t = \Yii::$app->db->beginTransaction();
try {
//生成记录
$RegisterRefund = new RegisterRefund();
$RegisterRefund->user_id = $Register->user_id;
$RegisterRefund->register_id = $Register->id;
$RegisterRefund->refund_no = FuncHelper::generate_order_no('RF');
$RegisterRefund->refund_price = $Register->price;
$RegisterRefund->remark = '主动取消订单';
$RegisterRefund->saveOrFail();
//取消状态
$Register->is_cancel = 1;
$Register->cancel_time = time();
$Register->cancel_remark = '您已主动取消订单';
//退款状态
$Register->refund_status = 1;
$Register->refund_time = time();
$Register->status = RegisterEnum::CANCEL;
$Register->created_at = time();
$Register->updated_at = time();
$Register->saveOrFail();
//生成系统消息
$SystemNotice = new SystemNotice();
$SystemNotice->content = '您已主动取消订单';
$SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL;
$SystemNotice->scene_type = 1;//用户端
$SystemNotice->user_id = \Yii::$app->user->identity->getId();
$SystemNotice->notice_at = date('Y-m-d H:i:s', time());
$SystemNotice->saveOrFail();
//退款操作
$this->refundMoney($RegisterRefund); //可能报错 无效的订单号
$t->commit();
} catch (Exception $exception) {
$t->rollBack();
throw $exception;
}
break;
}
}
public function refundMoney($RegisterRefund)
{
$orderNo = $RegisterRefund->register->order_no;
$Register = Register::findOne([
'order_no' => $orderNo,
'is_pay' => 1
]);
$PaymentRegister = PaymentRegister::findOne([
'order_no' => $orderNo,
'is_pay' => 1
]);
// return [$PaymentRegister->transaction_id];
if (!$Register || !$PaymentRegister) {
throw new Exception('无效的订单号');
}
$price = $RegisterRefund->refund_price;
if (bccomp($PaymentRegister->amount, $price, 2) == -1) {
throw new Exception('退款金额大于可退款金额');
}
$transaction = \Yii::$app->db->beginTransaction();
try {
$PaymentRegisterRefund = new PaymentRegisterRefund();
$PaymentRegisterRefund->refund_no = $RegisterRefund->refund_no;
$PaymentRegisterRefund->amount = $price;
$PaymentRegisterRefund->is_pay = 0;
$PaymentRegisterRefund->pay_type = 0;
$PaymentRegisterRefund->created_at = time();
$PaymentRegisterRefund->saveOrFail();
if (bccomp($price, 0, 2) <= 0) {
$PaymentRegisterRefund->is_pay = 1;
$PaymentRegisterRefund->save();
$RegisterRefund->is_refund = 1;
$RegisterRefund->refund_time = time();
$RegisterRefund->save();
} else {
switch ($PaymentRegister->pay_type) {
case 1://微信退款
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($PaymentRegister->amount, 100, 0);
$refund_amount = bcmul($price, 100, 0);
$result = WechatService::getInstance()->payment->refund->byTransactionId($PaymentRegister->transaction_id, $PaymentRegisterRefund->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);
}
break;
case 2://易票联退款
$eplResult = EplPayService::getInstance()->refund([
'refund_no' => $PaymentRegisterRefund->refund_no,
'transaction_id' => $PaymentRegister->transaction_id,
'total_pay_price' => $PaymentRegister->amount,
'refund_price' => $price,
]);
if (!isset($eplResult['returnCode']) || $eplResult['returnCode'] != '0000') {
throw new Exception($eplResult['returnMsg']);
}
break;
default:
throw new Exception('退款失败,请联系客服');
break;
}
//其他状态变更在回调
}
$transaction->commit();
return [];
} catch (\Exception $exception) {
$transaction->rollBack();
throw $exception;
}
}
}