154 lines
3.7 KiB
Go
154 lines
3.7 KiB
Go
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))
|
||
}
|