crm.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package xiangyu
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_bridge/global"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "net/url"
  10. "strings"
  11. )
  12. type PostGetIndexDataParamReq struct {
  13. PageNum int `json:"pageNum" description:"页码,先取第一页,看一下总条数,然后根据总条数给返回"`
  14. PageSize int `json:"pageSize" description:"单页条数,自己填,一页要多少条,最大2000条"`
  15. AssetCd string `json:"assetCd" description:"资产编码,与资产包编码二选一填写,该类业务数据在数仓中的唯一编码,该编码由数仓提供给项目组"`
  16. AssetPkgCd string `json:"assetPkgCd" description:"资产包编码,与资产编码二选一填写,传入该参数时,将返回该资产包内的所有资产,该编码由数仓提供给项目组"`
  17. DataDt string `json:"dataDt" description:"数据日期,如2022年5月25日的铝的市价,数据日期则为20220525"`
  18. StartDt string `json:"startDt" description:"启始时间,格式 YYYYMMDD 如:20211010;不为空时,将过滤出数据日期>=startDate 的数据行"`
  19. EndDt string `json:"endDt" description:"结束时间,格式 YYYYMMDD 如:20211010;不为空时,将过滤出数据日期<=endDate 的数据行"`
  20. Sort string `json:"sort" description:"排序字段,默认为0正序;按数据日期字段排序,0为正序 1为倒序"`
  21. DataSourceType string `json:"dataSourceType" description:"内部来源系统参数,可只获取对应数据源数据,不传则默认获取所有数据源信息;参数含义:① CY产研平台;② RPA;③ KSF 金仕达;④CRM参数例子: CY,RPA,KSF,CRM (参数传递字符串列表,通过逗号分隔)"`
  22. InfoLastUpdateStartTime string `json:"infoLastUpdateStartTime" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产信息入库时间>=infoLastUpdateStartTime 的数据行"`
  23. InfoLastUpdateEndTime string `json:"infoLastUpdateEndTime" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产信息入库时间<=infoLastUpdateStartTime 的数据行"`
  24. DetailLastUpdateStartTime string `json:"detailLastUpdateStartTime" description:"明细数据落到数仓启始时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产详细信息入库时间>=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
  25. DetailLastUpdateEndTime string `json:"detailLastUpdateEndTime" description:"明细数据落到数仓结束时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产详细信息入库时间<=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
  26. //CommonParameters In0 `json:"commonParameters" description:"公共参数"`
  27. }
  28. func structToURLParams(req interface{}) (string, error) {
  29. // 首先,将结构体转换为map[string]interface{}
  30. marshaledBytes, err := json.Marshal(req)
  31. if err != nil {
  32. return "", err
  33. }
  34. var params map[string]interface{}
  35. err = json.Unmarshal(marshaledBytes, &params)
  36. if err != nil {
  37. return "", err
  38. }
  39. // 创建url.Values,它是一个键值对的集合,用于构建URL查询字符串
  40. values := url.Values{}
  41. for key, value := range params {
  42. values.Set(key, fmt.Sprintf("%v", value))
  43. }
  44. // 返回查询字符串
  45. return values.Encode(), nil
  46. }
  47. // CrmBaseResp
  48. // @Description: Crm基础信息返回
  49. type CrmBaseResp struct {
  50. ErrCode int `json:"errCode"`
  51. RequestId string `json:"requestId"`
  52. ErrMsg string `json:"errMsg"`
  53. ApiLog interface{} `json:"apiLog"`
  54. }
  55. // GetCrmDataResp
  56. // @Description: CRM数据接口返回
  57. type GetCrmDataResp struct {
  58. CrmBaseResp
  59. Data CrmDataResp `json:"data"`
  60. }
  61. // CrmDataResp
  62. // @Description: 实际数据返回
  63. type CrmDataResp struct {
  64. TotalNum int `json:"totalNum"`
  65. PageSize int `json:"pageSize"`
  66. Rows []CrmDataItemResp `json:"rows"`
  67. PageNum int `json:"pageNum"`
  68. }
  69. // CrmDataItemResp
  70. // @Description: 指标数据返回
  71. type CrmDataItemResp struct {
  72. Price float64 `json:"price"`
  73. DataDt string `json:"datadt"`
  74. UpdateTime string `json:"updatetime"`
  75. AssetCd string `json:"assetcd"`
  76. MarketName string `json:"marketname"`
  77. AreaName string `json:"areaname"`
  78. AssetName string `json:"assetname"`
  79. Currency interface{} `json:"currency"`
  80. MaterialName string `json:"materialname"`
  81. SpecName string `json:"specname"`
  82. BreedName string `json:"breedname"`
  83. UnitName string `json:"unitname"`
  84. SourceName string `json:"sourcename"`
  85. FrequencyName string `json:"frequencyname"`
  86. CountryName string `json:"countryname"`
  87. ProvinceName string `json:"provincename"`
  88. CityName string `json:"cityname"`
  89. CountyName string `json:"countyname"`
  90. CompanyName string `json:"companyname"`
  91. Description string `json:"description"`
  92. BeginDate string `json:"begindate"`
  93. EndDate string `json:"enddate"`
  94. CreateTime string `json:"createtime"`
  95. Status interface{} `json:"status"`
  96. PublishRuleName string `json:"publishrulename"`
  97. AuthKind *string `json:"authkind"`
  98. SmallClassName interface{} `json:"smallclassname"`
  99. DataSource string `json:"datasource"`
  100. DataSourceType string `json:"datasourcetype"`
  101. OrginSysSource interface{} `json:"orginsyssource"`
  102. SourceType interface{} `json:"sourcetype"`
  103. DeptCd string `json:"deptcd"`
  104. DutyDept string `json:"dutydept"`
  105. DerivativeType string `json:"derivativetype"`
  106. StkCode string `json:"stkcode"`
  107. StkName string `json:"stkname"`
  108. MetricName string `json:"metricname"`
  109. AssetInfoStockInTime string `json:"asset_info_stock_in_time" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS;如:20240229 18:00:00"`
  110. DetailDataStockInTime string `json:"detail_data_stock_in_time" description:"明细数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS;如:20240229 18:00:00"`
  111. }
  112. // PostGetCrmData
  113. // @Description: 获取CRM数据
  114. // @author: Roc
  115. // @datetime 2024-05-14 16:45:40
  116. // @param req PostGetIndexDataParamReq
  117. // @return dataResp *CrmDataResp
  118. // @return err error
  119. func PostGetCrmData(req PostGetIndexDataParamReq) (dataResp CrmDataResp, err error) {
  120. urlPath := `/mpdata/index/data`
  121. //req.CommonParameters = In0{
  122. // PageTotal: "",
  123. // PageNo: "",
  124. // DocType: "数仓市价服务",
  125. // Property: "",
  126. // //DocCode: getDocCode(),
  127. // Source: global.CONFIG.Xiangyu.SystemCode,
  128. // Target: global.CONFIG.Xiangyu.IndexCrmTarget,
  129. //}
  130. queryString, err := structToURLParams(req)
  131. if err != nil {
  132. fmt.Println("Error:", err)
  133. return
  134. }
  135. urlPath += "?" + queryString
  136. postData, err := json.Marshal(req)
  137. if err != nil {
  138. return
  139. }
  140. result, err := HttpPostXmxyg(urlPath, string(postData))
  141. if err != nil {
  142. return
  143. }
  144. var resp *GetCrmDataResp
  145. // 解析响应结果
  146. err = json.Unmarshal(result, &resp)
  147. if err != nil {
  148. return
  149. }
  150. if resp.ErrCode != 0 {
  151. err = errors.New(fmt.Sprintf("响应代码:%d,错误信息:%s", resp.ErrCode, resp.ErrMsg))
  152. return
  153. }
  154. dataResp = resp.Data
  155. return
  156. }
  157. // HttpPostXmxyg
  158. // @Description: post请求
  159. // @author: Roc
  160. // @datetime 2024-02-27 18:45:30
  161. // @param urlPath string
  162. // @param postData string
  163. // @return []byte
  164. // @return error
  165. func HttpPostXmxyg(urlPath, postData string) ([]byte, error) {
  166. if global.CONFIG.Xiangyu.IndexCrmHost == `` {
  167. return nil, errors.New("crm数据平台地址为空")
  168. }
  169. // 请求地址
  170. postUrl := global.CONFIG.Xiangyu.IndexCrmHost + urlPath
  171. body := io.NopCloser(strings.NewReader(postData))
  172. client := &http.Client{}
  173. req, err := http.NewRequest("POST", postUrl, body)
  174. if err != nil {
  175. return nil, err
  176. }
  177. req.Header.Set("content-Type", "application/json; charset=utf-8")
  178. req.Header.Set("Accept-Encoding", "application/json; charset=utf-8")
  179. req.Header.Set("Accept", "application/json; charset=utf-8")
  180. // 鉴权
  181. req.SetBasicAuth(global.CONFIG.Xiangyu.IndexSyncAuthUserName, global.CONFIG.Xiangyu.IndexSyncAuthPwd)
  182. // 秘钥
  183. if global.CONFIG.Xiangyu.IndexKey != `` {
  184. req.Header.Set("deipaaskeyauth", global.CONFIG.Xiangyu.IndexKey)
  185. }
  186. resp, err := client.Do(req)
  187. if err != nil {
  188. return nil, err
  189. }
  190. defer resp.Body.Close()
  191. result, err := io.ReadAll(resp.Body)
  192. if err != nil {
  193. return nil, err
  194. }
  195. // 日志记录
  196. global.FILE_LOG.Debug("crm数据平台:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
  197. // 解析返回参数,判断是否是json
  198. if !json.Valid(result) {
  199. err = errors.New("返回参数不是json格式")
  200. }
  201. return result, err
  202. }