voucher/internal/biz/cmb/consume.go

154 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cmb
import (
"context"
"encoding/json"
"fmt"
"time"
v1 "voucher/api/v1"
"voucher/internal/biz/bo"
"voucher/internal/biz/vo"
"voucher/internal/pkg/uid"
)
func (v *Cmb) OrderConsume(ctx context.Context, order *bo.OrderBo) (outRequestNo string, err error) {
if order.Status.IsWait() {
return outRequestNo, fmt.Errorf("订单状态错误,%s", order.Status.GetText())
}
if !order.Channel.IsWeChat() {
return outRequestNo, fmt.Errorf("订单渠道错误,%s", order.Channel.GetText())
}
if err = v.ing(ctx, order.ID); err != nil {
return
}
orderWechat, err := v.create(ctx, order)
if err != nil {
return
}
// todo
// 注册“刚哥那边”回调中心tag,一个批次只能注册一个tag微信立减金消费时根据不同的tag消费(区分测试/正式注册tag
couponId, err := v.WechatCpnRepo.Order(ctx, orderWechat)
if err != nil {
return outRequestNo, v.fail(ctx, order, orderWechat, err.Error())
}
if err = v.success(ctx, order, orderWechat, couponId); err != nil {
return
}
return orderWechat.OutRequestNo, err
}
func (v *Cmb) create(ctx context.Context, order *bo.OrderBo) (*bo.OrderWechatBo, error) {
outRequestNo, err := v.GenerateMixRepo.GeneratorString(ctx, uid.OrderWechat)
if err != nil {
return nil, err
}
req := &bo.OrderWechatBo{
OrderNo: order.OrderNo,
OutRequestNo: outRequestNo,
AppID: order.AppID,
StockCreatorMchid: order.MerchantNo,
OpenID: order.Account,
StockID: order.BatchNo,
Status: vo.OrderWechatStatusWait,
}
orderWechat, err := v.OrderWechatRepo.Create(ctx, req)
if err != nil {
return nil, err
}
return orderWechat, nil
}
func (v *Cmb) ing(ctx context.Context, id uint64) error {
return v.OrderRepo.Ing(ctx, id)
}
func (v *Cmb) success(ctx context.Context, order *bo.OrderBo, orderWechat *bo.OrderWechatBo, couponId string) error {
if err := v.OrderWechatRepo.Success(ctx, orderWechat.ID, couponId); err != nil {
return err
}
return v.OrderRepo.Success(ctx, order.ID)
}
func (v *Cmb) fail(ctx context.Context, order *bo.OrderBo, orderWechat *bo.OrderWechatBo, remarks string) error {
if err := v.OrderWechatRepo.Fail(ctx, orderWechat.ID, remarks); err != nil {
return err
}
return v.OrderRepo.Fail(ctx, order.ID)
}
func (v *Cmb) NotifyConsume(ctx context.Context, order *bo.OrderBo, orderOutRequestNo string) error {
orderWechat, err := v.OrderWechatRepo.GetByOutRequestNo(ctx, orderOutRequestNo)
if err != nil {
return err
}
if !orderWechat.Status.CanNotify() {
return fmt.Errorf("微信订单状态错误,不能通知:%s", order.Status.GetText())
}
status, err := orderWechat.Status.GetCmbStatusText()
if err != nil {
return err
}
req := &v1.CmbNotifyRequest{
Ticket: orderWechat.OrderNo,
Status: status.GetValue(),
TransDate: time.Now().Format("20060102150405"),
OrgNo: v.bc.Cmb.OrgNo,
Ext: "",
}
bizJsonBytes, err := json.Marshal(req)
if err != nil {
return err
}
request, err := v.CmbMixRepo.GetRequest(ctx, &bo.CmbRequestBo{
FuncName: vo.CmbNotifyFuncName,
BizContent: string(bizJsonBytes),
})
if err != nil {
return err
}
requestBytes, err := json.Marshal(request)
if err != nil {
return err
}
orderNotify, err := v.OrderNotifyRepo.Create(ctx, &bo.OrderNotifyBo{
OrderNo: order.OrderNo,
OutRequestNo: orderWechat.OutRequestNo,
Request: string(requestBytes),
NotifyUrl: order.NotifyUrl,
})
if err != nil {
return err
}
x, err := v.CmbMixRepo.Request(ctx, request, v.bc.Cmb.NotifyUrl)
if err != nil {
return v.OrderNotifyRepo.Fail(ctx, orderNotify.ID, err.Error())
}
responses, _ := json.Marshal(x)
return v.OrderNotifyRepo.Success(ctx, orderNotify.ID, string(responses))
}