edb_info_stat.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. package services
  2. import (
  3. "eta/eta_index_lib/models"
  4. "eta/eta_index_lib/models/data_stat"
  5. "eta/eta_index_lib/models/edb_refresh"
  6. "eta/eta_index_lib/services/alarm_msg"
  7. "eta/eta_index_lib/utils"
  8. "fmt"
  9. "time"
  10. )
  11. // AddEdbInfoUpdateLog 添加指标编辑/刷新日志
  12. func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason string, dataUpdateResult int, dataUpdateFailedReason string, isSourceRefresh int, updateType int) (err error) {
  13. var edbInfo *models.EdbInfo
  14. if edbInfoId > 0 {
  15. // 获取指标详情
  16. edbInfo, err = models.GetEdbInfoById(edbInfoId)
  17. if err != nil {
  18. err = fmt.Errorf("指标不存在")
  19. return
  20. }
  21. log := new(data_stat.EdbInfoUpdateLog)
  22. log.EdbInfoId = edbInfo.EdbInfoId
  23. log.SourceName = edbInfo.SourceName
  24. log.Source = edbInfo.Source
  25. log.EdbCode = edbInfo.EdbCode
  26. log.EdbName = edbInfo.EdbName
  27. log.EdbNameSource = edbInfo.SourceIndexName
  28. log.Frequency = edbInfo.Frequency
  29. log.Unit = edbInfo.Unit
  30. log.StartDate = edbInfo.StartDate
  31. log.EndDate = edbInfo.EndDate
  32. log.SysUserId = edbInfo.SysUserId
  33. log.SysUserRealName = edbInfo.SysUserRealName
  34. log.UniqueCode = edbInfo.UniqueCode
  35. log.EdbCreateTime = edbInfo.CreateTime
  36. log.EdbModifyTime = edbInfo.ModifyTime
  37. log.CreateTime = time.Now()
  38. log.LatestDate = edbInfo.LatestDate
  39. log.LatestValue = edbInfo.LatestValue
  40. log.TerminalCode = edbInfo.TerminalCode
  41. log.UpdateResult = updateResult
  42. log.UpdateFailedReason = updateFailedReason
  43. log.DataUpdateTime = edbInfo.DataUpdateTime
  44. log.ErDataUpdateDate = edbInfo.ErDataUpdateDate
  45. log.DataUpdateResult = dataUpdateResult
  46. log.DataUpdateFailedReason = dataUpdateFailedReason
  47. log.IsSourceRefresh = isSourceRefresh
  48. log.UpdateType = updateType
  49. _, err = data_stat.AddEdbUpdateLog(log)
  50. if err != nil {
  51. err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
  52. return
  53. }
  54. }
  55. return
  56. }
  57. // SetMysteelChemicalEdbInfoUpdateStat 定时统计上海钢联的数据源明细表
  58. func SetMysteelChemicalEdbInfoUpdateStat(needStat bool) (err error) {
  59. defer func() {
  60. if err != nil {
  61. tips := fmt.Sprintf("钢联数据刷新-ETA指标刷新统计异常 Err: %s", err.Error())
  62. utils.FileLog.Info(tips)
  63. alarm_msg.SendAlarmMsg(tips, 3)
  64. }
  65. }()
  66. //查询钢联的所有在更新的指标信息
  67. condition := " and source = ? and no_update=0"
  68. var pars []interface{}
  69. pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
  70. edbList, err := models.GetEdbInfoByCondition(condition, pars, 0)
  71. if err != nil {
  72. err = fmt.Errorf("查询上海钢联指标信息出错,err: %s", err)
  73. return
  74. }
  75. nowTime := time.Now()
  76. today := time.Now().Format(utils.FormatDate)
  77. todayT, _ := time.ParseInLocation(utils.FormatDate, today, time.Local)
  78. nextDay := time.Now().AddDate(0, 0, 1).Format(utils.FormatDate)
  79. //查询当日所有钢联指标的终端更新记录
  80. updateLogList, err := data_stat.GetEdbUpdateSourceLogByCreateDate(utils.DATA_SOURCE_MYSTEEL_CHEMICAL, today, nextDay, 1)
  81. if err != nil {
  82. err = fmt.Errorf("查询上海钢联指标终端更新日志报错,err: %s", err)
  83. return
  84. }
  85. fmt.Println(len(updateLogList))
  86. if !needStat && len(updateLogList) == 0 { //如果不存在变更记录 则不进行汇总
  87. return
  88. }
  89. updateLogMap := make(map[int]*data_stat.EdbInfoUpdateLog)
  90. if len(updateLogList) > 0 {
  91. for _, v := range updateLogList {
  92. if _, ok := updateLogMap[v.EdbInfoId]; !ok {
  93. updateLogMap[v.EdbInfoId] = v
  94. }
  95. }
  96. }
  97. statCond := " and source = ? and create_time >= ? and create_time < ?"
  98. var statPars []interface{}
  99. statPars = append(statPars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, today, nextDay)
  100. //查询当日钢联所有的刷新记录
  101. updateStatList, err := data_stat.GetEdbUpdateStatByCondition(statCond, statPars)
  102. if err != nil {
  103. err = fmt.Errorf("查询上海钢联数据源明细记录统计报错,err: %s", err)
  104. return
  105. }
  106. updateStatMap := make(map[int]*data_stat.EdbInfoUpdateStat)
  107. if len(updateStatList) > 0 {
  108. for _, v := range updateStatList {
  109. updateStatMap[v.EdbInfoId] = v
  110. }
  111. }
  112. indexObj := new(models.BaseFromMysteelChemicalIndex)
  113. week := int(nowTime.Weekday())
  114. weekNeedRefreshMap := make(map[string]struct{})
  115. if week >= 3 && week <= 6 {
  116. endDate := utils.GetNowWeekMonday().Format(utils.FormatDate)
  117. nowDate := time.Now().Format(utils.FormatDate)
  118. cond := ` AND frequency = ? AND (end_date < ? or end_date=?) AND is_stop = 0`
  119. var tmpPars []interface{}
  120. tmpPars = append(tmpPars, "周度", endDate, nowDate)
  121. //查询所有需要当日刷新的周度指标
  122. indexTotal, tErr := indexObj.GetIndexByCondition(cond, tmpPars)
  123. if tErr != nil {
  124. err = fmt.Errorf("查询上海钢联原始指标报错,err: %s", tErr)
  125. return
  126. }
  127. for _, v := range indexTotal {
  128. weekNeedRefreshMap[v.IndexCode] = struct{}{}
  129. }
  130. }
  131. //查询所有停更指标
  132. stopRefreshMap := make(map[string]struct{})
  133. tmpCond := ` AND is_stop = 1`
  134. //查询所有需要当日刷新的周度指标
  135. indexStop, tErr := indexObj.GetIndexByCondition(tmpCond, []interface{}{})
  136. if tErr != nil {
  137. err = fmt.Errorf("查询上海钢联原始指标报错,err: %s", tErr)
  138. return
  139. }
  140. for _, v := range indexStop {
  141. stopRefreshMap[v.IndexCode] = struct{}{}
  142. }
  143. logStat := new(data_stat.EdbInfoUpdateStat)
  144. //组装新增数据
  145. addList := make([]*data_stat.EdbInfoUpdateStat, 0)
  146. modifyList := make([]*data_stat.EdbInfoUpdateStat, 0)
  147. if len(edbList) > 0 {
  148. for _, v := range edbList {
  149. if _, ok := stopRefreshMap[v.EdbCode]; ok {
  150. continue
  151. }
  152. tmp := &data_stat.EdbInfoUpdateStat{
  153. EdbInfoId: v.EdbInfoId,
  154. SourceName: v.SourceName,
  155. Source: v.Source,
  156. EdbCode: v.EdbCode,
  157. EdbName: v.EdbName,
  158. EdbNameSource: v.EdbNameSource,
  159. Frequency: v.Frequency,
  160. Unit: v.Unit,
  161. StartDate: v.StartDate,
  162. EndDate: v.EndDate,
  163. SysUserId: v.SysUserId,
  164. SysUserRealName: v.SysUserRealName,
  165. UniqueCode: v.UniqueCode,
  166. EdbCreateTime: v.CreateTime,
  167. EdbModifyTime: v.ModifyTime,
  168. LatestDate: v.LatestDate,
  169. LatestValue: v.LatestValue,
  170. TerminalCode: v.TerminalCode,
  171. DataUpdateTime: v.DataUpdateTime,
  172. ErDataUpdateDate: v.ErDataUpdateDate,
  173. ModifyTime: nowTime,
  174. }
  175. exist, existOk := updateStatMap[v.EdbInfoId]
  176. frequency := v.Frequency
  177. if v.Frequency == "旬度" { //特殊处理指标库里和数据源里频度不一致的情况
  178. //查询源指标库的频度
  179. indexTmp, e := indexObj.GetIndexItem(v.EdbCode)
  180. if e == nil {
  181. frequency = indexTmp.Frequency
  182. }
  183. }
  184. if existOk {
  185. tmp.NeedRefresh = exist.NeedRefresh
  186. } else {
  187. needRefresh, _ := checkMySteelEdbInfoNeedRefresh(v.EdbCode, frequency, weekNeedRefreshMap)
  188. tmp.NeedRefresh = needRefresh
  189. }
  190. // 判断是否当日新增
  191. if v.CreateTime.After(todayT) || v.CreateTime == todayT {
  192. tmp.IsAdd = 1
  193. } else {
  194. tmp.IsAdd = 2
  195. }
  196. if up, ok := updateLogMap[v.EdbInfoId]; ok {
  197. tmp.DataUpdateTime = up.DataUpdateTime
  198. tmp.ErDataUpdateDate = up.ErDataUpdateDate
  199. tmp.DataUpdateResult = up.DataUpdateResult
  200. tmp.DataUpdateFailedReason = up.DataUpdateFailedReason
  201. tmp.HasRefresh = 1
  202. tmp.UpdateResult = up.UpdateResult
  203. tmp.UpdateFailedReason = up.UpdateFailedReason
  204. tmp.UpdateTime = up.CreateTime.Format(utils.FormatDateTime)
  205. } else if tmp.NeedRefresh == 1 {
  206. tmp.HasRefresh = 0
  207. tmp.DataUpdateResult = 2
  208. tmp.DataUpdateFailedReason = "服务异常"
  209. }
  210. // 判断是否需要新增还是更新
  211. if existOk {
  212. tmp.Id = exist.Id
  213. modifyList = append(modifyList, tmp)
  214. } else {
  215. tmp.CreateTime = nowTime
  216. addList = append(addList, tmp)
  217. }
  218. if len(addList) >= 500 {
  219. err = logStat.Add(addList)
  220. if err != nil {
  221. err = fmt.Errorf("新增上海钢联明细记录报错,err: %s", err)
  222. return
  223. }
  224. addList = addList[:0]
  225. }
  226. if len(modifyList) >= 500 {
  227. err = data_stat.UpdateEdbUpdateStatMulti(modifyList)
  228. if err != nil {
  229. err = fmt.Errorf("更新上海钢联明细记录报错,err: %s", err)
  230. return
  231. }
  232. modifyList = modifyList[:0]
  233. }
  234. }
  235. }
  236. //判断当日指标统计数据是否存在,如果存在则更新,不存在则新增
  237. if len(addList) > 0 {
  238. err = logStat.Add(addList)
  239. }
  240. if len(modifyList) > 0 {
  241. err = data_stat.UpdateEdbUpdateStatMulti(modifyList)
  242. }
  243. return
  244. }
  245. func checkMySteelEdbInfoNeedRefresh(edbCode, frequency string, weekNeedRefreshMap map[string]struct{}) (needRefresh int, err error) {
  246. now := time.Now()
  247. week := int(now.Weekday())
  248. //日度
  249. if week >= 1 && week <= 6 {
  250. if frequency == "日度" {
  251. needRefresh = 1
  252. return
  253. }
  254. }
  255. //周度
  256. if week >= 3 && week <= 6 {
  257. _, ok := weekNeedRefreshMap[edbCode]
  258. if frequency == "周度" && ok {
  259. needRefresh = 1
  260. return
  261. }
  262. }
  263. //季度,月度,年度都是每个周末刷新
  264. if week == 0 {
  265. if frequency == "旬度" || frequency == "月度" || frequency == "季度" || frequency == "年度" {
  266. needRefresh = 1
  267. return
  268. }
  269. }
  270. return
  271. }
  272. // SetEdbSourceStat 定时统计数据源汇总表
  273. func SetEdbSourceStat(needStat bool) (err error) {
  274. defer func() {
  275. if err != nil {
  276. tips := fmt.Sprintf("钢联数据刷新-ETA指标刷新统计异常 Err: %s", err.Error())
  277. alarm_msg.SendAlarmMsg(tips, 3)
  278. }
  279. }()
  280. //查询钢联的所有指标信息
  281. nowTime := time.Now()
  282. today := time.Now().Format(utils.FormatDate)
  283. nextDay := time.Now().AddDate(0, 0, 1).Format(utils.FormatDate)
  284. statCond := " and create_time >= ? and create_time < ?"
  285. var statPars []interface{}
  286. statPars = append(statPars, today, nextDay)
  287. //查询当日钢联所有的统计数据
  288. updateStatList, err := data_stat.GetEdbUpdateStatByCondition(statCond, statPars)
  289. if err != nil {
  290. err = fmt.Errorf("查询上海钢联数据源明细记录统计报错,err: %s", err)
  291. return
  292. }
  293. if !needStat && len(updateStatList) == 0 {
  294. return
  295. }
  296. updateStatMap := make(map[string][]*data_stat.EdbInfoUpdateStat)
  297. if len(updateStatList) > 0 {
  298. for _, v := range updateStatList {
  299. updateStatMap[v.TerminalCode] = append(updateStatMap[v.TerminalCode], v)
  300. }
  301. }
  302. cond := " and create_time >= ? and create_time < ?"
  303. var pars []interface{}
  304. pars = append(pars, today, nextDay)
  305. //查询当日钢联所有的统计数据
  306. statList, err := data_stat.GetEdbSourceStatByCondition(cond, pars)
  307. if err != nil {
  308. err = fmt.Errorf("查询上海钢联数据源统计报错,err: %s", err)
  309. return
  310. }
  311. statMap := make(map[string]*data_stat.EdbSourceStat)
  312. if len(statList) > 0 {
  313. for _, v := range statList {
  314. statMap[v.TerminalCode] = v
  315. }
  316. }
  317. // 查询今日被删除的指标数
  318. delList, err := data_stat.GetEdbDeleteLogNumByCreateTime(today, nextDay)
  319. if err != nil {
  320. err = fmt.Errorf("查询今日被删除指标数目报错,err: %s", err)
  321. return
  322. }
  323. delMap := make(map[string]int)
  324. if len(delList) > 0 {
  325. for _, v := range delList {
  326. delMap[v.TerminalCode] = v.Num
  327. }
  328. }
  329. logStat := new(data_stat.EdbSourceStat)
  330. //组装新增数据
  331. addList := make([]*data_stat.EdbSourceStat, 0)
  332. modifyList := make([]*data_stat.EdbSourceStat, 0)
  333. for terminalCode, list := range updateStatMap {
  334. tmp := new(data_stat.EdbSourceStat)
  335. for k, v := range list {
  336. if k == 0 {
  337. tmp.SourceName = v.SourceName
  338. tmp.Source = v.Source
  339. tmp.TerminalCode = v.TerminalCode
  340. tmp.ModifyTime = nowTime
  341. }
  342. tmp.EdbNum = tmp.EdbNum + 1
  343. if v.IsAdd == 1 {
  344. tmp.EdbNewNum = tmp.EdbNewNum + 1
  345. }
  346. if v.NeedRefresh == 1 {
  347. tmp.NeedRefreshNum = tmp.NeedRefreshNum + 1
  348. }
  349. if v.HasRefresh == 1 {
  350. tmp.HasRefreshNum = tmp.HasRefreshNum + 1
  351. }
  352. // 区分刷新成功和更新成功
  353. if v.DataUpdateResult == 1 { //处理更新结果
  354. tmp.UpdateSuccessNum = tmp.UpdateSuccessNum + 1
  355. } else if v.NeedRefresh == 1 {
  356. tmp.UpdateFailedNum = tmp.UpdateFailedNum + 1
  357. }
  358. if v.UpdateResult == 1 { //刷新结果
  359. tmp.RefreshSuccessNum = tmp.RefreshSuccessNum + 1
  360. } else if v.HasRefresh == 1 {
  361. tmp.RefreshFailedNum = tmp.RefreshFailedNum + 1
  362. }
  363. }
  364. // 处理今天删除的指标数量
  365. if dn, ok := delMap[terminalCode]; ok {
  366. tmp.EdbDelNum = dn
  367. }
  368. // 判断是否需要新增还是更新
  369. if exist, ok := statMap[terminalCode]; ok {
  370. tmp.Id = exist.Id
  371. modifyList = append(modifyList, tmp)
  372. } else {
  373. tmp.CreateTime = nowTime
  374. addList = append(addList, tmp)
  375. }
  376. if len(addList) >= 500 {
  377. err = logStat.Add(addList)
  378. if err != nil {
  379. err = fmt.Errorf("新增上海钢联统计表报错,err: %s", err)
  380. return
  381. }
  382. addList = addList[:0]
  383. }
  384. if len(modifyList) >= 500 {
  385. err = data_stat.UpdateEdbSourceStatMulti(modifyList)
  386. if err != nil {
  387. err = fmt.Errorf("更新上海钢联统计表报错,err: %s", err)
  388. return
  389. }
  390. modifyList = modifyList[:0]
  391. }
  392. }
  393. //判断当日指标统计数据是否存在,如果存在则更新,不存在则新增
  394. if len(addList) > 0 {
  395. err = logStat.Add(addList)
  396. }
  397. if len(modifyList) > 0 {
  398. err = data_stat.UpdateEdbSourceStatMulti(modifyList)
  399. }
  400. return
  401. }
  402. // 根据标识判断指标数据是否更新成功
  403. func EdbDataUpdateRecord(edbInfoId int, hasUpdate bool, updateResult bool, updateFailedReason string, updateRealReason string) (err error) {
  404. defer func() {
  405. if err != nil {
  406. tips := fmt.Sprintf("ETA指标刷新统计异常, 指标ID: %d, err: %s", edbInfoId, err.Error())
  407. alarm_msg.SendAlarmMsg(tips, 3)
  408. }
  409. }()
  410. dataUpdateResult := 2
  411. dataUpdateFailedReason := "服务异常"
  412. if !updateResult {
  413. if updateRealReason != "" {
  414. dataUpdateFailedReason = updateRealReason
  415. }
  416. err = AddEdbInfoUpdateLog(edbInfoId, 2, updateFailedReason, dataUpdateResult, dataUpdateFailedReason, 0, 0)
  417. if err != nil {
  418. err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
  419. return
  420. }
  421. return
  422. }
  423. if hasUpdate {
  424. dataUpdateResult = 1
  425. dataUpdateFailedReason = ""
  426. } else {
  427. dataUpdateFailedReason = "未刷新到数据"
  428. }
  429. // 添加刷新成功日志
  430. err = AddEdbInfoUpdateLog(edbInfoId, 1, "", dataUpdateResult, dataUpdateFailedReason, 0, 0)
  431. if err != nil {
  432. err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
  433. return
  434. }
  435. return
  436. }
  437. // SetEdbInfoUpdateStat 定时统计同花顺的数据源明细表
  438. func SetEdbInfoUpdateStat(needStat bool, source int) (err error) {
  439. defer func() {
  440. if err != nil {
  441. tips := fmt.Sprintf("同花顺数据刷新-ETA指标刷新统计异常 Err: %s", err.Error())
  442. utils.FileLog.Info(tips)
  443. alarm_msg.SendAlarmMsg(tips, 3)
  444. }
  445. }()
  446. //查询同花顺的所有在更新的指标信息
  447. condition := " and source = ? and no_update=0"
  448. var pars []interface{}
  449. pars = append(pars, source)
  450. edbList, err := models.GetEdbInfoByCondition(condition, pars, 0)
  451. if err != nil {
  452. err = fmt.Errorf("查询同花顺指标信息出错,err: %s", err)
  453. return
  454. }
  455. nowTime := time.Now()
  456. today := time.Now().Format(utils.FormatDate)
  457. todayT, _ := time.ParseInLocation(utils.FormatDate, today, time.Local)
  458. nextDay := time.Now().AddDate(0, 0, 1).Format(utils.FormatDate)
  459. //查询当日所有同花顺指标的终端更新记录
  460. updateLogList, err := data_stat.GetEdbUpdateSourceLogByCreateDate(source, today, nextDay, 0)
  461. if err != nil {
  462. err = fmt.Errorf("查询同花顺指标终端更新日志报错,err: %s", err)
  463. return
  464. }
  465. fmt.Println(len(updateLogList))
  466. if !needStat && len(updateLogList) == 0 { //如果不存在变更记录 则不进行汇总
  467. return
  468. }
  469. updateLogMap := make(map[int]*data_stat.EdbInfoUpdateLog)
  470. if len(updateLogList) > 0 {
  471. for _, v := range updateLogList {
  472. if _, ok := updateLogMap[v.EdbInfoId]; !ok {
  473. updateLogMap[v.EdbInfoId] = v
  474. }
  475. }
  476. }
  477. statCond := " and source = ? and create_time >= ? and create_time < ?"
  478. var statPars []interface{}
  479. statPars = append(statPars, source, today, nextDay)
  480. //查询当日同花顺所有的刷新记录
  481. updateStatList, err := data_stat.GetEdbUpdateStatByCondition(statCond, statPars)
  482. if err != nil {
  483. err = fmt.Errorf("查询同花顺数据源明细记录统计报错,err: %s", err)
  484. return
  485. }
  486. updateStatMap := make(map[int]*data_stat.EdbInfoUpdateStat)
  487. if len(updateStatList) > 0 {
  488. for _, v := range updateStatList {
  489. updateStatMap[v.EdbInfoId] = v
  490. }
  491. }
  492. //查询自动刷新设置成今天的指标信息
  493. // 找出当天的时间
  494. needRefreshEdbInfoIdsMap, mysteelNeedRefreshMap, err := GetTodayNeedRefreshEdbInfoIds(source)
  495. if err != nil {
  496. err = fmt.Errorf("查询同花顺自动刷新设置成今天的指标信息报错,err: %s", err)
  497. return
  498. }
  499. logStat := new(data_stat.EdbInfoUpdateStat)
  500. //组装新增数据
  501. addList := make([]*data_stat.EdbInfoUpdateStat, 0)
  502. modifyList := make([]*data_stat.EdbInfoUpdateStat, 0)
  503. if len(edbList) > 0 {
  504. for _, v := range edbList {
  505. tmp := &data_stat.EdbInfoUpdateStat{
  506. EdbInfoId: v.EdbInfoId,
  507. SourceName: v.SourceName,
  508. Source: v.Source,
  509. EdbCode: v.EdbCode,
  510. EdbName: v.EdbName,
  511. EdbNameSource: v.EdbNameSource,
  512. Frequency: v.Frequency,
  513. Unit: v.Unit,
  514. StartDate: v.StartDate,
  515. EndDate: v.EndDate,
  516. SysUserId: v.SysUserId,
  517. SysUserRealName: v.SysUserRealName,
  518. UniqueCode: v.UniqueCode,
  519. EdbCreateTime: v.CreateTime,
  520. EdbModifyTime: v.ModifyTime,
  521. LatestDate: v.LatestDate,
  522. LatestValue: v.LatestValue,
  523. TerminalCode: v.TerminalCode,
  524. DataUpdateTime: v.DataUpdateTime,
  525. ErDataUpdateDate: v.ErDataUpdateDate,
  526. ModifyTime: nowTime,
  527. }
  528. if source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
  529. _, ok := mysteelNeedRefreshMap[v.Frequency]
  530. if ok {
  531. tmp.NeedRefresh = 1
  532. } else {
  533. tmp.NeedRefresh = 0
  534. }
  535. }else {
  536. _, ok := needRefreshEdbInfoIdsMap[v.EdbInfoId]
  537. if ok {
  538. tmp.NeedRefresh = 1
  539. } else {
  540. tmp.NeedRefresh = 0
  541. }
  542. }
  543. // 判断是否当日新增
  544. if v.CreateTime.After(todayT) || v.CreateTime == todayT {
  545. tmp.IsAdd = 1
  546. } else {
  547. tmp.IsAdd = 2
  548. }
  549. if up, ok := updateLogMap[v.EdbInfoId]; ok {
  550. tmp.DataUpdateTime = up.DataUpdateTime
  551. tmp.ErDataUpdateDate = up.ErDataUpdateDate
  552. tmp.DataUpdateResult = up.DataUpdateResult
  553. tmp.DataUpdateFailedReason = up.DataUpdateFailedReason
  554. tmp.HasRefresh = 1
  555. tmp.UpdateResult = up.UpdateResult
  556. tmp.UpdateFailedReason = up.UpdateFailedReason
  557. tmp.UpdateTime = up.CreateTime.Format(utils.FormatDateTime)
  558. } else if tmp.NeedRefresh == 1 {
  559. tmp.HasRefresh = 0
  560. tmp.DataUpdateResult = 2
  561. tmp.DataUpdateFailedReason = "服务异常"
  562. }
  563. // 判断是否需要新增还是更新
  564. exist, existOk := updateStatMap[v.EdbInfoId]
  565. if existOk {
  566. tmp.Id = exist.Id
  567. modifyList = append(modifyList, tmp)
  568. } else {
  569. tmp.CreateTime = nowTime
  570. addList = append(addList, tmp)
  571. }
  572. if len(addList) >= 500 {
  573. err = logStat.Add(addList)
  574. if err != nil {
  575. err = fmt.Errorf("新增同花顺明细记录报错,err: %s", err)
  576. return
  577. }
  578. addList = addList[:0]
  579. }
  580. if len(modifyList) >= 500 {
  581. err = data_stat.UpdateEdbUpdateStatMulti(modifyList)
  582. if err != nil {
  583. err = fmt.Errorf("更新同花顺明细记录报错,err: %s", err)
  584. return
  585. }
  586. modifyList = modifyList[:0]
  587. }
  588. }
  589. }
  590. //判断当日指标统计数据是否存在,如果存在则更新,不存在则新增
  591. if len(addList) > 0 {
  592. err = logStat.Add(addList)
  593. }
  594. if len(modifyList) > 0 {
  595. err = data_stat.UpdateEdbUpdateStatMulti(modifyList)
  596. }
  597. return
  598. }
  599. func GetTodayNeedRefreshEdbInfoIds(source int) (needRefreshMap map[int]struct{}, mysteelNeedRefreshMap map[string]struct{}, err error) {
  600. //刷新频率,枚举值:每自然日、每交易日、每周、每旬、每月、每季、每半年、每年
  601. refreshFrequencyList := []string{"每自然日", "每交易日", "每周", "每旬", "每月", "每季", "每半年", "每年"}
  602. // 获取刷新频率条件
  603. now := time.Now()
  604. configIds := make([]int, 0)
  605. needRefreshMap = make(map[int]struct{})
  606. mysteelNeedRefreshMap = make(map[string]struct{})
  607. for _, refreshFrequency := range refreshFrequencyList {
  608. condition, pars, isHandler := getRefreshFrequencyCondition(now, refreshFrequency)
  609. if !isHandler {
  610. // 可能是非交易日,所以过滤不处理
  611. continue
  612. }
  613. condition += ` AND refresh_frequency = ? AND source = ?`
  614. pars = append(pars, refreshFrequency, source)
  615. tmpList, tmpErr := edb_refresh.GetListByCondition(condition, pars)
  616. if tmpErr != nil {
  617. err = tmpErr
  618. return
  619. }
  620. for _, v := range tmpList {
  621. configIds = append(configIds, v.Id)
  622. if source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
  623. mysteelNeedRefreshMap[v.Frequency] = struct{}{}
  624. }
  625. }
  626. }
  627. tmpList, tmpErr := edb_refresh.GetConfigRefreshEdbInfoListBySource(source, configIds)
  628. if tmpErr != nil {
  629. err = tmpErr
  630. return
  631. }
  632. for _, v := range tmpList {
  633. needRefreshMap[v.EdbInfoId] = struct{}{}
  634. }
  635. return
  636. }
  637. // getRefreshFrequencyCondition
  638. // @Description: 根据时间和刷新频率获取条件
  639. // @author: Roc
  640. // @datetime 2024-01-09 16:27:11
  641. // @param now time.Time
  642. // @param refreshFrequency string
  643. // @return condition string
  644. // @return pars []interface{}
  645. // @return isHandler bool
  646. func getRefreshFrequencyCondition(now time.Time, refreshFrequency string) (condition string, pars []interface{}, isHandler bool) {
  647. isHandler = true
  648. var dayNum int
  649. var isLastDay bool
  650. //刷新频率,枚举值:每自然日、每交易日、每周、每旬、每月、每季、每半年、每年
  651. switch refreshFrequency {
  652. case "每自然日":
  653. // 自然日不需要额外条件
  654. return
  655. case "每交易日":
  656. // 周六日不处理
  657. if now.Weekday() == time.Saturday || now.Weekday() == time.Sunday {
  658. isHandler = false
  659. }
  660. return
  661. case "每周":
  662. currWeekDay := now.Weekday()
  663. if currWeekDay == time.Sunday {
  664. currWeekDay = 7
  665. isLastDay = true
  666. }
  667. dayNum = int(currWeekDay)
  668. case "每旬":
  669. currDay := now.Day()
  670. if currDay <= 10 {
  671. dayNum = currDay
  672. // 如果是这旬的最后一天
  673. if currDay == 10 {
  674. isLastDay = true
  675. }
  676. } else if currDay <= 20 {
  677. dayNum = currDay - 10
  678. // 如果是这旬的最后一天
  679. if currDay == 20 {
  680. isLastDay = true
  681. }
  682. } else {
  683. dayNum = currDay - 20
  684. // 当月的最后一天
  685. monthLastDay := time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  686. // 如果是这旬的最后一天
  687. if currDay == monthLastDay.Day() {
  688. isLastDay = true
  689. }
  690. }
  691. case "每月":
  692. // 当前日期
  693. currDay := now.Day()
  694. dayNum = currDay
  695. // 当期的最后一天
  696. monthLastDay := time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  697. // 如果是这期的最后一天
  698. if currDay == monthLastDay.Day() {
  699. isLastDay = true
  700. }
  701. case "每季":
  702. // 当期的第一天 ; 当期的最后一天
  703. var startDay, endDay time.Time
  704. currMonth := now.Month()
  705. currDay := now.Day()
  706. if currMonth <= 3 {
  707. // 当季的第一天
  708. startDay = time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.Local)
  709. // 当季的最后一天
  710. endDay = time.Date(now.Year(), 4, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  711. } else if currMonth <= 6 {
  712. // 当期的第一天
  713. startDay = time.Date(now.Year(), 4, 1, 0, 0, 0, 0, time.Local)
  714. // 当期的最后一天
  715. endDay = time.Date(now.Year(), 7, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  716. } else if currMonth <= 9 {
  717. // 当期的第一天
  718. startDay = time.Date(now.Year(), 7, 1, 0, 0, 0, 0, time.Local)
  719. // 当期的最后一天
  720. endDay = time.Date(now.Year(), 10, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  721. } else {
  722. // 当期的第一天
  723. startDay = time.Date(now.Year(), 10, 1, 0, 0, 0, 0, time.Local)
  724. // 当期的最后一天
  725. endDay = time.Date(now.Year()+1, 1, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  726. }
  727. // 计算这期的第一天和当日的天数
  728. dayNum = utils.GetTimeSubDay(startDay, now) + 1
  729. // 如果是这期的最后一天
  730. if currMonth == endDay.Month() && currDay == endDay.Day() {
  731. isLastDay = true
  732. }
  733. case "每半年":
  734. // 当期的第一天 ; 当期的最后一天
  735. var startDay, endDay time.Time
  736. currMonth := now.Month()
  737. currDay := now.Day()
  738. if currMonth <= 6 {
  739. // 当期的第一天
  740. startDay = time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.Local)
  741. // 当期的最后一天
  742. endDay = time.Date(now.Year(), 7, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  743. } else {
  744. // 当期的第一天
  745. startDay = time.Date(now.Year(), 7, 1, 0, 0, 0, 0, time.Local)
  746. // 当期的最后一天
  747. endDay = time.Date(now.Year()+1, 1, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  748. }
  749. // 计算这期的第一天和当日的天数
  750. dayNum = utils.GetTimeSubDay(startDay, now) + 1
  751. // 如果是这期的最后一天
  752. if currMonth == endDay.Month() && currDay == endDay.Day() {
  753. isLastDay = true
  754. }
  755. case "每年":
  756. currMonth := now.Month()
  757. currDay := now.Day()
  758. // 当期的第一天
  759. startDay := time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.Local)
  760. // 当期的最后一天
  761. endDay := time.Date(now.Year()+1, 1, 1, 0, 0, 0, 0, time.Local).AddDate(0, 0, -1)
  762. // 计算这期的第一天和当日的天数
  763. dayNum = utils.GetTimeSubDay(startDay, now) + 1
  764. // 如果是这期的最后一天
  765. if currMonth == endDay.Month() && currDay == endDay.Day() {
  766. isLastDay = true
  767. }
  768. }
  769. // 如果是这期的最后一天,那么就是判断refresh_frequency_day是否配置为0,或者配置的天数大于这期的最大天数
  770. if isLastDay {
  771. condition += ` AND ( refresh_frequency_day = ? OR refresh_frequency_day >= ? )`
  772. pars = append(pars, 0, dayNum)
  773. } else {
  774. // 如果不是这期的最后一天,那么就是判断refresh_frequency_day是否等于配置的天数
  775. condition += ` AND refresh_frequency_day = ? `
  776. pars = append(pars, dayNum)
  777. }
  778. return
  779. }