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