edb_info_refresh.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. package data
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/edb_refresh"
  7. "eta/eta_api/models/data_manage/edb_refresh/request"
  8. "eta/eta_api/utils"
  9. "fmt"
  10. "strings"
  11. "time"
  12. )
  13. // 所有刷新配置key
  14. var allDefaultEdbRefreshConfigKey = `edb_refresh_config:default:all:`
  15. // GetAllDefaultEdbRefreshConfigListBySourceList
  16. // @Description: 获取默认的所有刷新配置列表
  17. // @author: Roc
  18. // @datetime 2024-01-10 15:03:36
  19. // @param source int
  20. // @param subSource int
  21. // @return list []*edb_refresh.EdbRefreshDefaultConfig
  22. // @return err error
  23. func GetAllDefaultEdbRefreshConfigListBySourceList(source, subSource int) (list []*edb_refresh.EdbRefreshDefaultConfig, err error) {
  24. key := getAllDefaultEdbRefreshConfigKey(source, subSource)
  25. if utils.Re == nil {
  26. if utils.Re == nil && utils.Rc.IsExist(key) {
  27. if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
  28. err = json.Unmarshal(data, &list)
  29. return
  30. }
  31. }
  32. }
  33. list, err = edb_refresh.GetAllListBySourceList(source, subSource)
  34. if err != nil {
  35. return
  36. }
  37. // 将数据加入缓存
  38. if utils.Re == nil {
  39. data, _ := json.Marshal(list)
  40. utils.Rc.Put(key, data, 2*time.Hour)
  41. }
  42. return
  43. }
  44. // SaveEdbRefreshDefaultConfig
  45. // @Description: 设置默认的指标刷新配置接口
  46. // @author: Roc
  47. // @datetime 2024-01-10 15:11:19
  48. // @param source int
  49. // @param subSource int
  50. // @param frequency string
  51. // @param list []request.RefreshConfigReq
  52. // @return err error
  53. // @return errMsg string
  54. // @return isSendEmail bool
  55. func SaveEdbRefreshDefaultConfig(source, subSource int, frequency string, list []request.RefreshConfigReq) (err error, errMsg string, isSendEmail bool) {
  56. isSendEmail = true
  57. errMsg = `保存失败`
  58. if source <= 0 {
  59. errMsg = "来源不能为空"
  60. err = errors.New(errMsg)
  61. isSendEmail = false
  62. return
  63. }
  64. if frequency == `` {
  65. errMsg = "频度不能为空"
  66. err = errors.New(errMsg)
  67. isSendEmail = false
  68. return
  69. }
  70. lenConf := len(list)
  71. if lenConf == 0 {
  72. errMsg = "至少需要一个刷新配置"
  73. err = errors.New(errMsg)
  74. isSendEmail = false
  75. return
  76. }
  77. if lenConf > 5 {
  78. errMsg = "刷新时间设置最多不超过5个"
  79. err = errors.New(errMsg)
  80. isSendEmail = false
  81. return
  82. }
  83. tmpArr := []string{"每周", "每旬", "每月", "每季", "每半年", "每年"}
  84. // 配置的map,避免同一种类型配置同一个时间
  85. configMap := make(map[string]string)
  86. for _, v := range list {
  87. if utils.InArrayByStr(tmpArr, v.RefreshFrequency) && v.RefreshFrequencyDay < 0 {
  88. errMsg = "请选择具体日期"
  89. err = errors.New(errMsg)
  90. isSendEmail = false
  91. return
  92. }
  93. if v.RefreshTime == "" {
  94. errMsg = "请选择具体时间"
  95. err = errors.New(errMsg)
  96. isSendEmail = false
  97. return
  98. }
  99. // 配置的map,避免同一种类型配置同一个时间
  100. key := fmt.Sprint(v.RefreshFrequency, "_", v.RefreshFrequencyDay, "_", v.RefreshTime)
  101. if _, ok := configMap[key]; ok {
  102. errMsg = "刷新频率和日期不能重复"
  103. err = errors.New(errMsg)
  104. isSendEmail = false
  105. return
  106. }
  107. configMap[key] = key
  108. }
  109. addList := make([]*edb_refresh.EdbRefreshDefaultConfig, 0)
  110. for _, v := range list {
  111. addList = append(addList, &edb_refresh.EdbRefreshDefaultConfig{
  112. Source: source,
  113. SubSource: subSource,
  114. Frequency: frequency,
  115. RefreshFrequency: v.RefreshFrequency,
  116. RefreshFrequencyDay: v.RefreshFrequencyDay,
  117. RefreshAllData: v.RefreshAllData,
  118. RefreshTime: v.RefreshTime,
  119. RefreshDataNum: v.RefreshDataNum,
  120. ModifyTime: time.Now(),
  121. CreateTime: time.Now(),
  122. })
  123. }
  124. // 保存
  125. err = edb_refresh.SaveEdbRefreshDefaultConfig(source, subSource, frequency, addList)
  126. // 清除缓存
  127. {
  128. key := getAllDefaultEdbRefreshConfigKey(source, subSource)
  129. if utils.Re == nil {
  130. _ = utils.Rc.Delete(key)
  131. }
  132. }
  133. return
  134. }
  135. // SaveEdbRefreshConfig
  136. // @Description: 设置指标刷新配置接口
  137. // @author: Roc
  138. // @datetime 2024-01-10 15:41:45
  139. // @param source int
  140. // @param subSource int
  141. // @param classifyId int
  142. // @param terminalCode string
  143. // @param frequency string
  144. // @param keyword string
  145. // @param status string
  146. // @param sysUserIdStr string
  147. // @param isSelectAll bool
  148. // @param list []request.RefreshConfigReq
  149. // @param edbSelectIdList []int
  150. // @param sysUserId int
  151. // @param sysUserRealName string
  152. // @return err error
  153. // @return errMsg string
  154. // @return isSendEmail bool
  155. func SaveEdbRefreshConfig(source, subSource, classifyId int, terminalCode, frequency, keyword, status, sysUserIdStr string, isSelectAll bool, list []request.RefreshConfigReq, edbSelectIdList []int, sysUserId int, sysUserRealName string) (err error, errMsg string, isSendEmail bool) {
  156. isSendEmail = true
  157. errMsg = `保存失败`
  158. if source <= 0 {
  159. errMsg = "来源不能为空"
  160. err = errors.New(errMsg)
  161. isSendEmail = false
  162. return
  163. }
  164. lenConf := len(list)
  165. if lenConf == 0 {
  166. errMsg = "至少需要一个刷新配置"
  167. err = errors.New(errMsg)
  168. isSendEmail = false
  169. return
  170. }
  171. if lenConf > 5 {
  172. errMsg = "刷新时间设置最多不超过5个"
  173. err = errors.New(errMsg)
  174. isSendEmail = false
  175. return
  176. }
  177. tmpArr := []string{"每周", "每旬", "每月", "每季", "每半年", "每年"}
  178. // 配置的map,避免同一种类型配置同一个时间
  179. configMap := make(map[string]string)
  180. for _, v := range list {
  181. if utils.InArrayByStr(tmpArr, v.RefreshFrequency) && v.RefreshFrequencyDay < 0 {
  182. errMsg = "请选择具体日期"
  183. err = errors.New(errMsg)
  184. isSendEmail = false
  185. return
  186. }
  187. if v.RefreshTime == "" {
  188. errMsg = "请选择具体时间"
  189. err = errors.New(errMsg)
  190. isSendEmail = false
  191. return
  192. }
  193. // 配置的map,避免同一种类型配置同一个时间
  194. key := fmt.Sprint(v.RefreshFrequency, "_", v.RefreshFrequencyDay, "_", v.RefreshTime)
  195. if _, ok := configMap[key]; ok {
  196. errMsg = "刷新频率和日期不能重复"
  197. err = errors.New(errMsg)
  198. isSendEmail = false
  199. return
  200. }
  201. configMap[key] = key
  202. }
  203. edbIdList := make([]int, 0)
  204. // 指标id列表
  205. if isSelectAll {
  206. // 如果是列表全选
  207. _, edbList, tmpErr := GetList(source, subSource, classifyId, terminalCode, sysUserIdStr, frequency, keyword, status, 0, 100000, "", "")
  208. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  209. err = tmpErr
  210. return
  211. }
  212. // 不配置的指标id
  213. notIdMap := make(map[int]int, 0)
  214. for _, v := range edbSelectIdList {
  215. notIdMap[v] = v
  216. }
  217. for _, v := range edbList {
  218. _, ok := notIdMap[v.EdbInfoId]
  219. // 在不配置的指标id列表内的话,那就过滤
  220. if ok {
  221. continue
  222. }
  223. // 加入到待配置的指标列表id
  224. edbIdList = append(edbIdList, v.EdbInfoId)
  225. }
  226. } else {
  227. edbIdList = edbSelectIdList
  228. }
  229. if len(edbIdList) <= 0 {
  230. errMsg = "指标不能为空"
  231. err = errors.New(errMsg)
  232. isSendEmail = false
  233. return
  234. }
  235. // 待添加的配置关系数据
  236. addMappingList := make([]*edb_refresh.EdbRefreshMapping, 0)
  237. // 待添加的日期配置项
  238. addConfigList := make([]*edb_refresh.EdbRefreshConfig, 0)
  239. for _, v := range list {
  240. item, tmpErr := edb_refresh.GetEdbRefreshConfigListByCondition(v.RefreshFrequency, v.RefreshTime, v.RefreshFrequencyDay, v.RefreshAllData, v.RefreshDataNum)
  241. if tmpErr != nil {
  242. if tmpErr.Error() != utils.ErrNoRow() {
  243. err = tmpErr
  244. return
  245. }
  246. addConfigList = append(addConfigList, &edb_refresh.EdbRefreshConfig{
  247. RefreshFrequency: v.RefreshFrequency,
  248. RefreshFrequencyDay: v.RefreshFrequencyDay,
  249. RefreshTime: v.RefreshTime,
  250. RefreshAllData: v.RefreshAllData,
  251. RefreshDataNum: v.RefreshDataNum,
  252. ModifyTime: time.Now(),
  253. CreateTime: time.Now(),
  254. })
  255. continue
  256. }
  257. for _, edbId := range edbIdList {
  258. addMappingList = append(addMappingList, &edb_refresh.EdbRefreshMapping{
  259. EdbRefreshMappingId: 0,
  260. Source: source,
  261. SubSource: subSource,
  262. EdbInfoId: edbId,
  263. EdbRefreshConfigId: item.EdbRefreshConfigId,
  264. SysUserId: sysUserId,
  265. SysUserRealName: sysUserRealName,
  266. ModifyTime: time.Now(),
  267. CreateTime: time.Now(),
  268. })
  269. }
  270. }
  271. // 保存
  272. err = edb_refresh.SaveEdbRefreshConfig(source, subSource, sysUserId, sysUserRealName, addConfigList, addMappingList, edbIdList)
  273. return
  274. }
  275. // HandleRefreshTime
  276. // @Description: 处理刷新时间的显示
  277. // @author: Roc
  278. // @datetime 2024-01-10 17:00:03
  279. // @param source int
  280. // @param subSource int
  281. // @param list []*data_manage.BaseEdbInfo
  282. // @return newList []*data_manage.BaseEdbInfo
  283. // @return err error
  284. // @return errMsg string
  285. // @return isSendEmail bool
  286. func HandleRefreshTime(source, subSource int, list []*data_manage.BaseEdbInfo) (newList []*data_manage.BaseEdbInfo, err error, errMsg string, isSendEmail bool) {
  287. isSendEmail = true
  288. errMsg = "获取失败"
  289. newList = list
  290. // 默认刷新配置
  291. defaultEdbRefreshConfigMap := make(map[string]string)
  292. {
  293. // 获取默认配置
  294. allDefaultEdbRefreshConfigList, tmpErr := GetAllDefaultEdbRefreshConfigListBySourceList(source, subSource)
  295. if tmpErr != nil {
  296. err = tmpErr
  297. return
  298. }
  299. defaultEdbRefreshConfigListMap := make(map[string][]string)
  300. for _, v := range allDefaultEdbRefreshConfigList {
  301. tmp, ok := defaultEdbRefreshConfigListMap[v.Frequency]
  302. if !ok {
  303. tmp = make([]string, 0)
  304. }
  305. defaultEdbRefreshConfigListMap[v.Frequency] = append(tmp, GetRefreshStr(v.RefreshFrequency, v.RefreshFrequencyDay, v.RefreshTime))
  306. }
  307. for k, v := range defaultEdbRefreshConfigListMap {
  308. defaultEdbRefreshConfigMap[k] = strings.Join(v, ",")
  309. }
  310. }
  311. edbInfoIdList := make([]int, 0)
  312. for _, v := range newList {
  313. edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
  314. }
  315. // 指标的刷新时间配置
  316. edbRefreshConfigMap := make(map[int]string)
  317. {
  318. // 获取指标的单独配置
  319. configList, tmpErr := edb_refresh.GetEdbRefreshConfigAndEdbListBySourceAndeEdbInfoId(source, subSource, edbInfoIdList)
  320. if tmpErr != nil {
  321. err = tmpErr
  322. return
  323. }
  324. edbRefreshConfigListMap := make(map[int][]string)
  325. for _, v := range configList {
  326. tmp, ok := edbRefreshConfigListMap[v.EdbInfoId]
  327. if !ok {
  328. tmp = make([]string, 0)
  329. }
  330. edbRefreshConfigListMap[v.EdbInfoId] = append(tmp, GetRefreshStr(v.RefreshFrequency, v.RefreshFrequencyDay, v.RefreshTime))
  331. }
  332. for k, v := range edbRefreshConfigListMap {
  333. edbRefreshConfigMap[k] = strings.Join(v, ",")
  334. }
  335. }
  336. // 处理刷新时间
  337. for _, v := range newList {
  338. refreshTime, ok := edbRefreshConfigMap[v.EdbInfoId]
  339. if ok {
  340. v.RefreshTime = refreshTime
  341. continue
  342. }
  343. v.RefreshTime = defaultEdbRefreshConfigMap[v.Frequency]
  344. }
  345. return
  346. }
  347. // GetList
  348. // @Description: 获取指标列表
  349. // @author: Roc
  350. // @datetime 2024-01-08 15:14:16
  351. // @param source int
  352. // @param subSource int
  353. // @param classifyId int
  354. // @param terminalCode string
  355. // @param sysUserId string
  356. // @param frequency string
  357. // @param keyword string
  358. // @param startSize int
  359. // @param pageSize int
  360. // @return total int
  361. // @return list []*data_manage.BaseEdbInfo
  362. // @return err error
  363. func GetList(source, subSource, classifyId int, terminalCode, sysUserId, frequency, keyword, status string, startSize, pageSize int, sortParam, sortType string) (total int, list []*data_manage.BaseEdbInfo, err error) {
  364. var pars []interface{}
  365. var condition string
  366. list = make([]*data_manage.BaseEdbInfo, 0)
  367. isStop := -1
  368. if status == `暂停` {
  369. isStop = 1
  370. } else if status == "启用" {
  371. isStop = 0
  372. }
  373. switch source {
  374. case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
  375. if classifyId > 0 {
  376. condition += " AND base_from_mysteel_chemical_classify_id = ? "
  377. pars = append(pars, classifyId)
  378. }
  379. if terminalCode != `` {
  380. condition += " AND terminal_code = ? "
  381. pars = append(pars, terminalCode)
  382. }
  383. if sysUserId != `` {
  384. sysUserIdSlice := strings.Split(sysUserId, ",")
  385. condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
  386. pars = append(pars, sysUserIdSlice)
  387. }
  388. if frequency != `` {
  389. condition += " AND frequency = ? "
  390. pars = append(pars, frequency)
  391. }
  392. if keyword != `` {
  393. keywordSlice := strings.Split(keyword, ",")
  394. if len(keywordSlice) > 0 {
  395. tmpConditionSlice := make([]string, 0)
  396. tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
  397. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  398. for _, v := range keywordSlice {
  399. tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
  400. pars = utils.GetLikeKeywordPars(pars, v, 2)
  401. }
  402. condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
  403. } else {
  404. condition += ` index_name like ? or index_code like ? `
  405. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  406. }
  407. }
  408. if isStop >= 0 {
  409. condition += " AND is_stop = ? "
  410. pars = append(pars, isStop)
  411. }
  412. sortStr := ``
  413. if sortParam != `` {
  414. sortStr = fmt.Sprintf("%s %s,base_from_mysteel_chemical_index_id desc ", sortParam, sortType)
  415. }
  416. total, list, err = data_manage.GetMysteelChemicalBaseInfoList(condition, pars, sortStr, startSize, pageSize)
  417. case utils.DATA_SOURCE_YS: // 有色
  418. if classifyId > 0 {
  419. condition += " AND classify_id = ? "
  420. pars = append(pars, classifyId)
  421. }
  422. if terminalCode != `` {
  423. condition += " AND terminal_code = ? "
  424. pars = append(pars, terminalCode)
  425. }
  426. if frequency != `` {
  427. condition += " AND frequency = ? "
  428. pars = append(pars, frequency)
  429. }
  430. if keyword != `` {
  431. keywordSlice := strings.Split(keyword, ",")
  432. if len(keywordSlice) > 0 {
  433. tmpConditionSlice := make([]string, 0)
  434. tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
  435. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  436. for _, v := range keywordSlice {
  437. tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
  438. pars = utils.GetLikeKeywordPars(pars, v, 2)
  439. }
  440. condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
  441. } else {
  442. condition += ` index_name like ? or index_code like ? `
  443. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  444. }
  445. }
  446. if isStop >= 0 {
  447. condition += " AND is_stop = ? "
  448. pars = append(pars, isStop)
  449. }
  450. sortStr := ``
  451. if sortParam != `` {
  452. sortStr = fmt.Sprintf("%s %s,base_from_smm_index_id desc ", sortParam, sortType)
  453. }
  454. total, list, err = data_manage.GetSmmBaseInfoList(condition, pars, sortStr, startSize, pageSize)
  455. default:
  456. condition += ` AND source = ? AND sub_source = ? `
  457. pars = append(pars, source, subSource)
  458. if isStop >= 0 {
  459. condition += " AND no_update = ? "
  460. pars = append(pars, isStop)
  461. }
  462. if classifyId > 0 {
  463. condition += " AND classify_id = ? "
  464. pars = append(pars, classifyId)
  465. }
  466. if terminalCode != `` {
  467. condition += " AND terminal_code = ? "
  468. pars = append(pars, terminalCode)
  469. }
  470. if sysUserId != `` {
  471. sysUserIdSlice := strings.Split(sysUserId, ",")
  472. condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
  473. pars = append(pars, sysUserIdSlice)
  474. }
  475. if frequency != `` {
  476. condition += " AND frequency = ? "
  477. pars = append(pars, frequency)
  478. }
  479. if keyword != `` {
  480. keywordSlice := strings.Split(keyword, ",")
  481. if len(keywordSlice) > 0 {
  482. tmpConditionSlice := make([]string, 0)
  483. tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
  484. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  485. for _, v := range keywordSlice {
  486. tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
  487. pars = utils.GetLikeKeywordPars(pars, v, 2)
  488. }
  489. condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
  490. } else {
  491. condition += ` edb_name like ? or edb_code like ? `
  492. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  493. }
  494. }
  495. sortStr := ``
  496. if sortParam != `` {
  497. sortStr = fmt.Sprintf("%s %s,edb_info_id desc ", sortParam, sortType)
  498. }
  499. total, list, err = data_manage.GetEdbBaseInfoList(condition, pars, sortStr, startSize, pageSize)
  500. }
  501. return
  502. }
  503. // getAllDefaultEdbRefreshConfigKey
  504. // @Description: 获取默认的所有刷新配置key
  505. // @author: Roc
  506. // @datetime 2024-01-10 15:02:49
  507. // @param source int
  508. // @param subSource int
  509. // @return string
  510. func getAllDefaultEdbRefreshConfigKey(source, subSource int) string {
  511. return allDefaultEdbRefreshConfigKey + fmt.Sprintf("%d_%d", source, subSource)
  512. }
  513. // GetRefreshStr
  514. // @Description: 获取刷新配置的中文字符串
  515. // @author: Roc
  516. // @datetime 2024-01-10 16:05:10
  517. // @param refreshFrequency string
  518. // @param refreshFrequencyDay int
  519. // @param refreshTime string
  520. // @return string
  521. func GetRefreshStr(refreshFrequency string, refreshFrequencyDay int, refreshTime string) string {
  522. refreshDayStr := ``
  523. //if refreshFrequency != "每自然日" && refreshFrequency != "每交易日"
  524. switch refreshFrequency {
  525. case "每自然日", "每交易日":
  526. case "每周":
  527. switch refreshFrequencyDay {
  528. case 0:
  529. refreshDayStr = "日"
  530. case 1:
  531. refreshDayStr = "一"
  532. case 2:
  533. refreshDayStr = "二"
  534. case 3:
  535. refreshDayStr = "三"
  536. case 4:
  537. refreshDayStr = "四"
  538. case 5:
  539. refreshDayStr = "五"
  540. case 6:
  541. refreshDayStr = "六"
  542. case 7:
  543. refreshDayStr = "日"
  544. }
  545. default:
  546. if refreshFrequencyDay > 0 {
  547. refreshDayStr = fmt.Sprintf("第%d天", refreshFrequencyDay)
  548. } else {
  549. refreshDayStr = `最后一天`
  550. }
  551. }
  552. return refreshFrequency + refreshDayStr + " " + refreshTime
  553. }