chart_info.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  1. package data_manage
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "hongze/hongze_ETA_mobile_api/controllers"
  7. "hongze/hongze_ETA_mobile_api/models"
  8. "hongze/hongze_ETA_mobile_api/models/data_manage"
  9. "hongze/hongze_ETA_mobile_api/models/system"
  10. "hongze/hongze_ETA_mobile_api/services/data"
  11. "hongze/hongze_ETA_mobile_api/utils"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. // 图表管理
  17. type ChartInfoController struct {
  18. controllers.BaseAuthController
  19. }
  20. func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
  21. resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)
  22. adminId := sysUser.AdminId
  23. //判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
  24. key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
  25. if utils.Re == nil && isCache {
  26. if utils.Re == nil && utils.Rc.IsExist(key) {
  27. if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
  28. err := json.Unmarshal(data, &resp)
  29. if err == nil && resp != nil {
  30. // 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的
  31. var myCond string
  32. var myPars []interface{}
  33. myCond += ` AND a.admin_id=? `
  34. myPars = append(myPars, adminId)
  35. myCond += ` AND a.chart_info_id=? `
  36. myPars = append(myPars, chartInfo.ChartInfoId)
  37. myList, err := data_manage.GetMyChartByCondition(myCond, myPars)
  38. if err != nil && err.Error() != utils.ErrNoRow() {
  39. msg = "获取失败"
  40. errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
  41. return
  42. }
  43. resp.ChartInfo.IsAdd = false
  44. resp.ChartInfo.MyChartId = 0
  45. resp.ChartInfo.MyChartClassifyId = ""
  46. if myList != nil && len(myList) > 0 {
  47. resp.ChartInfo.IsAdd = true
  48. resp.ChartInfo.MyChartId = myList[0].MyChartId
  49. resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId
  50. }
  51. isOk = true
  52. fmt.Println("source redis")
  53. return
  54. }
  55. }
  56. }
  57. }
  58. chartInfoId := chartInfo.ChartInfoId
  59. dateType := chartInfo.DateType
  60. if dateType <= 0 {
  61. dateType = 3
  62. }
  63. startDate := chartInfo.StartDate
  64. endDate := chartInfo.EndDate
  65. seasonStartDate := chartInfo.SeasonStartDate
  66. seasonEndDate := chartInfo.SeasonEndDate
  67. calendar := chartInfo.Calendar
  68. chartType := chartInfo.ChartType
  69. if calendar == "" {
  70. calendar = "公历"
  71. }
  72. fmt.Println("a dateType:", dateType)
  73. switch dateType {
  74. case 1:
  75. startDate = "2000-01-01"
  76. endDate = ""
  77. case 2:
  78. startDate = "2010-01-01"
  79. endDate = ""
  80. case 3:
  81. startDate = "2015-01-01"
  82. endDate = ""
  83. case 4:
  84. //startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
  85. startDate = "2021-01-01"
  86. endDate = ""
  87. case 5:
  88. startDate = startDate + "-01"
  89. endDate = endDate + "-01"
  90. case 6:
  91. //startDate = startDate + "-01"
  92. endDate = ""
  93. case 7:
  94. startDate = "2018-01-01"
  95. endDate = ""
  96. case 8:
  97. startDate = "2019-01-01"
  98. endDate = ""
  99. case 9:
  100. startDate = "2020-01-01"
  101. endDate = ""
  102. endDate = ""
  103. case 11:
  104. startDate = "2022-01-01"
  105. endDate = ""
  106. }
  107. // 兼容日期错误
  108. {
  109. if strings.Count(startDate, "-") == 1 {
  110. startDate = startDate + "-01"
  111. }
  112. if strings.Count(endDate, "-") == 1 {
  113. endDate = endDate + "-01"
  114. }
  115. }
  116. if chartType == 2 {
  117. if seasonStartDate != "" {
  118. startDate = seasonStartDate + "-01"
  119. } else {
  120. fivePre := time.Now().AddDate(-4, 0, 0).Year()
  121. startDate = strconv.Itoa(fivePre) + "-01-01"
  122. }
  123. if seasonEndDate != "" {
  124. seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
  125. if tmpErr != nil {
  126. msg = "获取失败"
  127. errMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
  128. return
  129. }
  130. endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
  131. } else {
  132. //endDate = time.Now().Format(utils.FormatDate)
  133. }
  134. }
  135. mappingList, err := data_manage.GetChartEdbMappingList(chartInfoId)
  136. if err != nil {
  137. msg = "获取失败"
  138. errMsg = "获取图表,指标信息失败,Err:" + err.Error()
  139. return
  140. }
  141. extraConfigStr := chartInfo.ExtraConfig //图表额外数据参数
  142. var barConfig data_manage.BarChartInfoReq
  143. // 柱方图的一些配置
  144. if chartInfo != nil && chartInfo.ChartType == 7 {
  145. if chartInfo.BarConfig == `` {
  146. msg = "柱方图未配置"
  147. errMsg = "柱方图未配置"
  148. return
  149. }
  150. err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  151. if err != nil {
  152. msg = "柱方图配置异常"
  153. errMsg = "柱方图配置异常"
  154. return
  155. }
  156. extraConfigStr = chartInfo.BarConfig
  157. }
  158. // 获取图表中的指标数据
  159. edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
  160. if err != nil {
  161. msg = "获取失败"
  162. if errMsg != `` {
  163. msg = errMsg
  164. }
  165. errMsg = "获取图表,指标信息失败,Err:" + err.Error()
  166. return
  167. }
  168. warnEdbList := make([]string, 0)
  169. for _, v := range edbList {
  170. if v.IsNullData {
  171. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  172. }
  173. }
  174. if len(warnEdbList) > 0 {
  175. chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
  176. }
  177. /*
  178. ChartClassify []*ChartClassifyView
  179. */
  180. chartClassify, _ := data_manage.GetChartClassifyViewById(chartInfo.ChartClassifyId)
  181. if chartClassify != nil {
  182. chartClassifyParent, _ := data_manage.GetChartClassifyViewById(chartClassify.ParentId)
  183. chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassifyParent)
  184. }
  185. chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassify)
  186. resp.EdbInfoList = edbList
  187. //判断是否需要展示英文标识
  188. chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
  189. //判断是否加入我的图库
  190. {
  191. var myChartCondition string
  192. var myChartPars []interface{}
  193. myChartCondition += ` AND a.admin_id=? `
  194. myChartPars = append(myChartPars, adminId)
  195. myChartCondition += ` AND a.chart_info_id=? `
  196. myChartPars = append(myChartPars, chartInfo.ChartInfoId)
  197. myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
  198. if err != nil && err.Error() != utils.ErrNoRow() {
  199. msg = "获取失败"
  200. errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
  201. return
  202. }
  203. if myChartList != nil && len(myChartList) > 0 {
  204. chartInfo.IsAdd = true
  205. chartInfo.MyChartId = myChartList[0].MyChartId
  206. chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
  207. }
  208. }
  209. //图表操作权限
  210. chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
  211. resp.ChartInfo = chartInfo
  212. resp.XEdbIdValue = xEdbIdValue
  213. resp.YDataList = yDataList
  214. resp.Status = true
  215. resp.BarChartInfo = barConfig
  216. resp.DataResp = dataResp
  217. // 将数据加入缓存
  218. if utils.Re == nil {
  219. data, _ := json.Marshal(resp)
  220. utils.Rc.Put(key, data, 2*time.Hour)
  221. }
  222. isOk = true
  223. return
  224. }
  225. // ChartInfoDetail
  226. // @Title 获取图表详情
  227. // @Description 获取图表详情接口
  228. // @Param ChartInfoId query int true "图表id"
  229. // @Param DateType query int true "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"
  230. // @Param StartDate query string true "自定义开始日期"
  231. // @Param EndDate query string true "自定义结束日期"
  232. // @Param Calendar query string true "公历/农历"
  233. // @Param SeasonStartDate query string true "季节性图开始日期"
  234. // @Param SeasonEndDate query string true "季节性图结束日期"
  235. // @Param EdbInfoId query string true "指标ID,多个用英文逗号隔开"
  236. // @Param ChartType query int true "生成样式:1:曲线图,2:季节性图"
  237. // @Success 200 {object} data_manage.ChartInfoDetailResp
  238. // @router /chart_info/detail [get]
  239. func (this *ChartInfoController) ChartInfoDetail() {
  240. br := new(models.BaseResponse).Init()
  241. defer func() {
  242. this.Data["json"] = br
  243. this.ServeJSON()
  244. }()
  245. sysUser := this.SysUser
  246. if sysUser == nil {
  247. br.Msg = "请登录"
  248. br.ErrMsg = "请登录,SysUser Is Empty"
  249. br.Ret = 408
  250. return
  251. }
  252. chartInfoId, _ := this.GetInt("ChartInfoId")
  253. dateType, _ := this.GetInt("DateType")
  254. fmt.Println("dateType:", dateType)
  255. if dateType <= 0 {
  256. dateType = 3
  257. }
  258. startDate := this.GetString("StartDate")
  259. endDate := this.GetString("EndDate")
  260. seasonStartDate := this.GetString("SeasonStartDate")
  261. seasonEndDate := this.GetString("SeasonEndDate")
  262. edbInfoId := this.GetString("EdbInfoId")
  263. chartType, _ := this.GetInt("ChartType")
  264. fmt.Println("seasonStartDate:", seasonStartDate)
  265. fmt.Println("seasonEndDate:", seasonEndDate)
  266. calendar := this.GetString("Calendar")
  267. if calendar == "" {
  268. calendar = "公历"
  269. }
  270. switch dateType {
  271. case 1:
  272. startDate = "2000-01-01"
  273. case 2:
  274. startDate = "2010-01-01"
  275. case 3:
  276. startDate = "2015-01-01"
  277. case 4:
  278. //startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
  279. startDate = "2021-01-01"
  280. case 5:
  281. startDate = startDate + "-01"
  282. endDate = endDate + "-01"
  283. case 6:
  284. startDate = startDate + "-01"
  285. case 7:
  286. startDate = "2018-01-01"
  287. case 8:
  288. startDate = "2019-01-01"
  289. case 9:
  290. startDate = "2020-01-01"
  291. case 11:
  292. startDate = "2022-01-01"
  293. }
  294. var err error
  295. chartInfo := new(data_manage.ChartInfoView)
  296. if chartInfoId > 0 {
  297. chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
  298. if err != nil {
  299. if err.Error() == utils.ErrNoRow() {
  300. br.Msg = "图被删除,请刷新页面"
  301. br.ErrMsg = "图被删除,请刷新页面,Err:" + err.Error()
  302. return
  303. }
  304. br.Msg = "获取失败"
  305. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  306. return
  307. }
  308. chartType = chartInfo.ChartType
  309. }
  310. if chartType == 2 {
  311. if seasonStartDate != "" {
  312. startDate = seasonStartDate + "-01"
  313. } else {
  314. fivePre := time.Now().AddDate(-4, 0, 0).Year()
  315. startDate = strconv.Itoa(fivePre) + "-01-01"
  316. }
  317. if seasonEndDate != "" {
  318. seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
  319. if tmpErr != nil {
  320. br.Msg = "获取失败"
  321. br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
  322. return
  323. }
  324. endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
  325. } else {
  326. endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
  327. }
  328. }
  329. mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
  330. if chartInfoId > 0 {
  331. mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId)
  332. if err != nil {
  333. br.Msg = "获取失败"
  334. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  335. return
  336. }
  337. } else {
  338. if edbInfoId != "" {
  339. mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoId(edbInfoId)
  340. if err != nil {
  341. br.Msg = "获取失败"
  342. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  343. return
  344. }
  345. }
  346. }
  347. // 图表额外数据参数
  348. extraConfigStr := chartInfo.ExtraConfig
  349. // 柱方图的一些配置
  350. var barConfig data_manage.BarChartInfoReq
  351. if chartInfo != nil && chartInfo.ChartType == 7 {
  352. if chartInfo.BarConfig == `` {
  353. br.Msg = "柱方图未配置"
  354. br.ErrMsg = "柱方图未配置"
  355. return
  356. }
  357. err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  358. if err != nil {
  359. br.Msg = "柱方图配置异常"
  360. br.ErrMsg = "柱方图配置异常"
  361. return
  362. }
  363. extraConfigStr = chartInfo.BarConfig
  364. }
  365. // 获取图表中的指标数据
  366. edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
  367. if err != nil {
  368. br.Msg = "获取失败"
  369. if errMsg != `` {
  370. br.Msg = errMsg
  371. }
  372. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  373. return
  374. }
  375. warnEdbList := make([]string, 0)
  376. for _, v := range edbList {
  377. if v.IsNullData {
  378. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  379. }
  380. }
  381. if len(warnEdbList) > 0 {
  382. chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
  383. }
  384. if chartInfoId > 0 && chartInfo != nil {
  385. //判断是否加入我的图库
  386. {
  387. var myChartCondition string
  388. var myChartPars []interface{}
  389. myChartCondition += ` AND a.admin_id=? `
  390. myChartPars = append(myChartPars, sysUser.AdminId)
  391. myChartCondition += ` AND a.chart_info_id=? `
  392. myChartPars = append(myChartPars, chartInfo.ChartInfoId)
  393. myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
  394. if err != nil && err.Error() != utils.ErrNoRow() {
  395. br.Msg = "获取失败"
  396. br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
  397. return
  398. }
  399. if myChartList != nil && len(myChartList) > 0 {
  400. chartInfo.IsAdd = true
  401. chartInfo.MyChartId = myChartList[0].MyChartId
  402. chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
  403. }
  404. }
  405. }
  406. //图表操作权限
  407. chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
  408. //判断是否需要展示英文标识
  409. chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
  410. resp := new(data_manage.ChartInfoDetailResp)
  411. resp.ChartInfo = chartInfo
  412. resp.EdbInfoList = edbList
  413. resp.XEdbIdValue = xEdbIdValue
  414. resp.YDataList = yDataList
  415. resp.BarChartInfo = barConfig
  416. resp.DataResp = dataResp
  417. br.Ret = 200
  418. br.Success = true
  419. br.Msg = "获取成功"
  420. br.Data = resp
  421. }
  422. // ChartInfoEdbInfoDetail
  423. // @Title 图表-获取指标详情
  424. // @Description 图表-获取指标详情接口
  425. // @Param EdbInfoId query int true "指标ID"
  426. // @Param DateType query int true "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:自定义起始时间至今,7:18年至今,8:19年至今,9:20年至今"
  427. // @Param StartDate query string true "自定义开始日期"
  428. // @Param EndDate query string true "自定义结束日期"
  429. // @Param EdbInfoType query int true "1:标准指标,0:领先指标,默认为标准指标"
  430. // @Param LeadValue query int true "领先值"
  431. // @Param LeadUnit query string true "领先单位:天,月,季,周"
  432. // @Success 200 {object} data_manage.ChartEdbInfoDetailResp
  433. // @router /chart_info/edb_info/detail [get]
  434. func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
  435. br := new(models.BaseResponse).Init()
  436. defer func() {
  437. this.Data["json"] = br
  438. this.ServeJSON()
  439. }()
  440. sysUser := this.SysUser
  441. if sysUser == nil {
  442. br.Msg = "请登录"
  443. br.ErrMsg = "请登录,SysUser Is Empty"
  444. br.Ret = 408
  445. return
  446. }
  447. edbInfoId, _ := this.GetInt("EdbInfoId")
  448. if edbInfoId <= 0 {
  449. br.Msg = "参数错误"
  450. return
  451. }
  452. dateType, _ := this.GetInt("DateType")
  453. if dateType <= 0 {
  454. dateType = 3
  455. }
  456. edbInfoType, _ := this.GetInt("EdbInfoType")
  457. if edbInfoType < 0 {
  458. edbInfoType = 1
  459. }
  460. leadValue, _ := this.GetInt("LeadValue")
  461. if leadValue < 0 {
  462. leadValue = 0
  463. }
  464. leadUnit := this.GetString("LeadUnit")
  465. startDate := this.GetString("StartDate")
  466. endDate := this.GetString("EndDate")
  467. isTimeBetween := false //是否是时间区间
  468. switch dateType {
  469. case 1:
  470. startDate = "2000-01-01"
  471. endDate = ""
  472. case 2:
  473. startDate = "2010-01-01"
  474. endDate = ""
  475. case 3:
  476. startDate = "2015-01-01"
  477. endDate = ""
  478. case 4:
  479. //startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
  480. startDate = "2021-01-01"
  481. endDate = ""
  482. case 5:
  483. startDate = startDate + "-01"
  484. endDate = endDate + "-01"
  485. isTimeBetween = true
  486. case 6:
  487. //startDate = startDate + "-01"
  488. endDate = ""
  489. case 7:
  490. startDate = "2018-01-01"
  491. endDate = ""
  492. case 8:
  493. startDate = "2019-01-01"
  494. endDate = ""
  495. case 9:
  496. startDate = "2020-01-01"
  497. endDate = ""
  498. case 11:
  499. startDate = "2022-01-01"
  500. endDate = ""
  501. default:
  502. startDate = startDate + "-01"
  503. endDate = endDate + "-01"
  504. }
  505. // 兼容日期错误
  506. {
  507. if strings.Count(startDate, "-") == 1 {
  508. startDate = startDate + "-01"
  509. }
  510. if strings.Count(endDate, "-") == 1 {
  511. endDate = endDate + "-01"
  512. }
  513. }
  514. if startDate == "" {
  515. br.Msg = "参数错误"
  516. br.Msg = "参数错误,无效的查询日期"
  517. return
  518. }
  519. var startDateReal string
  520. var diffSeconds int64
  521. if leadValue > 0 && leadUnit != "" {
  522. var startTimeRealTemp time.Time
  523. startDateParse, err := time.Parse(utils.FormatDate, startDate)
  524. if err != nil {
  525. br.Msg = "获取数据失败"
  526. br.ErrMsg = "获取数据失败,日期格式错误:startDate:" + startDate
  527. return
  528. }
  529. switch leadUnit {
  530. case "天":
  531. startTimeRealTemp = startDateParse.AddDate(0, 0, -leadValue)
  532. case "月":
  533. startTimeRealTemp = startDateParse.AddDate(0, -leadValue, 0)
  534. case "季":
  535. startTimeRealTemp = startDateParse.AddDate(0, -3*leadValue, 0)
  536. case "周":
  537. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*leadValue)
  538. case "年":
  539. startTimeRealTemp = startDateParse.AddDate(-leadValue, 0, 0)
  540. }
  541. if startTimeRealTemp.Before(startDateParse) {
  542. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  543. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  544. } else {
  545. startDateReal = startDate
  546. diffSeconds = 0
  547. }
  548. } else {
  549. startDateReal = startDate
  550. }
  551. edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
  552. if err != nil {
  553. br.Msg = "获取失败"
  554. br.Msg = "获取失败,Err:" + err.Error()
  555. return
  556. }
  557. var dataList []*data_manage.EdbDataList
  558. var minData, maxData float64
  559. switch edbInfo.EdbInfoType {
  560. case 0: //普通源指标
  561. dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDateReal, endDate)
  562. if err != nil {
  563. br.Msg = "获取失败"
  564. br.Msg = "获取失败,Err:" + err.Error()
  565. return
  566. }
  567. //查询区间内最大最小值
  568. minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfoId, startDateReal, endDate)
  569. if err != nil {
  570. br.Msg = "获取失败"
  571. br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()
  572. return
  573. }
  574. case 1: //预测指标
  575. tmpDataList, sourceEdbInfoItem, _, err, _ := data.GetPredictDataListByPredictEdbInfo(edbInfo, startDateReal, endDate, isTimeBetween)
  576. if err != nil {
  577. br.Msg = "获取失败"
  578. br.Msg = "获取失败,Err:" + err.Error()
  579. return
  580. }
  581. dataList = tmpDataList
  582. // 有预测数据,且为普通的预测指标
  583. if len(dataList) > 0 && edbInfo.EdbInfoType == 0 {
  584. //查询区间内最大最小值
  585. minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate)
  586. if err != nil {
  587. br.Msg = "获取失败"
  588. br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()
  589. return
  590. }
  591. tmpValue := dataList[len(dataList)-1]
  592. // 如果最大值 小于 预测值,那么将预测值作为最大值数据返回
  593. if edbInfo.MaxValue < tmpValue.Value {
  594. maxData = tmpValue.Value
  595. }
  596. // 如果最小值 大于 预测值,那么将预测值作为最小值数据返回
  597. if edbInfo.MinValue > tmpValue.Value {
  598. minData = tmpValue.Value
  599. }
  600. }
  601. }
  602. if diffSeconds != 0 {
  603. dataListLen := len(dataList)
  604. for i := 0; i < dataListLen; i++ {
  605. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  606. }
  607. day, err := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
  608. if err != nil {
  609. br.Msg = "获取失败"
  610. br.Msg = "获取领先滞后的的日期间隔失败,Err:" + err.Error()
  611. return
  612. }
  613. latestDateTime, err := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
  614. if err != nil {
  615. br.Msg = "获取失败"
  616. br.Msg = "指标日期转换失败,Err:" + err.Error()
  617. return
  618. }
  619. edbInfo.LatestDate = latestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
  620. }
  621. mapping := new(data_manage.ChartEdbInfoMapping)
  622. mapping.EdbInfoId = edbInfo.EdbInfoId
  623. mapping.EdbInfoCategoryType = edbInfo.EdbInfoType
  624. mapping.SourceName = edbInfo.SourceName
  625. mapping.Source = edbInfo.Source
  626. mapping.EdbCode = edbInfo.EdbCode
  627. mapping.EdbName = edbInfo.EdbName
  628. mapping.EdbType = edbInfo.EdbType
  629. mapping.Frequency = edbInfo.Frequency
  630. mapping.Unit = edbInfo.Unit
  631. mapping.StartDate = edbInfo.StartDate
  632. mapping.EndDate = edbInfo.EndDate
  633. mapping.ChartEdbMappingId = 0
  634. mapping.ChartInfoId = 0
  635. mapping.MaxData = maxData
  636. mapping.MinData = minData
  637. mapping.IsOrder = false
  638. mapping.IsAxis = 1
  639. mapping.EdbInfoType = 1
  640. mapping.LeadValue = 0
  641. mapping.LeadUnit = ""
  642. mapping.LeadUnitEn = ""
  643. mapping.ChartStyle = ""
  644. mapping.ChartColor = ""
  645. mapping.PredictChartColor = ""
  646. mapping.ChartWidth = 0
  647. mapping.LatestDate = edbInfo.LatestDate
  648. mapping.DataList = dataList
  649. resp := new(data_manage.ChartEdbInfoDetailResp)
  650. resp.EdbInfo = mapping
  651. br.Ret = 200
  652. br.Success = true
  653. br.Msg = "获取成功"
  654. br.Data = resp
  655. }
  656. // CopyChartInfo
  657. // @Title 复制并新增图表接口
  658. // @Description 新增图表接口
  659. // @Param request body data_manage.CopyAddChartInfoReq true "type json string"
  660. // @Success 200 {object} data_manage.AddChartInfoResp
  661. // @router /chart_info/copy [post]
  662. func (this *ChartInfoController) CopyChartInfo() {
  663. br := new(models.BaseResponse).Init()
  664. defer func() {
  665. this.Data["json"] = br
  666. this.ServeJSON()
  667. }()
  668. sysUser := this.SysUser
  669. if sysUser == nil {
  670. br.Msg = "请登录"
  671. br.ErrMsg = "请登录,SysUser Is Empty"
  672. br.Ret = 408
  673. return
  674. }
  675. deleteCache := true
  676. cacheKey := "CACHE_CHART_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  677. defer func() {
  678. if deleteCache {
  679. utils.Rc.Delete(cacheKey)
  680. }
  681. }()
  682. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  683. deleteCache = false
  684. br.Msg = "系统处理中,请稍后重试!"
  685. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  686. return
  687. }
  688. var req data_manage.CopyAddChartInfoReq
  689. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  690. if err != nil {
  691. br.Msg = "参数解析异常!"
  692. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  693. return
  694. }
  695. // 获取原图表信息
  696. oldChartInfo, err := data_manage.GetChartInfoById(req.ChartInfoId)
  697. if err != nil {
  698. br.Msg = "获取原图表信息失败"
  699. br.ErrMsg = "获取原图表信息失败,Err:" + err.Error()
  700. return
  701. }
  702. //校验图表名称是否重复
  703. req.ChartName = strings.Trim(req.ChartName, " ")
  704. if req.ChartName == "" {
  705. br.Msg = "请填写图表名称!"
  706. return
  707. }
  708. if req.ChartClassifyId <= 0 {
  709. br.Msg = "分类参数错误!"
  710. return
  711. }
  712. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  713. if err != nil {
  714. if err.Error() == utils.ErrNoRow() {
  715. br.Msg = "分类不存在"
  716. br.ErrMsg = "分类不存在"
  717. return
  718. }
  719. br.Msg = "获取分类信息失败"
  720. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  721. return
  722. }
  723. if chartClassify == nil {
  724. br.Msg = "分类不存在"
  725. br.ErrMsg = "分类不存在"
  726. return
  727. }
  728. //count, err := data_manage.ChartInfoExist("", edbInfoIdStr)
  729. //if err != nil && err.Error() != utils.ErrNoRow() {
  730. // br.Msg = "保存失败"
  731. // br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error()
  732. // return
  733. //}
  734. //if count > 0 {
  735. // br.Msg = "所选指标已存在相同指标"
  736. // return
  737. //}
  738. //判断图表是否存在
  739. var condition string
  740. var pars []interface{}
  741. condition += " AND chart_classify_id=? "
  742. pars = append(pars, req.ChartClassifyId)
  743. condition += " AND chart_name=? AND source = ? "
  744. pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT)
  745. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  746. if err != nil {
  747. br.Msg = "判断图表名称是否存在失败"
  748. br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error()
  749. return
  750. }
  751. if count > 0 {
  752. br.Msg = "图表已存在,请重新填写"
  753. br.IsSendEmail = false
  754. return
  755. }
  756. //获取原图表关联的指标信息列表
  757. edbMappingList, err := data_manage.GetChartEdbMappingList(req.ChartInfoId)
  758. if err != nil {
  759. br.Msg = "获取图表关联的指标信息失败!"
  760. return
  761. }
  762. //添加图表
  763. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  764. chartInfo := &data_manage.ChartInfo{
  765. ChartInfoId: 0,
  766. ChartName: req.ChartName,
  767. ChartClassifyId: req.ChartClassifyId,
  768. SysUserId: sysUser.AdminId,
  769. SysUserRealName: sysUser.RealName,
  770. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  771. CreateTime: time.Now(),
  772. ModifyTime: time.Now(),
  773. DateType: oldChartInfo.DateType,
  774. StartDate: oldChartInfo.StartDate,
  775. EndDate: oldChartInfo.EndDate,
  776. IsSetName: oldChartInfo.IsSetName,
  777. EdbInfoIds: oldChartInfo.EdbInfoIds,
  778. ChartType: oldChartInfo.ChartType,
  779. Calendar: oldChartInfo.Calendar,
  780. SeasonStartDate: oldChartInfo.SeasonStartDate,
  781. SeasonEndDate: oldChartInfo.SeasonEndDate,
  782. ChartImage: oldChartInfo.ChartImage,
  783. BarConfig: oldChartInfo.BarConfig,
  784. //Sort: sort,
  785. LeftMin: oldChartInfo.LeftMin,
  786. LeftMax: oldChartInfo.LeftMax,
  787. RightMin: oldChartInfo.RightMin,
  788. RightMax: oldChartInfo.RightMax,
  789. Disabled: oldChartInfo.Disabled,
  790. Source: oldChartInfo.Source,
  791. ExtraConfig: oldChartInfo.ExtraConfig,
  792. }
  793. newId, err := data_manage.AddChartInfo(chartInfo)
  794. if err != nil {
  795. br.Msg = "保存失败"
  796. br.ErrMsg = "保存失败,Err:" + err.Error()
  797. return
  798. }
  799. chartInfo.ChartInfoId = int(newId)
  800. // 添加图表与指标的关联关系
  801. {
  802. mapList := make([]*data_manage.ChartEdbMapping, 0)
  803. for _, v := range edbMappingList {
  804. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  805. mapItem := &data_manage.ChartEdbMapping{
  806. //ChartEdbMappingId: 0,
  807. ChartInfoId: chartInfo.ChartInfoId,
  808. EdbInfoId: v.EdbInfoId,
  809. CreateTime: time.Now(),
  810. ModifyTime: time.Now(),
  811. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  812. MaxData: v.MaxData,
  813. MinData: v.MinData,
  814. IsOrder: v.IsOrder,
  815. IsAxis: v.IsAxis,
  816. EdbInfoType: v.EdbInfoType,
  817. LeadValue: v.LeadValue,
  818. LeadUnit: v.LeadUnit,
  819. ChartStyle: v.ChartStyle,
  820. ChartColor: v.ChartColor,
  821. ChartWidth: v.ChartWidth,
  822. Source: v.Source,
  823. }
  824. mapList = append(mapList, mapItem)
  825. }
  826. err = data_manage.AddChartEdbMapping(mapList)
  827. if err != nil {
  828. br.Msg = "保存失败"
  829. br.ErrMsg = "保存失败,Err:" + err.Error()
  830. return
  831. }
  832. }
  833. //添加es数据
  834. go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  835. //修改my eta es数据
  836. go data.EsAddOrEditMyChartInfoByChartInfoId(chartInfo.ChartInfoId)
  837. //新增操作日志
  838. {
  839. chartLog := new(data_manage.ChartInfoLog)
  840. chartLog.ChartInfoId = chartInfo.ChartInfoId
  841. chartLog.ChartName = req.ChartName
  842. chartLog.ChartClassifyId = req.ChartClassifyId
  843. chartLog.SysUserId = sysUser.AdminId
  844. chartLog.SysUserRealName = sysUser.RealName
  845. chartLog.UniqueCode = chartInfo.UniqueCode
  846. chartLog.CreateTime = time.Now()
  847. chartLog.Content = string(this.Ctx.Input.RequestBody)
  848. chartLog.Status = "新增图表"
  849. chartLog.Method = this.Ctx.Input.URI()
  850. go data_manage.AddChartInfoLog(chartLog)
  851. }
  852. br.Ret = 200
  853. br.Success = true
  854. br.Msg = "保存成功"
  855. br.Data = data_manage.AddChartInfoResp{
  856. ChartInfoId: chartInfo.ChartInfoId,
  857. UniqueCode: chartInfo.UniqueCode,
  858. ChartType: chartInfo.ChartType,
  859. }
  860. br.IsAddLog = true
  861. }
  862. // ChartInfoSearchByEs
  863. // @Title 图表模糊搜索(从es获取)
  864. // @Description 图表模糊搜索(从es获取)
  865. // @Param Keyword query string true "图表名称"
  866. // @Param IsShowMe query bool true "是否只看我的,true、false"
  867. // @Success 200 {object} data_manage.ChartInfo
  868. // @router /chart_info/search_by_es [get]
  869. func (this *ChartInfoController) ChartInfoSearchByEs() {
  870. br := new(models.BaseResponse).Init()
  871. defer func() {
  872. this.Data["json"] = br
  873. this.ServeJSON()
  874. }()
  875. sysUser := this.SysUser
  876. if sysUser == nil {
  877. br.Msg = "请登录"
  878. br.ErrMsg = "请登录,SysUser Is Empty"
  879. br.Ret = 408
  880. return
  881. }
  882. pageSize, _ := this.GetInt("PageSize")
  883. currentIndex, _ := this.GetInt("CurrentIndex")
  884. var startSize int
  885. if pageSize <= 0 {
  886. pageSize = utils.PageSize20
  887. }
  888. if currentIndex <= 0 {
  889. currentIndex = 1
  890. }
  891. startSize = paging.StartIndex(currentIndex, pageSize)
  892. keyword := this.GetString("Keyword")
  893. //只看我的
  894. isShowMe, _ := this.GetBool("IsShowMe")
  895. showSysId := 0
  896. if isShowMe {
  897. showSysId = sysUser.AdminId
  898. }
  899. var searchList []*data_manage.ChartInfo
  900. var total int64
  901. var err error
  902. // 获取当前账号的不可见指标
  903. noPermissionChartIdList := make([]int, 0)
  904. {
  905. obj := data_manage.EdbInfoNoPermissionAdmin{}
  906. confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
  907. if err != nil && err.Error() != utils.ErrNoRow() {
  908. br.Msg = "获取失败"
  909. br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
  910. return
  911. }
  912. for _, v := range confList {
  913. noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
  914. }
  915. }
  916. if keyword != "" {
  917. searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList, startSize, pageSize)
  918. } else {
  919. total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList)
  920. if err != nil && err.Error() != utils.ErrNoRow() {
  921. br.Msg = "获取失败"
  922. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  923. return
  924. }
  925. }
  926. finalList := make([]*data_manage.ChartInfoMore, 0)
  927. if len(searchList) > 0 {
  928. chartInfoIds := ""
  929. chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
  930. for _, v := range searchList {
  931. chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
  932. }
  933. if chartInfoIds != "" {
  934. chartInfoIds = strings.Trim(chartInfoIds, ",")
  935. //判断是否需要展示英文标识
  936. edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
  937. if e != nil {
  938. br.Msg = "获取失败"
  939. br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
  940. return
  941. }
  942. for _, v := range edbList {
  943. chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
  944. }
  945. }
  946. for _, v := range searchList {
  947. tmp := new(data_manage.ChartInfoMore)
  948. tmp.ChartInfo = *v
  949. //判断是否需要展示英文标识
  950. if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
  951. tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
  952. }
  953. finalList = append(finalList, tmp)
  954. }
  955. }
  956. //新增搜索词记录
  957. {
  958. searchKeyword := new(data_manage.SearchKeyword)
  959. searchKeyword.KeyWord = keyword
  960. searchKeyword.CreateTime = time.Now()
  961. go data_manage.AddSearchKeyword(searchKeyword)
  962. }
  963. page := paging.GetPaging(currentIndex, pageSize, int(total))
  964. resp := data_manage.ChartInfoListByEsResp{
  965. Paging: page,
  966. List: finalList,
  967. }
  968. br.Ret = 200
  969. br.Success = true
  970. br.Msg = "获取成功"
  971. br.Data = resp
  972. }
  973. // BatchChartInfoRefresh
  974. // @Title 批量刷新图表接口
  975. // @Description 批量刷新图表接口
  976. // @Param request body data_manage.BatchChartRefreshReq true "type json string"
  977. // @Success Ret=200 刷新成功
  978. // @router /chart_info/batch_refresh [post]
  979. func (this *ChartInfoController) BatchChartInfoRefresh() {
  980. br := new(models.BaseResponse).Init()
  981. defer func() {
  982. this.Data["json"] = br
  983. this.ServeJSON()
  984. }()
  985. sysUser := this.SysUser
  986. if sysUser == nil {
  987. br.Msg = "请登录"
  988. br.ErrMsg = "请登录,SysUser Is Empty"
  989. br.Ret = 408
  990. return
  991. }
  992. var req data_manage.BatchChartRefreshReq
  993. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  994. if err != nil {
  995. br.Msg = "参数解析异常!"
  996. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  997. return
  998. }
  999. //获取所有的图表列表
  1000. _, chartInfoList, err := data_manage.GetChartInfoListByUniqueCodeSlice(req.ChartInfoCode)
  1001. if len(chartInfoList) <= 0 {
  1002. br.Ret = 200
  1003. br.Success = true
  1004. br.Msg = "刷新成功"
  1005. return
  1006. }
  1007. err = data.BatchChartInfoRefreshV2(chartInfoList)
  1008. if err != nil {
  1009. br.Msg = "刷新失败"
  1010. br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
  1011. return
  1012. }
  1013. //清除图表缓存
  1014. for _, v := range chartInfoList {
  1015. key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
  1016. _ = utils.Rc.Delete(key)
  1017. }
  1018. br.Ret = 200
  1019. br.Success = true
  1020. br.Msg = "刷新成功"
  1021. }