classify.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. package eta
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/go-playground/validator/v10"
  5. "hongze/hz_crm_eta/controller/resp"
  6. "hongze/hz_crm_eta/global"
  7. "hongze/hz_crm_eta/models/crm"
  8. "hongze/hz_crm_eta/models/eta"
  9. etaService "hongze/hz_crm_eta/services/eta"
  10. "hongze/hz_crm_eta/utils"
  11. "time"
  12. )
  13. type ClassifyController struct{}
  14. // ListClassify
  15. // @Title 获取分类列表
  16. // @Description 获取分类列表
  17. // @Param KeyWord query string true "检索关键词"
  18. // @Param CompanyType query string false "产品类型,枚举值:'ficc','权益';不传默认返回全部"
  19. // @Param HideDayWeek query int false "是否隐藏晨周报"
  20. // @Success 200 {object} models.Classify
  21. // @router /classify/list [get]
  22. func (this *ClassifyController) ListClassify(c *gin.Context) {
  23. var req eta.ClassifyListReq
  24. err := c.Bind(&req)
  25. if err != nil {
  26. errs, ok := err.(validator.ValidationErrors)
  27. if !ok {
  28. resp.FailData("参数解析失败", "Err:"+err.Error(), c)
  29. return
  30. }
  31. resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
  32. return
  33. }
  34. keyWord := req.Keyword
  35. list, err := eta.GetClassifyListByKeyword(keyWord)
  36. if err != nil {
  37. resp.FailData("获取失败", err.Error(), c)
  38. return
  39. }
  40. if keyWord != `` {
  41. idMap := make(map[int]bool)
  42. currParentClassifyIdList := make([]int, 0)
  43. for _, v := range list {
  44. idMap[v.Id] = true
  45. if v.ParentId > 0 {
  46. currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId)
  47. }
  48. }
  49. findList := list
  50. list = make([]*eta.ClassifyListV2, 0)
  51. tmpList, tmpErr := etaService.GetParentClassifyListByParentIdList(currParentClassifyIdList)
  52. if tmpErr != nil {
  53. resp.FailData("获取失败", "获取上级分类信息失败,Err:"+err.Error(), c)
  54. return
  55. }
  56. for _, v := range tmpList {
  57. if _, ok := idMap[v.Id]; !ok {
  58. list = append(list, v)
  59. }
  60. }
  61. list = append(list, findList...)
  62. }
  63. classifyIdList := make([]int, 0)
  64. for i := range list {
  65. classifyIdList = append(classifyIdList, list[i].Id)
  66. }
  67. parentIdLen := len(classifyIdList)
  68. if parentIdLen == 0 {
  69. data := &eta.ClassifyListResp{
  70. List: make([]*eta.ClassifyListV2, 0),
  71. }
  72. resp.OkData("操作成功", data, c)
  73. return
  74. }
  75. // 获取一级分类-子目录列表
  76. menuListMap := make(map[int][]*eta.ClassifyMenu, 0)
  77. var menuCond string
  78. var menuPars []interface{}
  79. menuCond += ` classify_id IN (?)`
  80. menuPars = append(menuPars, classifyIdList)
  81. menuOb := new(eta.ClassifyMenu)
  82. parentMenus, e := menuOb.GetClassifyMenuList(menuCond, menuPars)
  83. if e != nil {
  84. resp.FailData("获取失败", "获取一级分类子目录列表失败", c)
  85. return
  86. }
  87. for i := range parentMenus {
  88. if menuListMap[parentMenus[i].ClassifyId] == nil {
  89. menuListMap[parentMenus[i].ClassifyId] = make([]*eta.ClassifyMenu, 0)
  90. }
  91. menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
  92. }
  93. // 获取子分类
  94. children, e := eta.GetClassifyChildByParentIds(classifyIdList, keyWord)
  95. if e != nil {
  96. resp.FailData("获取失败", "获取子分类失败", c)
  97. return
  98. }
  99. childrenIds := make([]int, 0)
  100. for i := range children {
  101. childrenIds = append(childrenIds, children[i].Id)
  102. }
  103. childrenIdsLen := len(childrenIds)
  104. // 获取二级分类-子目录关联
  105. relateMap := make(map[int]int, 0)
  106. if childrenIdsLen > 0 {
  107. var relateCond string
  108. var relatePars []interface{}
  109. relateCond += ` classify_id IN (?)`
  110. relatePars = append(relatePars, childrenIds)
  111. menuRelationOb := new(eta.ClassifyMenuRelation)
  112. relates, e := menuRelationOb.GetClassifyMenuRelationList(relateCond, relatePars)
  113. if e != nil {
  114. resp.FailData("获取失败", "获取二级分类子目录关联失败, Err: "+e.Error(), c)
  115. return
  116. }
  117. for i := range relates {
  118. relateMap[relates[i].ClassifyId] = relates[i].MenuId
  119. }
  120. }
  121. permissionMappingOb := new(crm.ChartPermissionSearchKeyWordMapping)
  122. permissionList, e := permissionMappingOb.GetPermission()
  123. if e != nil {
  124. resp.FailData("查询权限失败", e.Error(), c)
  125. return
  126. }
  127. classifyPermissionMap := make(map[int][]int, 0)
  128. if len(permissionList) > 0 {
  129. for _, v := range permissionList {
  130. classifyPermissionMap[v.ClassifyId] = append(classifyPermissionMap[v.ClassifyId], v.ChartPermissionId)
  131. }
  132. }
  133. // 遍历分类并绑定子目录和权限
  134. for i, v := range list {
  135. list[i].ClassifyMenuList = menuListMap[v.Id]
  136. list[i].ClassifyMenuId = relateMap[v.Id]
  137. if permissionIds, ok := classifyPermissionMap[v.Id]; ok {
  138. list[i].ChartPermissionIdList = permissionIds
  139. }
  140. }
  141. // 先将分类列表排序
  142. etaService.SortClassifyListBySortAndCreateTime(list)
  143. // 接着转换结构
  144. list = etaService.GetClassifyListTreeRecursive(list, 0)
  145. data := new(eta.ClassifyListResp)
  146. data.List = list
  147. resp.OkData("操作成功", data, c)
  148. }
  149. //func (this *ClassifyController) ListClassify(c *gin.Context) {
  150. // var req eta.ClassifyListReq
  151. // err := c.Bind(&req)
  152. // if err != nil {
  153. // errs, ok := err.(validator.ValidationErrors)
  154. // if !ok {
  155. // resp.FailData("参数解析失败", "Err:"+err.Error(), c)
  156. // return
  157. // }
  158. // resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
  159. // return
  160. // }
  161. //
  162. // keyWord := req.Keyword
  163. // companyType := req.CompanyType
  164. // hideDayWeek := req.HideDayWeek
  165. //
  166. // list, err := eta.GetClassifyList(keyWord, companyType, hideDayWeek)
  167. // if err != nil {
  168. // resp.FailData("获取失败", err.Error(), c)
  169. // return
  170. // }
  171. // finalList := make([]*eta.ClassifyList, 0)
  172. // parentIds := make([]int, 0)
  173. // for i := range list {
  174. // tmp := new(eta.ClassifyList)
  175. // tmp.ClassifyListItem = *list[i]
  176. // finalList = append(finalList, tmp)
  177. // parentIds = append(parentIds, list[i].Id)
  178. // }
  179. // parentIdLen := len(parentIds)
  180. // if parentIdLen == 0 {
  181. // data := &eta.ClassifyListResp{
  182. // List: finalList,
  183. // }
  184. // resp.OkData("操作成功", data, c)
  185. // return
  186. // }
  187. //
  188. // // 获取一级分类-子目录列表
  189. // menuListMap := make(map[int][]*eta.ClassifyMenu, 0)
  190. // var menuCond string
  191. // var menuPars []interface{}
  192. // menuCond += ` classify_id IN (?)`
  193. // menuPars = append(menuPars, parentIds)
  194. // menuOb := new(eta.ClassifyMenu)
  195. // parentMenus, e := menuOb.GetClassifyMenuList(menuCond, menuPars)
  196. // if e != nil {
  197. // resp.FailData("获取失败", "获取一级分类子目录列表失败", c)
  198. // return
  199. // }
  200. // for i := range parentMenus {
  201. // if menuListMap[parentMenus[i].ClassifyId] == nil {
  202. // menuListMap[parentMenus[i].ClassifyId] = make([]*eta.ClassifyMenu, 0)
  203. // }
  204. // menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
  205. // }
  206. //
  207. // // 获取子分类
  208. // children, e := eta.GetClassifyChildByParentIds(parentIds, keyWord)
  209. // if e != nil {
  210. // resp.FailData("获取失败", "获取子分类失败", c)
  211. // return
  212. // }
  213. // childrenIds := make([]int, 0)
  214. // for i := range children {
  215. // childrenIds = append(childrenIds, children[i].Id)
  216. // }
  217. // childrenIdsLen := len(childrenIds)
  218. //
  219. // // 获取二级分类-子目录关联
  220. // relateMap := make(map[int]int, 0)
  221. // if childrenIdsLen > 0 {
  222. // var relateCond string
  223. // var relatePars []interface{}
  224. // relateCond += ` classify_id IN (?)`
  225. // relatePars = append(relatePars, childrenIds)
  226. // menuRelationOb := new(eta.ClassifyMenuRelation)
  227. // relates, e := menuRelationOb.GetClassifyMenuRelationList(relateCond, relatePars)
  228. // if e != nil {
  229. // resp.FailData("获取失败", "获取二级分类子目录关联失败, Err: "+e.Error(), c)
  230. // return
  231. // }
  232. // for i := range relates {
  233. // relateMap[relates[i].ClassifyId] = relates[i].MenuId
  234. // }
  235. // }
  236. //
  237. // permissionMappingOb := new(crm.ChartPermissionSearchKeyWordMapping)
  238. // permissionList, e := permissionMappingOb.GetPermission()
  239. // if e != nil {
  240. // resp.FailData("查询权限失败", e.Error(), c)
  241. // return
  242. // }
  243. // classifyPermissionMap := make(map[string][]int, 0)
  244. // if len(permissionList) > 0 {
  245. // for _, v := range permissionList {
  246. // classifyPermissionMap[v.KeyWord] = append(classifyPermissionMap[v.KeyWord], v.ChartPermissionId)
  247. // }
  248. // }
  249. // // 二级分类
  250. // childrenMap := make(map[int][]*eta.ClassifyItem, 0)
  251. // for i := range children {
  252. //
  253. // if childrenMap[children[i].ParentId] == nil {
  254. // childrenMap[children[i].ParentId] = make([]*eta.ClassifyItem, 0)
  255. // }
  256. // tmp := &eta.ClassifyItem{
  257. // Classify: *children[i],
  258. // ClassifyMenuId: relateMap[children[i].Id],
  259. // }
  260. // if permissionIds, ok := classifyPermissionMap[children[i].ClassifyName]; ok {
  261. // tmp.ChartPermissionIdList = permissionIds
  262. // }
  263. // childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], tmp)
  264. // }
  265. //
  266. // // 一级分类
  267. // for i := range finalList {
  268. // finalList[i].ClassifyMenuList = menuListMap[list[i].Id]
  269. // finalList[i].Child = childrenMap[list[i].Id]
  270. // }
  271. //
  272. // data := new(eta.ClassifyListResp)
  273. // data.List = finalList
  274. // resp.OkData("操作成功", data, c)
  275. //}
  276. // SetEnabled
  277. // @Title 启用/禁用分类接口
  278. // @Description 启用/禁用分类
  279. // @Param request body models.ClassifyMoveReq true "type json string"
  280. // @Success 200 新增成功
  281. // @router /classify/enabled/set [post]
  282. func (this *ClassifyController) SetEnabled(c *gin.Context) {
  283. var req eta.ClassifySetEnabledReq
  284. err := c.Bind(&req)
  285. if err != nil {
  286. errs, ok := err.(validator.ValidationErrors)
  287. if !ok {
  288. resp.FailData("参数解析失败", "Err:"+err.Error(), c)
  289. return
  290. }
  291. resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
  292. return
  293. }
  294. if req.ClassifyId <= 0 {
  295. resp.Fail("请选择分类", c)
  296. return
  297. }
  298. if req.Enabled != 0 && req.Enabled != 1 {
  299. resp.Fail("请选择正确的启用禁用状态", c)
  300. return
  301. }
  302. ob := new(eta.Classify)
  303. item, err := ob.GetClassifyById(req.ClassifyId)
  304. if err != nil {
  305. if err == utils.ErrNoRow {
  306. resp.FailData("分类不存在", "Err:"+err.Error(), c)
  307. return
  308. }
  309. resp.FailData("获取信息失败", "Err:"+err.Error(), c)
  310. return
  311. }
  312. if item == nil {
  313. resp.Fail("分类不存在", c)
  314. return
  315. }
  316. //设置分类启用、禁用状态
  317. err = ob.SetEnabled(req.ClassifyId, req.Enabled)
  318. if err != nil {
  319. resp.FailData("操作失败", "Err:"+err.Error(), c)
  320. return
  321. }
  322. resp.Ok("操作成功", c)
  323. }
  324. // Edit
  325. // @Title 修改分类接口
  326. // @Description 修改分类
  327. // @Param request body models.EditClassifyReq true "type json string"
  328. // @Success 200 Ret=200,修改成功
  329. // @router /classify/edit [post]
  330. func (this *ClassifyController) Edit(c *gin.Context) {
  331. var req eta.EditClassifyReq
  332. err := c.Bind(&req)
  333. if err != nil {
  334. errs, ok := err.(validator.ValidationErrors)
  335. if !ok {
  336. resp.FailData("参数解析失败", "Err:"+err.Error(), c)
  337. return
  338. }
  339. resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
  340. return
  341. }
  342. // 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
  343. sysMenuObject := new(eta.SysMenu)
  344. menus, e := sysMenuObject.GetSysMenuItemsByCondition(` hidden = 0`, make([]interface{}, 0), []string{}, ``)
  345. if e != nil {
  346. resp.FailData("保存失败", "获取菜单列表失败, Err:"+err.Error(), c)
  347. return
  348. }
  349. menuMap := make(map[string]bool)
  350. for _, m := range menus {
  351. if m.ButtonCode != "" {
  352. menuMap[m.ButtonCode] = true
  353. }
  354. }
  355. if req.ClassifyId <= 0 {
  356. resp.Fail("参数错误", c)
  357. return
  358. }
  359. ob := new(eta.Classify)
  360. item, err := ob.GetClassifyById(req.ClassifyId)
  361. if err != nil {
  362. if err == utils.ErrNoRow {
  363. resp.Fail("分类不存在", c)
  364. return
  365. }
  366. resp.FailData("获取信息失败", "Err:"+err.Error(), c)
  367. return
  368. }
  369. if item == nil {
  370. resp.Fail("分类不存在", c)
  371. return
  372. }
  373. if menuMap[eta.MenuSpecialHandleClassifyShowType] && item.ParentId != 0 && req.ShowType == 0 {
  374. resp.Fail("展示类型不可为空", c)
  375. return
  376. }
  377. if menuMap[eta.MenuSpecialHandleClassifyReportImgs] && (req.ShowType == 1 || req.ShowType == 3) && req.YbRightBanner == "" && item.ParentId == 0 { //当一级报告分类为列表、品种时,增加“报告合集配图”的配置项
  378. resp.Fail("报告合集配图不可为空", c)
  379. return
  380. }
  381. //originRelateTel := item.RelateTel
  382. item.ModifyTime = time.Now().Local()
  383. /*item.Abstract = req.Abstract
  384. item.Descript = req.Descript
  385. item.ReportAuthor = req.ReportAuthor
  386. item.AuthorDescript = req.AuthorDescript
  387. item.ColumnImgUrl = req.ColumnImgUrl
  388. item.HeadImgUrl = req.HeadImgUrl
  389. item.AvatarImgUrl = req.AvatarImgUrl
  390. item.ReportImgUrl = req.ReportImgUrl
  391. item.HomeImgUrl = req.HomeImgUrl*/
  392. item.ClassifyLabel = req.ClassifyLabel
  393. item.ShowType = req.ShowType
  394. /* item.HasTeleconference = req.HasTeleconference
  395. item.VipTitle = req.VipTitle*/
  396. // item.Sort = req.Sort
  397. item.IsShow = req.IsShow
  398. item.YbFiccSort = req.YbFiccSort
  399. item.YbFiccIcon = req.YbFiccIcon
  400. item.YbFiccPcIcon = req.YbFiccPcIcon
  401. item.YbIconUrl = req.YbIconUrl
  402. item.YbBgUrl = req.YbBgUrl
  403. item.YbListImg = req.YbListImg
  404. item.YbShareBgImg = req.YbShareBgImg
  405. item.YbRightBanner = req.YbRightBanner
  406. item.RelateTel = req.RelateTel
  407. item.RelateVideo = req.RelateVideo
  408. item.ModifyTime = time.Now().Local()
  409. // 报告详情的展示类型:1-拼接;2:目录
  410. if req.ReportDetailShowType > 0 {
  411. item.ReportDetailShowType = req.ReportDetailShowType
  412. }
  413. cols := make([]string, 0)
  414. /*cols = append(cols, "Abstract", "Descript", "ReportAuthor", "AuthorDescript", "ColumnImgUrl",
  415. "HeadImgUrl", "AvatarImgUrl", "ReportImgUrl", "HomeImgUrl", "ClassifyLabel", "ShowType", "HasTeleconference", "VipTitle",
  416. "IsShow", "YbFiccSort", "YbFiccIcon", "YbFiccPcIcon", "YbIconUrl", "YbBgUrl", "YbListImg", "YbShareBgImg", "YbRightBanner",
  417. "RelateTel", "RelateVideo", "ModifyTime")*/
  418. cols = append(cols, "ClassifyLabel", "ShowType",
  419. "IsShow", "YbFiccSort", "YbFiccIcon", "YbFiccPcIcon", "YbIconUrl", "YbBgUrl", "YbListImg", "YbShareBgImg", "YbRightBanner",
  420. "RelateTel", "RelateVideo", "ModifyTime", "ReportDetailShowType")
  421. if e = item.UpdateClassify(cols); e != nil {
  422. resp.FailData("修改失败", "Err:"+e.Error(), c)
  423. return
  424. }
  425. // 一级分类关联设置会强制修改二级分类的所有关联设置
  426. if item.ParentId == 0 {
  427. if e = item.UpdateChildClassifyRelateSetting(item.Id, req.RelateTel, req.RelateVideo); e != nil {
  428. resp.FailData("更新二级分类关联设置失败", "更新二级分类关联设置失败 Err:"+err.Error(), c)
  429. return
  430. }
  431. }
  432. // 为二级分类时, 更新父级分类是否含电话会字段
  433. /*if item.ParentId > 0 {
  434. go func() {
  435. _ = eta2.UpdateParentClassifyHasTel(req.ClassifyId, item.ParentId, req.HasTeleconference)
  436. }()
  437. }*/
  438. // 获取编辑前子目录列表
  439. classifyId := item.Id
  440. var menuCond string
  441. var menuPars []interface{}
  442. menuCond += ` classify_id = ?`
  443. menuPars = append(menuPars, classifyId)
  444. menuOb := new(eta.ClassifyMenu)
  445. menuList, e := menuOb.GetClassifyMenuList(menuCond, menuPars)
  446. if e != nil {
  447. resp.FailData("保存失败", "获取分类子目录列表失败, Err:"+err.Error(), c)
  448. return
  449. }
  450. oriMenuIds := make([]int, 0)
  451. for i := range menuList {
  452. oriMenuIds = append(oriMenuIds, menuList[i].MenuId)
  453. }
  454. // 一级分类-新增/编辑/删除子目录
  455. if item.ParentId == 0 && len(req.MenuList) > 0 {
  456. nowTime := time.Now().Local()
  457. insertMenus := make([]*eta.ClassifyMenu, 0)
  458. editMenus := make([]*eta.ClassifyMenu, 0)
  459. deleteMenuIds := make([]int, 0)
  460. menuIds := make([]int, 0)
  461. for i := range req.MenuList {
  462. m := req.MenuList[i]
  463. v := new(eta.ClassifyMenu)
  464. v.MenuName = req.MenuList[i].MenuName
  465. v.ClassifyId = classifyId
  466. v.Sort = i + 1
  467. v.MenuId = m.MenuId
  468. v.ModifyTime = nowTime
  469. if v.MenuId > 0 {
  470. // 编辑
  471. editMenus = append(editMenus, v)
  472. menuIds = append(menuIds, m.MenuId)
  473. } else {
  474. // 新增
  475. v.CreateTime = nowTime
  476. insertMenus = append(insertMenus, v)
  477. }
  478. }
  479. // 编辑前存在子目录则取"编辑前子目录IDs与编辑时子目录IDs的差集"作为删除IDs
  480. if len(oriMenuIds) > 0 {
  481. deleteMenuIds = utils.MinusInt(oriMenuIds, menuIds)
  482. }
  483. if e = eta.InsertAndUpdateClassifyMenu(insertMenus, editMenus, deleteMenuIds); e != nil {
  484. resp.FailData("保存失败", "新增/编辑/删除分类子目录失败, Err:"+e.Error(), c)
  485. return
  486. }
  487. }
  488. // 二级分类-新增子目录关联
  489. if item.ParentId > 0 {
  490. if e := eta.DeleteAndInsertClassifyMenuRelation(classifyId, req.ClassifyMenuId); e != nil {
  491. resp.FailData("新增子目录关联失败", "新增子目录关联失败 Err:"+e.Error(), c)
  492. return
  493. }
  494. }
  495. resp.Ok("操作成功", c)
  496. }