diff --git a/api/err/err.proto b/api/err/err.proto index 806b9e9..3923449 100644 --- a/api/err/err.proto +++ b/api/err/err.proto @@ -13,8 +13,6 @@ enum Err { // DB数据未找到 DB_NOT_FOUND = 1 [(errors.code) = 404]; - ORDER_NOT_FOUND = 2 [(errors.code) = 404]; - PRODUCT_NOT_FOUND = 3 [(errors.code) = 404]; } enum NotifyConsumeErr{ diff --git a/api/err/wechat.proto b/api/err/wechat.proto index 442c1dd..0190269 100644 --- a/api/err/wechat.proto +++ b/api/err/wechat.proto @@ -9,26 +9,30 @@ enum WechatErr{ WechatFAIL = 0 [(errors.code) = 500]; WechatUserIllegal = 1 [(errors.code) = 500]; - WechatMismatch = 2 [(errors.code) = 500]; + WechatAppIDMchIDMismatch = 2 [(errors.code) = 500]; + WechatOpenIDAppIDMismatch = 3 [(errors.code) = 500]; WechatInvalidMerchantID = 4 [(errors.code) = 500]; WechatHighFrequency = 5 [(errors.code) = 500]; WechatActivityInactive = 6 [(errors.code) = 500]; WechatBatchInfoError = 7 [(errors.code) = 500]; - WechatParamRequired = 8 [(errors.code) = 500]; - WechatInvalidBatchStatus = 10 [(errors.code) = 500]; - WechatMchNotExists = 11 [(errors.code) = 500]; - WechatBatchBudgetInsufficient = 9 [(errors.code) = 500]; - WechatDailyLimitExceeded = 12 [(errors.code) = 500]; - WechatAccountBalanceInsufficient = 13 [(errors.code) = 500]; - WechatBatchBudgetDepleted = 14 [(errors.code) = 500]; - WechatMerchantNoPermission = 15 [(errors.code) = 500]; - WechatCrossMerchantNotSupported = 16 [(errors.code) = 500]; - WechatUserReceiveLimit = 17 [(errors.code) = 500]; - WechatAPIChannelNotSupported = 18 [(errors.code) = 500]; - WechatSpecifiedDenominationNotSupported = 19 [(errors.code) = 500]; - WechatOnlyAdvertisingBatch = 20 [(errors.code) = 500]; - WechatUserMaxCoupons = 21 [(errors.code) = 500]; - WechatNaturalPersonRuleBlocked = 22 [(errors.code) = 500]; - WechatResourceNotExists = 23 [(errors.code) = 500]; - WechatFrequencyLimited = 24 [(errors.code) = 500]; + WechatAppIDRequired = 8 [(errors.code) = 500]; + WechatOpenIDRequired = 9 [(errors.code) = 500]; + WechatBatchIDRequired = 10 [(errors.code) = 500]; + WechatMerchantIDRequired = 11 [(errors.code) = 500]; + WechatInvalidBatchStatus = 12 [(errors.code) = 500]; + WechatMchNotExists = 13 [(errors.code) = 500]; + WechatBatchBudgetInsufficient = 14 [(errors.code) = 500]; + WechatDailyLimitExceeded = 15 [(errors.code) = 500]; + WechatAccountBalanceInsufficient = 16 [(errors.code) = 500]; + WechatBatchBudgetDepleted = 17 [(errors.code) = 500]; + WechatMerchantNoPermission = 18 [(errors.code) = 500]; + WechatCrossMerchantNotSupported = 19 [(errors.code) = 500]; + WechatUserReceiveLimit = 20 [(errors.code) = 500]; + WechatAPIChannelNotSupported = 21 [(errors.code) = 500]; + WechatSpecifiedDenominationNotSupported = 22 [(errors.code) = 500]; + WechatOnlyAdvertisingBatch = 23 [(errors.code) = 500]; + WechatUserMaxCoupons = 24 [(errors.code) = 500]; + WechatNaturalPersonRuleBlocked = 25 [(errors.code) = 500]; + WechatResourceNotExists = 26 [(errors.code) = 500]; + WechatFrequencyLimited = 27 [(errors.code) = 500]; } diff --git a/internal/biz/cmb.go b/internal/biz/cmb.go index 8ae448b..acd2635 100644 --- a/internal/biz/cmb.go +++ b/internal/biz/cmb.go @@ -11,7 +11,7 @@ import ( "voucher/internal/pkg/lock" ) -func (v *VoucherBiz) CmbOrder(ctx context.Context, req *bo.OrderCreateReqBo) (voucherNo string, err error) { +func (v *VoucherBiz) CmbOrder(ctx context.Context, req *bo.OrderCreateReqBo) (orderNo string, err error) { c := vo.CmbOrderLockKey.BuildCache([]string{req.OutBizNo, req.Type.String()}) @@ -26,12 +26,13 @@ func (v *VoucherBiz) CmbOrder(ctx context.Context, req *bo.OrderCreateReqBo) (vo if order != nil { if order.Status.IsFail() { + if err = v.orderRetry(ctx, order); err != nil { return err } } - voucherNo = order.VoucherNo + orderNo = order.OrderNo return nil } @@ -49,7 +50,7 @@ func (v *VoucherBiz) CmbOrder(ctx context.Context, req *bo.OrderCreateReqBo) (vo return err } - voucherNo = order.VoucherNo + orderNo = order.OrderNo return nil }) diff --git a/internal/biz/order.go b/internal/biz/order.go index 5e1c61e..4ecc846 100644 --- a/internal/biz/order.go +++ b/internal/biz/order.go @@ -52,11 +52,14 @@ func (v *VoucherBiz) order(ctx context.Context, req *bo.OrderCreateReqBo, produc func (v *VoucherBiz) orderRetry(ctx context.Context, order *bo.OrderBo) error { voucherNo, err := v.WechatCpnRepo.Order(ctx, order) + if err != nil { - return v.fail(ctx, order, err.Error()) + if err2 := v.fail(ctx, order, err.Error()); err2 != nil { + return err2 + } + return err } - order.VoucherNo = voucherNo return v.success(ctx, order, voucherNo) } diff --git a/internal/data/repoimpl/base.go b/internal/data/repoimpl/base.go index dabdf4f..389469a 100644 --- a/internal/data/repoimpl/base.go +++ b/internal/data/repoimpl/base.go @@ -2,17 +2,9 @@ package repoimpl import ( "time" - err2 "voucher/api/err" "voucher/internal/pkg/mapstructure" ) -var ( - ErrOrderRecordNotFound = err2.ErrorOrderNotFound("订单不存在") - ErrProductRecordNotFound = err2.ErrorProductNotFound("商品不存在") - ErrOrderNotifyRecordNotFound = err2.ErrorDbNotFound("订单通知数据不存在") - ErrWechatNotifyRegisterTagRecordNotFound = err2.ErrorDbNotFound("微信注册tag数据不存在") -) - type Base[D any, B any] struct{} func (*Base[D, B]) ToBo(d *D) *B { diff --git a/internal/data/repoimpl/order.go b/internal/data/repoimpl/order.go index 0b2f9f0..96aee71 100644 --- a/internal/data/repoimpl/order.go +++ b/internal/data/repoimpl/order.go @@ -5,6 +5,7 @@ import ( "gorm.io/gorm" "time" "unicode/utf8" + err2 "voucher/api/err" "voucher/internal/biz/bo" "voucher/internal/biz/repo" "voucher/internal/biz/vo" @@ -91,7 +92,7 @@ func (p *OrderRepoImpl) GetByOutBizNo(ctx context.Context, t vo.OrderType, outBi } if tx.RowsAffected == 0 { - return nil, ErrOrderRecordNotFound + return nil, err2.ErrorDbNotFound("订单数据不存在") } return p.ToBo(info), nil @@ -107,7 +108,7 @@ func (p *OrderRepoImpl) GetByID(ctx context.Context, id uint64) (*bo.OrderBo, er } if tx.RowsAffected == 0 { - return nil, ErrOrderRecordNotFound + return nil, err2.ErrorDbNotFound("订单数据不存在") } return p.ToBo(info), nil @@ -123,7 +124,7 @@ func (p *OrderRepoImpl) GetByOrderNo(ctx context.Context, orderNo string) (*bo.O } if tx.RowsAffected == 0 { - return nil, ErrOrderRecordNotFound + return nil, err2.ErrorDbNotFound("订单数据不存在") } return p.ToBo(info), nil @@ -139,7 +140,7 @@ func (p *OrderRepoImpl) GetByMBV(ctx context.Context, merchantNo, batchNo, vouch } if tx.RowsAffected == 0 { - return nil, ErrOrderRecordNotFound + return nil, err2.ErrorDbNotFound("订单数据不存在") } return p.ToBo(info), nil diff --git a/internal/data/repoimpl/order_notify.go b/internal/data/repoimpl/order_notify.go index 8d8dac7..2ab9e67 100644 --- a/internal/data/repoimpl/order_notify.go +++ b/internal/data/repoimpl/order_notify.go @@ -5,6 +5,7 @@ import ( "gorm.io/gorm" "time" "unicode/utf8" + err2 "voucher/api/err" "voucher/internal/biz/bo" "voucher/internal/biz/repo" "voucher/internal/biz/vo" @@ -37,7 +38,7 @@ func (p *OrderNotifyRepoImpl) GetByID(ctx context.Context, id uint64) (*bo.Order } if tx.RowsAffected == 0 { - return nil, ErrOrderNotifyRecordNotFound + return nil, err2.ErrorDbNotFound("订单通知数据不存在") } return p.ToBo(info), nil diff --git a/internal/data/repoimpl/product.go b/internal/data/repoimpl/product.go index 86d87f6..ca95f27 100644 --- a/internal/data/repoimpl/product.go +++ b/internal/data/repoimpl/product.go @@ -3,6 +3,7 @@ package repoimpl import ( "context" "gorm.io/gorm" + err2 "voucher/api/err" "voucher/internal/biz/bo" "voucher/internal/biz/repo" "voucher/internal/data" @@ -34,7 +35,7 @@ func (r *ProductRepoImpl) GetByPNO(ctx context.Context, PNO string) (*bo.Product } if tx.RowsAffected == 0 { - return nil, ErrProductRecordNotFound + return nil, err2.ErrorDbNotFound("商品数据不存在") } return r.ToBo(&item), nil diff --git a/internal/data/repoimpl/wechat_notify_register_tag.go b/internal/data/repoimpl/wechat_notify_register_tag.go index 7be7e23..aac8dab 100644 --- a/internal/data/repoimpl/wechat_notify_register_tag.go +++ b/internal/data/repoimpl/wechat_notify_register_tag.go @@ -5,6 +5,7 @@ import ( "gorm.io/gorm" "time" "unicode/utf8" + err2 "voucher/api/err" "voucher/internal/biz/bo" "voucher/internal/biz/repo" "voucher/internal/biz/vo" @@ -37,7 +38,7 @@ func (p *WechatNotifyRegisterTagRepoImpl) GetByStockIdAndMchId(ctx context.Conte } if tx.RowsAffected == 0 { - return nil, ErrWechatNotifyRegisterTagRecordNotFound + return nil, err2.ErrorDbNotFound("微信回调注册tag数据不存在") } return p.ToBo(info), nil diff --git a/internal/data/wechatrepoimpl/cpn_code.go b/internal/data/wechatrepoimpl/cpn_code.go index 38ac951..4b2c281 100644 --- a/internal/data/wechatrepoimpl/cpn_code.go +++ b/internal/data/wechatrepoimpl/cpn_code.go @@ -222,64 +222,64 @@ var _ = map[ErrCode][]APIError{ // 使用常量定义错误描述,减少硬编码 const ( - ErrorUserIllegal = "用户非法" - ErrorAppIDMchIDMismatch = "商户号与AppID不匹配" - ErrorOpenIDAppIDMismatch = "OpenID与AppID不匹配" - ErrorInvalidMerchantID = "非法的商户号" - ErrorHighFrequency = "调用频率过高" - ErrorActivityInactive = "活动已结束或未激活" - ErrorBatchInfoError = "批次信息获取失败,请确认参数是否有误" - ErrorAppIDRequired = "AppID必填" - ErrorOpenIDRequired = "OpenID必填" - ErrorBatchIDRequired = "批次号必填" - ErrorMerchantIDRequired = "商户号必填" - ErrorInvalidBatchStatus = "非法的批次状态" - ErrorMchNotExists = "商户号不合法" - ErrorBatchBudgetInsufficient = "批次预算不足" - ErrorDailyLimitExceeded = "发券超过单天限额" - ErrorAccountBalanceInsufficient = "账户余额不足,请充值" - ErrorBatchBudgetDepleted = "批次预算耗尽" - ErrorMerchantNoPermission = "商户无权发券" - ErrorCrossMerchantNotSupported = "批次不支持跨商户发券" - ErrorUserReceiveLimit = "用户被限领拦截" - ErrorAPIChannelNotSupported = "不能在API渠道发放" - ErrorSpecifiedDenominationNotSupported = "不支持指定面额发券" - ErrorOnlyAdvertisingBatch = "仅在广告场景下发放批次" - ErrorUserMaxCoupons = "用户已达最大领券次数" - ErrorNaturalPersonRuleBlocked = "被自然人规则拦截" - ErrorResourceNotExists = "批次不存在" - ErrorFrequencyLimited = "当前请求人数过多,请稍后重试" + ErrorWechatUserIllegal = "用户非法" + ErrorWechatAppIDMchIDMismatch = "商户号与AppID不匹配" + ErrorWechatOpenIDAppIDMismatch = "OpenID与AppID不匹配" + ErrorWechatInvalidMerchantID = "非法的商户号" + ErrorWechatHighFrequency = "调用频率过高" + ErrorWechatActivityInactive = "活动已结束或未激活" + ErrorWechatBatchInfoError = "批次信息获取失败,请确认参数是否有误" + ErrorWechatAppIDRequired = "AppID必填" + ErrorWechatOpenIDRequired = "OpenID必填" + ErrorWechatBatchIDRequired = "批次号必填" + ErrorWechatMerchantIDRequired = "商户号必填" + ErrorWechatInvalidBatchStatus = "非法的批次状态" + ErrorWechatMchNotExists = "商户号不合法" + ErrorWechatBatchBudgetInsufficient = "批次预算不足" + ErrorWechatDailyLimitExceeded = "发券超过单天限额" + ErrorWechatAccountBalanceInsufficient = "账户余额不足,请充值" + ErrorWechatBatchBudgetDepleted = "批次预算耗尽" + ErrorWechatMerchantNoPermission = "商户无权发券" + ErrorWechatCrossMerchantNotSupported = "批次不支持跨商户发券" + ErrorWechatUserReceiveLimit = "用户被限领拦截" + ErrorWechatAPIChannelNotSupported = "不能在API渠道发放" + ErrorWechatSpecifiedDenominationNotSupported = "不支持指定面额发券" + ErrorWechatOnlyAdvertisingBatch = "仅在广告场景下发放批次" + ErrorWechatUserMaxCoupons = "用户已达最大领券次数" + ErrorWechatNaturalPersonRuleBlocked = "被自然人规则拦截" + ErrorWechatResourceNotExists = "批次不存在" + ErrorWechatFrequencyLimited = "当前请求人数过多,请稍后重试" ) // WechatError 映射错误描述到具体的错误处理 var WechatError = map[string]*errors.Error{ - ErrorUserIllegal: err2.ErrorWechatUserIllegal(ErrorUserIllegal), - ErrorAppIDMchIDMismatch: err2.ErrorWechatMismatch(ErrorAppIDMchIDMismatch), - ErrorOpenIDAppIDMismatch: err2.ErrorWechatMismatch(ErrorOpenIDAppIDMismatch), - ErrorInvalidMerchantID: err2.ErrorWechatInvalidMerchantID(ErrorInvalidMerchantID), - ErrorHighFrequency: err2.ErrorWechatHighFrequency(ErrorHighFrequency), - ErrorActivityInactive: err2.ErrorWechatActivityInactive(ErrorActivityInactive), - ErrorBatchInfoError: err2.ErrorWechatBatchInfoError(ErrorBatchInfoError), - ErrorAppIDRequired: err2.ErrorWechatParamRequired(ErrorAppIDRequired), - ErrorOpenIDRequired: err2.ErrorWechatParamRequired(ErrorOpenIDRequired), - ErrorBatchIDRequired: err2.ErrorWechatParamRequired(ErrorBatchIDRequired), - ErrorMerchantIDRequired: err2.ErrorWechatParamRequired(ErrorMerchantIDRequired), - ErrorInvalidBatchStatus: err2.ErrorWechatInvalidBatchStatus(ErrorInvalidBatchStatus), - ErrorMchNotExists: err2.ErrorWechatMchNotExists(ErrorMchNotExists), - ErrorBatchBudgetInsufficient: err2.ErrorWechatBatchBudgetInsufficient(ErrorBatchBudgetInsufficient), - ErrorDailyLimitExceeded: err2.ErrorWechatDailyLimitExceeded(ErrorDailyLimitExceeded), - ErrorAccountBalanceInsufficient: err2.ErrorWechatAccountBalanceInsufficient(ErrorAccountBalanceInsufficient), - ErrorBatchBudgetDepleted: err2.ErrorWechatBatchBudgetDepleted(ErrorBatchBudgetDepleted), - ErrorMerchantNoPermission: err2.ErrorWechatMerchantNoPermission(ErrorMerchantNoPermission), - ErrorCrossMerchantNotSupported: err2.ErrorWechatCrossMerchantNotSupported(ErrorCrossMerchantNotSupported), - ErrorUserReceiveLimit: err2.ErrorWechatUserReceiveLimit(ErrorUserReceiveLimit), - ErrorAPIChannelNotSupported: err2.ErrorWechatAPIChannelNotSupported(ErrorAPIChannelNotSupported), - ErrorSpecifiedDenominationNotSupported: err2.ErrorWechatSpecifiedDenominationNotSupported(ErrorSpecifiedDenominationNotSupported), - ErrorOnlyAdvertisingBatch: err2.ErrorWechatOnlyAdvertisingBatch(ErrorOnlyAdvertisingBatch), - ErrorUserMaxCoupons: err2.ErrorWechatUserMaxCoupons(ErrorUserMaxCoupons), - ErrorNaturalPersonRuleBlocked: err2.ErrorWechatNaturalPersonRuleBlocked(ErrorNaturalPersonRuleBlocked), - ErrorResourceNotExists: err2.ErrorWechatResourceNotExists(ErrorResourceNotExists), - ErrorFrequencyLimited: err2.ErrorWechatFrequencyLimited(ErrorFrequencyLimited), + ErrorWechatUserIllegal: err2.ErrorWechatUserIllegal(ErrorWechatUserIllegal), + ErrorWechatAppIDMchIDMismatch: err2.ErrorWechatAppIDMchIDMismatch(ErrorWechatAppIDMchIDMismatch), + ErrorWechatOpenIDAppIDMismatch: err2.ErrorWechatOpenIDAppIDMismatch(ErrorWechatOpenIDAppIDMismatch), + ErrorWechatInvalidMerchantID: err2.ErrorWechatInvalidMerchantID(ErrorWechatInvalidMerchantID), + ErrorWechatHighFrequency: err2.ErrorWechatHighFrequency(ErrorWechatHighFrequency), + ErrorWechatActivityInactive: err2.ErrorWechatActivityInactive(ErrorWechatActivityInactive), + ErrorWechatBatchInfoError: err2.ErrorWechatBatchInfoError(ErrorWechatBatchInfoError), + ErrorWechatAppIDRequired: err2.ErrorWechatAppIDRequired(ErrorWechatAppIDRequired), + ErrorWechatOpenIDRequired: err2.ErrorWechatOpenIDRequired(ErrorWechatOpenIDRequired), + ErrorWechatBatchIDRequired: err2.ErrorWechatBatchIDRequired(ErrorWechatBatchIDRequired), + ErrorWechatMerchantIDRequired: err2.ErrorWechatMerchantIDRequired(ErrorWechatMerchantIDRequired), + ErrorWechatInvalidBatchStatus: err2.ErrorWechatInvalidBatchStatus(ErrorWechatInvalidBatchStatus), + ErrorWechatMchNotExists: err2.ErrorWechatMchNotExists(ErrorWechatMchNotExists), + ErrorWechatBatchBudgetInsufficient: err2.ErrorWechatBatchBudgetInsufficient(ErrorWechatBatchBudgetInsufficient), + ErrorWechatDailyLimitExceeded: err2.ErrorWechatDailyLimitExceeded(ErrorWechatDailyLimitExceeded), + ErrorWechatAccountBalanceInsufficient: err2.ErrorWechatAccountBalanceInsufficient(ErrorWechatAccountBalanceInsufficient), + ErrorWechatBatchBudgetDepleted: err2.ErrorWechatBatchBudgetDepleted(ErrorWechatBatchBudgetDepleted), + ErrorWechatMerchantNoPermission: err2.ErrorWechatMerchantNoPermission(ErrorWechatMerchantNoPermission), + ErrorWechatCrossMerchantNotSupported: err2.ErrorWechatCrossMerchantNotSupported(ErrorWechatCrossMerchantNotSupported), + ErrorWechatUserReceiveLimit: err2.ErrorWechatUserReceiveLimit(ErrorWechatUserReceiveLimit), + ErrorWechatAPIChannelNotSupported: err2.ErrorWechatAPIChannelNotSupported(ErrorWechatAPIChannelNotSupported), + ErrorWechatSpecifiedDenominationNotSupported: err2.ErrorWechatSpecifiedDenominationNotSupported(ErrorWechatSpecifiedDenominationNotSupported), + ErrorWechatOnlyAdvertisingBatch: err2.ErrorWechatOnlyAdvertisingBatch(ErrorWechatOnlyAdvertisingBatch), + ErrorWechatUserMaxCoupons: err2.ErrorWechatUserMaxCoupons(ErrorWechatUserMaxCoupons), + ErrorWechatNaturalPersonRuleBlocked: err2.ErrorWechatNaturalPersonRuleBlocked(ErrorWechatNaturalPersonRuleBlocked), + ErrorWechatResourceNotExists: err2.ErrorWechatResourceNotExists(ErrorWechatResourceNotExists), + ErrorWechatFrequencyLimited: err2.ErrorWechatFrequencyLimited(ErrorWechatFrequencyLimited), } type ErrBody struct { diff --git a/internal/data/wechatrepoimpl/cpn_code_test.go b/internal/data/wechatrepoimpl/cpn_code_test.go index 7718d25..ef2e8b0 100644 --- a/internal/data/wechatrepoimpl/cpn_code_test.go +++ b/internal/data/wechatrepoimpl/cpn_code_test.go @@ -3,6 +3,7 @@ package wechatrepoimpl import ( "errors" errors2 "github.com/go-kratos/kratos/v2/errors" + "gorm.io/gorm" "testing" ) @@ -12,6 +13,10 @@ func TestGetErrorByDescription(t *testing.T) { Message: "活动已结束或未激活", } t.Log(e.GetWechatError()) + + err := gorm.ErrRecordNotFound + + t.Log(errors.Is(err, gorm.ErrRecordNotFound)) } func TestErr(t *testing.T) { diff --git a/internal/service/cmb.go b/internal/service/cmb.go index cc0d42d..dc0576e 100644 --- a/internal/service/cmb.go +++ b/internal/service/cmb.go @@ -20,7 +20,7 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { bizReply *v1.CmbOrderReply ) - voucherNo, err := s.cmbOrder(ctx) + orderNo, err := s.cmbOrder(ctx) if err != nil { se := errors.FromError(err) @@ -41,7 +41,7 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { bizReply = &v1.CmbOrderReply{ RespCode: vo.CmbResponseStatusSuccess.GetValue(), RespMsg: "成功", - CodeNo: voucherNo, + CodeNo: orderNo, } } @@ -97,12 +97,12 @@ func (s *VoucherService) cmbOrder(ctx http.Context) (string, error) { Type: vo.OrderTypeCmb, } - voucherNo, err := s.VoucherBiz.CmbOrder(ctx, boReq) + orderNo, err := s.VoucherBiz.CmbOrder(ctx, boReq) if err != nil { return "", err } - return voucherNo, nil + return orderNo, nil } func (s *VoucherService) CmbQuery(ctx http.Context) error {