classify.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/report_approve"
  6. "eta/eta_api/models/system"
  7. "eta/eta_api/services"
  8. "eta/eta_api/utils"
  9. "fmt"
  10. "github.com/rdlucklib/rdluck_tools/paging"
  11. "time"
  12. )
  13. // 分类
  14. type ClassifyController struct {
  15. BaseAuthController
  16. }
  17. // @Title 新增分类接口
  18. // @Description 新增分类
  19. // @Param request body models.ClassifyAddReq true "type json string"
  20. // @Success 200 新增成功
  21. // @router /add [post]
  22. func (this *ClassifyController) Add() {
  23. br := new(models.BaseResponse).Init()
  24. defer func() {
  25. this.Data["json"] = br
  26. this.ServeJSON()
  27. }()
  28. var req models.ClassifyAddReq
  29. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  30. if err != nil {
  31. br.Msg = "参数解析异常!"
  32. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  33. return
  34. }
  35. // 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
  36. menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
  37. if e != nil {
  38. br.Msg = "保存失败"
  39. br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
  40. return
  41. }
  42. menuMap := make(map[string]bool)
  43. for _, m := range menus {
  44. if m.ButtonCode != "" {
  45. menuMap[m.ButtonCode] = true
  46. }
  47. }
  48. if req.ClassifyName == "" {
  49. br.Msg = "分类名称不可为空"
  50. return
  51. }
  52. if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
  53. br.Msg = "展示类型不可为空"
  54. return
  55. }
  56. if menuMap[system.MenuSpecialHandleClassifyChildMenu] && len(req.MenuList) > 0 && req.ParentId != 0 {
  57. br.Msg = "非一级分类不可添加子目录"
  58. return
  59. }
  60. if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
  61. br.Msg = "报告合集配图不可为空"
  62. return
  63. }
  64. item, err := models.GetClassifyByName(req.ClassifyName, req.ParentId)
  65. if err != nil && err.Error() != utils.ErrNoRow() {
  66. br.Msg = "获取分类信息失败"
  67. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  68. return
  69. }
  70. if item != nil {
  71. br.Msg = "分类名称:" + req.ClassifyName + "已存在"
  72. return
  73. }
  74. nowTime := time.Now().Local()
  75. classify := new(models.Classify)
  76. maxSort, e := classify.GetMaxSort()
  77. if e != nil {
  78. br.Msg = "操作失败"
  79. br.ErrMsg = "查询品种排序失败, Err: " + e.Error()
  80. return
  81. }
  82. classify.ClassifyName = req.ClassifyName
  83. classify.ParentId = req.ParentId
  84. classify.CreateTime = nowTime
  85. classify.ModifyTime = nowTime
  86. classify.Abstract = req.Abstract
  87. classify.Descript = req.Descript
  88. classify.Abstract = req.Abstract
  89. classify.Descript = req.Descript
  90. classify.ReportAuthor = req.ReportAuthor
  91. classify.AuthorDescript = req.AuthorDescript
  92. classify.ColumnImgUrl = req.ColumnImgUrl
  93. classify.ReportImgUrl = req.ReportImgUrl
  94. classify.HeadImgUrl = req.HeadImgUrl
  95. classify.AvatarImgUrl = req.AvatarImgUrl
  96. classify.HomeImgUrl = req.HomeImgUrl
  97. classify.ClassifyLabel = req.ClassifyLabel
  98. classify.ShowType = req.ShowType
  99. classify.HasTeleconference = req.HasTeleconference
  100. classify.VipTitle = req.VipTitle
  101. classify.Sort = maxSort + 1
  102. classify.IsShow = req.IsShow
  103. classify.YbFiccSort = req.YbFiccSort
  104. classify.YbFiccIcon = req.YbFiccIcon
  105. classify.YbFiccPcIcon = req.YbFiccPcIcon
  106. classify.YbIconUrl = req.YbIconUrl
  107. classify.YbBgUrl = req.YbBgUrl
  108. classify.YbListImg = req.YbListImg
  109. classify.YbShareBgImg = req.YbShareBgImg
  110. classify.YbRightBanner = req.YbRightBanner
  111. classify.RelateTel = req.RelateTel
  112. classify.RelateVideo = req.RelateVideo
  113. if req.ParentId > 0 {
  114. parentClassify := new(models.Classify)
  115. if parentClassify, err = models.GetClassifyById(req.ParentId); err != nil {
  116. br.Msg = "获取父级分类信息失败"
  117. br.ErrMsg = "获取父级分类信息失败, Err:" + err.Error()
  118. return
  119. }
  120. updateParent := false
  121. updateCols := make([]string, 0)
  122. updateCols = append(updateCols, "HasTeleconference")
  123. if req.HasTeleconference == 1 {
  124. // 二级分类包含电话会,则一级分类也默认包含电话会
  125. if parentClassify.HasTeleconference == 0 {
  126. parentClassify.HasTeleconference = 1
  127. updateParent = true
  128. }
  129. } else {
  130. // 二级分类均无电话会,则一级分类也无电话会
  131. if parentClassify.HasTeleconference == 1 {
  132. child, err := models.GetClassifyChild(parentClassify.Id, "")
  133. if err != nil {
  134. br.Msg = "获取子分类失败"
  135. br.ErrMsg = "获取子分类失败,Err:" + err.Error()
  136. return
  137. }
  138. // 存在同一级分类下的二级分类有电话会则不变动
  139. hasTel := false
  140. for i := 0; i < len(child); i++ {
  141. if child[i].HasTeleconference == 1 {
  142. hasTel = true
  143. break
  144. }
  145. }
  146. if !hasTel {
  147. parentClassify.HasTeleconference = 0
  148. updateParent = true
  149. }
  150. }
  151. }
  152. if updateParent {
  153. if err = parentClassify.UpdateClassify(updateCols); err != nil {
  154. br.Msg = "更新父级分类失败"
  155. br.ErrMsg = "更新父级分类失败, Err:" + err.Error()
  156. return
  157. }
  158. }
  159. }
  160. err = models.AddClassify(classify)
  161. if err != nil {
  162. br.Msg = "新增失败"
  163. br.ErrMsg = "新增失败,Err:" + err.Error()
  164. return
  165. }
  166. // 一级分类-新增子目录
  167. if classify.ParentId == 0 && len(req.MenuList) > 0 {
  168. menus := make([]*models.ClassifyMenu, 0)
  169. for i := range req.MenuList {
  170. menus = append(menus, &models.ClassifyMenu{
  171. MenuName: req.MenuList[i].MenuName,
  172. ClassifyId: classify.Id,
  173. Sort: i + 1,
  174. CreateTime: nowTime,
  175. ModifyTime: nowTime,
  176. })
  177. }
  178. menuObj := new(models.ClassifyMenu)
  179. if e := menuObj.InsertMulti(menus); e != nil {
  180. br.Msg = "新增子目录失败"
  181. br.ErrMsg = "批量新增子目录失败, Err:" + e.Error()
  182. return
  183. }
  184. }
  185. // 二级分类-新增子目录关联
  186. if classify.ParentId > 0 && req.ClassifyMenuId > 0 {
  187. if e := models.DeleteAndInsertClassifyMenuRelation(classify.Id, req.ClassifyMenuId); e != nil {
  188. br.Msg = "新增子目录关联失败"
  189. br.ErrMsg = "新增子目录关联失败, Err:" + e.Error()
  190. return
  191. }
  192. }
  193. //获取报告分类权限列表
  194. req2 := services.EditClassifyPermissionReq{
  195. Keyword: item.ClassifyName,
  196. ChartPermissionIdList: req.ChartPermissionIdList,
  197. NewKeyword: item.ClassifyName,
  198. }
  199. err = services.EditClassifyChartPermission(req2)
  200. if err != nil {
  201. br.Msg = "修改分类权限失败"
  202. br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
  203. return
  204. }
  205. // 新增关联了电话会的二级分类时, 同步FICC活动分类
  206. //if req.ParentId > 0 && req.RelateTel == 1 {
  207. // go func() {
  208. // _ = yb.SyncClassifyAndFiccActivityType()
  209. // }()
  210. //}
  211. br.Ret = 200
  212. br.Success = true
  213. br.Msg = "新增成功"
  214. }
  215. // @Title 删除分类-检测接口
  216. // @Description 删除分类-信息检测,是否符合删除条件
  217. // @Param ClassifyId query int true "分类ID"
  218. // @Success 200 {object} models.CheckDeleteClassifyResp
  219. // @router /checkDeleteClassify [get]
  220. func (this *ClassifyController) CheckDeleteClassify() {
  221. br := new(models.BaseResponse).Init()
  222. defer func() {
  223. this.Data["json"] = br
  224. this.ServeJSON()
  225. }()
  226. classifyId, err := this.GetInt("ClassifyId")
  227. if classifyId <= 0 {
  228. br.Msg = "参数错误"
  229. return
  230. }
  231. classify, err := models.GetClassifyById(classifyId)
  232. if err != nil {
  233. br.Msg = "获取信息失败"
  234. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  235. return
  236. }
  237. resp := new(models.CheckDeleteClassifyResp)
  238. if classify == nil {
  239. br.Msg = "分类不存在"
  240. resp.Code = 1
  241. resp.Msg = "分类不存在"
  242. br.Data = resp
  243. br.Ret = 200
  244. br.Success = true
  245. return
  246. }
  247. //判断分类是否关联了报告
  248. if classify.ParentId > 0 {
  249. count, err := models.GetReportCountByClassifyId(classifyId)
  250. if err != nil {
  251. br.Msg = "获取信息失败"
  252. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  253. return
  254. }
  255. if count > 0 {
  256. resp.Code = 2
  257. resp.Msg = "该分类有关联报告,不允许删除"
  258. br.Data = resp
  259. br.Ret = 200
  260. br.Msg = "该分类有关联报告,不允许删除"
  261. br.Success = true
  262. return
  263. }
  264. } else {
  265. subCount, err := models.GetClassifySubCountByClassifyId(classifyId)
  266. if err != nil {
  267. br.Msg = "获取信息失败"
  268. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  269. return
  270. }
  271. if subCount > 0 {
  272. resp.Code = 3
  273. resp.Msg = "二级分类有关联报告,不允许删除"
  274. br.Data = resp
  275. br.Ret = 200
  276. br.Msg = "二级分类有关联报告,不允许删除"
  277. br.Success = true
  278. return
  279. }
  280. subTotal, err := models.GetClassifySubCountByParentId(classifyId)
  281. if err != nil {
  282. br.Msg = "获取信息失败"
  283. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  284. return
  285. }
  286. if subTotal > 0 {
  287. resp.Code = 4
  288. resp.Msg = "请先删除该分类下关联分类"
  289. br.Data = resp
  290. br.Ret = 200
  291. br.Msg = "请先删除该分类下关联分类"
  292. br.Success = true
  293. return
  294. }
  295. }
  296. // 查询该分类是否关联了审批流
  297. flowOb := new(report_approve.ReportApproveFlow)
  298. flowCond := fmt.Sprintf(` AND (%s = ? OR %s = ?) AND (%s = ? OR %s = ?)`, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ClassifyFirstId, report_approve.ReportApproveFlowCols.ClassifySecondId)
  299. flowPars := make([]interface{}, 0)
  300. flowPars = append(flowPars, report_approve.FlowReportTypeChinese, report_approve.FlowReportTypeSmart, classifyId, classifyId)
  301. flowCount, e := flowOb.GetCountByCondition(flowCond, flowPars)
  302. if e != nil {
  303. br.Msg = "检测失败"
  304. br.ErrMsg = "获取关联审批流失败, Err: " + e.Error()
  305. return
  306. }
  307. if flowCount > 0 {
  308. resp.Code = 5
  309. resp.Msg = "该分类关联审批流,不允许删除"
  310. br.Data = resp
  311. br.Ret = 200
  312. br.Msg = resp.Msg
  313. br.Success = true
  314. return
  315. }
  316. resp.Code = 0
  317. resp.Msg = "检测完成,可进行删除操作"
  318. br.Ret = 200
  319. br.Data = resp
  320. br.Success = true
  321. br.Msg = "检测成功"
  322. }
  323. // @Title 删除分类接口
  324. // @Description 删除分类
  325. // @Param request body models.DeleteClassifyReq true "type json string"
  326. // @Success 200 Ret=200,删除成功
  327. // @router /delete [post]
  328. func (this *ClassifyController) Delete() {
  329. br := new(models.BaseResponse).Init()
  330. defer func() {
  331. this.Data["json"] = br
  332. this.ServeJSON()
  333. }()
  334. var req models.DeleteClassifyReq
  335. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  336. if err != nil {
  337. br.Msg = "参数解析异常!"
  338. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  339. return
  340. }
  341. if req.ClassifyId <= 0 {
  342. br.Msg = "参数错误"
  343. return
  344. }
  345. item, err := models.GetClassifyById(req.ClassifyId)
  346. if err != nil {
  347. br.Msg = "获取信息失败"
  348. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  349. return
  350. }
  351. if item == nil {
  352. br.Msg = "分类不存在"
  353. return
  354. }
  355. err = models.DeleteClassify(req.ClassifyId)
  356. if err != nil {
  357. br.Msg = "删除失败"
  358. br.ErrMsg = "删除失败,Err:" + err.Error()
  359. return
  360. }
  361. // 被删除是二级分类且关联电话会时, 同步FICC活动分类
  362. //if item.ParentId > 0 && item.RelateTel == 1 {
  363. // go func() {
  364. // _ = yb.SyncClassifyAndFiccActivityType()
  365. // }()
  366. //}
  367. br.Ret = 200
  368. br.Success = true
  369. br.Msg = "删除成功"
  370. }
  371. // @Title 修改分类接口
  372. // @Description 修改分类
  373. // @Param request body models.EditClassifyReq true "type json string"
  374. // @Success 200 Ret=200,修改成功
  375. // @router /edit [post]
  376. func (this *ClassifyController) Edit() {
  377. br := new(models.BaseResponse).Init()
  378. defer func() {
  379. this.Data["json"] = br
  380. this.ServeJSON()
  381. }()
  382. var req models.EditClassifyReq
  383. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  384. if err != nil {
  385. br.Msg = "参数解析异常!"
  386. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  387. return
  388. }
  389. // 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
  390. menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
  391. if e != nil {
  392. br.Msg = "保存失败"
  393. br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
  394. return
  395. }
  396. menuMap := make(map[string]bool)
  397. for _, m := range menus {
  398. if m.ButtonCode != "" {
  399. menuMap[m.ButtonCode] = true
  400. }
  401. }
  402. if req.ClassifyId <= 0 {
  403. br.Msg = "参数错误"
  404. return
  405. }
  406. if req.ClassifyName == "" {
  407. br.Msg = "分类名称不可为空"
  408. return
  409. }
  410. if menuMap[system.MenuSpecialHandleClassifyShowType] && req.ParentId != 0 && req.ShowType == 0 {
  411. br.Msg = "展示类型不可为空"
  412. return
  413. }
  414. if req.ParentId == req.ClassifyId {
  415. br.Msg = "上级分类不能选择自己"
  416. return
  417. }
  418. if menuMap[system.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && req.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
  419. br.Msg = "报告合集配图不可为空"
  420. return
  421. }
  422. item, err := models.GetClassifyById(req.ClassifyId)
  423. if err != nil {
  424. if err.Error() == utils.ErrNoRow() {
  425. br.Msg = "分类不存在, 或已被删除"
  426. br.ErrMsg = "获取分类信息失败, Err: " + err.Error()
  427. return
  428. }
  429. br.Msg = "获取信息失败"
  430. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  431. return
  432. }
  433. originName := item.ClassifyName
  434. oldParentId := item.ParentId
  435. //originRelateTel := item.RelateTel
  436. // 重名校验
  437. existName, e := models.GetClassifyByName(req.ClassifyName, item.ParentId)
  438. if e != nil && e.Error() != utils.ErrNoRow() {
  439. br.Msg = "获取信息失败"
  440. br.ErrMsg = "获取重名分类失败, Err: " + err.Error()
  441. return
  442. }
  443. if existName != nil && existName.Id != item.Id {
  444. br.Msg = "分类名称:" + req.ClassifyName + "已存在"
  445. return
  446. }
  447. oldClassifyName := item.ClassifyName
  448. item.ClassifyName = req.ClassifyName
  449. item.Abstract = req.Abstract
  450. item.ParentId = req.ParentId
  451. item.Descript = req.Descript
  452. item.ReportAuthor = req.ReportAuthor
  453. item.AuthorDescript = req.AuthorDescript
  454. item.ColumnImgUrl = req.ColumnImgUrl
  455. item.HeadImgUrl = req.HeadImgUrl
  456. item.AvatarImgUrl = req.AvatarImgUrl
  457. item.ReportImgUrl = req.ReportImgUrl
  458. item.HomeImgUrl = req.HomeImgUrl
  459. item.ClassifyLabel = req.ClassifyLabel
  460. item.ShowType = req.ShowType
  461. item.HasTeleconference = req.HasTeleconference
  462. item.VipTitle = req.VipTitle
  463. item.Sort = req.Sort
  464. item.IsShow = req.IsShow
  465. item.YbFiccSort = req.YbFiccSort
  466. item.YbFiccIcon = req.YbFiccIcon
  467. item.YbFiccPcIcon = req.YbFiccPcIcon
  468. item.YbIconUrl = req.YbIconUrl
  469. item.YbBgUrl = req.YbBgUrl
  470. item.YbListImg = req.YbListImg
  471. item.YbShareBgImg = req.YbShareBgImg
  472. item.YbRightBanner = req.YbRightBanner
  473. item.RelateTel = req.RelateTel
  474. item.RelateVideo = req.RelateVideo
  475. item.ModifyTime = time.Now().Local()
  476. cols := make([]string, 0)
  477. cols = append(cols, "ClassifyName", "Abstract", "ParentId", "Descript", "ReportAuthor", "AuthorDescript", "ColumnImgUrl",
  478. "HeadImgUrl", "AvatarImgUrl", "ReportImgUrl", "HomeImgUrl", "ClassifyLabel", "ShowType", "HasTeleconference", "VipTitle", "Sort",
  479. "IsShow", "YbFiccSort", "YbFiccIcon", "YbFiccPcIcon", "YbIconUrl", "YbBgUrl", "YbListImg", "YbShareBgImg", "YbRightBanner",
  480. "RelateTel", "RelateVideo", "ModifyTime")
  481. if e := item.UpdateClassify(cols); e != nil {
  482. br.Msg = "修改失败"
  483. br.ErrMsg = "修改失败,Err:" + e.Error()
  484. return
  485. }
  486. // 一级分类关联设置会强制修改二级分类的所有关联设置
  487. if item.ParentId == 0 {
  488. if e = models.UpdateChildClassifyRelateSetting(item.Id, req.RelateTel, req.RelateVideo); e != nil {
  489. br.Msg = "更新二级分类关联设置失败"
  490. br.ErrMsg = "更新二级分类关联设置失败, Err: " + e.Error()
  491. return
  492. }
  493. }
  494. //获取报告分类权限列表
  495. req2 := services.EditClassifyPermissionReq{
  496. Keyword: oldClassifyName,
  497. ChartPermissionIdList: req.ChartPermissionIdList,
  498. NewKeyword: item.ClassifyName,
  499. }
  500. err = services.EditClassifyChartPermission(req2)
  501. if err != nil {
  502. br.Msg = "修改分类权限失败"
  503. br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
  504. return
  505. }
  506. // 为二级分类时, 更新父级分类是否含电话会字段
  507. if req.ParentId > 0 {
  508. go func() {
  509. _ = services.UpdateParentClassifyHasTel(req.ClassifyId, req.ParentId, req.HasTeleconference)
  510. }()
  511. }
  512. // 更新报告分类名称/父级分类后
  513. go func() {
  514. _ = services.AfterUpdateClassifyNameOrParent(item.Id, item.ParentId, oldParentId, originName, item.ClassifyName)
  515. }()
  516. // 获取编辑前子目录列表
  517. classifyId := item.Id
  518. var menuCond string
  519. var menuPars []interface{}
  520. menuCond += ` AND classify_id = ?`
  521. menuPars = append(menuPars, classifyId)
  522. menuList, e := models.GetClassifyMenuList(menuCond, menuPars)
  523. if e != nil {
  524. br.Msg = "保存失败"
  525. br.ErrMsg = "获取分类子目录列表失败, Err:" + e.Error()
  526. return
  527. }
  528. oriMenuIds := make([]int, 0)
  529. for i := range menuList {
  530. oriMenuIds = append(oriMenuIds, menuList[i].MenuId)
  531. }
  532. // 一级分类-新增/编辑/删除子目录
  533. if item.ParentId == 0 && len(req.MenuList) > 0 {
  534. nowTime := time.Now().Local()
  535. insertMenus := make([]*models.ClassifyMenu, 0)
  536. editMenus := make([]*models.ClassifyMenu, 0)
  537. deleteMenuIds := make([]int, 0)
  538. menuIds := make([]int, 0)
  539. for i := range req.MenuList {
  540. m := req.MenuList[i]
  541. v := new(models.ClassifyMenu)
  542. v.MenuName = req.MenuList[i].MenuName
  543. v.ClassifyId = classifyId
  544. v.Sort = i + 1
  545. v.MenuId = m.MenuId
  546. v.ModifyTime = nowTime
  547. if v.MenuId > 0 {
  548. // 编辑
  549. editMenus = append(editMenus, v)
  550. menuIds = append(menuIds, m.MenuId)
  551. } else {
  552. // 新增
  553. v.CreateTime = nowTime
  554. insertMenus = append(insertMenus, v)
  555. }
  556. }
  557. // 编辑前存在子目录则取"编辑前子目录IDs与编辑时子目录IDs的差集"作为删除IDs
  558. if len(oriMenuIds) > 0 {
  559. deleteMenuIds = utils.MinusInt(oriMenuIds, menuIds)
  560. }
  561. if e = models.InsertAndUpdateClassifyMenu(insertMenus, editMenus, deleteMenuIds); e != nil {
  562. br.Msg = "保存失败"
  563. br.ErrMsg = "新增/编辑/删除分类子目录失败, Err:" + e.Error()
  564. return
  565. }
  566. }
  567. // 二级分类-新增子目录关联
  568. if item.ParentId > 0 {
  569. if e := models.DeleteAndInsertClassifyMenuRelation(classifyId, req.ClassifyMenuId); e != nil {
  570. br.Msg = "新增子目录关联失败"
  571. br.ErrMsg = "新增子目录关联失败, Err:" + e.Error()
  572. return
  573. }
  574. }
  575. // 关联电话会选项被更改时, 同步FICC活动分类
  576. //if originRelateTel != req.RelateTel {
  577. // go func() {
  578. // _ = yb.SyncClassifyAndFiccActivityType()
  579. // }()
  580. //}
  581. br.Ret = 200
  582. br.Success = true
  583. br.Msg = "修改成功"
  584. }
  585. // @Title 获取父级分类接口
  586. // @Description 获取父级分类
  587. // @Success 200 {object} models.Classify
  588. // @router /parent [get]
  589. func (this *ClassifyController) ParentClassify() {
  590. br := new(models.BaseResponse).Init()
  591. defer func() {
  592. this.Data["json"] = br
  593. this.ServeJSON()
  594. }()
  595. items, err := models.ParentClassify()
  596. if err != nil {
  597. br.Msg = "获取失败"
  598. br.ErrMsg = "获取失败,Err:" + err.Error()
  599. return
  600. }
  601. classifyIds := make([]int, 0)
  602. for i := range items {
  603. classifyIds = append(classifyIds, items[i].Id)
  604. }
  605. classifyLen := len(classifyIds)
  606. if classifyLen == 0 {
  607. br.Ret = 200
  608. br.Success = true
  609. br.Msg = "获取成功"
  610. return
  611. }
  612. // 获取一级分类-子目录列表
  613. menuListMap := make(map[int][]*models.ClassifyMenu, 0)
  614. var menuCond string
  615. var menuPars []interface{}
  616. menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(classifyLen) + `)`
  617. menuPars = append(menuPars, classifyIds)
  618. parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars)
  619. if e != nil {
  620. br.Msg = "获取失败"
  621. br.ErrMsg = "获取一级分类子目录列表失败"
  622. return
  623. }
  624. for i := range parentMenus {
  625. if menuListMap[parentMenus[i].ClassifyId] == nil {
  626. menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0)
  627. }
  628. menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
  629. }
  630. resp := make([]*models.ClassifyItem, 0)
  631. for i := range items {
  632. resp = append(resp, &models.ClassifyItem{
  633. Classify: *items[i],
  634. ClassifyMenuList: menuListMap[items[i].Id],
  635. })
  636. }
  637. br.Data = resp
  638. br.Ret = 200
  639. br.Success = true
  640. br.Msg = "获取成功"
  641. }
  642. // @Title 根据id获取分类详情接口
  643. // @Description 根据id获取分类详情
  644. // @Param request body models.FindByIdClassifyReq true "type json string"
  645. // @Success 200 {object} models.Classify
  646. // @router /findById [get]
  647. func (this *ClassifyController) FindByIdClassify() {
  648. br := new(models.BaseResponse).Init()
  649. defer func() {
  650. this.Data["json"] = br
  651. this.ServeJSON()
  652. }()
  653. var req models.FindByIdClassifyReq
  654. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  655. if err != nil {
  656. br.Msg = "参数解析异常!"
  657. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  658. return
  659. }
  660. items, err := models.FindByIdClassify(req.ClassifyId)
  661. if err != nil {
  662. br.Msg = "获取失败"
  663. br.ErrMsg = "获取失败,Err:" + err.Error()
  664. return
  665. }
  666. br.Data = items
  667. br.Ret = 200
  668. br.Success = true
  669. br.Msg = "获取成功"
  670. }
  671. // @Title 获取分类列表
  672. // @Description 获取分类列表
  673. // @Param PageSize query int true "每页数据条数"
  674. // @Param CurrentIndex query int true "当前页页码,从1开始"
  675. // @Param KeyWord query string true "检索关键词"
  676. // @Param CompanyType query string false "产品类型,枚举值:'ficc','权益';不传默认返回全部"
  677. // @Param HideDayWeek query int false "是否隐藏晨周报"
  678. // @Success 200 {object} models.Classify
  679. // @router /list [get]
  680. func (this *ClassifyController) ListClassify() {
  681. br := new(models.BaseResponse).Init()
  682. defer func() {
  683. this.Data["json"] = br
  684. this.ServeJSON()
  685. }()
  686. pageSize, _ := this.GetInt("PageSize")
  687. currentIndex, _ := this.GetInt("CurrentIndex")
  688. keyWord := this.GetString("KeyWord")
  689. companyType := this.GetString("CompanyType")
  690. hideDayWeek, _ := this.GetInt("HideDayWeek")
  691. // 商家不隐藏晨周报
  692. if utils.BusinessCode != utils.BusinessCodeRelease {
  693. hideDayWeek = 0
  694. }
  695. var startSize int
  696. if pageSize <= 0 {
  697. pageSize = utils.PageSize20
  698. }
  699. if currentIndex <= 0 {
  700. currentIndex = 1
  701. }
  702. startSize = utils.StartIndex(currentIndex, pageSize)
  703. list, err := models.GetClassifyList(startSize, pageSize, keyWord, companyType, hideDayWeek)
  704. if err != nil {
  705. br.Msg = "获取失败"
  706. br.ErrMsg = "获取失败,Err:" + err.Error()
  707. return
  708. }
  709. total, err := models.GetClassifyListCount(keyWord, companyType, hideDayWeek)
  710. if err != nil {
  711. br.Msg = "获取失败"
  712. br.ErrMsg = "获取失败,Err:" + err.Error()
  713. return
  714. }
  715. parentIds := make([]int, 0)
  716. for i := range list {
  717. parentIds = append(parentIds, list[i].Id)
  718. }
  719. parentIdLen := len(parentIds)
  720. if parentIdLen == 0 {
  721. resp := &models.ClassifyListResp{
  722. List: list,
  723. Paging: paging.GetPaging(currentIndex, pageSize, 0),
  724. }
  725. br.Data = resp
  726. br.Ret = 200
  727. br.Success = true
  728. br.Msg = "获取成功"
  729. return
  730. }
  731. // 获取一级分类-子目录列表
  732. menuListMap := make(map[int][]*models.ClassifyMenu, 0)
  733. var menuCond string
  734. var menuPars []interface{}
  735. menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(parentIdLen) + `)`
  736. menuPars = append(menuPars, parentIds)
  737. parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars)
  738. if e != nil {
  739. br.Msg = "获取失败"
  740. br.ErrMsg = "获取一级分类子目录列表失败"
  741. return
  742. }
  743. for i := range parentMenus {
  744. if menuListMap[parentMenus[i].ClassifyId] == nil {
  745. menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0)
  746. }
  747. menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
  748. }
  749. // 获取子分类
  750. children, e := models.GetClassifyChildByParentIds(parentIds, keyWord)
  751. if e != nil {
  752. br.Msg = "获取失败"
  753. br.ErrMsg = "获取子分类失败"
  754. return
  755. }
  756. childrenIds := make([]int, 0)
  757. for i := range children {
  758. childrenIds = append(childrenIds, children[i].Id)
  759. }
  760. childrenIdsLen := len(childrenIds)
  761. // 获取二级分类-子目录关联
  762. relateMap := make(map[int]int, 0)
  763. if childrenIdsLen > 0 {
  764. var relateCond string
  765. var relatePars []interface{}
  766. relateCond += ` AND classify_id IN (` + utils.GetOrmInReplace(childrenIdsLen) + `)`
  767. relatePars = append(relatePars, childrenIds)
  768. relates, e := models.GetClassifyMenuRelationList(relateCond, relatePars)
  769. if e != nil {
  770. br.Msg = "获取失败"
  771. br.ErrMsg = "获取二级分类子目录关联失败, Err: " + e.Error()
  772. return
  773. }
  774. for i := range relates {
  775. relateMap[relates[i].ClassifyId] = relates[i].MenuId
  776. }
  777. }
  778. // 查询分类绑定的权限
  779. permissionList, _ := services.GetClassifyChartPermission("")
  780. classifyPermissionMap := make(map[string][]int, 0)
  781. if len(permissionList) > 0 {
  782. for _, v := range permissionList {
  783. classifyPermissionMap[v.KeyWord] = append(classifyPermissionMap[v.KeyWord], v.ChartPermissionId)
  784. }
  785. }
  786. // 二级分类
  787. childrenMap := make(map[int][]*models.ClassifyItem, 0)
  788. for i := range children {
  789. if childrenMap[children[i].ParentId] == nil {
  790. childrenMap[children[i].ParentId] = make([]*models.ClassifyItem, 0)
  791. }
  792. tmp := &models.ClassifyItem{
  793. Classify: *children[i],
  794. ClassifyMenuId: relateMap[children[i].Id],
  795. }
  796. if permissionIds, ok := classifyPermissionMap[children[i].ClassifyName]; ok {
  797. tmp.ChartPermissionIdList = permissionIds
  798. }
  799. childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], tmp)
  800. }
  801. // 一级分类
  802. for i := range list {
  803. list[i].ClassifyMenuList = menuListMap[list[i].Id]
  804. list[i].Child = childrenMap[list[i].Id]
  805. }
  806. page := paging.GetPaging(currentIndex, pageSize, total)
  807. resp := new(models.ClassifyListResp)
  808. resp.List = list
  809. resp.Paging = page
  810. br.Data = resp
  811. br.Ret = 200
  812. br.Success = true
  813. br.Msg = "获取成功"
  814. }
  815. // ClassifyPermission
  816. // @Title 获取分类权限列表
  817. // @Description 获取分类权限列表
  818. // @Param ClassifyId query int true "分类id"
  819. // @Success 200 {object} []models.ChartPermissionSearchKeyWordMapping
  820. // @router /permission_list [get]
  821. func (this *ClassifyController) ClassifyPermission() {
  822. br := new(models.BaseResponse).Init()
  823. defer func() {
  824. this.Data["json"] = br
  825. this.ServeJSON()
  826. }()
  827. classifyId, _ := this.GetInt("ClassifyId")
  828. if classifyId <= 0 {
  829. br.Msg = "参数错误"
  830. return
  831. }
  832. //获取报告分类详情
  833. classifyInfo, err := models.GetClassifyById(classifyId)
  834. if err != nil {
  835. br.Msg = "获取分类信息失败"
  836. br.ErrMsg = "获取失败,Err:" + err.Error()
  837. return
  838. }
  839. //获取报告分类权限列表
  840. //list, err := models.GetPermission(classifyInfo.ClassifyName)
  841. list, err := services.GetClassifyChartPermission(classifyInfo.ClassifyName)
  842. if err != nil {
  843. br.Msg = "获取分类信息失败"
  844. br.ErrMsg = "获取失败,Err:" + err.Error()
  845. return
  846. }
  847. br.Data = list
  848. br.Ret = 200
  849. br.Success = true
  850. br.Msg = "获取成功"
  851. }
  852. // EditClassifyPermission
  853. // @Title 编辑分类权限
  854. // @Description 编辑分类权限
  855. // @Param ClassifyId query int true "分类id"
  856. // @Success 200 {object} models.EditClassifyPermissionReq
  857. // @router /permission/edit [post]
  858. func (this *ClassifyController) EditClassifyPermission() {
  859. br := new(models.BaseResponse).Init()
  860. defer func() {
  861. this.Data["json"] = br
  862. this.ServeJSON()
  863. }()
  864. var req models.EditClassifyPermissionReq
  865. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  866. if err != nil {
  867. br.Msg = "参数解析异常!"
  868. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  869. return
  870. }
  871. if req.ClassifyId <= 0 {
  872. br.Msg = "参数错误"
  873. return
  874. }
  875. if len(req.ChartPermissionIdList) <= 0 {
  876. br.Msg = "请选择权限"
  877. return
  878. }
  879. //获取报告分类详情
  880. classifyInfo, err := models.GetClassifyById(req.ClassifyId)
  881. if err != nil {
  882. br.Msg = "获取分类信息失败"
  883. br.ErrMsg = "获取失败,Err:" + err.Error()
  884. return
  885. }
  886. //获取报告分类权限列表
  887. req2 := services.EditClassifyPermissionReq{
  888. Keyword: classifyInfo.ClassifyName,
  889. ChartPermissionIdList: req.ChartPermissionIdList,
  890. NewKeyword: classifyInfo.ClassifyName,
  891. }
  892. err = services.EditClassifyChartPermission(req2)
  893. if err != nil {
  894. br.Msg = "修改分类权限失败"
  895. br.ErrMsg = "修改分类权限失败,Err:" + err.Error()
  896. return
  897. }
  898. // 是关联电话会二级分类修改了权限, 同步关联报告电话会的分类
  899. //if classifyInfo.ParentId > 0 && classifyInfo.RelateTel == 1 {
  900. // go func() {
  901. // _ = yb.SyncClassifyAndFiccActivityType()
  902. // }()
  903. //}
  904. br.Ret = 200
  905. br.Success = true
  906. br.Msg = "修改成功"
  907. }
  908. // @Title 含电话会分类列表
  909. // @Description 含电话会分类列表
  910. // @Success 200 {object} models.Classify
  911. // @router /tel_list [get]
  912. func (this *ClassifyController) TelListClassify() {
  913. br := new(models.BaseResponse).Init()
  914. defer func() {
  915. this.Data["json"] = br
  916. this.ServeJSON()
  917. }()
  918. resp := make([]*models.SimpleClassifyList, 0)
  919. var condition, orderRule string
  920. var pars []interface{}
  921. if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
  922. condition += ` AND classify_name <> '晨报' AND classify_name <> '周报' `
  923. }
  924. telList, e := models.GetClassifyByCondition(condition, orderRule, pars)
  925. if e != nil {
  926. return
  927. }
  928. firstList := make([]*models.SimpleClassifyList, 0)
  929. secondList := make([]*models.SimpleClassifyList, 0)
  930. secondMap := make(map[int][]*models.SimpleClassifyList, 0)
  931. for i := range telList {
  932. if telList[i].ParentId == 0 {
  933. firstList = append(firstList, telList[i])
  934. } else {
  935. secondList = append(secondList, telList[i])
  936. secondMap[telList[i].ParentId] = append(secondMap[telList[i].ParentId], telList[i])
  937. }
  938. }
  939. for i := range firstList {
  940. firstList[i].Child = secondMap[firstList[i].Id]
  941. }
  942. resp = firstList
  943. br.Data = resp
  944. br.Ret = 200
  945. br.Success = true
  946. br.Msg = "获取成功"
  947. }
  948. // Move
  949. // @Title 移动分类接口
  950. // @Description 移动分类
  951. // @Param request body models.ClassifyMoveReq true "type json string"
  952. // @Success 200 新增成功
  953. // @router /move [post]
  954. func (this *ClassifyController) Move() {
  955. br := new(models.BaseResponse).Init()
  956. defer func() {
  957. this.Data["json"] = br
  958. this.ServeJSON()
  959. }()
  960. var req models.ClassifyMoveReq
  961. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  962. if err != nil {
  963. br.Msg = "参数解析异常!"
  964. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  965. return
  966. }
  967. if req.ClassifyId <= 0 {
  968. br.Msg = "请选择分类"
  969. return
  970. }
  971. e, msg := services.MoveReportClassify(req)
  972. if e != nil {
  973. br.Msg = msg
  974. br.ErrMsg = "移动分类失败, Err: " + e.Error()
  975. return
  976. }
  977. br.Ret = 200
  978. br.Success = true
  979. br.Msg = "操作成功"
  980. }
  981. // SetEnabled
  982. // @Title 启用/禁用分类接口
  983. // @Description 启用/禁用分类
  984. // @Param request body models.ClassifyMoveReq true "type json string"
  985. // @Success 200 新增成功
  986. // @router /enabled/set [post]
  987. func (this *ClassifyController) SetEnabled() {
  988. br := new(models.BaseResponse).Init()
  989. defer func() {
  990. this.Data["json"] = br
  991. this.ServeJSON()
  992. }()
  993. var req models.ClassifySetEnabledReq
  994. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  995. if err != nil {
  996. br.Msg = "参数解析异常!"
  997. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  998. return
  999. }
  1000. if req.ClassifyId <= 0 {
  1001. br.Msg = "请选择分类"
  1002. return
  1003. }
  1004. if req.Enabled != 0 && req.Enabled != 1 {
  1005. br.Msg = "请选择正确的启用禁用状态"
  1006. return
  1007. }
  1008. item, err := models.GetClassifyById(req.ClassifyId)
  1009. if err != nil {
  1010. if err.Error() == utils.ErrNoRow() {
  1011. br.Msg = "分类不存在"
  1012. return
  1013. }
  1014. br.Msg = "获取信息失败"
  1015. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  1016. return
  1017. }
  1018. if item == nil {
  1019. br.Msg = "分类不存在"
  1020. return
  1021. }
  1022. ob := new(models.Classify)
  1023. //设置分类启用、禁用状态
  1024. err = ob.SetEnabled(req.ClassifyId, req.Enabled)
  1025. if err != nil {
  1026. br.Msg = "操作失败"
  1027. br.ErrMsg = "操作失败,Err:" + err.Error()
  1028. return
  1029. }
  1030. br.Ret = 200
  1031. br.Success = true
  1032. br.Msg = "操作成功"
  1033. }