package utils import ( "fmt" "strconv" jsoniter "github.com/json-iterator/go" "lone-services/pkg/modelbase" "lone-services/pkg/utils" "lone-services/services/wecom/internal/dao" "lone-services/services/wecom/internal/model" ) // GetLatestReviewChange 按业务类型+业务ID取最新一条变更快照 func GetLatestReviewChange(bizType uint8, bizId int64) (*dao.ReviewChange, error) { var change dao.ReviewChange err := model.ReviewChangeModel{}.Init().GetOne(modelbase.Params{ Eq: map[string]string{ "type": strconv.FormatUint(uint64(bizType), 10), "biz_id": strconv.FormatInt(bizId, 10), }, Order: "id desc", }, &change) if err != nil { return nil, err } if change.Id < 1 { return nil, fmt.Errorf("review change not found") } return &change, nil } // DiffContent 拼成旧 diff 逻辑使用的 {"old":...,"new":...} JSON func DiffContent(change *dao.ReviewChange) string { before := change.BeforeData after := change.AfterData if before == utils.StringEmpty { before = "null" } if after == utils.StringEmpty { after = "null" } return fmt.Sprintf(`{"old":%s,"new":%s}`, before, after) } // BizFieldFromChange 从 after/before JSON 中取展示字段(如 name、type_name) func BizFieldFromChange(change *dao.ReviewChange, field string) string { if change == nil || field == utils.StringEmpty { return utils.StringEmpty } for _, raw := range []string{change.AfterData, change.BeforeData} { if raw == utils.StringEmpty { continue } var m map[string]any if err := jsoniter.Unmarshal([]byte(raw), &m); err != nil { continue } if v, ok := m[field].(string); ok && v != utils.StringEmpty { return v } } return utils.StringEmpty }