123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- package zapx
- import (
- "fmt"
- "time"
- )
- // OperateRecord 结构表示操作记录。
- type OperateRecord struct {
- EventTime time.Time `json:"eventTime"` // 操作发生时间。非 go 客户端需要注意时间字符串的时区解析问题,类似 "+0000" 的时区格式是不支持的。
- Category string `json:"category"` // 服务分类。用于区分不同服务的操作记录。比如 "tax","tax_v2"。
- UserId string `json:"userId"` // 操作用户。可能不是一个 id 而是个代号,比如 "admin","system" 等。
- Entity string `json:"entity"` // 操作的实体。如订单,账户,商品等。
- Action string `json:"action"` // 动作。比如创建,删除,更新,或者更具体一点的支付,退款,发货等。
- Target string `json:"target"` // 操作的对象,通常是对应数据的 id。可为空字符串。
- StringExtra map[string]string `json:"stringExtra"` // 字符串型额外参数,比如订单对象的状态。
- FloatExtra map[string]float64 `json:"floatExtra"` // 浮点型额外参数,比如账户当前的余额。
- IntExtra map[string]int32 `json:"intExtra"` // 整数型额外参数,比如子对象的 id。
- BoolExtra map[string]bool `json:"boolExtra"` // 布尔型额外参数,比如是否为某个特殊情况。
- }
- // Validate 校验参数
- func (v OperateRecord) Validate() error {
- if v.EventTime.IsZero() {
- return ValidateError("时间不能为空")
- }
- if v.Category == "" {
- return ValidateError("服务分类不能为空")
- }
- if v.UserId == "" {
- return ValidateError("操作用户不能为空")
- }
- if v.Entity == "" {
- return ValidateError("操作实体不能为空")
- }
- if v.Action == "" {
- return ValidateError("动作不能为空")
- }
- mp := make(map[string]string)
- for k := range v.StringExtra {
- mp[k] = "字符串"
- }
- for k := range v.FloatExtra {
- if t, ok := mp[k]; ok {
- return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
- }
- mp[k] = "浮点数"
- }
- for k := range v.IntExtra {
- if t, ok := mp[k]; ok {
- return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
- }
- mp[k] = "整数"
- }
- for k := range v.BoolExtra {
- if t, ok := mp[k]; ok {
- return ValidateError(fmt.Sprintf("参数重复定义,%s 已定义为 %s", k, t))
- }
- }
- return nil
- }
- // ListOperationRequest 获取操作记录列表参数
- type ListOperationRequest struct {
- Begin time.Time `json:"begin"` // 开始时间。必填。
- End time.Time `json:"end"` // 结束时间。必填。
- Category string `json:"category"` // 服务分类。必填。
- UserId string `json:"userId"` // 用户 id。选填。精确匹配。
- EntityFilter []StringFieldFilter `json:"entityFilter"` // 实体。选填。
- ActionFilter []StringFieldFilter `json:"actionFilter"` // 动作。选填。
- TargetFilter []StringFieldFilter `json:"targetFIlter"` // 目标。选填。
- StringFilter []StringFilter `json:"stringFilter"` // 扩展参数。选填。
- FloatFilter []FloatFilter `json:"floatFilter"` // 扩展参数。选填。
- IntFilter []IntFilter `json:"intFilter"` // 扩展参数。选填。
- BoolFilter []BoolFilter `json:"boolFilter"` // 扩展参数。选填。
- Order string `json:"order"` // 排序类型。选填。默认倒序。
- PageNumber int `json:"pageNumber"` // 页码。必填。从 1 开始
- PageSize int `json:"pageSize"` // 每页数量。必填。
- }
- // Validate 校验参数
- func (v ListOperationRequest) Validate() error {
- if v.Begin.IsZero() {
- return ValidateError("开始时间不能为空")
- }
- if v.End.IsZero() {
- return ValidateError("结束时间不能为空")
- }
- if v.Category == "" {
- return ValidateError("服务分类不能为空")
- }
- for _, f := range v.EntityFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.ActionFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.TargetFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.StringFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.FloatFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.IntFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- for _, f := range v.BoolFilter {
- err := f.Validate()
- if err != nil {
- return err
- }
- }
- if v.Order != "" && v.Order != OrderAsc && v.Order != OrderDesc {
- return ValidateError("排序类型错误")
- }
- if v.PageNumber < 1 {
- return ValidateError("页码不能小于 1")
- }
- if v.PageSize < 0 {
- return ValidateError("每页数量不能小于 0")
- }
- return nil
- }
- // ListOperationResponse 获取操作记录列表响应
- type ListOperationResponse struct {
- Total int `json:"total"` // 数据同条数
- List []OperateRecord `json:"list"` // 记录列表
- }
|