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 }