|
@@ -214,9 +214,9 @@ func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingList []*data_manage.Ch
|
|
|
}
|
|
|
|
|
|
// GetChartDataByEdbInfoList 区间计算图表-根据指标信息获取x轴和y轴
|
|
|
-func GetChartDataByEdbInfoList(chartInfoId int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
|
|
|
+func GetChartDataByEdbInfoList(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
|
|
|
if chartInfoId > 0 && req.EdbInfoMode == 1 {
|
|
|
- edbList, xEdbIdValue, dataResp, err = GetChartDataByEdbInfoListBySeries(chartInfoId, startDate, endDate, edbInfoMappingList, req)
|
|
|
+ edbList, xEdbIdValue, dataResp, err = GetChartDataByEdbInfoListBySeries(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, req)
|
|
|
return
|
|
|
}
|
|
|
for _, edbInfoMapping := range edbInfoMappingList {
|
|
@@ -224,9 +224,83 @@ func GetChartDataByEdbInfoList(chartInfoId int, startDate, endDate string, edbIn
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
+ dataList := edbInfoMapping.DataList.([]*data_manage.EdbDataList)
|
|
|
+ // 处理上下限
|
|
|
+ var maxData, minData float64
|
|
|
+ if len(dataList) > 0 {
|
|
|
+ maxData = dataList[0].Value
|
|
|
+ minData = dataList[0].Value
|
|
|
+ for _, v := range dataList {
|
|
|
+ if v.Value > maxData {
|
|
|
+ maxData = v.Value
|
|
|
+ }
|
|
|
+ if v.Value < minData {
|
|
|
+ minData = v.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ edbInfoMapping.MaxData = maxData
|
|
|
+ edbInfoMapping.MinData = minData
|
|
|
xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
|
|
|
}
|
|
|
+ //根据时间类型来筛选最终的数据
|
|
|
+ yearMax := 0
|
|
|
+ if dateType == utils.DateTypeNYears {
|
|
|
+ for _, v := range edbInfoMappingList {
|
|
|
+ dataList := v.DataList.([]*data_manage.EdbDataList)
|
|
|
+ if len(dataList) > 0 {
|
|
|
+ latestDate := dataList[0].DataTime
|
|
|
+ if latestDate != "" {
|
|
|
+ lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
|
|
|
+ if tErr != nil {
|
|
|
+ err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if lastDateT.Year() > yearMax {
|
|
|
+ yearMax = lastDateT.Year()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
|
|
|
|
|
|
+ if startDate != "" {
|
|
|
+ for k, v := range edbInfoMappingList {
|
|
|
+ var maxData, minData float64
|
|
|
+ dataList := v.DataList.([]*data_manage.EdbDataList)
|
|
|
+ newDataList := make([]*data_manage.EdbDataList, 0)
|
|
|
+ if len(dataList) == 0 {
|
|
|
+ newDataList = dataList
|
|
|
+ } else {
|
|
|
+ firstFlag := true
|
|
|
+ for _, d := range dataList {
|
|
|
+ if endDate != "" && d.DataTime > endDate {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if d.DataTime < startDate {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newDataList = append(newDataList, d)
|
|
|
+ if firstFlag {
|
|
|
+ maxData = d.Value
|
|
|
+ minData = d.Value
|
|
|
+ firstFlag = false
|
|
|
+ } else {
|
|
|
+ if d.Value > maxData {
|
|
|
+ maxData = d.Value
|
|
|
+ }
|
|
|
+ if d.Value < minData {
|
|
|
+ minData = d.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ edbInfoMappingList[k].DataList = newDataList
|
|
|
+ edbInfoMappingList[k].MinData = minData
|
|
|
+ edbInfoMappingList[k].MaxData = maxData
|
|
|
+ }
|
|
|
+ }
|
|
|
dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req}
|
|
|
edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
|
|
|
if err != nil {
|
|
@@ -236,7 +310,7 @@ func GetChartDataByEdbInfoList(chartInfoId int, startDate, endDate string, edbIn
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func GetChartDataByEdbInfoListBySeries(chartInfoId int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
|
|
|
+func GetChartDataByEdbInfoListBySeries(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
|
|
|
//查询seriesId
|
|
|
chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
|
|
|
seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfoId)
|
|
@@ -259,10 +333,80 @@ func GetChartDataByEdbInfoListBySeries(chartInfoId int, startDate, endDate strin
|
|
|
return
|
|
|
}
|
|
|
edbInfoMapping.DataList = dataList
|
|
|
+ // 处理上下限
|
|
|
+ var maxData, minData float64
|
|
|
+ if len(dataList) > 0 {
|
|
|
+ maxData = dataList[0].Value
|
|
|
+ minData = dataList[0].Value
|
|
|
+ for _, v := range dataList {
|
|
|
+ if v.Value > maxData {
|
|
|
+ maxData = v.Value
|
|
|
+ }
|
|
|
+ if v.Value < minData {
|
|
|
+ minData = v.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ edbInfoMapping.MaxData = maxData
|
|
|
+ edbInfoMapping.MinData = minData
|
|
|
xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
|
|
|
}
|
|
|
+ yearMax := 0
|
|
|
+ if dateType == utils.DateTypeNYears {
|
|
|
+ for _, v := range edbInfoMappingList {
|
|
|
+ dataList := v.DataList.([]*data_manage.EdbDataList)
|
|
|
+ latestDate := dataList[0].DataTime
|
|
|
+ if latestDate != "" {
|
|
|
+ lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
|
|
|
+ if tErr != nil {
|
|
|
+ err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if lastDateT.Year() > yearMax {
|
|
|
+ yearMax = lastDateT.Year()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
|
|
|
|
|
|
- dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req}
|
|
|
+ if startDate != "" {
|
|
|
+ for k, v := range edbInfoMappingList {
|
|
|
+ var maxData, minData float64
|
|
|
+ dataList := v.DataList.([]*data_manage.EdbDataList)
|
|
|
+ newDataList := make([]*data_manage.EdbDataList, 0)
|
|
|
+ if len(dataList) == 0 {
|
|
|
+ newDataList = dataList
|
|
|
+ } else {
|
|
|
+ firstFlag := true
|
|
|
+ for _, d := range dataList {
|
|
|
+ if endDate != "" && d.DataTime > endDate {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if d.DataTime < startDate {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newDataList = append(newDataList, d)
|
|
|
+ if firstFlag {
|
|
|
+ maxData = d.Value
|
|
|
+ minData = d.Value
|
|
|
+ firstFlag = false
|
|
|
+ } else {
|
|
|
+ if d.Value > maxData {
|
|
|
+ maxData = d.Value
|
|
|
+ }
|
|
|
+ if d.Value < minData {
|
|
|
+ minData = d.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ edbInfoMappingList[k].DataList = newDataList
|
|
|
+ edbInfoMappingList[k].MinData = minData
|
|
|
+ edbInfoMappingList[k].MaxData = maxData
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req, SeriesId: seriesMappingItem.FactorEdbSeriesId}
|
|
|
edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
|
|
@@ -397,13 +541,53 @@ func getChartDataByEdbInfo(edbInfoMapping *data_manage.ChartEdbInfoMapping, req
|
|
|
return
|
|
|
}
|
|
|
if req.UnNormalDataDealType > 0 {
|
|
|
- // todo 异常数据处理
|
|
|
+ switch req.UnNormalDataDealType { //0:不处理,1:剔除,2替换
|
|
|
+ case 1:
|
|
|
+ dealDataList := make([]*data_manage.EdbDataList, 0)
|
|
|
+ for _, v := range newDataList {
|
|
|
+ if !utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
|
|
|
+ dealDataList = append(dealDataList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case 2:
|
|
|
+ for i, v := range newDataList {
|
|
|
+ if utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
|
|
|
+ newDataList[i].Value = req.UnNormalDataConf.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if req.DataConvertType > 0 {
|
|
|
- // todo 数据转换
|
|
|
+ // 数据转换类型 0不转, 1乘 2除 3对数
|
|
|
+ switch req.DataConvertType {
|
|
|
+ case 1:
|
|
|
+ for i, v := range newDataList {
|
|
|
+ newDataList[i].Value = v.Value * req.DataConvertConf.Value
|
|
|
+ }
|
|
|
+ //item.MaxData = item.MaxData * v.ConvertValue
|
|
|
+ //item.MinData = item.MinData * v.ConvertValue
|
|
|
+ case 2:
|
|
|
+ for i, v := range newDataList {
|
|
|
+ newDataList[i].Value = v.Value / req.DataConvertConf.Value
|
|
|
+ }
|
|
|
+ //item.MaxData = item.MaxData / v.ConvertValue
|
|
|
+ //item.MinData = item.MinData / v.ConvertValue
|
|
|
+ case 3:
|
|
|
+ for i, v := range newDataList {
|
|
|
+ if v.Value <= 0 {
|
|
|
+ err = errors.New("数据中含有负数或0,无法对数运算")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newDataList[i].Value = math.Log(v.Value) / math.Log(req.DataConvertConf.Value)
|
|
|
+ }
|
|
|
+ //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
|
|
|
+ //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
|
|
|
+ }
|
|
|
}
|
|
|
newEdbInfoMapping.DataList = newDataList
|
|
|
+ //时间处理
|
|
|
+
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -551,14 +735,6 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
|
|
|
isSendEmail = false
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
|
|
|
- if extraConfig.SeriesName == "" && extraConfig.EdbInfoMode == 1 {
|
|
|
- errMsg = "请输入指标系列名称"
|
|
|
- err = errors.New(errMsg)
|
|
|
- isSendEmail = false
|
|
|
- return
|
|
|
- }
|
|
|
if len(req.ChartEdbInfoList) > 100 {
|
|
|
errMsg = "添加指标总数量不得超过100"
|
|
|
err = errors.New(errMsg)
|
|
@@ -566,14 +742,11 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if extraConfig.CalculateType > 5 || extraConfig.CalculateType < 0 {
|
|
|
- errMsg = "计算方式参数错误"
|
|
|
- err = errors.New(errMsg)
|
|
|
- isSendEmail = false
|
|
|
+ err, errMsg, isSendEmail = CheckChartRangeExtraConfig(extraConfig)
|
|
|
+ if err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- //todo 校验时间区间设置
|
|
|
chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
|
|
|
if err != nil {
|
|
|
if err.Error() == utils.ErrNoRow() {
|
|
@@ -703,12 +876,13 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
|
|
|
// todo 指标名称修改
|
|
|
mapItem := new(data_manage.ChartEdbMapping)
|
|
|
mapItem.EdbInfoId = v.EdbInfoId
|
|
|
+ mapItem.EdbAliasName = v.EdbAliasName
|
|
|
+ mapItem.IsAxis = v.IsAxis
|
|
|
mapItem.CreateTime = time.Now()
|
|
|
mapItem.ModifyTime = time.Now()
|
|
|
edbTimestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
|
mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + edbTimestamp + "_" + strconv.Itoa(v.EdbInfoId))
|
|
|
mapItem.IsOrder = true
|
|
|
- mapItem.IsAxis = 1
|
|
|
mapItem.EdbInfoType = 1
|
|
|
mapItem.Source = utils.CHART_SOURCE_RANGE_ANALYSIS
|
|
|
mapList = append(mapList, mapItem)
|
|
@@ -795,26 +969,16 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang
|
|
|
}
|
|
|
|
|
|
extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
|
|
|
- if extraConfig.SeriesName == "" && extraConfig.EdbInfoMode == 1 {
|
|
|
- errMsg = "请输入指标系列名称"
|
|
|
- err = errors.New(errMsg)
|
|
|
- isSendEmail = false
|
|
|
- return
|
|
|
- }
|
|
|
if len(req.ChartEdbInfoList) > 100 {
|
|
|
errMsg = "添加指标总数量不得超过100"
|
|
|
err = errors.New(errMsg)
|
|
|
isSendEmail = false
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- if extraConfig.CalculateType > 5 || extraConfig.CalculateType < 0 {
|
|
|
- errMsg = "计算方式参数错误"
|
|
|
- err = errors.New(errMsg)
|
|
|
- isSendEmail = false
|
|
|
+ err, errMsg, isSendEmail = CheckChartRangeExtraConfig(extraConfig)
|
|
|
+ if err != nil {
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
|
|
|
if err != nil {
|
|
|
if err.Error() == utils.ErrNoRow() {
|
|
@@ -1604,7 +1768,7 @@ func FactorEdbStepCalculateRange(seriesId int, edbArr []int, extraConf data_mana
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- _, _, _, err = GetChartDataByEdbInfoList(0, "", "", edbInfoMappingList, &extraConf)
|
|
|
+ _, _, _, err = GetChartDataByEdbInfoList(0, 0, 0, "", "", edbInfoMappingList, &extraConf)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("获取图表数据失败, ErrMsg: %v", err)
|
|
|
return
|
|
@@ -1649,3 +1813,75 @@ func FactorEdbStepCalculateRange(seriesId int, edbArr []int, extraConf data_mana
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+func CheckChartRangeExtraConfig(extraConfig data_manage.ChartRangeAnalysisExtraConf) (err error, errMsg string, isSendEmail bool) {
|
|
|
+ extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
|
|
|
+ if extraConfig.SeriesName == "" && extraConfig.EdbInfoMode == 1 {
|
|
|
+ errMsg = "请输入指标系列名称"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if extraConfig.CalculateType > 5 || extraConfig.CalculateType < 0 {
|
|
|
+ errMsg = "计算方式参数错误"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ switch extraConfig.DateRangeType {
|
|
|
+ case 0:
|
|
|
+ case 1:
|
|
|
+ if len(extraConfig.ManualDateConf) == 0 {
|
|
|
+ errMsg = "请选择时间区间"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 先按开始时间排序
|
|
|
+ sort.Sort(data_manage.ChartRangeAnalysisManualDateConfList(extraConfig.ManualDateConf))
|
|
|
+ // 校验日期
|
|
|
+ // 1.如果截止时间小于指标的截止日期,需要重置为指标的截止日期
|
|
|
+ // 2.时间区间不能重叠
|
|
|
+ for i := 1; i < len(extraConfig.ManualDateConf); i++ {
|
|
|
+ start1, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i-1].EndDate)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ errMsg = "截止日期格式有误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ start2, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].EndDate)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ errMsg = "截止日期格式有误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ start3, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].StartDate)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ errMsg = "截止日期格式有误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 如果当前区间的开始时间小于等于前一个区间的结束时间,则存在重叠
|
|
|
+ if !start2.After(start1) || start3.Before(start1) {
|
|
|
+ errMsg = "日期区间存在重叠"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果截止时间大于指标的截止日期,需要重置为指标的截止日期
|
|
|
+ case 2:
|
|
|
+ if extraConfig.YearDateConf.StartDay == "" || extraConfig.YearDateConf.EndDay == "" {
|
|
|
+ errMsg = "请选择时间区间"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.StartDay); e != nil {
|
|
|
+ errMsg = "开始日期格式有误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.EndDay); e != nil {
|
|
|
+ errMsg = "结束日期格式有误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|