Browse Source

test 嘉悦数据源

hsun 1 year ago
parent
commit
aa55f3f639

+ 171 - 0
controllers/data_manage/jiayue_edb_source.go

@@ -0,0 +1,171 @@
+package data_manage
+
+import (
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/services/data"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// JiaYueEdbSourceController 嘉悦数据源
+type JiaYueEdbSourceController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 数据源列表
+// @Description 数据源列表
+// @Success 200 string "获取成功"
+// @router /edb_source/jiayue/list [get]
+func (this *JiaYueEdbSourceController) 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"
+		return
+	}
+
+	cond := ` AND is_base = 1 AND is_private = 1`
+	pars := make([]interface{}, 0)
+	sources, e := data_manage.GetEdbSourceItemsByCondition(cond, pars, []string{}, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标来源失败, Err: "
+		return
+	}
+	br.Data = sources
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// FrequencyList
+// @Title 指标频度列表
+// @Description 指标频度列表
+// @Success 200 string "获取成功"
+// @router /edb_source/jiayue/frequency_list [get]
+func (this *JiaYueEdbSourceController) FrequencyList() {
+	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"
+		return
+	}
+
+	frequencies, e := data.GetJiaYueFrequencyListFromBridge()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "桥接服务获取指标频度失败, Err: " + e.Error()
+		return
+	}
+	br.Data = frequencies
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// IndexPageList
+// @Title 指标列表-分页
+// @Description 指标列表-分页
+// @Param   PageSize  query  int  false  "每页数据条数"
+// @Param   CurrentIndex  query  int  false  "当前页码"
+// @Param   Source  query  int  true  "数据来源"
+// @Param   Frequency  query  string  false  "频度"
+// @Param   Keyword  query  string  false  "关键词: 指标ID/指标名称"
+// @Param   SortField  query  int  false  "排序字段: 1-指标开始时间; 2-指标最新时间; 3-更新时间"
+// @Param   SortRule  query  int  false  "排序方式: 1-正序; 2-倒序"
+// @Success 200 string "获取成功"
+// @router /edb_source/jiayue/index_page_list [get]
+func (this *JiaYueEdbSourceController) IndexPageList() {
+	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"
+		return
+	}
+	source, _ := this.GetInt("Source")
+	frequency := this.GetString("Frequency")
+	keyword := this.GetString("Keyword")
+	sortField, _ := this.GetInt("SortField")
+	sortRule, _ := this.GetInt("SortRule")
+
+	if source <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, Source: %d", source)
+		return
+	}
+	cond := ` AND edb_source_id = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, source)
+	sourceItem, e := data_manage.GetEdbSourceItemByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "数据源有误"
+		br.ErrMsg = "获取数据源失败, Err: " + e.Error()
+		return
+	}
+
+	// 分页
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	var params data_manage.BridgeJiaYuePageIndexReq
+	params.PageIndex = currentIndex
+	params.PageSize = pageSize
+	params.Keyword = keyword
+	params.Frequency = frequency
+	params.SourceExtend = sourceItem.SourceExtend
+	params.SortField = sortField
+	params.SortRule = sortRule
+	total, list, e := data.GetJiaYueIndexPageListFromBridge(params)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标分页列表失败, Err: " + e.Error()
+		return
+	}
+	items := make([]*data_manage.DictIndexItem, 0)
+	for _, v := range list {
+		t := data_manage.FormatDictIndex2Item(v)
+		items = append(items, t)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(data_manage.JiaYueIndexPageListResp)
+	resp.Paging = page
+	resp.List = items
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 15 - 5
models/data_manage/edb_source.go

@@ -8,13 +8,15 @@ import (
 
 // 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:"数据表名"`
+	IsBase       int    `description:"是否为基础指标: 0-否; 1-是"`
+	IsPrivate    int    `description:"是否为自有来源: 0-否; 1-是"`
+	SourceExtend string `description:"扩展字段做查询用, 如嘉悦的wind对应wind、wind_stop"`
 }
 
-// GetEdbSourceItemsByCondition 获取指标来源
+// GetEdbSourceItemsByCondition 获取指标来源列表
 func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbSource, err error) {
 	o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
@@ -38,3 +40,11 @@ type EdbSourceChild struct {
 	IsBase      int    `description:"是否为基础指标: 2-否; 1-是"`
 	Child       []EdbSourceChild
 }
+
+// GetEdbSourceItemByCondition 获取指标来源
+func GetEdbSourceItemByCondition(condition string, pars []interface{}) (item *EdbSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM edb_source WHERE 1=1 %s`, condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}

+ 100 - 0
models/data_manage/jiayue_index.go

@@ -0,0 +1,100 @@
+package data_manage
+
+import (
+	"eta/eta_api/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         string    `description:"指标开始时间"`
+	DateLast          string    `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:"更新时间"`
+}
+
+// BridgeJiaYueCommonResultData 桥接服务-结果响应体
+type BridgeJiaYueCommonResultData struct {
+	Code   int         `json:"code" description:"状态码"`
+	Msg    string      `json:"msg" description:"提示信息"`
+	Data   interface{} `json:"data" description:"返回数据"`
+	ErrMsg string      `json:"-" 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.Code
+	item.Name = origin.Name
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.DateFirst = origin.DateFirst
+	item.DateLast = origin.DateLast
+	item.TimeLastUpdate = utils.TimeTransferString(utils.FormatDateTime, origin.TimeLastUpdate)
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -2923,6 +2923,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"],
+        beego.ControllerComments{
+            Method: "FrequencyList",
+            Router: `/edb_source/jiayue/frequency_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"],
+        beego.ControllerComments{
+            Method: "IndexPageList",
+            Router: `/edb_source/jiayue/index_page_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:JiaYueEdbSourceController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/edb_source/jiayue/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualController"],
         beego.ControllerComments{
             Method: "ClassifyList",

+ 1 - 0
routers/router.go

@@ -154,6 +154,7 @@ func init() {
 				&data_manage.PredictEdbClassifyController{},
 				&data_manage.PredictEdbInfoController{},
 				&data_manage.BaseFromNationalStatisticsController{},
+				&data_manage.JiaYueEdbSourceController{},
 			),
 		),
 		web.NSNamespace("/my_chart",

+ 138 - 0
services/data/jiayue_index.go

@@ -0,0 +1,138 @@
+package data
+
+import (
+	"encoding/json"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// 桥接服务接口
+var (
+	BridgeApiJiaYueIndexUrl         = "/api/index_data/jiayue/index"          // 获取指标数据
+	BridgeApiJiaYuePageIndexUrl     = "/api/index_data/jiayue/page_index"     // 获取指标列表-分页
+	BridgeApiJiaYueFrequencyListUrl = "/api/index_data/jiayue/frequency_list" // 获取指标频度列表
+)
+
+// 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.BridgeJiaYueCommonResultData)
+	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
+	}
+	arr, ok := result.Data.([]string)
+	if !ok {
+		err = fmt.Errorf("result data err")
+		return
+	}
+	frequencies = arr
+	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.BridgeJiaYueCommonResultData)
+	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
+	}
+	res, ok := result.Data.(data_manage.BridgeJiaYuePageIndexResp)
+	if !ok {
+		err = fmt.Errorf("result data err")
+		return
+	}
+	total = res.Total
+	items = res.List
+	return
+}

+ 13 - 13
utils/config.go

@@ -82,6 +82,11 @@ var (
 
 	// ChatUrl chatGPT服务地址
 	ChatUrl string
+
+	EtaBridgeUrl       string // 桥接服务地址
+	EtaBridgeAppNameEn string // 桥接服务英文名称-鉴权用
+	EtaBridgeMd5Key    string // 桥接服务Md5密钥-鉴权用
+	EtaBridgeDesKey    string // 桥接服务Des密钥-解密数据用
 )
 
 // 微信配置信息
@@ -107,25 +112,15 @@ var (
 	EsSemanticAnalysisDocIndexName string //ES语义分析文档索引名
 )
 
-// 科大讯飞--语音合成
 var (
-	//XfSTATUS_FIRST_FRAME    = 0 //第一帧标识
-	//XfSTATUS_CONTINUE_FRAME = 1 //中间帧标识
-	//XfSTATUS_LAST_FRAME     = 2 //最后一帧标识
-	//XfHost                  = "tts-api.xfyun.cn"
-	//XfMaxFontSize           = 8000
-	//XfAPPID                 string
-	//XfAPIKey                string
-	//XfAPISecret             string
-	XfHostUrl string
-	//XfOrigin  string
-	//XfVcn                   string //发言人
+	XfHostUrl string // 科大讯飞--语音合成
 )
 
 // 对象存储客户端
 var (
-	ObjectStorageClient string       // 目前有oss minio,默认oss
+	ObjectStorageClient string // 目前有oss minio,默认oss
 )
+
 // 阿里云配置
 var (
 	Bucketname       string
@@ -318,6 +313,11 @@ func init() {
 
 		// chatGPT服务地址
 		ChatUrl = config["chat_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密钥-解密数据用
 	}
 
 	//日志配置