浏览代码

指标计算 批量计算改版

xyxie 1 年之前
父节点
当前提交
2e97ade996
共有 3 个文件被更改,包括 164 次插入178 次删除
  1. 109 176
      controllers/data_manage/edb_info_calculate.go
  2. 33 2
      models/data_manage/edb_info_calculate.go
  3. 22 0
      services/data/base_edb_lib.go

+ 109 - 176
controllers/data_manage/edb_info_calculate.go

@@ -1587,8 +1587,8 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 		return
 	}
 
-	var reqList []data_manage.BatchEdbInfoCalculateBatchSaveReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqList)
+	var req data_manage.BatchEdbInfoCalculateBatchSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
@@ -1599,17 +1599,89 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 		Fail:    make([]data_manage.BatchEdbInfoCalculateBatchSaveFailResp, 0),
 		Success: make([]data_manage.BatchEdbInfoCalculateBatchSaveSuccessResp, 0),
 	}
-	redisKeyList := make([]string, 0) //需要清理的缓存key列表
-	defer func() {
-		for _, redisKey := range redisKeyList {
-			utils.Rc.Delete(redisKey)
+	/*	redisKeyList := make([]string, 0) //需要清理的缓存key列表
+		defer func() {
+			for _, redisKey := range redisKeyList {
+				utils.Rc.Delete(redisKey)
+			}
+		}()*/
+
+	var formulaInt int
+	switch req.Source {
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_CALCULATE_CJJX:
+		if req.Formula == "" {
+			br.Msg = "请输入N值"
+			return
 		}
-	}()
+		formulaInt, _ = strconv.Atoi(req.Formula)
+		if formulaInt <= 0 {
+			br.Msg = "N值输入错误,请重新输入"
+			return
+		}
+	case utils.DATA_SOURCE_CALCULATE_ZJPJ:
+		//直接拼接指标
+		//校验时间格式
+		_, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
+		if err != nil {
+			br.Msg = "拼接日期有误,请重新输入"
+			return
+		}
+	case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
+		//指标校验
+		if len(req.EdbInfoIdArr) != 2 {
+			br.Msg = "选择的指标异常,请重新选择"
+			return
+		}
+		fromEdbInfoId := req.EdbInfoIdArr[0].EdbInfoId
+		if fromEdbInfoId <= 0 {
+			br.Msg = "请选择指标"
+			return
+		}
+		//校验时间格式
+		//数据格式:2022-11-01,2022-11-10
+		timeList := strings.Split(req.Formula, ",")
+		if len(timeList) != 2 {
+			br.Msg = "选择的指标异常,请重新选择"
+			return
+		}
+		startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
+		if err != nil {
+			br.Msg = "开始日期有误,请重新输入"
+			return
+		}
+		endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
+		if err != nil {
+			br.Msg = "结束日期有误,请重新输入"
+			return
+		}
+		if utils.GetTimeSubDay(startDate, endDate) < 2 {
+			br.Msg = "日期间隔不得少于两天"
+			return
+		}
+	case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
+		if req.Formula == "" {
+			br.Msg = "请填写alpha值"
+			return
+		}
+		alpha, e := strconv.ParseFloat(req.Formula, 64)
+		if e != nil {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
+		if alpha <= 0 || alpha >= 1 {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
+	}
 
-	for _, v := range reqList {
-		req := v.CalculateInfo
-		req.EdbName = strings.Trim(req.EdbName, " ")
-		if req.EdbName == "" {
+	if len(req.EdbList) > 100 {
+		br.Msg = "最多只能选择100个指标"
+		return
+	}
+	reqEdbList := make([]*data_manage.CalculateEdbInfoItem, 0)
+	for _, v := range req.EdbList {
+		v.EdbName = strings.Trim(v.EdbName, " ")
+		if v.EdbName == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "指标名称不能为空",
@@ -1617,7 +1689,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		if req.Frequency == "" {
+		if v.Frequency == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "频率不能为空",
@@ -1625,7 +1697,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		if req.Unit == "" {
+		if v.Unit == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "单位不能为空",
@@ -1633,7 +1705,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		if req.ClassifyId <= 0 {
+		if v.ClassifyId <= 0 {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "请选择分类",
@@ -1641,105 +1713,6 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		fromEdbInfoId := req.FromEdbInfoId
-
-		var formulaInt int
-		switch req.Source {
-		case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_CALCULATE_CJJX:
-			if req.Formula == "" {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "请选择分类",
-				})
-				continue
-			}
-			formulaInt, _ = strconv.Atoi(req.Formula)
-			if formulaInt <= 0 {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "N值输入错误,请重新输入",
-				})
-				continue
-			}
-		case utils.DATA_SOURCE_CALCULATE_ZJPJ:
-			//直接拼接指标
-			//校验时间格式
-			_, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
-			if err != nil {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "拼接日期有误,请重新输入",
-				})
-				continue
-			}
-		case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
-			//指标校验
-			if len(req.EdbInfoIdArr) != 2 {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "选择的指标异常,请重新选择",
-				})
-				continue
-			}
-			fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
-
-			//校验时间格式
-			//数据格式:2022-11-01,2022-11-10
-			timeList := strings.Split(req.Formula, ",")
-			if len(timeList) != 2 {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "选择时间有误,请重新输入",
-				})
-				continue
-			}
-			startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
-			if err != nil {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "开始日期有误,请重新输入",
-				})
-				continue
-			}
-			endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
-			if err != nil {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "结束日期有误,请重新输入",
-				})
-				continue
-			}
-			if utils.GetTimeSubDay(startDate, endDate) < 2 {
-				resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-					CalculateId: v.CalculateId,
-					Msg:         "日期间隔不得少于两天",
-				})
-				continue
-			}
-		case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
-			if req.Formula == "" {
-				br.Msg = "请填写alpha值"
-				return
-			}
-			alpha, e := strconv.ParseFloat(req.Formula, 64)
-			if e != nil {
-				br.Msg = "alpha值输入错误, 请重新输入"
-				return
-			}
-			if alpha <= 0 || alpha >= 1 {
-				br.Msg = "alpha值输入错误, 请重新输入"
-				return
-			}
-		}
-
-		if fromEdbInfoId <= 0 {
-			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-				CalculateId: v.CalculateId,
-				Msg:         "请选择指标",
-			})
-			continue
-		}
-
 		//加入缓存机制,避免创建同一个名称的指标 start
 		redisKey := fmt.Sprint("edb_info:calculate:batch:save:", sysUser.AdminId, ":", req.Source, ":", v.CalculateId)
 		isExist := utils.Rc.IsExist(redisKey)
@@ -1751,75 +1724,35 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		} else {
 			//设置3分钟缓存
-			utils.Rc.SetNX(redisKey, 1, time.Second*300)
-			redisKeyList = append(redisKeyList, redisKey)
-		}
-		//加入缓存机制,避免创建同一个名称的指标 end
-
-		req2 := &data_manage.EdbInfoCalculateBatchSaveReqByEdbLib{
-			AdminId:          sysUser.AdminId,
-			AdminName:        sysUser.RealName,
-			EdbInfoId:        req.EdbInfoId,
-			EdbName:          req.EdbName,
-			Frequency:        req.Frequency,
-			Unit:             req.Unit,
-			ClassifyId:       req.ClassifyId,
-			Formula:          req.Formula, //N数值移动平均计算、环比值、环差值
-			FromEdbInfoId:    req.FromEdbInfoId,
-			CalculateFormula: req.CalculateFormula,
-			Source:           req.Source,
-			MoveType:         req.MoveType,
-			MoveFrequency:    req.MoveFrequency,
-
-			//CalculateFormula: edbInfo.CalculateFormula,
-			EdbInfoIdArr: req.EdbInfoIdArr,
-			Calendar:     req.Calendar,
-		}
-
-		// 调用指标库去更新
-		reqJson, err := json.Marshal(req2)
-		if err != nil {
-			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-				CalculateId: v.CalculateId,
-				Msg:         "参数解析异常!",
-				ErrMsg:      "参数解析失败,Err:" + err.Error(),
-			})
-			continue
-		}
-		respItem, err := data.BatchSaveEdbCalculateData(string(reqJson))
-		if err != nil {
-			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-				CalculateId: v.CalculateId,
-				Msg:         "新增失败!",
-				ErrMsg:      "新增失败,Err:" + err.Error(),
-			})
-			continue
+			//utils.Rc.SetNX(redisKey, 1, time.Second*300)
+			//redisKeyList = append(redisKeyList, redisKey)
 		}
-		if respItem.Ret != 200 {
-			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
-				CalculateId: v.CalculateId,
-				Msg:         respItem.Msg,
-				ErrMsg:      respItem.ErrMsg,
-			})
-			continue
-		}
-
-		result := respItem.Data
-
-		//添加es
-		data.AddOrEditEdbInfoToEs(result.EdbInfoId)
-		resp.Success = append(resp.Success, data_manage.BatchEdbInfoCalculateBatchSaveSuccessResp{
-			ClassifyId:  req.ClassifyId,
-			CalculateId: v.CalculateId,
-			EdbInfoId:   result.EdbInfoId,
-			UniqueCode:  result.UniqueCode,
-		})
+		reqEdbList = append(reqEdbList, v)
+	}
+	req.EdbList = reqEdbList
+	// 调用指标库去更新
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	respItem, err := data.BatchSaveEdbCalculateMultiData(string(reqJson))
+	if err != nil {
+		br.Msg = "新增失败!"
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	if respItem.Ret != 200 {
+		br.Msg = respItem.Msg
+		br.ErrMsg = respItem.ErrMsg
+		return
 	}
 
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "批量保存成功"
-	br.Data = resp
+	br.Data = respItem.Data
 	br.IsAddLog = true
 }
 

+ 33 - 2
models/data_manage/edb_info_calculate.go

@@ -157,6 +157,29 @@ func DeleteCalculateData(edbInfoId int) (err error) {
 	return
 }
 
+type CalculateEdbInfoItem struct {
+	EdbInfoId     int    `description:"指标id"`
+	EdbName       string `description:"指标名称"`
+	Frequency     string `description:"频度"`
+	Unit          string `description:"单位"`
+	ClassifyId    int    `description:"分类id"`
+	CalculateId   string `description:"当前请求时,单个计算的唯一标识"`
+	FromEdbInfoId int    `description:"计算来源指标id"`
+}
+
+type EdbInfoCalculateBatchSaveMultiReq struct {
+	List             []CalculateEdbInfoItem
+	Formula          string           `description:"N值/移动天数"`
+	FromEdbInfoId    int              `description:"计算来源指标id"`
+	Source           int              `description:"来源:1:同花顺,2:wind,3:彭博,4:指标运算,5:累计值转月,6:同比值,7:同差值,8:N数值移动平均计算,12:环比值,13:环差值,14:变频"`
+	CalculateFormula string           `description:"计算公式"`
+	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
+	MoveType         int              `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency    string           `description:"移动频度:天/周/月/季/年"`
+	Extra            string           `description:"指标的额外配置"`
+	Calendar         string           `description:"公历/农历"`
+}
+
 type EdbInfoCalculateBatchSaveReq struct {
 	EdbInfoId        int              `description:"指标id"`
 	EdbName          string           `description:"指标名称"`
@@ -507,8 +530,16 @@ type SaveAdjustEdbDataReq struct {
 
 // BatchEdbInfoCalculateBatchSaveReq 批量添加 计算指标
 type BatchEdbInfoCalculateBatchSaveReq struct {
-	CalculateId   string `description:"当前请求时,单个计算的唯一标识"`
-	CalculateInfo EdbInfoCalculateBatchSaveReq
+	EdbList          []*CalculateEdbInfoItem //需要批量计算的指标列表
+	Formula          string                  `description:"N值/移动天数"`
+	Source           int                     `description:"来源:1:同花顺,2:wind,3:彭博,4:指标运算,5:累计值转月,6:同比值,7:同差值,8:N数值移动平均计算,12:环比值,13:环差值,14:升频"`
+	CalculateFormula string                  `description:"计算公式"`
+	EdbInfoIdArr     []EdbInfoFromTag        `description:"关联指标列表"`
+	MoveType         int                     `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency    string                  `description:"移动频度:天/周/月/季/年"`
+	Calendar         string                  `description:"公历/农历"`
+	Data             interface{}             `description:"数据"`
+	Extra            string                  `description:"指标的额外配置"`
 }
 
 // BatchEdbInfoCalculateBatchSaveResp 批量添加 计算指标 返回数据

+ 22 - 0
services/data/base_edb_lib.go

@@ -122,6 +122,18 @@ type AddPredictEdbDataResponse struct {
 	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
 }
 
+// EdbCalculateSaveMultiResponse 批量计算返回值
+type EdbCalculateSaveMultiResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        data_manage.BatchEdbInfoCalculateBatchSaveResp
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
 // SaveBasePredictEdbData 新增/编辑预测指标运算
 func SaveBasePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
 	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict/save")
@@ -320,6 +332,16 @@ func BatchEditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *Ad
 	return
 }
 
+// BatchSaveEdbCalculateMultiData 批量新增 累计值转月-同比值-同差等计算新增
+func BatchSaveEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr string) (resp *EdbCalculateSaveMultiResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/save/multi")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
 //// EditEdbCalculateData 修改计算指标数据请求
 //func EditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *models.BaseResponse, err error) {
 //	resp, _, err = postAddEdbData(edbInfoCalculateBatchSaveReqStr, "batch/save")