|
@@ -0,0 +1,412 @@
|
|
|
+package services
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "eta/eta_index_lib/models"
|
|
|
+ "eta/eta_index_lib/services/alarm_msg"
|
|
|
+ "eta/eta_index_lib/utils"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ netHttp "net/http"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ BridgeApiZhongJiIndexDataUrl = "/api/index_data/zhongji/smm/data" // 获取指标数据API
|
|
|
+ BridgeApiZhongJiIndexListUrl = "/api/index_data/zhongji/smm/list" // 获取指标列表API
|
|
|
+ BridgeApiZhongJiIndexLatestUrl = "/api/index_data/zhongji/smm/latest" // 获取指标最新数据API
|
|
|
+)
|
|
|
+
|
|
|
+// Data is a struct that represents the data field in the JSON string
|
|
|
+type Data struct {
|
|
|
+ Date string `json:"date"`
|
|
|
+ Value string `json:"value"`
|
|
|
+ Create string `json:"create"`
|
|
|
+}
|
|
|
+
|
|
|
+// Quota is a struct that represents the quota information in the JSON string
|
|
|
+type Quota struct {
|
|
|
+ QuotaID string `json:"quota_id"`
|
|
|
+ QuotaName string `json:"quota_name"`
|
|
|
+ Unit string `json:"unit"`
|
|
|
+ Frequency string `json:"frequency"`
|
|
|
+ ValueType string `json:"value_type"`
|
|
|
+ Precision int `json:"precision"`
|
|
|
+ PermState int `json:"perm_state"`
|
|
|
+ Data []Data `json:"data"`
|
|
|
+}
|
|
|
+
|
|
|
+// Response is a struct that represents the whole JSON string
|
|
|
+type SmmResponse struct {
|
|
|
+ Code int `json:"code"`
|
|
|
+ Msg string `json:"msg"`
|
|
|
+ Quota []Quota `json:"data"`
|
|
|
+}
|
|
|
+
|
|
|
+type SmmResp struct {
|
|
|
+ Code int `json:"code"`
|
|
|
+ Msg string `json:"msg"`
|
|
|
+ Data SmmResponse `json:"data"`
|
|
|
+}
|
|
|
+
|
|
|
+type GetSmmTokenResp struct {
|
|
|
+ Code int `json:"code"`
|
|
|
+ Msg string `json:"msg"`
|
|
|
+ Data SmmTokenData `json:"data"`
|
|
|
+}
|
|
|
+
|
|
|
+type SmmTokenData struct {
|
|
|
+ Token string `json:"token"`
|
|
|
+}
|
|
|
+
|
|
|
+// GetSmmNewIndexFromBridge 从桥接服务获取指标
|
|
|
+func GetSmmNewIndexFromBridge(edbCode string) (indexDataList []models.BaseFromSmmDataList, err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexDataUrl)
|
|
|
+ param := models.BridgeZhongJiIndexDataParams{EdbCode: edbCode}
|
|
|
+ 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 := &netHttp.Client{}
|
|
|
+ req, e := netHttp.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(SmmResp)
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList := make([]models.BaseFromSmmDataList, 0)
|
|
|
+ for _, quota := range result.Data.Quota {
|
|
|
+ var dataListItem models.BaseFromSmmDataList
|
|
|
+
|
|
|
+ dataListItem.IndexCode = quota.QuotaID
|
|
|
+ for _, v := range quota.Data {
|
|
|
+ dataItem := new(models.BaseFromSmmData)
|
|
|
+ dataItem.IndexCode = quota.QuotaID
|
|
|
+ dataItem.DataTime = v.Date
|
|
|
+ dataItem.Value = v.Value
|
|
|
+ createTime, e := time.Parse(utils.FormatDateTime, v.Create)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("time parse err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dataItem.CreateTime = createTime
|
|
|
+ dataItem.ModifyTime = createTime
|
|
|
+ currentDate, _ := time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ dataItem.DataTimestamp = timestamp
|
|
|
+
|
|
|
+ dataListItem.Data = append(dataListItem.Data, dataItem)
|
|
|
+ }
|
|
|
+ dataList = append(dataList, dataListItem)
|
|
|
+ }
|
|
|
+ indexDataList = dataList
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// GetSmmNewIndexListFromBridge 从桥接服务获取指标列表
|
|
|
+func GetSmmNewIndexListFromBridge(params models.BridgeZhongJiIndexListParams) (indexList []*models.BaseFromSmmIndex, err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
|
|
|
+
|
|
|
+ data, e := json.Marshal(params)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("data json marshal err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ body := ioutil.NopCloser(strings.NewReader(string(data)))
|
|
|
+ client := &netHttp.Client{}
|
|
|
+ req, e := netHttp.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.SmmListResp)
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range result.Data.Data.Data {
|
|
|
+ typeList := strings.Split(v.TypeAll, ";")
|
|
|
+ item := new(models.BaseFromSmmIndex)
|
|
|
+ item.IndexCode = v.QuotaID
|
|
|
+ item.IndexName = v.QuotaName
|
|
|
+ item.Frequency = v.Frequency
|
|
|
+ item.StartDate = v.DataStart
|
|
|
+ item.EndDate = v.DataEnd
|
|
|
+ item.Name = v.TypeName
|
|
|
+ item.CreateTime = time.Now()
|
|
|
+ item.Unit = v.Unit
|
|
|
+ item.Frequency = v.Frequency
|
|
|
+ if v.Frequency != "半年" {
|
|
|
+ item.Frequency += "度"
|
|
|
+ }
|
|
|
+ item.Interface = "SMM"
|
|
|
+ item.ModifyTime = time.Now()
|
|
|
+ item.DataState = v.DataState
|
|
|
+ item.ReleaseTime = v.UpdateRule.ReleaseTime
|
|
|
+ for i, typeItem := range typeList {
|
|
|
+ if i == 0 {
|
|
|
+ item.Type1 = typeItem
|
|
|
+ } else if i == 1 {
|
|
|
+ item.Type2 = typeItem
|
|
|
+ } else if i == 2 {
|
|
|
+ item.Type3 = typeItem
|
|
|
+ }
|
|
|
+ }
|
|
|
+ indexList = append(indexList, item)
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// GetSmmNewIndexListTotalFromBridge 从桥接服务获取指标列表总数
|
|
|
+func GetSmmNewIndexListTotalFromBridge(params models.BridgeZhongJiIndexListParams) (total int, err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
|
|
|
+
|
|
|
+ data, e := json.Marshal(params)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("data json marshal err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ body := ioutil.NopCloser(strings.NewReader(string(data)))
|
|
|
+ client := &netHttp.Client{}
|
|
|
+ req, e := netHttp.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.SmmListResp)
|
|
|
+ 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.Data.Total
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// GetSmmIndexLatestFromBridge 从桥接服务获取指标更新
|
|
|
+func GetSmmIndexLatestFromBridge(edbInfoId int, edbCode, startDate string) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
|
|
|
+ utils.FileLog.Info(tips)
|
|
|
+ go alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexLatestUrl)
|
|
|
+
|
|
|
+ startDateTime, err := time.Parse(utils.FormatDate, startDate)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("startDateTime parse err: %s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ timeStamp := startDateTime.UnixNano() / 1e6
|
|
|
+
|
|
|
+ param := models.BridgeZhongJiIndexLatestDataParams{
|
|
|
+ EdbCode: edbCode,
|
|
|
+ LastTime: timeStamp,
|
|
|
+ }
|
|
|
+ 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 := &netHttp.Client{}
|
|
|
+ req, e := netHttp.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.SmmLatestDataResponse)
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ smmDataList := make([]*models.BaseFromSmmData, 0)
|
|
|
+
|
|
|
+ for _, v := range result.Data.Data.DataList {
|
|
|
+ item := new(models.BaseFromSmmData)
|
|
|
+ item.BaseFromSmmIndexId = edbInfoId
|
|
|
+ item.IndexCode = v.QuotaID
|
|
|
+ item.DataTime = v.Date
|
|
|
+ item.Value = v.Value
|
|
|
+ item.CreateTime = time.Now()
|
|
|
+ item.ModifyTime = time.Now()
|
|
|
+
|
|
|
+ timeDate, _ := time.Parse(utils.FormatDateTime, v.Date)
|
|
|
+ timestamp := timeDate.UnixNano() / 1e6
|
|
|
+ item.DataTimestamp = timestamp
|
|
|
+
|
|
|
+ smmDataList = append(smmDataList, item)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = models.RefreshEdbDataFromSmmToEdb(edbInfoId, edbCode, startDate, smmDataList)
|
|
|
+ return
|
|
|
+}
|