14 changed files with 4510 additions and 17 deletions
@ -0,0 +1,319 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/api/version1/customerform" |
||||
|
"appPlatform/models/modelshr" |
||||
|
"appPlatform/models/modelssystempermission" |
||||
|
"appPlatform/overall" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"strconv" |
||||
|
) |
||||
|
|
||||
|
// 普通字段
|
||||
|
func (c *ChartInfo) DataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string, untis []customerform.MasterStruct) (charData BarDataInfo) { |
||||
|
charData.XAxis.Types = "category" |
||||
|
charData.YAxis.Types = "value" |
||||
|
var timeList []string |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if yVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime := publicmethod.TypeToInterface(yVal) |
||||
|
if !publicmethod.IsInTrue[string](pageTime, timeList) { |
||||
|
timeList = append(timeList, pageTime) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
charData.XAxisData(x.Field, timeList, untis) |
||||
|
// charData.XAxis.Data = timeList
|
||||
|
for _, v := range y { |
||||
|
var seriesInfo SeriesList |
||||
|
seriesInfo.Name = v.OldTitle |
||||
|
seriesInfo.Types = chartType |
||||
|
if !publicmethod.IsInTrue[string](v.OldTitle, charData.Legend.Data) { |
||||
|
charData.Legend.Data = append(charData.Legend.Data, v.OldTitle) |
||||
|
} |
||||
|
} |
||||
|
charData.AggregateCalculating(x.Field, y, val, timeList, chartType) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// x轴是否要转换中文
|
||||
|
func (b *BarDataInfo) XAxisData(xField string, timeList []string, untis []customerform.MasterStruct) { |
||||
|
for _, v := range untis { |
||||
|
if v.Name == xField { |
||||
|
switch v.Type { |
||||
|
case "pickrole": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_System_Permission.Model(&modelssystempermission.SystemRole{}).Select("`name`").Where("`id` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "pickpost": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.Position{}).Select("`name`").Where("`id` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "deptOrg": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`name`").Where("`id` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "orgCentent": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`name`").Where("`id` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "owner": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "founder": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "expand-user": |
||||
|
var roleName []string |
||||
|
if len(timeList) > 0 { |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` IN ?", timeList).Find(&roleName) |
||||
|
} |
||||
|
b.XAxis.Data = roleName |
||||
|
case "checkbox": |
||||
|
if len(v.Options) > 0 { |
||||
|
var cbox []string |
||||
|
for _, tv := range timeList { |
||||
|
for _, ov := range v.Options { |
||||
|
if tv == ov.Value { |
||||
|
cbox = append(cbox, ov.Label) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
b.XAxis.Data = cbox |
||||
|
} else { |
||||
|
b.XAxis.Data = timeList |
||||
|
} |
||||
|
case "radio": |
||||
|
if len(v.Options) > 0 { |
||||
|
var cbox []string |
||||
|
for _, tv := range timeList { |
||||
|
for _, ov := range v.Options { |
||||
|
if tv == ov.Value { |
||||
|
cbox = append(cbox, ov.Label) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
b.XAxis.Data = cbox |
||||
|
} else { |
||||
|
b.XAxis.Data = timeList |
||||
|
} |
||||
|
default: |
||||
|
b.XAxis.Data = timeList |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-18 08:45:24 |
||||
|
@ 功能: 聚合计算 |
||||
|
|
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#xField X轴字段 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (b *BarDataInfo) AggregateCalculating(x string, y []YAxisInfo, val interface{}, timeList []string, chartType string) { |
||||
|
for _, v := range y { |
||||
|
var seriesInfo SeriesList |
||||
|
seriesInfo.Name = v.OldTitle |
||||
|
seriesInfo.Types = chartType |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
seriesInfo.AverageValuees(x, v.Field, timeList, val, v.Format) |
||||
|
case 3: |
||||
|
seriesInfo.StatisticalQuantityes(x, v.Field, timeList, val, v.Format) |
||||
|
case 4: |
||||
|
seriesInfo.RemoveDuplicateCountss(x, v.Field, timeList, val, v.Format) |
||||
|
case 5: |
||||
|
seriesInfo.maxDataes(x, v.Field, timeList, val, v.Format) |
||||
|
case 6: |
||||
|
seriesInfo.minDataes(x, v.Field, timeList, val, v.Format) |
||||
|
default: |
||||
|
seriesInfo.sumDataes(x, v.Field, timeList, val, v.Format) |
||||
|
} |
||||
|
|
||||
|
if !publicmethod.IsInTrue[string](v.OldTitle, b.Legend.Data) { |
||||
|
b.Legend.Data = append(b.Legend.Data, v.OldTitle) |
||||
|
} |
||||
|
b.Series = append(b.Series, seriesInfo) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求平均值
|
||||
|
func (s *SeriesList) AverageValuees(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal float64 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
sumValAvg := sumVal / float64(len(yVal)) |
||||
|
jieguo := publicmethod.DataChuli(sumValAvg, format) |
||||
|
s.Data = append(s.Data, jieguo) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (s *SeriesList) StatisticalQuantityes(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal []float64 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
s.Data = append(s.Data, len(sumVal)) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (s *SeriesList) RemoveDuplicateCountss(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal []float64 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
s.Data = append(s.Data, len(sumVal)) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求最大值
|
||||
|
func (s *SeriesList) maxDataes(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal float64 = 0 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
s.Data = append(s.Data, jieguo) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求最小值
|
||||
|
func (s *SeriesList) minDataes(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal float64 = 1 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
s.Data = append(s.Data, jieguo) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
/* |
||||
|
xField x轴字段 |
||||
|
yField y轴字段 |
||||
|
xAry x轴值 |
||||
|
val 查询出来的所有值 |
||||
|
format 取值方式 |
||||
|
*/ |
||||
|
func (s *SeriesList) sumDataes(xField, yField string, xAry []string, val interface{}, format int) { |
||||
|
for _, v := range xAry { |
||||
|
var sumVal float64 |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
if v == publicmethod.TypeToInterface(xVal) { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
s.Data = append(s.Data, jieguo) |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,267 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/api/version1/customerform" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-22 16:16:33 |
||||
|
@ 功能: 排行榜 |
||||
|
*/ |
||||
|
func (c *ChartInfo) barRaceChart(val interface{}, untis []customerform.MasterStruct, chartType string) (snedMap interface{}) { |
||||
|
|
||||
|
for _, v := range c.XAxis { |
||||
|
fmt.Printf("\n\nc.X ===1==> %v =====> %v\n\n", v.Type, v) |
||||
|
switch v.Type { |
||||
|
case 3: |
||||
|
snedMap = c.TimeDataAnaly(v, c.YAxis, val, chartType) |
||||
|
default: |
||||
|
snedMap = c.BarRaceDataAnaly(v, c.YAxis, val, chartType, untis) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 单一维度计算
|
||||
|
func (c *ChartInfo) BarRaceDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string, untis []customerform.MasterStruct) (charData BarRace) { |
||||
|
fmt.Printf("人员--->%v\n\n", val) |
||||
|
var timeList []string //根据维度分组
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
fmt.Printf("人员--1->%v\n\n", yVal) |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
fmt.Printf("人员--->%v\n\n", xVal) |
||||
|
pageTime := publicmethod.TypeToInterface(xVal) |
||||
|
if !publicmethod.IsInTrue[string](pageTime, timeList) { |
||||
|
timeList = append(timeList, pageTime) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var weiDu []PicChartInfo |
||||
|
for _, v := range timeList { |
||||
|
pickName := DimensionToChinaName(x.Field, v, untis) |
||||
|
charData.YAxisData = append(charData.YAxisData, pickName) |
||||
|
var weiduInfo PicChartInfo |
||||
|
weiduInfo.Name = v |
||||
|
weiduInfo.Value = pickName |
||||
|
weiDu = append(weiDu, weiduInfo) |
||||
|
} |
||||
|
charData.Max = len(weiDu) |
||||
|
charData.BarRaceAnalyRadarData(x.Field, weiDu, y, val) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-22 11:22:34 |
||||
|
@ 功能: 解析雷达数据 |
||||
|
#xField x轴设定 |
||||
|
w |
||||
|
|
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (b *BarRace) BarRaceAnalyRadarData(xField string, x []PicChartInfo, y []YAxisInfo, val interface{}) { |
||||
|
for _, v := range y { |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
b.AverageValuees(v, xField, x, val, v.Format) |
||||
|
case 3: |
||||
|
b.StatisticalQuantityes(v, xField, x, val, v.Format) |
||||
|
case 4: |
||||
|
b.RemoveDuplicateCountss(v, xField, x, val, v.Format) |
||||
|
case 5: |
||||
|
b.maxDataes(v, xField, x, val, v.Format) |
||||
|
case 6: |
||||
|
b.minDataes(v, xField, x, val, v.Format) |
||||
|
default: |
||||
|
b.sumDataes(v, xField, x, val, v.Format) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (b *BarRace) AverageValuees(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
jibuqi := 1 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if jibuqi > 0 { |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
jieguo := publicmethod.DataChuli(sumValAvg, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
} else { |
||||
|
serData.Value = append(serData.Value, 0) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (b *BarRace) StatisticalQuantityes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
serData.Value = append(serData.Value, len(sumVal)) |
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (b *BarRace) RemoveDuplicateCountss(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
serData.Value = append(serData.Value, len(sumVal)) |
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
|
|
||||
|
// 最大值
|
||||
|
func (b *BarRace) maxDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 0 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
|
|
||||
|
// 最小值
|
||||
|
func (b *BarRace) minDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 0 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (b *BarRace) sumDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
} |
||||
|
} |
||||
|
b.SeriesData = append(b.SeriesData, serData) |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
/** |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-17 10:53:55 |
||||
|
@ 功能: 住壮结构图 |
||||
|
*/ |
||||
|
type BarDataInfo struct { |
||||
|
XAxis xAxisStruct `json:"xAxis"` |
||||
|
YAxis YAxisStruct `json:"yAxis"` |
||||
|
Legend LegendStruct `json:"legend"` |
||||
|
Series []SeriesList `json:"series"` |
||||
|
} |
||||
|
|
||||
|
//x轴设置
|
||||
|
type xAxisStruct struct { |
||||
|
Types string `json:"type"` |
||||
|
Data []string `json:"data"` |
||||
|
} |
||||
|
|
||||
|
//Y轴设置
|
||||
|
type YAxisStruct struct { |
||||
|
Types string `json:"type"` |
||||
|
} |
||||
|
|
||||
|
//数据标题
|
||||
|
type LegendStruct struct { |
||||
|
Data []string `json:"data"` |
||||
|
} |
||||
|
|
||||
|
//渲染图标结构
|
||||
|
type SeriesList struct { |
||||
|
Name string `json:"name"` |
||||
|
Data []interface{} `json:"data"` |
||||
|
Types string `json:"type"` |
||||
|
} |
||||
@ -0,0 +1,555 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/api/version1/customerform" |
||||
|
"appPlatform/models/modelshr" |
||||
|
"appPlatform/models/modelssystempermission" |
||||
|
"appPlatform/overall" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-21 09:50:02 |
||||
|
@ 功能: 饼图 |
||||
|
*/ |
||||
|
func (c *ChartInfo) pieChart(val interface{}, untis []customerform.MasterStruct, chartType string) (snedMap interface{}) { |
||||
|
for _, v := range c.XAxis { |
||||
|
// fmt.Printf("\n\nc.X ===1==> %v =====> %v\n\n", v.Type, v)
|
||||
|
switch v.Type { |
||||
|
case 3: |
||||
|
snedMap = c.PieTimeDataAnaly(v, c.YAxis, val, chartType) |
||||
|
default: |
||||
|
snedMap = c.PieDataAnaly(v, c.YAxis, val, chartType, untis) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
func (c *ChartInfo) PieTimeDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string) (charData SendPicInfo) { |
||||
|
tayTime := time.Now().Unix() |
||||
|
switch x.TimeType { |
||||
|
case "year": |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
startTime := publicmethod.DateToTimeStampOld(fmt.Sprintf("%v-01-01 00:00:00", yearVal)) |
||||
|
endTime := publicmethod.DateToTimeStampOld(fmt.Sprintf("%v-12-31 23:59:59", yearVal)) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
pickName := fmt.Sprintf("%v年", yearVal) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
case "month": |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
yearValInt, _ := strconv.Atoi(yearVal) |
||||
|
var timeList []string |
||||
|
tayTime := int(time.Now().Month()) |
||||
|
for i := 1; i <= tayTime; i++ { |
||||
|
createTime := fmt.Sprintf("%v-%v-01 00:00:00", yearVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-01 00:00:00", yearVal, i) |
||||
|
} |
||||
|
startTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
endTime := publicmethod.GetDaysInMonth(yearValInt, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime.AllTime = endTime.AllTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime.AllTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
pickName := fmt.Sprintf("%v年%v月", yearVal, i) |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
case "day": |
||||
|
yearVal := int(time.Now().Year()) |
||||
|
tayTime := int(time.Now().Month()) |
||||
|
dayTime := int(time.Now().Day()) |
||||
|
var timeList []string |
||||
|
for i := 1; i <= tayTime; i++ { |
||||
|
for j := 1; j <= dayTime; j++ { |
||||
|
pickName := fmt.Sprintf("%v年%v月%v日", yearVal, i, j) |
||||
|
createTime := fmt.Sprintf("%v-%v-%v 00:00:00", yearVal, i, j) |
||||
|
if i < 10 { |
||||
|
if j < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-0%v 00:00:00", yearVal, i, j) |
||||
|
} else { |
||||
|
createTime = fmt.Sprintf("%v-0%v-%v 00:00:00", yearVal, i, j) |
||||
|
} |
||||
|
} else { |
||||
|
if j < 10 { |
||||
|
createTime = fmt.Sprintf("%v-%v-0%v 00:00:00", yearVal, i, j) |
||||
|
} else { |
||||
|
createTime = fmt.Sprintf("%v-%v-%v 00:00:00", yearVal, i, j) |
||||
|
} |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
} |
||||
|
case "hour": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 14) |
||||
|
var timeList []string |
||||
|
for i := 0; i <= 23; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v:00:00", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v:00:00", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
pickName := fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
case "minute": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 13) |
||||
|
var timeList []string |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v:00", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v:00", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
pickName := fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
case "second": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 12) |
||||
|
var timeList []string |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
pickName := fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
case "ymdhms": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 12) |
||||
|
var timeList []string |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
pickName := fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
default: |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
yearValInt, _ := strconv.Atoi(yearVal) |
||||
|
var timeList []string |
||||
|
tayTime := int(time.Now().Month()) |
||||
|
for i := 1; i <= tayTime; i++ { |
||||
|
createTime := fmt.Sprintf("%v-%v-01 00:00:00", yearVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-01 00:00:00", yearVal, i) |
||||
|
} |
||||
|
startTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
endTime := publicmethod.GetDaysInMonth(yearValInt, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime.AllTime = endTime.AllTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime.AllTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
pickName := fmt.Sprintf("%v年%v月", yearVal, i) |
||||
|
timeList = append(timeList, pickName) |
||||
|
charData.picMasterDataAnaly(x.Field, x.Field, pickName, newVal) |
||||
|
charData.AggregateCalculatingPic(pickName, newVal, y) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
func (c *ChartInfo) PieDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string, untis []customerform.MasterStruct) (charData SendPicInfo) { |
||||
|
|
||||
|
var timeList []string //根据维度分组
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
|
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
// fmt.Printf("人员--->%v\n\n", xVal)
|
||||
|
pageTime := publicmethod.TypeToInterface(xVal) |
||||
|
if !publicmethod.IsInTrue[string](pageTime, timeList) { |
||||
|
timeList = append(timeList, pageTime) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// fmt.Printf("人员--2->%v\n\n", timeList)
|
||||
|
for _, v := range timeList { |
||||
|
pickName := DimensionToChinaName(x.Field, v, untis) |
||||
|
charData.picMasterDataAnaly(x.Field, v, pickName, val) |
||||
|
charData.AggregateCalculatingPic(pickName, val, y) |
||||
|
// fmt.Printf("人员--pickName->%v\n\n", pickName)
|
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 处理主数据
|
||||
|
func (s *SendPicInfo) picMasterDataAnaly(xField, keyName string, fathreName, val interface{}) { |
||||
|
// fmt.Printf("处理主数据----->%v-----------%v\n\n\n", keyName, fathreName)
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
jsq := 0 |
||||
|
var masterInfo PicChartInfo |
||||
|
masterInfo.Name = publicmethod.TypeToInterface(fathreName) |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == keyName { |
||||
|
jsq++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
masterInfo.Value = jsq |
||||
|
s.MasterData = append(s.MasterData, masterInfo) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-18 08:45:24 |
||||
|
@ 功能:饼形 聚合计算 |
||||
|
|
||||
|
#fathreName |
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (s *SendPicInfo) AggregateCalculatingPic(fathreName, val interface{}, y []YAxisInfo) { |
||||
|
for _, v := range y { |
||||
|
var pickInfo OtherDataInfo |
||||
|
pickInfo.FathreName = publicmethod.TypeToInterface(fathreName) |
||||
|
pickInfo.ToolName = v.OldTitle |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
pickInfo.AverageValuees(v.Field, val, v.Format) |
||||
|
case 3: |
||||
|
pickInfo.StatisticalQuantityes(v.Field, val, v.Format) |
||||
|
case 4: |
||||
|
pickInfo.RemoveDuplicateCountss(v.Field, val, v.Format) |
||||
|
case 5: |
||||
|
pickInfo.maxDataes(v.Field, val, v.Format) |
||||
|
case 6: |
||||
|
pickInfo.minDataes(v.Field, val, v.Format) |
||||
|
default: |
||||
|
pickInfo.sumDataes(v.Field, val, v.Format) |
||||
|
} |
||||
|
s.OtherData = append(s.OtherData, pickInfo) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (o *OtherDataInfo) AverageValuees(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
jibuqi := 1 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if jibuqi > 0 { |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
jieguo := publicmethod.DataChuli(sumValAvg, format) |
||||
|
o.Toolval = jieguo |
||||
|
} else { |
||||
|
o.Toolval = 0 |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (o *OtherDataInfo) StatisticalQuantityes(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
o.Toolval = len(sumVal) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (o *OtherDataInfo) RemoveDuplicateCountss(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// jieguo := publicmethod.DataChuli(sumVal, format)
|
||||
|
o.Toolval = len(sumVal) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求最大值
|
||||
|
func (o *OtherDataInfo) maxDataes(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 1 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
o.Toolval = jieguo |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求最小值
|
||||
|
func (o *OtherDataInfo) minDataes(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 1 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
o.Toolval = jieguo |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (o *OtherDataInfo) sumDataes(yField string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
for _, mv := range yVal { |
||||
|
if vVal, isOk := mv[yField]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
o.Toolval = jieguo |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 判断维度是否要换成中文
|
||||
|
func DimensionToChinaName(xField string, timeList string, untis []customerform.MasterStruct) (names interface{}) { |
||||
|
for _, v := range untis { |
||||
|
if v.Name == xField { |
||||
|
// fmt.Printf("姓名转换---->%v\n\n", v.Type)
|
||||
|
switch v.Type { |
||||
|
case "pickrole": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_System_Permission.Model(&modelssystempermission.SystemRole{}).Select("`name`").Where("`id` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "pickpost": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.Position{}).Select("`name`").Where("`id` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "deptOrg": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`name`").Where("`id` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "orgCentent": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`name`").Where("`id` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "owner": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "founder": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "expand-user": |
||||
|
var nameVal string |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`name`").Where("`key` = ?", timeList).First(&nameVal) |
||||
|
names = nameVal |
||||
|
case "checkbox": |
||||
|
if len(v.Options) > 0 { |
||||
|
|
||||
|
for _, ov := range v.Options { |
||||
|
if timeList == ov.Value { |
||||
|
names = ov.Label |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
names = timeList |
||||
|
} |
||||
|
case "radio": |
||||
|
if len(v.Options) > 0 { |
||||
|
for _, ov := range v.Options { |
||||
|
if timeList == ov.Value { |
||||
|
names = ov.Label |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
names = timeList |
||||
|
} |
||||
|
default: |
||||
|
names = timeList |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
@ -0,0 +1,661 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/api/version1/customerform" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-21 09:50:02 |
||||
|
@ 功能: 雷达图 |
||||
|
*/ |
||||
|
func (c *ChartInfo) radarChart(val interface{}, untis []customerform.MasterStruct, chartType string) (snedMap interface{}) { |
||||
|
|
||||
|
for _, v := range c.XAxis { |
||||
|
fmt.Printf("\n\nc.X ===1==> %v =====> %v\n\n", v.Type, v) |
||||
|
switch v.Type { |
||||
|
case 3: |
||||
|
snedMap = c.RadarTimeDataAnaly(v, c.YAxis, val, chartType) |
||||
|
default: |
||||
|
snedMap = c.RadarDataAnaly(v, c.YAxis, val, chartType, untis) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
func (c *ChartInfo) RadarTimeDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string) (charData RadarInfo) { |
||||
|
tayTime := time.Now().Unix() |
||||
|
switch x.TimeType { |
||||
|
case "year": |
||||
|
case "day": |
||||
|
case "hour": |
||||
|
case "minute": |
||||
|
case "second": |
||||
|
case "ymdhms": |
||||
|
default: |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
yearValInt, _ := strconv.Atoi(yearVal) |
||||
|
tayTime := int(time.Now().Month()) |
||||
|
var jiSuanVal []RadarTimeInfo |
||||
|
for i := 1; i <= tayTime; i++ { |
||||
|
createTime := fmt.Sprintf("%v-%v-01 00:00:00", yearVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-01 00:00:00", yearVal, i) |
||||
|
} |
||||
|
startTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
endTime := publicmethod.GetDaysInMonth(yearValInt, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime.AllTime = endTime.AllTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime.AllTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var timeData RadarTimeInfo |
||||
|
timeData.XName = fmt.Sprintf("%v年%v月", yearVal, i) |
||||
|
timeData.DataVal = newVal |
||||
|
jiSuanVal = append(jiSuanVal, timeData) |
||||
|
} |
||||
|
charData.ParsingData(jiSuanVal, y) |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-23 11:33:29 |
||||
|
@ 功能: 解析时间模式下的数据 |
||||
|
*/ |
||||
|
func (r *RadarInfo) ParsingData(timeVal []RadarTimeInfo, y []YAxisInfo) { |
||||
|
|
||||
|
for _, v := range y { //量化指标
|
||||
|
if !publicmethod.IsInTrue[string](v.OldTitle, r.Legend) { |
||||
|
r.Legend = append(r.Legend, v.OldTitle) |
||||
|
} |
||||
|
|
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
r.AverageValueesTime(v, timeVal, v.Format) |
||||
|
case 3: |
||||
|
r.StatisticalQuantityesTime(v, timeVal, v.Format) |
||||
|
case 4: |
||||
|
r.RemoveDuplicateCountssTime(v, timeVal, v.Format) |
||||
|
case 5: |
||||
|
r.maxDataesTime(v, timeVal, v.Format) |
||||
|
case 6: |
||||
|
r.minDataesTime(v, timeVal, v.Format) |
||||
|
default: |
||||
|
r.sumDataesTime(v, timeVal, v.Format) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (r *RadarInfo) AverageValueesTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal float64 |
||||
|
jibuqi := 1 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var jieguo interface{} |
||||
|
if sumVal > 0 { |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
jieguo := publicmethod.DataChuli(sumValAvg, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
} else { |
||||
|
serData.Value = append(serData.Value, 0) |
||||
|
} |
||||
|
|
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= sumVal { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (r *RadarInfo) StatisticalQuantityesTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal []float64 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
|
||||
|
sumVal = append(sumVal, minVal) |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := float64(len(sumVal)) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= jieguo { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (r *RadarInfo) RemoveDuplicateCountssTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal []float64 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := float64(len(sumVal)) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= jieguo { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 最大值
|
||||
|
func (r *RadarInfo) maxDataesTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal float64 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= sumVal { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 最小值
|
||||
|
func (r *RadarInfo) minDataesTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal float64 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= sumVal { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (r *RadarInfo) sumDataesTime(y YAxisInfo, timeVal []RadarTimeInfo, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
for _, v := range timeVal { |
||||
|
var sumVal float64 |
||||
|
for _, tv := range v.DataVal { |
||||
|
if vVal, isOk := tv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(vVal), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
isWrite := true |
||||
|
for ri, rv := range r.Indicator { |
||||
|
if rv.Name == v.XName { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(rv.Max), 64) |
||||
|
if err == nil { |
||||
|
isWrite = false |
||||
|
if minVal <= sumVal { |
||||
|
r.Indicator[ri].Max = sumVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isWrite { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(v.XName) |
||||
|
newIndic.Max = jieguo |
||||
|
r.Indicator = append(r.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
|
r.DataList = append(r.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 普通字段
|
||||
|
func (c *ChartInfo) RadarDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string, untis []customerform.MasterStruct) (charData RadarInfo) { |
||||
|
var timeList []string //根据维度分组
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
|
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
// fmt.Printf("人员--->%v\n\n", xVal)
|
||||
|
pageTime := publicmethod.TypeToInterface(xVal) |
||||
|
if !publicmethod.IsInTrue[string](pageTime, timeList) { |
||||
|
timeList = append(timeList, pageTime) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
//纬度信息
|
||||
|
var weiDu []PicChartInfo |
||||
|
for _, v := range timeList { |
||||
|
pickName := DimensionToChinaName(x.Field, v, untis) |
||||
|
// charData.AnalyRadarData(x.Field, v, y, pickName, val)
|
||||
|
var weiduInfo PicChartInfo |
||||
|
weiduInfo.Name = v |
||||
|
weiduInfo.Value = pickName |
||||
|
weiDu = append(weiDu, weiduInfo) |
||||
|
} |
||||
|
charData.AnalyRadarData(x.Field, weiDu, y, val) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-22 11:22:34 |
||||
|
@ 功能: 解析雷达数据 |
||||
|
#xField x轴设定 |
||||
|
w |
||||
|
|
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (b *RadarInfo) AnalyRadarData(xField string, x []PicChartInfo, y []YAxisInfo, val interface{}) { |
||||
|
for _, v := range y { |
||||
|
b.Legend = append(b.Legend, v.OldTitle) |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
b.AverageValuees(v, xField, x, val, v.Format) |
||||
|
case 3: |
||||
|
b.StatisticalQuantityes(v, xField, x, val, v.Format) |
||||
|
case 4: |
||||
|
b.RemoveDuplicateCountss(v, xField, x, val, v.Format) |
||||
|
case 5: |
||||
|
b.maxDataes(v, xField, x, val, v.Format) |
||||
|
case 6: |
||||
|
b.minDataes(v, xField, x, val, v.Format) |
||||
|
default: |
||||
|
b.sumDataes(v, xField, x, val, v.Format) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (b *RadarInfo) AverageValuees(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
jibuqi := 1 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if jibuqi > 0 { |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
jieguo := publicmethod.DataChuli(sumValAvg, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
jieguo := 0 |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (b *RadarInfo) StatisticalQuantityes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := len(sumVal) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (b *RadarInfo) RemoveDuplicateCountss(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := len(sumVal) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 最大值
|
||||
|
func (b *RadarInfo) maxDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 0 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 最小值
|
||||
|
func (b *RadarInfo) minDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 = 0 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (b *RadarInfo) sumDataes(y YAxisInfo, xField string, x []PicChartInfo, val interface{}, format int) { |
||||
|
var serData DataInfo |
||||
|
serData.Name = y.OldTitle |
||||
|
|
||||
|
for _, v := range x { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == v.Name { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
jieguo := publicmethod.DataChuli(sumVal, format) |
||||
|
serData.Value = append(serData.Value, jieguo) |
||||
|
b.WeiDuMaxVal(v.Value, jieguo) |
||||
|
} else { |
||||
|
b.WeiDuMaxVal(v.Value, 0) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// if yVal, isOk := val.([]map[string]interface{}); isOk {
|
||||
|
// for _, xv := range yVal {
|
||||
|
// var sumVal float64
|
||||
|
// for _, v := range x {
|
||||
|
// if vVal, isOk := xv[xField]; isOk {
|
||||
|
// if v.Name == publicmethod.TypeToInterface(vVal) {
|
||||
|
// if yVal, isOk := xv[y.Field]; isOk {
|
||||
|
// minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yVal), 64)
|
||||
|
// if err == nil {
|
||||
|
// sumVal = sumVal + minVal
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
// serData.Value = append(serData.Value, sumVal)
|
||||
|
// }
|
||||
|
// } else {
|
||||
|
// for i := 0; i < len(x); i++ {
|
||||
|
// serData.Value = append(serData.Value, 0)
|
||||
|
// }
|
||||
|
|
||||
|
// }
|
||||
|
|
||||
|
b.DataList = append(b.DataList, serData) |
||||
|
} |
||||
|
|
||||
|
// 组装纬度最大值
|
||||
|
func (b *RadarInfo) WeiDuMaxVal(name, val interface{}) { |
||||
|
isNew := true |
||||
|
for i, v := range b.Indicator { |
||||
|
if v.Name == name { |
||||
|
isNew = false |
||||
|
valFloat, _ := strconv.ParseFloat(publicmethod.TypeToInterface(val), 64) |
||||
|
indFloat, _ := strconv.ParseFloat(publicmethod.TypeToInterface(v.Max), 64) |
||||
|
if valFloat >= indFloat { |
||||
|
b.Indicator[i].Max = valFloat + 10 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if isNew { |
||||
|
var newIndic IndicatorInfo |
||||
|
newIndic.Name = publicmethod.TypeToInterface(name) |
||||
|
newIndic.Max = val |
||||
|
b.Indicator = append(b.Indicator, newIndic) |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,660 @@ |
|||||
|
package customChartes |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/api/version1/customerform" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-23 09:39:25 |
||||
|
@ 功能: 指标数据处理 |
||||
|
*/ |
||||
|
func (c *ChartInfo) TargetChart(val interface{}, untis []customerform.MasterStruct, chartType string) (snedMap interface{}) { |
||||
|
for _, v := range c.XAxis { |
||||
|
// fmt.Printf("\n\nc.X ===1==> %v =====> %v\n\n", v.Type, v)
|
||||
|
switch v.Type { |
||||
|
case 3: |
||||
|
snedMap = c.TargetTimeDataAnaly(v, c.YAxis, val, chartType) |
||||
|
default: |
||||
|
snedMap = c.TargetDataAnaly(v, c.YAxis, val, chartType, untis) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-23 10:19:15 |
||||
|
@ 功能: 指标时间维度计算 |
||||
|
*/ |
||||
|
func (c *ChartInfo) TargetTimeDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string) (charData []TargetInfo) { |
||||
|
tayTime := time.Now().Unix() |
||||
|
switch x.TimeType { |
||||
|
case "year": |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
startTime := publicmethod.DateToTimeStampOld(fmt.Sprintf("%v-01-01 00:00:00", yearVal)) |
||||
|
endTime := publicmethod.DateToTimeStampOld(fmt.Sprintf("%v-12-31 23:59:59", yearVal)) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v年", yearVal) |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
case "day": |
||||
|
yearVal := int(time.Now().Year()) |
||||
|
tayTime := int(time.Now().Month()) |
||||
|
dayTime := int(time.Now().Day()) |
||||
|
for i := 1; i <= tayTime; i++ { |
||||
|
for j := 1; j <= dayTime; j++ { |
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v年%v月%v日", yearVal, i, j) |
||||
|
createTime := fmt.Sprintf("%v-%v-%v 00:00:00", yearVal, i, j) |
||||
|
if i < 10 { |
||||
|
if j < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-0%v 00:00:00", yearVal, i, j) |
||||
|
} else { |
||||
|
createTime = fmt.Sprintf("%v-0%v-%v 00:00:00", yearVal, i, j) |
||||
|
} |
||||
|
} else { |
||||
|
if j < 10 { |
||||
|
createTime = fmt.Sprintf("%v-%v-0%v 00:00:00", yearVal, i, j) |
||||
|
} else { |
||||
|
createTime = fmt.Sprintf("%v-%v-%v 00:00:00", yearVal, i, j) |
||||
|
} |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
} |
||||
|
case "hour": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 14) |
||||
|
for i := 0; i <= 23; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v:00:00", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v:00:00", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
case "minute": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 13) |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v:00", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v:00", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
case "second": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 12) |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
case "ymdhms": |
||||
|
tayTime := time.Now().Unix() |
||||
|
ymdhVal := publicmethod.UnixTimeToDay(tayTime, 12) |
||||
|
for i := 0; i <= 60; i++ { |
||||
|
createTime := fmt.Sprintf("%v %v", ymdhVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v 0%v", ymdhVal, i) |
||||
|
} |
||||
|
tayTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
startTime, endTime := publicmethod.TimeUnixDayStartAndEnd(tayTime) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime = endTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var charInfo TargetInfo |
||||
|
charInfo.Title = fmt.Sprintf("%v :%v", ymdhVal, i) |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
default: |
||||
|
yearVal := publicmethod.UnixTimeToDay(tayTime, 16) |
||||
|
yearValInt, _ := strconv.Atoi(yearVal) |
||||
|
tayMonthTime := int(time.Now().Month()) |
||||
|
for i := 1; i <= tayMonthTime; i++ { |
||||
|
var charInfo TargetInfo |
||||
|
createTime := fmt.Sprintf("%v-%v-01 00:00:00", yearVal, i) |
||||
|
if i < 10 { |
||||
|
createTime = fmt.Sprintf("%v-0%v-01 00:00:00", yearVal, i) |
||||
|
} |
||||
|
charInfo.Title = fmt.Sprintf("%v年%v月", yearVal, i) |
||||
|
startTime := publicmethod.DateToTimeStampOld(createTime) |
||||
|
endTime := publicmethod.GetDaysInMonth(yearValInt, i) |
||||
|
var newVal []map[string]interface{} |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
pageTime, _ := publicmethod.StringToInt64(xVal) |
||||
|
if publicmethod.GetIntLength(pageTime) >= 13 { |
||||
|
startTime = startTime * 1000 |
||||
|
endTime.AllTime = endTime.AllTime * 1000 |
||||
|
} |
||||
|
if startTime <= pageTime && pageTime <= endTime.AllTime { |
||||
|
newVal = append(newVal, mv) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
charInfo.AnalyRadarDataTime(y, newVal) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-22 11:22:34 |
||||
|
@ 功能: 解析雷达数据 |
||||
|
#xField x轴设定 |
||||
|
w |
||||
|
|
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (t *TargetInfo) AnalyRadarDataTime(y []YAxisInfo, val interface{}) { |
||||
|
for _, v := range y { |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
t.TimeAverageValuees(v, val, v.Format) |
||||
|
case 3: |
||||
|
t.TimeStatisticalQuantityes(v, val, v.Format) |
||||
|
case 4: |
||||
|
t.TimeRemoveDuplicateCountss(v, val, v.Format) |
||||
|
case 5: |
||||
|
t.TimemaxDataes(v, val, v.Format) |
||||
|
case 6: |
||||
|
t.TimeminDataes(v, val, v.Format) |
||||
|
default: |
||||
|
t.TimesumDataes(v, val, v.Format) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (t *TargetInfo) TimeAverageValuees(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
jibuqi := 1 |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
if jibuqi > 0 { |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
lianHua.Value = publicmethod.DataChuli(sumValAvg, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} else { |
||||
|
lianHua.Value = 0 |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (t *TargetInfo) TimeStatisticalQuantityes(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = len(sumVal) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (t *TargetInfo) TimeRemoveDuplicateCountss(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = len(sumVal) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 最大值
|
||||
|
func (t *TargetInfo) TimemaxDataes(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 最小值
|
||||
|
func (t *TargetInfo) TimeminDataes(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (t *TargetInfo) TimesumDataes(y YAxisInfo, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-23 09:41:50 |
||||
|
@ 功能: 指标普通维度计算 |
||||
|
*/ |
||||
|
func (c *ChartInfo) TargetDataAnaly(x XAxisInfo, y []YAxisInfo, val interface{}, chartType string, untis []customerform.MasterStruct) (charData []TargetInfo) { |
||||
|
var timeList []string //根据维度分组
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[x.Field]; isOk { |
||||
|
// fmt.Printf("人员--->%v\n\n", xVal)
|
||||
|
pageTime := publicmethod.TypeToInterface(xVal) |
||||
|
if !publicmethod.IsInTrue[string](pageTime, timeList) { |
||||
|
timeList = append(timeList, pageTime) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
for _, v := range timeList { |
||||
|
var charInfo TargetInfo |
||||
|
pickName := DimensionToChinaName(x.Field, v, untis) |
||||
|
charInfo.Title = pickName |
||||
|
charInfo.AnalyRadarData(x.Field, v, y, val) |
||||
|
charData = append(charData, charInfo) |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2025-07-22 11:22:34 |
||||
|
@ 功能: 解析雷达数据 |
||||
|
#xField x轴设定 |
||||
|
w |
||||
|
|
||||
|
# y Y轴设定 |
||||
|
# val 查询到的值 |
||||
|
#chartType 图标类型 |
||||
|
1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:最小值 |
||||
|
当字段为时间类型时. 1:自动(原始值);2:整数;3:保留1位小数;4:保留2位小数;5:百分比;6:百分比1位小数;7:百分比2位小数; |
||||
|
*/ |
||||
|
func (t *TargetInfo) AnalyRadarData(xField, xVal string, y []YAxisInfo, val interface{}) { |
||||
|
for _, v := range y { |
||||
|
switch v.Method { |
||||
|
case 2: |
||||
|
t.AverageValuees(v, xField, xVal, val, v.Format) |
||||
|
case 3: |
||||
|
t.StatisticalQuantityes(v, xField, xVal, val, v.Format) |
||||
|
case 4: |
||||
|
t.RemoveDuplicateCountss(v, xField, xVal, val, v.Format) |
||||
|
case 5: |
||||
|
t.maxDataes(v, xField, xVal, val, v.Format) |
||||
|
case 6: |
||||
|
t.minDataes(v, xField, xVal, val, v.Format) |
||||
|
default: |
||||
|
t.sumDataes(v, xField, xVal, val, v.Format) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 平均值
|
||||
|
func (t *TargetInfo) AverageValuees(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
jibuqi := 1 |
||||
|
for _, mv := range yVal { |
||||
|
if xVal, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xVal) |
||||
|
if xValStr == xVal { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
jibuqi++ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
sumValAvg := sumVal / float64(jibuqi) |
||||
|
lianHua.Value = publicmethod.DataChuli(sumValAvg, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 计数
|
||||
|
func (t *TargetInfo) StatisticalQuantityes(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
if xValx, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xValx) |
||||
|
if xValStr == xVal { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = len(sumVal) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去重计数
|
||||
|
func (t *TargetInfo) RemoveDuplicateCountss(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal []float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
if xValx, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xValx) |
||||
|
if xValStr == xVal { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if !publicmethod.IsInTrue[float64](minVal, sumVal) { |
||||
|
sumVal = append(sumVal, minVal) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = len(sumVal) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 最大值
|
||||
|
func (t *TargetInfo) maxDataes(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
if xValx, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xValx) |
||||
|
if xValStr == xVal { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal <= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 最小值
|
||||
|
func (t *TargetInfo) minDataes(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
if xValx, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xValx) |
||||
|
if xValStr == xVal { |
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
if sumVal >= minVal { |
||||
|
sumVal = minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 求和
|
||||
|
func (t *TargetInfo) sumDataes(y YAxisInfo, xField, xVal string, val interface{}, format int) { |
||||
|
|
||||
|
if yVal, isOk := val.([]map[string]interface{}); isOk { |
||||
|
var sumVal float64 |
||||
|
var lianHua PicChartInfo |
||||
|
lianHua.Name = y.OldTitle |
||||
|
for _, mv := range yVal { |
||||
|
if xValx, isOk := mv[xField]; isOk { |
||||
|
xValStr := publicmethod.TypeToInterface(xValx) |
||||
|
|
||||
|
if xValStr == xVal { |
||||
|
// fmt.Printf("指标秋毫---->%v---->%v\n\n\n", xValStr, y.Field)
|
||||
|
if yval, isOk := mv[y.Field]; isOk { |
||||
|
|
||||
|
minVal, err := strconv.ParseFloat(publicmethod.TypeToInterface(yval), 64) |
||||
|
if err == nil { |
||||
|
sumVal = sumVal + minVal |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
lianHua.Value = publicmethod.DataChuli(sumVal, format) |
||||
|
t.List = append(t.List, lianHua) |
||||
|
} |
||||
|
} |
||||
@ -1,6 +1,6 @@ |
|||||
package publicmethod |
package publicmethod |
||||
|
|
||||
//自定义表单量化类型
|
//自定义表单量化类型
|
||||
var Dimension = []string{"input", "textarea", "datePicker", "timePicker", "organization", "tinymce", "colorPicker", "treeSelect", "serialNumber", "expand-user", "orgCentent", "founder", "founderTime", "editTime", "owner", "deptOrg", "pickpost", "pickrole"} //维度字段
|
var Dimension = []string{"input", "textarea", "datePicker", "timePicker", "organization", "tinymce", "colorPicker", "treeSelect", "serialNumber", "expand-user", "orgCentent", "founder", "founderTime", "editTime", "owner", "deptOrg", "pickpost", "pickrole", "radio", "checkbox"} //维度字段
|
||||
var Quantization = []string{"digitpage", "radio", "checkbox", "select", "cascader", "switch", "inputNumber", "slider", "rate"} //可量化字段
|
var Quantization = []string{"digitpage", "select", "cascader", "switch", "inputNumber", "slider", "rate"} //可量化字段
|
||||
var TimeUint = []string{"founderTime", "editTime", "timePicker"} |
var TimeUint = []string{"founderTime", "editTime", "timePicker", "datePicker"} //时间
|
||||
|
|||||
Loading…
Reference in new issue