hsun преди 10 месеца
родител
ревизия
d96498ea4e

+ 361 - 0
controllers/data_manage/bloomberg_data.go

@@ -0,0 +1,361 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services/data"
+	etaTrialService "eta/eta_api/services/eta_trial"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// BloombergDataController 彭博数据源
+type BloombergDataController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 指标列表
+// @Description 指标列表
+// @Param   PageSize  query  int  false  "每页数据量"
+// @Param   CurrentIndex  query  int  false  "页码"
+// @Param   Frequency  query  string  false  "频度"
+// @Param   Keywords  query  string  false  "指标ID/指标名称"
+// @Param   ListAll  query  bool  false  "列表全选"
+// @Param   SortField  query  int  false  "排序字段: 0-默认; 1-开始时间; 2-最新时间; 3-更新时间"
+// @Param   SortRule  query  int  false  "排序方式: 0-默认; 1-正序; 2-倒序"
+// @Success 200 {object} data_manage.BloombergSourceListResp
+// @router /bloomberg_source/list [get]
+func (this *BloombergDataController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	params := new(data_manage.BloombergSourceListReq)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+
+	cond := ``
+	pars := make([]interface{}, 0)
+	// 筛选项
+	{
+		params.Keywords = strings.TrimSpace(params.Keywords)
+		if params.Keywords != "" {
+			cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, data_manage.BaseFromBloombergIndexCols.IndexCode, data_manage.BaseFromBloombergIndexCols.IndexName)
+			kw := fmt.Sprint("%", params.Keywords, "%")
+			pars = append(pars, kw, kw)
+		}
+		if params.Frequency != "" {
+			cond += fmt.Sprintf(` AND %s = ?`, data_manage.BaseFromBloombergIndexCols.Frequency)
+			pars = append(pars, params.Frequency)
+		}
+	}
+
+	// 分页列表
+	bloombergOb := new(data_manage.BaseFromBloombergIndex)
+	total, e := bloombergOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取Bloomberg原始指标列表总数失败, Err: " + e.Error()
+		return
+	}
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+
+	// 排序, 默认创建时间倒序
+	orderFields := map[int]string{
+		0: data_manage.BaseFromBloombergIndexCols.CreateTime, 1: data_manage.BaseFromBloombergIndexCols.StartDate,
+		2: data_manage.BaseFromBloombergIndexCols.EndDate, 3: data_manage.BaseFromBloombergIndexCols.ModifyTime,
+	}
+	orderType := map[int]string{0: "DESC", 1: "ASC", 2: "DESC"}
+	orderRule := fmt.Sprintf("%s %s", orderFields[params.SortField], orderType[params.SortRule])
+	fmt.Println(orderRule)
+
+	// 列表
+	edbList := make([]*data_manage.BaseFromBloombergIndex, 0)
+	if params.ListAll {
+		list, e := bloombergOb.GetItemsByCondition(cond, pars, []string{}, orderRule)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取Bloomberg原始指标列表失败, Err: " + e.Error()
+			return
+		}
+		edbList = list
+	} else {
+		list, e := bloombergOb.GetPageItemsByCondition(cond, pars, []string{}, orderRule, startSize, params.PageSize)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取Bloomberg原始指标分页列表失败, Err: " + e.Error()
+			return
+		}
+		edbList = list
+	}
+
+	respList := make([]*data_manage.BaseFromBloombergIndexItem, 0)
+	for _, v := range edbList {
+		respList = append(respList, data_manage.FormatBaseFromBloombergIndex2Item(v))
+	}
+	page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
+	dataResp := new(data_manage.BloombergSourceListResp)
+	dataResp.Paging = page
+	dataResp.List = respList
+
+	br.Data = dataResp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// BatchAdd
+// @Title 批量新增
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /bloomberg_source/batch_add [post]
+func (this *BloombergDataController) BatchAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_BLOOMBERG_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req []*data_manage.AddEdbInfoReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if len(req) > 30 {
+		br.Msg = "批量添加指标数量不得超过30个"
+		return
+	}
+	indexNames := make([]string, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		v.Frequency = strings.TrimSpace(v.Frequency)
+		if v.Frequency == "" {
+			br.Msg = "请选择频度"
+			return
+		}
+		v.Unit = strings.TrimSpace(v.Unit)
+		if v.Unit == "" {
+			br.Msg = "请输入单位"
+			return
+		}
+		if v.ClassifyId <= 0 {
+			br.Msg = "请选择分类"
+			return
+		}
+	}
+
+	// 限定同一时间最多批量新增30个指标
+	for _, v := range req {
+		var r data.BloombergIndexSource2EdbReq
+		r.EdbCode = v.EdbCode
+		r.EdbName = v.EdbName
+		r.Frequency = v.Frequency
+		r.Unit = v.Unit
+		r.ClassifyId = v.ClassifyId
+		r.AdminId = sysUser.AdminId
+		r.AdminRealName = sysUser.RealName
+
+		edbInfo, e, errMsg, skip := data.BloombergIndexSource2Edb(r)
+		if e != nil {
+			br.Msg = "操作失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = e.Error()
+			return
+		}
+		if skip {
+			continue
+		}
+
+		// 试用平台更新用户累计新增指标数
+		if utils.BusinessCode == utils.BusinessCodeSandbox {
+			go func() {
+				adminItem, e := system.GetSysAdminById(sysUser.AdminId)
+				if e != nil {
+					tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
+					utils.FileLog.Info(tips)
+					return
+				}
+				if adminItem.DepartmentName != "ETA试用客户" {
+					return
+				}
+				var ur etaTrialService.EtaTrialUserReq
+				ur.Mobile = adminItem.Mobile
+				_, _ = etaTrialService.UpdateUserIndexNum(ur)
+			}()
+		}
+
+		// 新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(this.Ctx.Input.RequestBody)
+			edbLog.Status = "新增指标"
+			edbLog.Method = this.Ctx.Input.URI()
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// NameCheck
+// @Title 重名校验
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /bloomberg_source/name_check [post]
+func (this *BloombergDataController) NameCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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.AddEdbInfoReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+
+	type NameCheckResult struct {
+		EdbCode string
+		EdbName string
+		Exist   bool
+	}
+	indexNames := make([]string, 0)
+	resp := make([]*NameCheckResult, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		resp = append(resp, &NameCheckResult{
+			EdbCode: v.EdbCode,
+			EdbName: v.EdbName,
+		})
+	}
+
+	// 重名校验
+	edbList, e := data_manage.GetEdbInfoByNameArr(indexNames)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取重名指标失败, Err: " + e.Error()
+		return
+	}
+	nameExists := make(map[string]bool)
+	for _, v := range edbList {
+		nameExists[v.EdbName] = true
+	}
+	if len(nameExists) > 0 {
+		for _, v := range resp {
+			v.Exist = nameExists[v.EdbName]
+		}
+	}
+
+	br.Data = resp
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Success = true
+}

+ 273 - 0
models/data_manage/base_from_bloomberg_index.go

@@ -0,0 +1,273 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// BaseFromBloombergIndex 彭博原始指标表
+type BaseFromBloombergIndex struct {
+	BaseFromBloombergIndexId int       `orm:"column(base_from_bloomberg_index_id);pk"`
+	IndexCode                string    `description:"指标编码"`
+	IndexName                string    `description:"指标名称"`
+	Unit                     string    `description:"单位"`
+	Source                   int       `description:"数据来源"`
+	Frequency                string    `description:"频度"`
+	StartDate                time.Time `description:"开始日期"`
+	EndDate                  time.Time `description:"结束日期"`
+	Describe                 string    `description:"指标描述"`
+	Sort                     int       `description:"排序"`
+	IsStop                   int       `description:"是否停更:0-否;1-停更"`
+	EdbExist                 int       `description:"指标库是否已添加:0-否;1-是"`
+	TerminalCode             string    `description:"所属终端编码"`
+	FilePath                 string    `description:"文件存储路径"`
+	CreateTime               time.Time `description:"创建时间"`
+	ModifyTime               time.Time `description:"修改时间"`
+}
+
+var BaseFromBloombergIndexCols = struct {
+	BaseFromBloombergIndexId string
+	IndexCode                string
+	IndexName                string
+	Unit                     string
+	Source                   string
+	Frequency                string
+	StartDate                string
+	EndDate                  string
+	Describe                 string
+	Sort                     string
+	IsStop                   string
+	EdbExist                 string
+	TerminalCode             string
+	FilePath                 string
+	CreateTime               string
+	ModifyTime               string
+}{
+	BaseFromBloombergIndexId: "base_from_bloomberg_index_id",
+	IndexCode:                "index_code",
+	IndexName:                "index_name",
+	Unit:                     "unit",
+	Source:                   "source",
+	Frequency:                "frequency",
+	StartDate:                "start_date",
+	EndDate:                  "end_date",
+	Describe:                 "describe",
+	Sort:                     "sort",
+	IsStop:                   "is_stop",
+	EdbExist:                 "edb_exist",
+	TerminalCode:             "terminal_code",
+	FilePath:                 "file_path",
+	CreateTime:               "create_time",
+	ModifyTime:               "modify_time",
+}
+
+func (m *BaseFromBloombergIndex) TableName() string {
+	return "base_from_bloomberg_index"
+}
+
+func (m *BaseFromBloombergIndex) PrimaryId() string {
+	return BaseFromBloombergIndexCols.BaseFromBloombergIndexId
+}
+
+func (m *BaseFromBloombergIndex) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.BaseFromBloombergIndexId = int(id)
+	return
+}
+
+func (m *BaseFromBloombergIndex) CreateMulti(items []*BaseFromBloombergIndex) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *BaseFromBloombergIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *BaseFromBloombergIndex) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.BaseFromBloombergIndexId).Exec()
+	return
+}
+
+func (m *BaseFromBloombergIndex) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	_, err = o.Raw(sql, menuIds).Exec()
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetItemById(id int) (item *BaseFromBloombergIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromBloombergIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromBloombergIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromBloombergIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// BaseFromBloombergIndexItem 彭博原始指标信息
+type BaseFromBloombergIndexItem struct {
+	BaseFromBloombergIndexId int
+	IndexCode                string `description:"指标编码"`
+	IndexName                string `description:"指标名称"`
+	Unit                     string `description:"单位"`
+	Source                   int    `description:"数据来源"`
+	Frequency                string `description:"频度"`
+	StartDate                string `description:"开始日期"`
+	EndDate                  string `description:"结束日期"`
+	Describe                 string `description:"指标描述"`
+	Sort                     int    `description:"排序"`
+	IsStop                   int    `description:"是否停更:0-否;1-停更"`
+	EdbExist                 int    `description:"指标库是否已添加:0-否;1-是"`
+	CreateTime               string `description:"创建时间"`
+	ModifyTime               string `description:"修改时间"`
+}
+
+func FormatBaseFromBloombergIndex2Item(origin *BaseFromBloombergIndex) (item *BaseFromBloombergIndexItem) {
+	if origin == nil {
+		return
+	}
+	item = new(BaseFromBloombergIndexItem)
+	item.BaseFromBloombergIndexId = origin.BaseFromBloombergIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.Unit = origin.Unit
+	item.Source = origin.Source
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.Describe = origin.Describe
+	item.Sort = origin.Sort
+	item.IsStop = origin.IsStop
+	item.EdbExist = origin.EdbExist
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+// BloombergSourceListReq 指标列表筛选
+type BloombergSourceListReq struct {
+	PageSize     int    `form:"PageSize"`
+	CurrentIndex int    `form:"CurrentIndex"`
+	Frequency    string `form:"Frequency" description:"频度"`
+	Keywords     string `form:"Keywords" description:"指标ID/指标名称"`
+	ListAll      bool   `form:"ListAll" description:"列表全选"`
+	SortField    int    `form:"SortField" description:"排序字段: 0-默认; 1-开始时间; 2-最新时间; 3-更新时间"`
+	SortRule     int    `form:"SortRule" description:"排序方式: 0-默认; 1-正序; 2-倒序"`
+}
+
+// BloombergSourceListResp 指标列表响应体
+type BloombergSourceListResp struct {
+	List   []*BaseFromBloombergIndexItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// UpdateEdbExist 标记已添加指标库
+func (m *BaseFromBloombergIndex) UpdateEdbExist(indexCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ? LIMIT 1`, m.TableName(), BaseFromBloombergIndexCols.EdbExist, BaseFromBloombergIndexCols.IndexCode)
+	_, err = o.Raw(sql, 1, indexCode).Exec()
+	return
+}
+
+// --------------------------------------------- 以下为测试用 ---------------------------------------------
+
+// BaseFromBloombergData 彭博原始指标表
+//type BaseFromBloombergData struct {
+//	BaseFromBloombergDataId  int       `orm:"column(base_from_bloomberg_data_id);pk"`
+//	BaseFromBloombergIndexId int       `description:"指标ID"`
+//	IndexCode                string    `description:"指标编码"`
+//	DataTime                 time.Time `description:"数据日期"`
+//	Value                    float64   `description:"数据值"`
+//	CreateTime               time.Time `description:"创建时间"`
+//	ModifyTime               time.Time `description:"修改时间"`
+//	DataTimestamp            int       `description:"数据日期时间戳"`
+//}
+//
+//func (m *BaseFromBloombergData) TableName() string {
+//	return "base_from_bloomberg_data"
+//}
+//
+//func (m *BaseFromBloombergData) Create() (err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	id, err := o.Insert(m)
+//	if err != nil {
+//		return
+//	}
+//	m.BaseFromBloombergDataId = int(id)
+//	return
+//}
+//
+//func (m *BaseFromBloombergData) CreateMulti(items []*BaseFromBloombergData) (err error) {
+//	if len(items) == 0 {
+//		return
+//	}
+//	o := orm.NewOrmUsingDB("data")
+//	_, err = o.InsertMulti(len(items), items)
+//	return
+//}

+ 11 - 0
models/data_manage/edb_info.go

@@ -1846,3 +1846,14 @@ func GetEdbInfoCount(source int, edbCode string) (count int, err error) {
 	err = o.Raw(sql, source, edbCode).QueryRow(&count)
 	return
 }
+
+// GetEdbInfoByNameArr 根据名称获取指标
+func GetEdbInfoByNameArr(names []string) (items []*EdbInfo, err error) {
+	if len(names) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT edb_info_id, edb_code, edb_name FROM edb_info WHERE edb_name IN (%s)`, utils.GetOrmInReplace(len(names)))
+	_, err = o.Raw(sql, names).QueryRows(&items)
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -1735,6 +1735,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"],
+        beego.ControllerComments{
+            Method: "BatchAdd",
+            Router: `/bloomberg_source/batch_add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/bloomberg_source/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:BloombergDataController"],
+        beego.ControllerComments{
+            Method: "NameCheck",
+            Router: `/bloomberg_source/name_check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartClassifyController"],
         beego.ControllerComments{
             Method: "AddChartClassify",

+ 1 - 0
routers/router.go

@@ -164,6 +164,7 @@ func init() {
 				&data_manage.BaseFromNationalStatisticsController{},
 				&data_manage.JiaYueEdbSourceController{},
 				&data_manage.ChartThemeController{},
+				&data_manage.BloombergDataController{},
 			),
 		),
 		web.NSNamespace("/my_chart",

+ 100 - 0
services/data/base_from_bloomberg.go

@@ -0,0 +1,100 @@
+package data
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+type BloombergIndexSource2EdbReq struct {
+	EdbCode       string
+	EdbName       string
+	Frequency     string
+	Unit          string
+	ClassifyId    int
+	AdminId       int
+	AdminRealName string
+}
+
+// BloombergIndexSource2Edb 新增彭博数据源到指标库
+func BloombergIndexSource2Edb(req BloombergIndexSource2EdbReq) (edb *data_manage.EdbInfo, err error, errMsg string, skip bool) {
+	if req.EdbCode == "" {
+		err = fmt.Errorf("指标ID为空")
+		return
+	}
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("BloombergIndexSource2Edb新增失败, Err: %s", err.Error())
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	source := utils.DATA_SOURCE_BLOOMBERG
+
+	// 是否已有指标数据
+	dataList, e := data_manage.GetEdbDataAllByEdbCode(req.EdbCode, source, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
+	if e != nil {
+		err = fmt.Errorf("获取指标数据失败, Err: %s", e.Error())
+		return
+	}
+
+	// 新增指标数据
+	if len(dataList) == 0 {
+		res, e := AddEdbData(source, req.EdbCode, req.Frequency)
+		if e != nil {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, Err: %s", e.Error())
+			return
+		}
+		if res == nil {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, res nil")
+			return
+		}
+		if res.Ret != 200 {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, Ret: %d", res.Ret)
+			return
+		}
+	}
+
+	// 是否新增过指标
+	exist, e := data_manage.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("获取指标是否存在失败, err: %s", e.Error())
+		return
+	}
+	if exist != nil {
+		skip = true
+		return
+	}
+
+	// 开始结束时间
+	var startDate, endDate string
+	minMax, e := data_manage.GetEdbInfoMaxAndMinInfo(source, utils.DATA_SUB_SOURCE_EDB, req.EdbCode)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("MinMax: 获取指标极值失败, err: %s", e.Error())
+		return
+	}
+	if minMax != nil {
+		startDate = minMax.MinDate
+		endDate = minMax.MaxDate
+	}
+
+	// 新增指标库
+	edbInfo, e, msg, _ := EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, startDate, endDate, req.AdminId, req.AdminRealName)
+	if e != nil {
+		errMsg = msg
+		err = fmt.Errorf("EdbInfo: 新增指标失败, err: %s", e.Error())
+		return
+	}
+	edb = edbInfo
+
+	// 标记原始指标为已添加
+	indexOb := new(data_manage.BaseFromBloombergIndex)
+	if e = indexOb.UpdateEdbExist(req.EdbCode); e != nil {
+		err = fmt.Errorf("BaseIndex: 标记已添加指标库失败, err: %s", e.Error())
+		return
+	}
+
+	// 新增es
+	go AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+	return
+}

+ 57 - 0
services/task.go

@@ -40,6 +40,9 @@ func Task() {
 
 	go AutoInsertAdminOperateRecordToDB()
 
+	// 测试用-生成bloomberg数据
+	//go InsertBloombergIndex()
+
 	// TODO:修复权限
 	//FixEnCompanyPermission()
 	fmt.Println("task end")
@@ -476,3 +479,57 @@ func ModifyEsEnglishReport() {
 	}
 	fmt.Println("结束")
 }
+
+//func InsertBloombergIndex() {
+//	fmt.Println("开始写入")
+//
+//	start := 100000
+//	now := time.Now()
+//	for i := 1; i <= 100; i++ {
+//		fmt.Printf("写入第%d个\n", i)
+//
+//		start += 1
+//		index := new(data_manage.BaseFromBloombergIndex)
+//		index.IndexCode = fmt.Sprintf("BLID%d", start)
+//		index.IndexName = fmt.Sprintf("模拟Bloomberg-%s", index.IndexCode)
+//		index.Unit = "无"
+//		index.Source = utils.DATA_SOURCE_BLOOMBERG
+//		index.Frequency = "日度"
+//		index.StartDate = now.AddDate(0, 0, -i)
+//		index.EndDate = now
+//		index.CreateTime = time.Now().Local()
+//		index.ModifyTime = time.Now().Local()
+//		if e := index.Create(); e != nil {
+//			fmt.Printf("新增指标失败, IndexCode: %s, err: %s", index.IndexCode, e.Error())
+//			return
+//		}
+//
+//		insertData := make([]*data_manage.BaseFromBloombergData, 0)
+//		for ii := 0; ii <= 50; ii++ {
+//			indexData := new(data_manage.BaseFromBloombergData)
+//			indexData.BaseFromBloombergIndexId = index.BaseFromBloombergIndexId
+//			indexData.IndexCode = index.IndexCode
+//			indexData.DataTime = now.AddDate(0, 0, -ii)
+//			va := GenerateRandomFloat64InRange()
+//			va += float64(ii)
+//			indexData.Value = va
+//			indexData.CreateTime = time.Now().Local()
+//			indexData.ModifyTime = time.Now().Local()
+//			indexData.DataTimestamp = int(indexData.DataTime.UnixNano() / 1e6)
+//			insertData = append(insertData, indexData)
+//		}
+//		ob := new(data_manage.BaseFromBloombergData)
+//		if e := ob.CreateMulti(insertData); e != nil {
+//			fmt.Printf("新增指标数据失败, IndexCode: %s, err: %s", index.IndexCode, e.Error())
+//			return
+//		}
+//	}
+//
+//	fmt.Println("结束写入")
+//}
+//
+//func GenerateRandomFloat64InRange() float64 {
+//	var rnd = rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数种子
+//
+//	return rnd.Float64()*11000 - 1000
+//}

+ 1 - 0
utils/constants.go

@@ -170,6 +170,7 @@ const (
 	DATA_SOURCE_CALCULATE_RJZ                                   // 日均值计算->75
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->78
 	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
+	DATA_SOURCE_BLOOMBERG                            = 83       // bloomberg彭博数据
 )
 
 // 数据刷新频率