chart_property.go
5.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package domain
import (
"github.com/samber/lo"
"strconv"
)
const (
SourceFromByteBank = "ByteBank"
SourceFromUser = "User"
)
var (
RecordTable1 = "RecordTable-1"
MetricsCard1 = "MetricsCard-1"
ContainerCard1 = "ContainerCard-1"
QuarterChart1 = "QuarterChart-1"
)
type ChartProperty struct {
Title Title `json:"title,optional"` // 标题
TableAbility TableAbility `json:"table,optional"` // 表筛选功能
Series []Series `json:"series,optional"` // 系列(数据源)
Cover string `json:"cover,optional"` // 封面
Other Other `json:"other,optional"` // 其他额外配置
//XAxis interface{} `json:"xAxis"` // X轴
//YAxis interface{} `json:"yAxis"` // Y轴
}
type Other struct {
Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图
}
type Quarter struct {
XAxisLabel string `json:"xAxisLabel"` // x轴标签名
XAxisFirstLabel string `json:"xAxisFirstLabel"` // 签名1
XAxisSecondLabel string `json:"xAxisSecondLabel"` // 签名2
YAxisLabel string `json:"yAxisLabel"` // y轴标签名
YAxisFirstLabel string `json:"yAxisFirstLabel"` // y标签1
YAxisSecondLabel string `json:"yAxisSecondLabel"` // y标签2
Area string `json:"area"` // 图形面积
SeriesList []QuarterSeries `json:"seriesList"` // 图形系列
}
type QuarterSeries struct {
}
type Title struct {
TitleSwitch bool `json:"titleSwitch,optional"` // 组件标题开关
IntroduceSwitch bool `json:"introduceSwitch,optional"` // 组件说明开关
TitleType string `json:"titleType"` // 标题类型
Heading string `json:"heading,optional"` // 主标题
SubTitle string `json:"subTitle,optional"` // 副标题
ExplainType string `json:"explainType,optional,options=[text,file]"` // text file
ExplainTxt string `json:"explainTxt,optional"` // 文字说明
FileUrl string `json:"fileUrl,optional"` // 组件图片/视频
Align string `json:"align,optional"` // 文本对齐方式 left center right
}
type TableAbility struct {
FilterSwitch bool `json:"filterSwitch,optional"` // 表筛选功能开关
DimensionList []Dimension `json:"dimensionList,optional"` // 维度列表
}
type Series struct {
// Type string `json:"type"` // 图表类型 (记录型表格:RecordTable-1 总体指标:MetricsCard-1 容器卡片:ContainerCard-1 四分图:QuarterChart-1)
Name string `json:"name"` // 名称 (例如 指标1、指标2)
SourceFrom string `json:"from,options=[ByteBank,User]"` // 数据源类型 ByteBank:字库 User:用户自定义
DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值)
CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值)
MatchExpressions []Expression `json:"matchExpressions,omitempty"` // 条件匹配表达式(总体指标)
TargetText string `json:"targetText,optional,omitempty"` // 指标名文本
TargetNum string `json:"targetNum,optional,omitempty"` // 指标数值
TargetUnit string `json:"targetUnit,optional,omitempty"` // 指标单位
}
type Expression struct {
Operator string `json:"operator,options=[<,>,==,<>,<=,>=]"` // 操作符号 <,>,==,<>,<=,>=
CompareValue string `json:"compareValue"` // 比较值
ToValue string `json:"toValue"` // 显示值(转为)
}
func (exp Expression) Match(value string) (result bool, toValue string) {
fValue, ferr := strconv.ParseFloat(value, 64)
cValue, cerr := strconv.ParseFloat(exp.CompareValue, 64)
if ferr == nil && cerr == nil {
if exp.FloatMatch(exp.Operator, fValue, cValue) {
return true, exp.ToValue
}
return false, value
}
if exp.StringMatch(exp.Operator, value, exp.CompareValue) {
return true, exp.ToValue
}
return false, value
}
func (exp Expression) FloatMatch(op string, v, c float64) bool {
switch op {
case "<":
return v < c
case ">":
return v > c
case "==":
return v == c
case "<>":
return v != c
case "<=":
return v <= c
case ">=":
return v >= c
}
return false
}
func (exp Expression) StringMatch(op string, v, c string) bool {
switch op {
case "<":
return v < c
case ">":
return v > c
case "==":
return v == c
case "<>":
return v != c
case "<=":
return v <= c
case ">=":
return v >= c
}
return false
}
type Dimension struct {
Name string `json:"name"`
Value string `json:"value"`
}
func (e ChartProperty) GetFirstDataSourceId() int64 {
for _, s := range e.Series {
if s.DataSourceId > 0 {
return s.DataSourceId
}
}
return 0
}
func (e ChartProperty) GetAllDataSourceId() []int64 {
var idList = make([]int64, 0)
for _, s := range e.Series {
if s.DataSourceId > 0 {
idList = append(idList, s.DataSourceId)
}
}
return lo.Uniq(idList)
}