chart_info.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. package chart
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_yb/global"
  7. "hongze/hongze_yb/models/request"
  8. "hongze/hongze_yb/models/response/chart_info"
  9. chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
  10. chartInfoModel "hongze/hongze_yb/models/tables/chart_info"
  11. company2 "hongze/hongze_yb/models/tables/company"
  12. edbDataModel "hongze/hongze_yb/models/tables/edb_data"
  13. edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
  14. "hongze/hongze_yb/models/tables/my_chart_classify"
  15. "hongze/hongze_yb/models/tables/yb_chart_daily_visit_log"
  16. "hongze/hongze_yb/models/tables/yb_chart_visit_log"
  17. "hongze/hongze_yb/services/alarm_msg"
  18. edbDataService "hongze/hongze_yb/services/edb_data"
  19. "hongze/hongze_yb/services/user"
  20. "hongze/hongze_yb/utils"
  21. "sort"
  22. "strconv"
  23. "strings"
  24. "time"
  25. )
  26. // ModifyChartInfoAndMapping 修改图表信息
  27. func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChartInfoReq, chartType int) (err error) {
  28. // 开启事务
  29. tx := global.MYSQL["data"].Begin()
  30. defer func() {
  31. if err != nil {
  32. tx.Rollback()
  33. } else {
  34. tx.Commit()
  35. }
  36. }()
  37. // 更新图表信息
  38. if chartType != 2 {
  39. sql := ` UPDATE chart_info
  40. SET
  41. edb_info_ids = ?,
  42. modify_time = NOW(),
  43. date_type = ?,
  44. start_date = ?,
  45. end_date = ?,
  46. left_min = ?,
  47. left_max = ?,
  48. right_min = ?,
  49. right_max = ?
  50. WHERE chart_info_id = ?`
  51. err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  52. } else {
  53. sql := ` UPDATE chart_info
  54. SET
  55. edb_info_ids = ?,
  56. modify_time = NOW(),
  57. calendar = ?,
  58. season_start_date = ?,
  59. season_end_date = ?,
  60. left_min = ?,
  61. left_max = ?,
  62. right_min = ?,
  63. right_max = ?
  64. WHERE chart_info_id = ?`
  65. err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  66. }
  67. if err != nil {
  68. fmt.Println("UPDATE chart_info Err:", err.Error())
  69. return
  70. }
  71. var edbInfoIdArr []string
  72. mapList := make([]*chartEdbMappingModel.ChartEdbMapping, 0)
  73. for _, v := range req.ChartEdbInfoList {
  74. edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
  75. var count int
  76. csql := ` SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id = ? AND edb_info_id = ? `
  77. err = tx.Raw(csql, req.ChartInfoId, v.EdbInfoId).Scan(&count).Error
  78. if err != nil {
  79. fmt.Println("QueryRow Err:", err.Error())
  80. return err
  81. }
  82. if count > 0 {
  83. // 更新指标
  84. msql := `UPDATE chart_edb_mapping
  85. SET
  86. modify_time = NOW(),
  87. max_data = ?,
  88. min_data = ?,
  89. is_order = ?,
  90. is_axis = ?,
  91. edb_info_type = ?,
  92. lead_value = ?,
  93. lead_unit = ?,
  94. chart_style = ?,
  95. chart_color = ?,
  96. chart_width = ?
  97. WHERE chart_info_id =? AND edb_info_id=? `
  98. err = tx.Exec(msql, v.MaxData, v.MinData, v.IsOrder, v.IsAxis, v.EdbInfoType, v.LeadValue, v.LeadUnit, v.ChartStyle, v.ChartColor, v.ChartWidth, req.ChartInfoId, v.EdbInfoId).Error
  99. if err != nil {
  100. fmt.Println("chart_edb_mapping Err:" + err.Error())
  101. return err
  102. }
  103. } else {
  104. mapItem := new(chartEdbMappingModel.ChartEdbMapping)
  105. mapItem.ChartInfoId = req.ChartInfoId
  106. mapItem.EdbInfoId = v.EdbInfoId
  107. mapItem.CreateTime = time.Now()
  108. mapItem.ModifyTime = time.Now()
  109. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  110. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  111. mapItem.MaxData = v.MaxData
  112. mapItem.MinData = v.MinData
  113. mapItem.IsOrder = 0
  114. if v.IsOrder {
  115. mapItem.IsOrder = 1
  116. }
  117. mapItem.IsAxis = v.IsAxis
  118. mapItem.EdbInfoType = v.EdbInfoType
  119. mapItem.LeadValue = v.LeadValue
  120. mapItem.LeadUnit = v.LeadUnit
  121. mapItem.ChartStyle = v.ChartStyle
  122. mapItem.ChartColor = v.ChartColor
  123. mapItem.ChartWidth = v.ChartWidth
  124. mapList = append(mapList, mapItem)
  125. }
  126. }
  127. // 批量新增指标
  128. if len(mapList) > 0 {
  129. err = tx.Create(mapList).Error
  130. if err != nil {
  131. fmt.Println("AddChartEdbMapping Err:" + err.Error())
  132. return err
  133. }
  134. }
  135. // 清除原图表指标
  136. if len(edbInfoIdArr) > 0 {
  137. edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
  138. if edbInfoIdStr != "" {
  139. dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id NOT IN(` + edbInfoIdStr + `)`
  140. err = tx.Exec(dsql, req.ChartInfoId).Error
  141. if err != nil {
  142. fmt.Println("delete err:" + err.Error())
  143. return err
  144. }
  145. }
  146. }
  147. // 清除缓存
  148. {
  149. key := GetChartInfoDataKey(req.ChartInfoId)
  150. _ = global.Redis.Del(context.TODO(), key)
  151. }
  152. return
  153. }
  154. // GetChartInfoRefreshData 获取需要刷新的指标
  155. func GetChartInfoRefreshData(chartInfoId int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  156. sql := ` SELECT b.* FROM chart_edb_mapping AS a
  157. INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
  158. WHERE a.chart_info_id=? `
  159. edbInfoList := make([]*edbInfoModel.EdbInfo, 0)
  160. err = global.MYSQL["data"].Raw(sql, chartInfoId).Scan(&edbInfoList).Error
  161. if err != nil {
  162. return
  163. }
  164. for _, v := range edbInfoList {
  165. fmt.Println(v.EdbInfoId, v.EdbType)
  166. if v.EdbType == 1 {
  167. baseEdbInfoArr = append(baseEdbInfoArr, v)
  168. } else {
  169. calculateInfoArr = append(calculateInfoArr, v)
  170. newBaseEdbInfoArr, newCalculateInfoArr, err := GetChartRefreshEdbInfo(v.EdbInfoId, v.Source, 0)
  171. if err != nil {
  172. return baseEdbInfoArr, calculateInfoArr, err
  173. }
  174. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  175. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  176. }
  177. }
  178. return
  179. }
  180. // GetChartRefreshEdbInfo
  181. func GetChartRefreshEdbInfo(edbInfoId, source, n int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  182. calculateList, err := GetEdbInfoCalculateMap(edbInfoId, source)
  183. if err != nil && err != utils.ErrNoRow {
  184. return
  185. }
  186. n++
  187. for _, item := range calculateList {
  188. fmt.Println(item.EdbInfoId)
  189. if item.EdbType == 1 {
  190. baseEdbInfoArr = append(baseEdbInfoArr, item)
  191. } else {
  192. calculateInfoArr = append(calculateInfoArr, item)
  193. if n > 10 {
  194. return
  195. }
  196. newBaseEdbInfoArr, newCalculateInfoArr, _ := GetChartRefreshEdbInfo(item.EdbInfoId, item.Source, n)
  197. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  198. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  199. }
  200. }
  201. return
  202. }
  203. func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*edbInfoModel.EdbInfo, err error) {
  204. sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
  205. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  206. WHERE a.edb_info_id=? ORDER BY sort ASC `
  207. err = global.MYSQL["data"].Exec(sql, edbInfoId).Error
  208. return
  209. }
  210. // SaveChartVisitLog 保存图表访问记录
  211. func SaveChartVisitLog(userInfo user.UserInfo, chartInfo *chartInfoModel.ChartInfoView, myChartClassifyId int) (err error) {
  212. userId := int(userInfo.UserID)
  213. companyId := int(userInfo.CompanyID)
  214. chartInfoId := chartInfo.ChartInfoId
  215. // 访问记录
  216. visitLog := new(yb_chart_visit_log.YbChartVisitLog)
  217. visitLog.CompanyId = companyId
  218. companyInfo, err := company2.GetByCompanyId(userInfo.CompanyID)
  219. if err == nil {
  220. visitLog.CompanyName = companyInfo.CompanyName
  221. }
  222. visitLog.UserId = userId
  223. visitLog.RealName = userInfo.RealName
  224. visitLog.Mobile = userInfo.Mobile
  225. visitLog.Email = userInfo.Email
  226. visitLog.ChartInfoId = chartInfoId
  227. visitLog.ChartName = chartInfo.ChartName
  228. visitLog.CreateTime = time.Now().Local()
  229. visitLog.Create()
  230. // 每日访问记录,用户/天/图仅记录一次
  231. if myChartClassifyId > 0 {
  232. // 今日是否已访问
  233. nowTime := time.Now().Local()
  234. startTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, time.Local)
  235. endTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 23, 59, 59, 0, time.Local)
  236. _, tmpErr := yb_chart_daily_visit_log.GetTodayVisitLog(userId, chartInfoId, myChartClassifyId, startTime, endTime)
  237. if tmpErr == nil {
  238. return
  239. }
  240. myChartClassify, tmpErr := my_chart_classify.GetClassifyById(myChartClassifyId)
  241. if tmpErr != nil {
  242. return
  243. }
  244. dailyLog := new(yb_chart_daily_visit_log.YbChartDailyVisitLog)
  245. dailyLog.CompanyId = companyId
  246. if companyInfo != nil {
  247. dailyLog.CompanyName = companyInfo.CompanyName
  248. }
  249. dailyLog.UserId = userId
  250. dailyLog.RealName = userInfo.RealName
  251. dailyLog.Mobile = userInfo.Mobile
  252. dailyLog.Email = userInfo.Email
  253. dailyLog.ChartInfoId = chartInfoId
  254. dailyLog.ChartName = chartInfo.ChartName
  255. dailyLog.MyChartClassifyId = myChartClassifyId
  256. dailyLog.MyChartClassifyName = myChartClassify.MyChartClassifyName
  257. dailyLog.CreateTime = time.Now().Local()
  258. dailyLog.Create()
  259. }
  260. return
  261. }
  262. // RefreshChart 图表刷新
  263. func RefreshChart(chartInfoId int) (err error) {
  264. var errMsg string
  265. defer func() {
  266. if err != nil {
  267. if global.CONFIG.Serve.RunMode == "release" {
  268. //go services.SendEmail(utils.APPNAME+"【"+global.CONFIG.Serve.RunMode+"】"+"失败提醒", "RefreshChart:"+errMsg, utils.EmailSendToUsers)
  269. go alarm_msg.SendAlarmMsg("RefreshChart Err:"+errMsg, 3)
  270. }
  271. fmt.Println("RefreshChart Err:" + errMsg)
  272. }
  273. }()
  274. // 获取需要刷新的指标
  275. baseEdbInfoArr, calculateInfoArr, err := GetChartInfoRefreshData(chartInfoId)
  276. if err != nil {
  277. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  278. return
  279. }
  280. newBaseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  281. baseMap := make(map[int]*edbInfoModel.EdbInfo)
  282. for _, bv := range baseEdbInfoArr {
  283. // 如果不是普通指标,那么过滤
  284. if bv.EdbInfoType != 0 {
  285. continue
  286. }
  287. if _, ok := baseMap[bv.EdbInfoId]; !ok {
  288. newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
  289. }
  290. baseMap[bv.EdbInfoId] = bv
  291. }
  292. newCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  293. calculateMap := make(map[int]*edbInfoModel.EdbInfo)
  294. var calculateArr []int
  295. for _, bv := range calculateInfoArr {
  296. if _, ok := calculateMap[bv.EdbInfoId]; !ok {
  297. newCalculateInfoArr = append(newCalculateInfoArr, bv)
  298. calculateArr = append(calculateArr, bv.EdbInfoId)
  299. }
  300. calculateMap[bv.EdbInfoId] = bv
  301. }
  302. sort.Ints(calculateArr)
  303. // 刷新指标
  304. var startDate string
  305. for _, bv := range newBaseEdbInfoArr {
  306. source := bv.Source
  307. edbInfoId := bv.EdbInfoId
  308. edbCode := bv.EdbCode
  309. startDate = bv.StartDate.Format(utils.FormatDate)
  310. frequency := bv.Frequency
  311. if startDate == "0000-00-00" {
  312. continue
  313. }
  314. sTime := bv.EndDate
  315. var limitDay int
  316. startDate := ""
  317. switch frequency {
  318. case "日度":
  319. limitDay = utils.DATA_START_REFRESH_LIMIT
  320. case "周度":
  321. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  322. case "月度":
  323. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  324. case "季度":
  325. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  326. case "年度":
  327. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  328. default:
  329. limitDay = utils.DATA_START_REFRESH_LIMIT
  330. }
  331. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  332. fmt.Println("source:", source)
  333. respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
  334. if err != nil {
  335. errMsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
  336. return err
  337. }
  338. if respItem.Ret != 200 {
  339. errMsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
  340. return err
  341. }
  342. //maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
  343. //if err != nil {
  344. // return err
  345. //}
  346. //if maxAndMinItem != nil {
  347. // err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  348. // if err != nil {
  349. // return err
  350. // }
  351. //}
  352. }
  353. // 刷新计算指标
  354. for _, v := range calculateArr {
  355. edbInfo := calculateMap[v]
  356. if edbInfo == nil {
  357. return err
  358. }
  359. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  360. source := edbInfo.Source
  361. if source == utils.DATA_SOURCE_CALCULATE {
  362. sTime := edbInfo.EndDate
  363. startDate = sTime.Format(utils.FormatDate)
  364. }
  365. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  366. if err != nil {
  367. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  368. errMsg = "RefreshEdbCalculateData Err:" + err.Error()
  369. return err
  370. }
  371. if result.Ret != 200 {
  372. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  373. errMsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  374. return fmt.Errorf("刷新失败")
  375. }
  376. }
  377. return
  378. }
  379. // GetChartInfoDataKey 获取图表缓存的key
  380. func GetChartInfoDataKey(chartInfoId int) string {
  381. key := fmt.Sprint(utils.CACHE_CHART_INFO_DATA, chartInfoId)
  382. return key
  383. }
  384. // GetChartEdbData 获取图表的指标数据
  385. func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, barChartInfoDateList []request.BarChartInfoDateReq, barChartInfoSort request.BarChartInfoSortReq) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, xEdbIdValue []int, yDataList []chart_info.YData, sourceArr []string, err error) {
  386. edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
  387. // 指标对应的所有数据
  388. edbDataListMap := make(map[int][]*edbDataModel.EdbDataList)
  389. sourceArr = make([]string, 0)
  390. for _, v := range mappingList {
  391. //fmt.Println("v:", v.EdbInfoId)
  392. item := new(chartEdbMappingModel.ChartEdbInfoMappingList)
  393. item.EdbInfoId = v.EdbInfoId
  394. item.SourceName = v.SourceName
  395. item.Source = v.Source
  396. item.EdbCode = v.EdbCode
  397. item.EdbName = v.EdbName
  398. item.EdbNameEn = v.EdbNameEn
  399. item.Frequency = v.Frequency
  400. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  401. if v.Unit != `无` {
  402. item.Unit = v.Unit
  403. }
  404. item.UnitEn = v.UnitEn
  405. item.StartDate = v.StartDate
  406. item.EndDate = v.EndDate
  407. item.ModifyTime = v.ModifyTime
  408. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  409. item.PredictChartColor = v.PredictChartColor
  410. if !utils.InArray(v.Source, utils.SystemSourceList) { //来源于系统的指标,都展示为弘则研究
  411. if !utils.InArray(v.SourceName, sourceArr) {
  412. sourceArr = append(sourceArr, v.SourceName)
  413. }
  414. }
  415. if chartInfoId <= 0 {
  416. item.IsAxis = 1
  417. item.LeadValue = 0
  418. item.LeadUnit = ""
  419. item.ChartEdbMappingId = 0
  420. item.ChartInfoId = 0
  421. item.IsOrder = false
  422. item.EdbInfoType = 1
  423. item.ChartStyle = ""
  424. item.ChartColor = ""
  425. item.ChartWidth = 0
  426. item.MaxData = v.MaxValue
  427. item.MinData = v.MinValue
  428. } else {
  429. item.IsAxis = v.IsAxis
  430. item.EdbInfoType = v.EdbInfoType
  431. item.LeadValue = v.LeadValue
  432. item.LeadUnit = v.LeadUnit
  433. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  434. item.ChartEdbMappingId = v.ChartEdbMappingId
  435. item.ChartInfoId = v.ChartInfoId
  436. item.ChartStyle = v.ChartStyle
  437. item.ChartColor = v.ChartColor
  438. item.ChartWidth = v.ChartWidth
  439. item.IsOrder = v.IsOrder
  440. item.MaxData = v.MaxData
  441. item.MinData = v.MinData
  442. }
  443. item.LatestValue = v.LatestValue
  444. item.LatestDate = v.LatestDate
  445. item.UniqueCode = v.UniqueCode
  446. var startDateReal string
  447. var diffSeconds int64
  448. if chartType == 2 { //季节性图
  449. startDateReal = startDate
  450. } else {
  451. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  452. var startTimeRealTemp time.Time
  453. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  454. switch v.LeadUnit {
  455. case "天":
  456. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  457. case "月":
  458. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  459. case "季":
  460. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  461. case "周":
  462. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  463. case "年":
  464. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  465. }
  466. if startTimeRealTemp.Before(startDateParse) {
  467. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  468. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  469. } else {
  470. startDateReal = startDate
  471. diffSeconds = 0
  472. }
  473. } else {
  474. startDateReal = startDate
  475. }
  476. }
  477. //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  478. calendarPreYear := 0
  479. if calendar == "农历" {
  480. newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
  481. if err != nil {
  482. fmt.Println("time.Parse:" + err.Error())
  483. }
  484. calendarPreYear = newStartDateReal.Year() - 1
  485. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  486. startDateReal = newStartDateReal.Format(utils.FormatDate)
  487. }
  488. dataList := make([]*edbDataModel.EdbDataList, 0)
  489. //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate, ";EdbInfoCategoryType:", v.EdbInfoCategoryType)
  490. //var newEdbInfo *edbInfoModel.EdbInfo
  491. switch v.EdbInfoCategoryType {
  492. case 0:
  493. dataList, err = edbDataModel.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate)
  494. case 1:
  495. _, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, false)
  496. //if item.MaxValue < newEdbInfo.MaxValue {
  497. // item.MaxData = newEdbInfo.MaxValue
  498. //}
  499. //if item.MinData > newEdbInfo.MinValue {
  500. // item.MinData = newEdbInfo.MinValue
  501. //}
  502. default:
  503. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
  504. }
  505. if err != nil {
  506. return
  507. }
  508. edbDataListMap[v.EdbInfoId] = dataList
  509. if diffSeconds != 0 && v.EdbInfoType == 0 {
  510. dataListLen := len(dataList)
  511. for i := 0; i < dataListLen; i++ {
  512. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  513. }
  514. }
  515. if chartType == 2 {
  516. latestDateStr := v.LatestDate.Format(utils.FormatDate) //实际数据的截止日期
  517. latestDate := v.LatestDate
  518. //latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  519. //if tmpErr != nil {
  520. // err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
  521. // return
  522. //}
  523. latestDateYear := latestDate.Year() //实际数据截止年份
  524. if calendar == "农历" {
  525. if len(dataList) <= 0 {
  526. result := new(edbDataModel.EdbDataResult)
  527. item.DataList = result
  528. } else {
  529. result, tmpErr := edbDataService.AddCalculateQuarter(dataList)
  530. if tmpErr != nil {
  531. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  532. return
  533. }
  534. // 处理季节图的截止日期
  535. for k, edbDataItems := range result.List {
  536. var cuttingDataTimestamp int64
  537. // 切割的日期时间字符串
  538. cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
  539. //如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
  540. if edbDataItems.Year >= latestDateYear {
  541. for _, tmpData := range edbDataItems.Items {
  542. if tmpData.DataTime == cuttingDataTimeStr {
  543. cuttingDataTimestamp = tmpData.DataTimestamp
  544. break
  545. }
  546. }
  547. }
  548. edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
  549. result.List[k] = edbDataItems
  550. }
  551. if result.List[0].Year != calendarPreYear {
  552. itemList := make([]*edbDataModel.EdbDataList, 0)
  553. items := new(edbDataModel.EdbDataItems)
  554. //items.Year = calendarPreYear
  555. items.Items = itemList
  556. newResult := new(edbDataModel.EdbDataResult)
  557. newResult.List = append(newResult.List, items)
  558. newResult.List = append(newResult.List, result.List...)
  559. item.DataList = newResult
  560. } else {
  561. item.DataList = result
  562. }
  563. }
  564. } else {
  565. currentYear := time.Now().Year()
  566. quarterDataList := make([]*edbDataModel.QuarterData, 0)
  567. quarterMap := make(map[int][]*edbDataModel.EdbDataList)
  568. var quarterArr []int
  569. for _, v := range dataList {
  570. itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
  571. if tmpErr != nil {
  572. err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
  573. return
  574. }
  575. year := itemDate.Year()
  576. newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
  577. timestamp := newItemDate.UnixNano() / 1e6
  578. v.DataTimestamp = timestamp
  579. if findVal, ok := quarterMap[year]; !ok {
  580. quarterArr = append(quarterArr, year)
  581. findVal = append(findVal, v)
  582. quarterMap[year] = findVal
  583. } else {
  584. findVal = append(findVal, v)
  585. quarterMap[year] = findVal
  586. }
  587. }
  588. for _, v := range quarterArr {
  589. itemList := quarterMap[v]
  590. quarterItem := new(edbDataModel.QuarterData)
  591. quarterItem.Year = v
  592. quarterItem.DataList = itemList
  593. //如果等于最后的实际日期,那么将切割时间戳记录
  594. if v == latestDateYear {
  595. var cuttingDataTimestamp int64
  596. for _, tmpData := range itemList {
  597. if tmpData.DataTime == latestDateStr {
  598. cuttingDataTimestamp = tmpData.DataTimestamp
  599. break
  600. }
  601. }
  602. quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
  603. } else if v > latestDateYear {
  604. //如果大于最后的实际日期,那么第一个点就是切割的时间戳
  605. if len(itemList) > 0 {
  606. quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
  607. }
  608. }
  609. quarterDataList = append(quarterDataList, quarterItem)
  610. }
  611. item.DataList = quarterDataList
  612. }
  613. } else if chartType == 7 { //柱方图
  614. //item.DataList = dataList
  615. } else {
  616. item.DataList = dataList
  617. }
  618. edbList = append(edbList, item)
  619. }
  620. // 柱方图
  621. if chartType == 7 {
  622. xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartInfoDateList, barChartInfoSort)
  623. } else {
  624. xEdbIdValue = make([]int, 0)
  625. yDataList = make([]chart_info.YData, 0)
  626. }
  627. return
  628. }
  629. // BarChartData 柱方图的数据处理
  630. func BarChartData(mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, edbDataListMap map[int][]*edbDataModel.EdbDataList, barChartInfoDateList []request.BarChartInfoDateReq, barChartInfoSort request.BarChartInfoSortReq) (edbIdList []int, yDataList []chart_info.YData, err error) {
  631. // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
  632. edbDataMap := make(map[int]map[string]float64)
  633. for edbInfoId, edbDataList := range edbDataListMap {
  634. edbDateData := make(map[string]float64)
  635. for _, edbData := range edbDataList {
  636. edbDateData[edbData.DataTime] = edbData.Value
  637. }
  638. edbDataMap[edbInfoId] = edbDateData
  639. }
  640. // edbIdList 指标展示顺序;x轴的指标顺序
  641. edbIdList = make([]int, 0)
  642. //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
  643. dateData := make(map[int]float64)
  644. if barChartInfoSort.Sort == 0 {
  645. for _, v := range mappingList {
  646. edbIdList = append(edbIdList, v.EdbInfoId)
  647. }
  648. } else {
  649. lenBarChartInfoDateList := len(barChartInfoDateList)
  650. if barChartInfoSort.DateIndex >= lenBarChartInfoDateList {
  651. err = errors.New("排序日期异常")
  652. return
  653. }
  654. notDataEdbIdList := make([]int, 0) //没有数据的指标id
  655. // 日期配置
  656. barChartInfoDate := barChartInfoDateList[barChartInfoSort.DateIndex]
  657. for edbInfoId, dataList := range edbDataListMap {
  658. if len(dataList) <= 0 {
  659. // 没有数据的指标id
  660. notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
  661. continue
  662. }
  663. findDate := barChartInfoDate.Date
  664. switch barChartInfoDate.Type {
  665. case 1: //最新值
  666. findDate = dataList[len(dataList)-1].DataTime
  667. case 2: //近期几天
  668. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  669. if tmpErr != nil {
  670. err = tmpErr
  671. return
  672. }
  673. findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  674. lenData := len(dataList) - 1
  675. for i := lenData; i >= 0; i-- {
  676. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  677. if tmpErr != nil {
  678. err = tmpErr
  679. return
  680. }
  681. if utils.GetTimeSubDay(currDateTime, findDateTime) >= 5 {
  682. findDate = dataList[i].DataTime
  683. break
  684. }
  685. }
  686. case 3: // 固定日期
  687. //最早的日期
  688. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  689. if tmpErr != nil {
  690. err = tmpErr
  691. return
  692. }
  693. //寻找固定日期的数据
  694. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  695. if tmpErr != nil {
  696. err = tmpErr
  697. return
  698. }
  699. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  700. tmpDate := tmpDateTime.Format(utils.FormatDate)
  701. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  702. findDate = tmpDate
  703. break
  704. }
  705. }
  706. default:
  707. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  708. return
  709. }
  710. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  711. dateData[edbInfoId] = tmpValue
  712. } else {
  713. // 没有数据的指标id
  714. notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
  715. }
  716. }
  717. //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
  718. // 排序
  719. dateDataSort := utils.NewMapSorter(dateData)
  720. sort.Sort(dateDataSort)
  721. if barChartInfoSort.Sort == 1 {
  722. // 先将没有数据的指标id放在最前面
  723. if len(notDataEdbIdList) > 0 {
  724. edbIdList = append(edbIdList, notDataEdbIdList...)
  725. }
  726. for _, v := range dateDataSort {
  727. edbIdList = append(edbIdList, v.Key)
  728. }
  729. } else {
  730. for i := len(dateDataSort) - 1; i >= 0; i-- {
  731. edbIdList = append(edbIdList, dateDataSort[i].Key)
  732. }
  733. // 再将没有数据的指标id放在最后面
  734. if len(notDataEdbIdList) > 0 {
  735. edbIdList = append(edbIdList, notDataEdbIdList...)
  736. }
  737. }
  738. }
  739. yDataList = make([]chart_info.YData, 0) //y轴的数据列表
  740. for _, barChartInfoDate := range barChartInfoDateList {
  741. var maxDate time.Time
  742. findDataList := make([]float64, 0) // 当前日期的数据值
  743. for _, edbInfoId := range edbIdList {
  744. findDate := barChartInfoDate.Date //需要的日期值
  745. dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  746. if len(dataList) <= 0 {
  747. // 没有数据的指标id
  748. findDataList = append(findDataList, 0)
  749. continue
  750. }
  751. switch barChartInfoDate.Type {
  752. case 1: //最新值
  753. dataList := edbDataListMap[edbInfoId]
  754. findDate = dataList[len(dataList)-1].DataTime
  755. case 2: //近期几天
  756. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  757. if tmpErr != nil {
  758. err = tmpErr
  759. return
  760. }
  761. findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  762. lenData := len(dataList) - 1
  763. for i := lenData; i >= 0; i-- {
  764. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  765. if tmpErr != nil {
  766. err = tmpErr
  767. return
  768. }
  769. if utils.GetTimeSubDay(currDateTime, findDateTime) >= 5 {
  770. findDate = dataList[i].DataTime
  771. break
  772. }
  773. }
  774. case 3: // 固定日期
  775. //最早的日期
  776. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  777. if tmpErr != nil {
  778. err = tmpErr
  779. return
  780. }
  781. //寻找固定日期的数据
  782. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  783. if tmpErr != nil {
  784. err = tmpErr
  785. return
  786. }
  787. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  788. tmpDate := tmpDateTime.Format(utils.FormatDate)
  789. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  790. findDate = tmpDate
  791. break
  792. }
  793. }
  794. default:
  795. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  796. return
  797. }
  798. findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
  799. if maxDate.IsZero() {
  800. maxDate = findDateTime
  801. } else {
  802. if findDateTime.After(maxDate) {
  803. maxDate = findDateTime
  804. }
  805. }
  806. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  807. findDataList = append(findDataList, tmpValue)
  808. } else {
  809. findDataList = append(findDataList, 0)
  810. }
  811. }
  812. yDataList = append(yDataList, chart_info.YData{
  813. Date: maxDate.Format(utils.FormatDate),
  814. Value: findDataList,
  815. Color: barChartInfoDate.Color,
  816. Name: barChartInfoDate.Name,
  817. })
  818. }
  819. return
  820. }
  821. // 获取频度的英文版
  822. func GetFrequencyEn(frequency string) (frequencyEn string) {
  823. switch frequency {
  824. case "日度":
  825. frequencyEn = "day"
  826. return
  827. case "周度":
  828. frequencyEn = "week"
  829. return
  830. case "旬度":
  831. frequencyEn = "ten days"
  832. return
  833. case "月度":
  834. frequencyEn = "month"
  835. return
  836. case "季度":
  837. frequencyEn = "quarter"
  838. return
  839. case "年度":
  840. frequencyEn = "year"
  841. return
  842. }
  843. return
  844. }
  845. func GetLeadUnitEn(unit string) (unitEn string) {
  846. switch unit {
  847. case "天":
  848. unitEn = "day"
  849. return
  850. case "周":
  851. unitEn = "week"
  852. return
  853. case "月":
  854. unitEn = "month"
  855. return
  856. case "季":
  857. unitEn = "quarter"
  858. return
  859. case "年":
  860. unitEn = "year"
  861. return
  862. }
  863. return
  864. }
  865. // ChartInfoRefreshV2 图表刷新
  866. // @author Roc
  867. // @datetime 2022-09-16 10:15:38
  868. // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成 只获取使用的指标id,然后遍历去调用“指标刷新服务”
  869. func ChartInfoRefreshV2(chartInfoId int) (err error) {
  870. var errmsg string
  871. defer func() {
  872. if err != nil {
  873. go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3)
  874. //go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
  875. fmt.Println("ChartInfoRefresh Err:" + errmsg)
  876. }
  877. }()
  878. edbMappingList, err := chartEdbMappingModel.GetMappingListByChartInfoId(chartInfoId)
  879. if err != nil {
  880. errmsg = "获取需要刷新的指标失败:Err:" + err.Error()
  881. return
  882. }
  883. edbIdList := make([]int, 0)
  884. for _, v := range edbMappingList {
  885. edbIdList = append(edbIdList, v.EdbInfoId)
  886. }
  887. // 批量刷新
  888. err, errmsg = EdbInfoRefreshAllFromBase(edbIdList, false)
  889. if err != nil {
  890. return
  891. }
  892. return
  893. }