classify.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. package cross_variety
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/controllers"
  5. "eta_gn/eta_api/models"
  6. "eta_gn/eta_api/models/data_manage"
  7. "eta_gn/eta_api/services/data"
  8. "eta_gn/eta_api/utils"
  9. "time"
  10. )
  11. type ClassifyController struct {
  12. controllers.BaseAuthController
  13. }
  14. // @router /classify/list [get]
  15. func (c *ClassifyController) List() {
  16. br := new(models.BaseResponse).Init()
  17. defer func() {
  18. c.Data["json"] = br
  19. c.ServeJSON()
  20. }()
  21. resp := new(data_manage.ChartClassifyListResp)
  22. noPermissionChartIdMap := make(map[int]bool)
  23. {
  24. obj := data_manage.EdbInfoNoPermissionAdmin{}
  25. confList, err := obj.GetAllChartListByAdminId(c.SysUser.AdminId)
  26. if err != nil && !utils.IsErrNoRow(err) {
  27. br.Msg = "获取失败"
  28. br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
  29. return
  30. }
  31. for _, v := range confList {
  32. noPermissionChartIdMap[v.ChartInfoId] = true
  33. }
  34. }
  35. isShowMe, _ := c.GetBool("IsShowMe")
  36. source, _ := c.GetInt("Source")
  37. if source <= 0 {
  38. source = utils.CHART_SOURCE_CROSS_HEDGING
  39. }
  40. rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_CROSS_HEDGING)
  41. if err != nil && !utils.IsErrNoRow(err) {
  42. br.Msg = "获取失败"
  43. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  44. return
  45. }
  46. allChartInfo, err := data_manage.GetChartInfoAll([]int{source})
  47. if err != nil && !utils.IsErrNoRow(err) {
  48. br.Msg = "获取失败"
  49. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  50. return
  51. }
  52. chartInfoMap := make(map[int][]*data_manage.ChartClassifyItems)
  53. for _, v := range allChartInfo {
  54. if !isShowMe {
  55. chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
  56. continue
  57. }
  58. if v.SysUserId != c.SysUser.AdminId {
  59. continue
  60. }
  61. chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
  62. }
  63. rootChildMap := make(map[int][]*data_manage.ChartClassifyItems)
  64. allNodes := make([]*data_manage.ChartClassifyItems, 0)
  65. for _, v := range rootList {
  66. if v.SysUserId == c.SysUser.AdminId || c.SysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  67. v.Button.OpButton = true
  68. }
  69. rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
  70. if existItems, ok := chartInfoMap[v.ChartClassifyId]; ok {
  71. v.Children = existItems
  72. allNodes = append(allNodes, v)
  73. }
  74. }
  75. allNodes = data.HandleNoPermissionChart(allNodes, noPermissionChartIdMap, c.SysUser.AdminId)
  76. resp.AllNodes = allNodes
  77. br.Ret = 200
  78. br.Success = true
  79. br.Msg = "获取成功"
  80. br.Data = resp
  81. }
  82. // @router /classify/edit [post]
  83. func (c *ClassifyController) EditChartClassify() {
  84. br := new(models.BaseResponse).Init()
  85. defer func() {
  86. c.Data["json"] = br
  87. c.ServeJSON()
  88. }()
  89. var req data_manage.EditChartClassifyReq
  90. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  91. if err != nil {
  92. br.Msg = "参数解析异常!"
  93. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  94. return
  95. }
  96. if req.ChartClassifyName == "" {
  97. br.Msg = "请输入分类名称"
  98. br.IsSendEmail = false
  99. return
  100. }
  101. if req.ChartClassifyId <= 0 {
  102. br.Msg = "参数错误"
  103. br.IsSendEmail = false
  104. return
  105. }
  106. _, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_CROSS_HEDGING, req.ChartClassifyName, c.Lang, c.SysUser)
  107. if err != nil {
  108. br.Msg = errMsg
  109. br.ErrMsg = "保存分类失败,Err:" + err.Error()
  110. br.IsSendEmail = isSendEmail
  111. return
  112. }
  113. br.Ret = 200
  114. br.Msg = "修改成功"
  115. br.Success = true
  116. br.IsAddLog = true
  117. }
  118. // @router /classify/delete/check [post]
  119. func (c *ClassifyController) DeleteChartClassifyCheck() {
  120. br := new(models.BaseResponse).Init()
  121. defer func() {
  122. c.Data["json"] = br
  123. c.ServeJSON()
  124. }()
  125. var req data_manage.ChartClassifyDeleteCheckReq
  126. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  127. if err != nil {
  128. br.Msg = "参数解析异常!"
  129. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  130. return
  131. }
  132. if req.ChartClassifyId < 0 && req.ChartInfoId <= 0 {
  133. br.Msg = "参数错误"
  134. br.IsSendEmail = false
  135. return
  136. }
  137. var deleteStatus int
  138. var tipsMsg string
  139. childIds := make([]int, 0)
  140. if req.ChartClassifyId > 0 && req.ChartInfoId == 0 {
  141. classifyAll, err := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_CROSS_HEDGING)
  142. if err != nil {
  143. br.Msg = "删除失败"
  144. br.ErrMsg = "获取分类数据失败,Err:" + err.Error()
  145. return
  146. }
  147. classifyAllMap := make(map[int]*data_manage.ChartClassifyItems)
  148. for _, v := range classifyAll {
  149. classifyAllMap[v.ChartClassifyId] = v
  150. }
  151. data.GetChartClassifyChildIds(req.ChartClassifyId, classifyAllMap, &childIds)
  152. condition := ``
  153. pars := make([]interface{}, 0)
  154. if len(childIds) > 0 {
  155. ids := utils.IntArr2joinString(childIds, ",")
  156. condition = ` AND chart_classify_id IN (` + ids + `) `
  157. } else {
  158. condition = ` AND chart_classify_id = ? `
  159. pars = append(pars, req.ChartClassifyId)
  160. }
  161. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  162. if err != nil {
  163. br.Msg = "判断图表名称是否存在失败"
  164. br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error()
  165. return
  166. }
  167. if count > 0 {
  168. deleteStatus = 1
  169. tipsMsg = "该分类下关联图表不可删除"
  170. }
  171. }
  172. if deleteStatus != 1 && req.ChartInfoId == 0 {
  173. if len(childIds) > 0 {
  174. deleteStatus = 2
  175. tipsMsg = "确认删除当前目录及包含的子目录吗"
  176. }
  177. }
  178. if deleteStatus == 0 {
  179. tipsMsg = "可删除,进行删除操作"
  180. }
  181. resp := new(data_manage.ChartClassifyDeleteCheckResp)
  182. resp.DeleteStatus = deleteStatus
  183. resp.TipsMsg = tipsMsg
  184. br.Ret = 200
  185. br.Msg = "检测成功"
  186. br.Success = true
  187. br.Data = resp
  188. }
  189. // @router /classify/delete [post]
  190. func (c *ClassifyController) DeleteChartClassify() {
  191. br := new(models.BaseResponse).Init()
  192. defer func() {
  193. c.Data["json"] = br
  194. c.ServeJSON()
  195. }()
  196. sysUser := c.SysUser
  197. if sysUser == nil {
  198. br.Msg = "请登录"
  199. br.ErrMsg = "请登录,SysUser Is Empty"
  200. br.Ret = 408
  201. return
  202. }
  203. var req data_manage.DeleteChartClassifyReq
  204. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  205. if err != nil {
  206. br.Msg = "参数解析异常!"
  207. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  208. return
  209. }
  210. if req.ChartClassifyId < 0 && req.ChartInfoId <= 0 {
  211. br.Msg = "参数错误"
  212. br.IsSendEmail = false
  213. return
  214. }
  215. if req.ChartClassifyId > 0 && req.ChartInfoId == 0 {
  216. childIds := make([]int, 0)
  217. classifyAll, err := data_manage.GetChartClassifyAllBySource(utils.CHART_SOURCE_CROSS_HEDGING)
  218. if err != nil {
  219. br.Msg = "删除失败"
  220. br.ErrMsg = "获取分类数据失败,Err:" + err.Error()
  221. return
  222. }
  223. classifyAllMap := make(map[int]*data_manage.ChartClassifyItems)
  224. for _, v := range classifyAll {
  225. classifyAllMap[v.ChartClassifyId] = v
  226. }
  227. data.GetChartClassifyChildIds(req.ChartClassifyId, classifyAllMap, &childIds)
  228. condition := ``
  229. pars := make([]interface{}, 0)
  230. if len(childIds) > 0 {
  231. ids := utils.IntArr2joinString(childIds, ",")
  232. condition = ` AND chart_classify_id IN (` + ids + `) `
  233. } else {
  234. condition = ` AND chart_classify_id = ? `
  235. pars = append(pars, req.ChartClassifyId)
  236. }
  237. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  238. if err != nil {
  239. br.Msg = "判断图表名称是否存在失败"
  240. br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error()
  241. return
  242. }
  243. if count > 0 {
  244. br.Msg = "该目录下存在关联指标,不可删除"
  245. br.IsSendEmail = false
  246. return
  247. }
  248. delIds := append(childIds, req.ChartClassifyId)
  249. err = data_manage.DeleteChartClassifyByIds(delIds)
  250. if err != nil {
  251. br.Msg = "删除失败"
  252. br.ErrMsg = "删除失败,Err:" + err.Error()
  253. return
  254. }
  255. }
  256. resp := new(data_manage.AddChartInfoResp)
  257. if req.ChartInfoId > 0 {
  258. chartInfo, err := data_manage.GetChartInfoById(req.ChartInfoId)
  259. if err != nil {
  260. if utils.IsErrNoRow(err) {
  261. br.Msg = "图表已删除,请刷新页面"
  262. br.ErrMsg = "指标不存在,Err:" + err.Error()
  263. return
  264. } else {
  265. br.Msg = "删除失败"
  266. br.ErrMsg = "删除失败,获取指标信息失败,Err:" + err.Error()
  267. return
  268. }
  269. }
  270. if chartInfo == nil {
  271. br.Msg = "图表已删除,请刷新页面"
  272. return
  273. }
  274. ok := data.CheckOpChartPermission(sysUser, chartInfo.SysUserId, true)
  275. if !ok {
  276. br.Msg = "没有该图表的操作权限"
  277. br.ErrMsg = "没有该图表的操作权限"
  278. return
  279. }
  280. var myCond string
  281. var myPars []interface{}
  282. myCond += ` AND a.chart_info_id = ? `
  283. myPars = append(myPars, chartInfo.ChartInfoId)
  284. myCharts, e := data_manage.GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(myCond, myPars)
  285. if e != nil {
  286. br.Msg = "删除失败"
  287. br.ErrMsg = "获取引用图表的MyChats失败, Err: " + e.Error()
  288. return
  289. }
  290. myIds := make([]int, 0)
  291. for _, m := range myCharts {
  292. myIds = append(myIds, m.MyChartId)
  293. }
  294. source := chartInfo.Source // 跨品种分析图表(滚动跨品种分析)
  295. err = data_manage.DeleteChartInfoAndData(chartInfo.ChartInfoId)
  296. if err != nil {
  297. br.Msg = "删除失败"
  298. br.ErrMsg = "删除失败,Err:" + err.Error()
  299. return
  300. }
  301. {
  302. go data.EsDeleteChartInfo(chartInfo.ChartInfoId)
  303. go data.EsDeleteMyChartInfoByMyChartIds(myIds)
  304. }
  305. var condition string
  306. var pars []interface{}
  307. condition += " AND chart_classify_id=? AND source = ? "
  308. pars = append(pars, chartInfo.ChartClassifyId, source)
  309. condition += " AND chart_info_id>? ORDER BY create_time ASC LIMIT 1 "
  310. pars = append(pars, req.ChartInfoId)
  311. nextItem, err := data_manage.GetChartInfoByCondition(condition, pars)
  312. if err != nil && !utils.IsErrNoRow(err) {
  313. br.Msg = "删除失败"
  314. br.ErrMsg = "获取下一级图库信息失败,Err:" + err.Error()
  315. return
  316. }
  317. if nextItem != nil {
  318. resp.UniqueCode = nextItem.UniqueCode
  319. resp.ChartInfoId = nextItem.ChartInfoId
  320. } else {
  321. var condition string
  322. var pars []interface{}
  323. condition += " AND level=1 "
  324. condition += " AND chart_classify_id>? ORDER BY chart_classify_id ASC LIMIT 1 "
  325. pars = append(pars, chartInfo.ChartClassifyId)
  326. classifyItem, err := data_manage.GetChartClassifyByCondition(condition, pars)
  327. if err != nil && !utils.IsErrNoRow(err) {
  328. br.Msg = "删除失败"
  329. br.ErrMsg = "获取下一级图库分类信息失败,Err:" + err.Error()
  330. return
  331. }
  332. if classifyItem != nil {
  333. nextItem, err = data_manage.GetNextChartInfo(chartInfo.ChartClassifyId)
  334. if err != nil && !utils.IsErrNoRow(err) {
  335. br.Msg = "删除失败"
  336. br.ErrMsg = "获取下一级图库信息失败,Err:" + err.Error()
  337. return
  338. }
  339. if nextItem != nil {
  340. resp.UniqueCode = nextItem.UniqueCode
  341. resp.ChartInfoId = nextItem.ChartInfoId
  342. }
  343. }
  344. }
  345. {
  346. chartLog := new(data_manage.ChartInfoLog)
  347. chartLog.ChartName = chartInfo.ChartName
  348. chartLog.ChartInfoId = req.ChartInfoId
  349. chartLog.ChartClassifyId = chartInfo.ChartClassifyId
  350. chartLog.SysUserId = sysUser.AdminId
  351. chartLog.SysUserRealName = sysUser.RealName
  352. chartLog.UniqueCode = chartInfo.UniqueCode
  353. chartLog.CreateTime = time.Now()
  354. chartLog.Content = string(c.Ctx.Input.RequestBody)
  355. chartLog.Status = "删除图表"
  356. chartLog.Method = c.Ctx.Input.URI()
  357. go data_manage.AddChartInfoLog(chartLog)
  358. }
  359. }
  360. br.Ret = 200
  361. br.Msg = "删除成功"
  362. br.Success = true
  363. br.Data = resp
  364. br.IsAddLog = true
  365. }
  366. // @router /classify/move [post]
  367. func (c *ClassifyController) ChartClassifyMove() {
  368. br := new(models.BaseResponse).Init()
  369. defer func() {
  370. c.Data["json"] = br
  371. c.ServeJSON()
  372. }()
  373. sysUser := c.SysUser
  374. if sysUser == nil {
  375. br.Msg = "请登录"
  376. br.ErrMsg = "请登录,SysUser Is Empty"
  377. br.Ret = 408
  378. return
  379. }
  380. var req data_manage.MoveChartClassifyReq
  381. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  382. if err != nil {
  383. br.Msg = "参数解析异常!"
  384. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  385. return
  386. }
  387. if req.ClassifyId <= 0 {
  388. br.Msg = "参数错误"
  389. br.ErrMsg = "分类id小于等于0"
  390. return
  391. }
  392. chartClassifyInfo, err := data_manage.GetChartClassifyById(req.ClassifyId)
  393. if err != nil {
  394. br.Msg = "移动失败"
  395. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  396. return
  397. }
  398. if chartClassifyInfo.Source != utils.CHART_SOURCE_CROSS_HEDGING {
  399. br.Msg = "分类异常"
  400. br.ErrMsg = "分类异常,不是跨品种分析图表的分类"
  401. return
  402. }
  403. updateCol := make([]string, 0)
  404. if req.PrevClassifyId > 0 {
  405. prevClassify, err := data_manage.GetChartClassifyById(req.PrevClassifyId)
  406. if err != nil {
  407. br.Msg = "移动失败"
  408. br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
  409. return
  410. }
  411. if prevClassify.Source != utils.CHART_SOURCE_CROSS_HEDGING {
  412. br.Msg = "上级节点分类异常"
  413. br.ErrMsg = "上级节点分类异常,不是跨品种分析图表的分类"
  414. return
  415. }
  416. if req.NextClassifyId > 0 {
  417. nextClassify, err := data_manage.GetChartClassifyById(req.NextClassifyId)
  418. if err != nil {
  419. br.Msg = "移动失败"
  420. br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
  421. return
  422. }
  423. if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == chartClassifyInfo.Sort {
  424. updateSortStr := `sort + 2`
  425. _ = data_manage.UpdateChartClassifySortByParentId(prevClassify.ParentId, prevClassify.ChartClassifyId, prevClassify.Sort, updateSortStr)
  426. } else {
  427. if nextClassify.Sort-prevClassify.Sort == 1 {
  428. updateSortStr := `sort + 1`
  429. _ = data_manage.UpdateChartClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr)
  430. }
  431. }
  432. }
  433. chartClassifyInfo.Sort = prevClassify.Sort + 1
  434. chartClassifyInfo.ModifyTime = time.Now()
  435. updateCol = append(updateCol, "Sort", "ModifyTime")
  436. } else {
  437. firstClassify, err := data_manage.GetFirstChartClassifyByParentIdAndSource(chartClassifyInfo.ParentId, chartClassifyInfo.Source)
  438. if err != nil && !utils.IsErrNoRow(err) {
  439. br.Msg = "移动失败"
  440. br.ErrMsg = "获取跨品种分析图表分类排序第一条的分类信息失败,Err:" + err.Error()
  441. return
  442. }
  443. if firstClassify != nil && firstClassify.Source != utils.CHART_SOURCE_CROSS_HEDGING {
  444. br.Msg = "上级节点分类异常"
  445. br.ErrMsg = "上级节点分类异常,不是跨品种分析图表的分类"
  446. return
  447. }
  448. if firstClassify != nil && firstClassify.ChartClassifyId > 0 && firstClassify.Sort == 0 {
  449. updateSortStr := ` sort + 1 `
  450. _ = data_manage.UpdateChartClassifySortByParentId(firstClassify.ParentId, firstClassify.ChartClassifyId-1, 0, updateSortStr)
  451. }
  452. chartClassifyInfo.Sort = 0 //那就是排在第一位
  453. chartClassifyInfo.ModifyTime = time.Now()
  454. updateCol = append(updateCol, "Sort", "ModifyTime")
  455. }
  456. if len(updateCol) > 0 {
  457. err = chartClassifyInfo.Update(updateCol)
  458. if err != nil {
  459. br.Msg = "移动失败"
  460. br.ErrMsg = "修改失败,Err:" + err.Error()
  461. return
  462. }
  463. }
  464. br.Ret = 200
  465. br.Success = true
  466. br.Msg = "移动成功"
  467. }