Roc 2 년 전
부모
커밋
cadca4115d
2개의 변경된 파일366개의 추가작업 그리고 60개의 파일을 삭제
  1. 277 56
      controllers/base_from_calculate.go
  2. 89 4
      models/base_from_calculate.go

+ 277 - 56
controllers/base_from_calculate.go

@@ -194,43 +194,10 @@ func (this *CalculateController) Add() {
 
 	randStr := utils.GetRandDigit(4)
 	edbCode := `C` + time.Now().Format("060102") + randStr
-
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	edbInfo := &models.EdbInfo{
-		EdbInfoId:        0,
-		SourceName:       "指标运算",
-		Source:           utils.DATA_SOURCE_CALCULATE,
-		EdbCode:          edbCode,
-		EdbName:          req.EdbName,
-		EdbNameSource:    req.EdbName,
-		Frequency:        req.Frequency,
-		Unit:             req.Unit,
-		StartDate:        "",
-		EndDate:          "",
-		ClassifyId:       req.ClassifyId,
-		SysUserId:        req.AdminId,
-		SysUserRealName:  req.AdminName,
-		UniqueCode:       uniqueCode,
-		CreateTime:       time.Now(),
-		ModifyTime:       time.Now(),
-		MinValue:         0,
-		MaxValue:         0,
-		CalculateFormula: req.CalculateFormula,
-		EdbType:          2,
-		Sort:             0,
-		MoveType:         0,
-		MoveFrequency:    "",
-		NoUpdate:         0,
-		ServerUrl:        "",
-		EdbInfoType:      0,
-		EdbNameEn:        "",
-		UnitEn:           "",
-		LatestDate:       "",
-		LatestValue:      0,
-		ChartImage:       "",
-	}
-	edbInfoId, err := models.AddEdbInfo(edbInfo)
+
+	edbInfo, err := models.AddCalculateInfo(req, calculateMappingList, edbInfoList, edbCode, uniqueCode, edbInfoIdBytes)
 	if err != nil {
 		br.Msg = "生成计算指标失败"
 		br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
@@ -257,26 +224,6 @@ func (this *CalculateController) Add() {
 		}
 	}
 
-	//关联关系表
-	{
-		//处理关联指标
-		for _, v := range calculateMappingList {
-			v.EdbCode = edbCode
-			v.EdbInfoId = int(edbInfoId)
-		}
-		if len(calculateMappingList) > 0 {
-			go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
-		}
-	}
-
-	// 指标数据入库
-	err = models.AddCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
-	if err != nil {
-		br.Msg = "生成计算指标失败"
-		br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
-		return
-	}
-
 	// 更新指标最大最小值
 	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
 	if err != nil {
@@ -285,7 +232,7 @@ func (this *CalculateController) Add() {
 		return
 	}
 	resp := models.AddEdbInfoResp{
-		EdbInfoId:  int(edbInfoId),
+		EdbInfoId:  edbInfo.EdbInfoId,
 		UniqueCode: uniqueCode,
 	}
 	br.Ret = 200
@@ -295,6 +242,280 @@ func (this *CalculateController) Add() {
 	br.IsAddLog = true
 }
 
+//func (this *CalculateController) Add() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	var req models.EdbInfoCalculateSaveReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	req.EdbName = strings.Trim(req.EdbName, " ")
+//	if req.EdbName == "" {
+//		br.Msg = "指标名称不能为空"
+//		return
+//	}
+//
+//	if req.Frequency == "" {
+//		br.Msg = "频率不能为空"
+//		return
+//	}
+//
+//	if req.Unit == "" {
+//		br.Msg = "单位不能为空"
+//		return
+//	}
+//
+//	if req.ClassifyId <= 0 {
+//		br.Msg = "请选择分类"
+//		return
+//	}
+//
+//	if len(req.EdbInfoIdArr) <= 0 {
+//		br.Msg = "请选择指标"
+//		return
+//	}
+//
+//	if req.CalculateFormula == "" {
+//		br.Msg = "请填写指标"
+//		return
+//	}
+//	calculateFormula := req.CalculateFormula
+//	calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
+//	calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
+//	calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
+//	calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
+//	calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
+//	req.CalculateFormula = calculateFormula
+//
+//	//加入缓存机制,避免创建同一个名称的指标 start
+//	redisKey := fmt.Sprint("edb_lib:edb_info:calculate:add:", utils.DATA_SOURCE_CALCULATE, ":", req.EdbName)
+//	isExist := utils.Rc.IsExist(redisKey)
+//	if isExist {
+//		br.Msg = "指标正在处理,请勿重复提交"
+//		return
+//	} else {
+//		//设置3分钟缓存
+//		utils.Rc.SetNX(redisKey, 1, time.Second*300)
+//		defer func() {
+//			utils.Rc.Delete(redisKey)
+//		}()
+//	}
+//
+//	//判断是否重复指标
+//	edbInfoMap := make(map[int]string)
+//	//移除研究员选择指标中的未使用的指标
+//	{
+//		//转大写的计算公式
+//		upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
+//		//用到的指标
+//		newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
+//		for _, tmpEdbInfo := range req.EdbInfoIdArr {
+//			_, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
+//			if ok {
+//				br.Msg = "选择指标失败,请勿选择重复指标!"
+//				return
+//			}
+//			edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
+//
+//			upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
+//			if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
+//				newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
+//			}
+//		}
+//		req.EdbInfoIdArr = newEdbInfoIdArr
+//	}
+//
+//	var condition string
+//	var pars []interface{}
+//	condition += " AND edb_name=? "
+//	pars = append(pars, req.EdbName)
+//
+//	count, err := models.GetEdbInfoCountByCondition(condition, pars)
+//	if err != nil {
+//		br.Msg = "判断指标名称是否存在失败"
+//		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	if count > 0 {
+//		br.Msg = "指标名称已存在,请重新填写"
+//		br.ErrMsg = "指标名称已存在,请重新填写"
+//		br.IsSendEmail = false
+//		return
+//	}
+//	//检验公式
+//	var formulaStr string
+//	var edbInfoIdBytes []string
+//	for _, v := range req.EdbInfoIdArr {
+//		formulaStr += v.FromTag + ","
+//		edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
+//	}
+//	formulaMap := services.CheckFormula(req.CalculateFormula)
+//	for _, v := range formulaMap {
+//		if !strings.Contains(formulaStr, v) {
+//			br.Msg = "公式错误,请重新填写"
+//			return
+//		}
+//	}
+//
+//	//关联的指标信息
+//	edbInfoList := make([]*models.EdbInfo, 0)
+//	//关联的指标数据表
+//	calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
+//	for k, v := range req.EdbInfoIdArr {
+//		fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
+//		if err != nil {
+//			if err.Error() == utils.ErrNoRow() {
+//				br.Msg = "生成计算指标失败"
+//				br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
+//				return
+//			}
+//			br.Msg = "生成计算指标失败"
+//			br.Msg = "获取指标失败:Err:" + err.Error()
+//			return
+//		}
+//
+//		edbInfoList = append(edbInfoList, fromEdbInfo)
+//		//关联关系表
+//		{
+//			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,
+//				FromTag:                   v.FromTag,
+//				Sort:                      k + 1,
+//				CreateTime:                time.Now(),
+//				ModifyTime:                time.Now(),
+//			}
+//			//calculateMappingItem.EdbCode = edbCode
+//			//calculateMappingItem.EdbInfoId = int(edbInfoId)
+//			calculateMappingList = append(calculateMappingList, calculateMappingItem)
+//		}
+//	}
+//	ok, _ := models.CheckFormula2(edbInfoList, formulaMap, calculateFormula, edbInfoIdBytes)
+//	if !ok {
+//		br.Msg = "生成计算指标失败,请使用正确的计算公式"
+//		return
+//	}
+//
+//	randStr := utils.GetRandDigit(4)
+//	edbCode := `C` + time.Now().Format("060102") + randStr
+//
+//	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+//	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+//	edbInfo := &models.EdbInfo{
+//		EdbInfoId:        0,
+//		SourceName:       "指标运算",
+//		Source:           utils.DATA_SOURCE_CALCULATE,
+//		EdbCode:          edbCode,
+//		EdbName:          req.EdbName,
+//		EdbNameSource:    req.EdbName,
+//		Frequency:        req.Frequency,
+//		Unit:             req.Unit,
+//		StartDate:        "",
+//		EndDate:          "",
+//		ClassifyId:       req.ClassifyId,
+//		SysUserId:        req.AdminId,
+//		SysUserRealName:  req.AdminName,
+//		UniqueCode:       uniqueCode,
+//		CreateTime:       time.Now(),
+//		ModifyTime:       time.Now(),
+//		MinValue:         0,
+//		MaxValue:         0,
+//		CalculateFormula: req.CalculateFormula,
+//		EdbType:          2,
+//		Sort:             0,
+//		MoveType:         0,
+//		MoveFrequency:    "",
+//		NoUpdate:         0,
+//		ServerUrl:        "",
+//		EdbInfoType:      0,
+//		EdbNameEn:        "",
+//		UnitEn:           "",
+//		LatestDate:       "",
+//		LatestValue:      0,
+//		ChartImage:       "",
+//	}
+//	edbInfoId, err := models.AddEdbInfo(edbInfo)
+//	if err != nil {
+//		br.Msg = "生成计算指标失败"
+//		br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
+//		return
+//	}
+//	//处理同名指标
+//	{
+//		edbNameList, err := models.GetEdbInfoByName(req.EdbName)
+//		if err != nil {
+//			br.Msg = "保存失败"
+//			br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+//			return
+//		}
+//		if len(edbNameList) >= 2 {
+//			for _, v := range edbNameList {
+//				edbName := v.EdbName + "(" + v.SourceName + ")"
+//				err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
+//				if err != nil {
+//					br.Msg = "保存失败"
+//					br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
+//					return
+//				}
+//			}
+//		}
+//	}
+//
+//	//关联关系表
+//	{
+//		//处理关联指标
+//		for _, v := range calculateMappingList {
+//			v.EdbCode = edbCode
+//			v.EdbInfoId = int(edbInfoId)
+//		}
+//		if len(calculateMappingList) > 0 {
+//			go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
+//		}
+//	}
+//
+//	// 指标数据入库
+//	err = models.AddCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
+//	if err != nil {
+//		br.Msg = "生成计算指标失败"
+//		br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
+//		return
+//	}
+//
+//	// 更新指标最大最小值
+//	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+//	if err != nil {
+//		br.Msg = errMsg
+//		br.ErrMsg = err.Error()
+//		return
+//	}
+//	resp := models.AddEdbInfoResp{
+//		EdbInfoId:  int(edbInfoId),
+//		UniqueCode: uniqueCode,
+//	}
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "保存成功"
+//	br.Data = resp
+//	br.IsAddLog = true
+//}
+
 // Edit
 // @Title 编辑计算指标接口
 // @Description 编辑计算指标接口

+ 89 - 4
models/base_from_calculate.go

@@ -124,6 +124,82 @@ func AddCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr st
 	return
 }
 
+// AddCalculateInfo 新增计算(运算)指标
+func AddCalculateInfo(req *EdbInfoCalculateSaveReq, calculateMappingList []*EdbInfoCalculateMapping, edbInfoList []*EdbInfo, edbCode, uniqueCode string, edbInfoIdBytes []string) (edbInfo *EdbInfo, err error) {
+
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("AddCalculateHcz,Err:" + err.Error())
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	edbInfo = &EdbInfo{
+		EdbInfoId:        0,
+		SourceName:       "指标运算",
+		Source:           utils.DATA_SOURCE_CALCULATE,
+		EdbCode:          edbCode,
+		EdbName:          req.EdbName,
+		EdbNameSource:    req.EdbName,
+		Frequency:        req.Frequency,
+		Unit:             req.Unit,
+		StartDate:        "",
+		EndDate:          "",
+		ClassifyId:       req.ClassifyId,
+		SysUserId:        req.AdminId,
+		SysUserRealName:  req.AdminName,
+		UniqueCode:       uniqueCode,
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		MinValue:         0,
+		MaxValue:         0,
+		CalculateFormula: req.CalculateFormula,
+		EdbType:          2,
+		Sort:             0,
+		MoveType:         0,
+		MoveFrequency:    "",
+		NoUpdate:         0,
+		ServerUrl:        "",
+		EdbInfoType:      0,
+		EdbNameEn:        "",
+		UnitEn:           "",
+		LatestDate:       "",
+		LatestValue:      0,
+		ChartImage:       "",
+	}
+	lastId, err := to.Insert(edbInfo)
+	if err != nil {
+		return
+	}
+	edbInfo.EdbInfoId = int(lastId)
+	//关联关系表
+	{
+		//处理关联指标
+		for _, v := range calculateMappingList {
+			v.EdbCode = edbCode
+			v.EdbInfoId = edbInfo.EdbInfoId
+		}
+		if len(calculateMappingList) > 0 {
+			_, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	//计算数据
+	err = refreshAllCalculate(to, edbInfoList, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.CalculateFormula, "", "", edbInfoIdBytes)
+
+	return
+}
+
 // GetCalculateEdbInfo 获取计算指标的关联指标id
 func GetCalculateEdbInfo(edbInfoId int) (from_edb_info_id string, err error) {
 	o := orm.NewOrm()
@@ -176,6 +252,15 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 		}
 	}()
 	fmt.Println(startDate, endDate)
+
+	//计算数据
+	err = refreshAllCalculate(to, edbInfoIdArr, edbInfoId, source, edbCode, formulaStr, startDate, endDate, edbInfoIdBytes)
+
+	return
+}
+
+// refreshAllCalculate 刷新全部数据
+func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
 	saveDataMap := make(map[string]map[int]float64)
 	for _, v := range edbInfoIdArr {
 		var condition string
@@ -221,7 +306,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 	dataTableName := GetEdbDataTableName(source)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
 	if err != nil {
 		return err
 	}
@@ -275,7 +360,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 				if existStr != saveValue {
 					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 					sql = fmt.Sprintf(sql, dataTableName)
-					_, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
+					_, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
 					if err != nil {
 						return err
 					}
@@ -290,7 +375,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		_, err = to.Raw(addSql).Exec()
 		if err != nil {
 			fmt.Println("RefreshAllCalculate add Err", err.Error())
 			return
@@ -304,7 +389,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 		tableName := GetEdbDataTableName(source)
 		sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
 
-		_, err = o.Raw(sql, edbInfoId).Exec()
+		_, err = to.Raw(sql, edbInfoId).Exec()
 		if err != nil {
 			err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
 			return