operate_record.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package zapx
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // OperateRecord 结构表示操作记录。
  7. type OperateRecord struct {
  8. EventTime time.Time `json:"eventTime"` // 操作发生时间。非 go 客户端需要注意时间字符串的时区解析问题,类似 "+0000" 的时区格式是不支持的。
  9. Category string `json:"category"` // 服务分类。用于区分不同服务的操作记录。比如 "tax","tax_v2"。
  10. UserId string `json:"userId"` // 操作用户。可能不是一个 id 而是个代号,比如 "admin","system" 等。
  11. Entity string `json:"entity"` // 操作的实体。如订单,账户,商品等。
  12. Action string `json:"action"` // 动作。比如创建,删除,更新,或者更具体一点的支付,退款,发货等。
  13. Target string `json:"target"` // 操作的对象,通常是对应数据的 id。可为空字符串。
  14. StringExtra map[string]string `json:"stringExtra"` // 字符串型额外参数,比如订单对象的状态。
  15. FloatExtra map[string]float64 `json:"floatExtra"` // 浮点型额外参数,比如账户当前的余额。
  16. IntExtra map[string]int32 `json:"intExtra"` // 整数型额外参数,比如子对象的 id。
  17. BoolExtra map[string]bool `json:"boolExtra"` // 布尔型额外参数,比如是否为某个特殊情况。
  18. }
  19. // Validate 校验参数
  20. func (v OperateRecord) Validate() error {
  21. if v.EventTime.IsZero() {
  22. return ValidateError("时间不能为空")
  23. }
  24. if v.Category == "" {
  25. return ValidateError("服务分类不能为空")
  26. }
  27. if v.UserId == "" {
  28. return ValidateError("操作用户不能为空")
  29. }
  30. if v.Entity == "" {
  31. return ValidateError("操作实体不能为空")
  32. }
  33. if v.Action == "" {
  34. return ValidateError("动作不能为空")
  35. }
  36. mp := make(map[string]string)
  37. for k := range v.StringExtra {
  38. mp[k] = "字符串"
  39. }
  40. for k := range v.FloatExtra {
  41. if t, ok := mp[k]; ok {
  42. return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
  43. }
  44. mp[k] = "浮点数"
  45. }
  46. for k := range v.IntExtra {
  47. if t, ok := mp[k]; ok {
  48. return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
  49. }
  50. mp[k] = "整数"
  51. }
  52. for k := range v.BoolExtra {
  53. if t, ok := mp[k]; ok {
  54. return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
  55. }
  56. }
  57. return nil
  58. }
  59. // ListOperationRequest 获取操作记录列表参数
  60. type ListOperationRequest struct {
  61. Begin time.Time `json:"begin"` // 开始时间。必填。
  62. End time.Time `json:"end"` // 结束时间。必填。
  63. Category string `json:"category"` // 服务分类。必填。
  64. UserId string `json:"userId"` // 用户 id。选填。精确匹配。
  65. EntityFilter []StringFieldFilter `json:"entityFilter"` // 实体。选填。
  66. ActionFilter []StringFieldFilter `json:"actionFilter"` // 动作。选填。
  67. TargetFilter []StringFieldFilter `json:"targetFIlter"` // 目标。选填。
  68. StringFilter []StringFilter `json:"stringFilter"` // 扩展参数。选填。
  69. FloatFilter []FloatFilter `json:"floatFilter"` // 扩展参数。选填。
  70. IntFilter []IntFilter `json:"intFilter"` // 扩展参数。选填。
  71. BoolFilter []BoolFilter `json:"boolFilter"` // 扩展参数。选填。
  72. Order string `json:"order"` // 排序类型。选填。默认倒序。
  73. PageNumber int `json:"pageNumber"` // 页码。必填。从 1 开始
  74. PageSize int `json:"pageSize"` // 每页数量。必填。
  75. }
  76. // Validate 校验参数
  77. func (v ListOperationRequest) Validate() error {
  78. if v.Begin.IsZero() {
  79. return ValidateError("开始时间不能为空")
  80. }
  81. if v.End.IsZero() {
  82. return ValidateError("结束时间不能为空")
  83. }
  84. if v.Category == "" {
  85. return ValidateError("服务分类不能为空")
  86. }
  87. for _, f := range v.EntityFilter {
  88. err := f.Validate()
  89. if err != nil {
  90. return err
  91. }
  92. }
  93. for _, f := range v.ActionFilter {
  94. err := f.Validate()
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. for _, f := range v.TargetFilter {
  100. err := f.Validate()
  101. if err != nil {
  102. return err
  103. }
  104. }
  105. for _, f := range v.StringFilter {
  106. err := f.Validate()
  107. if err != nil {
  108. return err
  109. }
  110. }
  111. for _, f := range v.FloatFilter {
  112. err := f.Validate()
  113. if err != nil {
  114. return err
  115. }
  116. }
  117. for _, f := range v.IntFilter {
  118. err := f.Validate()
  119. if err != nil {
  120. return err
  121. }
  122. }
  123. for _, f := range v.BoolFilter {
  124. err := f.Validate()
  125. if err != nil {
  126. return err
  127. }
  128. }
  129. if v.Order != "" && v.Order != OrderAsc && v.Order != OrderDesc {
  130. return ValidateError("排序类型错误")
  131. }
  132. if v.PageNumber < 1 {
  133. return ValidateError("页码不能小于 1")
  134. }
  135. if v.PageSize < 0 {
  136. return ValidateError("每页数量不能小于 0")
  137. }
  138. return nil
  139. }
  140. // ListOperationResponse 获取操作记录列表响应
  141. type ListOperationResponse struct {
  142. Total int `json:"total"` // 数据同条数
  143. List []OperateRecord `json:"list"` // 记录列表
  144. }