Browse Source

feat:新增保存数据调整接口

Roc 2 years ago
parent
commit
e9ac970dc7

+ 153 - 1
controllers/base_from_calculate.go

@@ -1420,7 +1420,24 @@ func (this *CalculateController) Refresh() {
 			errMsg = "RefreshAllCalculateNhcc Err:" + err.Error()
 			break
 		}
-
+	case utils.DATA_SOURCE_CALCULATE_ADJUST:
+		calculateMapping, err := models.GetEdbInfoCalculateMappingDetail(edbInfo.EdbInfoId)
+		if err != nil {
+			br.Msg = "获取来源指标异常!"
+			br.ErrMsg = "获取来源指标异常,Err:" + err.Error()
+			return
+		}
+		fromEdbInfo, err := models.GetEdbInfoById(calculateMapping.FromEdbInfoId)
+		if err != nil {
+			br.Msg = "来源指标不存在!"
+			br.ErrMsg = "来源指标不存在"
+			return
+		}
+		err = models.RefreshAllAdjustEdb(edbInfo, fromEdbInfo)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
+			break
+		}
 	default:
 		br.Msg = "来源异常,请联系相关开发!"
 		br.ErrMsg = "来源异常,请联系相关开发"
@@ -1447,3 +1464,138 @@ func (this *CalculateController) Refresh() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// SaveAdjust
+// @Title 保存数据调整指标接口
+// @Description 保存数据调整指标接口
+// @Success 200 {object} models.SaveAdjustEdbReq
+// @router /adjust/save [post]
+func (this *CalculateController) SaveAdjust() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.SaveAdjustEdbReq
+	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.DataList) == 0 {
+		br.Msg = "请填写数据"
+		return
+	}
+
+	//加入缓存机制,避免创建同一个名称的指标 start
+	redisKey := fmt.Sprint("edb_info:adjust:add:", utils.DATA_SOURCE_CALCULATE_ADJUST, ":", 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)
+		}()
+	}
+
+	//获取指标数据
+	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 = "指标名称已存在,请重新填写"
+		return
+	}
+	//指标code生成
+	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)
+
+	// 获取来源指标
+	fromEdbInfo, err := models.GetEdbInfoById(req.FromEdbInfoId)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
+		return
+	}
+	edbInfo, err := models.SaveAdjustEdb(req, fromEdbInfo, edbCode, uniqueCode)
+	if err != nil {
+		br.Msg = "添加指标失败"
+		br.Msg = "添加指标失败,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
+				}
+			}
+		}
+	}
+
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+	resp := models.AddEdbInfoResp{
+		EdbInfoId:  edbInfo.EdbInfoId,
+		UniqueCode: uniqueCode,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 237 - 0
models/base_from_adjust.go

@@ -0,0 +1,237 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_edb_lib/services/alarm_msg"
+	"hongze/hongze_edb_lib/utils"
+	"strings"
+	"time"
+)
+
+// EdbDataAdjust 数据调整指标数据结构体
+type EdbDataAdjust struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+// AddAdjustEdbData 保存数据调整请求的数据的参数
+type AddAdjustEdbData struct {
+	Date         string  `description:"数据日期"`
+	TimestampStr string  `description:"日期时间戳"`
+	Value        float64 `description:"数据值"`
+}
+
+// SaveAdjustEdb 保存数据调整指标
+func SaveAdjustEdb(req SaveAdjustEdbReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string) (edbInfo *EdbInfo, err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+			fmt.Println("SaveAdjustEdb,Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg(" 保存数据调整指标失败:err:"+err.Error(), 3)
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	if req.EdbInfoId <= 0 {
+		edbInfo = &EdbInfo{
+			Source:          utils.DATA_SOURCE_CALCULATE_ADJUST,
+			SourceName:      "数据调整",
+			EdbCode:         edbCode,
+			EdbName:         utils.TrimStr(req.EdbName),
+			EdbNameSource:   utils.TrimStr(req.EdbName),
+			Frequency:       utils.TrimStr(req.Frequency),
+			Unit:            utils.TrimStr(req.Unit),
+			ClassifyId:      req.ClassifyId,
+			SysUserId:       req.AdminId,
+			SysUserRealName: req.AdminName,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			UniqueCode:      uniqueCode,
+			EdbType:         2,
+		}
+		newEdbInfoId, tmpErr := to.Insert(edbInfo)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		edbInfo.EdbInfoId = int(newEdbInfoId)
+
+		//关联关系
+		{
+			calculateMappingItem := new(EdbInfoCalculateMapping)
+			calculateMappingItem.CreateTime = time.Now()
+			calculateMappingItem.ModifyTime = time.Now()
+			calculateMappingItem.Sort = 1
+			calculateMappingItem.EdbCode = edbCode
+			calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
+			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
+			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
+			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
+			calculateMappingItem.FromSource = fromEdbInfo.Source
+			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
+			calculateMappingItem.FromTag = ""
+			calculateMappingItem.Source = edbInfo.Source
+			calculateMappingItem.SourceName = edbInfo.SourceName
+			_, err = to.Insert(calculateMappingItem)
+			if err != nil {
+				return
+			}
+		}
+	} else {
+		edbInfo, err = GetEdbInfoById(req.EdbInfoId)
+		if err != nil {
+			return
+		}
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_ADJUST)
+		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
+		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
+		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
+		if err != nil {
+			return
+		}
+	}
+	dataList := req.DataList
+
+	dataObj := make(map[string]AddAdjustEdbData)
+
+	for _, item := range dataList {
+		currentDate, tmpErr := time.Parse(utils.FormatDate, item.Date)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		timestamp := currentDate.UnixNano() / 1e6
+		timestampStr := fmt.Sprintf("%d", timestamp)
+
+		tmpVal, ok := dataObj[item.Date]
+		if !ok {
+			tmpVal = AddAdjustEdbData{
+				Date:         item.Date,
+				TimestampStr: timestampStr,
+				Value:        item.Value,
+			}
+		} else {
+			tmpVal.Value = item.Value
+		}
+		dataObj[item.Date] = tmpVal
+	}
+
+	var isAdd bool
+	dataTableName := GetEdbDataTableName(edbInfo.Source)
+	addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	for _, item := range dataObj {
+		//值
+		val := item.Value
+		saveVal := utils.SubFloatToString(val, 20)
+		addSql += GetAddSql(fmt.Sprint(edbInfo.EdbInfoId), edbCode, item.Date, item.TimestampStr, saveVal)
+		isAdd = true
+	}
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// RefreshAllAdjustEdb 刷新所有 数据调整指标
+func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshAllPythonEdb,Err:" + err.Error())
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 获取当前指标的最晚的日期
+	dataTableName := GetEdbDataTableName(edbInfo.Source)
+	var maxDate string
+	sql := `SELECT max(data_time) data_time FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&maxDate)
+	if err != nil {
+		return
+	}
+
+	// 查询关联指标的数据
+	var condition string
+	var pars []interface{}
+	condition += " AND edb_info_id=? AND data_time > ? "
+	pars = append(pars, fromEdbInfo.EdbInfoId, maxDate)
+
+	dataList, err := GetEdbDataListAllByTo(to, condition, pars, fromEdbInfo.Source, 1)
+	if err != nil {
+		return err
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	for _, item := range dataList {
+		//格式化时间
+		currentDate, tmpErr := time.Parse(utils.FormatDate, item.DataTime)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		timestamp := currentDate.UnixNano() / 1e6
+		timestampStr := fmt.Sprintf("%d", timestamp)
+
+		//值
+		val := item.Value
+		saveVal := utils.SubFloatToString(val, 20)
+		addSql += GetAddSql(fmt.Sprint(edbInfo.EdbInfoId), edbInfo.EdbCode, item.DataTime, timestampStr, saveVal)
+
+		isAdd = true
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// SaveAdjustEdbReq 保存数据调整请求参数(请求指标服务)
+type SaveAdjustEdbReq struct {
+	AdminId       int                    `description:"添加人id"`
+	AdminName     string                 `description:"添加人名称"`
+	EdbInfoId     int                    `description:"指标id"`
+	FromEdbInfoId int                    `description:"来源指标id"`
+	EdbName       string                 `description:"指标名称"`
+	Frequency     string                 `description:"频度"`
+	Unit          string                 `description:"单位"`
+	ClassifyId    int                    `description:"分类id"`
+	DataList      []SaveAdjustEdbDataReq `description:"指标对应的数据值"`
+}
+
+// SaveAdjustEdbDataReq 保存数据调整请求的数据的参数
+type SaveAdjustEdbDataReq struct {
+	Date  string  `description:"数据日期"`
+	Value float64 `description:"数据值"`
+}

+ 2 - 0
models/edb_data_table.go

@@ -79,6 +79,8 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_calculate_nhcc"
 	case utils.DATA_SOURCE_COM_TRADE:
 		tableName = "edb_data_com_trade"
+	case utils.DATA_SOURCE_CALCULATE_ADJUST:
+		tableName = "edb_data_calculate_adjust"
 	default:
 		tableName = ""
 	}

+ 9 - 0
routers/commentsRouter.go

@@ -16,6 +16,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"],
+        beego.ControllerComments{
+            Method: "SaveAdjust",
+            Router: `/adjust/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"],
         beego.ControllerComments{
             Method: "BatchEdit",

+ 1 - 0
utils/constants.go

@@ -67,6 +67,7 @@ const (
 	DATA_SOURCE_EIA_STEO                         //eia steo报告->36
 	DATA_SOURCE_CALCULATE_NHCC                   //计算指标(拟合残差)->37
 	DATA_SOURCE_COM_TRADE                        //联合国商品贸易数据->38
+	DATA_SOURCE_CALCULATE_ADJUST                 //数据调整->39
 )
 
 //基础数据初始化日期