chart_info.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. package chart
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_yb/global"
  6. chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
  7. chartInfoModel "hongze/hongze_yb/models/tables/chart_info"
  8. company2 "hongze/hongze_yb/models/tables/company"
  9. edbDataModel "hongze/hongze_yb/models/tables/edb_data"
  10. edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
  11. "hongze/hongze_yb/models/tables/my_chart_classify"
  12. "hongze/hongze_yb/models/tables/yb_chart_daily_visit_log"
  13. "hongze/hongze_yb/models/tables/yb_chart_visit_log"
  14. "hongze/hongze_yb/services/alarm_msg"
  15. edbDataService "hongze/hongze_yb/services/edb_data"
  16. "hongze/hongze_yb/services/user"
  17. "hongze/hongze_yb/utils"
  18. "sort"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. // ModifyChartInfoAndMapping 修改图表信息
  24. func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChartInfoReq, chartType int) (err error) {
  25. // 开启事务
  26. tx := global.MYSQL["data"].Begin()
  27. defer func() {
  28. if err != nil {
  29. tx.Rollback()
  30. } else {
  31. tx.Commit()
  32. }
  33. }()
  34. // 更新图表信息
  35. if chartType == 1 {
  36. sql := ` UPDATE chart_info
  37. SET
  38. edb_info_ids = ?,
  39. modify_time = NOW(),
  40. date_type = ?,
  41. start_date = ?,
  42. end_date = ?,
  43. left_min = ?,
  44. left_max = ?,
  45. right_min = ?,
  46. right_max = ?
  47. WHERE chart_info_id = ?`
  48. err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  49. } else {
  50. sql := ` UPDATE chart_info
  51. SET
  52. edb_info_ids = ?,
  53. modify_time = NOW(),
  54. calendar = ?,
  55. season_start_date = ?,
  56. season_end_date = ?,
  57. left_min = ?,
  58. left_max = ?,
  59. right_min = ?,
  60. right_max = ?
  61. WHERE chart_info_id = ?`
  62. err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  63. }
  64. if err != nil {
  65. fmt.Println("UPDATE chart_info Err:", err.Error())
  66. return
  67. }
  68. var edbInfoIdArr []string
  69. mapList := make([]*chartEdbMappingModel.ChartEdbMapping, 0)
  70. for _, v := range req.ChartEdbInfoList {
  71. edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
  72. var count int
  73. csql := ` SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id = ? AND edb_info_id = ? `
  74. err = tx.Raw(csql, req.ChartInfoId, v.EdbInfoId).Scan(&count).Error
  75. if err != nil {
  76. fmt.Println("QueryRow Err:", err.Error())
  77. return err
  78. }
  79. if count > 0 {
  80. // 更新指标
  81. msql := `UPDATE chart_edb_mapping
  82. SET
  83. modify_time = NOW(),
  84. max_data = ?,
  85. min_data = ?,
  86. is_order = ?,
  87. is_axis = ?,
  88. edb_info_type = ?,
  89. lead_value = ?,
  90. lead_unit = ?,
  91. chart_style = ?,
  92. chart_color = ?,
  93. chart_width = ?
  94. WHERE chart_info_id =? AND edb_info_id=? `
  95. 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
  96. if err != nil {
  97. fmt.Println("chart_edb_mapping Err:" + err.Error())
  98. return err
  99. }
  100. } else {
  101. mapItem := new(chartEdbMappingModel.ChartEdbMapping)
  102. mapItem.ChartInfoId = req.ChartInfoId
  103. mapItem.EdbInfoId = v.EdbInfoId
  104. mapItem.CreateTime = time.Now()
  105. mapItem.ModifyTime = time.Now()
  106. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  107. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  108. mapItem.MaxData = v.MaxData
  109. mapItem.MinData = v.MinData
  110. mapItem.IsOrder = 0
  111. if v.IsOrder {
  112. mapItem.IsOrder = 1
  113. }
  114. mapItem.IsAxis = v.IsAxis
  115. mapItem.EdbInfoType = v.EdbInfoType
  116. mapItem.LeadValue = v.LeadValue
  117. mapItem.LeadUnit = v.LeadUnit
  118. mapItem.ChartStyle = v.ChartStyle
  119. mapItem.ChartColor = v.ChartColor
  120. mapItem.ChartWidth = v.ChartWidth
  121. mapList = append(mapList, mapItem)
  122. }
  123. }
  124. // 批量新增指标
  125. if len(mapList) > 0 {
  126. err = tx.Create(mapList).Error
  127. if err != nil {
  128. fmt.Println("AddChartEdbMapping Err:" + err.Error())
  129. return err
  130. }
  131. }
  132. // 清除原图表指标
  133. if len(edbInfoIdArr) > 0 {
  134. edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
  135. if edbInfoIdStr != "" {
  136. dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id NOT IN(` + edbInfoIdStr + `)`
  137. err = tx.Exec(dsql, req.ChartInfoId).Error
  138. if err != nil {
  139. fmt.Println("delete err:" + err.Error())
  140. return err
  141. }
  142. }
  143. }
  144. return
  145. }
  146. // GetChartInfoRefreshData 获取需要刷新的指标
  147. func GetChartInfoRefreshData(chartInfoId int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  148. sql := ` SELECT b.* FROM chart_edb_mapping AS a
  149. INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
  150. WHERE a.chart_info_id=? `
  151. edbInfoList := make([]*edbInfoModel.EdbInfo, 0)
  152. err = global.MYSQL["data"].Raw(sql, chartInfoId).Scan(&edbInfoList).Error
  153. if err != nil {
  154. return
  155. }
  156. for _, v := range edbInfoList {
  157. fmt.Println(v.EdbInfoId, v.EdbType)
  158. if v.EdbType == 1 {
  159. baseEdbInfoArr = append(baseEdbInfoArr, v)
  160. } else {
  161. calculateInfoArr = append(calculateInfoArr, v)
  162. newBaseEdbInfoArr, newCalculateInfoArr, err := GetChartRefreshEdbInfo(v.EdbInfoId, v.Source, 0)
  163. if err != nil {
  164. return baseEdbInfoArr, calculateInfoArr, err
  165. }
  166. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  167. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  168. }
  169. }
  170. return
  171. }
  172. // GetChartRefreshEdbInfo
  173. func GetChartRefreshEdbInfo(edbInfoId, source, n int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  174. calculateList, err := GetEdbInfoCalculateMap(edbInfoId, source)
  175. if err != nil && err != utils.ErrNoRow {
  176. return
  177. }
  178. n++
  179. for _, item := range calculateList {
  180. fmt.Println(item.EdbInfoId)
  181. if item.EdbType == 1 {
  182. baseEdbInfoArr = append(baseEdbInfoArr, item)
  183. } else {
  184. calculateInfoArr = append(calculateInfoArr, item)
  185. if n > 10 {
  186. return
  187. }
  188. newBaseEdbInfoArr, newCalculateInfoArr, _ := GetChartRefreshEdbInfo(item.EdbInfoId, item.Source, n)
  189. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  190. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  191. }
  192. }
  193. return
  194. }
  195. func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*edbInfoModel.EdbInfo, err error) {
  196. sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
  197. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  198. WHERE a.edb_info_id=? ORDER BY sort ASC `
  199. err = global.MYSQL["data"].Exec(sql, edbInfoId).Error
  200. return
  201. }
  202. // SaveChartVisitLog 保存图表访问记录
  203. func SaveChartVisitLog(userInfo user.UserInfo, chartInfo *chartInfoModel.ChartInfoView, myChartClassifyId int) (err error) {
  204. userId := int(userInfo.UserID)
  205. companyId := int(userInfo.CompanyID)
  206. chartInfoId := chartInfo.ChartInfoId
  207. // 访问记录
  208. visitLog := new(yb_chart_visit_log.YbChartVisitLog)
  209. visitLog.CompanyId = companyId
  210. companyInfo, err := company2.GetByCompanyId(userInfo.CompanyID)
  211. if err == nil {
  212. visitLog.CompanyName = companyInfo.CompanyName
  213. }
  214. visitLog.UserId = userId
  215. visitLog.RealName = userInfo.RealName
  216. visitLog.Mobile = userInfo.Mobile
  217. visitLog.Email = userInfo.Email
  218. visitLog.ChartInfoId = chartInfoId
  219. visitLog.ChartName = chartInfo.ChartName
  220. visitLog.CreateTime = time.Now().Local()
  221. visitLog.Create()
  222. // 每日访问记录,用户/天/图仅记录一次
  223. if myChartClassifyId > 0 {
  224. // 今日是否已访问
  225. nowTime := time.Now().Local()
  226. startTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, time.Local)
  227. endTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 23, 59, 59, 0, time.Local)
  228. _, tmpErr := yb_chart_daily_visit_log.GetTodayVisitLog(userId, chartInfoId, myChartClassifyId, startTime, endTime)
  229. if tmpErr == nil {
  230. return
  231. }
  232. myChartClassify, tmpErr := my_chart_classify.GetClassifyById(myChartClassifyId)
  233. if tmpErr != nil {
  234. return
  235. }
  236. dailyLog := new(yb_chart_daily_visit_log.YbChartDailyVisitLog)
  237. dailyLog.CompanyId = companyId
  238. if companyInfo != nil {
  239. dailyLog.CompanyName = companyInfo.CompanyName
  240. }
  241. dailyLog.UserId = userId
  242. dailyLog.RealName = userInfo.RealName
  243. dailyLog.Mobile = userInfo.Mobile
  244. dailyLog.Email = userInfo.Email
  245. dailyLog.ChartInfoId = chartInfoId
  246. dailyLog.ChartName = chartInfo.ChartName
  247. dailyLog.MyChartClassifyId = myChartClassifyId
  248. dailyLog.MyChartClassifyName = myChartClassify.MyChartClassifyName
  249. dailyLog.CreateTime = time.Now().Local()
  250. dailyLog.Create()
  251. }
  252. return
  253. }
  254. // RefreshChart 图表刷新
  255. func RefreshChart(chartInfoId int) (err error) {
  256. var errMsg string
  257. defer func() {
  258. if err != nil {
  259. if global.CONFIG.Serve.RunMode == "release" {
  260. //go services.SendEmail(utils.APPNAME+"【"+global.CONFIG.Serve.RunMode+"】"+"失败提醒", "RefreshChart:"+errMsg, utils.EmailSendToUsers)
  261. go alarm_msg.SendAlarmMsg("RefreshChart Err:"+errMsg, 3)
  262. }
  263. fmt.Println("RefreshChart Err:" + errMsg)
  264. }
  265. }()
  266. // 获取需要刷新的指标
  267. baseEdbInfoArr, calculateInfoArr, err := GetChartInfoRefreshData(chartInfoId)
  268. if err != nil {
  269. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  270. return
  271. }
  272. newBaseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  273. baseMap := make(map[int]*edbInfoModel.EdbInfo)
  274. for _, bv := range baseEdbInfoArr {
  275. // 如果不是普通指标,那么过滤
  276. if bv.EdbInfoType != 0 {
  277. continue
  278. }
  279. if _, ok := baseMap[bv.EdbInfoId]; !ok {
  280. newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
  281. }
  282. baseMap[bv.EdbInfoId] = bv
  283. }
  284. newCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  285. calculateMap := make(map[int]*edbInfoModel.EdbInfo)
  286. var calculateArr []int
  287. for _, bv := range calculateInfoArr {
  288. if _, ok := calculateMap[bv.EdbInfoId]; !ok {
  289. newCalculateInfoArr = append(newCalculateInfoArr, bv)
  290. calculateArr = append(calculateArr, bv.EdbInfoId)
  291. }
  292. calculateMap[bv.EdbInfoId] = bv
  293. }
  294. sort.Ints(calculateArr)
  295. // 刷新指标
  296. var startDate string
  297. for _, bv := range newBaseEdbInfoArr {
  298. source := bv.Source
  299. edbInfoId := bv.EdbInfoId
  300. edbCode := bv.EdbCode
  301. startDate = bv.StartDate.Format(utils.FormatDate)
  302. frequency := bv.Frequency
  303. if startDate == "0000-00-00" {
  304. continue
  305. }
  306. sTime := bv.EndDate
  307. var limitDay int
  308. startDate := ""
  309. switch frequency {
  310. case "日度":
  311. limitDay = utils.DATA_START_REFRESH_LIMIT
  312. case "周度":
  313. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  314. case "月度":
  315. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  316. case "季度":
  317. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  318. case "年度":
  319. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  320. default:
  321. limitDay = utils.DATA_START_REFRESH_LIMIT
  322. }
  323. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  324. fmt.Println("source:", source)
  325. respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
  326. if err != nil {
  327. errMsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
  328. return err
  329. }
  330. if respItem.Ret != 200 {
  331. errMsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
  332. return err
  333. }
  334. //maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
  335. //if err != nil {
  336. // return err
  337. //}
  338. //if maxAndMinItem != nil {
  339. // err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  340. // if err != nil {
  341. // return err
  342. // }
  343. //}
  344. }
  345. // 刷新计算指标
  346. for _, v := range calculateArr {
  347. edbInfo := calculateMap[v]
  348. if edbInfo == nil {
  349. return err
  350. }
  351. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  352. source := edbInfo.Source
  353. if source == utils.DATA_SOURCE_CALCULATE {
  354. sTime := edbInfo.EndDate
  355. startDate = sTime.Format(utils.FormatDate)
  356. }
  357. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  358. if err != nil {
  359. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  360. errMsg = "RefreshEdbCalculateData Err:" + err.Error()
  361. return err
  362. }
  363. if result.Ret != 200 {
  364. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  365. errMsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  366. return fmt.Errorf("刷新失败")
  367. }
  368. }
  369. return
  370. }
  371. // GetChartEdbData 获取图表的指标数据
  372. func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, sourceArr []string, err error) {
  373. edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
  374. sourceArr = make([]string, 0)
  375. for _, v := range mappingList {
  376. //fmt.Println("v:", v.EdbInfoId)
  377. item := new(chartEdbMappingModel.ChartEdbInfoMappingList)
  378. item.EdbInfoId = v.EdbInfoId
  379. item.SourceName = v.SourceName
  380. item.Source = v.Source
  381. item.EdbCode = v.EdbCode
  382. item.EdbName = v.EdbName
  383. item.EdbNameEn = v.EdbNameEn
  384. item.Frequency = v.Frequency
  385. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  386. if v.Unit != `无` {
  387. item.Unit = v.Unit
  388. }
  389. item.UnitEn = v.UnitEn
  390. item.StartDate = v.StartDate
  391. item.EndDate = v.EndDate
  392. item.ModifyTime = v.ModifyTime
  393. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  394. item.PredictChartColor = v.PredictChartColor
  395. if !utils.InArray(v.Source, utils.SystemSourceList) { //来源于系统的指标,都展示为弘则研究
  396. if !utils.InArray(v.SourceName, sourceArr) {
  397. sourceArr = append(sourceArr, v.SourceName)
  398. }
  399. }
  400. if chartInfoId <= 0 {
  401. item.IsAxis = 1
  402. item.LeadValue = 0
  403. item.LeadUnit = ""
  404. item.ChartEdbMappingId = 0
  405. item.ChartInfoId = 0
  406. item.IsOrder = false
  407. item.EdbInfoType = 1
  408. item.ChartStyle = ""
  409. item.ChartColor = ""
  410. item.ChartWidth = 0
  411. item.MaxData = v.MaxValue
  412. item.MinData = v.MinValue
  413. } else {
  414. item.IsAxis = v.IsAxis
  415. item.EdbInfoType = v.EdbInfoType
  416. item.LeadValue = v.LeadValue
  417. item.LeadUnit = v.LeadUnit
  418. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  419. item.ChartEdbMappingId = v.ChartEdbMappingId
  420. item.ChartInfoId = v.ChartInfoId
  421. item.ChartStyle = v.ChartStyle
  422. item.ChartColor = v.ChartColor
  423. item.ChartWidth = v.ChartWidth
  424. item.IsOrder = v.IsOrder
  425. item.MaxData = v.MaxData
  426. item.MinData = v.MinData
  427. }
  428. item.LatestValue = v.LatestValue
  429. item.LatestDate = v.LatestDate
  430. item.UniqueCode = v.UniqueCode
  431. var startDateReal string
  432. var diffSeconds int64
  433. if chartType == 2 { //季节性图
  434. startDateReal = startDate
  435. } else {
  436. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  437. var startTimeRealTemp time.Time
  438. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  439. switch v.LeadUnit {
  440. case "天":
  441. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  442. case "月":
  443. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  444. case "季":
  445. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  446. case "周":
  447. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  448. case "年":
  449. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  450. }
  451. if startTimeRealTemp.Before(startDateParse) {
  452. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  453. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  454. } else {
  455. startDateReal = startDate
  456. diffSeconds = 0
  457. }
  458. } else {
  459. startDateReal = startDate
  460. }
  461. }
  462. //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  463. calendarPreYear := 0
  464. if calendar == "农历" {
  465. newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
  466. if err != nil {
  467. fmt.Println("time.Parse:" + err.Error())
  468. }
  469. calendarPreYear = newStartDateReal.Year() - 1
  470. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  471. startDateReal = newStartDateReal.Format(utils.FormatDate)
  472. }
  473. dataList := make([]*edbDataModel.EdbDataList, 0)
  474. //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate, ";EdbInfoCategoryType:", v.EdbInfoCategoryType)
  475. switch v.EdbInfoCategoryType {
  476. case 0:
  477. dataList, err = edbDataModel.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate)
  478. case 1:
  479. dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, false)
  480. default:
  481. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
  482. }
  483. if err != nil {
  484. return
  485. }
  486. if diffSeconds != 0 && v.EdbInfoType == 0 {
  487. dataListLen := len(dataList)
  488. for i := 0; i < dataListLen; i++ {
  489. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  490. }
  491. }
  492. if chartType == 2 {
  493. latestDateStr := v.LatestDate.Format(utils.FormatDate) //实际数据的截止日期
  494. latestDate := v.LatestDate
  495. //latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  496. //if tmpErr != nil {
  497. // err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
  498. // return
  499. //}
  500. latestDateYear := latestDate.Year() //实际数据截止年份
  501. if calendar == "农历" {
  502. if len(dataList) <= 0 {
  503. result := new(edbDataModel.EdbDataResult)
  504. item.DataList = result
  505. } else {
  506. result, tmpErr := edbDataService.AddCalculateQuarter(dataList)
  507. if tmpErr != nil {
  508. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  509. return
  510. }
  511. // 处理季节图的截止日期
  512. for k, edbDataItems := range result.List {
  513. var cuttingDataTimestamp int64
  514. // 切割的日期时间字符串
  515. cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
  516. //如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
  517. if edbDataItems.Year >= latestDateYear {
  518. for _, tmpData := range edbDataItems.Items {
  519. if tmpData.DataTime == cuttingDataTimeStr {
  520. cuttingDataTimestamp = tmpData.DataTimestamp
  521. break
  522. }
  523. }
  524. }
  525. edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
  526. result.List[k] = edbDataItems
  527. }
  528. if result.List[0].Year != calendarPreYear {
  529. itemList := make([]*edbDataModel.EdbDataList, 0)
  530. items := new(edbDataModel.EdbDataItems)
  531. //items.Year = calendarPreYear
  532. items.Items = itemList
  533. newResult := new(edbDataModel.EdbDataResult)
  534. newResult.List = append(newResult.List, items)
  535. newResult.List = append(newResult.List, result.List...)
  536. item.DataList = newResult
  537. } else {
  538. item.DataList = result
  539. }
  540. }
  541. } else {
  542. currentYear := time.Now().Year()
  543. quarterDataList := make([]*edbDataModel.QuarterData, 0)
  544. quarterMap := make(map[int][]*edbDataModel.EdbDataList)
  545. var quarterArr []int
  546. for _, v := range dataList {
  547. itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
  548. if tmpErr != nil {
  549. err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
  550. return
  551. }
  552. year := itemDate.Year()
  553. newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
  554. timestamp := newItemDate.UnixNano() / 1e6
  555. v.DataTimestamp = timestamp
  556. if findVal, ok := quarterMap[year]; !ok {
  557. quarterArr = append(quarterArr, year)
  558. findVal = append(findVal, v)
  559. quarterMap[year] = findVal
  560. } else {
  561. findVal = append(findVal, v)
  562. quarterMap[year] = findVal
  563. }
  564. }
  565. for _, v := range quarterArr {
  566. itemList := quarterMap[v]
  567. quarterItem := new(edbDataModel.QuarterData)
  568. quarterItem.Year = v
  569. quarterItem.DataList = itemList
  570. //如果等于最后的实际日期,那么将切割时间戳记录
  571. if v == latestDateYear {
  572. var cuttingDataTimestamp int64
  573. for _, tmpData := range itemList {
  574. if tmpData.DataTime == latestDateStr {
  575. cuttingDataTimestamp = tmpData.DataTimestamp
  576. break
  577. }
  578. }
  579. quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
  580. } else if v > latestDateYear {
  581. //如果大于最后的实际日期,那么第一个点就是切割的时间戳
  582. if len(itemList) > 0 {
  583. quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
  584. }
  585. }
  586. quarterDataList = append(quarterDataList, quarterItem)
  587. }
  588. item.DataList = quarterDataList
  589. }
  590. } else {
  591. item.DataList = dataList
  592. }
  593. edbList = append(edbList, item)
  594. }
  595. return
  596. }
  597. // 获取频度的英文版
  598. func GetFrequencyEn(frequency string) (frequencyEn string) {
  599. switch frequency {
  600. case "日度":
  601. frequencyEn = "day"
  602. return
  603. case "周度":
  604. frequencyEn = "week"
  605. return
  606. case "旬度":
  607. frequencyEn = "ten days"
  608. return
  609. case "月度":
  610. frequencyEn = "month"
  611. return
  612. case "季度":
  613. frequencyEn = "quarter"
  614. return
  615. case "年度":
  616. frequencyEn = "year"
  617. return
  618. }
  619. return
  620. }
  621. func GetLeadUnitEn(unit string) (unitEn string) {
  622. switch unit {
  623. case "天":
  624. unitEn = "day"
  625. return
  626. case "周":
  627. unitEn = "week"
  628. return
  629. case "月":
  630. unitEn = "month"
  631. return
  632. case "季":
  633. unitEn = "quarter"
  634. return
  635. case "年":
  636. unitEn = "year"
  637. return
  638. }
  639. return
  640. }