Browse Source

嘉悦数据宝

hsun 1 year ago
parent
commit
bc16de2be8

+ 1 - 0
.gitignore

@@ -6,3 +6,4 @@
 /.idea
 /.idea/
 /.DS_Store
+*.tar.gz

+ 70 - 2
controllers/data_manage/edb_info.go

@@ -1548,8 +1548,76 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				isAdd = true
 			}
 		} else {
-			br.Msg = "无效的数据来源"
-			return
+			// 代码中没有的来源那么从edb_source中找是否有对应的
+			sourceItem := data_manage.EdbSourceIdMap[source]
+			if sourceItem == nil {
+				br.Msg = "无效指标来源"
+				return
+			}
+
+			// 获取指标数据
+			dataList, e := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取指标数据失败, Err: " + e.Error()
+				return
+			}
+			if len(dataList) > 0 {
+				searchItem.EdbCode = edbCode
+				searchItem.DataList = dataList
+				// 获取最大最小值
+				edbInfoMaxAndMinInfo, e := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取数据失败, GetEdbInfoMaxAndMinInfo Err:" + e.Error()
+					return
+				}
+				if edbInfoMaxAndMinInfo != nil {
+					searchItem.StartDate = edbInfoMaxAndMinInfo.MinDate
+					searchItem.EndDate = edbInfoMaxAndMinInfo.MaxDate
+				}
+			} else {
+				// 新增指标数据
+				addRes, e := data.AddEdbData(source, edbCode)
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取失败,Err:" + e.Error()
+					return
+				}
+				if addRes == nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "新增指标数据失败, addRes nil"
+					return
+				}
+				if addRes.Ret != 200 {
+					br.Msg = "未搜索到该指标, " + addRes.Msg
+					//br.ErrMsg = addRes.ErrMsg + ";EdbCode:" + edbCode
+					br.Success = true
+					return
+				}
+				isAdd = true
+			}
+
+			// 指标来源于桥接服务: 桥接服务获取指标取频度信息等
+			if sourceItem.BridgeFlag != "" {
+				bridgeOb := data.InitBridgeOB(sourceItem.BridgeFlag)
+				if bridgeOb != nil {
+					var r data.GetIndexFromBridgeReq
+					r.IndexCode = edbCode
+					r.Source = sourceItem.EdbSourceId
+					r.SourceExtend = sourceItem.SourceExtend
+					r.IndexCodeRequired = sourceItem.EdbCodeRequired
+					bridgeIndex, e := bridgeOb.GetIndex(r)
+					if e != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "桥接服务获取指标信息失败, Err: " + e.Error()
+						return
+					}
+					searchItem.EdbName = bridgeIndex.IndexName
+					searchItem.Frequency = bridgeIndex.Frequency
+					searchItem.Unit = bridgeIndex.Unit
+				}
+			}
 		}
 		if isAdd {
 			dataList, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)

+ 4 - 1
models/data_manage/edb_data_base.go

@@ -157,7 +157,10 @@ func GetEdbDataTableName(source int) (tableName string) {
 	case utils.DATA_SOURCE_CALCULATE_RJZ: //日均值->75
 		tableName = "edb_data_calculate_rjz"
 	default:
-		tableName = ""
+		edbSource := EdbSourceIdMap[source]
+		if edbSource != nil {
+			tableName = edbSource.TableName
+		}
 	}
 	return
 }

+ 39 - 4
models/data_manage/edb_source.go

@@ -1,17 +1,29 @@
 package data_manage
 
 import (
+	"eta/eta_mobile/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"strings"
 )
 
+var (
+	EdbSourceIdMap       map[int]*EdbSource // 指标来源
+	EdbSourceExtendIdMap map[string]int     // 指标来源字符串对应来源ID
+)
+
 // EdbSource 指标来源表
 type EdbSource struct {
-	EdbSourceId int    `orm:"column(edb_source_id);pk"`
-	SourceName  string `description:"指标来源名称"`
-	TableName   string `description:"数据表名"`
-	IsBase      int    `description:"是否为基础指标: 0-否; 1-是"`
+	EdbSourceId      int    `orm:"column(edb_source_id);pk"`
+	SourceName       string `description:"指标来源名称"`
+	TableName        string `description:"数据表名"`
+	EdbAddMethod     string `description:"指标新增接口"`
+	EdbRefreshMethod string `description:"指标刷新接口"`
+	IsBase           int    `description:"是否为基础指标: 0-否; 1-是"`
+	FromBridge       int    `description:"是否来源于桥接服务: 0-否; 1-是"`
+	BridgeFlag       string `description:"桥接服务对象标识"`
+	SourceExtend     string `description:"扩展字段做查询用"`
+	EdbCodeRequired  int    `description:"指标编码是否必填: 0-否; 1-是"`
 }
 
 // GetEdbSourceItemsByCondition 获取指标来源
@@ -29,3 +41,26 @@ func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// InitEdbSource 初始化时加载指标来源对应信息, 避免循环中查库, 注意edb_source表修改table_name的话需要重启服务
+func InitEdbSource() {
+	EdbSourceIdMap = make(map[int]*EdbSource)
+	EdbSourceExtendIdMap = make(map[string]int)
+	sources, e := GetEdbSourceItemsByCondition(``, make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		utils.FileLog.Info("init source table err: %s", e.Error())
+		return
+	}
+	for _, v := range sources {
+		EdbSourceIdMap[v.EdbSourceId] = v
+		if v.SourceExtend != "" {
+			arr := strings.Split(v.SourceExtend, ",")
+			if len(arr) == 0 {
+				continue
+			}
+			for _, s := range arr {
+				EdbSourceExtendIdMap[s] = v.EdbSourceId
+			}
+		}
+	}
+}

+ 147 - 0
models/data_manage/jiayue_index.go

@@ -0,0 +1,147 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// DictIndex 嘉悦指标表
+type DictIndex struct {
+	Id                int       `description:"主键"`
+	Code              string    `description:"指标编码"`
+	Name              string    `description:"指标名称"`
+	Unit              string    `description:"单位"`
+	Frequency         string    `description:"更新频率"`
+	Description       string    `description:"描述"`
+	TableName         string    `description:"指标数据存储库表"`
+	SourceType        string    `description:"指标来源,如:wind:万德;manual:手工导入;formula:公式;webisite:网页爬取"`
+	SourceCode        string    `description:"来源编码"`
+	SourceDescription string    `description:"来源说明"`
+	Industry          string    `description:"品种板块"`
+	Type              string    `description:"指标类型"`
+	Commodity         string    `description:"商品名称"`
+	SjbId             int       `description:"SJB_ID"`
+	UserId            int       `description:"所属用户"`
+	RowsCount         int       `description:"指标数据数量"`
+	DateFirst         time.Time `description:"指标开始时间"`
+	DateLast          time.Time `description:"指标最新时间"`
+	TimeLastUpdate    time.Time `description:"最新更新时间"`
+	TimeLastRequest   time.Time `description:"下次更新时间"`
+	Priority          int       `description:"更新优先级"`
+	Status            int       `description:"指标状态"`
+	ShortName         string    `description:"指标简称"`
+	UpdateDescription string    `description:"更新说明"`
+	ForecastFlag      int       `description:"预测标识"`
+	ManualFlag        int       `description:"手动标识"`
+	VariableFlag      int       `description:"有效标识"`
+	MarketDataFlag    int       `description:"市场价标识"`
+	CreateUser        int       `description:"创建用户"`
+	CreateTime        time.Time `description:"创建时间"`
+	UpdateUser        int       `description:"更新用户"`
+	UpdateTime        time.Time `description:"更新时间"`
+}
+
+// BridgeJiaYueIndexParams 桥接服务-获取嘉悦指标入参
+type BridgeJiaYueIndexParams struct {
+	IndexCode         string `json:"index_code" form:"index_code" description:"指标编码"`
+	SourceExtend      string `json:"source_extend" form:"source_extend" description:"来源"`
+	IndexCodeRequired int    `json:"index_code_required" form:"index_code_required" description:"指标编码是否必填: 0-否; 1-是"`
+}
+
+// BridgeJiaYueIndexDataParams 桥接服务-获取嘉悦指标数据入参
+type BridgeJiaYueIndexDataParams struct {
+	BridgeJiaYueIndexParams
+	StartDate string `json:"start_date" form:"start_date" description:"开始日期"`
+	EndDate   string `json:"end_date" form:"end_date" description:"结束日期"`
+}
+
+// BridgeJiaYueResultIndexData 桥接服务-获取嘉悦指标数据响应体
+type BridgeJiaYueResultIndexData struct {
+	Code int                      `json:"code" description:"状态码"`
+	Msg  string                   `json:"msg" description:"提示信息"`
+	Data BridgeJiaYueIndexAndData `json:"data" description:"返回数据"`
+}
+
+// BridgeJiaYueIndexAndData 桥接服务-嘉悦指标和数据
+type BridgeJiaYueIndexAndData struct {
+	Id             int                     `description:"指标自增ID" json:"id"`
+	IndexCode      string                  `description:"指标编码" json:"index_code"`
+	IndexName      string                  `description:"指标名称" json:"index_name"`
+	Unit           string                  `description:"单位" json:"unit"`
+	Frequency      string                  `description:"频度" json:"frequency"`
+	LastDate       time.Time               `description:"指标最新时间" json:"last_date"`
+	LastUpdateTime time.Time               `description:"最新更新时间" json:"last_update_time"`
+	Status         int                     `description:"指标状态" json:"status"`
+	IndexData      []BridgeJiaYueIndexData `description:"指标数据" json:"index_data"`
+}
+
+// BridgeJiaYueIndexData 桥接服务-嘉悦指标数据
+type BridgeJiaYueIndexData struct {
+	Val        float64   `json:"val"`
+	DataTime   time.Time `json:"data_time"`
+	UpdateTime time.Time `json:"update_time"`
+}
+
+// BridgeJiaYueResultFrequencyList 桥接服务-频度列表响应体
+type BridgeJiaYueResultFrequencyList struct {
+	Code int      `json:"code" description:"状态码"`
+	Msg  string   `json:"msg" description:"提示信息"`
+	Data []string `json:"data" description:"返回数据"`
+}
+
+// BridgeJiaYueResultIndexPageList 桥接服务-指标分页列表响应体
+type BridgeJiaYueResultIndexPageList struct {
+	Code int                       `json:"code" description:"状态码"`
+	Msg  string                    `json:"msg" description:"提示信息"`
+	Data BridgeJiaYuePageIndexResp `json:"data" description:"返回数据"`
+}
+
+// BridgeJiaYuePageIndexReq 桥接服务-指标分页列表请求体
+type BridgeJiaYuePageIndexReq struct {
+	SourceExtend string `json:"source_extend" form:"source_extend" description:"来源"`
+	Keyword      string `json:"keyword" form:"keyword" description:"关键词"`
+	Frequency    string `json:"frequency" form:"frequency" description:"频度"`
+	PageIndex    int    `json:"page_index" form:"page_index" description:"当前页码"`
+	PageSize     int    `json:"page_size" form:"page_size" description:"每页数据量"`
+	SortField    int    `json:"sort_field" form:"sort_field" description:"排序字段: 1-指标开始时间; 2-指标最新时间; 3-更新时间"`
+	SortRule     int    `json:"sort_rule" form:"sort_rule" description:"排序方式: 1-正序; 2-倒序"`
+}
+
+// BridgeJiaYuePageIndexResp 桥接服务-指标分页列表响应体
+type BridgeJiaYuePageIndexResp struct {
+	Total int         `description:"数据总量"`
+	List  []DictIndex `description:"列表数据"`
+}
+
+// JiaYueIndexPageListResp 指标分页列表响应体
+type JiaYueIndexPageListResp struct {
+	List   []*DictIndexItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// DictIndexItem 指标信息
+type DictIndexItem struct {
+	Id             int    `description:"主键"`
+	Code           string `description:"指标编码"`
+	Name           string `description:"指标名称"`
+	Unit           string `description:"单位"`
+	Frequency      string `description:"频度"`
+	DateFirst      string `description:"指标开始时间"`
+	DateLast       string `description:"指标最新时间"`
+	TimeLastUpdate string `description:"最新更新时间"`
+}
+
+// FormatDictIndex2Item 格式化数据宝指标信息
+func FormatDictIndex2Item(origin DictIndex) (item *DictIndexItem) {
+	item = new(DictIndexItem)
+	item.Id = origin.Id
+	item.Code = origin.SourceCode
+	item.Name = origin.Name
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.DateFirst = utils.TimeTransferString(utils.FormatDate, origin.DateFirst)
+	item.DateLast = utils.TimeTransferString(utils.FormatDate, origin.DateLast)
+	item.TimeLastUpdate = utils.TimeTransferString(utils.FormatDateTime, origin.TimeLastUpdate)
+	return
+}

+ 10 - 7
models/db.go

@@ -105,6 +105,9 @@ func init() {
 
 	// 商家配置
 	initBusinessConf()
+
+	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
+	data_manage.InitEdbSource()
 }
 
 // initSystem 系统表 数据表
@@ -216,12 +219,12 @@ func initEnglishReport() {
 		new(EnglishReportEmail),
 		new(EnglishReportEmailLog),
 		new(EnglishClassify),
-		new(EnglishCompany),           // 英文客户
-		new(EnglishCompanyTodo),       // 英文客户TODO任务
-		new(EnglishVideo),             // 英文研报线上路演
-		new(EnPermission),             // 英文品种权限表
-		new(EnCompanyPermission),      // 英文客户品种权限关联表
-		new(EnClassifyPermission),     // 英文分类品种权限关联表
+		new(EnglishCompany),       // 英文客户
+		new(EnglishCompanyTodo),   // 英文客户TODO任务
+		new(EnglishVideo),         // 英文研报线上路演
+		new(EnPermission),         // 英文品种权限表
+		new(EnCompanyPermission),  // 英文客户品种权限关联表
+		new(EnClassifyPermission), // 英文分类品种权限关联表
 	)
 }
 
@@ -245,4 +248,4 @@ func initBusinessConf() {
 		new(BusinessConf),                // 商家配置表
 		new(BusinessConfOperationRecord), // 商家配置操作记录表
 	)
-}
+}

+ 52 - 0
services/data/base_bridge.go

@@ -0,0 +1,52 @@
+package data
+
+import "time"
+
+// EdbBridge 桥接数据源接口(算了别用了难用的一批, 不如直接判断商户号来的方便快捷...)
+type EdbBridge interface {
+	GetIndex(GetIndexFromBridgeReq) (BridgeIndexItem, error)
+	//GetIndexAndData(GetIndexAndDataFromBridgeReq) (BridgeIndexItem, error)
+}
+
+// GetIndexFromBridgeReq 获取指标信息请求体
+type GetIndexFromBridgeReq struct {
+	IndexCode         string `description:"指标编码"`
+	Source            int    `description:"指标来源ID"`
+	SourceExtend      string `description:"指标来源(用作查询条件)"`
+	IndexCodeRequired int    `description:"指标编码是否必填: 0-否; 1-是"`
+}
+
+// GetIndexAndDataFromBridgeReq 获取指标数据请求体
+type GetIndexAndDataFromBridgeReq struct {
+	IndexCode    string `description:"指标编码"`
+	Source       int    `description:"指标来源ID"`
+	SourceExtend string `description:"指标来源(用作查询条件)"`
+	StartDate    string `description:"数据开始日期"`
+	EndDate      string `description:"数据结束日期"`
+}
+
+// BridgeIndexItem 桥接服务指标信息
+type BridgeIndexItem struct {
+	Id        int                   `description:"自增ID"`
+	IndexCode string                `description:"指标编码"`
+	IndexName string                `description:"指标名称"`
+	Unit      string                `description:"单位"`
+	Frequency string                `description:"频度"`
+	Data      []BridgeIndexDataItem `description:"数据值"`
+}
+
+// BridgeIndexDataItem 桥接服务指标数据信息
+type BridgeIndexDataItem struct {
+	Val        float64   `description:"数据值"`
+	DataTime   time.Time `description:"数据日期"`
+	UpdateTime time.Time `description:"更新时间"`
+}
+
+// InitBridgeOB 初始化桥接服务
+func InitBridgeOB(bridgeKey string) EdbBridge {
+	switch bridgeKey {
+	case "bridge_jiayue":
+		return new(EdbBridgeJiaYue) // 嘉悦物产
+	}
+	return nil
+}

+ 11 - 0
services/data/base_edb_lib.go

@@ -15,6 +15,7 @@ import (
 func AddEdbData(source int, edbCode string) (resp *models.BaseResponse, err error) {
 	param := make(map[string]interface{})
 	param["EdbCode"] = edbCode
+	param["Source"] = source
 	urlStr := ``
 	switch source {
 	case utils.DATA_SOURCE_THS:
@@ -66,6 +67,10 @@ func AddEdbData(source int, edbCode string) (resp *models.BaseResponse, err erro
 	case utils.DATA_SOURCE_FUBAO:
 		urlStr = "fubao/add"
 	default:
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			urlStr = edbSource.EdbAddMethod
+		}
 	}
 	if urlStr == "" {
 		err = fmt.Errorf("未实现该指标的刷新接口,请联系管理员")
@@ -92,6 +97,7 @@ func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *mod
 	param["EdbCode"] = edbCode
 	param["EdbInfoId"] = edbInfoId
 	param["StartDate"] = startDate
+	param["Source"] = source
 	urlStr := ``
 	switch source {
 	case utils.DATA_SOURCE_THS:
@@ -146,6 +152,11 @@ func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *mod
 		urlStr = "national_statistics/refresh"
 	case utils.DATA_SOURCE_FUBAO:
 		urlStr = "fubao/refresh"
+	default:
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			urlStr = edbSource.EdbRefreshMethod
+		}
 	}
 	if urlStr == "" {
 		err = fmt.Errorf(fmt.Sprint("source:", source, ";未实现该指标的刷新接口,请联系管理员"))

+ 9 - 3
services/data/edb_info.go

@@ -1047,9 +1047,15 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 
 	sourceName, ok := sourceNameMap[source]
 	if !ok {
-		errMsg = "指标来源异常"
-		err = errors.New(errMsg)
-		return
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			sourceName = edbSource.SourceName
+		}
+		if sourceName == "" {
+			errMsg = "指标来源异常"
+			err = errors.New(errMsg)
+			return
+		}
 	}
 	edbInfo.SourceName = sourceName
 

+ 331 - 0
services/data/jiayue_index.go

@@ -0,0 +1,331 @@
+package data
+
+import (
+	"encoding/json"
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/services/alarm_msg"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// 嘉悦桥接服务接口
+var (
+	BridgeApiJiaYueIndexUrl         = "/api/index_data/jiayue/index"          // 获取指标信息
+	BridgeApiJiaYueIndexDataUrl     = "/api/index_data/jiayue/index_data"     // 获取指标数据
+	BridgeApiJiaYuePageIndexUrl     = "/api/index_data/jiayue/page_index"     // 获取指标列表-分页
+	BridgeApiJiaYueFrequencyListUrl = "/api/index_data/jiayue/frequency_list" // 获取指标频度列表
+)
+
+type EdbBridgeJiaYue struct{}
+
+// GetIndex 获取指标信息
+func (brg *EdbBridgeJiaYue) GetIndex(req GetIndexFromBridgeReq) (item BridgeIndexItem, err error) {
+	var params data_manage.BridgeJiaYueIndexParams
+	params.IndexCode = req.IndexCode
+	params.SourceExtend = req.SourceExtend
+	params.IndexCodeRequired = req.IndexCodeRequired
+	indexData, e := GetJiaYueIndexFromBridge(params)
+	if e != nil {
+		err = fmt.Errorf("GetJiaYueIndexDataFromBridge err: %s", e.Error())
+		return
+	}
+	if indexData.Id <= 0 {
+		return
+	}
+	item.Id = indexData.Id
+	item.IndexCode = indexData.IndexCode
+	item.IndexName = indexData.IndexName
+	item.Unit = indexData.Unit
+	item.Frequency = brg.TransFrequency(indexData.Frequency)
+	return
+}
+
+// GetIndexAndData 获取指标和数据
+//func (brg *EdbBridgeJiaYue) GetIndexAndData(req GetIndexAndDataFromBridgeReq) (item BridgeIndexItem, err error) {
+//	var params data_manage.BridgeJiaYueIndexDataParams
+//	params.IndexCode = req.IndexCode
+//	params.SourceExtend = req.SourceExtend
+//	params.StartDate = req.StartDate
+//	params.EndDate = req.EndDate
+//	indexData, e := GetJiaYueIndexDataFromBridge(params)
+//	if e != nil {
+//		err = fmt.Errorf("GetJiaYueIndexDataFromBridge err: %s", e.Error())
+//		return
+//	}
+//	if indexData.Id <= 0 {
+//		return
+//	}
+//	item.Id = indexData.Id
+//	item.IndexCode = indexData.IndexCode
+//	item.IndexName = indexData.IndexName
+//	item.Unit = indexData.Unit
+//	item.Frequency = brg.TransFrequency(indexData.Frequency)
+//	var dataList []BridgeIndexDataItem
+//	for _, v := range indexData.IndexData {
+//		dataList = append(dataList, BridgeIndexDataItem{
+//			Val:        v.Val,
+//			DataTime:   v.DataTime,
+//			UpdateTime: v.UpdateTime,
+//		})
+//	}
+//	item.Data = dataList
+//	return
+//}
+
+// TransFrequency 嘉悦指标频度转换
+func (brg *EdbBridgeJiaYue) TransFrequency(origin string) string {
+	mapping := map[string]string{
+		"日":  "日度",
+		"周":  "周度",
+		"旬":  "旬度",
+		"半月": "旬度",
+		"月":  "月度",
+		"季":  "季度",
+		"半年": "半年度",
+		"年":  "年度",
+	}
+	return mapping[origin]
+}
+
+// GetJiaYueIndexFromBridge 从桥接服务获取指标信息
+func GetJiaYueIndexFromBridge(param data_manage.BridgeJiaYueIndexParams) (indexData data_manage.BridgeJiaYueIndexAndData, err error) {
+	defer func() {
+		if err != nil {
+			b, _ := json.Marshal(param)
+			tips := fmt.Sprintf("桥接服务-获取嘉悦指标信息, err: %s, params: %s", err.Error(), string(b))
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiJiaYueIndexUrl)
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	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(data_manage.BridgeJiaYueResultIndexData)
+	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
+	}
+	indexData = result.Data
+	return
+}
+
+// GetJiaYueIndexDataFromBridge 从桥接服务获取指标数据
+//func GetJiaYueIndexDataFromBridge(param data_manage.BridgeJiaYueIndexDataParams) (indexData data_manage.BridgeJiaYueIndexAndData, err error) {
+//	defer func() {
+//		if err != nil {
+//			b, _ := json.Marshal(param)
+//			tips := fmt.Sprintf("桥接服务-获取嘉悦指标数据, err: %s, params: %s", err.Error(), string(b))
+//			go alarm_msg.SendAlarmMsg(tips, 3)
+//		}
+//	}()
+//
+//	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiJiaYueIndexDataUrl)
+//	data, e := json.Marshal(param)
+//	if e != nil {
+//		err = fmt.Errorf("data json marshal err: %s", e.Error())
+//		return
+//	}
+//	body := ioutil.NopCloser(strings.NewReader(string(data)))
+//	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(data_manage.BridgeJiaYueResultIndexData)
+//	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
+//	}
+//	indexData = result.Data
+//	return
+//}
+
+// GetJiaYueFrequencyListFromBridge 获取指标频度列表
+func GetJiaYueFrequencyListFromBridge() (frequencies []string, err error) {
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiJiaYueFrequencyListUrl)
+	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(data_manage.BridgeJiaYueResultFrequencyList)
+	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
+	}
+	frequencies = result.Data
+	return
+}
+
+// GetJiaYueIndexPageListFromBridge 获取指标分页列表
+func GetJiaYueIndexPageListFromBridge(param data_manage.BridgeJiaYuePageIndexReq) (total int, items []data_manage.DictIndex, err error) {
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiJiaYuePageIndexUrl)
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	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(data_manage.BridgeJiaYueResultIndexPageList)
+	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
+	}
+	total = result.Data.Total
+	items = result.Data.List
+	return
+}

+ 11 - 1
utils/config.go

@@ -55,6 +55,11 @@ var (
 
 	// AlarmMsgUrl 报警服务地址
 	AlarmMsgUrl string
+
+	EtaBridgeUrl       string // 桥接服务地址
+	EtaBridgeAppNameEn string // 桥接服务英文名称-鉴权用
+	EtaBridgeMd5Key    string // 桥接服务Md5密钥-鉴权用
+	EtaBridgeDesKey    string // 桥接服务Des密钥-解密数据用
 )
 
 // TemplateIdByProduct 微信配置信息
@@ -154,7 +159,7 @@ var (
 
 // 对象存储客户端
 var (
-	ObjectStorageClient string       // 目前有oss minio,默认oss
+	ObjectStorageClient string // 目前有oss minio,默认oss
 )
 
 func init() {
@@ -246,6 +251,11 @@ func init() {
 
 		// 报警服务地址
 		AlarmMsgUrl = config["alarm_msg_url"]
+
+		EtaBridgeUrl = config["eta_bridge_url"]               // 桥接服务地址
+		EtaBridgeAppNameEn = config["eta_bridge_app_name_en"] // 桥接服务英文名称-鉴权用
+		EtaBridgeMd5Key = config["eta_bridge_md5_key"]        // 桥接服务Md5密钥-鉴权用
+		EtaBridgeDesKey = config["eta_bridge_des_key"]        // 桥接服务Des密钥-解密数据用
 	}
 	//日志配置
 	{

+ 2 - 2
utils/des3.go

@@ -20,7 +20,7 @@ func DesBase64Encrypt(origData []byte) []byte {
 	return []byte(base64.StdEncoding.EncodeToString(result))
 }
 
-func DesBase64Decrypt(crypted []byte) []byte {
+func DesBase64Decrypt(crypted []byte, desKey string) []byte {
 	result, _ := base64.StdEncoding.DecodeString(string(crypted))
 	remain := len(result) % 8
 	if remain > 0 {
@@ -29,7 +29,7 @@ func DesBase64Decrypt(crypted []byte) []byte {
 			result = append(result, 0)
 		}
 	}
-	origData, err := TripleDesDecrypt(result, []byte(DesKey))
+	origData, err := TripleDesDecrypt(result, []byte(desKey))
 	if err != nil {
 		panic(err)
 	}