package logic import ( "errors" "eta_gn/eta_index_lib/models" "eta_gn/eta_index_lib/utils" "fmt" "strconv" "strings" "time" ) func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, sysUserId int, sysUserName, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) { var sourceEdbInfo *models.EdbInfo { sourceEdbInfo, err = models.GetEdbInfoById(sourceEdbInfoId) if err != nil && err.Error() != utils.ErrNoRow() { errMsg = "新增失败" err = errors.New("获取来源指标失败,Err:" + err.Error()) return } if sourceEdbInfo == nil { errMsg = "找不到该来源指标" err = errors.New(errMsg) return } if sourceEdbInfo.EdbInfoType != 0 { errMsg = "来源指标异常,不是普通的指标" err = errors.New(errMsg) return } } var classifyInfo *models.EdbClassify { classifyInfo, err = models.GetEdbClassifyById(classifyId) if err != nil && err.Error() != utils.ErrNoRow() { errMsg = "新增失败" err = errors.New("获取预测指标分类失败,Err:" + err.Error()) return } if classifyInfo == nil { errMsg = "找不到该预测指标分类" err = errors.New(errMsg) return } if classifyInfo.ClassifyType != 1 { errMsg = "预测指标分类异常,不是预测指标分类" err = errors.New(errMsg) return } } edbName = strings.Trim(edbName, " ") edbCode := sourceEdbInfo.EdbCode + "_" + time.Now().Format(utils.FormatShortDateTimeUnSpace) existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, 0, edbName, lang) if err != nil { errMsg = "判断指标名称是否存在失败" err = errors.New("判断指标名称是否存在失败,Err:" + err.Error()) return } if existEdbName { errMsg = "指标名称已存在,请重新填写" err = errors.New(errMsg) return } timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) if dataDateType == `` { dataDateType = `自然日` } edbInfo = &models.EdbInfo{ EdbInfoType: 1, SourceName: "预测指标", Source: utils.DATA_SOURCE_PREDICT, EdbCode: edbCode, EdbName: edbName, EdbNameSource: edbName, Frequency: sourceEdbInfo.Frequency, Unit: sourceEdbInfo.Unit, StartDate: sourceEdbInfo.StartDate, ClassifyId: classifyId, SysUserId: sysUserId, SysUserRealName: sysUserName, UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp), CreateTime: time.Now(), ModifyTime: time.Now(), MinValue: minValue, MaxValue: maxValue, CalculateFormula: sourceEdbInfo.CalculateFormula, EdbType: 1, LatestDate: sourceEdbInfo.LatestDate, LatestValue: sourceEdbInfo.LatestValue, MoveType: sourceEdbInfo.MoveType, MoveFrequency: sourceEdbInfo.MoveFrequency, NoUpdate: sourceEdbInfo.NoUpdate, ServerUrl: "", EdbNameEn: edbName, UnitEn: sourceEdbInfo.UnitEn, DataDateType: dataDateType, Sort: models.GetAddEdbMaxSortByClassifyId(classifyId, utils.PREDICT_EDB_INFO_TYPE), } calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0) fromEdbMap := make(map[int]int) calculateMappingItem := &models.EdbInfoCalculateMapping{ Source: edbInfo.Source, SourceName: edbInfo.SourceName, EdbCode: edbInfo.EdbCode, FromEdbInfoId: sourceEdbInfo.EdbInfoId, FromEdbCode: sourceEdbInfo.EdbCode, FromEdbName: sourceEdbInfo.EdbName, FromSource: sourceEdbInfo.Source, FromSourceName: sourceEdbInfo.SourceName, Sort: 1, CreateTime: time.Now(), ModifyTime: time.Now(), } fromEdbMap[sourceEdbInfoId] = sourceEdbInfoId calculateMappingList = append(calculateMappingList, calculateMappingItem) calculateRuleMap := make(map[int]models.CalculateRule, 0) predictEdbConfList := make([]*models.PredictEdbConf, 0) for ruleIndex, v := range ruleList { ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local) if tmpErr != nil { errMsg = "规则配置的截止日期异常,请重新填写" err = errors.New(errMsg) return } if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) { errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标" err = errors.New(errMsg) return } switch v.RuleType { case 8: //N期段线性外推值 valInt, tmpErr := strconv.Atoi(v.Value) if tmpErr != nil { errMsg = "N期段线性外推值的N值异常" err = errors.New(errMsg) return } if valInt <= 1 { errMsg = "N期段线性外推值的N值必须大于1" err = errors.New(errMsg) return } case 9: //9:动态环差 if v.Value == "" { errMsg = "请填写计算规则" err = errors.New(errMsg) return } formula := v.Value formula = strings.Replace(formula, "(", "(", -1) formula = strings.Replace(formula, ")", ")", -1) formula = strings.Replace(formula, ",", ",", -1) formula = strings.Replace(formula, "。", ".", -1) formula = strings.Replace(formula, "%", "*0.01", -1) v.Value = formula var formulaStr string var edbInfoIdBytes []string for _, tmpEdbInfoId := range v.EdbInfoIdArr { formulaStr += tmpEdbInfoId.FromTag + "," edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag) } formulaSlice, tErr := utils.CheckFormulaJson(formula) if tErr != nil { errMsg = "公式格式错误,请重新填写" err = errors.New(errMsg) return } for _, fm := range formulaSlice { formulaMap, e := utils.CheckFormula(fm) if e != nil { err = fmt.Errorf("公式错误,请重新填写") return } for _, f := range formulaMap { if !strings.Contains(formulaStr, f) { errMsg = "公式错误,请重新填写" err = errors.New(errMsg) return } } } edbInfoList := make([]*models.EdbInfo, 0) trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0) for k, tmpEdbInfoId := range v.EdbInfoIdArr { fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId) if tmpErr != nil { err = tmpErr if err.Error() == utils.ErrNoRow() { errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在" err = errors.New(errMsg) return } errMsg = "获取指标失败:Err:" + err.Error() err = errors.New(errMsg) return } edbInfoList = append(edbInfoList, fromEdbInfo) { if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok { fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId calculateMappingItem := &models.EdbInfoCalculateMapping{ EdbInfoCalculateMappingId: 0, EdbInfoId: 0, Source: utils.DATA_SOURCE_CALCULATE, SourceName: "指标运算", EdbCode: "", FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } calculateMappingList = append(calculateMappingList, calculateMappingItem) } } tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{ EdbInfoId: 0, ConfigId: 0, FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, FromTag: tmpEdbInfoId.FromTag, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping) } for _, f := range formulaSlice { formulaMap, e := utils.CheckFormula(f) if e != nil { err = fmt.Errorf("公式错误,请重新填写") return } ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes) if !ok { errMsg = "生成计算指标失败,请使用正确的计算公式" err = errors.New(errMsg) return } } calculateRuleMap[ruleIndex] = models.CalculateRule{ TrendsCalculateMappingList: trendsMappingList, EdbInfoList: edbInfoList, EdbInfoIdBytes: edbInfoIdBytes, Formula: formula, RuleType: v.RuleType, EndDate: v.EndDate, EdbInfoIdArr: v.EdbInfoIdArr, } case 14: //14:根据 一元线性拟合 规则获取预测数据 if v.Value == "" { errMsg = "请填写一元线性拟合规则" err = errors.New(errMsg) return } edbInfoList := make([]*models.EdbInfo, 0) trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0) for k, tmpEdbInfoId := range v.EdbInfoIdArr { fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId) if tmpErr != nil { err = tmpErr if err.Error() == utils.ErrNoRow() { errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在" err = errors.New(errMsg) return } errMsg = "获取指标失败:Err:" + err.Error() err = errors.New(errMsg) return } edbInfoList = append(edbInfoList, fromEdbInfo) { if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok { fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId tmpCalculateMappingItem := &models.EdbInfoCalculateMapping{ EdbInfoCalculateMappingId: 0, EdbInfoId: 0, Source: utils.DATA_SOURCE_CALCULATE, SourceName: "指标运算", EdbCode: "", FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } calculateMappingList = append(calculateMappingList, tmpCalculateMappingItem) } } tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{ EdbInfoId: 0, ConfigId: 0, FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, FromTag: tmpEdbInfoId.FromTag, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping) } calculateRuleMap[ruleIndex] = models.CalculateRule{ TrendsCalculateMappingList: trendsMappingList, EdbInfoList: edbInfoList, RuleType: v.RuleType, EndDate: v.EndDate, EdbInfoIdArr: v.EdbInfoIdArr, } } tmpPredictEdbConf := &models.PredictEdbConf{ PredictEdbInfoId: 0, SourceEdbInfoId: sourceEdbInfoId, RuleType: v.RuleType, Value: v.Value, EndDate: ruleEndDate, ModifyTime: time.Now(), CreateTime: time.Now(), } edbInfo.EndDate = v.EndDate predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf) } err, errMsg = models.AddPredictEdb(edbInfo, calculateMappingList, predictEdbConfList, calculateRuleMap) return } func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) { { edbInfo, err = models.GetEdbInfoById(edbInfoId) if err != nil && err.Error() != utils.ErrNoRow() { errMsg = "修改失败" err = errors.New("获取预测指标失败,Err:" + err.Error()) return } if edbInfo == nil { errMsg = "找不到该预测指标" err = errors.New(errMsg) return } if edbInfo.EdbInfoType != 1 { errMsg = "指标异常,不是预测指标" err = errors.New(errMsg) return } } var predictEdbConf *models.PredictEdbConf { predictEdbConfList, tmpErr := models.GetPredictEdbConfListById(edbInfo.EdbInfoId) if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() { errMsg = "修改失败" err = errors.New("获取预测指标配置信息失败,Err:" + tmpErr.Error()) return } if len(predictEdbConfList) == 0 { errMsg = "找不到该预测指标配置" err = errors.New(errMsg) return } predictEdbConf = predictEdbConfList[0] } existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, edbInfoId, edbName, lang) if err != nil { errMsg = "判断指标名称是否存在失败" err = errors.New("判断指标名称是否存在失败,Err:" + err.Error()) return } if existEdbName { errMsg = "指标名称已存在,请重新填写" err = errors.New(errMsg) return } if dataDateType == `` { dataDateType = `自然日` } switch lang { case utils.EnLangVersion: edbInfo.EdbNameEn = edbName default: edbInfo.EdbName = edbName } edbInfo.EdbNameSource = edbName edbInfo.ClassifyId = classifyId edbInfo.MinValue = minValue edbInfo.MaxValue = maxValue edbInfo.DataDateType = dataDateType edbInfo.ModifyTime = time.Now() updateEdbInfoCol := []string{"EdbName", "EdbNameEn", "EdbNameSource", "ClassifyId", "EndDate", "MinValue", "MaxValue", "DataDateType", "ModifyTime"} var sourceEdbInfo *models.EdbInfo { sourceEdbInfo, err = models.GetEdbInfoById(predictEdbConf.SourceEdbInfoId) if err != nil && err.Error() != utils.ErrNoRow() { errMsg = "新增失败" err = errors.New("获取来源指标失败,Err:" + err.Error()) return } if sourceEdbInfo == nil { errMsg = "找不到该来源指标" err = errors.New(errMsg) return } if sourceEdbInfo.EdbInfoType != 0 { errMsg = "来源指标异常,不是普通的指标" err = errors.New(errMsg) return } } calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0) fromEdbMap := make(map[int]int) calculateMappingItem := &models.EdbInfoCalculateMapping{ EdbInfoId: edbInfoId, Source: edbInfo.Source, SourceName: edbInfo.SourceName, EdbCode: edbInfo.EdbCode, FromEdbInfoId: sourceEdbInfo.EdbInfoId, FromEdbCode: sourceEdbInfo.EdbCode, FromEdbName: sourceEdbInfo.EdbName, FromSource: sourceEdbInfo.Source, FromSourceName: sourceEdbInfo.SourceName, Sort: 1, CreateTime: time.Now(), ModifyTime: time.Now(), } fromEdbMap[sourceEdbInfo.EdbInfoId] = sourceEdbInfo.EdbInfoId calculateMappingList = append(calculateMappingList, calculateMappingItem) calculateRuleMap := make(map[int]models.CalculateRule, 0) predictEdbConfList := make([]*models.PredictEdbConf, 0) for ruleIndex, v := range ruleList { ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local) if tmpErr != nil { errMsg = "规则配置的截止日期异常,请重新填写" err = errors.New(errMsg) return } if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) { errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标" err = errors.New(errMsg) return } switch v.RuleType { case 8: //N期段线性外推值 valInt, tmpErr := strconv.Atoi(v.Value) if tmpErr != nil { errMsg = "N期段线性外推值的N值异常" err = errors.New(errMsg) return } if valInt <= 1 { errMsg = "N期段线性外推值的N值必须大于1" err = errors.New(errMsg) return } case 9: //9:动态环差 if v.Value == "" { errMsg = "请填写计算规则" err = errors.New(errMsg) return } formula := v.Value formula = strings.Replace(formula, "(", "(", -1) formula = strings.Replace(formula, ")", ")", -1) formula = strings.Replace(formula, ",", ",", -1) formula = strings.Replace(formula, "。", ".", -1) formula = strings.Replace(formula, "%", "*0.01", -1) v.Value = formula var formulaStr string var edbInfoIdBytes []string for _, tmpEdbInfoId := range v.EdbInfoIdArr { formulaStr += tmpEdbInfoId.FromTag + "," edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag) } formulaSlice, tErr := utils.CheckFormulaJson(formula) if tErr != nil { errMsg = "公式格式错误,请重新填写" err = errors.New(errMsg) return } for _, fm := range formulaSlice { formulaMap, e := utils.CheckFormula(fm) if e != nil { err = fmt.Errorf("公式错误,请重新填写") return } for _, f := range formulaMap { if !strings.Contains(formulaStr, f) { errMsg = "公式错误,请重新填写" err = errors.New(errMsg) return } } } edbInfoList := make([]*models.EdbInfo, 0) trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0) for k, tmpEdbInfoId := range v.EdbInfoIdArr { fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId) if tmpErr != nil { err = tmpErr if err.Error() == utils.ErrNoRow() { errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在" err = errors.New(errMsg) return } errMsg = "获取指标失败:Err:" + err.Error() err = errors.New(errMsg) return } edbInfoList = append(edbInfoList, fromEdbInfo) { if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok { fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId calculateMappingItem := &models.EdbInfoCalculateMapping{ EdbInfoCalculateMappingId: 0, EdbInfoId: edbInfoId, Source: utils.DATA_SOURCE_CALCULATE, SourceName: "指标运算", EdbCode: "", FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } calculateMappingList = append(calculateMappingList, calculateMappingItem) } } tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{ EdbInfoId: edbInfoId, ConfigId: 0, FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, FromTag: tmpEdbInfoId.FromTag, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping) } for _, f := range formulaSlice { formulaMap, e := utils.CheckFormula(f) if e != nil { err = fmt.Errorf("公式错误,请重新填写") return } ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes) if !ok { errMsg = "生成计算指标失败,请使用正确的计算公式" err = errors.New(errMsg) return } } calculateRuleMap[ruleIndex] = models.CalculateRule{ TrendsCalculateMappingList: trendsMappingList, EdbInfoList: edbInfoList, EdbInfoIdBytes: edbInfoIdBytes, Formula: formula, RuleType: v.RuleType, EndDate: v.EndDate, EdbInfoIdArr: v.EdbInfoIdArr, } case 14: //14:根据 一元线性拟合 规则获取预测数据 if v.Value == "" { errMsg = "请填写一元线性拟合规则" err = errors.New(errMsg) return } edbInfoList := make([]*models.EdbInfo, 0) trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0) for k, tmpEdbInfoId := range v.EdbInfoIdArr { fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId) if tmpErr != nil { err = tmpErr if err.Error() == utils.ErrNoRow() { errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在" err = errors.New(errMsg) return } errMsg = "获取指标失败:Err:" + err.Error() err = errors.New(errMsg) return } edbInfoList = append(edbInfoList, fromEdbInfo) { if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok { fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId tmpCalculateMappingItem := &models.EdbInfoCalculateMapping{ EdbInfoCalculateMappingId: 0, EdbInfoId: 0, Source: utils.DATA_SOURCE_CALCULATE, SourceName: "指标运算", EdbCode: "", FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } calculateMappingList = append(calculateMappingList, tmpCalculateMappingItem) } } tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{ EdbInfoId: 0, ConfigId: 0, FromEdbInfoId: fromEdbInfo.EdbInfoId, FromEdbCode: fromEdbInfo.EdbCode, FromEdbName: fromEdbInfo.EdbName, FromSource: fromEdbInfo.Source, FromSourceName: fromEdbInfo.SourceName, FromTag: tmpEdbInfoId.FromTag, Sort: k + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping) } calculateRuleMap[ruleIndex] = models.CalculateRule{ TrendsCalculateMappingList: trendsMappingList, EdbInfoList: edbInfoList, RuleType: v.RuleType, EndDate: v.EndDate, EdbInfoIdArr: v.EdbInfoIdArr, } } tmpPredictEdbConf := &models.PredictEdbConf{ PredictEdbInfoId: edbInfoId, SourceEdbInfoId: sourceEdbInfo.EdbInfoId, RuleType: v.RuleType, Value: v.Value, EndDate: ruleEndDate, ModifyTime: time.Now(), CreateTime: time.Now(), } edbInfo.EndDate = v.EndDate predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf) } err, errMsg = models.EditPredictEdb(edbInfo, updateEdbInfoCol, calculateMappingList, predictEdbConfList, calculateRuleMap) return } func RefreshPredictEdbInfo(edbInfoId int) (edbInfo *models.EdbInfo, err error, errMsg string) { { edbInfo, err = models.GetEdbInfoById(edbInfoId) if err != nil && err.Error() != utils.ErrNoRow() { errMsg = "刷新失败" err = errors.New("获取预测指标失败,Err:" + err.Error()) return } if edbInfo == nil { errMsg = "找不到该预测指标" err = nil return } if edbInfo.EdbInfoType != 1 { errMsg = "指标异常,不是预测指标" return } } list, err := models.GetPredictEdbConfCalculateMappingListByEdbInfoId(edbInfoId) if err != nil { return } if len(list) <= 0 { return } predictEdbConfCalculateMappingListMap := make(map[int][]*models.PredictEdbConfCalculateMapping) configIdList := make([]int, 0) //关联配置id edbInfoIdList := make([]int, 0) //关联指标配置id edbInfoIdMap := make(map[int]int, 0) //关联指标配置map for _, v := range list { configList, ok := predictEdbConfCalculateMappingListMap[v.ConfigId] if !ok { configList = make([]*models.PredictEdbConfCalculateMapping, 0) configIdList = append(configIdList, v.ConfigId) } if _, ok := edbInfoIdMap[v.FromEdbInfoId]; !ok { edbInfoIdList = append(edbInfoIdList, v.FromEdbInfoId) } configList = append(configList, v) predictEdbConfCalculateMappingListMap[v.ConfigId] = configList } predictEdbConfList, err := models.GetPredictEdbConfListByConfigIdList(configIdList) if err != nil { errMsg = "刷新失败" err = errors.New("获取预测指标配置信息失败,Err:" + err.Error()) return } if len(predictEdbConfList) == 0 { errMsg = "找不到该预测指标配置" err = nil return } edbInfoList, err := models.GetEdbInfoByIdList(edbInfoIdList) if err != nil { err = errors.New("获取关联指标失败,Err:" + err.Error()) return } edbInfoListMap := make(map[int]*models.EdbInfo) for _, v := range edbInfoList { edbInfoListMap[v.EdbInfoId] = v } predictEdbConfAndDataList := make([]*models.PredictEdbConfAndData, 0) for _, v := range predictEdbConfList { resultDataList := make([]*models.EdbInfoSearchData, 0) switch v.RuleType { case 9: //动态环差值 if v.Value == "" { errMsg = "请填写计算规则" return } formula := v.Value trendsMappingList := predictEdbConfCalculateMappingListMap[v.ConfigId] edbInfoIdArr := make([]models.EdbInfoFromTag, 0) edbInfoList := make([]*models.EdbInfo, 0) for _, trendsMapping := range trendsMappingList { tmpEdbInfo, ok := edbInfoListMap[trendsMapping.FromEdbInfoId] if ok { edbInfoList = append(edbInfoList, tmpEdbInfo) } edbInfoIdArr = append(edbInfoIdArr, models.EdbInfoFromTag{ EdbInfoId: trendsMapping.FromEdbInfoId, FromTag: trendsMapping.FromTag, }) } var formulaStr string var edbInfoIdBytes []string for _, tmpEdbInfoId := range edbInfoIdArr { formulaStr += tmpEdbInfoId.FromTag + "," edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag) } formulaSlice, tErr := utils.CheckFormulaJson(formula) if tErr != nil { errMsg = "公式格式错误,请重新填写" err = errors.New(errMsg) return } for _, fm := range formulaSlice { formulaMap, e := utils.CheckFormula(fm) if e != nil { err = fmt.Errorf("公式错误,请重新填写") return } for _, f := range formulaMap { if !strings.Contains(formulaStr, f) { errMsg = "公式错误,请重新填写" err = errors.New(errMsg) return } } ok, _ := models.CheckFormula2(edbInfoList, formulaMap, fm, edbInfoIdBytes) if !ok { errMsg = "生成计算指标失败,请使用正确的计算公式" return } } rule := models.CalculateRule{ EdbInfoId: v.PredictEdbInfoId, ConfigId: v.ConfigId, TrendsCalculateMappingList: trendsMappingList, EdbInfoList: edbInfoList, EdbInfoIdBytes: edbInfoIdBytes, Formula: formula, RuleType: v.RuleType, EndDate: v.EndDate.Format(utils.FormatDate), EdbInfoIdArr: edbInfoIdArr, } resultDataList, err = models.RefreshCalculateByRuleBy9(rule) if err != nil { return } case 14: //14:根据 一元线性拟合 规则获取预测数据 if v.Value == "" { errMsg = "一元线性拟合规则信息未配置" return } err, errMsg = models.RefreshCalculateByRuleByLineNh(*edbInfo, predictEdbConfAndDataList, *v) if err != nil { return } } tmpPredictEdbConfAndData := &models.PredictEdbConfAndData{ ConfigId: 0, PredictEdbInfoId: 0, SourceEdbInfoId: v.SourceEdbInfoId, RuleType: v.RuleType, FixedValue: v.FixedValue, Value: v.Value, EndDate: v.EndDate, ModifyTime: v.ModifyTime, CreateTime: v.CreateTime, DataList: resultDataList, } predictEdbConfAndDataList = append(predictEdbConfAndDataList, tmpPredictEdbConfAndData) } return } func checkExistByEdbName(edbInfoType int, edbName, lang string) (has bool, err error) { var condition string var pars []interface{} condition += " AND edb_info_type=? " pars = append(pars, 0) switch lang { case utils.EnLangVersion: condition += " AND edb_name_en = ? " default: condition += " AND edb_name=? " } pars = append(pars, edbName) count, err := models.GetEdbInfoCountByCondition(condition, pars) if err != nil { return } if count > 0 { has = true return } return } func checkExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId int, edbName, lang string) (has bool, err error) { var condition string var pars []interface{} condition += " AND edb_info_type=? " pars = append(pars, edbInfoType) condition += " AND edb_info_id<>? " pars = append(pars, edbInfoId) switch lang { case utils.EnLangVersion: condition += " AND edb_name_en = ? " default: condition += " AND edb_name=? " } pars = append(pars, edbName) count, err := models.GetEdbInfoCountByCondition(condition, pars) if err != nil { return } if count > 0 { has = true return } return } func CheckExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId int, edbName, lang string) (has bool, err error) { if edbInfoId == 0 { return checkExistByEdbName(edbInfoType, edbName, lang) } return checkExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId, edbName, lang) }