This commit is contained in:
李子铭 2025-03-04 12:01:06 +08:00
parent ad6bb8b928
commit 7c764e53b7
10 changed files with 147 additions and 45 deletions

View File

@ -12,6 +12,7 @@ import (
"voucher/internal/biz"
"voucher/internal/conf"
"voucher/internal/data"
"voucher/internal/data/mixrepoimpl"
"voucher/internal/data/repoimpl"
"voucher/internal/data/thirdrepoimpl"
"voucher/internal/data/wechatrepoimpl"
@ -26,10 +27,11 @@ func wireApp(*conf.Bootstrap, log.Logger, *log2.AccessLogger) (*kratos.App, func
server.ProviderSetServer,
service.ProviderSetService,
biz.ProviderSetBiz,
data.ProviderDataSet,
repoimpl.ProviderRepoImplSet,
thirdrepoimpl.ProviderThirdRepositoryImplSet,
wechatrepoimpl.ProviderWechatReposImplSet,
data.ProviderDataSet,
mixrepoimpl.ProviderMixRepoImplSet,
log2.NewLogHelper,
newApp,
))

View File

@ -12,6 +12,7 @@ import (
"voucher/internal/biz"
"voucher/internal/conf"
"voucher/internal/data"
"voucher/internal/data/mixrepoimpl"
"voucher/internal/data/repoimpl"
"voucher/internal/data/thirdrepoimpl"
"voucher/internal/data/wechatrepoimpl"
@ -46,7 +47,8 @@ func wireApp(bootstrap *conf.Bootstrap, logger log.Logger, accessLogger *log2.Ac
cleanup()
return nil, nil, err
}
voucherBiz := biz.NewVoucherBiz(rdb, orderRepo, thirdMQSend, wechatCpnRepo)
generateMixRepo := mixrepoimpl.NewGenerateMixRepoImpl(rdb)
voucherBiz := biz.NewVoucherBiz(rdb, orderRepo, thirdMQSend, wechatCpnRepo, generateMixRepo)
voucherService := service.NewVoucherService(bootstrap, voucherBiz)
httpServer := server.NewHTTPServer(bootstrap, helper, accessLogger, voucherService)
consumer := server.NewConsumer(helper, bootstrap, voucherService)

View File

@ -3,15 +3,36 @@ package biz
import (
"context"
"fmt"
"github.com/pkg/errors"
"gorm.io/gorm"
"time"
"voucher/internal/biz/bo"
"voucher/internal/pkg/lock"
"voucher/internal/pkg/uid"
)
func (v *VoucherBiz) CmbOrder(ctx context.Context, req *bo.OrderCreateReqBo) (reps *bo.OrderCreateRepBo, err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("cmb_order_%s", req.OutBizNo), func(ctx context.Context) error {
order, err := v.OrderRepo.GetByOutBizNo(ctx, req.OutBizNo)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if order != nil {
// todo
return nil
}
orderNo, err := v.GenerateMixRepo.GeneratorString(ctx, uid.Order)
if err != nil {
return err
}
req.OrderNo = orderNo
v.OrderRepo.Create(ctx, req)
return nil
})

38
internal/biz/consume.go Normal file
View File

@ -0,0 +1,38 @@
package biz
import (
"context"
"fmt"
"time"
"voucher/internal/pkg/lock"
)
func (v *VoucherBiz) OrderConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("order_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}
func (v *VoucherBiz) QueryConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("query_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}
func (v *VoucherBiz) NotifyConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("notify_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}

View File

@ -0,0 +1,10 @@
package mixrepos
import "context"
// GenerateMixRepo interface
type GenerateMixRepo interface {
// GeneratorString 生成字符串
GeneratorString(ctx context.Context, workId int) (string, error)
GeneratorNumber(ctx context.Context, workId int) (uint64, error)
}

View File

@ -1,14 +1,11 @@
package biz
import (
"context"
"fmt"
"time"
"voucher/internal/biz/mixrepos"
"voucher/internal/biz/repo"
"voucher/internal/biz/thirdrepo"
"voucher/internal/biz/wechatrepo"
"voucher/internal/data"
"voucher/internal/pkg/lock"
)
type VoucherBiz struct {
@ -16,6 +13,7 @@ type VoucherBiz struct {
OrderRepo repo.OrderRepo
ThirdMQSend thirdrepo.ThirdMQSend
WechatCpnRepo wechatrepo.WechatCpnRepo
GenerateMixRepo mixrepos.GenerateMixRepo
}
func NewVoucherBiz(
@ -23,41 +21,13 @@ func NewVoucherBiz(
orderRepo repo.OrderRepo,
thirdMQSend thirdrepo.ThirdMQSend,
WechatCpnRepo wechatrepo.WechatCpnRepo,
GenerateMixRepo mixrepos.GenerateMixRepo,
) *VoucherBiz {
return &VoucherBiz{
rdb: rdb,
OrderRepo: orderRepo,
ThirdMQSend: thirdMQSend,
WechatCpnRepo: WechatCpnRepo,
GenerateMixRepo: GenerateMixRepo,
}
}
func (v *VoucherBiz) OrderConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("order_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}
func (v *VoucherBiz) QueryConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("query_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}
func (v *VoucherBiz) NotifyConsume(ctx context.Context, orderNo string) (err error) {
err = lock.NewMutex(v.rdb.Rdb, time.Second*30).Lock(ctx, fmt.Sprintf("notify_consume_%s", orderNo), func(ctx context.Context) error {
return nil
})
return
}

View File

@ -0,0 +1,49 @@
package mixrepoimpl
import (
"context"
"hash/fnv"
"math"
"strconv"
"voucher/internal/biz/mixrepos"
"voucher/internal/data"
"voucher/internal/pkg/uid"
)
type GenerateRepoImpl struct {
rdb *data.Rdb
}
func NewGenerateMixRepoImpl(rdb *data.Rdb) mixrepos.GenerateMixRepo {
return &GenerateRepoImpl{rdb: rdb}
}
// GeneratorString 生成字符串
func (s *GenerateRepoImpl) GeneratorString(ctx context.Context, workId int) (string, error) {
serverIdStr := uid.GetAppId(ctx)
serverId := s.hashMod(serverIdStr)
number, err := uid.NewSignGenerator(s.rdb.Rdb).SetWorkerID(workId).SetServerID(serverId).GetNumber()
if err != nil {
return "", err
}
return strconv.FormatUint(number, 10), nil
}
// GeneratorNumber 生成unit64
func (s *GenerateRepoImpl) GeneratorNumber(ctx context.Context, workId int) (uint64, error) {
serverIdStr := uid.GetAppId(ctx)
serverId := s.hashMod(serverIdStr)
number, err := uid.NewSignGenerator(s.rdb.Rdb).SetWorkerID(workId).SetServerID(serverId).GetNumber()
if err != nil {
return 0, err
}
return number, nil
}
// hashMod hash mod
func (s *GenerateRepoImpl) hashMod(hashStr string) int {
hash := fnv.New32a()
hash.Write([]byte(hashStr))
hashValue := hash.Sum32()
return int(math.Mod(float64(hashValue), 32))
}

View File

@ -0,0 +1,8 @@
package mixrepoimpl
import (
"github.com/google/wire"
)
// ProviderMixRepoImplSet is providers.
var ProviderMixRepoImplSet = wire.NewSet(NewGenerateMixRepoImpl)

View File

@ -74,6 +74,7 @@ func (p *OrderRepoImpl) GetByID(ctx context.Context, id uint64) (*bo.OrderBo, er
if tx.Error != nil {
return nil, tx.Error
}
if tx.RowsAffected == 0 {
return nil, gorm.ErrRecordNotFound
}

View File

@ -11,7 +11,8 @@ import (
)
const (
Key = 1 // key码
Order = 1 // Order
OrderWechat = 2 // OrderWechat
BitsFull = 64 //
BitsPre = 1 // 固定
BitsTime = 41 // 毫秒时间戳 可以最多支持69年