Browse Source

新增指标添加接口

tuoling805 1 year ago
parent
commit
9d380c1194
7 changed files with 391 additions and 2 deletions
  1. 59 0
      controllers/edb_classify.go
  2. 116 0
      controllers/edb_info.go
  3. 80 1
      models/edb_classify.go
  4. 107 0
      models/edb_info.go
  5. 9 0
      routers/commentsRouter.go
  6. 10 0
      routers/router.go
  7. 10 1
      utils/config.go

+ 59 - 0
controllers/edb_classify.go

@@ -0,0 +1,59 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/utils"
+)
+
+// 指标分类
+type EdbClassifyController struct {
+	BaseAuthController
+}
+
+// @Title 查询/新增分类
+// @Description 查询/新增分类接口
+// @Param	request	body models.AddEdbClassifyReq true "type json string"
+// @Success 200 {object} models.EdbClassify
+// @router /classify/get_or_add [post]
+func (this *EdbClassifyController) AddEdbClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddEdbClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+	if req.ParentId < 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	//添加指标
+	edbClassify, err, errMsg := models.SaveEdbClassify(req.ClassifyName, req.ParentId, req.Level, req.ClassifyType, utils.InitAdminId, utils.InitAdminName)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = errMsg + ";Err:" + err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.Data = edbClassify
+}

+ 116 - 0
controllers/edb_info.go

@@ -0,0 +1,116 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_edb_lib/logic"
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/services"
+	"hongze/hongze_edb_lib/utils"
+	"strconv"
+	"time"
+)
+
+// 指标
+type EdbInfoController struct {
+	BaseAuthController
+}
+
+// @Title 新增指标接口
+// @Description  新增指标接口
+// @Success 200 {object} models.AddEdbInfoParams
+// @router /add [post]
+func (this *EdbInfoController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req models.AddEdbInfoParams
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	deleteCache := true
+	cacheKey = "CACHE_EDB_INFO_ADD_" + req.EdbCode
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!"
+		return
+	}
+
+	if req.ClassifyId <= 0 {
+		br.Msg = "请输入指标分类!"
+		br.ErrMsg = "请输入指标分类"
+		return
+	}
+	if req.Source <= 0 {
+		br.Msg = "请输入指标来源!"
+		br.ErrMsg = "请输入指标来源"
+		return
+	}
+	if req.EdbName == "" {
+		br.Msg = "请输入指标名称!"
+		br.ErrMsg = "请输入指标名称"
+		return
+	}
+	if req.Frequency == "" {
+		br.Msg = "请输入指标频度!"
+		br.ErrMsg = "请输入指标频度"
+		return
+	}
+	if req.Unit == "" {
+		br.Msg = "请输入指标单位!"
+		br.ErrMsg = "请输入指标单位"
+		return
+	}
+	var isAdd bool
+	item, err := models.GetEdbInfoByEdbCode(req.Source, req.EdbCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			isAdd = true
+		} else {
+			br.Msg = "判断指标是否存在失败!"
+			br.ErrMsg = "判断指标是否存在失败"
+			return
+		}
+	}
+	if item != nil && item.EdbInfoId <= 0 {
+		isAdd = true
+	}
+	var windUrl string
+	if isAdd {
+		if req.Source == utils.DATA_SOURCE_WIND {
+			windUrl, err = services.GetWindUrl(req.EdbCode)
+			if err != nil {
+				br.Msg = "判断失败!"
+				br.ErrMsg = "判断失败,Err:" + err.Error()
+				return
+			}
+		}
+	}
+	admnId, _ := strconv.Atoi(utils.InitAdminId)
+	edbInfo, err := models.EdbInfoAdd(&req, windUrl, admnId, utils.InitAdminName)
+	if err != nil {
+		br.Msg = "新增指标失败!"
+		br.ErrMsg = "新增指标失败,Err:" + err.Error()
+		return
+	}
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+}

+ 80 - 1
models/edb_classify.go

@@ -2,6 +2,8 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_edb_lib/utils"
+	"strconv"
 	"time"
 )
 
@@ -20,6 +22,12 @@ type EdbClassify struct {
 	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
 }
 
+func AddEdbClassify(item *EdbClassify) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
 func GetEdbClassifyById(classifyId int) (item *EdbClassify, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM edb_classify WHERE classify_id=? `
@@ -33,7 +41,7 @@ type EdbClassifySimplify struct {
 	ParentId     int
 }
 
-//递归获取所有目录
+// 递归获取所有目录
 func GetClassifyAllByClassifyId(classifyId int) (resultList []*EdbClassifySimplify, err error) {
 	o := orm.NewOrm()
 	for {
@@ -52,3 +60,74 @@ func GetClassifyAllByClassifyId(classifyId int) (resultList []*EdbClassifySimpli
 	}
 	return resultList, err
 }
+
+// 判断分类名称是否存在
+func GetEdbClassifyCount(classifyName string, parentId int, classifyType uint8) (item *EdbClassify, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM edb_classify WHERE parent_id=? AND classify_name=? AND classify_type = ? `
+	err = o.Raw(sql, parentId, classifyName, classifyType).QueryRow(&item)
+	return
+}
+
+// GetEdbClassifyMaxSort 获取分类下最大的排序数
+func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT Max(sort) AS sort FROM edb_classify WHERE parent_id=? AND classify_type=? `
+	err = o.Raw(sql, parentId, classifyType).QueryRow(&sort)
+	return
+}
+
+type AddEdbClassifyReq struct {
+	ClassifyName string `description:"分类名称"`
+	ParentId     int    `description:"父级id,第一级传0"`
+	Level        int    `description:"层级,第一级传0,其余传上一级的层级"`
+	ClassifyType uint8  `description:"分类类型,0:普通指标分类,1:预测指标分类"`
+}
+
+// AddEdbClassify 添加指标分类
+func SaveEdbClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId, sysUserName string) (classifyInfo *EdbClassify, err error, errMsg string) {
+	edbClassify, err := GetEdbClassifyCount(classifyName, parentId, classifyType)
+
+	var isAdd bool
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			isAdd = true
+		} else {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+	}
+
+	if edbClassify != nil && edbClassify.ClassifyId > 0 {
+		classifyInfo = edbClassify
+		return edbClassify, nil, ""
+	} else {
+		isAdd = true
+	}
+	if isAdd {
+		sysUserIdInt, _ := strconv.Atoi(sysUserId)
+		//获取该层级下最大的排序数
+		maxSort, err := GetEdbClassifyMaxSort(parentId, classifyType)
+
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		classifyInfo = &EdbClassify{
+			//ClassifyId:      0,
+			ClassifyType:    classifyType,
+			ClassifyName:    classifyName,
+			ParentId:        parentId,
+			HasData:         0,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			SysUserId:       sysUserIdInt,
+			SysUserRealName: sysUserName,
+			Level:           level + 1,
+			UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+			Sort:            maxSort,
+		}
+		_, err = AddEdbClassify(classifyInfo)
+		if err != nil {
+			errMsg = "保存分类失败"
+		}
+	}
+	return
+}

+ 107 - 0
models/edb_info.go

@@ -1012,3 +1012,110 @@ type EdbInfoDetailResp struct {
 	ChartImage    string  `description:"图表图片"`
 	DataList      []*EdbInfoSearchData
 }
+
+type AddEdbInfoParams struct {
+	Source     int    `description:"来源id"`
+	EdbCode    string `description:"指标编码"`
+	EdbName    string `description:"指标名称"`
+	Frequency  string `description:"频率"`
+	Unit       string `description:"单位"`
+	ClassifyId int    `description:"分类id"`
+}
+
+// EdbInfoAdd 添加指标到指标库
+func EdbInfoAdd(req *AddEdbInfoParams, serverUrl string, sysUserId int, sysUserRealName string) (edbInfo *EdbInfo, err error) {
+	source := req.Source
+	//判断指标名称是否存在
+	var condition string
+	var pars []interface{}
+	//condition += " AND source=? "
+	//pars = append(pars, source)
+
+	condition += " AND edb_name=? "
+	pars = append(pars, req.EdbName)
+
+	count, err := GetEdbInfoCountByCondition(condition, pars)
+	if err != nil {
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		err = errors.New("指标名称已存在,请重新填写")
+		return
+	}
+
+	edbInfo = new(EdbInfo)
+	edbInfo.Source = source
+	sourceNameMap := map[int]string{
+		utils.DATA_SOURCE_THS:                 "同花顺",
+		utils.DATA_SOURCE_WIND:                "wind",
+		utils.DATA_SOURCE_PB:                  "彭博",
+		utils.DATA_SOURCE_PB_FINANCE:          "彭博财务",
+		utils.DATA_SOURCE_MANUAL:              "手工数据",
+		utils.DATA_SOURCE_LZ:                  "隆众",
+		utils.DATA_SOURCE_YS:                  "SMM",
+		utils.DATA_SOURCE_GL:                  "钢联",
+		utils.DATA_SOURCE_ZZ:                  "郑商所",
+		utils.DATA_SOURCE_DL:                  "大商所",
+		utils.DATA_SOURCE_SH:                  "上期所",
+		utils.DATA_SOURCE_CFFEX:               "中金所",
+		utils.DATA_SOURCE_SHFE:                "上期能源",
+		utils.DATA_SOURCE_GIE:                 "欧洲天然气",
+		utils.DATA_SOURCE_LT:                  "路透",
+		utils.DATA_SOURCE_COAL:                "中国煤炭网",
+		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
+		utils.DATA_SOURCE_COM_TRADE:           "UN",
+		utils.DATA_SOURCE_SCI:                 "SCI",
+		utils.DATA_SOURCE_BAIINFO:             "BAIINFO",
+		utils.DATA_SOURCE_STOCK_PLANT:         "存量装置",
+		utils.DATA_SOURCE_NATIONAL_STATISTICS: "国家统计局",
+		utils.DATA_SOURCE_FUBAO:               "富宝数据",
+	}
+
+	sourceName, ok := sourceNameMap[source]
+	if !ok {
+		err = errors.New("指标来源异常")
+		return
+	}
+	edbInfo.SourceName = sourceName
+
+	edbType := 1 //基础指标
+	if source == utils.DATA_SOURCE_STOCK_PLANT {
+		edbType = 2 //计算指标
+	}
+
+	edbInfo.EdbCode = req.EdbCode
+	edbInfo.EdbName = req.EdbName
+	edbInfo.EdbNameSource = req.EdbName
+	edbInfo.Frequency = req.Frequency
+	edbInfo.Unit = req.Unit
+	edbInfo.ClassifyId = req.ClassifyId
+	edbInfo.SysUserId = sysUserId
+	edbInfo.SysUserRealName = sysUserRealName
+	edbInfo.CreateTime = time.Now()
+	edbInfo.ModifyTime = time.Now()
+	edbInfo.ServerUrl = serverUrl
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	itemVal, err := GetEdbInfoMaxAndMinInfo(source, req.EdbCode)
+	if itemVal != nil && err == nil {
+		edbInfo.MaxValue = itemVal.MaxValue
+		edbInfo.MinValue = itemVal.MinValue
+	}
+	edbInfo.EdbType = edbType
+	edbInfoId, err := AddEdbInfo(edbInfo)
+	if err != nil {
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	edbInfo.EdbInfoId = int(edbInfoId)
+
+	maxAndMinItem, _ := GetEdbInfoMaxAndMinInfo(source, req.EdbCode)
+	if maxAndMinItem != nil {
+		err = ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
+	}
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -196,6 +196,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:EdbClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "AddEdbClassify",
+            Router: `/classify/get_or_add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:EiaSteoController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:EiaSteoController"],
         beego.ControllerComments{
             Method: "Add",

+ 10 - 0
routers/router.go

@@ -171,6 +171,16 @@ func init() {
 				&open.EdbInfoController{},
 			),
 		),
+		beego.NSNamespace("/classify",
+			beego.NSInclude(
+				&controllers.EdbClassifyController{},
+			),
+		),
+		beego.NSNamespace("/edb_info",
+			beego.NSInclude(
+				&controllers.EdbInfoController{},
+			),
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 10 - 1
utils/config.go

@@ -75,6 +75,12 @@ var (
 	ES_PASSWORD string // ES密码
 )
 
+// 初始化数据用户信息
+var (
+	InitAdminId   string
+	InitAdminName string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -182,7 +188,10 @@ func init() {
 	}
 
 	// 数据指标库ES索引名称
-	DATA_INDEX_NAME = config["data_index_name"]
+	InitAdminId = config["init_admin_id"]
+
+	//初始化数据用户配置
+	InitAdminName = config["init_admin_name"]
 
 	// 初始化ES
 	initEs()