edb_data_ys.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /**
  2. * @Author: jgl
  3. * @Date: 2021/9/15 10:15
  4. */
  5. package data_manage
  6. import (
  7. "crypto/md5"
  8. "encoding/hex"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "hongze/hongze_task/utils"
  13. "io/ioutil"
  14. "net/http"
  15. "net/url"
  16. "rdluck_tools/orm"
  17. "strconv"
  18. "strings"
  19. "time"
  20. )
  21. //刷新有色指标数据
  22. func RefreshEdbDataByYs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  23. o := orm.NewOrm()
  24. o.Using("data")
  25. o.Begin()
  26. defer func() {
  27. if err != nil {
  28. o.Rollback()
  29. } else {
  30. o.Commit()
  31. }
  32. }()
  33. token, err := getToken("pqian@hzinsights.com", "hz123456")
  34. if err != nil {
  35. fmt.Println(err)
  36. return
  37. }
  38. ysResult, err := getApiData(token, edbCode, startDate, endDate)
  39. if err != nil {
  40. fmt.Println(err)
  41. return
  42. }
  43. edbInfoIdStr := strconv.Itoa(edbInfoId)
  44. if ysResult != nil && len(ysResult.Data.Content) > 0 {
  45. var isAdd bool
  46. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  47. existMap := make(map[string]string)
  48. frequency := ysResult.Data.Frequency
  49. for _, rv := range ysResult.Data.Content {
  50. var eDate, sValue string
  51. for ck, cv := range rv {
  52. if ck == 0 {
  53. eDate = cv
  54. }
  55. if ck == 1 {
  56. sValue = strings.Replace(cv, ",", "", -1)
  57. }
  58. }
  59. if sValue=="" {
  60. continue
  61. }
  62. if frequency == "月" {
  63. monthDate, err := time.Parse("2006-01", eDate)
  64. if err != nil {
  65. fmt.Println("time.Parse:" + err.Error())
  66. }
  67. lastTime := monthDate.AddDate(0, 1, -1)
  68. lastYear, lastMonth, lastDay := lastTime.Date()
  69. var lastDate string
  70. if int(lastMonth) < 10 {
  71. lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  72. } else {
  73. lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  74. }
  75. eDate = lastDate
  76. }
  77. count, err := GetEdbDataBaseByCodeAndDate(utils.DATA_SOURCE_YS, edbCode, eDate)
  78. if err != nil && err.Error() != utils.ErrNoRow() {
  79. return err
  80. }
  81. if count <= 0 {
  82. dataTime, err := time.Parse(utils.FormatDate, eDate)
  83. if err != nil {
  84. return err
  85. }
  86. timestamp := dataTime.UnixNano() / 1e6
  87. timeStr := fmt.Sprintf("%d", timestamp)
  88. if _, ok := existMap[eDate]; !ok {
  89. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  90. isAdd = true
  91. }
  92. } else {
  93. sql := ` UPDATE edb_data_ys SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  94. _, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
  95. }
  96. existMap[eDate] = sValue
  97. }
  98. if isAdd {
  99. addSql = strings.TrimRight(addSql, ",")
  100. _, err = o.Raw(addSql).Exec()
  101. if err != nil {
  102. return err
  103. }
  104. }
  105. }
  106. maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_LZ, edbCode)
  107. if err != nil {
  108. return err
  109. }
  110. if maxAndMinItem != nil {
  111. err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  112. if err != nil {
  113. return err
  114. }
  115. }
  116. return
  117. }
  118. const (
  119. dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
  120. //dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
  121. authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
  122. )
  123. type TokenResp struct {
  124. Code int `json:"Code"`
  125. Msg string `json:"Msg"`
  126. Data TokenData `json:"Data"`
  127. }
  128. type TokenData struct {
  129. Token string `json:"Token"`
  130. }
  131. //获取token
  132. func getToken(userName string, password string) (string, error) {
  133. encryptAuth := md5.New()
  134. encryptAuth.Write([]byte(password)) //encrypt password with md5
  135. newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
  136. resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
  137. if err != nil {
  138. return "", err
  139. }
  140. defer resp.Body.Close()
  141. body, err := ioutil.ReadAll(resp.Body)
  142. if err != nil {
  143. fmt.Println("reponse error", err)
  144. return "", err
  145. }
  146. var bodyJsonContent TokenResp
  147. if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
  148. fmt.Println(err, "unmarsal failure")
  149. return "", err
  150. }
  151. var token string
  152. if bodyJsonContent.Code == 0 {
  153. token = bodyJsonContent.Data.Token
  154. }
  155. //print(token)
  156. return token, nil
  157. }
  158. //request response
  159. type DataResp struct {
  160. Code int `json:"Code"`
  161. Msg string `json:"Msg"`
  162. Data *ApiData `json:"Data"`
  163. }
  164. //api data response
  165. type ApiData struct {
  166. Status int `json:"Status"` //0 no permission,1 ok
  167. Field []ApiField `json:"Field"`
  168. Content [][]string `json:"Content"`
  169. }
  170. //api title
  171. type ApiField struct {
  172. Unit string `json:"Unit"`
  173. Info string `json:"Info"`
  174. Name string `json:"Name"`
  175. ColumnType string `json:"ColumnType"`
  176. ColIndex uint `json:"ColIndex"`
  177. IsDate string `json:"IsDate"`
  178. }
  179. type YsResult struct {
  180. Code int64 `json:"Code"`
  181. Data struct {
  182. CompanyList []interface{} `json:"CompanyList"`
  183. Content [][]string `json:"Content"`
  184. Field []struct {
  185. ColIndex int64 `json:"ColIndex"`
  186. ColumnType string `json:"ColumnType"`
  187. Info string `json:"Info"`
  188. IsDate string `json:"IsDate"`
  189. Name string `json:"Name"`
  190. Unit string `json:"Unit"`
  191. DBColName string `json:"db_col_name"`
  192. } `json:"Field"`
  193. CountPage int64 `json:"count_page"`
  194. CurrentPage int64 `json:"current_page"`
  195. Frequency string `json:"frequency"`
  196. Mindate string `json:"mindate"`
  197. PageNum int64 `json:"page_num"`
  198. Status int64 `json:"status"`
  199. TotalNum int64 `json:"total_num"`
  200. } `json:"Data"`
  201. Msg string `json:"Msg"`
  202. }
  203. /*
  204. * request data
  205. * sdatetime,edatetime ==>format:yyyy-mm-dd,
  206. * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
  207. */
  208. func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *YsResult, err error) {
  209. reqUrl := dataUrl + apiName
  210. resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
  211. if err != nil {
  212. return nil, err
  213. }
  214. defer resp.Body.Close()
  215. body, err := ioutil.ReadAll(resp.Body)
  216. if err != nil {
  217. fmt.Println("response error")
  218. return nil, err
  219. }
  220. utils.FileLog.Info("ys result:" + string(body))
  221. dataJsonContent := new(YsResult)
  222. if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
  223. fmt.Println(err, "data unmarshal failure")
  224. return nil, err
  225. }
  226. if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
  227. return dataJsonContent, nil
  228. } else {
  229. err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
  230. }
  231. return nil, nil
  232. }