Browse Source

中石油新加坡-Bloomberg

hsun 10 months ago
parent
commit
8c43d587ff

+ 123 - 0
controllers/base_from_bloomberg.go

@@ -148,3 +148,126 @@ func (this *BloombergController) Refresh() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// PCSGRefreshDaily
+// @Title 中石油新加坡-刷新日度指标
+// @Description  中石油新加坡-刷新日度指标
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /pcsg/refresh_daily [post]
+func (this *BloombergController) PCSGRefreshDaily() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	// 获取数据
+	indexes, e := services.GetPCSGBloombergDailyFromBridge()
+	if e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "Bridge-获取PCSG彭博日度指标失败, Err: " + e.Error()
+		return
+	}
+	if len(indexes) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	// 写入数据
+	if e = services.PCSGWrite2BaseBloomberg(indexes); e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "PCSG-写入Bloomberg数据源失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// PCSGRefreshWeekly
+// @Title 中石油新加坡-刷新周度指标
+// @Description  中石油新加坡-刷新周度指标
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /pcsg/refresh_weekly [post]
+func (this *BloombergController) PCSGRefreshWeekly() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	// 获取数据
+	indexes, e := services.GetPCSGBloombergWeeklyFromBridge()
+	if e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "Bridge-获取PCSG彭博周度指标失败, Err: " + e.Error()
+		return
+	}
+	if len(indexes) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	// 写入数据
+	if e = services.PCSGWrite2BaseBloomberg(indexes); e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "PCSG-写入Bloomberg数据源失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// PCSGRefreshMonthly
+// @Title 中石油新加坡-刷新月度指标
+// @Description  中石油新加坡-刷新周度指标
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /pcsg/refresh_monthly [post]
+func (this *BloombergController) PCSGRefreshMonthly() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	// 获取数据
+	indexes, e := services.GetPCSGBloombergMonthlyFromBridge()
+	if e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "Bridge-获取PCSG彭博月度指标失败, Err: " + e.Error()
+		return
+	}
+	if len(indexes) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	// 写入数据
+	if e = services.PCSGWrite2BaseBloomberg(indexes); e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "PCSG-写入Bloomberg数据源失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 149 - 0
models/base_from_bloomberg.go

@@ -9,6 +9,129 @@ import (
 	"time"
 )
 
+// BaseFromBloombergIndex Bloomberg原始指标
+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:"修改时间"`
+}
+
+func (m *BaseFromBloombergIndex) TableName() string {
+	return "base_from_bloomberg_index"
+}
+
+func (m *BaseFromBloombergIndex) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.BaseFromBloombergIndexId = int(id)
+	return
+}
+
+func GetBaseFromBloombergIndexByCode(indexCode string) (item *BaseFromBloombergIndex, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_bloomberg_index WHERE index_code = ? LIMIT 1`
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+// BaseFromBloombergData Bloomberg原始数据
+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 GetBaseFromBloombergDataByCondition(condition string, pars []interface{}) (items []*BaseFromBloombergData, err error) {
+	sub := `SELECT * FROM base_from_bloomberg_data WHERE 1=1  `
+	o := orm.NewOrm()
+	if condition != "" {
+		sub += condition
+	}
+	sql := `SELECT * FROM (` + sub + ` HAVING 1 ORDER BY modify_time DESC) tmp GROUP BY data_time ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func MultiInsertOrUpdateBaseFromBloombergData(inserts, updates []*BaseFromBloombergData) (err error) {
+	o := orm.NewOrm()
+	if len(inserts) > 0 {
+		_, e := o.InsertMulti(len(inserts), inserts)
+		if e != nil {
+			err = fmt.Errorf("insert multi err: %s", e.Error())
+			return
+		}
+	}
+	if len(updates) > 0 {
+		p, e := o.Raw("UPDATE base_from_bloomberg_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ?").Prepare()
+		if e != nil {
+			err = fmt.Errorf("prepare err: %s", e.Error())
+			return
+		}
+		defer func() {
+			_ = p.Close()
+		}()
+		for _, v := range updates {
+			_, e = p.Exec(v.Value, v.IndexCode, v.DataTime.Format(utils.FormatDate))
+			if e != nil {
+				err = fmt.Errorf("update err: %s", e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+func GetBaseFromBloombergIndexMinMax(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_bloomberg_data WHERE index_code = ? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	if err != nil {
+		return
+	}
+
+	// 获取最新值
+	var lastVal float64
+	sql = ` SELECT value AS latest_value FROM base_from_bloomberg_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
+	err = o.Raw(sql, indexCode).QueryRow(&lastVal)
+	if err != nil {
+		return
+	}
+	item.LatestValue = lastVal
+	return
+}
+
+func ModifyBaseFromBloombergIndexMinMax(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE base_from_bloomberg_index SET start_date = ?, end_date = ?, modify_time = NOW() WHERE index_code = ? `
+	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	return
+}
+
 type BloombergData struct {
 	InputValue float64 `orm:"column(value)" description:"值"`
 	DataTime   string  `orm:"column(data_time)" description:"日期"`
@@ -196,3 +319,29 @@ func RefreshEdbDataFromBloomberg(edbInfoId int, edbCode, startDate string) (err
 	}
 	return
 }
+
+// BridgePCSGBloombergResultData 中石油新加坡-指标接口响应体
+type BridgePCSGBloombergResultData struct {
+	Code int                                `json:"code" description:"状态码"`
+	Msg  string                             `json:"msg" description:"提示信息"`
+	Data []BaseFromBloombergApiIndexAndData `json:"data" description:"返回数据"`
+}
+
+// BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据
+type BaseFromBloombergApiIndexAndData struct {
+	BaseFromBloombergIndexId int                             `description:"指标ID"`
+	IndexCode                string                          `description:"指标编码"`
+	IndexName                string                          `description:"指标名称"`
+	Unit                     string                          `description:"单位"`
+	Source                   string                          `description:"来源"`
+	Frequency                string                          `description:"频度"`
+	CreateTime               time.Time                       `description:"创建时间"`
+	ModifyTime               time.Time                       `description:"修改时间"`
+	Data                     []BaseFromBloombergApiIndexData `description:"数据列表"`
+}
+
+// BaseFromBloombergApiIndexData Bloomberg原始指标数据
+type BaseFromBloombergApiIndexData struct {
+	DataTime time.Time `description:"数据日期"`
+	Value    float64   `description:"数据值"`
+}

+ 2 - 0
models/db.go

@@ -129,6 +129,8 @@ func initBaseIndex() {
 		new(BaseFromMtjhIndex),
 		new(BaseFromFenweiIndex),
 		new(BaseFromFenweiData),
+		new(BaseFromBloombergIndex),
+		new(BaseFromBloombergData),
 	)
 }
 

+ 27 - 0
routers/commentsRouter.go

@@ -88,6 +88,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"],
+        beego.ControllerComments{
+            Method: "PCSGRefreshDaily",
+            Router: `/pcsg/refresh_daily`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"],
+        beego.ControllerComments{
+            Method: "PCSGRefreshMonthly",
+            Router: `/pcsg/refresh_monthly`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"],
+        beego.ControllerComments{
+            Method: "PCSGRefreshWeekly",
+            Router: `/pcsg/refresh_weekly`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BloombergController"],
         beego.ControllerComments{
             Method: "Refresh",

+ 313 - 0
services/base_from_pcsg.go

@@ -0,0 +1,313 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services/alarm_msg"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"time"
+)
+
+var (
+	BridgeApiPCSGBloombergDailyUrl   = "/api/pcsg/bloomberg/daily_index"   // 日度指标API
+	BridgeApiPCSGBloombergWeeklyUrl  = "/api/pcsg/bloomberg/weekly_index"  // 周度指标API
+	BridgeApiPCSGBloombergMonthlyUrl = "/api/pcsg/bloomberg/monthly_index" // 月度指标API
+)
+
+// GetPCSGBloombergDailyFromBridge 获取彭博日度指标
+func GetPCSGBloombergDailyFromBridge() (indexes []models.BaseFromBloombergApiIndexAndData, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("GetPCSGBloombergDailyFromBridge-获取彭博日度指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiPCSGBloombergDailyUrl)
+	body := ioutil.NopCloser(strings.NewReader(""))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.BridgePCSGBloombergResultData)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	indexes = result.Data
+	return
+}
+
+// GetPCSGBloombergWeeklyFromBridge 获取彭博周度指标
+func GetPCSGBloombergWeeklyFromBridge() (indexes []models.BaseFromBloombergApiIndexAndData, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("GetPCSGBloombergWeeklyFromBridge-获取彭博周度指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiPCSGBloombergWeeklyUrl)
+	body := ioutil.NopCloser(strings.NewReader(""))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.BridgePCSGBloombergResultData)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	indexes = result.Data
+	return
+}
+
+// GetPCSGBloombergMonthlyFromBridge 获取彭博月度指标
+func GetPCSGBloombergMonthlyFromBridge() (indexes []models.BaseFromBloombergApiIndexAndData, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("GetPCSGBloombergMonthlyFromBridge-获取彭博月度指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiPCSGBloombergMonthlyUrl)
+	body := ioutil.NopCloser(strings.NewReader(""))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.BridgePCSGBloombergResultData)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	indexes = result.Data
+	return
+}
+
+// PCSGWrite2BaseBloomberg 写入彭博数据源
+func PCSGWrite2BaseBloomberg(indexes []models.BaseFromBloombergApiIndexAndData) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("PCSGWrite2BaseBloomberg-写入彭博数据源失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	for _, v := range indexes {
+		if v.IndexCode == "" {
+			continue
+		}
+
+		// 指标是否存在
+		index, e := models.GetBaseFromBloombergIndexByCode(v.IndexCode)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = fmt.Errorf("获取Bloomberg原始指标失败, err: %s", e.Error())
+			return
+		}
+
+		// 新增指标
+		if index == nil {
+			newIndex := new(models.BaseFromBloombergIndex)
+			newIndex.IndexCode = v.IndexCode
+			newIndex.IndexName = v.IndexName
+			newIndex.Unit = v.Unit
+			newIndex.Source = utils.DATA_SOURCE_BLOOMBERG
+			newIndex.Frequency = v.Frequency
+			newIndex.CreateTime = time.Now().Local()
+			newIndex.ModifyTime = time.Now().Local()
+			if e = newIndex.Create(); e != nil {
+				err = fmt.Errorf("新增Bloomberg原始指标失败, err: %s", e.Error())
+				return
+			}
+			index = newIndex
+		}
+
+		// 更新指标数据
+		var cond string
+		var pars []interface{}
+		cond += ` AND index_code = ? `
+		pars = append(pars, v.IndexCode)
+		indexData, e := models.GetBaseFromBloombergDataByCondition(cond, pars)
+		if e != nil {
+			err = fmt.Errorf("获取Bloomberg历史数据失败, err: %s", e.Error())
+			return
+		}
+		dateExist := make(map[string]*models.BaseFromBloombergData)
+		if len(indexData) > 0 {
+			for _, d := range indexData {
+				strDate := d.DataTime.Format(utils.FormatDate)
+				dateExist[strDate] = d
+			}
+		}
+
+		// 筛选新增/更新数据
+		updateData := make([]*models.BaseFromBloombergData, 0)
+		insertData := make([]*models.BaseFromBloombergData, 0)
+		for _, d := range v.Data {
+			strDate := d.DataTime.Format(utils.FormatDate)
+			originData := dateExist[strDate]
+			if originData != nil {
+				if utils.FloatAlmostEqual(originData.Value, d.Value) {
+					continue
+				}
+				originData.Value = d.Value
+				originData.ModifyTime = time.Now().Local()
+				updateData = append(updateData, originData)
+			} else {
+				newData := new(models.BaseFromBloombergData)
+				newData.BaseFromBloombergIndexId = index.BaseFromBloombergIndexId
+				newData.IndexCode = index.IndexCode
+				newData.DataTime = d.DataTime
+				newData.Value = d.Value
+				newData.CreateTime = time.Now()
+				newData.ModifyTime = time.Now()
+				timestamp := d.DataTime.UnixNano() / 1e6
+				newData.DataTimestamp = int(timestamp)
+				insertData = append(insertData, newData)
+			}
+		}
+		if e = models.MultiInsertOrUpdateBaseFromBloombergData(insertData, updateData); e != nil {
+			err = fmt.Errorf("新增/更新Bloomberg指标数据失败, err: %s", e.Error())
+			return
+		}
+
+		// 更新指标开始结束时间
+		minMax, e := models.GetBaseFromBloombergIndexMinMax(index.IndexCode)
+		if e == nil && minMax != nil {
+			e = models.ModifyBaseFromBloombergIndexMinMax(index.IndexCode, minMax)
+			if e != nil {
+				err = fmt.Errorf("更新Bloomberg开始结束时间失败, err: %s", e.Error())
+				return
+			}
+		}
+
+		// 同步刷新指标库
+		go func() {
+			edb, e := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_BLOOMBERG, index.IndexCode)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				utils.FileLog.Info("获取Bloomberg指标库信息失败, err: " + e.Error())
+				return
+			}
+			if edb != nil {
+				logic.RefreshBaseEdbInfo(edb, ``)
+			}
+		}()
+	}
+	return
+}

+ 6 - 0
utils/common.go

@@ -1218,3 +1218,9 @@ func DealExcelDate(date string) (newDate time.Time, err error) {
 	}
 	return
 }
+
+// FloatAlmostEqual 判断两个浮点数是否相等
+func FloatAlmostEqual(a, b float64) bool {
+	epsilon := 1e-9 // 容差值
+	return math.Abs(a-b) <= epsilon
+}