classify.go 30 KB

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