base_from_rzd_index_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. // Package data
  2. // @Author gmy 2024/8/22 9:44:00
  3. package data
  4. import (
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "github.com/rdlucklib/rdluck_tools/paging"
  9. )
  10. // RzdIndexData 获取睿姿得指标数据
  11. func RzdIndexData(classifyId int, frequency string, currentIndex, startSize, pageSize int) (dataList []*data_manage.BaseFromRzdIndexList, err error) {
  12. // 获取指标
  13. var condition string
  14. var pars []interface{}
  15. if classifyId >= 0 {
  16. // 递归查询子集分类
  17. classifyIdList, err := recursiveQuery(classifyId)
  18. if err != nil {
  19. return nil, err
  20. }
  21. classifyIdList = append(classifyIdList, classifyId)
  22. interfaceClassifyIdList := make([]interface{}, len(classifyIdList))
  23. for i, id := range classifyIdList {
  24. interfaceClassifyIdList[i] = id
  25. }
  26. condition += ` AND base_from_rzd_classify_id in (` + utils.GetOrmInReplace(len(classifyIdList)) + `)`
  27. pars = append(pars, interfaceClassifyIdList...)
  28. }
  29. if frequency != "" {
  30. condition += ` AND frequency=? `
  31. pars = append(pars, frequency)
  32. }
  33. indexes, err := data_manage.GetRzdIndex(condition, pars)
  34. if err != nil {
  35. return nil, err
  36. }
  37. indexCodes := make([]string, 0)
  38. for _, v := range indexes {
  39. indexCodes = append(indexCodes, v.IndexCode)
  40. }
  41. indexCounts, e := data_manage.GetRzdIndexDataCountGroup(indexCodes)
  42. if e != nil {
  43. return nil, err
  44. }
  45. countMap := make(map[string]int)
  46. for _, v := range indexCounts {
  47. countMap[v.IndexCode] = v.Count
  48. }
  49. // 判断是否存在于指标库
  50. edbCodeList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_RZD, indexCodes)
  51. if err != nil {
  52. return
  53. }
  54. edbCodeMap := make(map[string]*data_manage.EdbInfo)
  55. for _, v := range edbCodeList {
  56. edbCodeMap[v.EdbCode] = v
  57. }
  58. resultList := make([]*data_manage.BaseFromRzdIndexList, 0)
  59. for _, v := range indexes {
  60. product := new(data_manage.BaseFromRzdIndexList)
  61. product.BaseFromRzdIndexId = v.BaseFromRzdIndexId
  62. product.BaseFromRzdClassifyId = v.BaseFromRzdClassifyId
  63. product.Unit = v.Unit
  64. product.IndexCode = v.IndexCode
  65. product.IndexName = v.IndexName
  66. product.Frequency = v.Frequency
  67. product.CreateTime = v.CreateTime
  68. product.ModifyTime = v.ModifyTime
  69. edbInfo := edbCodeMap[v.IndexCode]
  70. if edbInfo != nil {
  71. product.EdbInfoId = edbInfo.EdbInfoId
  72. }
  73. total := countMap[v.IndexCode]
  74. page := paging.GetPaging(currentIndex, pageSize, total)
  75. indexDataList, e := data_manage.GetRzdIndexData(v.IndexCode, startSize, pageSize)
  76. if e != nil {
  77. return nil, err
  78. }
  79. if indexDataList == nil {
  80. indexDataList = make([]*data_manage.BaseFromRzdData, 0)
  81. }
  82. product.DataList = indexDataList
  83. product.Paging = page
  84. resultList = append(resultList, product)
  85. }
  86. return resultList, nil
  87. }
  88. // 递归查询分类
  89. func recursiveQuery(classifyId int) ([]int, error) {
  90. var classifyIdList []int
  91. // 查询当前分类 ID 的子分类
  92. rzdClassifyList, err := GetRzdClassifyItemByParentId(classifyId)
  93. if err != nil {
  94. return nil, err
  95. }
  96. // 遍历子分类
  97. for _, classify := range rzdClassifyList {
  98. // 将当前子分类的 ID 添加到列表中
  99. classifyIdList = append(classifyIdList, classify.BaseFromRzdClassifyId)
  100. // 递归查询当前子分类的子分类
  101. childIds, err := recursiveQuery(classify.BaseFromRzdClassifyId)
  102. if err != nil {
  103. return nil, err
  104. }
  105. // 合并子分类的 ID
  106. classifyIdList = append(classifyIdList, childIds...)
  107. }
  108. return classifyIdList, nil
  109. }
  110. func GetRzdIndexFrequency(classify int) ([]*string, error) {
  111. classifyIdList, err := recursiveQuery(classify)
  112. if err != nil {
  113. return nil, err
  114. }
  115. classifyIdList = append(classifyIdList, classify)
  116. frequencyNameList, err := data_manage.GetRzdIndexFrequency(classifyIdList)
  117. if err != nil {
  118. return nil, err
  119. }
  120. return frequencyNameList, nil
  121. }
  122. // RzdIndexAddValidate 指标添加校验
  123. func RzdIndexAddValidate(req *data_manage.BaseFromRzdIndexBatchAddCheckReq) (*data_manage.BaseFromRzdIndexPage, error) {
  124. var condition string
  125. var pars []interface{}
  126. if req.IsCheckAll {
  127. if len(req.ClassifyIdList) >= 0 {
  128. condition += ` AND base_from_rzd_classify_id in (` + utils.GetOrmInReplace(len(req.ClassifyIdList)) + `)`
  129. for _, id := range req.ClassifyIdList {
  130. pars = append(pars, id)
  131. }
  132. }
  133. if req.Frequency != "" {
  134. condition += ` AND frequency=? `
  135. pars = append(pars, req.Frequency)
  136. }
  137. if req.SearchParams != "" {
  138. condition += ` AND index_name like ? or index_code ?`
  139. pars = append(pars, "%"+req.SearchParams+"%", "%"+req.SearchParams+"%")
  140. }
  141. if len(req.IndexCodes) > 0 {
  142. condition += ` AND index_code not in (` + utils.GetOrmInReplace(len(req.IndexCodes)) + `)`
  143. for _, code := range req.IndexCodes {
  144. pars = append(pars, code)
  145. }
  146. }
  147. } else {
  148. if len(req.IndexCodes) > 0 {
  149. condition += ` AND index_code in (` + utils.GetOrmInReplace(len(req.IndexCodes)) + `)`
  150. for _, code := range req.IndexCodes {
  151. pars = append(pars, code)
  152. }
  153. }
  154. }
  155. if req.PageSize <= 0 {
  156. req.PageSize = utils.PageSize20
  157. }
  158. if req.CurrentIndex <= 0 {
  159. req.CurrentIndex = 1
  160. }
  161. startSize := utils.StartIndex(req.CurrentIndex, req.PageSize)
  162. count, err := data_manage.GetRzdIndexNotExistEdbInfoCount(condition, pars)
  163. if err != nil {
  164. return nil, err
  165. }
  166. page := paging.GetPaging(req.CurrentIndex, req.PageSize, count)
  167. result := data_manage.BaseFromRzdIndexPage{}
  168. result.Paging = page
  169. if count <= 0 {
  170. return &result, nil
  171. } else if count > 30 {
  172. return &result, fmt.Errorf("批量添加指标数量不得超过30个")
  173. }
  174. condition += ` ORDER BY base_from_rzd_index_id asc`
  175. condition += ` limit ?, ?`
  176. pars = append(pars, startSize, req.PageSize)
  177. indexList, err := data_manage.GetRzdIndexNotExistEdbInfoPage(condition, pars)
  178. if err != nil {
  179. return nil, err
  180. }
  181. result.List = indexList
  182. return &result, nil
  183. }
  184. // RzdIndexNameCheck 指标名称校验
  185. func RzdIndexNameCheck(indexNames []string, resp []*data_manage.RzdNameCheckResult) ([]*data_manage.RzdNameCheckResult, error) {
  186. // 重名校验
  187. edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
  188. if e != nil {
  189. return nil, e
  190. }
  191. nameExists := make(map[string]bool)
  192. for _, edbInfo := range edbList {
  193. nameExists[edbInfo.EdbName] = true
  194. }
  195. if len(nameExists) > 0 {
  196. for _, v := range resp {
  197. v.Exist = nameExists[v.IndexName]
  198. }
  199. }
  200. return resp, nil
  201. }
  202. // RzdIndexAdd 批量添加指标
  203. func RzdIndexAdd(req data_manage.RzdIndexAddReq, lang string) (edb *data_manage.EdbInfo, err error, errMsg string, skip bool) {
  204. if req.EdbCode == "" {
  205. err = fmt.Errorf("指标ID为空")
  206. return
  207. }
  208. defer func() {
  209. if err != nil {
  210. tips := fmt.Sprintf("ruizide指标数据新增失败, Err: %s", err.Error())
  211. utils.FileLog.Info(tips)
  212. }
  213. }()
  214. source := utils.DATA_SOURCE_RZD
  215. // 是否已有指标数据
  216. dataList, e := data_manage.GetEdbDataAllByEdbCode(req.EdbCode, source, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
  217. if e != nil {
  218. err = fmt.Errorf("获取指标数据失败, Err: %s", e.Error())
  219. return
  220. }
  221. // 新增指标数据
  222. if len(dataList) == 0 {
  223. res, e := AddEdbData(source, req.EdbCode, req.Frequency)
  224. if e != nil {
  225. err = fmt.Errorf("index_lib: 新增指标数据失败, Err: %s", e.Error())
  226. return
  227. }
  228. if res == nil {
  229. err = fmt.Errorf("index_lib: 新增指标数据失败, res nil")
  230. return
  231. }
  232. if res.Ret != 200 {
  233. err = fmt.Errorf("index_lib: 新增指标数据失败, Ret: %d", res.Ret)
  234. return
  235. }
  236. }
  237. // 是否新增过指标
  238. exist, e := data_manage.GetEdbInfoByEdbCode(source, req.EdbCode)
  239. if e != nil && e.Error() != utils.ErrNoRow() {
  240. err = fmt.Errorf("获取指标是否存在失败, err: %s", e.Error())
  241. return
  242. }
  243. if exist != nil {
  244. skip = true
  245. return
  246. }
  247. // 开始结束时间
  248. var startDate, endDate string
  249. minMax, e := data_manage.GetEdbInfoMaxAndMinInfo(source, utils.DATA_SUB_SOURCE_EDB, req.EdbCode)
  250. if e != nil && e.Error() != utils.ErrNoRow() {
  251. err = fmt.Errorf("MinMax: 获取指标极值失败, err: %s", e.Error())
  252. return
  253. }
  254. if minMax != nil {
  255. startDate = minMax.MinDate
  256. endDate = minMax.MaxDate
  257. }
  258. // 新增指标到指标库
  259. edbInfo, e, msg, _ := EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, startDate, endDate, req.AdminId, req.AdminRealName, lang)
  260. if e != nil {
  261. errMsg = msg
  262. err = fmt.Errorf("EdbInfo: 新增指标失败, err: %s", e.Error())
  263. return
  264. }
  265. edb = edbInfo
  266. // EdbInfoAdd方法已经新增es,这里不需要再新增???
  267. // 新增es
  268. // go AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
  269. return
  270. }
  271. // GetRzdIndexInfo 获取指标信息-分页
  272. func GetRzdIndexInfo(keyWord string, classifyIdList []string, frequencyList []string, currentIndex, startSize, pageSize int) (rzdIndexInfoList *data_manage.BaseFromRzdIndexPage, err error) {
  273. // 获取指标
  274. var condition string
  275. var pars []interface{}
  276. if keyWord != "" {
  277. condition += ` AND (index_name like ? or index_code like ?)`
  278. pars = append(pars, "%"+keyWord+"%", "%"+keyWord+"%")
  279. }
  280. if len(classifyIdList) > 0 {
  281. condition += ` AND base_from_rzd_classify_id IN (`
  282. for _, v := range classifyIdList {
  283. condition += `?,`
  284. pars = append(pars, v)
  285. }
  286. condition = condition[:len(condition)-1] + `)`
  287. }
  288. if len(frequencyList) > 0 {
  289. condition += ` AND frequency IN (`
  290. for _, v := range frequencyList {
  291. condition += `?,`
  292. pars = append(pars, v)
  293. }
  294. condition = condition[:len(condition)-1] + `)`
  295. }
  296. count, err := data_manage.GetRzdIndexInfoCount(condition, pars)
  297. if err != nil {
  298. return nil, err
  299. }
  300. indexPage := data_manage.BaseFromRzdIndexPage{}
  301. page := paging.GetPaging(currentIndex, pageSize, count)
  302. if count <= 0 {
  303. indexPage.Paging = page
  304. return &indexPage, nil
  305. }
  306. condition += ` ORDER BY base_from_rzd_index_id asc`
  307. // 分页
  308. condition += ` LIMIT ?, ?`
  309. pars = append(pars, startSize, pageSize)
  310. indexInfoPage, err := data_manage.GetRzdIndexInfoPage(condition, pars)
  311. if err != nil {
  312. return nil, err
  313. }
  314. var indexCodes []string
  315. for _, indexInfo := range indexInfoPage {
  316. indexCodes = append(indexCodes, indexInfo.IndexCode)
  317. }
  318. IndexDataList, err := data_manage.GetRzdLastUpdateTimeLastByIndexCode(indexCodes)
  319. if err != nil {
  320. return nil, err
  321. }
  322. var indexDataMap = make(map[string]*data_manage.BaseFromRzdData, 0)
  323. for _, data := range IndexDataList {
  324. indexDataMap[data.IndexCode] = data
  325. }
  326. for _, indexInfo := range indexInfoPage {
  327. if indexDataMap[indexInfo.IndexCode] == nil {
  328. continue
  329. }
  330. indexInfo.ModifyTimeMax = indexDataMap[indexInfo.IndexCode].ModifyTime
  331. indexInfo.Value = indexDataMap[indexInfo.IndexCode].Value
  332. }
  333. indexPage.List = indexInfoPage
  334. indexPage.Paging = page
  335. return &indexPage, nil
  336. }
  337. // GetRzdIndexDetail 获取指标详情
  338. func GetRzdIndexDetail(indexCode string) (rzdIndexInfoList *data_manage.BaseFromRzdIndexList, err error) {
  339. // 获取指标
  340. var condition string
  341. var pars []interface{}
  342. if indexCode != "" {
  343. condition += ` and index_code = ?`
  344. pars = append(pars, indexCode)
  345. }
  346. rzdIndexList, err := data_manage.GetRzdIndex(condition, pars)
  347. if err != nil {
  348. return nil, err
  349. }
  350. var rzdIndex *data_manage.BaseFromRzdIndexList
  351. if len(rzdIndexList) > 0 {
  352. rzdIndex = rzdIndexList[0]
  353. // 查询指标数据
  354. dataList, err := data_manage.GetBaseFormRzdDataByIndexCode(indexCode)
  355. if err != nil {
  356. return nil, err
  357. }
  358. rzdIndex.DataList = dataList
  359. // 查询是否在指标库
  360. edbInfo, err := data_manage.GetEdbInfoByEdbCode(utils.DATA_SOURCE_RZD, indexCode)
  361. if err != nil && err.Error() != utils.ErrNoRow() {
  362. return nil, err
  363. }
  364. if edbInfo != nil {
  365. rzdIndex.EdbInfoId = edbInfo.EdbInfoId
  366. }
  367. }
  368. return rzdIndex, nil
  369. }
  370. // GetRzdIndexList 获取指标列表
  371. func GetRzdIndexList(searchParams string) (rzdIndexInfoList []*data_manage.BaseFromRzdIndexList, err error) {
  372. // 获取指标
  373. var condition string
  374. var pars []interface{}
  375. if searchParams != "" {
  376. condition += ` and index_code like ? or index_name like ?`
  377. pars = append(pars, "%"+searchParams+"%", "%"+searchParams+"%")
  378. }
  379. rzdIndexList, err := data_manage.GetRzdIndex(condition, pars)
  380. if err != nil {
  381. return nil, err
  382. }
  383. return rzdIndexList, nil
  384. }