From 615982cd1958991641264bc103dd8d5ae392da13 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Mon, 11 Sep 2023 17:06:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=96=E6=B6=88=E5=95=86?= =?UTF-8?q?=E5=93=81=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/router/router.go | 4 +- api/service/orderProduct.go | 246 ++++++++++++++++++++++++------------ 2 files changed, 164 insertions(+), 86 deletions(-) diff --git a/api/router/router.go b/api/router/router.go index 8a9e07d..026981d 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -368,7 +368,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { inquiryGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiry) // 取消问诊订单 - inquiryGroup.PUT("/:order_inquiry_id", api.OrderInquiry.CancelOrderInquiry) + inquiryGroup.PUT("/cancel/:order_inquiry_id", api.OrderInquiry.CancelOrderInquiry) } // 问诊订单 @@ -381,7 +381,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { productGroup.GET("/:order_product_id", api.OrderProduct.GetOrderProduct) // 取消药品订单 - productGroup.PUT("/:order_product_id", api.OrderProduct.CancelOrderProduct) + productGroup.PUT("/cancel/:order_product_id", api.OrderProduct.CancelOrderProduct) } } } diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index 3203936..b407f88 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -4,7 +4,13 @@ import ( "errors" "fmt" "hospital-admin-api/api/dao" + "hospital-admin-api/api/model" "hospital-admin-api/api/responses/orderProductResponse" + "hospital-admin-api/config" + "hospital-admin-api/extend/weChat" + "hospital-admin-api/global" + "strconv" + "time" ) type OrderProductService struct { @@ -111,90 +117,162 @@ func (r *OrderProductService) GetOrderProduct(orderProductId int64) (getOrderPro // CancelOrderProduct 取消药品订单 func (r *OrderProductService) CancelOrderProduct(orderProductId int64) (bool, error) { - // // 获取药品订单详情 - // orderProductDao := dao.OrderProductDao{} - // orderProduct, err := orderProductDao.GetOrderProductPreloadById(orderProductId) - // if err != nil || orderProduct == nil { - // return false, errors.New("订单数据错误") - // } - // - // // 检测订单状态 - // if orderProduct.OrderProductStatus == 1 { - // return false, errors.New("订单处于待支付状态,无法取消") - // } - // - // if orderProduct.OrderProductStatus == 3 { - // return false, errors.New("订单已发货,无法取消") - // } - // - // if orderProduct.OrderProductStatus == 4 { - // return false, errors.New("订单已签收,无法取消") - // } - // - // if orderProduct.OrderProductStatus == 5 { - // return false, errors.New("订单已取消,无法取消") - // } - // - // // 检测订单退款状态 - // if orderProduct.RefundStatus == 1 { - // return false, errors.New("订单申请退款中,无法取消") - // } - // - // if orderProduct.RefundStatus == 2 { - // return false, errors.New("订单正在退款中,无法取消") - // } - // - // if orderProduct.RefundStatus == 3 { - // return false, errors.New("订单已退款成功,无法取消") - // } - // - // if orderProduct.RefundStatus == 6 { - // return false, errors.New("订单退款异常,请联系技术人员") - // } - // - // // 检测订单支付状态 - // if orderProduct.PayStatus != 2 { - // return false, errors.New("订单未支付,无需取消") - // } - // - // // 开始事务 - // tx := global.Db.Begin() - // defer func() { - // if r := recover(); r != nil { - // tx.Rollback() - // } - // }() - // - // // 药品订单修改数据 - // orderProductData := make(map[string]interface{}) - // - // // 退款编号 - // refundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) - // - // // 退款状态转换 - // var productRefundStatus int - // var successTime time.Time - // var refundId string - // - // refundRequest := weChat.RefundRequest{ - // TransactionId: orderProduct.EscrowTradeNo, - // OutTradeNo: orderProduct.OrderProductNo, - // OutRefundNo: refundNo, - // Reason: "客服取消", - // PaymentAmountTotal: int64(orderProduct.PaymentAmountTotal * 100), - // NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientProductRefundNotifyUrl, - // } - // - // 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("退款状态错误") - // } + // 获取药品订单详情 + orderProductDao := dao.OrderProductDao{} + orderProduct, err := orderProductDao.GetOrderProductPreloadById(orderProductId) + if err != nil || orderProduct == nil { + return false, errors.New("订单数据错误") + } + + // 检测订单状态 + if orderProduct.OrderProductStatus == 1 { + return false, errors.New("订单处于待支付状态,无法取消") + } + + if orderProduct.OrderProductStatus == 3 { + return false, errors.New("订单已发货,无法取消") + } + + if orderProduct.OrderProductStatus == 4 { + return false, errors.New("订单已签收,无法取消") + } + + if orderProduct.OrderProductStatus == 5 { + return false, errors.New("订单已取消,无法取消") + } + + // 已上报暂不允许取消订单 + if orderProduct.ReportPreStatus == 1 { + return false, errors.New("订单已上报,暂不允许取消") + } + + // 检测订单退款状态 + if orderProduct.RefundStatus == 1 { + return false, errors.New("订单申请退款中,无法取消") + } + + if orderProduct.RefundStatus == 2 { + return false, errors.New("订单正在退款中,无法取消") + } + + if orderProduct.RefundStatus == 3 { + return false, errors.New("订单已退款成功,无法取消") + } + + if orderProduct.RefundStatus == 6 { + return false, errors.New("订单退款异常,请联系技术人员") + } + + // 检测订单支付状态 + if orderProduct.PayStatus != 2 { + return false, errors.New("订单未支付,无需取消") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 药品订单修改数据 + orderProductData := make(map[string]interface{}) + + // 退款编号 + refundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + + // 退款状态转换 + var refundStatus int + var successTime time.Time + var refundId string + + refundRequest := weChat.RefundRequest{ + TransactionId: orderProduct.EscrowTradeNo, + OutTradeNo: orderProduct.OrderProductNo, + OutRefundNo: refundNo, + Reason: "客服取消", + PaymentAmountTotal: int64(orderProduct.PaymentAmountTotal * 100), + NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientProductRefundNotifyUrl, + } + + 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("退款状态错误") + } + + if *refund.Status == "SUCCESS" { + // 退款成功 + refundStatus = 3 + + if refund.SuccessTime != nil { + successTime = *refund.SuccessTime + } + } else if *refund.Status == "CLOSED" { + // 退款关闭 + refundStatus = 5 + + } else if *refund.Status == "PROCESSING" { + // 退款处理中 + refundStatus = 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("缺少退款订单编号") + } + + // 退款编号 + refundId = *refund.RefundId + + orderProductData["refund_status"] = refundStatus + orderProductData["order_product_status"] = 5 // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) + orderProductData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间 + orderProductData["cancel_reason"] = 4 // 订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消) + orderProductData["cancel_remarks"] = "客服取消" // 取消订单备注(自动添加) + + // 修改问诊订单退款状态 + err = orderProductDao.EditOrderProductById(tx, orderProductId, orderProductData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 新增退款表 + orderProductRefund := &model.OrderProductRefund{ + PatientId: orderProduct.PatientId, + OrderProductId: orderProductId, + OrderProductNo: orderProduct.OrderProductNo, + ProductRefundNo: refundNo, + RefundId: refundId, + ProductRefundStatus: refundStatus, + RefundTotal: orderProduct.PaymentAmountTotal, + RefundReason: "客服取消", + SuccessTime: model.LocalTime(successTime), + } + + orderProductRefundDao := dao.OrderProductRefundDao{} + orderProductRefund, err = orderProductRefundDao.AddOrderProductRefund(tx, orderProductRefund) + if err != nil || orderProductRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() return true, nil }