jiayue_platform.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. package index_data
  2. import (
  3. "eta/eta_bridge/global"
  4. "eta/eta_bridge/models/jiayue"
  5. "eta/eta_bridge/models/response"
  6. "eta/eta_bridge/services/alarm_msg"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. )
  11. // GetIndexFromJiaYue 获取嘉悦指标信息
  12. func GetIndexFromJiaYue(indexCode string, sourceArr []string) (data *response.IndexResp, err error) {
  13. defer func() {
  14. if err != nil {
  15. global.LOG.Info("GetIndexFromJiaYue Err: " + err.Error())
  16. go alarm_msg.SendAlarmMsg("GetIndexFromJiaYue Err: "+err.Error(), 3)
  17. return
  18. }
  19. }()
  20. indexCond := ``
  21. indexPars := make([]interface{}, 0)
  22. // 指标存在无编码情况, 尝试转换indexCode为int查自增ID
  23. indexId, e := strconv.Atoi(indexCode)
  24. if e == nil && indexId > 0 {
  25. indexCond = ` (ID = :1 OR SOURCE_CODE = :1)`
  26. indexPars = append(indexPars, indexId, indexCode)
  27. } else {
  28. indexCond = ` SOURCE_CODE = :1`
  29. indexPars = append(indexPars, indexCode)
  30. }
  31. if len(sourceArr) > 0 {
  32. indexCond += ` AND SOURCE_TYPE IN (:1)`
  33. indexPars = append(indexPars, sourceArr)
  34. }
  35. indexes, e := jiayue.GetDictIndex(indexCond, indexPars, "")
  36. if e != nil {
  37. err = fmt.Errorf("GetDictIndex err: %s", e.Error())
  38. return
  39. }
  40. if len(indexes) <= 0 {
  41. global.LOG.Info(indexCode + "指标信息不存在")
  42. return
  43. }
  44. index := indexes[0]
  45. if index.Id <= 0 {
  46. err = fmt.Errorf("指标信息有误")
  47. return
  48. }
  49. var (
  50. indexData []jiayue.DictData
  51. dictMenu []jiayue.DictCategory
  52. )
  53. data = FormatJiaYueIndexItem2Resp(index, indexData, dictMenu)
  54. return
  55. }
  56. // GetIndexAndDataFromJiaYue 获取指标和数据
  57. func GetIndexAndDataFromJiaYue(indexCode, startDate, endDate string, sourceArr []string) (data *response.IndexResp, err error) {
  58. defer func() {
  59. if err != nil {
  60. global.LOG.Info("GetIndexAndDataFromJiaYue Err: " + err.Error())
  61. go alarm_msg.SendAlarmMsg("GetIndexAndDataFromJiaYue Err: "+err.Error(), 3)
  62. return
  63. }
  64. }()
  65. indexCond := ``
  66. indexPars := make([]interface{}, 0)
  67. // 指标存在无编码情况, 尝试转换indexCode为int查自增ID
  68. indexId, e := strconv.Atoi(indexCode)
  69. if e == nil && indexId > 0 {
  70. indexCond = ` (ID = :1 OR SOURCE_CODE = :1)`
  71. indexPars = append(indexPars, indexId, indexCode)
  72. } else {
  73. indexCond = ` SOURCE_CODE = :1`
  74. indexPars = append(indexPars, indexCode)
  75. }
  76. if len(sourceArr) > 0 {
  77. indexCond += ` AND SOURCE_TYPE IN (:1)`
  78. indexPars = append(indexPars, sourceArr)
  79. }
  80. indexes, e := jiayue.GetDictIndex(indexCond, indexPars, "")
  81. if e != nil {
  82. err = fmt.Errorf("GetDictIndex err: %s", e.Error())
  83. return
  84. }
  85. if len(indexes) <= 0 {
  86. global.LOG.Info(indexCode + "指标信息不存在")
  87. return
  88. }
  89. index := indexes[0]
  90. if index.Id <= 0 {
  91. err = fmt.Errorf("指标信息有误")
  92. return
  93. }
  94. if index.TableName == "" {
  95. err = fmt.Errorf("指标信息数据表名为空")
  96. return
  97. }
  98. // 指标数据
  99. dataCond := " INDEX_ID = :1"
  100. dataPars := make([]interface{}, 0)
  101. dataPars = append(dataPars, index.Id)
  102. if startDate != "" {
  103. dataCond += " AND INDEX_DATE >= TO_DATE (:1, 'yyyy-mm-dd')"
  104. dataPars = append(dataPars, startDate)
  105. }
  106. if endDate != "" {
  107. dataCond += " AND INDEX_DATE <= TO_DATE (:1, 'yyyy-mm-dd')"
  108. dataPars = append(dataPars, endDate)
  109. }
  110. indexData, e := jiayue.GetDictData(index.TableName, dataCond, dataPars)
  111. if e != nil {
  112. err = fmt.Errorf("GetDictData err: %s", e.Error())
  113. return
  114. }
  115. // 指标目录
  116. menuCond := ` R.INDEX_ID = :1`
  117. menuPars := make([]interface{}, 0)
  118. menuPars = append(menuPars, index.Id)
  119. menus, e := jiayue.GetIndexCategory(menuCond, menuPars, "")
  120. if e != nil {
  121. err = fmt.Errorf("GetDictCategory err: %s", e.Error())
  122. return
  123. }
  124. data = FormatJiaYueIndexItem2Resp(index, indexData, menus)
  125. return
  126. }
  127. // GetPageIndexesFromJiaYue 分页获取指标数据
  128. func GetPageIndexesFromJiaYue(pageIndex, pageSize int, sourceArr []string, keyword, frequency string, sortField, sortRule int) (total int, result []jiayue.DictIndex, err error) {
  129. defer func() {
  130. if err != nil {
  131. global.LOG.Info("GetPageIndexesFromJiaYue Err: " + err.Error())
  132. go alarm_msg.SendAlarmMsg("GetPageIndexesFromJiaYue Err: "+err.Error(), 3)
  133. return
  134. }
  135. }()
  136. indexCond := ``
  137. indexPars := make([]interface{}, 0)
  138. // 筛选项
  139. if len(sourceArr) > 0 {
  140. indexCond += ` SOURCE_TYPE IN (:1)`
  141. indexPars = append(indexPars, sourceArr)
  142. }
  143. keyword = strings.TrimSpace(keyword)
  144. if keyword != "" {
  145. kw := fmt.Sprint("%", keyword, "%")
  146. indexCond += ` AND (ID LIKE :1 OR CODE LIKE :1 OR NAME LIKE :1)`
  147. indexPars = append(indexPars, kw, kw, kw)
  148. }
  149. if frequency != "" {
  150. indexCond += ` AND FREQUENCY = :1`
  151. indexPars = append(indexPars, frequency)
  152. }
  153. // 总记录数
  154. t, e := jiayue.GetDictIndexCount(indexCond, indexPars)
  155. if e != nil {
  156. err = fmt.Errorf("GetDictIndexCount err: %s", e.Error())
  157. return
  158. }
  159. total = t
  160. // 列表数据
  161. indexes, e := jiayue.GetDictPageIndex(indexCond, indexPars, pageIndex, pageSize, sortField, sortRule)
  162. if e != nil {
  163. err = fmt.Errorf("GetDictPageIndex err: %s", e.Error())
  164. return
  165. }
  166. result = indexes
  167. return
  168. }
  169. // GetNewIndexAndDataFromJiaYue 获取就近新增的指标和数据
  170. func GetNewIndexAndDataFromJiaYue() (indexList []*response.IndexResp, err error) {
  171. defer func() {
  172. if err != nil {
  173. global.LOG.Info("GetIndexAndDataFromJiaYue Err: " + err.Error())
  174. go alarm_msg.SendAlarmMsg("GetIndexAndDataFromJiaYue Err: "+err.Error(), 3)
  175. return
  176. }
  177. }()
  178. indexCond := ``
  179. indexPars := make([]interface{}, 0)
  180. // TODO:查询两个小时之前的数据(待定)
  181. //timeBefore := time.Now().Local().Add(-2 * time.Hour).Format(utils.FormatDateTime)
  182. //indexCond += ` CREATE_TIME <= TO_DATE (:1, 'yyyy-mm-dd hh24:mi:ss') `
  183. //indexPars = append(indexPars, timeBefore.Format(utils.FormatDateTime))
  184. // TODO:测试
  185. //endTime := time.Date(2023, 6, 8, 0, 0, 0, 0, time.Local).Format(utils.FormatDateTime)
  186. //indexCond += fmt.Sprintf(`CREATE_TIME <= TO_DATE ('%s', 'yyyy-mm-dd hh24:mi:ss')`, endTime)
  187. //sourceArr := []string{"bloomberg", "bloomberg_tmp"}
  188. //if len(sourceArr) > 0 {
  189. // str := ``
  190. // for _, s := range sourceArr {
  191. // str += fmt.Sprintf(`'%s',`, s)
  192. // }
  193. // str = strings.TrimRight(str, ",")
  194. // indexCond += fmt.Sprintf(` AND SOURCE_TYPE IN (%s)`, str)
  195. //}
  196. indexCond = ` ID = :1`
  197. indexPars = append(indexPars, 180399)
  198. indexes, e := jiayue.GetDictIndex(indexCond, indexPars, "CREATE_TIME ASC")
  199. if e != nil {
  200. err = fmt.Errorf("GetDictIndex err: %s", e.Error())
  201. return
  202. }
  203. if len(indexes) <= 0 {
  204. global.LOG.Info("无新指标需要同步")
  205. return
  206. }
  207. // 每个指标对应的数据表不定, 所以这里还是用循环去查
  208. indexList = make([]*response.IndexResp, 0)
  209. for _, v := range indexes {
  210. // 指标数据
  211. //dataCond := " INDEX_ID = :1"
  212. //dataPars := make([]interface{}, 0)
  213. //dataPars = append(dataPars, v.Id)
  214. //indexData, e := jiayue.GetDictData(v.TableName, dataCond, dataPars)
  215. //if e != nil {
  216. // err = fmt.Errorf("GetDictData err: %s", e.Error())
  217. // return
  218. //}
  219. //
  220. // 指标目录
  221. //menuCond := ` R.INDEX_ID = :1`
  222. //menuPars := make([]interface{}, 0)
  223. //menuPars = append(menuPars, v.Id)
  224. //menus, e := jiayue.GetIndexCategory(menuCond, menuPars, "")
  225. //if e != nil {
  226. // err = fmt.Errorf("GetDictCategory err: %s", e.Error())
  227. // return
  228. //}
  229. var (
  230. indexData []jiayue.DictData
  231. dictMenu []jiayue.DictCategory
  232. )
  233. item := FormatJiaYueIndexItem2Resp(v, indexData, dictMenu)
  234. indexList = append(indexList, item)
  235. }
  236. return
  237. }
  238. // FormatJiaYueIndexItem2Resp 格式化指标响应体
  239. func FormatJiaYueIndexItem2Resp(item jiayue.DictIndex, dictData []jiayue.DictData, dictMenu []jiayue.DictCategory) (res *response.IndexResp) {
  240. res = new(response.IndexResp)
  241. res.Id = item.Id
  242. res.IndexCode = item.Code
  243. res.IndexName = item.Name
  244. res.SourceType = item.SourceType
  245. res.Unit = item.Unit
  246. res.Frequency = item.Frequency
  247. res.LastDate = item.DateLast
  248. res.LastUpdateTime = item.TimeLastUpdate
  249. res.Status = item.Status
  250. if len(dictData) > 0 {
  251. for _, d := range dictData {
  252. res.IndexData = append(res.IndexData, response.IndexData{
  253. Val: d.IndexValue,
  254. DataTime: d.IndexDate,
  255. UpdateTime: d.UpdateTime,
  256. })
  257. }
  258. }
  259. if len(dictMenu) > 0 {
  260. firstMenu := dictMenu[0]
  261. r := FormatJiaYueDictCategory2Resp(firstMenu)
  262. res.MenuData = *r
  263. }
  264. return
  265. }
  266. // FormatJiaYueDictCategory2Resp 格式化指标目录响应体
  267. func FormatJiaYueDictCategory2Resp(item jiayue.DictCategory) (res *response.IndexMenuData) {
  268. res = new(response.IndexMenuData)
  269. res.Id = item.Id
  270. res.Type = item.Type
  271. res.Code = item.Code
  272. res.Name = item.Name
  273. res.Icon = item.Icon
  274. res.Sort = item.Sorting
  275. res.ParentId = item.ParentId
  276. res.ParentName = item.ParentName
  277. res.Path = item.Path
  278. return
  279. }
  280. type JiaYueImportIndexResp struct {
  281. FirstMenu string `description:"一级目录"`
  282. SecondMenu string `description:"二级目录"`
  283. ThirdMenu string `description:"三级目录"`
  284. FourthMenu string `description:"四级目录"`
  285. FifthMenu string `description:"五级目录"`
  286. SixthMenu string `description:"六级目录"`
  287. Id int `description:"指标ID"`
  288. IndexName string `description:"指标名称"`
  289. IndexCode string `description:"指标编码"`
  290. Unit string `description:"单位"`
  291. Frequency string `description:"频度"`
  292. SourceType string `description:"来源"`
  293. }
  294. func GetJiaYueImportData(sourceArr []string) (items []JiaYueImportIndexResp, err error) {
  295. defer func() {
  296. if err != nil {
  297. global.LOG.Info("GetJiaYueImportData Err: " + err.Error())
  298. go alarm_msg.SendAlarmMsg("GetJiaYueImportData Err: "+err.Error(), 3)
  299. return
  300. }
  301. }()
  302. // 获取指标
  303. indexCond := ` SOURCE_TYPE IN (:1)`
  304. indexPars := make([]interface{}, 0)
  305. if len(sourceArr) == 0 {
  306. sourceArr = []string{"webisite", "website", "website_gf", "platts", "reuter", "reuter_vessel_q", "路透", "bloomberg", "bloomberg_tmp", "wind", "wind_p", "wind_stop", "wind_tmp"}
  307. }
  308. indexPars = append(indexPars, sourceArr)
  309. indexes, e := jiayue.GetDictIndex(indexCond, indexPars, "SOURCE_TYPE ASC, ID ASC")
  310. if e != nil {
  311. err = fmt.Errorf("GetDictIndex err: %s", e.Error())
  312. return
  313. }
  314. if len(indexes) <= 0 {
  315. global.LOG.Info("无指标需要导入")
  316. return
  317. }
  318. index := indexes[0]
  319. if index.Id <= 0 {
  320. err = fmt.Errorf("指标信息有误")
  321. return
  322. }
  323. if index.TableName == "" {
  324. err = fmt.Errorf("指标信息数据表名为空")
  325. return
  326. }
  327. // 获取全部目录
  328. categories, e := jiayue.GetDictCategory(``, make([]interface{}, 0), "")
  329. if e != nil {
  330. err = fmt.Errorf("获取嘉业指标目录列表失败, err: %s", e.Error())
  331. return
  332. }
  333. categoryMap := make(map[int]jiayue.DictCategory)
  334. for _, v := range categories {
  335. categoryMap[v.Id] = v
  336. }
  337. items = make([]JiaYueImportIndexResp, 0)
  338. for _, v := range indexes {
  339. var t JiaYueImportIndexResp
  340. t.Id = v.Id
  341. t.IndexName = v.Name
  342. t.IndexCode = v.Code
  343. t.Unit = v.Unit
  344. t.Frequency = v.Frequency
  345. t.SourceType = v.SourceType
  346. // 目录
  347. menuCond := ` R.INDEX_ID = :1`
  348. menuPars := make([]interface{}, 0)
  349. menuPars = append(menuPars, t.Id)
  350. menus, e := jiayue.GetIndexCategory(menuCond, menuPars, "")
  351. if e != nil {
  352. err = fmt.Errorf("GetDictCategory err: %s", e.Error())
  353. return
  354. }
  355. if len(menus) == 0 {
  356. continue
  357. }
  358. menu := menus[0]
  359. path := strings.TrimLeft(menu.Path, "/") // "path": "/61293/67576/67577/67579/67583"
  360. menuIds := make([]int, 0)
  361. menuIdArr := strings.Split(path, "/")
  362. for _, m := range menuIdArr {
  363. mid, _ := strconv.Atoi(m)
  364. menuIds = append(menuIds, mid)
  365. }
  366. // 取出目录名称
  367. for k, m := range menuIds {
  368. mu := categoryMap[m]
  369. if mu.Id <= 0 {
  370. continue
  371. }
  372. if k == 0 {
  373. t.FirstMenu = mu.Name
  374. }
  375. if k == 1 {
  376. t.SecondMenu = mu.Name
  377. }
  378. if k == 2 {
  379. t.ThirdMenu = mu.Name
  380. }
  381. if k == 3 {
  382. t.FourthMenu = mu.Name
  383. }
  384. if k == 4 {
  385. t.FifthMenu = mu.Name
  386. }
  387. if k == 5 {
  388. t.SixthMenu = mu.Name
  389. }
  390. }
  391. items = append(items, t)
  392. }
  393. return
  394. }