classify.go 31 KB

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