base_from_smm_http.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package services
  2. import (
  3. "encoding/json"
  4. "eta/eta_index_lib/models"
  5. "eta/eta_index_lib/services/alarm_msg"
  6. "eta/eta_index_lib/utils"
  7. "fmt"
  8. "io/ioutil"
  9. netHttp "net/http"
  10. "strings"
  11. "time"
  12. )
  13. var (
  14. BridgeApiZhongJiIndexDataUrl = "/api/index_data/zhongji/smm/data" // 获取指标数据API
  15. BridgeApiZhongJiIndexListUrl = "/api/index_data/zhongji/smm/list" // 获取指标列表API
  16. )
  17. // Data is a struct that represents the data field in the JSON string
  18. type Data struct {
  19. Date string `json:"date"`
  20. Value string `json:"value"`
  21. Create string `json:"create"`
  22. }
  23. // Quota is a struct that represents the quota information in the JSON string
  24. type Quota struct {
  25. QuotaID string `json:"quota_id"`
  26. QuotaName string `json:"quota_name"`
  27. Unit string `json:"unit"`
  28. Frequency string `json:"frequency"`
  29. ValueType string `json:"value_type"`
  30. Precision int `json:"precision"`
  31. PermState int `json:"perm_state"`
  32. Data []Data `json:"data"`
  33. }
  34. // Response is a struct that represents the whole JSON string
  35. type SmmResponse struct {
  36. Code int `json:"code"`
  37. Msg string `json:"msg"`
  38. Quota []Quota `json:"data"`
  39. }
  40. type SmmResp struct {
  41. Code int `json:"code"`
  42. Msg string `json:"msg"`
  43. Data SmmResponse `json:"data"`
  44. }
  45. type GetSmmTokenResp struct {
  46. Code int `json:"code"`
  47. Msg string `json:"msg"`
  48. Data SmmTokenData `json:"data"`
  49. }
  50. type SmmTokenData struct {
  51. Token string `json:"token"`
  52. }
  53. // getSmmAccessToken token内部请求接口
  54. //func getSmmAccessToken() (tokenData SmmTokenData, err error) {
  55. // defer func() {
  56. // if err != nil {
  57. // go alarm_msg.SendAlarmMsg("更新SMM的token失败;ERR:"+err.Error(), 3)
  58. // }
  59. // }()
  60. //
  61. // url := "https://datapro-api.smm.cn/dapi/user/auth"
  62. //
  63. // // 准备Form-data参数
  64. // values := map[string]io.Reader{
  65. // "user_name": strings.NewReader("18815284804"),
  66. // "password": strings.NewReader(utils.MD5("huangcf@cbnb.com.cn")),
  67. // "source": strings.NewReader("datapro"),
  68. // }
  69. //
  70. // // 创建一个新的buffer,用于存储请求体
  71. // var body bytes.Buffer
  72. // writer := multipart.NewWriter(&body)
  73. //
  74. // // 添加Form-data参数
  75. // for key, value := range values {
  76. // part, err := writer.CreateFormFile(key, key)
  77. // if err != nil {
  78. // fmt.Println("Error creating form file:", err)
  79. // return
  80. // }
  81. // _, err = io.Copy(part, value)
  82. // if err != nil {
  83. // fmt.Println("Error copying file content:", err)
  84. // return
  85. // }
  86. // }
  87. //
  88. // // 关闭multipart writer
  89. // writer.Close()
  90. //
  91. // // 发送POST请求
  92. // req, err := netHttp.NewRequest("POST", url, &body)
  93. // if err != nil {
  94. // fmt.Println("Error creating request:", err)
  95. // return
  96. // }
  97. //
  98. // req.Header.Set("Content-Type", writer.FormDataContentType())
  99. //
  100. // client := &netHttp.Client{}
  101. // resp, err := client.Do(req)
  102. // if err != nil {
  103. // fmt.Println("Error sending request:", err)
  104. // return
  105. // }
  106. // defer resp.Body.Close()
  107. //
  108. // // 处理响应
  109. // fmt.Println("Response Status:", resp.Status)
  110. //
  111. // bodyContent, err := ioutil.ReadAll(resp.Body)
  112. // if err != nil {
  113. // fmt.Println("Error reading response body:", err)
  114. // return
  115. // }
  116. // utils.FileLog.Info("SMM刷新token:" + string(bodyContent))
  117. //
  118. // var tokenResp GetSmmTokenResp
  119. // err = json.Unmarshal(bodyContent, &tokenResp)
  120. // if err != nil {
  121. // err = errors.New("Unmarshal Err:" + err.Error())
  122. // return
  123. // }
  124. // if tokenResp.Code != 0 {
  125. // err = errors.New("getAccessToken err:" + tokenResp.Msg)
  126. // return
  127. // }
  128. // tokenData = tokenResp.Data
  129. //
  130. // return
  131. //}
  132. // GetSmmNewIndexFromBridge 从桥接服务获取指标
  133. func GetSmmNewIndexFromBridge(edbCode string) (indexDataList []models.BaseFromSmmDataList, err error) {
  134. defer func() {
  135. if err != nil {
  136. tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
  137. utils.FileLog.Info(tips)
  138. go alarm_msg.SendAlarmMsg(tips, 3)
  139. }
  140. }()
  141. url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexDataUrl)
  142. param := models.BridgeZhongJiIndexDataParams{EdbCode: edbCode}
  143. data, e := json.Marshal(param)
  144. if e != nil {
  145. err = fmt.Errorf("data json marshal err: %s", e.Error())
  146. return
  147. }
  148. body := ioutil.NopCloser(strings.NewReader(string(data)))
  149. client := &netHttp.Client{}
  150. req, e := netHttp.NewRequest("POST", url, body)
  151. if e != nil {
  152. err = fmt.Errorf("http create request err: %s", e.Error())
  153. return
  154. }
  155. checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
  156. contentType := "application/json;charset=utf-8"
  157. req.Header.Set("Content-Type", contentType)
  158. req.Header.Set("Authorization", checkToken)
  159. resp, e := client.Do(req)
  160. if e != nil {
  161. err = fmt.Errorf("http client do err: %s", e.Error())
  162. return
  163. }
  164. defer func() {
  165. _ = resp.Body.Close()
  166. }()
  167. b, e := ioutil.ReadAll(resp.Body)
  168. if e != nil {
  169. err = fmt.Errorf("resp body read err: %s", e.Error())
  170. return
  171. }
  172. if len(b) == 0 {
  173. err = fmt.Errorf("resp body is empty")
  174. return
  175. }
  176. // 生产环境解密
  177. if utils.RunMode == "release" {
  178. str := string(b)
  179. str = strings.Trim(str, `"`)
  180. b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
  181. }
  182. result := new(SmmResp)
  183. if e = json.Unmarshal(b, &result); e != nil {
  184. err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
  185. return
  186. }
  187. if result.Code != 200 {
  188. err = fmt.Errorf("result: %s", string(b))
  189. return
  190. }
  191. dataList := make([]models.BaseFromSmmDataList, 0)
  192. for _, quota := range result.Data.Quota {
  193. var dataListItem models.BaseFromSmmDataList
  194. dataListItem.IndexCode = quota.QuotaID
  195. for _, v := range quota.Data {
  196. dataItem := new(models.BaseFromSmmData)
  197. dataItem.IndexCode = quota.QuotaID
  198. dataItem.DataTime = v.Date
  199. dataItem.Value = v.Value
  200. createTime, e := time.Parse(utils.FormatDateTime, v.Create)
  201. if e != nil {
  202. err = fmt.Errorf("time parse err: %s", e.Error())
  203. return
  204. }
  205. dataItem.CreateTime = createTime
  206. dataItem.ModifyTime = createTime
  207. currentDate, _ := time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
  208. timestamp := currentDate.UnixNano() / 1e6
  209. dataItem.DataTimestamp = timestamp
  210. dataListItem.Data = append(dataListItem.Data, dataItem)
  211. }
  212. dataList = append(dataList, dataListItem)
  213. }
  214. indexDataList = dataList
  215. return
  216. }
  217. // GetSmmNewIndexListFromBridge 从桥接服务获取指标列表
  218. func GetSmmNewIndexListFromBridge(params models.BridgeZhongJiIndexListParams) (indexList []*models.BaseFromSmmIndex, err error) {
  219. defer func() {
  220. if err != nil {
  221. tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
  222. utils.FileLog.Info(tips)
  223. go alarm_msg.SendAlarmMsg(tips, 3)
  224. }
  225. }()
  226. url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
  227. data, e := json.Marshal(params)
  228. if e != nil {
  229. err = fmt.Errorf("data json marshal err: %s", e.Error())
  230. return
  231. }
  232. body := ioutil.NopCloser(strings.NewReader(string(data)))
  233. client := &netHttp.Client{}
  234. req, e := netHttp.NewRequest("POST", url, body)
  235. if e != nil {
  236. err = fmt.Errorf("http create request err: %s", e.Error())
  237. return
  238. }
  239. checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
  240. contentType := "application/json;charset=utf-8"
  241. req.Header.Set("Content-Type", contentType)
  242. req.Header.Set("Authorization", checkToken)
  243. resp, e := client.Do(req)
  244. if e != nil {
  245. err = fmt.Errorf("http client do err: %s", e.Error())
  246. return
  247. }
  248. defer func() {
  249. _ = resp.Body.Close()
  250. }()
  251. b, e := ioutil.ReadAll(resp.Body)
  252. if e != nil {
  253. err = fmt.Errorf("resp body read err: %s", e.Error())
  254. return
  255. }
  256. if len(b) == 0 {
  257. err = fmt.Errorf("resp body is empty")
  258. return
  259. }
  260. // 生产环境解密
  261. if utils.RunMode == "release" {
  262. str := string(b)
  263. str = strings.Trim(str, `"`)
  264. b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
  265. }
  266. result := new(models.SmmListResp)
  267. if e = json.Unmarshal(b, &result); e != nil {
  268. err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
  269. return
  270. }
  271. if result.Code != 200 {
  272. err = fmt.Errorf("result: %s", string(b))
  273. return
  274. }
  275. for _, v := range result.Data.Data.Data {
  276. typeList := strings.Split(v.TypeAll, ";")
  277. item := new(models.BaseFromSmmIndex)
  278. item.IndexCode = v.QuotaID
  279. item.IndexName = v.QuotaName
  280. item.Frequency = v.Frequency
  281. item.StartDate = v.DataStart
  282. item.EndDate = v.DataEnd
  283. item.Name = v.TypeName
  284. item.CreateTime = time.Now()
  285. item.Unit = v.Unit
  286. item.Frequency = v.Frequency
  287. if v.Frequency != "半年" {
  288. item.Frequency += "度"
  289. }
  290. item.Interface = "SMM"
  291. item.ModifyTime = time.Now()
  292. item.DataState = v.DataState
  293. item.ReleaseTime = v.UpdateRule.ReleaseTime
  294. for i, typeItem := range typeList {
  295. if i == 0 {
  296. item.Type1 = typeItem
  297. } else if i == 1{
  298. item.Type2 = typeItem
  299. } else if i == 2 {
  300. item.Type3 = typeItem
  301. }
  302. }
  303. indexList = append(indexList, item)
  304. }
  305. return
  306. }