新增微信支付对接,后台客服取消订单

This commit is contained in:
2023-08-03 14:42:33 +08:00
parent faabe27f32
commit 96308ff608
18 changed files with 684 additions and 1 deletions
+182
View File
@@ -0,0 +1,182 @@
package service
import (
"errors"
"hospital-admin-api/api/dao"
"hospital-admin-api/api/model"
"hospital-admin-api/config"
"hospital-admin-api/extend/weChat"
"hospital-admin-api/global"
"strconv"
"time"
)
type OrderInquiryService struct {
}
// CancelOrderInquiry 取消问诊订单
func (r *OrderInquiryService) CancelOrderInquiry(orderInquiryId int64) (bool, error) {
// 获取订单数据
orderInquiryDao := dao.OrderInquiryDao{}
orderInquiry, err := orderInquiryDao.GetOrderInquiryById(orderInquiryId)
if err != nil || orderInquiry == nil {
return false, errors.New("订单数据错误")
}
// 检测订单状态 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
if orderInquiry.InquiryStatus == 6 {
return false, errors.New("订单已结束,无法取消")
}
if orderInquiry.InquiryStatus == 7 {
return false, errors.New("订单已取消,无法再次取消")
}
if orderInquiry.InquiryStatus == 1 {
return false, errors.New("订单处于待支付状态,无法取消")
}
if orderInquiry.InquiryStatus == 2 {
return false, errors.New("订单处于分配状态,无法取消")
}
if orderInquiry.InquiryStatus == 3 {
return false, errors.New("订单处于等待接诊状态,无法取消")
}
// 检测订单退款状态 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
if orderInquiry.InquiryRefundStatus == 1 {
return false, errors.New("订单申请退款中,无法取消")
}
if orderInquiry.InquiryRefundStatus == 2 {
return false, errors.New("订单正在退款中,无法取消")
}
if orderInquiry.InquiryRefundStatus == 3 {
return false, errors.New("订单已退款成功,无法取消")
}
if orderInquiry.InquiryRefundStatus == 6 {
return false, errors.New("订单退款异常,请联系技术人员")
}
// 检测支付状态 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
if orderInquiry.InquiryPayStatus != 2 {
return false, errors.New("订单未支付,无需取消")
}
// 订单完成时间预留5分钟进行操作
if !orderInquiry.CompleteTime.IsZero() {
// 计算三天后的时间
threeDaysLater := orderInquiry.CompleteTime.Add(3 * 24 * time.Hour)
if time.Since(threeDaysLater) > 5*time.Minute {
return false, errors.New("距离订单完成时间不足5分钟,无法取消")
}
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 问诊订单修改数据
orderInquiryData := make(map[string]interface{})
// 发起退款
if orderInquiry.PaymentAmountTotal > 0 {
// 退款编号
inquiryRefundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10)
refundRequest := weChat.RefundRequest{
TransactionId: orderInquiry.EscrowTradeNo,
OutTradeNo: orderInquiry.InquiryNo,
OutRefundNo: inquiryRefundNo,
Reason: "客服取消",
PaymentAmountTotal: int64(orderInquiry.PaymentAmountTotal * 100),
NotifyUrl: "https://dev.hospital.applets.igandanyiyuan.com/" + config.C.Wechat.PatientInquiryRefundNotifyUrl,
}
refund, err := refundRequest.Refund()
if err != nil {
tx.Rollback()
return false, errors.New(err.Error())
}
if refund.Status == nil {
tx.Rollback()
return false, errors.New("退款状态错误")
}
// 退款状态转换
var inquiryRefundStatus int
var successTime time.Time
if *refund.Status == "SUCCESS" {
// 退款成功
inquiryRefundStatus = 3
if refund.SuccessTime != nil {
// 使用 time.Parse 解析时间字符串为 time.Time 类型
successTime = *refund.SuccessTime
}
} else if *refund.Status == "CLOSED" {
// 退款关闭
inquiryRefundStatus = 5
} else if *refund.Status == "PROCESSING" {
// 退款处理中
inquiryRefundStatus = 2
} else if *refund.Status == "ABNORMAL" {
// 退款异常
tx.Rollback()
return false, errors.New("退款状态错误")
} else {
tx.Rollback()
return false, errors.New("退款状态错误")
}
if refund.RefundId == nil {
tx.Rollback()
return false, errors.New("缺少退款订单编号")
}
// 新增退款表
orderInquiryRefundDao := dao.OrderInquiryRefundDao{}
orderInquiryRefund := &model.OrderInquiryRefund{
PatientId: orderInquiry.PatientId,
OrderInquiryId: orderInquiryId,
InquiryNo: orderInquiry.InquiryNo,
InquiryRefundNo: inquiryRefundNo,
RefundId: *refund.RefundId,
InquiryRefundStatus: inquiryRefundStatus,
RefundTotal: orderInquiry.PaymentAmountTotal,
RefundReason: "客服取消",
SuccessTime: successTime,
}
orderInquiryRefund, err = orderInquiryRefundDao.AddOrderInquiryRefund(tx, orderInquiryRefund)
if err != nil || orderInquiryRefund == nil {
tx.Rollback()
return false, errors.New(err.Error())
}
}
orderInquiryData["inquiry_status"] = 7 // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
orderInquiryData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间
orderInquiryData["cancel_reason"] = 4 // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时)
orderInquiryData["cancel_remarks"] = "客服取消" // 取消订单备注(自动添加)
// 修改问诊订单退款状态
err = orderInquiryDao.EditOrderInquiryById(tx, orderInquiryId, orderInquiryData)
if err != nil {
tx.Rollback()
return false, errors.New("取消订单失败")
}
tx.Commit()
return true, nil
}