package service import ( "encoding/json" "github.com/go-kratos/kratos/v2/errors" "github.com/go-kratos/kratos/v2/log" "github.com/go-kratos/kratos/v2/transport/http" "io" err2 "voucher/api/err" v1 "voucher/api/v1" "voucher/internal/biz/bo" "voucher/internal/biz/vo" ) func (s *VoucherService) buildCmbRequest(bodyBytes []byte) (*v1.CmbRequest, error) { var req *v1.CmbRequest if err := json.Unmarshal(bodyBytes, &req); err != nil { return nil, err2.ErrorCmbParamFail(err.Error()) } if err := req.Validate(); err != nil { return nil, err2.ErrorCmbParamFail(err.Error()) } return req, nil } func (s *VoucherService) CmbOrder(ctx http.Context) error { var ( reply *v1.CmbReply bizReply *v1.CmbOrderReply ) orderNo, err := s.cmbOrder(ctx) if err != nil { se := errors.FromError(err) if len(se.Reason) == 0 { se.Reason = err2.CmbErr_CMB_UNKNOWN.String() } bizReply = &v1.CmbOrderReply{ RespCode: vo.CmbResponseStatusFail.GetValue(), RespMsg: se.Message, CodeNo: "", ThirdErrCode: se.Reason, } log.Errorf("cmbOrder: %v", err) } else { bizReply = &v1.CmbOrderReply{ RespCode: vo.CmbResponseStatusSuccess.GetValue(), RespMsg: "成功", CodeNo: orderNo, } } replyBizContent, _ := json.Marshal(bizReply) xx := &bo.CmbResponseBo{ RespCode: vo.CmbResponseStatusSuccess.GetValue(), RespMsg: "成功", BizContent: string(replyBizContent), } reply, err = s.CmbMixRepo.GetResponse(ctx, xx) if err != nil { log.Errorf("CmbOrder GetResponse: %v", err) return ctx.JSON(400, err) } return ctx.JSON(200, reply) } func (v *VoucherService) cmbOrder(ctx http.Context) (string, error) { //var ctxCopy http.Context //copy(ctx, ctxCopy) bodyBytes, err := io.ReadAll(ctx.Request().Body) if err != nil { return "", err2.ErrorCmbParamFail(err.Error()) } req, err := v.buildCmbRequest(bodyBytes) if err != nil { return "", err } bizContent, err := v.CmbMixRepo.OrderVerify(ctx, req) if err != nil { log.Errorf("cmbOrder body: %s", string(bodyBytes)) return "", err } boReq := &bo.OrderCreateReqBo{ OutBizNo: bizContent.TransactionId, ProductNo: bizContent.ActivityId, Account: bizContent.CmbUid, AppID: bizContent.AppId, Attach: bizContent.Attach, AccountType: vo.OrderAccountTypeOpenId, Type: vo.OrderTypeCmb, NotifyUrl: v.bc.Cmb.NotifyUrl, } orderNo, err := v.VoucherBiz.CmbOrder(ctx, boReq) if err != nil { return "", err } return orderNo, nil } func (s *VoucherService) CmbProductQuery(ctx http.Context) error { var ( reply *v1.CmbReply bizReply *v1.CmbQueryProductReply ) bizReply, err := s.cmbProductQuery(ctx) if err != nil { se := errors.FromError(err) if len(se.Reason) == 0 { se.Reason = err2.CmbErr_CMB_UNKNOWN.String() } bizReply = &v1.CmbQueryProductReply{ RespCode: vo.CmbResponseStatusFail.GetValue(), RespMsg: se.Message, ThirdErrCode: se.Reason, } log.Errorf("cmbProductQuery: %v", err) } replyBizContent, _ := json.Marshal(bizReply) xx := &bo.CmbResponseBo{ RespCode: vo.CmbResponseStatusSuccess.GetValue(), RespMsg: "成功", BizContent: string(replyBizContent), } reply, err = s.CmbMixRepo.GetResponse(ctx, xx) if err != nil { log.Errorf("cmbProductQuery GetResponse: %v", err) return ctx.JSON(400, err) } return ctx.JSON(200, reply) } func (v *VoucherService) cmbProductQuery(ctx http.Context) (*v1.CmbQueryProductReply, error) { bodyBytes, err := io.ReadAll(ctx.Request().Body) if err != nil { return nil, err2.ErrorCmbParamFail(err.Error()) } req, err := v.buildCmbRequest(bodyBytes) if err != nil { return nil, err } bizContent, err := v.CmbMixRepo.ProductQueryVerify(ctx, req) if err != nil { log.Errorf("cmbProductQuery body: %s", string(bodyBytes)) return nil, err } return v.VoucherBiz.CmbProductQuery(ctx, bizContent.ActivityId) } func (s *VoucherService) CmbQuery(ctx http.Context) error { var ( reply *v1.CmbReply req = &bo.CmbResponseBo{} ) bizReply, err := s.cmbQuery(ctx) if err != nil { req.RespCode = vo.CmbResponseStatusFail.GetValue() req.RespMsg = err.Error() req.BizContent = "" log.Errorf("CmbQuery: %v", err) } else { replyBizContentBytes, _ := json.Marshal(bizReply) req.RespCode = vo.CmbResponseStatusSuccess.GetValue() req.RespMsg = "成功" req.BizContent = string(replyBizContentBytes) } reply, err = s.CmbMixRepo.GetResponse(ctx, req) if err != nil { log.Errorf("cmbProductQuery GetResponse: %v", err) return ctx.JSON(400, err) } return ctx.JSON(200, reply) } func (v *VoucherService) cmbQuery(ctx http.Context) (*v1.CmbQueryReply, error) { bodyBytes, err := io.ReadAll(ctx.Request().Body) if err != nil { return nil, err2.ErrorCmbParamFail(err.Error()) } req, err := v.buildCmbRequest(bodyBytes) if err != nil { return nil, err } bizContent, err := v.CmbMixRepo.QueryVerify(ctx, req) if err != nil { return nil, err } return v.VoucherBiz.CmbQuery(ctx, bizContent.CodeNo) }