diff --git a/entgo/query/query.go b/entgo/query/query.go index ec58df1..4ce263f 100644 --- a/entgo/query/query.go +++ b/entgo/query/query.go @@ -2,7 +2,6 @@ package entgo import ( "entgo.io/ent/dialect/sql" - "github.com/go-kratos/kratos/v2/encoding" _ "github.com/go-kratos/kratos/v2/encoding/json" ) @@ -11,32 +10,13 @@ const ( DefaultPageSize = 10 ) -// parseJsonMap 解析JSON字符串里面的MAP,包含Array形式的Map -func parseJsonMap(strJson []byte, retMap *map[string]string) error { - codec := encoding.GetCodec("json") - - var err error - if err = codec.Unmarshal(strJson, retMap); err != nil { - var retArray []map[string]string - if err1 := codec.Unmarshal(strJson, &retArray); err1 == nil { - for _, itemA := range retArray { - for k, v := range itemA { - (*retMap)[k] = v - } - } - } else { - return err - } - } - - return nil -} - // BuildQuerySelector 构建分页查询选择器 -func BuildQuerySelector(dbDriverName string, +func BuildQuerySelector( + dbDriverName string, andFilterJsonString, orFilterJsonString string, page, pageSize int32, noPaging bool, - orderBys []string, defaultOrderField string) (err error, whereSelectors []func(s *sql.Selector), querySelectors []func(s *sql.Selector)) { + orderBys []string, defaultOrderField string, +) (err error, whereSelectors []func(s *sql.Selector), querySelectors []func(s *sql.Selector)) { err, whereSelectors = BuildFilterSelector(andFilterJsonString, orFilterJsonString) if err != nil { return err, nil, nil diff --git a/entgo/query/query_test.go b/entgo/query/query_test.go index bc9cb35..ca623ab 100644 --- a/entgo/query/query_test.go +++ b/entgo/query/query_test.go @@ -80,22 +80,6 @@ func TestJsonCodec(t *testing.T) { fmt.Println(mapstrs) } -func TestParseJsonMap(t *testing.T) { - var err error - - req1 := make(map[string]string) - data1 := `{"key1":"val1", "key1":"val2", "key2":"val2"}` - err = parseJsonMap([]byte(data1), &req1) - assert.Nil(t, err) - fmt.Println(req1) - - req2 := make(map[string]string) - data2 := `[{"key1":"val1"},{"key2":"val2"}]` - err = parseJsonMap([]byte(data2), &req2) - assert.Nil(t, err) - fmt.Println(req1) -} - func TestSplitQuery(t *testing.T) { var keys []string diff --git a/order_id/id.go b/order_id/id.go new file mode 100644 index 0000000..f6d71e4 --- /dev/null +++ b/order_id/id.go @@ -0,0 +1,47 @@ +package order_id + +import ( + "fmt" + "math/rand" + "sync/atomic" + "time" + + "github.com/tx7do/kratos-utils/trans" +) + +type idCounter uint32 + +func (c *idCounter) Increase() uint32 { + cur := *c + atomic.AddUint32((*uint32)(c), 1) + atomic.CompareAndSwapUint32((*uint32)(c), 1000, 0) + return uint32(cur) +} + +var orderIdIndex idCounter + +// GenerateOrderIdWithRandom 生成20位订单号,前缀+时间+随机数 +func GenerateOrderIdWithRandom(prefix string, split string, tm *time.Time) string { + if tm == nil { + tm = trans.Time(time.Now()) + } + + index := rand.Intn(1000) + + return fmt.Sprintf("%s%s%.4d%s%.2d%s%.2d%s%.2d%s%.2d%s%.2d%s%.4d", prefix, split, + tm.Year(), split, tm.Month(), split, tm.Day(), split, + tm.Hour(), split, tm.Minute(), split, tm.Second(), split, index) +} + +// GenerateOrderIdWithIncreaseIndex 生成20位订单号,前缀+时间+自增长索引 +func GenerateOrderIdWithIncreaseIndex(prefix string, split string, tm *time.Time) string { + if tm == nil { + tm = trans.Time(time.Now()) + } + + index := orderIdIndex.Increase() + + return fmt.Sprintf("%s%s%.4d%s%.2d%s%.2d%s%.2d%s%.2d%s%.2d%s%.4d", prefix, split, + tm.Year(), split, tm.Month(), split, tm.Day(), split, + tm.Hour(), split, tm.Minute(), split, tm.Second(), split, index) +} diff --git a/order_id/id_test.go b/order_id/id_test.go new file mode 100644 index 0000000..17ae037 --- /dev/null +++ b/order_id/id_test.go @@ -0,0 +1,63 @@ +package order_id + +import ( + "fmt" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/tx7do/kratos-utils/trans" +) + +func TestGenerateOrderIdWithRandom(t *testing.T) { + fmt.Println(GenerateOrderIdWithRandom("PT", "-", trans.Time(time.Now()))) + + tm := time.Now() + var ids map[string]bool + ids = make(map[string]bool) + count := 100 + for i := 0; i < count; i++ { + ids[GenerateOrderIdWithRandom("PT", "", trans.Time(tm))] = true + } + assert.Equal(t, count, len(ids)) +} + +func TestGenerateOrderIdWithIndex(t *testing.T) { + tm := time.Now() + + fmt.Println(GenerateOrderIdWithIncreaseIndex("PT", "", trans.Time(tm))) + + ids := make(map[string]bool) + count := 100 + for i := 0; i < count; i++ { + ids[GenerateOrderIdWithIncreaseIndex("PT", "", trans.Time(tm))] = true + } + assert.Equal(t, count, len(ids)) +} + +func TestGenerateOrderIdWithIndexThread(t *testing.T) { + tm := time.Now() + + var wg sync.WaitGroup + var ids sync.Map + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + for i := 0; i < 100; i++ { + id := GenerateOrderIdWithIncreaseIndex("PT", "", trans.Time(tm)) + ids.Store(id, true) + } + wg.Done() + }() + } + wg.Wait() + + aLen := 0 + ids.Range(func(k, v interface{}) bool { + aLen++ + return true + }) + assert.Equal(t, 1000, aLen) +}