edb_data_ys.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. /**
  2. * @Author: jgl
  3. * @Date: 2021/9/14 13:33
  4. */
  5. package data_manage
  6. import (
  7. "crypto/md5"
  8. "encoding/hex"
  9. "encoding/json"
  10. "errors"
  11. "eta/eta_mobile/utils"
  12. "fmt"
  13. "github.com/beego/beego/v2/client/orm"
  14. "io/ioutil"
  15. "net/http"
  16. "net/url"
  17. "strconv"
  18. )
  19. type BaseFromSmmDataSimple struct {
  20. SmmDataId int `orm:"column(smm_data_id);pk"`
  21. BaseFromSmmIndexId int
  22. IndexCode string
  23. DataTime string
  24. Value string
  25. }
  26. func GetEdbDataYsMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
  27. o := orm.NewOrmUsingDB("data")
  28. sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_ys WHERE edb_code=? `
  29. err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
  30. return
  31. }
  32. // 有色
  33. //func GetEdbDataByYs(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
  34. // o := orm.NewOrmUsingDB("data")
  35. // to, err := o.Begin()
  36. // if err != nil {
  37. // return
  38. // }
  39. // searchItem = new(EdbInfoSearch)
  40. // searchItem.EdbCode = edbCode
  41. // smmBaseDataAll, err := GetBaseFromSmmDataAllByIndexCode(edbCode)
  42. // if err != nil && err.Error() != utils.ErrNoRow() {
  43. // return
  44. // }
  45. //
  46. // var isAdd bool
  47. // addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  48. // dataList := make([]*EdbInfoSearchData, 0)
  49. // existMap := make(map[string]string)
  50. //
  51. // for _, sv := range smmBaseDataAll {
  52. // eDate := sv.DataTime
  53. // dataTime, err := time.Parse(utils.FormatDate, eDate)
  54. // if err != nil {
  55. // fmt.Println("time.Parse Err:" + eDate)
  56. // return nil, err
  57. // }
  58. // timestamp := dataTime.UnixNano() / 1e6
  59. // timeStr := fmt.Sprintf("%d", timestamp)
  60. // if _, ok := existMap[eDate]; !ok {
  61. // addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  62. // isAdd = true
  63. // }
  64. // existMap[eDate] = sv.Value
  65. // }
  66. // if isAdd {
  67. // addSql = strings.TrimRight(addSql, ",")
  68. // utils.FileLog.Info("addSql:" + addSql)
  69. // _, err = to.Raw(addSql).Exec()
  70. // if err != nil {
  71. // return searchItem, err
  72. // }
  73. // }
  74. // if err != nil {
  75. // _ = to.Rollback()
  76. // } else {
  77. // _ = to.Commit()
  78. // }
  79. // size := utils.EDB_DATA_LIMIT
  80. // dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, size)
  81. // if err != nil {
  82. // utils.FileLogData.Info("GetEdbDataThsByCode Err:%s", err.Error())
  83. // return searchItem, err
  84. // }
  85. // minDate, maxDate, err := GetEdbDataYsMaxAndMinDate(edbCode)
  86. // if err != nil {
  87. // return searchItem, err
  88. // }
  89. // searchItem.DataList = dataList
  90. // searchItem.StartDate = minDate
  91. // searchItem.EndDate = maxDate
  92. // if searchItem.DataList == nil {
  93. // searchItem.DataList = make([]*EdbInfoSearchData, 0)
  94. // }
  95. // return
  96. //}
  97. // 全部刷新有色数据
  98. //func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
  99. // o := orm.NewOrmUsingDB("data")
  100. // to, err := o.Begin()
  101. // if err != nil {
  102. // return
  103. // }
  104. // defer func() {
  105. // if err != nil {
  106. // _ = to.Rollback()
  107. // } else {
  108. // _ = to.Commit()
  109. // }
  110. // }()
  111. //
  112. // if err != nil {
  113. // return
  114. // }
  115. // edbInfoIdStr := strconv.Itoa(edbInfoId)
  116. // //获取数据
  117. // err = SyncSmmIndexDataBase(edbCode, startDate, endDate)
  118. // if err != nil {
  119. // err = errors.New("SyncSmmIndexDataBase Err:" + err.Error())
  120. // return err
  121. // }
  122. // //获取已存在指标所有数据
  123. // existDataList := make([]*EdbDataBase, 0)
  124. // dataTableName := GetEdbDataTableName(source)
  125. // sql := `SELECT * FROM %s WHERE edb_info_id=? `
  126. // sql = fmt.Sprintf(sql, dataTableName)
  127. // _, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
  128. // if err != nil {
  129. // return err
  130. // }
  131. // existDataMap := make(map[string]string)
  132. // for _, v := range existDataList {
  133. // existDataMap[v.DataTime] = v.Value
  134. // }
  135. //
  136. // smmDateList := make([]*BaseFromSmmDataSimple, 0)
  137. // smmSql := ` SELECT * FROM base_from_smm_data WHERE index_code=? AND data_time>=? `
  138. // _, err = to.Raw(smmSql, edbCode, startDate).QueryRows(&smmDateList)
  139. // if err != nil {
  140. // return err
  141. // }
  142. //
  143. // addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  144. // var isAdd bool
  145. // for _, sv := range smmDateList {
  146. // if existVal, ok := existDataMap[sv.DataTime]; !ok {
  147. // dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
  148. // if err != nil {
  149. // return err
  150. // }
  151. // timestamp := dataTime.UnixNano() / 1e6
  152. // timeStr := fmt.Sprintf("%d", timestamp)
  153. // addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
  154. // isAdd = true
  155. // } else {
  156. // if existVal != sv.Value {
  157. // sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  158. // sql = fmt.Sprintf(sql, dataTableName)
  159. // _, err = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
  160. // if err != nil {
  161. // return err
  162. // }
  163. // }
  164. // }
  165. // }
  166. // if isAdd {
  167. // addSql = strings.TrimRight(addSql, ",")
  168. // _, err = to.Raw(addSql).Exec()
  169. // if err != nil {
  170. // return err
  171. // }
  172. // }
  173. // return
  174. //}
  175. //func SyncSmmIndexDataBase(edbCode, startDate, endDate string) (err error) {
  176. // utils.FileLog.Info("start:" + time.Now().Format(utils.FormatDateTime))
  177. //
  178. // var smmCode string
  179. // if strings.Contains(edbCode, "#") {
  180. // smmCode = strings.Split(edbCode, "#")[0]
  181. // } else {
  182. // smmCode = edbCode
  183. // }
  184. // token, err := getToken("pqian@hzinsights.com", "hz123456")
  185. // if err != nil {
  186. // fmt.Println(err)
  187. // return
  188. // }
  189. // baseSmmItem, err := GetBaseFromSmmBySmmCode(smmCode)
  190. // if err != nil {
  191. // fmt.Println(err)
  192. // return
  193. // }
  194. //
  195. // if baseSmmItem == nil {
  196. // err = errors.New("GetBaseFromSmmBySmmCode Err:" + err.Error())
  197. // return
  198. // }
  199. //
  200. // smmIndexAll, err := GetBaseFromSmmIndexBySmmCode(smmCode)
  201. // if err != nil {
  202. // fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
  203. // return
  204. // }
  205. // existIndexMap := make(map[string]*BaseFromSmmIndex)
  206. // for _, item := range smmIndexAll {
  207. // existIndexMap[item.IndexCode] = item
  208. // }
  209. //
  210. // ysItem, err := getApiData(token, edbCode, startDate, endDate)
  211. // if err != nil {
  212. // fmt.Println(err)
  213. // return
  214. // }
  215. // if ysItem != nil && ysItem.Code == 200 {
  216. //
  217. // frequency := ysItem.Data.Frequency
  218. //
  219. // indexMap := make(map[string]int)
  220. // smmIndexIdMap := make(map[int]int)
  221. // indexCodeMap := make(map[int]string)
  222. //
  223. // indexKey := 0
  224. // var isDateIndex int
  225. // for fk, fv := range ysItem.Data.Field {
  226. // if fv.IsDate == "1" {
  227. // isDateIndex = fk
  228. // } else {
  229. // if !strings.Contains(fv.Name, "产品名称") &&
  230. // !strings.Contains(fv.Name, "单位") &&
  231. // !strings.Contains(fv.Name, "时间") &&
  232. // !strings.Contains(fv.Name, "备注") {
  233. //
  234. // indexMap[fv.DBColName] = fk
  235. //
  236. // indexKey += 1
  237. // indexCode := smmCode + "#" + strconv.Itoa(indexKey)
  238. //
  239. // if findItem, ok := existIndexMap[indexCode]; !ok {
  240. // ssmIndex := new(BaseFromSmmIndex)
  241. // ssmIndex.Interface = smmCode
  242. // ssmIndex.Name = baseSmmItem.Name
  243. // ssmIndex.IndexCode = indexCode
  244. // ssmIndex.IndexName = baseSmmItem.Name + "_" + fv.Name
  245. // ssmIndex.Type1 = baseSmmItem.Type1
  246. // ssmIndex.Type2 = baseSmmItem.Type2
  247. // ssmIndex.Type3 = baseSmmItem.Type3
  248. // ssmIndex.Frequency = frequency
  249. // ssmIndex.Unit = fv.Unit
  250. // ssmIndex.ApiStartTime = baseSmmItem.ApiStartTime
  251. // ssmIndex.ApiUpdateTime = baseSmmItem.ApiUpdateTime
  252. // ssmIndex.StartTime = baseSmmItem.StartTime
  253. // ssmIndex.FinishTime = baseSmmItem.FinishTime
  254. // ssmIndex.CreateTime = time.Now()
  255. // ssmIndex.ModifyTime = time.Now()
  256. // lastIndexId, err := AddBaseFromSmmIndex(ssmIndex)
  257. // if err != nil {
  258. // err = errors.New("AddBaseFromSmmIndex Err:" + err.Error())
  259. // return err
  260. // }
  261. // smmIndexIdMap[fk] = int(lastIndexId)
  262. // indexCodeMap[fk] = indexCode
  263. // } else {
  264. // smmIndexIdMap[fk] = findItem.BaseFromSmmIndexId
  265. // indexCodeMap[fk] = findItem.IndexCode
  266. // }
  267. // }
  268. // }
  269. // }
  270. //
  271. // existDataMap := make(map[string]*BaseFromSmmData)
  272. // for _, mv := range indexCodeMap {
  273. // indexCode := mv
  274. // dataAllList, err := GetBaseFromSmmDataAllByIndexCode(indexCode)
  275. // if err != nil {
  276. // err = errors.New("GetBaseFromSmmData Err:" + err.Error())
  277. // return err
  278. // }
  279. // for _, item := range dataAllList {
  280. // key := item.IndexCode + item.DataTime
  281. // existDataMap[key] = item
  282. // }
  283. // }
  284. //
  285. // addExistDataMap := make(map[string]string)
  286. //
  287. // for _, dv := range ysItem.Data.Content {
  288. // var dataTime string
  289. // dataTime = dv[isDateIndex]
  290. // if strings.Contains(dataTime, "Q1") {
  291. // dataTime = strings.Replace(dataTime, "Q1", "-01", -1)
  292. // dataTime += "-31"
  293. // }
  294. // if strings.Contains(dataTime, "Q2") {
  295. // dataTime = strings.Replace(dataTime, "Q2", "-06", -1)
  296. // dataTime += "-30"
  297. // }
  298. // if strings.Contains(dataTime, "Q3") {
  299. // dataTime = strings.Replace(dataTime, "Q3", "-09", -1)
  300. // dataTime += "-30"
  301. // }
  302. // if strings.Contains(dataTime, "Q4") {
  303. // dataTime = strings.Replace(dataTime, "Q4", "-12", -1)
  304. // dataTime += "-31"
  305. // }
  306. //
  307. // if strings.Contains(dataTime, "H1") {
  308. // dataTime = strings.Replace(dataTime, "H1", "-06", -1)
  309. // dataTime += "-30"
  310. // }
  311. //
  312. // if strings.Contains(dataTime, "H2") {
  313. // dataTime = strings.Replace(dataTime, "H2", "-12", -1)
  314. // dataTime += "-31"
  315. // }
  316. //
  317. // if frequency == "月" {
  318. // monthDate, err := time.Parse("2006-01", dataTime)
  319. // if err != nil {
  320. // fmt.Println("time.Parse:" + err.Error())
  321. // }
  322. // lastTime := monthDate.AddDate(0, 1, -1)
  323. // lastYear, lastMonth, lastDay := lastTime.Date()
  324. // var lastDate string
  325. // if int(lastMonth) < 10 {
  326. // lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  327. // } else {
  328. // lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  329. // }
  330. // dataTime = lastDate
  331. // } else if frequency == "年" {
  332. // dataTime = dataTime + "-12-31"
  333. // }
  334. // saveDataTime, err := time.Parse(utils.FormatDate, dataTime)
  335. // if err != nil {
  336. // err = errors.New("time.Parse Err:" + err.Error())
  337. // return err
  338. // }
  339. // timestamp := saveDataTime.UnixNano() / 1e6
  340. // //循环指标
  341. // for _, v := range indexMap {
  342. //
  343. // indexCode := indexCodeMap[v]
  344. // smmIndexId := smmIndexIdMap[v]
  345. // dataVal := dv[v]
  346. //
  347. // if indexCode != "" {
  348. //
  349. // key := indexCode + dataTime
  350. // val := strings.Replace(dataVal, ",", "", -1)
  351. // if findData, dataOk := existDataMap[key]; !dataOk {
  352. // if _, addOK := addExistDataMap[key]; !addOK {
  353. // if val != "" && val != "-" {
  354. // dataItem := new(BaseFromSmmData)
  355. // dataItem.BaseFromSmmIndexId = smmIndexId
  356. // dataItem.IndexCode = indexCode
  357. // dataItem.DataTime = dataTime
  358. // dataItem.Value = val
  359. // dataItem.CreateTime = time.Now()
  360. // dataItem.ModifyTime = time.Now()
  361. // dataItem.DataTimestamp = timestamp
  362. // _, err = AddBaseFromSmmData(dataItem)
  363. // if err != nil && !strings.Contains(err.Error(), "idx_index_code_date") {
  364. // fmt.Println("AddBaseFromSmmData Err:" + err.Error())
  365. // err = errors.New("AddBaseFromSmmData Err:" + err.Error())
  366. // return err
  367. // }
  368. // }
  369. // }
  370. // } else {
  371. // if findData != nil && findData.Value != val { //修改
  372. // if _, addOK := addExistDataMap[key]; !addOK {
  373. // if val != "" && val != "-" {
  374. // err = ModifyBaseFromSmmData(findData.SmmDataId, val)
  375. // if err != nil {
  376. // err = errors.New("ModifyBaseFromSmmData Err:" + err.Error())
  377. // return err
  378. // }
  379. // }
  380. // }
  381. // }
  382. // }
  383. // addExistDataMap[key] = key
  384. // }
  385. // }
  386. // }
  387. //
  388. // //修改数据开始,结束日期
  389. // {
  390. // indexList, err := GetBaseFromSmmIndexBySmmCode(smmCode)
  391. // if err != nil {
  392. // fmt.Println("GetBaseFromSmmIndexBySmmCode Err:" + err.Error())
  393. // }
  394. // for _, sv := range indexList {
  395. // minDate, maxDate, err := GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
  396. // if err != nil {
  397. // fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
  398. // } else {
  399. // err = ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, minDate, maxDate)
  400. // if err != nil {
  401. // fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
  402. // }
  403. // }
  404. // }
  405. // }
  406. // }
  407. // return
  408. //}
  409. const (
  410. dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
  411. //dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
  412. authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
  413. )
  414. type TokenResp struct {
  415. Code int `json:"Code"`
  416. Msg string `json:"Msg"`
  417. Data TokenData `json:"Data"`
  418. }
  419. type TokenData struct {
  420. Token string `json:"Token"`
  421. }
  422. // 获取token
  423. func getToken(userName string, password string) (string, error) {
  424. encryptAuth := md5.New()
  425. encryptAuth.Write([]byte(password)) //encrypt password with md5
  426. newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
  427. resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
  428. if err != nil {
  429. return "", err
  430. }
  431. defer resp.Body.Close()
  432. body, err := ioutil.ReadAll(resp.Body)
  433. if err != nil {
  434. fmt.Println("reponse error", err)
  435. return "", err
  436. }
  437. var bodyJsonContent TokenResp
  438. if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
  439. fmt.Println(err, "unmarsal failure")
  440. return "", err
  441. }
  442. var token string
  443. if bodyJsonContent.Code == 0 {
  444. token = bodyJsonContent.Data.Token
  445. }
  446. //print(token)
  447. return token, nil
  448. }
  449. // request response
  450. type DataResp struct {
  451. Code int `json:"Code"`
  452. Msg string `json:"Msg"`
  453. Data *ApiData `json:"Data"`
  454. }
  455. // api data response
  456. type ApiData struct {
  457. Status int `json:"Status"` //0 no permission,1 ok
  458. Field []ApiField `json:"Field"`
  459. Content [][]string `json:"Content"`
  460. }
  461. // api title
  462. type ApiField struct {
  463. Unit string `json:"Unit"`
  464. Info string `json:"Info"`
  465. Name string `json:"Name"`
  466. ColumnType string `json:"ColumnType"`
  467. ColIndex uint `json:"ColIndex"`
  468. IsDate string `json:"IsDate"`
  469. }
  470. type YsResult struct {
  471. Code int64 `json:"Code"`
  472. Data struct {
  473. CompanyList []interface{} `json:"CompanyList"`
  474. Content [][]string `json:"Content"`
  475. Field []struct {
  476. ColIndex int64 `json:"ColIndex"`
  477. ColumnType string `json:"ColumnType"`
  478. Info string `json:"Info"`
  479. IsDate string `json:"IsDate"`
  480. Name string `json:"Name"`
  481. Unit string `json:"Unit"`
  482. DBColName string `json:"db_col_name"`
  483. } `json:"Field"`
  484. CountPage int64 `json:"count_page"`
  485. CurrentPage int64 `json:"current_page"`
  486. Frequency string `json:"frequency"`
  487. Mindate string `json:"mindate"`
  488. PageNum int64 `json:"page_num"`
  489. Status int64 `json:"status"`
  490. TotalNum int64 `json:"total_num"`
  491. } `json:"Data"`
  492. Msg string `json:"Msg"`
  493. }
  494. /*
  495. * request data
  496. * sdatetime,edatetime ==>format:yyyy-mm-dd,
  497. * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
  498. */
  499. func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *YsResult, err error) {
  500. reqUrl := dataUrl + apiName
  501. resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
  502. if err != nil {
  503. return nil, err
  504. }
  505. defer resp.Body.Close()
  506. body, err := ioutil.ReadAll(resp.Body)
  507. if err != nil {
  508. fmt.Println("response error")
  509. return nil, err
  510. }
  511. utils.FileLog.Info("ys result:" + string(body))
  512. dataJsonContent := new(YsResult)
  513. if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
  514. fmt.Println(err, "data unmarshal failure")
  515. return nil, err
  516. }
  517. if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
  518. return dataJsonContent, nil
  519. } else {
  520. err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
  521. }
  522. return nil, nil
  523. }