Browse Source

Merge branch 'pool/v1' into debug

# Conflicts:
#	routers/commentsRouter.go
Roc 1 year ago
parent
commit
60f203bb38

+ 66 - 4
controllers/data_manage/chart_classify.go

@@ -323,7 +323,7 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 	nodeAll := make([]*data_manage.ChartClassifyItems, 0)
 	for k := range rootList {
 		rootNode := rootList[k]
-		data.ChartClassifyItemsMakeTree(classifyAll, rootNode)
+		data.ChartClassifyItemsMakeTree(this.SysUser, classifyAll, rootNode)
 		nodeAll = append(nodeAll, rootNode)
 	}
 
@@ -341,9 +341,17 @@ func (this *ChartClassifyController) ChartClassifyItems() {
 		}
 	}
 
-	resp := new(data_manage.ChartClassifyListResp)
-	resp.AllNodes = nodeAll
-	resp.Language = language
+	// 是否允许添加分类
+	canOpClassify := true
+	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
+	if !utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, this.SysUser.RoleTypeCode) {
+		canOpClassify = false
+	}
+	resp := data_manage.ChartClassifyListResp{
+		AllNodes:      nodeAll,
+		Language:      language,
+		CanOpClassify: canOpClassify,
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -455,6 +463,16 @@ func (this *ChartClassifyController) EditChartClassify() {
 		return
 	}
 
+	// 权限校验
+	{
+		button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+		if !button.OpButton {
+			br.Msg = "无操作权限"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	if item.ChartClassifyName != req.ChartClassifyName {
 		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, utils.CHART_SOURCE_DEFAULT)
 		if err != nil {
@@ -509,6 +527,23 @@ func (this *ChartClassifyController) DeleteChartClassifyCheck() {
 	var tipsMsg string
 	//删除分类
 	if req.ChartClassifyId > 0 && req.ChartInfoId == 0 {
+		// 查找分类
+		item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.Msg = "获取分类信息失败,Err:" + err.Error()
+			return
+		}
+		// 权限校验
+		{
+			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+			if !button.OpButton {
+				br.Msg = "无操作权限"
+				br.IsSendEmail = false
+				return
+			}
+		}
+
 		//判断图表分类下,是否含有图表
 		count, err := data_manage.GetChartInfoCountByClassifyId(req.ChartClassifyId)
 		if err != nil {
@@ -584,6 +619,23 @@ func (this *ChartClassifyController) DeleteChartClassify() {
 
 	//删除分类
 	if req.ChartClassifyId > 0 && req.ChartInfoId == 0 {
+		// 查找分类
+		item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.Msg = "获取分类信息失败,Err:" + err.Error()
+			return
+		}
+		// 权限校验
+		{
+			button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId)
+			if !button.OpButton {
+				br.Msg = "无操作权限"
+				br.IsSendEmail = false
+				return
+			}
+		}
+
 		//判断是否含有指标
 		count, err := data_manage.GetChartInfoCountByClassifyId(req.ChartClassifyId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -773,6 +825,16 @@ func (this *ChartClassifyController) ChartClassifyMove() {
 		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
 		return
 	}
+	// 权限校验
+	{
+		button := data.GetChartClassifyOpButton(this.SysUser, chartClassifyInfo.SysUserId)
+		if !button.OpButton {
+			br.Msg = "无操作权限"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	if chartClassifyInfo.Source != utils.CHART_SOURCE_DEFAULT {
 		br.Msg = "分类异常"
 		br.ErrMsg = "分类异常,不是ETA图库的分类"

+ 15 - 0
controllers/data_manage/chart_info.go

@@ -867,6 +867,11 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+	// 单位
+	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
+		chartInfo.Unit = yDataList[0].Unit
+		chartInfo.UnitEn = yDataList[0].UnitEn
+	}
 	warnEdbList := make([]string, 0)
 	for _, v := range edbList {
 		if v.IsNullData {
@@ -1789,6 +1794,11 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+	// 单位
+	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
+		chartInfo.Unit = yDataList[0].Unit
+		chartInfo.UnitEn = yDataList[0].UnitEn
+	}
 	warnEdbList := make([]string, 0)
 	for _, v := range edbList {
 		if v.IsNullData {
@@ -2484,6 +2494,11 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+	// 单位
+	if len(yDataList) > 0 {
+		chartInfo.Unit = yDataList[0].Unit
+		chartInfo.UnitEn = yDataList[0].UnitEn
+	}
 	warnEdbList := make([]string, 0)
 	for _, v := range edbList {
 		if v.IsNullData {

+ 14 - 14
controllers/data_manage/edb_classify.go

@@ -293,7 +293,7 @@ func (this *EdbClassifyController) EditEdbClassify() {
 		return
 	}
 
-	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName)
+	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -360,7 +360,7 @@ func (this *EdbClassifyController) DeleteEdbClassifyCheck() {
 		br.IsSendEmail = false
 		return
 	}
-	deleteStatus, tipsMsg, err, errMsg := data.DeleteCheck(req.ClassifyId, req.EdbInfoId)
+	deleteStatus, tipsMsg, err, errMsg := data.DeleteCheck(req.ClassifyId, req.EdbInfoId, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -471,7 +471,7 @@ func (this *EdbClassifyController) DeleteEdbClassify() {
 		return
 	}
 
-	nextItem, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser.AdminId, sysUser.RealName, string(this.Ctx.Input.RequestBody), this.Ctx.Input.URI())
+	nextItem, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser, string(this.Ctx.Input.RequestBody), this.Ctx.Input.URI())
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -532,7 +532,7 @@ func (this *EdbClassifyController) EdbClassifyMove() {
 		return
 	}
 
-	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId)
+	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId, sysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -714,17 +714,17 @@ func (this *EdbClassifyController) ItemsV2() {
 
 	// 是否允许添加分类
 	canOpClassify := true
-
-	// 如果不是 超管 或者 ficc管理员,那么就没有权限
-	if this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
+	if !utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, this.SysUser.RoleTypeCode) {
 		canOpClassify = false
 	}
 
-	resp := new(data_manage.EdbClassifyListResp)
-	resp.AllNodes = nodeAll
-	resp.Language = language
-	resp.CanOpClassify = canOpClassify
-	
+	resp := data_manage.EdbClassifyListResp{
+		AllNodes:      nodeAll,
+		CanOpClassify: canOpClassify,
+		Language:      language,
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -807,7 +807,7 @@ func (this *EdbClassifyController) ItemsV3() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo( 0)
+	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(0)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -935,4 +935,4 @@ func (this *EdbClassifyController) ItemsV3() {
 //	br.Ret = 200
 //	br.Success = true
 //	br.Msg = "移动成功"
-//}
+//}

+ 9 - 3
controllers/data_manage/edb_info.go

@@ -2198,15 +2198,18 @@ func (this *EdbInfoController) EdbInfoRefresh() {
 		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
-	err = data.EdbInfoRefreshAllFromBaseV2(edbInfoId, false)
+	err, isAsync := data.EdbInfoRefreshAllFromBaseV2(edbInfoId, false)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新指标失败,EdbInfoRefresh Err:" + err.Error()
 		return
 	}
 	br.Ret = 200
-	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "该指标关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
+	br.Success = true
 	br.IsAddLog = true
 }
 
@@ -2866,7 +2869,7 @@ func (this *EdbInfoController) EdbInfoAllRefresh() {
 		br.ErrMsg = "数据已被删除,请刷新页面,edbInfoId:" + strconv.Itoa(edbInfoId)
 		return
 	}
-	err = data.EdbInfoRefreshAllFromBaseV2(edbInfoId, true)
+	err, isAsync := data.EdbInfoRefreshAllFromBaseV2(edbInfoId, true)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新指标失败,EdbInfoRefreshAllFromBase Err:" + err.Error()
@@ -2875,6 +2878,9 @@ func (this *EdbInfoController) EdbInfoAllRefresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "该指标关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // @Title 获取指标数据

+ 112 - 1
controllers/data_manage/edb_info_calculate.go

@@ -903,7 +903,7 @@ func (this *ChartInfoController) CalculateBatchReset() {
 	//}
 
 	// 重新计算
-	err = data.EdbInfoRefreshAllFromBaseV2(edbInfoId, true)
+	err, isAsync := data.EdbInfoRefreshAllFromBaseV2(edbInfoId, true)
 	if err != nil {
 		fmt.Println(edbInfoId, "RefreshEdbCalculateData err", time.Now())
 		br.Msg = "重新计算失败"
@@ -917,6 +917,9 @@ func (this *ChartInfoController) CalculateBatchReset() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "重新计算成功"
+	if isAsync {
+		br.Msg = "该指标关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 	br.Data = resp
 	br.IsAddLog = true
 }
@@ -1729,3 +1732,111 @@ func (this *ChartInfoController) CalculateMapping() {
 	br.Msg = "保存成功"
 	br.Data = item
 }
+
+// CalculateComputeCorrelation
+// @Title 拟合残差计算相关性
+// @Description 拟合残差计算相关性接口
+// @Param	request	body data_manage.EdbInfoCalculateBatchSaveReq true "type json string"
+// @Success Ret=200 返回指标id
+// @router /edb_info/calculate/compute_correlation [post]
+func (this *ChartInfoController) CalculateComputeCorrelation() {
+	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.EdbInfoCalculateBatchSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.EdbInfoIdArr) != 2 {
+		br.Msg = "选择的指标异常,请重新选择"
+		return
+	}
+	fromEdbInfoId := req.EdbInfoIdArr[0].EdbInfoId
+
+	//校验时间格式
+	//数据格式: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
+	}
+
+	if fromEdbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+
+	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 {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	respItem, err := data.CalculateComputeCorrelation(string(reqJson))
+	if err != nil {
+		br.Msg = "新增失败"
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+
+	if respItem.Ret == 200 {
+		br.Data = respItem.Data
+	} else {
+		br.Data = ``
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "计算成功"
+	br.IsAddLog = true
+}

+ 1 - 1
controllers/data_manage/excel_info.go

@@ -1720,7 +1720,7 @@ func (this *ExcelInfoController) Refresh() {
 		}
 
 		if len(tableData.EdbInfoIdList) > 0 {
-			err = data.EdbInfoRefreshAllFromBaseV3(tableData.EdbInfoIdList, false)
+			err, _ = data.EdbInfoRefreshAllFromBaseV3(tableData.EdbInfoIdList, false, true)
 			if err != nil {
 				br.Msg = "刷新失败"
 				br.ErrMsg = "刷新失败,Err:" + err.Error()

+ 63 - 11
controllers/data_manage/line_feature/chart_info.go

@@ -167,12 +167,11 @@ func (this *LineFeaturesChartInfoController) MultipleGraphPreview() {
 	chartInfo.ChartName = edbInfoMapping.EdbName
 
 	// 曲线图表信息
+	curveConf := req.Curve
+	startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
 	{
 		tmpChartInfo := *chartInfo
 
-		curveConf := req.Curve
-		startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
-
 		// 获取图表中的指标数据
 		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, []*data_manage.ChartEdbInfoMapping{edbInfoMapping}, tmpChartInfo.ExtraConfig)
 		if err != nil {
@@ -225,7 +224,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphPreview() {
 			tmpChartInfo.ChartName = fmt.Sprintf("%s%d期滚动标准差", edbInfoMapping.EdbName, req.StandardDeviation.CalculateValue)
 
 			// 获取图表中的指标数据
-			edbList, dataResp, err, errMsg := lineFeatureServ.GetStandardDeviationData(0, edbInfoMapping, req.StandardDeviation.CalculateValue)
+			edbList, dataResp, err, errMsg := lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbInfoMapping, req.StandardDeviation.CalculateValue)
 			if err != nil {
 				br.Msg = "获取失败"
 				if errMsg != `` {
@@ -279,7 +278,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphPreview() {
 			tmpChartInfo.ChartName = fmt.Sprintf("%s%d%s百分位", edbInfoMapping.EdbName, req.Percentile.CalculateValue, req.Percentile.CalculateUnit)
 
 			// 获取图表中的指标数据
-			edbList, dataResp, err, errMsg := lineFeatureServ.GetPercentileData(0, edbInfoMapping, req.Percentile.CalculateValue, req.Percentile.CalculateUnit)
+			edbList, dataResp, err, errMsg := lineFeatureServ.GetPercentileData(0, startDate, endDate, edbInfoMapping, req.Percentile.CalculateValue, req.Percentile.CalculateUnit)
 			if err != nil && errMsg != `` {
 				br.Msg = errMsg
 				br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
@@ -572,6 +571,9 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 	var chartInfo *data_manage.ChartInfo
 	var errMsg string
 	isSendEmail := true
+
+	curveConf := req.Curve
+	startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
 	switch req.Source {
 	case utils.CHART_MULTIPLE_GRAPH_CURVE: // 曲线图
 		curveConf := req.Curve
@@ -653,7 +655,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 			}
 			extraConfig = fmt.Sprint(standardDeviationConf.CalculateValue)
 
-			_, dataResp, err, errMsg := lineFeatureServ.GetStandardDeviationData(0, edbInfoMapping, req.StandardDeviation.CalculateValue)
+			_, dataResp, err, errMsg := lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbInfoMapping, req.StandardDeviation.CalculateValue)
 			if err != nil {
 				br.Msg = "保存失败"
 				if errMsg != `` {
@@ -682,7 +684,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 			extraConfig = string(extraConfigByte)
 
 			// 获取图表中的指标数据
-			_, dataResp, err, errMsg := lineFeatureServ.GetPercentileData(0, edbInfoMapping, req.Percentile.CalculateValue, req.Percentile.CalculateUnit)
+			_, dataResp, err, errMsg := lineFeatureServ.GetPercentileData(0, startDate, endDate, edbInfoMapping, req.Percentile.CalculateValue, req.Percentile.CalculateUnit)
 			if err != nil && errMsg != `` {
 				br.Msg = errMsg
 				br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
@@ -727,6 +729,9 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 		}
 		if chartInfoId <= 0 {
 			addChartReq := data_manage.AddChartInfoReq{
+				DateType:        curveConf.DateType,
+				StartDate:       curveConf.StartDate,
+				EndDate:         curveConf.StartDate,
 				ChartClassifyId: req.ClassifyId,
 				ChartName:       req.ChartName,
 				ChartType:       utils.CHART_TYPE_CURVE,
@@ -744,6 +749,9 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				ChartName:       req.ChartName,
 				ChartClassifyId: req.ClassifyId,
 				ChartType:       utils.CHART_TYPE_CURVE,
+				DateType:        curveConf.DateType,
+				StartDate:       curveConf.StartDate,
+				EndDate:         curveConf.StartDate,
 				Calendar:        "公历",
 				LeftMin:         fmt.Sprint(leftMinVal),
 				LeftMax:         fmt.Sprint(leftMaxVal),
@@ -1802,7 +1810,8 @@ func (this *LineFeaturesChartInfoController) Detail() {
 			br.ErrMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		edbList, resultResp, err, errMsg = lineFeatureServ.GetStandardDeviationData(0, edbMapping, calculateValue)
+		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		edbList, resultResp, err, errMsg = lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbMapping, calculateValue)
 	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
 		var percentileConfig request.Percentile
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &percentileConfig)
@@ -1811,7 +1820,8 @@ func (this *LineFeaturesChartInfoController) Detail() {
 			br.ErrMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		edbList, resultResp, err, errMsg = lineFeatureServ.GetPercentileData(0, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
+		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		edbList, resultResp, err, errMsg = lineFeatureServ.GetPercentileData(0, startDate, endDate, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
 	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
 		var frequencyDistributionConfig request.FrequencyDistribution
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &frequencyDistributionConfig)
@@ -2274,7 +2284,8 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 			errMsg = "格式化配置项失败,Err:" + tmpErr.Error()
 			return
 		}
-		edbList, resultResp, err, msg = lineFeatureServ.GetStandardDeviationData(0, edbMapping, calculateValue)
+		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		edbList, resultResp, err, msg = lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbMapping, calculateValue)
 	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
 		var percentileConfig request.Percentile
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &percentileConfig)
@@ -2283,7 +2294,8 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 			errMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		edbList, resultResp, err, msg = lineFeatureServ.GetPercentileData(0, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
+		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		edbList, resultResp, err, msg = lineFeatureServ.GetPercentileData(0, startDate, endDate, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
 	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
 		var frequencyDistributionConfig request.FrequencyDistribution
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &frequencyDistributionConfig)
@@ -2597,3 +2609,43 @@ func (this *LineFeaturesChartInfoController) SearchByEs() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// fix 统计分析/统计特征的标准差、百分位图表时间范围与曲线图一致
+//func init() {
+//	condition := ` AND source in (7,8) `
+//	list, err := data_manage.GetChartInfoListByCondition(condition, []interface{}{}, 0, 1000)
+//	if err != nil {
+//		fmt.Println("err:", err)
+//		return
+//	}
+//
+//	for _, v := range list {
+//		item, tmpErr := data_manage.GetMultipleGraphConfigChartMappingByChartId(v.ChartInfoId)
+//		if tmpErr != nil {
+//			fmt.Println("tmpErr:", tmpErr)
+//			continue
+//		}
+//
+//		multipleGraphConfig, e := data_manage.GetMultipleGraphConfigById(item.MultipleGraphConfigId)
+//		if e != nil {
+//			fmt.Println("获取批量配置信息失败:", e)
+//			continue
+//		}
+//
+//		var configSave request.ConfigSave
+//		err = json.Unmarshal([]byte(multipleGraphConfig.Curve), &configSave)
+//		if err != nil {
+//			fmt.Println("格式化配置项失败,Err:" + err.Error())
+//			return
+//		}
+//
+//		v.StartDate = configSave.Curve.StartDate
+//		v.EndDate = configSave.Curve.EndDate
+//		v.DateType = configSave.Curve.DateType
+//		err = v.Update([]string{"StartDate", "EndDate", "DateType"})
+//
+//		if err != nil {
+//			fmt.Println(v.ChartInfoId, "修复历史数据失败:", err)
+//		}
+//	}
+//}

+ 10 - 9
controllers/data_manage/predict_edb_classify.go

@@ -95,8 +95,8 @@ func (this *PredictEdbClassifyController) List() {
 	// 是否允许添加分类
 	canOpClassify := true
 
-	// 如果不是 超管 或者 ficc管理员,那么就没有权限
-	if this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
+	if !utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, this.SysUser.RoleTypeCode) {
 		canOpClassify = false
 	}
 
@@ -180,7 +180,8 @@ func (this *PredictEdbClassifyController) Add() {
 		return
 	}
 
-	if this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
 		br.Msg = "不允许添加分类"
 		br.IsSendEmail = false
 		return
@@ -235,7 +236,7 @@ func (this *PredictEdbClassifyController) Edit() {
 		return
 	}
 
-	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName)
+	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -277,7 +278,7 @@ func (this *PredictEdbClassifyController) DeleteCheck() {
 		return
 	}
 
-	deleteStatus, tipsMsg, err, errMsg := data.DeleteCheck(req.ClassifyId, req.EdbInfoId)
+	deleteStatus, tipsMsg, err, errMsg := data.DeleteCheck(req.ClassifyId, req.EdbInfoId, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -331,7 +332,7 @@ func (this *PredictEdbClassifyController) Delete() {
 		return
 	}
 
-	nextItem, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser.AdminId, sysUser.RealName, string(this.Ctx.Input.RequestBody), this.Ctx.Input.URI())
+	nextItem, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser, string(this.Ctx.Input.RequestBody), this.Ctx.Input.URI())
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -392,7 +393,7 @@ func (this *PredictEdbClassifyController) Move() {
 		return
 	}
 
-	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId)
+	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId, sysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -555,7 +556,7 @@ func (this *PredictEdbClassifyController) ListV2() {
 			edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
 		}
 	}
-	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo( 1)
+	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -651,4 +652,4 @@ func (this *PredictEdbClassifyController) ListV2() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
-}
+}

+ 11 - 6
controllers/data_manage/predict_edb_info.go

@@ -327,7 +327,7 @@ func (this *PredictEdbInfoController) List() {
 					DataList:         make([]*data_manage.EdbDataList, 0),
 				})
 			}
-			tmpPredictDataList, _, _, err, _ := data.GetChartPredictEdbInfoDataListByConfList(predictEdbConfDataList, sourceEdbInfoItem.LatestDate, sourceEdbInfoItem.LatestDate, edbInfoItem.EndDate, sourceEdbInfoItem.Frequency, allDataList)
+			tmpPredictDataList, _, _, err, _ := data.GetChartPredictEdbInfoDataListByConfList(predictEdbConfDataList, sourceEdbInfoItem.LatestDate, sourceEdbInfoItem.LatestDate, edbInfoItem.EndDate, sourceEdbInfoItem.Frequency, edbInfoItem.DataDateType, allDataList)
 			if err != nil {
 				br.Msg = "获取预测指标数据失败"
 				br.ErrMsg = "获取预测指标数据失败" + err.Error()
@@ -761,7 +761,7 @@ func (this *PredictEdbInfoController) Refresh() {
 		br.ErrMsg = "参数错误"
 		return
 	}
-	_, err, errMsg := data.RefreshPredictEdbInfo(edbInfoId, false)
+	_, isAsync, err, errMsg := data.RefreshPredictEdbInfo(edbInfoId, false)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -775,7 +775,9 @@ func (this *PredictEdbInfoController) Refresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
-	br.IsAddLog = true
+	if isAsync {
+		br.Msg = "该指标关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // Move
@@ -1124,7 +1126,7 @@ func (this *PredictEdbInfoController) RefreshAll() {
 		br.ErrMsg = "参数错误"
 		return
 	}
-	_, err, errMsg := data.RefreshPredictEdbInfo(edbInfoId, true)
+	_, isAsync, err, errMsg := data.RefreshPredictEdbInfo(edbInfoId, true)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -1138,6 +1140,9 @@ func (this *PredictEdbInfoController) RefreshAll() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "该指标关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // DataList
@@ -1544,7 +1549,7 @@ func (this *PredictEdbInfoController) ChartDataList() {
 		// 获取预测数据
 		var predictMinValue, predictMaxValue float64
 
-		predictDataList, predictMinValue, predictMaxValue, err, errMsg := data.GetChartPredictEdbInfoDataListByConfList(predictEdbConfAndDataList, startDate, sourceEdbInfoItem.LatestDate, endDateStr, sourceEdbInfoItem.Frequency, allDataList)
+		predictDataList, predictMinValue, predictMaxValue, err, errMsg := data.GetChartPredictEdbInfoDataListByConfList(predictEdbConfAndDataList, startDate, sourceEdbInfoItem.LatestDate, endDateStr, sourceEdbInfoItem.Frequency, req.DataDateType, allDataList)
 		if err != nil {
 			br.Msg = "获取预测指标数据失败"
 			if errMsg != `` {
@@ -1850,4 +1855,4 @@ func (this *PredictEdbInfoController) ClassifyEdbInfoItems() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
-}
+}

+ 60 - 0
controllers/data_manage/predict_edb_info_calculate.go

@@ -366,3 +366,63 @@ func (this *PredictEdbInfoController) BatchCalculateBatchSave() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// CalculateComputeCorrelation
+// @Title 拟合残差计算相关性(预测指标)
+// @Description 拟合残差计算相关性(预测指标)接口
+// @Param	request	body data_manage.PredictEdbInfoCalculateBatchSaveReq true "type json string"
+// @Success Ret=200 返回指标id
+// @router /predict_edb_info/calculate/compute_correlation [post]
+func (this *PredictEdbInfoController) CalculateComputeCorrelation() {
+	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.PredictEdbInfoCalculateBatchSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	//传入操作人
+	req.AdminId = sysUser.AdminId
+	req.AdminName = sysUser.RealName
+
+	// 添加计算指标
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	respItem, err := data.PredictCalculateComputeCorrelation(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
+	}
+
+	resp := respItem.Data
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "计算成功"
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 14 - 5
models/data_manage/chart_classify.go

@@ -146,11 +146,21 @@ type ChartClassifyItems struct {
 	SeasonStartDate     string `description:"季节性图开始日期"`
 	SeasonEndDate       string `description:"季节性图开始日期"`
 	Children            []*ChartClassifyItems
+	Button              ChartClassifyItemsButton `description:"按钮权限"`
+}
+
+// ChartClassifyItemsButton 操作按钮
+type ChartClassifyItemsButton struct {
+	AddButton    bool `description:"是否可添加"`
+	OpButton     bool `description:"是否可编辑"`
+	DeleteButton bool `description:"是否可删除"`
+	MoveButton   bool `description:"是否可移动"`
 }
 
 type ChartClassifyListResp struct {
-	AllNodes []*ChartClassifyItems
-	Language string `description:"指标的展示语言,CN:中文,EN:英文"`
+	AllNodes      []*ChartClassifyItems
+	Language      string `description:"指标的展示语言,CN:中文,EN:英文"`
+	CanOpClassify bool   `description:"是否允许操作分类"`
 }
 
 type ChartClassifyDeleteCheckResp struct {
@@ -264,7 +274,6 @@ func GetChartClassifyTwo(source int) (items []*ChartClassifyItems, err error) {
 	return
 }
 
-
 func GetChartClassifyByLevel(level, source int) (items []*ChartClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM chart_classify WHERE level=? AND source = ? order by sort asc,chart_classify_id asc`
@@ -272,9 +281,9 @@ func GetChartClassifyByLevel(level, source int) (items []*ChartClassifyItems, er
 	return
 }
 
-func EditChartClassifySysUser(classifyId,sysUserId int, chartClassifyName string) (err error) {
+func EditChartClassifySysUser(classifyId, sysUserId int, chartClassifyName string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `UPDATE chart_classify SET sys_user_id=?,sys_user_real_name=?,modify_time=NOW() WHERE parent_id=?  AND level=3 `
 	_, err = o.Raw(sql, sysUserId, chartClassifyName, classifyId).Exec()
 	return
-}
+}

+ 6 - 1
models/data_manage/chart_info.go

@@ -506,6 +506,8 @@ type YData struct {
 	EnNameList     []string        `description:"每个值对应的英文名称"`
 	EdbValMap      map[int]float64 `description:"指标与值的对应" json:"-"`
 	M              []int           `description:"对应开始日期的间隔值" json:"-"`
+	Unit           string          `description:"中文单位名称"`
+	UnitEn         string          `description:"英文单位名称"`
 }
 
 func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chartType int) (err error) {
@@ -1232,6 +1234,7 @@ type ChartInfoView struct {
 	ChartInfoId       int    `orm:"column(chart_info_id);pk"`
 	ChartName         string `description:"来源名称"`
 	ChartNameEn       string `description:"英文图表名称"`
+	Unit              string `description:"中文单位名称"`
 	UnitEn            string `description:"英文单位名称"`
 	ChartClassifyId   int    `description:"图表分类id"`
 	ChartClassifyName string `description:"图表名称"`
@@ -1405,6 +1408,8 @@ type BarChartInfoReq struct {
 	Sort          BarChartInfoSortReq      `description:"排序"`
 	XEdbList      []BarChartInfoEdbItemReq `description:"X轴选择的指标列表"`
 	YEdbList      []BarChartInfoEdbItemReq `description:"Y轴选择的指标列表"`
+	Unit          string                   `description:"中文单位"`
+	UnitEn        string                   `description:"英文单位"`
 }
 
 // BarChartInfoEdbItemReq 柱方图预览请求数据(指标相关)
@@ -1748,4 +1753,4 @@ func GetChartInfoByAdminIdAndClassify(sourceList []int, adminId, classifyId int)
             FROM chart_info where source in (` + utils.GetOrmInReplace(num) + `)  AND sys_user_id = ? AND chart_classify_id = ? ORDER BY sort asc,create_time ASC `
 	_, err = o.Raw(sql, sourceList, adminId, classifyId).QueryRows(&items)
 	return
-}
+}

+ 2 - 0
models/data_manage/edb_info.go

@@ -44,6 +44,7 @@ type EdbInfo struct {
 	ServerUrl        string  `description:"服务器地址"`
 	ChartImage       string  `description:"图表图片"`
 	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
+	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
 }
 
 func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
@@ -276,6 +277,7 @@ type EdbInfoList struct {
 	Button           EdbClassifyItemsButton  `description:"操作权限"`
 	IsEnEdb          bool                    `description:"是否展示英文标识"`
 	DataInsertConfig EdbDataInsertConfigItem `description:"指标数据插入配置"`
+	DataDateType     string                  `description:"数据日期类型,枚举值:交易日、自然日"`
 }
 
 type EdbDataInsertConfigItem struct {

+ 7 - 5
models/data_manage/request/predict_edb_info.go

@@ -16,6 +16,7 @@ type PredictEdbInfoChartDataReq struct {
 	SeasonStartDate string       `description:"季节性图开始日期"`
 	SeasonEndDate   string       `description:"季节性图结束日期"`
 	RuleList        []RuleConfig `description:"配置规则列表"`
+	DataDateType    string       `description:"数据日期类型,枚举值:交易日、自然日"`
 }
 
 // AddPredictEdbInfoReq 添加预测指标请求
@@ -28,11 +29,12 @@ type AddPredictEdbInfoReq struct {
 	FixedValue      float64      `description:"固定值"`
 	RuleList        []RuleConfig `description:"配置规则列表"`
 
-	MaxValue  float64 `description:"最大值"`
-	MinValue  float64 `description:"最小值"`
-	EdbInfoId int     `description:"指标ID"`
-	AdminId   int     `description:"添加人id"`
-	AdminName string  `description:"添加人名称"`
+	DataDateType string  `description:"日期类型,枚举值:交易日、自然日"`
+	MaxValue     float64 `description:"最大值"`
+	MinValue     float64 `description:"最小值"`
+	EdbInfoId    int     `description:"指标ID"`
+	AdminId      int     `description:"添加人id"`
+	AdminName    string  `description:"添加人名称"`
 }
 
 // RuleConfig 预测规则配置

+ 18 - 0
routers/commentsRouter.go

@@ -1393,6 +1393,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "CalculateComputeCorrelation",
+            Router: `/edb_info/calculate/compute_correlation`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "CalculateDetail",
@@ -3202,6 +3211,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:PredictEdbInfoController"],
+        beego.ControllerComments{
+            Method: "CalculateComputeCorrelation",
+            Router: `/predict_edb_info/calculate/compute_correlation`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["hongze/hz_eta_api/controllers/data_manage:PredictEdbInfoController"],
         beego.ControllerComments{
             Method: "CalculateSave",

+ 32 - 0
services/data/base_edb_lib.go

@@ -287,6 +287,38 @@ func SaveAdjustEdbInfo(param string) (resp *models.BaseResponse, err error) {
 	return
 }
 
+// CalculateComputeCorrelationResp 拟合残差计算相关性的值返回
+type CalculateComputeCorrelationResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        float64
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+// CalculateComputeCorrelation 拟合残差计算相关性的值
+func CalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string) (resp *CalculateComputeCorrelationResp, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/compute_correlation")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// PredictCalculateComputeCorrelation 拟合残差计算相关性的值(预测指标)
+func PredictCalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string) (resp *CalculateComputeCorrelationResp, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/compute_correlation")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
 // postRefreshEdbData 刷新指标数据
 func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
 	postUrl := utils.EDB_LIB_URL + urlStr

+ 41 - 8
services/data/chart_classify.go

@@ -3,6 +3,7 @@ package data
 import (
 	"fmt"
 	"hongze/hz_eta_api/models/data_manage"
+	"hongze/hz_eta_api/models/system"
 	"hongze/hz_eta_api/utils"
 	"strconv"
 	"time"
@@ -20,14 +21,23 @@ func chartClassifyHaveChild(allNode []*data_manage.ChartClassifyItems, node *dat
 	return
 }
 
-func ChartClassifyItemsMakeTree(allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems) {
+func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems) {
+	button := GetChartClassifyOpButton(sysUser, node.SysUserId)
+	node.Button = button
+
 	childs, _ := chartClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
 	if len(childs) > 0 {
+		for _, child := range childs {
+			childButton := GetChartClassifyOpButton(sysUser, child.SysUserId)
+			childButton.AddButton = false //不管有没有权限,图表都是没有添加按钮的
+			child.Button = childButton
+			node.Children = append(node.Children, child)
+		}
 		node.Children = append(node.Children, childs[0:]...) //添加子节点
 		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
 			_, has := chartClassifyHaveChild(allNode, v)
 			if has {
-				ChartClassifyItemsMakeTree(allNode, v) //递归添加节点
+				ChartClassifyItemsMakeTree(sysUser, allNode, v) //递归添加节点
 			} else {
 				childrenArr := make([]*data_manage.ChartClassifyItems, 0)
 				v.Children = childrenArr
@@ -39,9 +49,9 @@ func ChartClassifyItemsMakeTree(allNode []*data_manage.ChartClassifyItems, node
 	}
 }
 
-func FixChartClassify()  {
+func FixChartClassify() {
 	//新增三级分类
-	list, err := data_manage.GetChartClassifyByLevel(2,1)
+	list, err := data_manage.GetChartClassifyByLevel(2, 1)
 	if err != nil {
 		return
 	}
@@ -70,16 +80,16 @@ func FixChartClassify()  {
 			return
 		}
 
-		err = data_manage.FIXChartClassifyId(int(id),v.ChartClassifyId)
+		err = data_manage.FIXChartClassifyId(int(id), v.ChartClassifyId)
 		if err != nil {
 			return
 		}
 	}
 }
 
-func FixChartClassifySysUserId()  {
+func FixChartClassifySysUserId() {
 	//获取所有父级分类信息
-	list, err := data_manage.GetChartClassifyByLevel(2,1)
+	list, err := data_manage.GetChartClassifyByLevel(2, 1)
 	if err != nil {
 		return
 	}
@@ -89,7 +99,30 @@ func FixChartClassifySysUserId()  {
 		if err != nil {
 			return
 		}
-		fmt.Println("ChartClassifyId:",v.ChartClassifyId)
+		fmt.Println("ChartClassifyId:", v.ChartClassifyId)
 	}
 	fmt.Println("FixChartClassifySysUserId end")
 }
+
+// GetChartClassifyOpButton 获取ETA图库分类的操作权限
+func GetChartClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.ChartClassifyItemsButton) {
+	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
+		button.AddButton = true
+		button.OpButton = true
+		button.DeleteButton = true
+		button.MoveButton = true
+	}
+
+	return
+}
+
+// GetCanOpChartClassify 获取是否允许添加图表分类
+func GetCanOpChartClassify(roleTypeCode string) (canOpClassify bool) {
+	// 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, roleTypeCode) {
+		canOpClassify = true
+	}
+
+	return
+}

+ 7 - 2
services/data/chart_info.go

@@ -553,6 +553,11 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
 		xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
 
+		for k := range yDataList {
+			yDataList[k].Unit = barChartConf.Unit
+			yDataList[k].UnitEn = barChartConf.UnitEn
+		}
+
 		for _, v := range edbList {
 			// 指标别名
 			if barChartConf.EdbInfoIdList != nil && len(barChartConf.EdbInfoIdList) > 0 {
@@ -1078,7 +1083,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新
-	err = EdbInfoRefreshAllFromBaseV3(edbIdList, false)
+	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
 	if err != nil {
 		return
 	}
@@ -1119,7 +1124,7 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error)
 	}
 
 	// 批量刷新
-	err = EdbInfoRefreshAllFromBaseV3(edbIdList, false)
+	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
 	if err != nil {
 		return
 	}

+ 1 - 1
services/data/correlation/chart_info.go

@@ -509,7 +509,7 @@ func ChartInfoRefresh(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新ETA指标
-	err = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false)
+	err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false, true)
 	if err != nil {
 		return
 	}

+ 110 - 11
services/data/edb_classify.go

@@ -160,12 +160,33 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 }
 
 // EditEdbClassify 编辑指标分类
-func EditEdbClassify(classifyId int, classifyName string) (err error, errMsg string) {
+func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetEdbClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
 		return
 	}
+
+	// 权限校验
+	{
+		if item.ClassifyType == 0 { // 普通指标
+			button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+			if !button.OpButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		} else if item.ClassifyType == 1 { // 预测指标
+			button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+			if !button.OpButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		}
+
+	}
+
 	// 名字相同,那么就直接返回
 	if item.ClassifyName == classifyName {
 		return
@@ -191,9 +212,36 @@ func EditEdbClassify(classifyId int, classifyName string) (err error, errMsg str
 }
 
 // DeleteCheck 删除检测
-func DeleteCheck(classifyId, edbInfoId int) (deleteStatus int, tipsMsg string, err error, errMsg string) {
+func DeleteCheck(classifyId, edbInfoId int, sysUser *system.Admin) (deleteStatus int, tipsMsg string, err error, errMsg string) {
 	//删除分类
 	if classifyId > 0 && edbInfoId == 0 {
+		// 查找分类
+		item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
+		if tmpErr != nil {
+			errMsg = `查找分类失败`
+			err = tmpErr
+			return
+		}
+		// 权限校验
+		{
+			if item.ClassifyType == 0 { // 普通指标
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			} else if item.ClassifyType == 1 { // 预测指标
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			}
+
+		}
+
 		//判断分类下,是否含有指标
 		count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
 		if tmpErr != nil {
@@ -252,9 +300,36 @@ func DeleteCheck(classifyId, edbInfoId int) (deleteStatus int, tipsMsg string, e
 }
 
 // Delete 删除分类/指标
-func Delete(classifyId, edbInfoId, sysUserId int, sysUserName string, requestBody, requestUrl string) (nextItem *data_manage.EdbInfo, err error, errMsg string) {
+func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, requestUrl string) (nextItem *data_manage.EdbInfo, err error, errMsg string) {
 	//删除分类
 	if classifyId > 0 && edbInfoId == 0 {
+		// 查找分类
+		item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
+		if tmpErr != nil {
+			errMsg = `查找分类失败`
+			err = tmpErr
+			return
+		}
+		// 权限校验
+		{
+			if item.ClassifyType == 0 { // 普通指标
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			} else if item.ClassifyType == 1 { // 预测指标
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			}
+
+		}
+
 		//判断是否含有指标
 		count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
 		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
@@ -386,8 +461,8 @@ func Delete(classifyId, edbInfoId, sysUserId int, sysUserName string, requestBod
 			edbLog.EdbCode = edbInfo.EdbCode
 			edbLog.EdbName = edbInfo.EdbName
 			edbLog.ClassifyId = edbInfo.ClassifyId
-			edbLog.SysUserId = sysUserId
-			edbLog.SysUserRealName = sysUserName
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
 			edbLog.CreateTime = time.Now()
 			edbLog.Content = requestBody
 			edbLog.Status = "删除指标"
@@ -402,7 +477,7 @@ func Delete(classifyId, edbInfoId, sysUserId int, sysUserName string, requestBod
 }
 
 // MoveEdbClassify 移动指标分类
-func MoveEdbClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyId int) (err error, errMsg string) {
+func MoveEdbClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyId int, sysUser *system.Admin) (err error, errMsg string) {
 	//判断分类是否存在
 	edbClassifyInfo, err := data_manage.GetEdbClassifyById(classifyId)
 	if err != nil {
@@ -410,6 +485,27 @@ func MoveEdbClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyI
 		err = errors.New("获取分类信息失败,Err:" + err.Error())
 		return
 	}
+
+	// 权限校验
+	{
+		if edbClassifyInfo.ClassifyType == 0 { // 普通指标
+			button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+			if !button.MoveButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		} else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
+			button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+			if !button.MoveButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		}
+
+	}
+
 	updateCol := make([]string, 0)
 
 	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
@@ -510,19 +606,20 @@ func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType in
 	}
 	button.ShowEdbRelation = true
 	button.ShowChartRelation = true
+
 	return
 }
 
 // GetEdbClassifyOpButton 获取ETA指标分类的操作权限
 func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
-	//2、用户对于自己添加的分类,有权限编辑、移动和删除该分类;
-	//3、ficc管理员和超管对所有分类有编辑、移动和删除权限;
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
 		button.AddButton = true
 		button.OpButton = true
 		button.DeleteButton = true
 		button.MoveButton = true
 	}
+
 	return
 }
 
@@ -537,17 +634,19 @@ func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int) (button data
 	}
 	button.ShowEdbRelation = true
 	button.ShowChartRelation = true
+
 	return
 }
 
 // GetPredictEdbClassifyOpButton 获取ETA预测指标分类的操作权限
 func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
-	//ficc管理员和超管有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
 		button.AddButton = true
 		button.OpButton = true
 		button.DeleteButton = true
 		button.MoveButton = true
 	}
+	
 	return
 }

+ 29 - 4
services/data/edb_info.go

@@ -17,7 +17,7 @@ import (
 )
 
 // EdbInfoRefreshAllFromBaseV2 全部刷新指标(切换到edb_lib服务)
-func EdbInfoRefreshAllFromBaseV2(edbInfoId int, refreshAll bool) (err error) {
+func EdbInfoRefreshAllFromBaseV2(edbInfoId int, refreshAll bool) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
 		if err != nil {
@@ -27,7 +27,7 @@ func EdbInfoRefreshAllFromBaseV2(edbInfoId int, refreshAll bool) (err error) {
 		}
 	}()
 
-	err = EdbInfoRefreshAllFromBaseV3([]int{edbInfoId}, refreshAll)
+	err, isAsync = EdbInfoRefreshAllFromBaseV3([]int{edbInfoId}, refreshAll, false)
 	return
 	//// 获取关联的基础指标
 	//newBaseEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoList(edbInfoId)
@@ -216,7 +216,7 @@ func EdbInfoRefreshAllFromBaseV2(edbInfoId int, refreshAll bool) (err error) {
 // @author Roc
 // @datetime 2022-09-16 11:04:44
 // @description 将原有的单个指标刷新,调整为批量多个指标刷新
-func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err error) {
+func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
 		if err != nil {
@@ -231,6 +231,30 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err erro
 	if err != nil {
 		return
 	}
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo <= 20 || isSync {
+		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		isAsync = true
+		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	}
+
+	return
+}
+
+func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) (err error) {
+	var errmsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
+			go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
+		}
+	}()
+
 	var startDate string
 	for _, bv := range newBaseEdbInfoArr {
 		//source := bv.Source
@@ -1169,7 +1193,7 @@ func RefreshManualData(edbCode string) {
 		return
 	}
 	// 刷新指标库
-	err = EdbInfoRefreshAllFromBaseV2(edbInfo.EdbInfoId, true)
+	err, _ = EdbInfoRefreshAllFromBaseV2(edbInfo.EdbInfoId, true)
 	return
 }
 
@@ -2558,6 +2582,7 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	edbInfo.CreateTime = time.Now()
 	edbInfo.ModifyTime = time.Now()
 	edbInfo.ServerUrl = serverUrl
+	edbInfo.DataDateType = `交易日`
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
 	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)

+ 1 - 1
services/data/future_good/chart_info.go

@@ -910,7 +910,7 @@ func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新ETA指标
-	err = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false)
+	err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false, true)
 	if err != nil {
 		return
 	}

+ 6 - 6
services/data/line_feature/chart_info.go

@@ -15,11 +15,11 @@ import (
 )
 
 // GetStandardDeviationData 获取标准差图表的指标数据
-func GetStandardDeviationData(chartInfoId int, mappingInfo *data_manage.ChartEdbInfoMapping, calculateValue int) (edbList []*data_manage.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
+func GetStandardDeviationData(chartInfoId int, startDate, endDate string, mappingInfo *data_manage.ChartEdbInfoMapping, calculateValue int) (edbList []*data_manage.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
 	edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
 
 	// 指标对应的所有数据
-	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, ``, ``, []*data_manage.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo})
 	if err != nil {
 		return
 	}
@@ -82,7 +82,7 @@ func GetStandardDeviationData(chartInfoId int, mappingInfo *data_manage.ChartEdb
 }
 
 // GetPercentileData 获取百分位图表的指标数据
-func GetPercentileData(chartInfoId int, mappingInfo *data_manage.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*data_manage.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
+func GetPercentileData(chartInfoId int, startDate, endDate string, mappingInfo *data_manage.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*data_manage.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
 	edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
 	moveUnitDays, ok := utils.FrequencyDaysMap[calculateUnit]
 	if !ok {
@@ -92,7 +92,7 @@ func GetPercentileData(chartInfoId int, mappingInfo *data_manage.ChartEdbInfoMap
 	}
 	calculateDay := calculateValue * moveUnitDays
 	// 指标对应的所有数据
-	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, ``, ``, []*data_manage.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo})
 	if err != nil {
 		return
 	}
@@ -431,7 +431,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.C
 	chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
 	chartInfo.ChartType = 9 // 相关性图
 	chartInfo.Calendar = "公历"
-	chartInfo.DateType = 6
+	chartInfo.DateType = req.DateType
 	chartInfo.StartDate = req.StartDate
 	chartInfo.EndDate = req.EndDate
 	chartInfo.SeasonStartDate = req.SeasonStartDate
@@ -564,7 +564,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage
 	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
 
 	// 修改图表与指标mapping
-	err = line_feature.EditLineFeatureChartAndMapping(&req, edbInfoIdStr, "公历", 6, disableVal, req.ExtraConfig)
+	err = line_feature.EditLineFeatureChartAndMapping(&req, edbInfoIdStr, "公历", req.DateType, disableVal, req.ExtraConfig)
 	if err != nil {
 		errMsg = "保存失败"
 		err = errors.New("保存失败,Err:" + err.Error())

+ 11 - 90
services/data/predict_edb_info.go

@@ -404,7 +404,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName string, ruleList []re
 }
 
 // RefreshPredictEdbInfo 刷新预测指标
-func RefreshPredictEdbInfo(edbInfoId int, refreshAll bool) (edbInfo *data_manage.EdbInfo, err error, errMsg string) {
+func RefreshPredictEdbInfo(edbInfoId int, refreshAll bool) (edbInfo *data_manage.EdbInfo, isAsync bool, err error, errMsg string) {
 	// 指标信息校验
 	{
 		edbInfo, err = data_manage.GetEdbInfoById(edbInfoId)
@@ -424,7 +424,7 @@ func RefreshPredictEdbInfo(edbInfoId int, refreshAll bool) (edbInfo *data_manage
 			return
 		}
 	}
-	err = EdbInfoRefreshAllFromBaseV2(edbInfo.EdbInfoId, refreshAll)
+	err, isAsync = EdbInfoRefreshAllFromBaseV2(edbInfo.EdbInfoId, refreshAll)
 
 	return
 }
@@ -558,90 +558,8 @@ func MovePredictEdbInfo(edbInfoId, classifyId, prevEdbInfoId, nextEdbInfoId int,
 	return
 }
 
-// GetPredictEdbInfoDataList 获取预测指标的未来数据
-func GetPredictEdbInfoDataList(predictEdbConf data_manage.PredictEdbConf, latestDateStr string, lastDataValue float64, endDateStr, frequency string) (predictEdbInfoData []*data_manage.EdbData, err error) {
-	endDate, err := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
-	if err != nil {
-		return
-	}
-
-	latestDate, err := time.ParseInLocation(utils.FormatDate, latestDateStr, time.Local)
-	if err != nil {
-		return
-	}
-
-	dataValue := lastDataValue
-	if predictEdbConf.RuleType == 2 {
-		dataValue = predictEdbConf.FixedValue
-	}
-	//获取后面的预测数据
-	dayList := getPredictEdbDayList(latestDate, endDate, frequency)
-	predictEdbInfoData = make([]*data_manage.EdbData, 0)
-	lenDayList := len(dayList)
-	if lenDayList > 0 {
-		for i := lenDayList - 1; i >= 0; i-- {
-			v := dayList[i]
-			predictEdbInfoData = append(predictEdbInfoData, &data_manage.EdbData{
-				EdbDataId: predictEdbConf.PredictEdbInfoId + 100000 + i,
-				EdbInfoId: predictEdbConf.PredictEdbInfoId,
-				DataTime:  v.Format(utils.FormatDate),
-				Value:     dataValue,
-			})
-		}
-	}
-
-	return
-}
-
-// GetChartPredictEdbInfoDataList 获取图表的预测指标的未来数据
-func GetChartPredictEdbInfoDataList(predictEdbConf data_manage.PredictEdbConf, filtrateStartDateStr, latestDateStr string, lastDataValue float64, endDateStr, frequency string) (predictEdbInfoData []*data_manage.EdbDataList, err error) {
-	endDate, err := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
-	if err != nil {
-		return
-	}
-
-	latestDate, err := time.ParseInLocation(utils.FormatDate, latestDateStr, time.Local)
-	if err != nil {
-		return
-	}
-
-	// 开始预测数据的时间
-	startDate := latestDate
-
-	// 如果有筛选时间的话
-	if filtrateStartDateStr != `` {
-		filtrateStartDate, tmpErr := time.ParseInLocation(utils.FormatDate, filtrateStartDateStr, time.Local)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		//如果筛选时间晚于实际数据时间,那么就以筛选时间作为获取预测数据的时间
-		if filtrateStartDate.After(latestDate) {
-			startDate = filtrateStartDate.AddDate(0, 0, -1)
-		}
-	}
-
-	dataValue := lastDataValue
-	if predictEdbConf.RuleType == 2 {
-		dataValue = predictEdbConf.FixedValue
-	}
-	//获取后面的预测数据
-	dayList := getPredictEdbDayList(startDate, endDate, frequency)
-	predictEdbInfoData = make([]*data_manage.EdbDataList, 0)
-	for k, v := range dayList {
-		predictEdbInfoData = append(predictEdbInfoData, &data_manage.EdbDataList{
-			EdbDataId:     predictEdbConf.PredictEdbInfoId + 100000 + k,
-			EdbInfoId:     predictEdbConf.PredictEdbInfoId,
-			DataTime:      v.Format(utils.FormatDate),
-			Value:         dataValue,
-			DataTimestamp: v.UnixNano() / 1e6,
-		})
-	}
-	return
-}
-
 // GetChartPredictEdbInfoDataListByConfList 获取图表的预测指标的未来数据
-func GetChartPredictEdbInfoDataListByConfList(predictEdbConfList []data_manage.PredictEdbConfAndData, filtrateStartDateStr, latestDateStr, endDateStr, frequency string, realPredictEdbInfoData []*data_manage.EdbDataList) (predictEdbInfoData []*data_manage.EdbDataList, minValue, maxValue float64, err error, errMsg string) {
+func GetChartPredictEdbInfoDataListByConfList(predictEdbConfList []data_manage.PredictEdbConfAndData, filtrateStartDateStr, latestDateStr, endDateStr, frequency, dataDateType string, realPredictEdbInfoData []*data_manage.EdbDataList) (predictEdbInfoData []*data_manage.EdbDataList, minValue, maxValue float64, err error, errMsg string) {
 	endDate, err := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
 	if err != nil {
 		return
@@ -688,7 +606,7 @@ func GetChartPredictEdbInfoDataListByConfList(predictEdbConfList []data_manage.P
 
 		var tmpMinValue, tmpMaxValue float64 // 当前预测结果中的最大/最小值
 
-		dayList := getPredictEdbDayList(startDate, dataEndTime, frequency)
+		dayList := getPredictEdbDayList(startDate, dataEndTime, frequency, dataDateType)
 		if len(dayList) <= 0 { // 如果未来没有日期的话,那么就退出当前循环,进入下一个循环
 			continue
 		}
@@ -900,13 +818,16 @@ func GetChartPredictEdbInfoDataListByConfList(predictEdbConfList []data_manage.P
 }
 
 // GetPredictEdbDayList 获取预测指标日期列表
-func getPredictEdbDayList(startDate, endDate time.Time, frequency string) (dayList []time.Time) {
+func getPredictEdbDayList(startDate, endDate time.Time, frequency, dataDateType string) (dayList []time.Time) {
 	//if !utils.InArrayByStr([]string{"日度", "周度", "月度"}, frequency)
+	if dataDateType == `` {
+		dataDateType = `交易日`
+	}
 	switch frequency {
 	case "日度":
 		for currDate := startDate.AddDate(0, 0, 1); currDate.Before(endDate) || currDate.Equal(endDate); currDate = currDate.AddDate(0, 0, 1) {
-			//周六、日排除
-			if currDate.Weekday() == time.Sunday || currDate.Weekday() == time.Saturday {
+			// 如果日期类型是交易日的时候,那么需要将周六、日排除
+			if dataDateType == `交易日` && (currDate.Weekday() == time.Sunday || currDate.Weekday() == time.Saturday) {
 				continue
 			}
 			dayList = append(dayList, currDate)
@@ -1056,7 +977,7 @@ func GetPredictDataListByPredictEdbInfo(edbInfo *data_manage.EdbInfo, startDate,
 		})
 	}
 	//var predictMinValue, predictMaxValue float64
-	predictDataList, _, _, err, _ = GetChartPredictEdbInfoDataListByConfList(predictEdbConfDataList, startDate, sourceEdbInfoItem.LatestDate, endDateStr, edbInfo.Frequency, allDataList)
+	predictDataList, _, _, err, _ = GetChartPredictEdbInfoDataListByConfList(predictEdbConfDataList, startDate, sourceEdbInfoItem.LatestDate, endDateStr, edbInfo.Frequency, edbInfo.DataDateType, allDataList)
 	if err != nil {
 		return
 	}

+ 4 - 4
services/elastic/elastic.go

@@ -574,8 +574,8 @@ func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource
 				}
 				edbInfoItem := new(data_manage.EdbInfoList)
 				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
-				if err != nil {
-					fmt.Println("json.Unmarshal movieJson err:", err)
+				if tmpErr != nil {
+					fmt.Println("json.Unmarshal movieJson err:", tmpErr)
 					err = tmpErr
 					return
 				}
@@ -763,8 +763,8 @@ func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shou
 				}
 				edbInfoItem := new(data_manage.EdbInfoList)
 				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
-				if err != nil {
-					fmt.Println("json.Unmarshal movieJson err:", err)
+				if tmpErr != nil {
+					fmt.Println("json.Unmarshal movieJson err:", tmpErr)
 					err = tmpErr
 					return
 				}