瀏覽代碼

Merge remote-tracking branch 'origin/master'

Roc 1 年之前
父節點
當前提交
bfc368ee64

+ 7 - 2
controllers/data_manage/edb_classify.go

@@ -873,7 +873,12 @@ func (this *EdbClassifyController) SimpleList() {
 	// 如果是 子级分类,查询该子级分类的下一级分类和指标信息
 	// 增加标识判断是文件夹还是指标列表
 	parentId, _ := this.GetInt("ParentId")
-
+	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+	// 如果选择了只看我的,那么只查询归属于我的账号
+	sysUserId := 0
+	if isOnlyMe {
+		sysUserId = this.SysUser.AdminId
+	}
 	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 0)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
@@ -897,7 +902,7 @@ func (this *EdbClassifyController) SimpleList() {
 		for _, v := range confList {
 			noPermissionEdbInfoIdMap[v.EdbInfoId] = true
 		}
-		allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(parentId, 0, 0)
+		allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(parentId, 0, sysUserId)
 		if err != nil {
 			br.Msg = "获取指标数据失败"
 			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()

+ 548 - 160
controllers/data_manage/edb_info_calculate.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"net/url"
 	"strconv"
 	"strings"
@@ -163,6 +164,7 @@ func (this *ChartInfoController) CalculateSave() {
 		EdbInfoIdArr:     req.EdbInfoIdArr,
 		EmptyType:        req.EmptyType,
 		MaxEmptyType:     req.MaxEmptyType,
+		Extra:            req.Extra,
 	}
 	reqJson, err := json.Marshal(req2)
 	if err != nil {
@@ -434,6 +436,7 @@ func (this *ChartInfoController) CalculateEdit() {
 		EdbInfoIdArr:     req.EdbInfoIdArr,
 		EmptyType:        req.EmptyType,
 		MaxEmptyType:     req.MaxEmptyType,
+		Extra:            req.Extra,
 	}
 	reqJson, err := json.Marshal(req2)
 	if err != nil {
@@ -626,6 +629,7 @@ func (this *ChartInfoController) CalculateBatchSave() {
 		//CalculateFormula: edbInfo.CalculateFormula,
 		EdbInfoIdArr: req.EdbInfoIdArr,
 		Calendar:     req.Calendar,
+		Extra:        req.Extra,
 	}
 
 	// 调用指标库去更新
@@ -832,6 +836,7 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 		MoveFrequency: req.MoveFrequency,
 		EdbInfoIdArr:  req.EdbInfoIdArr,
 		Calendar:      req.Calendar,
+		Extra:         req.Extra,
 	}
 
 	// 调用指标库去更新
@@ -1583,8 +1588,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()
@@ -1595,17 +1600,83 @@ 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)
+
+	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:         "指标名称不能为空",
@@ -1613,7 +1684,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		if req.Frequency == "" {
+		if v.Frequency == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "频率不能为空",
@@ -1621,7 +1692,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		if req.Unit == "" {
+		if v.Unit == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
 				Msg:         "单位不能为空",
@@ -1629,7 +1700,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:         "请选择分类",
@@ -1637,185 +1708,247 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 			continue
 		}
 
-		fromEdbInfoId := req.FromEdbInfoId
+		//加入缓存机制,避免创建同一个名称的指标 start
+		redisKey := fmt.Sprint("edb_info:calculate:batch:save:", req.Source, ":", v.EdbName)
+		isExist := utils.Rc.IsExist(redisKey)
+		if isExist {
+			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
+				CalculateId: v.CalculateId,
+				Msg:         "指标正在处理,请勿重复提交",
+			})
+			continue
+		} else {
+			//设置3分钟缓存
+			//utils.Rc.SetNX(redisKey, 1, time.Second*300)
+			//redisKeyList = append(redisKeyList, redisKey)
+		}
+		reqEdbList = append(reqEdbList, v)
+	}
 
-		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 len(reqEdbList) <= 0 {
+		br.Msg = "新增失败!"
+		if len(resp.Fail) > 0 {
+			br.ErrMsg = resp.Fail[0].Msg
+		} else {
+			br.Msg = "请选择指标"
+		}
+		return
+	}
+	req.AdminId = sysUser.AdminId
+	req.AdminName = sysUser.RealName
+	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 = respItem.Data
+	br.IsAddLog = true
+}
+
+// BatchCalculateBatchEdit
+// @Title 多指标求和和多指标求平均编辑接口
+// @Description 多指标求和和多指标求平均编辑接口
+// @Param	request	body data_manage.EdbInfoCalculateBatchSaveReq true "type json string"
+// @Success Ret=200 返回指标id
+// @router /edb_info/calculate/batch/edit/batch [post]
+func (this *ChartInfoController) BatchCalculateBatchEdit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
 		}
+		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.BatchEdbInfoCalculateBatchSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	resp := data_manage.BatchEdbInfoCalculateBatchSaveResp{
+		Fail:    make([]data_manage.BatchEdbInfoCalculateBatchSaveFailResp, 0),
+		Success: make([]data_manage.BatchEdbInfoCalculateBatchSaveSuccessResp, 0),
+	}
 
+	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
+		}
+	}
+
+	if len(req.EdbList) > 50 {
+		br.Msg = "最多只能选择50个指标"
+		return
+	}
+	reqEdbList := make([]*data_manage.CalculateEdbInfoItem, 0)
+	for _, v := range req.EdbList {
+		if v.EdbInfoId <= 0 {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
-				Msg:         "请选择指标",
+				Msg:         "请选择要编辑的指标",
 			})
 			continue
 		}
-
-		//加入缓存机制,避免创建同一个名称的指标 start
-		redisKey := fmt.Sprint("edb_info:calculate:batch:save:", sysUser.AdminId, ":", req.Source, ":", v.CalculateId)
-		isExist := utils.Rc.IsExist(redisKey)
-		if isExist {
+		v.EdbName = strings.Trim(v.EdbName, " ")
+		if v.EdbName == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
-				Msg:         "指标正在处理,请勿重复提交",
+				Msg:         "指标名称不能为空",
 			})
 			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 {
+		}
+
+		if v.Frequency == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
-				Msg:         "参数解析异常!",
-				ErrMsg:      "参数解析失败,Err:" + err.Error(),
+				Msg:         "频率不能为空",
 			})
 			continue
 		}
-		respItem, err := data.BatchSaveEdbCalculateData(string(reqJson))
-		if err != nil {
+
+		if v.Unit == "" {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
-				Msg:         "新增失败!",
-				ErrMsg:      "新增失败,Err:" + err.Error(),
+				Msg:         "单位不能为空",
 			})
 			continue
 		}
-		if respItem.Ret != 200 {
+
+		if v.ClassifyId <= 0 {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
-				Msg:         respItem.Msg,
-				ErrMsg:      respItem.ErrMsg,
+				Msg:         "请选择分类",
 			})
 			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)
+	}
+	if len(reqEdbList) <= 0 {
+		br.Msg = "编辑失败!"
+		if len(resp.Fail) > 0 {
+			br.ErrMsg = resp.Fail[0].Msg
+		} else {
+			br.Msg = "请选择指标"
+		}
+		return
+	}
+	req.EdbList = reqEdbList
+	// 调用指标库去更新
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	respItem, err := data.BatchEditEdbCalculateMultiData(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.Msg = "批量编辑成功"
+	br.Data = respItem.Data
 	br.IsAddLog = true
 }
 
@@ -1953,3 +2086,258 @@ func (this *ChartInfoController) CalculateComputeCorrelation() {
 	br.Msg = "计算成功"
 	br.IsAddLog = true
 }
+
+// CalculateMultiChoice
+// @Title 批量计算-加入已选指标
+// @Description 批量计算-加入已选指标
+// @Param   ClassifyIds   query   int  true       "指标库分类IDs"
+// @Param   SysUserIds   query   int  true       "创建人"
+// @Param   Keyword   query   string  false       "关键词搜索"
+// @Param   Frequency   query   string  false       "频度"
+// @Success 200 {object} data_manage.EdbInfoSearchResp
+// @router /edb_info/calculate/multi/choice [get]
+func (this *ChartInfoController) CalculateMultiChoice() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	//来源类型,1:中文,2:英文
+	frequency := this.GetString("Frequency")
+	keyword := this.GetString("Keyword")
+	sysUserIds := this.GetString("SysUserIds")
+	classifyIds := this.GetString("ClassifyIds")
+	edbInfoIds := this.GetString("EdbInfoIds")
+	selectAll, _ := this.GetBool("SelectAll")
+	notFrequency := this.GetString("NotFrequency")
+	var edbIdArr []int
+
+	if selectAll {
+		// 如果勾了列表全选,那么EdbCode传的就是排除的code
+
+		var condition string
+		var pars []interface{}
+
+		if classifyIds != "" {
+			classifyIdsArr := strings.Split(classifyIds, ",")
+			condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyIdsArr)) + `) `
+			pars = append(pars, classifyIdsArr)
+		}
+
+		if frequency != "" {
+			frequencyArr := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+			pars = append(pars, frequencyArr)
+		}
+		if notFrequency != "" {
+			notFrequencyArr := strings.Split(notFrequency, ",")
+			condition += ` AND frequency NOT IN (` + utils.GetOrmInReplace(len(notFrequencyArr)) + `) `
+			pars = append(pars, notFrequencyArr)
+		}
+
+		if sysUserIds != "" {
+			sysUserIdSlice := strings.Split(sysUserIds, ",")
+			condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+			pars = append(pars, sysUserIdSlice)
+		}
+
+		if keyword != "" {
+			keyWordArr := strings.Split(keyword, " ")
+
+			if len(keyWordArr) > 0 {
+				for _, v := range keyWordArr {
+					condition += ` AND CONCAT(edb_name,edb_code) LIKE ?`
+					pars = append(pars, utils.GetLikeKeyword(v))
+				}
+			}
+		}
+		edbList, e := data_manage.GetEdbInfoFilter(condition, pars)
+		if e != nil {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + e.Error()
+			return
+		}
+
+		for _, v := range edbList {
+			edbIdArr = append(edbIdArr, v.EdbInfoId)
+		}
+	} else {
+		//未勾选全选EdbCode就是需要的code
+		edbIdStrArr := strings.Split(edbInfoIds, ",")
+		for _, v := range edbIdStrArr {
+			id, e := strconv.Atoi(v)
+			if e != nil {
+				br.Msg = "获取指标列表失败"
+				br.ErrMsg = "获取指标列表失败,Err:" + e.Error()
+				return
+			}
+			edbIdArr = append(edbIdArr, id)
+		}
+	}
+
+	if len(edbIdArr) > 100 {
+		br.Msg = "最多只能选择100个指标"
+		return
+	}
+
+	if len(edbIdArr) <= 0 {
+		br.Msg = "无符合指标或指标代码错误"
+		return
+	}
+
+	list, err := data_manage.GetEdbInfoByIdList(edbIdArr)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取指标列表失败"
+		br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+		return
+	}
+
+	searchItemList := make([]data_manage.EdbInfoBase, 0)
+
+	resp := new(data_manage.CalculateMultiChoiceResp)
+
+	for _, info := range list {
+		searchItem := data_manage.EdbInfoBase{
+			Frequency:  info.Frequency,
+			Unit:       info.Unit,
+			EdbName:    info.EdbName,
+			EdbInfoId:  info.EdbInfoId,
+			ClassifyId: info.ClassifyId,
+		}
+		searchItemList = append(searchItemList, searchItem)
+	}
+
+	resp.SearchItem = searchItemList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// CalculateMultiSearch
+// @Title 批量计算-查询指标
+// @Description 批量计算-查询指标
+// @Param   ClassifyIds   query   int  true       "指标库分类IDs"
+// @Param   SysUserIds   query   int  true       "创建人"
+// @Param   Keyword   query   string  false       "关键词搜索"
+// @Param   Frequency   query   string  false       "频度"
+// @Success 200 {object} data_manage.EdbInfoSearchResp
+// @router /edb_info/calculate/multi/search [get]
+func (this *ChartInfoController) CalculateMultiSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	//来源类型,1:中文,2:英文
+	frequency := this.GetString("Frequency")
+	keyword := this.GetString("Keyword")
+	sysUserIds := this.GetString("SysUserIds")
+	classifyIds := this.GetString("ClassifyIds")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	notFrequency := this.GetString("NotFrequency")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize50
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var edbIdArr []int
+
+	condition := ` AND edb_info_type = 0 `
+	var pars []interface{}
+
+	if classifyIds != "" {
+		classifyIdsArr := strings.Split(classifyIds, ",")
+		condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyIdsArr)) + `) `
+		pars = append(pars, classifyIdsArr)
+	}
+
+	if frequency != "" {
+		frequencyArr := strings.Split(frequency, ",")
+		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+		pars = append(pars, frequencyArr)
+	}
+	if notFrequency != "" {
+		notFrequencyArr := strings.Split(notFrequency, ",")
+		condition += ` AND frequency NOT IN (` + utils.GetOrmInReplace(len(notFrequencyArr)) + `) `
+		pars = append(pars, notFrequencyArr)
+	}
+	if sysUserIds != "" {
+		sysUserIdSlice := strings.Split(sysUserIds, ",")
+		condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+		pars = append(pars, sysUserIdSlice)
+	}
+
+	if keyword != "" {
+		keyWordArr := strings.Split(keyword, " ")
+
+		if len(keyWordArr) > 0 {
+			for _, v := range keyWordArr {
+				condition += ` AND CONCAT(edb_name,edb_code) LIKE ?`
+				pars = append(pars, utils.GetLikeKeyword(v))
+			}
+		}
+	}
+
+	total, e := data_manage.GetEdbInfoByConditionCount(condition, pars)
+	if e != nil {
+		br.Msg = "获取指标列表总数失败"
+		br.ErrMsg = "获取指标列表总数失败,Err:" + e.Error()
+		return
+	}
+
+	searchItemList := make([]data_manage.CalculateMultiEdbSearchItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(data_manage.CalculateMultiEdbSearchResp)
+
+	edbList, e := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取指标列表失败"
+		br.ErrMsg = "获取指标列表失败,Err:" + e.Error()
+		return
+	}
+
+	for _, v := range edbList {
+		edbIdArr = append(edbIdArr, v.EdbInfoId)
+	}
+
+	if len(edbIdArr) > 0 {
+		list, err := data_manage.GetEdbInfoByIdList(edbIdArr)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+			return
+		}
+		for _, info := range list {
+			searchItem := data_manage.CalculateMultiEdbSearchItem{
+				Frequency:       info.Frequency,
+				Unit:            info.Unit,
+				EdbName:         info.EdbName,
+				EdbInfoId:       info.EdbInfoId,
+				ClassifyId:      info.ClassifyId,
+				SysUserRealName: info.SysUserRealName,
+				SysUserId:       info.SysUserId,
+				EndDate:         info.EndDate,
+				EndValue:        info.EndValue,
+			}
+			searchItemList = append(searchItemList, searchItem)
+		}
+	}
+
+	resp.SearchItem = searchItemList
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 0
models/data_manage/edb_info.go

@@ -57,6 +57,7 @@ type EdbInfo struct {
 	SubSourceName    string  `description:"子数据来源名称"`
 	IndicatorCode    string  `description:"指标代码"`
 	StockCode        string  `description:"证券代码"`
+	Extra            string  `description:"指标额外配置"`
 }
 
 type EdbInfoFullClassify struct {

+ 86 - 3
models/data_manage/edb_info_calculate.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/yidane/formula"
 	"strconv"
 	"strings"
@@ -20,6 +21,7 @@ type EdbInfoCalculateSaveReq struct {
 	Calendar         string           `description:"公历/农历"`
 	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
 	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	Extra            string           `description:"指标的额外配置"`
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 }
 
@@ -77,6 +79,9 @@ type EdbInfoCalculateDetail struct {
 	LatestValue        float64   `description:"最近实际数据的值"`
 	EndValue           float64   `description:"结束日期的值(可能是插入值)"`
 	EdbType            int       `description:"指标类型:1:基础指标,2:计算指标"`
+	Frequency          string    `description:"频率"`
+	Unit               string    `description:"单位"`
+	ClassifyId         int       `description:"分类id"`
 }
 
 func GetEdbInfoCalculateDetail(edbInfoId, source int) (list []*EdbInfoCalculateDetail, err error) {
@@ -89,7 +94,7 @@ func GetEdbInfoCalculateDetail(edbInfoId, source int) (list []*EdbInfoCalculateD
 	//
 	//sql = fmt.Sprintf(sql, calculateTableName)
 
-	sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.latest_date,b.latest_value,b.edb_type FROM edb_info_calculate_mapping AS a
+	sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.latest_date,b.latest_value,b.edb_type, b.frequency, b.unit, b.classify_id FROM edb_info_calculate_mapping AS a
 			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
 			WHERE a.edb_info_id=? ORDER BY sort ASC `
 
@@ -111,6 +116,7 @@ type EdbInfoCalculateEditReq struct {
 	CalculateFormula string           `description:"计算公式"`
 	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
 	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	Extra            string           `description:"指标的额外配置"`
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 }
 
@@ -155,6 +161,37 @@ func DeleteCalculateData(edbInfoId int) (err error) {
 	return
 }
 
+type EdbInfoBase struct {
+	EdbInfoId  int    `description:"指标id"`
+	EdbName    string `description:"指标名称"`
+	Frequency  string `description:"频度"`
+	Unit       string `description:"单位"`
+	ClassifyId int    `description:"分类id"`
+}
+
+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:"指标名称"`
@@ -168,6 +205,7 @@ type EdbInfoCalculateBatchSaveReq struct {
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 	MoveType         int              `description:"移动方式:1:领先(默认),2:滞后"`
 	MoveFrequency    string           `description:"移动频度:天/周/月/季/年"`
+	Extra            string           `description:"指标的额外配置"`
 	Calendar         string           `description:"公历/农历"`
 }
 
@@ -183,6 +221,7 @@ type EdbInfoCalculateBatchEditReq struct {
 	MoveType      int    `description:"移动方式:1:领先(默认),2:滞后"`
 	MoveFrequency string `description:"移动频度:天/周/月/季/年"`
 	Calendar      string `description:"公历/农历"`
+	Extra         string `description:"指标的额外配置"`
 	EdbInfoIdArr  []EdbInfoFromTag
 }
 
@@ -206,6 +245,7 @@ type EdbInfoCalculateBatchSaveReqByEdbLib struct {
 	Data             interface{}      `description:"数据列"`
 	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
 	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	Extra            string           `description:"指标的额外配置"`
 }
 
 // EdbInfoCalculateBatchEditReqByEdbLib 编辑计算指标的请求参数
@@ -223,6 +263,7 @@ type EdbInfoCalculateBatchEditReqByEdbLib struct {
 	Calendar      string `description:"公历/农历"`
 	EdbInfoIdArr  []EdbInfoFromTag
 	Data          interface{} `description:"数据列"`
+	Extra         string      `description:"指标的额外配置"`
 }
 
 func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfo, err error) {
@@ -501,8 +542,20 @@ type SaveAdjustEdbDataReq struct {
 
 // BatchEdbInfoCalculateBatchSaveReq 批量添加 计算指标
 type BatchEdbInfoCalculateBatchSaveReq struct {
-	CalculateId   string `description:"当前请求时,单个计算的唯一标识"`
-	CalculateInfo EdbInfoCalculateBatchSaveReq
+	AdminId          int                     `description:"添加人id"`
+	AdminName        string                  `description:"添加人名称"`
+	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:"数据"`
+	EmptyType        int                     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int                     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	Extra            string                  `description:"指标的额外配置"`
 }
 
 // BatchEdbInfoCalculateBatchSaveResp 批量添加 计算指标 返回数据
@@ -525,3 +578,33 @@ type BatchEdbInfoCalculateBatchSaveSuccessResp struct {
 	EdbInfoId   int    `description:"指标ID"`
 	UniqueCode  string `description:"指标唯一编码"`
 }
+
+// CalculateMultiSearchReq 批量计算模块下的指标搜索
+type CalculateMultiChoiceReq struct {
+	ClassifyIds string `description:"分类ID, 用英文逗号拼接"`
+	Frequency   string `description:"频度"`
+	SysUserIds  string `description:"创建人ID,用英文逗号拼接"`
+	Keyword     string `description:"关键字"`
+	SelectAll   bool   `description:"是否全选"`
+	EdbInfoIds  string `description:"指标Id, 用英文逗号拼接"`
+}
+
+type CalculateMultiChoiceResp struct {
+	SearchItem []EdbInfoBase `description:"查询结果"`
+}
+
+type CalculateMultiEdbSearchResp struct {
+	SearchItem []CalculateMultiEdbSearchItem `description:"查询结果"`
+	Paging     *paging.PagingItem
+}
+type CalculateMultiEdbSearchItem struct {
+	EdbInfoId       int    `description:"指标id"`
+	EdbName         string `description:"指标名称"`
+	Frequency       string `description:"频度"`
+	Unit            string `description:"单位"`
+	ClassifyId      int    `description:"分类id"`
+	SysUserId       int
+	SysUserRealName string
+	EndValue        float64 `description:"数据的最新值(预测日期的最新值)"`
+	EndDate         string  `description:"终止日期"`
+}

+ 27 - 0
routers/commentsRouter.go

@@ -2104,6 +2104,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "BatchCalculateBatchEdit",
+            Router: `/edb_info/calculate/batch/edit/batch`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "CalculateBatchReset",
@@ -2167,6 +2176,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "CalculateMultiChoice",
+            Router: `/edb_info/calculate/multi/choice`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "CalculateMultiSearch",
+            Router: `/edb_info/calculate/multi/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "CalculateSave",

+ 32 - 0
services/data/base_edb_lib.go

@@ -126,6 +126,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")
@@ -328,6 +340,26 @@ 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
+}
+
+// BatchEditEdbCalculateMultiData 批量编辑 累计值转月-同比值-同差等计算新增
+func BatchEditEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr string) (resp *EdbCalculateSaveMultiResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/edit/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")

+ 40 - 6
services/data/excel/mixed_table.go

@@ -1062,9 +1062,10 @@ func handlerDateCalculate(dateCalculateList []string, calculateCellMap map[strin
 
 			val, tmpErr, tmpErrMsg := DateCalculatePrepare(calculateCellMap, cell.Value)
 			if tmpErr != nil {
-				errMsg = tmpErrMsg
-				err = tmpErr
-				return
+				cell.ShowValue = ""
+				config[cellPosition.Column][cellPosition.Row] = cell
+				utils.FileLog.Error(fmt.Sprintf("%s 日期计算报错:Err:%s:%s", cellKey, tmpErr, tmpErrMsg))
+				continue
 			}
 
 			cell.ShowValue = utils.FormatMixTableDataShowValue(val)
@@ -1214,21 +1215,54 @@ func handleMixCellShowStyle(showStyleList []string, calculateCellMap map[string]
 // changePointDecimalPlaces 小数点位数加减和百分比格式
 func changePointDecimalPlaces(str string, changeNum int, numberType string, isPercent bool) (newStr string) {
 	newStr = str
+	var decimalPlaces int
+	dotIndex := strings.Index(newStr, ".") // 查找小数点的位置
+	if dotIndex == -1 {
+		decimalPlaces = 0
+	} else {
+		decimalPlaces = len(newStr) - dotIndex - 1
+	}
 	// 把字符串转成浮点数
 	val, _ := strconv.ParseFloat(str, 64)
 	if isPercent {
 		if numberType == "number" { //百分数转成小数
 			val = val / 100
+			if decimalPlaces > 2 {
+				decimalPlaces += 2
+			} else if decimalPlaces == 1 {
+				decimalPlaces += 1
+			} else if decimalPlaces == 0 {
+				if len(str) == 1 {
+					decimalPlaces = 2
+				} else if len(str) == 2 {
+					if str[1] == '0' {
+						decimalPlaces = 1
+					} else {
+						decimalPlaces = 2
+					}
+				}
+			}
 			isPercent = false
 		}
 	} else {
 		if numberType == "percent" {
+			if decimalPlaces > 2 {
+				decimalPlaces -= 2
+			} else if decimalPlaces == 1 {
+				decimalPlaces = 0
+			}
 			val = val * 100
 		}
 	}
-	newStr = fmt.Sprintf("%v", val)
-	var decimalPlaces int                  // 计算小数位数
-	dotIndex := strings.Index(newStr, ".") // 查找小数点的位置
+	if decimalPlaces > 0 {
+		val, _ = decimal.NewFromFloat(val).Round(int32(decimalPlaces)).Float64()
+		newStr = strconv.FormatFloat(val, 'f', decimalPlaces, 64)
+	} else {
+		newStr = fmt.Sprintf("%v", val)
+	}
+	// 计算小数位数
+	decimalPlaces = 0
+	dotIndex = strings.Index(newStr, ".") // 查找小数点的位置
 	if dotIndex == -1 {
 		decimalPlaces = 0
 	} else {