chart_info.go 26 KB

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