usage.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package sql_result
  2. import (
  3. "fmt"
  4. "git.sxidc.com/go-tools/utils/encoding"
  5. "git.sxidc.com/go-tools/utils/reflectutils"
  6. "git.sxidc.com/go-tools/utils/strutils"
  7. "github.com/pkg/errors"
  8. "reflect"
  9. "strings"
  10. "time"
  11. )
  12. const (
  13. timeMicroFormat = "2006-01-02T15:04:05.000000"
  14. timeMilliFormat = "2006-01-02T15:04:05.000"
  15. timeSecFormat = "2006-01-02T15:04:05"
  16. )
  17. func DefaultUsage(result map[string]any, e any, columnName string) error {
  18. if result == nil || len(result) == 0 {
  19. return nil
  20. }
  21. err := UseTag(e, defaultCallback(result, columnName))
  22. if err != nil {
  23. return err
  24. }
  25. return nil
  26. }
  27. func defaultCallback(result map[string]any, columnName string) OnParsedFieldTagFunc {
  28. return func(fieldName string, entityFieldElemValue reflect.Value, tag *Tag) error {
  29. if strutils.IsStringNotEmpty(columnName) && columnName != tag.Name {
  30. return nil
  31. }
  32. resultValue, ok := result[tag.Name]
  33. if !ok {
  34. return nil
  35. }
  36. if resultValue == nil {
  37. return nil
  38. }
  39. entityFieldKind := reflectutils.GroupValueKind(entityFieldElemValue)
  40. switch entityFieldKind {
  41. case reflect.Bool:
  42. return reflectutils.AssignBoolValue(resultValue, entityFieldElemValue)
  43. case reflect.String:
  44. strValue, ok := resultValue.(string)
  45. if ok {
  46. // 实体字段是字符串类型,接收到的是数据库时间格式
  47. parsedTime, err := parseTimeStringResult(strValue)
  48. if err == nil {
  49. // 转换成功说明是时间字符串
  50. strValue = parsedTime.Format(tag.TimeLayout)
  51. }
  52. parsedValue, err := dealStringResultValue(strValue, tag)
  53. if err != nil {
  54. return err
  55. }
  56. return reflectutils.AssignStringValue(parsedValue, entityFieldElemValue)
  57. }
  58. timeResult, ok := resultValue.(time.Time)
  59. if ok {
  60. return reflectutils.AssignStringValue(timeResult.Format(tag.TimeLayout), entityFieldElemValue)
  61. }
  62. return errors.New("查询到的值无法赋值为string类型")
  63. case reflect.Int64:
  64. return reflectutils.AssignInt64Value(resultValue, entityFieldElemValue)
  65. case reflect.Uint64:
  66. return reflectutils.AssignUint64Value(resultValue, entityFieldElemValue)
  67. case reflect.Float64:
  68. return reflectutils.AssignFloat64Value(resultValue, entityFieldElemValue)
  69. case reflect.Struct:
  70. // 实体字段是time.Time,接收到的是数据库时间格式
  71. if reflectutils.IsValueTime(entityFieldElemValue) {
  72. timeStr, ok := resultValue.(string)
  73. if ok {
  74. parsedTime, err := parseTimeStringResult(timeStr)
  75. if err != nil {
  76. return err
  77. }
  78. entityFieldElemValue.Set(reflect.ValueOf(parsedTime))
  79. return nil
  80. }
  81. timeResult, ok := resultValue.(time.Time)
  82. if ok {
  83. entityFieldElemValue.Set(reflect.ValueOf(timeResult))
  84. return nil
  85. }
  86. return errors.New("查询到的值无法赋值为time.Time类型")
  87. }
  88. return fmt.Errorf("字段: %s 列: %s 不支持的类型: %s",
  89. fieldName, tag.Name, entityFieldElemValue.Type().String())
  90. case reflect.Slice:
  91. if !reflectutils.IsSliceValueOf(entityFieldElemValue, reflect.String) {
  92. return errors.New(fieldName + " Error: slice仅支持[]string")
  93. }
  94. strValue, ok := resultValue.(string)
  95. if !ok {
  96. return errors.New("Result Type Error: slice仅支持[]string")
  97. }
  98. strParts := strings.Split(strValue, tag.SplitWith)
  99. if strParts == nil || len(strParts) == 0 {
  100. return nil
  101. }
  102. valSlice := entityFieldElemValue
  103. if valSlice.IsNil() {
  104. valSlice = reflect.MakeSlice(entityFieldElemValue.Type(), 0, 0)
  105. }
  106. for _, strPart := range strParts {
  107. valSlice = reflect.Append(valSlice, reflect.ValueOf(strPart))
  108. }
  109. entityFieldElemValue.Set(valSlice)
  110. return nil
  111. default:
  112. return fmt.Errorf("字段: %s 列: %s 不支持的类型: %s",
  113. fieldName, tag.Name, entityFieldElemValue.Type().String())
  114. }
  115. }
  116. }
  117. func parseTimeStringResult(timeStr string) (time.Time, error) {
  118. layout := timeSecFormat
  119. timeZoneIndex := strings.LastIndex(timeStr, "+08:")
  120. if timeZoneIndex != -1 {
  121. timeStr = timeStr[:timeZoneIndex]
  122. afterSecondIndex := strings.LastIndex(timeStr, ".")
  123. if afterSecondIndex != -1 {
  124. if len(timeStr)-afterSecondIndex-1 == 6 {
  125. layout = timeMicroFormat
  126. } else if len(timeStr)-afterSecondIndex-1 == 3 {
  127. layout = timeMilliFormat
  128. }
  129. }
  130. }
  131. parsedTime, err := time.ParseInLocation(layout, timeStr, time.Local)
  132. if err != nil {
  133. return time.Time{}, errors.New(err.Error())
  134. }
  135. return parsedTime, nil
  136. }
  137. func dealStringResultValue(value string, tag *Tag) (string, error) {
  138. retValue := value
  139. if strutils.IsStringNotEmpty(tag.AESKey) {
  140. decryptedValue, err := encoding.AESDecrypt(retValue, tag.AESKey)
  141. if err != nil {
  142. return "", err
  143. }
  144. retValue = decryptedValue
  145. }
  146. if strutils.IsStringNotEmpty(tag.Trim) {
  147. retValue = strings.Trim(retValue, tag.Trim)
  148. } else {
  149. if strutils.IsStringNotEmpty(tag.TrimPrefix) {
  150. retValue = strings.TrimPrefix(retValue, tag.TrimPrefix)
  151. }
  152. if strutils.IsStringNotEmpty(tag.TrimSuffix) {
  153. retValue = strings.TrimSuffix(retValue, tag.TrimSuffix)
  154. }
  155. }
  156. return retValue, nil
  157. }