瀏覽代碼

Merge branch 'feature/eta1.9.7_interval_analysis' into debug

xyxie 8 月之前
父節點
當前提交
0496859992

+ 262 - 94
controllers/data_manage/range_analysis/chart_info.go

@@ -52,72 +52,33 @@ func (this *RangeChartChartInfoController) Preview() {
 		return
 	}
 	// 基础校验
-	if len(req.EdbInfoIds) == 0 {
+	if len(req.ChartEdbInfoList) == 0 {
 		br.Msg = "请选择指标"
 		return
 	}
-	// todo 校验时间区间配置
-	switch req.ExtraConf.DateRangeType {
-	case 0:
-	case 1:
-		if len(req.ExtraConf.ManualDateConf) == 0 {
-			br.Msg = "请选择时间区间"
-			return
-		}
-		// 先按开始时间排序
-		sort.Sort(data_manage.ChartRangeAnalysisManualDateConfList(req.ExtraConf.ManualDateConf))
-		// 校验日期
-		// 1.如果截止时间小于指标的截止日期,需要重置为指标的截止日期
-		// 2.时间区间不能重叠
-		for i := 1; i < len(req.ExtraConf.ManualDateConf); i++ {
-			start1, err := time.Parse(utils.FormatDate, req.ExtraConf.ManualDateConf[i-1].EndDate)
-			if err != nil {
-				br.Msg = "截止日期格式有误"
-				return
-			}
-			start2, err := time.Parse(utils.FormatDate, req.ExtraConf.ManualDateConf[i].EndDate)
-			if err != nil {
-				br.Msg = "截止日期格式有误"
-				return
-			}
 
-			start3, err := time.Parse(utils.FormatDate, req.ExtraConf.ManualDateConf[i].StartDate)
-			if err != nil {
-				br.Msg = "截止日期格式有误"
-				return
-			}
-			// 如果当前区间的开始时间小于等于前一个区间的结束时间,则存在重叠
-			if !start2.After(start1) || start3.Before(start1) {
-				br.Msg = "日期区间存在重叠"
-				return
-			}
-		}
-		//如果截止时间大于指标的截止日期,需要重置为指标的截止日期
-	case 2:
-		if req.ExtraConf.YearDateConf.StartDay == "" || req.ExtraConf.YearDateConf.EndDay == "" {
-			br.Msg = "请选择时间区间"
-			return
-		}
-		if _, e := time.Parse(utils.FormatMonthDay, req.ExtraConf.YearDateConf.StartDay); e != nil {
-			br.Msg = "开始日期格式有误"
-			return
-		}
-		if _, e := time.Parse(utils.FormatMonthDay, req.ExtraConf.YearDateConf.EndDay); e != nil {
-			br.Msg = "结束日期格式有误"
-			return
-		}
+	err, msg, isSendEmail := rangeServ.CheckChartRangeExtraConfig(req.ExtraConfig)
+	if err != nil {
+		br.Msg = msg
+		br.ErrMsg = err.Error()
+		br.IsSendEmail = isSendEmail
+		return
 	}
 
 	// 获取指标信息
 	//chartInfo.CorrelationLeadUnit = req.LeadUnit
 	edbInfoMappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
-	for _, v := range req.EdbInfoIds {
-		edbInfoMapping, e := data_manage.GetChartEdbMappingByEdbInfoId(v)
+	for _, v := range req.ChartEdbInfoList {
+		edbInfoMapping, e := data_manage.GetChartEdbMappingByEdbInfoId(v.EdbInfoId)
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取区间计算图表, A指标mapping信息失败, Err:" + e.Error()
 			return
 		}
+		if v.EdbAliasName != "" {
+			edbInfoMapping.EdbAliasName = v.EdbAliasName
+		}
+		edbInfoMapping.IsAxis = v.IsAxis
 		edbInfoMappingList = append(edbInfoMappingList, edbInfoMapping)
 	}
 
@@ -125,7 +86,7 @@ func (this *RangeChartChartInfoController) Preview() {
 	chartInfo.ChartType = 1
 
 	// 获取图表x轴y轴
-	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(0, "", "", edbInfoMappingList, &req.ExtraConf)
+	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(0, req.DateType, req.StartYear, req.StartDate, req.EndDate, edbInfoMappingList, &req.ExtraConfig)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取区间计算图表, 图表计算值失败, Err:" + e.Error()
@@ -345,6 +306,16 @@ func (this *RangeChartChartInfoController) Detail() {
 	if dateType <= 0 {
 		dateType = chartInfo.DateType
 	}
+	if startDate == "" {
+		startDate = chartInfo.StartDate
+	}
+	if endDate == "" {
+		endDate = chartInfo.EndDate
+	}
+
+	if startYear <= 0 {
+		startYear = chartInfo.StartYear
+	}
 	// 获取主题样式
 	chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
 	if err != nil {
@@ -369,25 +340,6 @@ func (this *RangeChartChartInfoController) Detail() {
 		br.ErrMsg = "图表没有指标,无法计算"
 		return
 	}
-	yearMax := 0
-
-	if dateType == utils.DateTypeNYears {
-		for _, v := range edbInfoMappingList {
-			if v.LatestDate != "" {
-				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
-				if tErr != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
-					return
-				}
-				if lastDateT.Year() > yearMax {
-					yearMax = lastDateT.Year()
-				}
-			}
-		}
-	}
-	// 开始/结束日期
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
 	// 区间计算图表配置校验
 	var extraConfig data_manage.ChartRangeAnalysisExtraConf
@@ -403,8 +355,7 @@ func (this *RangeChartChartInfoController) Detail() {
 	}
 
 	// 获取图表x轴y轴
-	// todo 日期处理,
-	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(chartInfoId, "", "", edbInfoMappingList, &extraConfig)
+	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, &extraConfig)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取区间计算图表, 图表计算值失败, Err:" + e.Error()
@@ -783,28 +734,11 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
-	yearMax := 0
 	dateType := chartInfo.DateType
-	if dateType == utils.DateTypeNYears {
-		for _, v := range edbInfoMappingList {
-			if v.LatestDate != "" {
-				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
-				if tErr != nil {
-					msg = "获取失败"
-					errMsg = "获取图表日期信息失败,Err:" + tErr.Error()
-					return
-				}
-				if lastDateT.Year() > yearMax {
-					yearMax = lastDateT.Year()
-				}
-			}
-		}
-	}
 	// 开始/结束日期
 	startYear := chartInfo.StartYear
 	startDate := chartInfo.StartDate
 	endDate := chartInfo.EndDate
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
 	// 区间计算图表配置校验
 	var extraConfig data_manage.ChartRangeAnalysisExtraConf
@@ -823,13 +757,11 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	if len(edbInfoMappingList) == 0 {
 		msg = "获取失败"
 		errMsg = "图表没有指标,无法计算"
-
 		return
 	}
 
 	// 获取图表x轴y轴
-	// todo 日期处理,
-	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(chartInfoId, "", "", edbInfoMappingList, &extraConfig)
+	edbList, xEdbIdValue, dataResp, e := rangeServ.GetChartDataByEdbInfoList(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, &extraConfig)
 	if e != nil {
 		msg = "获取失败"
 		errMsg = "获取区间计算图表, 图表计算值失败, Err:" + e.Error()
@@ -1300,3 +1232,239 @@ func (this *RangeChartChartInfoController) Refresh() {
 	br.Success = true
 	br.Msg = "刷新成功"
 }
+
+// MultipleGraphConfigSaveEdb
+// @Title 保存指标接口
+// @Description 保存指标接口
+// @Param	request	body request.SaveMultipleGraphEdbReq true "type json string"
+// @Success Ret=200 返回指标id
+// @router /edb/save [post]
+func (this *RangeChartChartInfoController) MultipleGraphConfigSaveEdb() {
+	/*br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.SaveChartRangeAnalysisEdbReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	cacheKey := "CACHE_CHART_EDB_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+	edbInfoIds := make([]int, 0)
+	for _, v := range req.EdbInfoList {
+		edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+	}
+	mappingList, err := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbInfoIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+	edbInfoMap := make(map[int]*data_manage.ChartEdbInfoMapping, 0)
+	for _, v := range mappingList {
+		edbInfoMap[v.EdbInfoId] = v
+	}
+
+	for _, v := range req.EdbInfoList {
+		if _, ok := edbInfoMap[v.EdbInfoId]; !ok {
+			br.Msg = "指标信息不存在"
+			br.ErrMsg = "指标信息不存在,EdbInfoId:" + strconv.Itoa(v.EdbInfoId)
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	// todo 校验配置合法性
+	multipleGraphConfigEdbMappingList, err := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, 10)
+	if err != nil {
+		br.Msg = `保存失败`
+		br.ErrMsg = "查询配置与图表的关联关系失败,ERR:" + err.Error()
+		return
+	}
+	var edbInfoId int
+	addEdbInfoIds := make([]int, 0)
+	updateEdbInfoIds := make([]int, 0)
+	deleteEdbInfoIds := make([]int, 0)
+	if len(multipleGraphConfigEdbMappingList) == 0 {
+		// 需要新增的指标
+	} else {
+		// 需要更新的指标
+		// 查询原先所有指标的来源指标,进一步筛选出需要新增,或者更新 或者删除的指标
+		oldEdbInfoIds := make([]int, 0)
+		for _, v := range multipleGraphConfigEdbMappingList {
+			oldEdbInfoIds = append(oldEdbInfoIds, v.EdbInfoId)
+		}
+
+		oldEdbCalculateMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoIds(oldEdbInfoIds)
+		if e != nil {
+			br.Msg = `保存失败`
+			br.ErrMsg = "获取计算指标信息失败,ERR:" + e.Error()
+			return
+		}
+
+		// 说明指标还在,没有被删除
+		oldFromEdbInfoIds := make([]int, 0)
+		for _, v := range oldEdbCalculateMappingList {
+			if !utils.InArrayByInt(edbInfoIds, v.FromEdbInfoId) {
+				deleteEdbInfoIds = append(deleteEdbInfoIds, v.EdbInfoId)
+			}
+			oldFromEdbInfoIds = append(oldFromEdbInfoIds, v.FromEdbInfoId)
+		}
+	}
+
+	// 关联指标
+	edbInfoIdArr := []data_manage.EdbInfoFromTag{
+		{
+			EdbInfoId: edbInfoMappingA.EdbInfoId,
+			FromTag:   "A",
+			MoveValue: 0,
+		}, {
+			EdbInfoId: edbInfoMappingB.EdbInfoId,
+			FromTag:   "B",
+			MoveValue: 0,
+		},
+	}
+
+	calculateFormula := request.EdbCalculateFormula{
+		BaseCalculateValue: correlationConf.CalculateValue,
+		BaseCalculateUnit:  correlationConf.CalculateUnit,
+		LeadValue:          rollingCorrelation.LeadValue,
+		LeadUnit:           rollingCorrelation.LeadUnit,
+		CalculateValue:     rollingCorrelation.CalculateValue,
+		CalculateUnit:      rollingCorrelation.CalculateUnit,
+	}
+	calculateFormulaByte, err := json.Marshal(calculateFormula)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	var respItem *data.AddPredictEdbDataResponse
+	if edbInfoId <= 0 || req.IsSaveAs {
+		req2 := &data_manage.EdbInfoCalculateBatchSaveReqByEdbLib{
+			AdminId:      sysUser.AdminId,
+			AdminName:    sysUser.RealName,
+			EdbName:      req.EdbName,
+			Frequency:    req.Frequency,
+			Unit:         req.Unit,
+			ClassifyId:   req.ClassifyId,
+			Formula:      string(calculateFormulaByte),
+			Source:       utils.DATA_SOURCE_CALCULATE_CORRELATION,
+			EdbInfoIdArr: edbInfoIdArr,
+			Calendar:     `公历`,
+		}
+
+		// 调用指标库去添加
+		reqJson, err := json.Marshal(req2)
+		if err != nil {
+			br.Msg = "参数解析异常!"
+			br.ErrMsg = "参数解析失败,Err:" + err.Error()
+			return
+		}
+		respItem, err = data.BatchSaveEdbCalculateData(string(reqJson), this.Lang)
+		if err != nil {
+			br.Msg = "新增失败"
+			br.ErrMsg = "新增失败,Err:" + err.Error()
+			return
+		}
+	} else {
+		req2 := &data_manage.EdbInfoCalculateBatchEditReqByEdbLib{
+			EdbInfoId:    edbInfoId,
+			EdbName:      req.EdbName,
+			Frequency:    req.Frequency,
+			Unit:         req.Unit,
+			ClassifyId:   req.ClassifyId,
+			Formula:      string(calculateFormulaByte),
+			Source:       utils.DATA_SOURCE_CALCULATE_CORRELATION,
+			EdbInfoIdArr: edbInfoIdArr,
+			Calendar:     `公历`,
+		}
+
+		// 调用指标库去更新
+		reqJson, err := json.Marshal(req2)
+		if err != nil {
+			br.Msg = "参数解析异常!"
+			br.ErrMsg = "参数解析失败,Err:" + err.Error()
+			return
+		}
+		respItem, err = data.BatchEditEdbCalculateData(string(reqJson), this.Lang)
+		if err != nil {
+			br.Msg = "编辑失败"
+			br.ErrMsg = "编辑失败,Err:" + err.Error()
+			return
+		}
+	}
+	if respItem == nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败"
+		return
+	}
+	if respItem.Ret != 200 {
+		br.Msg = respItem.Msg
+		br.ErrMsg = respItem.ErrMsg
+		return
+	}
+
+	resp := respItem.Data
+
+	//添加es
+	data.AddOrEditEdbInfoToEs(resp.EdbInfoId)
+
+	// 如果不是另存为的话,那么需要建立配置与指标的关系
+	if !req.IsSaveAs {
+		// 如果指标没有建立关联关系,那么就需要添加关系
+		if isAdd {
+			multipleGraphConfigEdbMapping = &data_manage.MultipleGraphConfigEdbMapping{
+				//Id:                    0,
+				MultipleGraphConfigId: req.MultipleGraphConfigId,
+				EdbInfoId:             resp.EdbInfoId,
+				Source:                req.Source,
+				ModifyTime:            time.Now(),
+				CreateTime:            time.Now(),
+			}
+			err = data_manage.AddMultipleGraphConfigEdbMapping(multipleGraphConfigEdbMapping)
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存配置与指标的关联关系失败,ERR:" + err.Error()
+				return
+			}
+		} else if multipleGraphConfigEdbMapping != nil {
+			multipleGraphConfigEdbMapping.EdbInfoId = resp.EdbInfoId
+			multipleGraphConfigEdbMapping.ModifyTime = time.Now()
+			err = multipleGraphConfigEdbMapping.Update([]string{"EdbInfoId", "ModifyTime"})
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存配置与指标的关联关系失败,ERR:" + err.Error()
+				return
+			}
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+	*/
+}

+ 27 - 14
models/data_manage/chart_info_range_analysis.go

@@ -21,7 +21,7 @@ type ChartRangeAnalysisExtraConf struct {
 	DataConvertType      int                               `description:"数据转换类型 0不转, 1乘 2除 3对数"`
 	DataConvertConf      ChartRangeAnalysisDataConvertConf `description:"数据转换详情"`
 	SeriesName           string                            `description:"指标系列名称"`
-	EdbInfoIds           []int
+	EdbInfoType          int                               `description:"指标类型:0普通指标,1预测指标"`
 }
 
 type ChartRangeAnalysisAutoDateChangeConf struct {
@@ -31,7 +31,7 @@ type ChartRangeAnalysisAutoDateChangeConf struct {
 }
 
 type ChartRangeAnalysisDeleteDataConf struct {
-	Formula string
+	Formula string `description:"比较符号:=、>、<、>=、<="`
 	Value   float64
 }
 
@@ -60,9 +60,12 @@ type ChartRangeAnalysisYearDateConf struct {
 
 // ChartRangeAnalysisPreviewReq 相关性图表请求体
 type ChartRangeAnalysisPreviewReq struct {
-	ExtraConf   ChartRangeAnalysisExtraConf
-	EdbInfoIds  []int `description:"指标Id"`
-	EdbInfoType int
+	ExtraConfig      ChartRangeAnalysisExtraConf
+	ChartEdbInfoList []*ChartSaveItem `description:"指标及配置信息"`
+	DateType         int              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今 20:最近N年"`
+	StartDate        string           `description:"自定义开始日期"`
+	EndDate          string           `description:"自定义结束日期"`
+	StartYear        int              `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type ChartRangeAnalysisManualDateConfList []ChartRangeAnalysisManualDateConf
@@ -75,7 +78,7 @@ func (a ChartRangeAnalysisManualDateConfList) Less(i, j int) bool {
 
 type ChartRangeAnalysisDataResp struct { //图表详情返回值
 	*ChartRangeAnalysisExtraConf
-	SeriesName string `description:"指标系列名称"`
+	SeriesId int `description:"指标系列ID"`
 }
 
 type ChartRangeAnalysisDateDataItem struct {
@@ -208,11 +211,12 @@ func EditRangeChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr, lang stri
 		}
 		if tmpChartEdbMapping != nil {
 			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
-			//tmpChartEdbMapping.ModifyTime = time.Now()
+			tmpChartEdbMapping.ModifyTime = time.Now()
 			//tmpChartEdbMapping.MaxData = v.MaxData
 			//tmpChartEdbMapping.MinData = v.MinData
 			//tmpChartEdbMapping.IsOrder = v.IsOrder
-			//tmpChartEdbMapping.IsAxis = v.IsAxis
+			tmpChartEdbMapping.EdbAliasName = v.EdbAliasName
+			tmpChartEdbMapping.IsAxis = v.IsAxis
 			//tmpChartEdbMapping.EdbInfoType = v.EdbInfoType
 			//tmpChartEdbMapping.LeadValue = v.LeadValue
 			//tmpChartEdbMapping.LeadUnit = v.LeadUnit
@@ -220,15 +224,17 @@ func EditRangeChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr, lang stri
 			//tmpChartEdbMapping.ChartColor = v.ChartColor
 			//tmpChartEdbMapping.PredictChartColor = v.PredictChartColor
 			//tmpChartEdbMapping.ChartWidth = v.ChartWidth
-			//_, err = to.Update(tmpChartEdbMapping, "ModifyTime", "MaxData", "MinData", "IsOrder", "IsAxis", "EdbInfoType", "LeadValue", "LeadUnit", "ChartStyle", "ChartColor", "PredictChartColor", "ChartWidth")
-			//if err != nil {
-			//	fmt.Println("chart_edb_mapping Err:" + err.Error())
-			//	return err
-			//}
+			_, err = to.Update(tmpChartEdbMapping, "ModifyTime", "IsAxis", "EdbAliasName")
+			if err != nil {
+				fmt.Println("chart_edb_mapping Err:" + err.Error())
+				return err
+			}
 		} else {
 			mapItem := new(ChartEdbMapping)
 			mapItem.ChartInfoId = req.ChartInfoId
 			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.EdbAliasName = v.EdbAliasName
+			mapItem.IsAxis = v.IsAxis
 			mapItem.CreateTime = time.Now()
 			mapItem.ModifyTime = time.Now()
 			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
@@ -236,7 +242,6 @@ func EditRangeChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr, lang stri
 			//mapItem.MaxData = v.MaxData
 			//mapItem.MinData = v.MinData
 			mapItem.IsOrder = true
-			mapItem.IsAxis = 1
 			mapItem.EdbInfoType = 1
 			//mapItem.LeadValue = v.LeadValue
 			//mapItem.LeadUnit = v.LeadUnit
@@ -266,3 +271,11 @@ func EditRangeChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr, lang stri
 
 	return
 }
+
+// SaveChartRangeAnalysisEdbReq 指标保存请求
+type SaveChartRangeAnalysisEdbReq struct {
+	EdbInfoList           []*EdbInfoBase `description:"指标列表"`
+	ExtraConfig           ChartRangeAnalysisExtraConf
+	MultipleGraphConfigId int  `description:"配置id"`
+	IsSaveAs              bool `description:"是否另存为,true的话,就是另存为,不会建立与配置的关系"`
+}

+ 9 - 1
models/data_manage/multiple_graph_config_edb_mapping.go

@@ -10,7 +10,7 @@ type MultipleGraphConfigEdbMapping struct {
 	Id                    int       `orm:"column(id);pk"`
 	MultipleGraphConfigId int       `description:"多图配置id"`
 	EdbInfoId             int       `description:"指标id"`
-	Source                int       `description:"来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;"`
+	Source                int       `description:"来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;10:区间计算指标"`
 	ModifyTime            time.Time `description:"最近一次修改时间"`
 	CreateTime            time.Time `description:"添加时间"`
 }
@@ -51,3 +51,11 @@ func GetMultipleGraphConfigEdbMappingListById(configId int) (items []*MultipleGr
 
 	return
 }
+
+func GetMultipleGraphConfigEdbMappingListByIdAndSource(configId, source int) (items []*MultipleGraphConfigEdbMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM multiple_graph_config_edb_mapping WHERE multiple_graph_config_id = ? AND source = ? `
+	_, err = o.Raw(sql, configId, source).QueryRows(&items)
+
+	return
+}

+ 269 - 33
services/data/range_analysis/chart_info.go

@@ -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
+}

+ 16 - 0
utils/common.go

@@ -2621,3 +2621,19 @@ func HandleSystemAppointDateT(currDate time.Time, appointDay, frequency string)
 
 	return
 }
+
+func CompareFloatByOpStrings(op string, a, b float64) bool {
+	switch op {
+	case "=":
+		return a == b
+	case ">":
+		return a > b
+	case ">=":
+		return a >= b
+	case "<=":
+		return a <= b
+	case "<":
+		return a < b
+	}
+	return false
+}