classify.go 31 KB

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