serialNumber.go 1022 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package models
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. "time"
  7. )
  8. // 主要用于Oracle ID生成,具有原子操作性质
  9. var lock sync.Mutex
  10. var requestMap = map[string]int{}
  11. // GetSerialNumber 获取SerialNumber,用于Oracle业务类ID主键生成,有原子操作性质
  12. func GetSerialNumber(prefix string) (int64, error) {
  13. lock.Lock()
  14. str := ""
  15. timeStamp := time.Now().Unix()
  16. if current, ok := requestMap[prefix]; ok {
  17. curStr := repZero(current, 6)
  18. str = fmt.Sprintf("%s%d%s", prefix, timeStamp, curStr)
  19. current++
  20. requestMap[prefix] = current
  21. } else {
  22. current = 1
  23. curStr := repZero(current, 6)
  24. str = fmt.Sprintf("%s%d%s", prefix, timeStamp, curStr)
  25. current++
  26. requestMap[prefix] = current
  27. }
  28. defer lock.Unlock()
  29. return strconv.ParseInt(str, 10, 64)
  30. }
  31. // repZero 按位数补零
  32. func repZero(number, digit int) string {
  33. str := strconv.Itoa(number)
  34. len := len(str)
  35. if len >= digit {
  36. return str
  37. }
  38. need := digit - len
  39. for i := 0; i < need; i++ {
  40. str = "0" + str
  41. }
  42. return str
  43. }