chart_info.go 27 KB

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