You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
320 lines
9.1 KiB
320 lines
9.1 KiB
|
4 months ago
|
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)
|
||
|
|
}
|
||
|
|
}
|