chart_info.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_forum_admin/models"
  5. "eta/eta_forum_admin/services"
  6. "eta/eta_forum_admin/utils"
  7. "github.com/rdlucklib/rdluck_tools/paging"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. type ChartInfoController struct {
  13. BaseAuthController
  14. }
  15. // ChartInfoDetail
  16. // @Title 获取图表详情
  17. // @Description 获取图表详情接口
  18. // @Param ChartInfoId query int true "图表id"
  19. // @Param DateType query int true "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"
  20. // @Param StartDate query string true "自定义开始日期"
  21. // @Param EndDate query string true "自定义结束日期"
  22. // @Param Calendar query string true "公历/农历"
  23. // @Param SeasonStartDate query string true "季节性图开始日期"
  24. // @Param SeasonEndDate query string true "季节性图结束日期"
  25. // @Param EdbInfoId query string true "指标ID,多个用英文逗号隔开"
  26. // @Param ChartType query int true "生成样式:1:曲线图,2:季节性图"
  27. // @Success 200 {object} models.ChartInfoDetailResp
  28. // @router /detail [get]
  29. func (this *ChartInfoController) ChartInfoDetail() {
  30. br := new(models.BaseResponse).Init()
  31. defer func() {
  32. this.Data["json"] = br
  33. this.ServeJSON()
  34. }()
  35. sysUser := this.SysUser
  36. if sysUser == nil {
  37. br.Msg = "请登录"
  38. br.ErrMsg = "请登录,SysUser Is Empty"
  39. br.Ret = 408
  40. return
  41. }
  42. chartInfoId, _ := this.GetInt("ChartInfoId")
  43. edbInfoId := this.GetString("EdbInfoId")
  44. var err error
  45. chartInfo := new(models.ChartInfoView)
  46. chartInfo.HaveOperaAuth = true
  47. if chartInfoId <= 0 {
  48. br.Msg = "请选择图表"
  49. return
  50. }
  51. chartInfo, err = models.GetChartInfoViewById(chartInfoId)
  52. if err != nil {
  53. if err.Error() == utils.ErrNoRow() {
  54. br.Msg = "该图表已删除,自动查看下一图表"
  55. br.ErrMsg = "该图表已删除,自动查看下一图表,Err:" + err.Error()
  56. br.Ret = 406
  57. return
  58. }
  59. br.Msg = "获取失败"
  60. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  61. return
  62. }
  63. chartType := chartInfo.ChartType
  64. startDate := chartInfo.StartDate
  65. endDate := chartInfo.EndDate
  66. seasonStartDate := chartInfo.SeasonStartDate
  67. seasonEndDate := chartInfo.SeasonEndDate
  68. startYear := chartInfo.StartYear
  69. calendar := chartInfo.Calendar
  70. if calendar == "" {
  71. calendar = "公历"
  72. }
  73. dateType := chartInfo.DateType
  74. // 获取主题样式
  75. chartTheme, err := services.GetChartThemeConfig(chartInfo.ChartThemeId, chartInfo.Source, chartInfo.ChartType)
  76. if err != nil {
  77. br.Msg = "获取失败"
  78. br.ErrMsg = "获取主题信息失败,Err:" + err.Error()
  79. return
  80. }
  81. chartInfo.ChartThemeStyle = chartTheme.Config
  82. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  83. resp := new(models.ChartInfoDetailResp)
  84. mappingList := make([]*models.ChartEdbInfoMapping, 0)
  85. if chartInfoId > 0 {
  86. mappingList, err = models.GetChartEdbMappingList(chartInfoId)
  87. if err != nil {
  88. br.Msg = "获取失败"
  89. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  90. return
  91. }
  92. } else {
  93. if edbInfoId != "" {
  94. edbInfoIds := strings.Split(edbInfoId, ",")
  95. mappingList, err = models.GetChartEdbMappingListByEdbInfoId(edbInfoIds)
  96. if err != nil {
  97. br.Msg = "获取失败"
  98. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  99. return
  100. }
  101. }
  102. }
  103. // 图表额外数据参数
  104. extraConfigStr := chartInfo.ExtraConfig
  105. // 柱方图的一些配置
  106. var barConfig models.BarChartInfoReq
  107. if chartInfo != nil && chartInfo.ChartType == 7 {
  108. if chartInfo.BarConfig == `` {
  109. br.Msg = "柱方图未配置"
  110. br.ErrMsg = "柱方图未配置"
  111. return
  112. }
  113. err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  114. if err != nil {
  115. br.Msg = "柱方图配置异常"
  116. br.ErrMsg = "柱方图配置异常"
  117. return
  118. }
  119. extraConfigStr = chartInfo.BarConfig
  120. }
  121. if chartType == 2 {
  122. startDate = seasonStartDate
  123. endDate = seasonEndDate
  124. if dateType <= 0 {
  125. if startDate != "" {
  126. dateType = 5
  127. } else {
  128. dateType = utils.DateTypeNYears
  129. }
  130. }
  131. } else {
  132. if dateType <= 0 {
  133. dateType = 3
  134. }
  135. }
  136. yearMax := 0
  137. if dateType == utils.DateTypeNYears {
  138. for _, v := range mappingList {
  139. if v.LatestDate != "" {
  140. lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
  141. if tErr != nil {
  142. br.Msg = "获取失败"
  143. br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
  144. return
  145. }
  146. if lastDateT.Year() > yearMax {
  147. yearMax = lastDateT.Year()
  148. }
  149. }
  150. }
  151. }
  152. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  153. if chartInfo.ChartType == 2 {
  154. chartInfo.StartDate = startDate
  155. chartInfo.EndDate = endDate
  156. }
  157. // 获取图表中的指标数据
  158. edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := services.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
  159. if err != nil {
  160. br.Msg = "获取失败"
  161. if errMsg != `` {
  162. br.Msg = errMsg
  163. }
  164. br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
  165. return
  166. }
  167. // 单位
  168. if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
  169. chartInfo.Unit = yDataList[0].Unit
  170. chartInfo.UnitEn = yDataList[0].UnitEn
  171. }
  172. warnEdbList := make([]string, 0)
  173. for _, v := range edbList {
  174. if v.IsNullData {
  175. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  176. }
  177. }
  178. if len(warnEdbList) > 0 {
  179. chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
  180. }
  181. if chartInfoId > 0 && chartInfo != nil {
  182. if chartInfo.ChartType == 2 {
  183. if chartInfo.SeasonStartDate != "" {
  184. chartInfo.StartDate = chartInfo.SeasonStartDate
  185. chartInfo.EndDate = chartInfo.SeasonEndDate
  186. if chartInfo.DateType == 3 {
  187. chartInfo.DateType = 5
  188. }
  189. }
  190. }
  191. }
  192. // 图表的指标来源
  193. sourceNameList, sourceNameEnList := services.GetEdbSourceByEdbInfoIdList(edbList)
  194. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  195. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  196. //判断是否需要展示英文标识
  197. chartInfo.IsEnChart = services.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
  198. resp.EdbInfoList = edbList
  199. resp.XEdbIdValue = xEdbIdValue
  200. resp.YDataList = yDataList
  201. resp.DataResp = dataResp
  202. chartInfo.Button = models.ChartViewButton{
  203. IsEdit: chartInfo.IsEdit,
  204. IsEnChart: chartInfo.IsEnChart,
  205. IsAdd: chartInfo.IsAdd,
  206. IsCopy: true,
  207. IsSetName: chartInfo.IsSetName,
  208. }
  209. resp.ChartInfo = chartInfo
  210. resp.BarChartInfo = barConfig
  211. br.Ret = 200
  212. br.Success = true
  213. br.Msg = "获取成功"
  214. br.Data = resp
  215. }
  216. // ChartInfoSearchByEs
  217. // @Title 图表模糊搜索(从es获取)
  218. // @Description 图表模糊搜索(从es获取)
  219. // @Param Keyword query string true "图表名称"
  220. // @Param IsShowMe query bool true "是否只看我的,true、false"
  221. // @Success 200 {object} models.ChartInfo
  222. // @router /search_by_es [get]
  223. func (this *ChartInfoController) ChartInfoSearchByEs() {
  224. br := new(models.BaseResponse).Init()
  225. defer func() {
  226. this.Data["json"] = br
  227. this.ServeJSON()
  228. }()
  229. sysUser := this.SysUser
  230. if sysUser == nil {
  231. br.Msg = "请登录"
  232. br.ErrMsg = "请登录,SysUser Is Empty"
  233. br.Ret = 408
  234. return
  235. }
  236. pageSize, _ := this.GetInt("PageSize")
  237. currentIndex, _ := this.GetInt("CurrentIndex")
  238. var startSize int
  239. if pageSize <= 0 {
  240. pageSize = utils.PageSize20
  241. }
  242. if currentIndex <= 0 {
  243. currentIndex = 1
  244. }
  245. startSize = paging.StartIndex(currentIndex, pageSize)
  246. keyword := this.GetString("Keyword")
  247. //只看我的
  248. sysUserIds := this.GetString("SysUserIds")
  249. adminIdsSlice := make([]int, 0)
  250. if sysUserIds != "" {
  251. adminIds := strings.Split(sysUserIds, ",")
  252. if len(adminIds) == 0 {
  253. br.Msg = "请选择正确的创建人"
  254. return
  255. }
  256. for _, adminId := range adminIds {
  257. adminIdInt, e := strconv.Atoi(adminId)
  258. if e != nil {
  259. br.Msg = "请选择正确的创建人"
  260. return
  261. }
  262. adminIdsSlice = append(adminIdsSlice, adminIdInt)
  263. }
  264. }
  265. var searchList []*models.ChartInfo
  266. var total int64
  267. var err error
  268. if keyword != "" {
  269. searchList, total, err = services.EsSearchChartInfo(keyword, adminIdsSlice, []int{utils.CHART_SOURCE_DEFAULT}, startSize, pageSize)
  270. } else {
  271. total, searchList, err = models.ChartInfoSearchByEmptyKeyWord(adminIdsSlice, []int{utils.CHART_SOURCE_DEFAULT}, startSize, pageSize)
  272. if err != nil && err.Error() != utils.ErrNoRow() {
  273. br.Msg = "获取失败"
  274. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  275. return
  276. }
  277. }
  278. finalList := make([]*models.ChartInfoMore, 0)
  279. if len(searchList) > 0 {
  280. // 涉及分类id
  281. classifyIdList := make([]int, 0)
  282. // 图表id
  283. chartInfoIdList := make([]int, 0)
  284. chartInfoIds := ""
  285. chartEdbMap := make(map[int][]*models.ChartEdbInfoMapping)
  286. for _, v := range searchList {
  287. chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
  288. classifyIdList = append(classifyIdList, v.ChartClassifyId)
  289. chartInfoIdList = append(chartInfoIdList, v.ChartInfoId)
  290. }
  291. if chartInfoIds != "" {
  292. chartInfoIds = strings.Trim(chartInfoIds, ",")
  293. //判断是否需要展示英文标识
  294. edbList, e := models.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
  295. if e != nil {
  296. br.Msg = "获取失败"
  297. br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
  298. return
  299. }
  300. for _, v := range edbList {
  301. chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
  302. }
  303. }
  304. // 当前列表中的分类map
  305. chartClassifyMap := make(map[int]*models.ChartClassify)
  306. // 图表分类
  307. {
  308. chartClassifyList, err := models.GetChartClassifyByIdList(classifyIdList)
  309. if err != nil {
  310. br.Msg = "获取失败"
  311. br.ErrMsg = "获取图表分类失败,Err:" + err.Error()
  312. return
  313. }
  314. for _, v := range chartClassifyList {
  315. chartClassifyMap[v.ChartClassifyId] = v
  316. }
  317. }
  318. for _, v := range searchList {
  319. tmp := new(models.ChartInfoMore)
  320. tmp.ChartInfo = *v
  321. //判断是否需要展示英文标识
  322. if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
  323. tmp.IsEnChart = services.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
  324. }
  325. // 图表权限
  326. finalList = append(finalList, tmp)
  327. }
  328. }
  329. //新增搜索词记录
  330. {
  331. searchKeyword := new(models.SearchKeyword)
  332. searchKeyword.KeyWord = keyword
  333. searchKeyword.CreateTime = time.Now()
  334. go models.AddSearchKeyword(searchKeyword)
  335. }
  336. page := paging.GetPaging(currentIndex, pageSize, int(total))
  337. resp := models.ChartInfoListByEsResp{
  338. Paging: page,
  339. List: finalList,
  340. }
  341. br.Ret = 200
  342. br.Success = true
  343. br.Msg = "获取成功"
  344. br.Data = resp
  345. }
  346. // ChartList
  347. // @Title 根据分类创建人姓名等获取图表列表
  348. // @Description 根据分类创建人姓名等获取图表列表
  349. // @Param SysUserIds query string true "根据创建人查询"
  350. // @Param ChartClassifyIds query string true "图片分类id"
  351. // @Success 200 {object} models.ChartClassifyListResp
  352. // @router /list [get]
  353. func (this *ChartInfoController) ChartList() {
  354. br := new(models.BaseResponse).Init()
  355. defer func() {
  356. this.Data["json"] = br
  357. this.ServeJSON()
  358. }()
  359. sysUser := this.SysUser
  360. if sysUser == nil {
  361. br.Msg = "请登录"
  362. br.ErrMsg = "请登录,SysUser Is Empty"
  363. br.Ret = 408
  364. return
  365. }
  366. resp := new(models.ChartClassifyListResp)
  367. pageSize, _ := this.GetInt("PageSize")
  368. currentIndex, _ := this.GetInt("CurrentIndex")
  369. chartClassifyIds := this.GetString("ChartClassifyIds")
  370. sysUserIds := this.GetString("SysUserIds")
  371. chartName := this.GetString("ChartName")
  372. var startSize int
  373. if pageSize <= 0 {
  374. pageSize = utils.PageSize20
  375. }
  376. if currentIndex <= 0 {
  377. currentIndex = 1
  378. }
  379. startSize = utils.StartIndex(currentIndex, pageSize)
  380. condition := ""
  381. pars := make([]interface{}, 0)
  382. if chartClassifyIds != "" {
  383. classifyIds := strings.Split(chartClassifyIds, ",")
  384. if len(classifyIds) == 0 {
  385. br.Msg = "请选择正确的分类"
  386. return
  387. }
  388. classifyIdSlice := make([]int, 0)
  389. for _, id := range classifyIds {
  390. tmp, e := strconv.Atoi(id)
  391. if e != nil {
  392. br.Msg = "请选择正确的分类"
  393. return
  394. }
  395. classifyIdSlice = append(classifyIdSlice, tmp)
  396. }
  397. condition += " AND chart_classify_id in (" + utils.GetOrmInReplace(len(classifyIdSlice)) + ") "
  398. pars = append(pars, classifyIdSlice)
  399. }
  400. if sysUserIds != "" {
  401. adminIds := strings.Split(sysUserIds, ",")
  402. if len(adminIds) == 0 {
  403. br.Msg = "请选择正确的创建人"
  404. return
  405. }
  406. adminIdsSlice := make([]int, 0)
  407. for _, adminId := range adminIds {
  408. adminIdInt, e := strconv.Atoi(adminId)
  409. if e != nil {
  410. br.Msg = "请选择正确的创建人"
  411. return
  412. }
  413. adminIdsSlice = append(adminIdsSlice, adminIdInt)
  414. }
  415. condition += " AND sys_user_id in (" + utils.GetOrmInReplace(len(adminIds)) + ") "
  416. pars = append(pars, adminIdsSlice)
  417. }
  418. if chartName != "" {
  419. condition += " AND chart_name LIKE ? "
  420. pars = append(pars, utils.GetLikeKeyword(chartName))
  421. }
  422. allChartInfo, err := models.GetChartInfoByConditionPage(utils.CHART_SOURCE_DEFAULT, condition, pars, startSize, pageSize)
  423. if err != nil && err.Error() != utils.ErrNoRow() {
  424. br.Msg = "获取失败"
  425. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  426. return
  427. }
  428. total, err := models.GetChartInfoTotalByCondition(utils.CHART_SOURCE_DEFAULT, condition, pars)
  429. if err != nil {
  430. br.Msg = "获取失败"
  431. br.ErrMsg = "获取图表总数失败,Err:" + err.Error()
  432. return
  433. }
  434. if len(allChartInfo) > 0 {
  435. adminIds := make([]int, 0)
  436. for _, v := range allChartInfo {
  437. adminIds = append(adminIds, v.SysUserId)
  438. }
  439. adminCompanyMap, er := services.GetCompanyNameByAdmins(adminIds)
  440. if er != nil {
  441. br.Msg = "获取失败"
  442. br.ErrMsg = "获取机构失败,Err:" + er.Error()
  443. return
  444. }
  445. for k, v := range allChartInfo {
  446. v.Children = make([]*models.ChartClassifyItems, 0)
  447. if n, ok := adminCompanyMap[v.SysUserId]; ok {
  448. allChartInfo[k].Company = n
  449. }
  450. }
  451. }
  452. page := paging.GetPaging(currentIndex, pageSize, int(total))
  453. resp.AllNodes = allChartInfo
  454. resp.Paging = page
  455. br.Ret = 200
  456. br.Success = true
  457. br.Msg = "获取成功"
  458. br.Data = resp
  459. }