diff --git a/cmd/server/wire.go b/cmd/server/wire.go index 5eb6266..1a78891 100644 --- a/cmd/server/wire.go +++ b/cmd/server/wire.go @@ -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, )) diff --git a/cmd/server/wire_gen.go b/cmd/server/wire_gen.go index 1c73687..0d70abb 100644 --- a/cmd/server/wire_gen.go +++ b/cmd/server/wire_gen.go @@ -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) diff --git a/internal/biz/cmb.go b/internal/biz/cmb.go index b7ee9ba..fc526f7 100644 --- a/internal/biz/cmb.go +++ b/internal/biz/cmb.go @@ -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 }) diff --git a/internal/biz/consume.go b/internal/biz/consume.go new file mode 100644 index 0000000..4d11d8a --- /dev/null +++ b/internal/biz/consume.go @@ -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 +} diff --git a/internal/biz/mixrepos/generate.go b/internal/biz/mixrepos/generate.go new file mode 100644 index 0000000..edd03a2 --- /dev/null +++ b/internal/biz/mixrepos/generate.go @@ -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) +} diff --git a/internal/biz/voucher.go b/internal/biz/voucher.go index 33e5813..dc12cc0 100644 --- a/internal/biz/voucher.go +++ b/internal/biz/voucher.go @@ -1,21 +1,19 @@ 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 { - rdb *data.Rdb - OrderRepo repo.OrderRepo - ThirdMQSend thirdrepo.ThirdMQSend - WechatCpnRepo wechatrepo.WechatCpnRepo + rdb *data.Rdb + 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, + 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 -} diff --git a/internal/data/mixrepoimpl/generate.go b/internal/data/mixrepoimpl/generate.go new file mode 100644 index 0000000..0484919 --- /dev/null +++ b/internal/data/mixrepoimpl/generate.go @@ -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)) +} diff --git a/internal/data/mixrepoimpl/provider_set.go b/internal/data/mixrepoimpl/provider_set.go new file mode 100644 index 0000000..dde83eb --- /dev/null +++ b/internal/data/mixrepoimpl/provider_set.go @@ -0,0 +1,8 @@ +package mixrepoimpl + +import ( + "github.com/google/wire" +) + +// ProviderMixRepoImplSet is providers. +var ProviderMixRepoImplSet = wire.NewSet(NewGenerateMixRepoImpl) diff --git a/internal/data/repoimpl/order.go b/internal/data/repoimpl/order.go index b1d9a59..47e4579 100644 --- a/internal/data/repoimpl/order.go +++ b/internal/data/repoimpl/order.go @@ -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 } diff --git a/internal/pkg/uid/generator.go b/internal/pkg/uid/generator.go index daaba1f..3af19b1 100644 --- a/internal/pkg/uid/generator.go +++ b/internal/pkg/uid/generator.go @@ -11,7 +11,8 @@ import ( ) const ( - Key = 1 // key码 + Order = 1 // Order + OrderWechat = 2 // OrderWechat BitsFull = 64 // BitsPre = 1 // 固定 BitsTime = 41 // 毫秒时间戳 可以最多支持69年