eta_bridge.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package eta_bridge
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_task/utils"
  6. "fmt"
  7. "github.com/rdlucklib/rdluck_tools/paging"
  8. "io"
  9. "net/http"
  10. "strings"
  11. )
  12. // BaseEtaBridgeDataResp 基础返回参数
  13. type BaseEtaBridgeDataResp struct {
  14. Code int `json:"code" description:"状态码"`
  15. Msg string `json:"msg" description:"提示信息"`
  16. //Data GetCrmTokenData `json:"data" description:"返回数据"`
  17. }
  18. // HttpEtaBridgePost
  19. // @Description: eta-bridge的post请求
  20. // @author: Roc
  21. // @datetime 2024-02-28 16:55:02
  22. // @param urlStr string
  23. // @param postData string
  24. // @param param interface{}
  25. // @return bResult []byte
  26. // @return err error
  27. // @return errMsg string
  28. func HttpEtaBridgePost(urlStr string, param interface{}) (bResult []byte, err error, errMsg string) {
  29. if utils.EtaBridgeUrl == "" {
  30. errMsg = `未配置第三方的桥接服务地址`
  31. err = errors.New(errMsg)
  32. return
  33. }
  34. data, e := json.Marshal(param)
  35. if e != nil {
  36. err = fmt.Errorf("data json marshal err: %s", e.Error())
  37. return
  38. }
  39. postUrl := utils.EtaBridgeUrl + "/api" + urlStr
  40. body := io.NopCloser(strings.NewReader(string(data)))
  41. client := &http.Client{}
  42. req, e := http.NewRequest("POST", postUrl, body)
  43. if e != nil {
  44. err = fmt.Errorf("http create request err: %s", e.Error())
  45. return
  46. }
  47. contentType := "application/json;charset=utf-8"
  48. req.Header.Set("Content-Type", contentType)
  49. checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
  50. req.Header.Set("Authorization", checkToken)
  51. resp, e := client.Do(req)
  52. if e != nil {
  53. err = fmt.Errorf("http client do err: %s", e.Error())
  54. return
  55. }
  56. defer func() {
  57. _ = resp.Body.Close()
  58. }()
  59. bResult, e = io.ReadAll(resp.Body)
  60. if e != nil {
  61. err = fmt.Errorf("resp body read err: %s", e.Error())
  62. return
  63. }
  64. if len(bResult) == 0 {
  65. err = fmt.Errorf("resp body is empty")
  66. return
  67. }
  68. utils.FileLog.Info("桥接服务post请求返回数据:\n" + string(bResult))
  69. // 生产环境解密, 注意有个坑前后的双引号
  70. if utils.RunMode == "release" {
  71. str := string(bResult)
  72. str = strings.Trim(str, `"`)
  73. bResult = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
  74. }
  75. result := new(BaseEtaBridgeDataResp)
  76. if e = json.Unmarshal(bResult, &result); e != nil {
  77. err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(bResult))
  78. utils.FileLog.Info("桥接服务post请求失败:\n" + string(bResult))
  79. return
  80. }
  81. if result.Code != 200 {
  82. errMsg = result.Msg
  83. err = fmt.Errorf("result: %s", string(bResult))
  84. return
  85. }
  86. return
  87. }
  88. // HttpEtaBridgeGet
  89. // @Description: eta-bridge的get请求
  90. // @author: Roc
  91. // @datetime 2024-02-28 16:55:02
  92. // @param urlStr string
  93. // @param postData string
  94. // @return bResult []byte
  95. // @return err error
  96. // @return errMsg string
  97. func HttpEtaBridgeGet(urlStr string) (bResult []byte, err error, errMsg string) {
  98. if utils.EtaBridgeUrl == "" {
  99. errMsg = `未配置第三方的桥接服务地址`
  100. err = errors.New(errMsg)
  101. return
  102. }
  103. getUrl := utils.EtaBridgeUrl + "/api" + urlStr
  104. client := &http.Client{}
  105. req, e := http.NewRequest("GET", getUrl, nil)
  106. if e != nil {
  107. err = fmt.Errorf("http create request err: %s", e.Error())
  108. return
  109. }
  110. contentType := "application/json;charset=utf-8"
  111. req.Header.Set("Content-Type", contentType)
  112. checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
  113. req.Header.Set("Authorization", checkToken)
  114. resp, e := client.Do(req)
  115. if e != nil {
  116. err = fmt.Errorf("http client do err: %s", e.Error())
  117. return
  118. }
  119. defer func() {
  120. _ = resp.Body.Close()
  121. }()
  122. bResult, e = io.ReadAll(resp.Body)
  123. if e != nil {
  124. err = fmt.Errorf("resp body read err: %s", e.Error())
  125. return
  126. }
  127. if len(bResult) == 0 {
  128. err = fmt.Errorf("resp body is empty")
  129. return
  130. }
  131. // 生产环境解密, 注意有个坑前后的双引号
  132. if utils.RunMode == "release" {
  133. str := string(bResult)
  134. str = strings.Trim(str, `"`)
  135. bResult = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
  136. }
  137. result := new(BaseEtaBridgeDataResp)
  138. if e = json.Unmarshal(bResult, &result); e != nil {
  139. err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(bResult))
  140. utils.FileLog.Info("桥接服务get请求失败,url", getUrl, ":\n", string(bResult))
  141. return
  142. }
  143. if result.Code != 200 {
  144. errMsg = result.Msg
  145. err = fmt.Errorf("result: %s", string(bResult))
  146. return
  147. }
  148. return
  149. }
  150. // EtaBridgeDataRespAndBusinessData 基础返回参数
  151. type EtaBridgeDataRespAndBusinessData struct {
  152. Code int `json:"code" description:"状态码"`
  153. Msg string `json:"msg" description:"提示信息"`
  154. Data GetBusinessDataResp `json:"data" description:"返回数据"`
  155. }
  156. type GetBusinessDataResp struct {
  157. List []PushBusinessIndex
  158. Paging *paging.PagingItem `description:"分页数据"`
  159. }
  160. // PushBusinessIndex
  161. // @Description: 添加外部指标(商家)请求
  162. type PushBusinessIndex struct {
  163. IndexCode string `description:"指标编码"`
  164. IndexName string `description:"指标名称"`
  165. Unit string `description:"单位"`
  166. Frequency string `description:"频度"`
  167. SourceName string `description:"数据来源名称"`
  168. Remark string `description:"备注字段"`
  169. DetailDataCreateTime string `description:"明细数据入库时间"`
  170. DataList []AddBusinessData `description:"指标数据"`
  171. }
  172. // AddBusinessData
  173. // @Description: 外部指标(商家系统)数据
  174. type AddBusinessData struct {
  175. Value float64 `description:"值"`
  176. Date string `description:"日期"`
  177. }