report_ice_message.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/models"
  5. "eta_gn/eta_api/models/system"
  6. "eta_gn/eta_api/services"
  7. "eta_gn/eta_api/services/ice_message"
  8. "eta_gn/eta_api/utils"
  9. "fmt"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/rdlucklib/rdluck_tools/paging"
  14. )
  15. type ReportIceMessageController struct {
  16. BaseAuthController
  17. }
  18. // MsgConfig
  19. // @Title 消息推送配置
  20. // @Description 消息推送配置
  21. // @Param Id query int true "版本ID"
  22. // @Success 200 {object} models.ReportIceMsgConfigReq
  23. // @router /ice_msg/config [post]
  24. func (c *ReportIceMessageController) IceMsgConfig() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. c.Data["json"] = br
  28. c.ServeJSON()
  29. }()
  30. var req models.ReportIceMsgConfigReq
  31. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  32. if err != nil {
  33. br.Msg = "参数解析异常!"
  34. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  35. return
  36. }
  37. if req.ClassifyId <= 0 {
  38. br.Msg = "分类ID不能为空"
  39. return
  40. }
  41. if len(req.NotifyUsers) == 0 {
  42. br.Msg = "通知用户列表不能为空"
  43. return
  44. }
  45. configObj := new(models.ReportMessageConfig)
  46. // 获取配置
  47. config, err := configObj.GetItemByClassifyId(req.ClassifyId)
  48. if err != nil && !utils.IsErrNoRow(err) {
  49. br.Msg = "获取配置失败"
  50. br.ErrMsg = "获取配置失败,Err:" + err.Error()
  51. return
  52. }
  53. if config == nil || config.ConfigId <= 0 {
  54. notifyUsers := make([]string, 0)
  55. for _, id := range req.NotifyUsers {
  56. uid := strconv.Itoa(id)
  57. notifyUsers = append(notifyUsers, uid)
  58. }
  59. // 新增配置
  60. config = &models.ReportMessageConfig{
  61. ClassifyId: req.ClassifyId,
  62. NotifyUsers: strings.Join(notifyUsers, ","),
  63. CreateTime: time.Now(),
  64. ModifyTime: time.Now(),
  65. }
  66. err = config.Create()
  67. if err != nil {
  68. br.Msg = "新增配置失败"
  69. br.ErrMsg = "新增配置失败,Err:" + err.Error()
  70. return
  71. }
  72. } else {
  73. // 更新配置
  74. notifyUsers := make([]string, 0)
  75. for _, id := range req.NotifyUsers {
  76. uid := strconv.Itoa(id)
  77. notifyUsers = append(notifyUsers, uid)
  78. }
  79. config.NotifyUsers = strings.Join(notifyUsers, ",")
  80. config.ModifyTime = time.Now()
  81. err = config.Update([]string{"notify_users", "modify_time"})
  82. if err != nil {
  83. br.Msg = "更新配置失败"
  84. br.ErrMsg = "更新配置失败,Err:" + err.Error()
  85. return
  86. }
  87. }
  88. br.Msg = "操作成功"
  89. br.Ret = 200
  90. br.Success = true
  91. }
  92. // MsgRecord
  93. // @Title 消息推送记录
  94. // @Description 消息推送记录
  95. // @Param Id query int true "版本ID"
  96. // @Success 200 {object} models.ReportIceMsgConfigReq
  97. // @router /ice_msg/record [get]
  98. func (c *ReportIceMessageController) IceMsgRecord() {
  99. br := new(models.BaseResponse).Init()
  100. defer func() {
  101. c.Data["json"] = br
  102. c.ServeJSON()
  103. }()
  104. // 根据分类ID,分类类型,推送状态,推送时间,分页查询
  105. pageSize, _ := c.GetInt("PageSize")
  106. currentIndex, _ := c.GetInt("CurrentIndex")
  107. classifyId, _ := c.GetInt("ClassifyId")
  108. classifyType, _ := c.GetInt("ClassifyType")
  109. sendStatus, _ := c.GetInt("Status")
  110. sendTime := c.GetString("SendTime")
  111. if pageSize <= 0 {
  112. pageSize = utils.PageSize20
  113. }
  114. if currentIndex <= 0 {
  115. currentIndex = 1
  116. }
  117. startSize := utils.StartIndex(currentIndex, pageSize)
  118. condition := ""
  119. pars := make([]interface{}, 0)
  120. if sendTime != "" {
  121. // 校验时间格式
  122. _, err := time.Parse(utils.FormatDate, sendTime)
  123. if err != nil {
  124. br.Msg = "时间格式错误"
  125. br.ErrMsg = "时间格式错误,Err:" + err.Error()
  126. return
  127. }
  128. startTime, _ := time.Parse(utils.FormatDate, sendTime)
  129. endTime := startTime.AddDate(0, 0, 1)
  130. condition += " AND send_time >= ? and send_time < ?"
  131. pars = append(pars, startTime)
  132. pars = append(pars, endTime)
  133. }
  134. if classifyId > 0 {
  135. condition += " AND classify_id = ?"
  136. pars = append(pars, classifyId)
  137. }
  138. if classifyType > 0 {
  139. condition += " AND classify_type = ?"
  140. pars = append(pars, classifyType)
  141. }
  142. if sendStatus > 0 {
  143. condition += " AND status = ?"
  144. pars = append(pars, sendStatus)
  145. }
  146. recordObj := new(models.ReportMessageRecord)
  147. total, err := recordObj.GetListCount(condition, pars)
  148. if err != nil {
  149. br.Msg = "查询失败"
  150. br.ErrMsg = "查询失败,Err:" + err.Error()
  151. return
  152. }
  153. tmpList, err := recordObj.GetList(condition, pars, startSize, pageSize)
  154. if err != nil {
  155. br.Msg = "查询失败"
  156. br.ErrMsg = "查询失败,Err:" + err.Error()
  157. return
  158. }
  159. // 获取分类名称
  160. classifyFullNameMap := make(map[int]string)
  161. // 有三级分类,想要获取全称,一级/二级/三级
  162. classifyList, err := models.GetAllClassifyOrderByLevel()
  163. if err != nil {
  164. br.Msg = "查询失败"
  165. br.ErrMsg = "查询失败,Err:" + err.Error()
  166. return
  167. }
  168. for _, item := range classifyList {
  169. if item.ParentId == 0 {
  170. classifyFullNameMap[item.Id] = item.ClassifyName
  171. }else if item.ParentId >0 {
  172. parentClassifyName, ok := classifyFullNameMap[item.ParentId]
  173. if ok {
  174. classifyFullNameMap[item.Id] = parentClassifyName + "/" + item.ClassifyName
  175. }
  176. }
  177. }
  178. // 查找账号名称
  179. adminIds := make([]int, 0)
  180. adminNameMap := make(map[int]string)
  181. for _, item := range tmpList {
  182. adminIds = append(adminIds, int(item.SendAdminId), int(item.ReceiveAdminId))
  183. }
  184. adminList, err := system.GetAdminListByIdList(adminIds)
  185. if err != nil {
  186. br.Msg = "查询失败"
  187. br.ErrMsg = "查询失败,Err:" + err.Error()
  188. return
  189. }
  190. for _, item := range adminList {
  191. adminNameMap[int(item.AdminId)] = item.RealName
  192. }
  193. list := make([]*models.ReportIceMsgRecordListItem, 0)
  194. for _, item := range tmpList {
  195. list = append(list, &models.ReportIceMsgRecordListItem{
  196. MessageId: item.MessageId,
  197. ReportId: item.ReportId,
  198. ReportTitle: item.ReportTitle,
  199. PptId: item.PptId,
  200. ClassifyId: item.ClassifyId,
  201. ClassifyFullName: classifyFullNameMap[item.ClassifyId],
  202. SendAdminId: item.SendAdminId,
  203. SendAdminName: adminNameMap[int(item.SendAdminId)],
  204. ReceiveAdminId: item.ReceiveAdminId,
  205. ReceiveAdminName: adminNameMap[int(item.ReceiveAdminId)],
  206. ClassifyType: item.ClassifyType,
  207. SendTime: item.SendTime.Format(utils.FormatDateTime),
  208. Status: item.Status,
  209. CreateTime: item.CreateTime.Format(utils.FormatDateTime),
  210. })
  211. }
  212. page := paging.GetPaging(currentIndex, pageSize, total)
  213. resp := new(models.ReportIceMsgRecordListResp)
  214. resp.Paging = page
  215. resp.List = list
  216. br.Ret = 200
  217. br.Success = true
  218. br.Msg = "获取成功"
  219. br.Data = resp
  220. }
  221. // 消息推送
  222. // @Title 消息推送
  223. // @Description 消息推送
  224. // @Param Id query int true "版本ID"
  225. // @Success 200 {object} models.ReportIceMsgConfigReq
  226. // @router /ice_msg/push [post]
  227. func (c *ReportIceMessageController) IceMsgPush() {
  228. br := new(models.BaseResponse).Init()
  229. defer func() {
  230. c.Data["json"] = br
  231. c.ServeJSON()
  232. }()
  233. sysUser := c.SysUser
  234. if sysUser == nil {
  235. br.Msg = "请登录"
  236. br.ErrMsg = "请登录,SysUser Is Empty"
  237. br.Ret = 408
  238. return
  239. }
  240. var req models.ReportIceMsgPushReq
  241. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  242. if err != nil {
  243. br.Msg = "参数解析异常!"
  244. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  245. return
  246. }
  247. sendClassifyId := 0
  248. classifyType := 1
  249. if req.ReportId > 0 {
  250. classifyType = 1
  251. }else if req.PptId > 0 {
  252. classifyType = 2
  253. }
  254. // 新增缓存判断消息还在处理中
  255. cacheKey := fmt.Sprintf("%s_%d_%d", utils.CACHE_REPORT_ICE_MSG_PUSH, req.ReportId, req.PptId)
  256. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  257. br.Msg = "系统处理中,请稍后重试!"
  258. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  259. return
  260. }
  261. defer func() {
  262. _ = utils.Rc.Delete(cacheKey)
  263. }()
  264. var title, summary, content string
  265. var reportInfo *models.Report
  266. var pptInfo *models.PptV2
  267. var classifyName string
  268. var url string
  269. // 根据类型判断
  270. if classifyType == 1 {// 推送研报
  271. if req.ReportId <= 0 {
  272. br.Msg = "研报ID不能为空"
  273. return
  274. }
  275. //查询研报
  276. reportInfo, err = models.GetBaseReportInfoByReportId(int(req.ReportId))
  277. if err != nil {
  278. if !utils.IsErrNoRow(err) {
  279. br.Msg = "查询失败"
  280. br.ErrMsg = "查询失败,Err:" + err.Error()
  281. return
  282. }else{
  283. br.Msg = "研报不存在"
  284. return
  285. }
  286. }
  287. //判断研报状态,只有已发布的研报和已审核的研报才能推动
  288. if reportInfo.State != 2 && reportInfo.State != 6 {
  289. br.Msg = "该研报未发布,请发布后重试"
  290. return
  291. }
  292. sendClassifyId = reportInfo.ClassifyIdThird
  293. if sendClassifyId <= 0 {
  294. sendClassifyId = reportInfo.ClassifyIdSecond
  295. }
  296. if sendClassifyId <= 0 {
  297. sendClassifyId = reportInfo.ClassifyIdFirst
  298. }
  299. title = reportInfo.Title
  300. content = reportInfo.Title
  301. url = reportInfo.DetailPdfUrl
  302. } else if classifyType == 2 {// 推送PPT
  303. if req.PptId <= 0 {
  304. br.Msg = "PPTID不能为空"
  305. return
  306. }
  307. // PPT
  308. pptInfo, err = models.GetBasePptV2ByPptId(int(req.PptId))
  309. if err != nil {
  310. br.Msg = "PPT不存在"
  311. return
  312. }
  313. if pptInfo.State != 2 && pptInfo.State != 6 {
  314. br.Msg = "该PPT未发布,请发布后重试"
  315. return
  316. }
  317. sendClassifyId = pptInfo.ClassifyId
  318. title = pptInfo.Title
  319. content = pptInfo.Title
  320. url = pptInfo.PptxUrl
  321. }
  322. // 获取分类名称
  323. classify, err := models.GetClassifyById(sendClassifyId)
  324. if err != nil {
  325. if !utils.IsErrNoRow(err) {
  326. br.Msg = "查询失败"
  327. br.ErrMsg = "查询失败,Err:" + err.Error()
  328. return
  329. }else{
  330. br.Msg = "分类不存在"
  331. return
  332. }
  333. }
  334. classifyName = classify.ClassifyName
  335. // 判断该分类是否设置了消息推送配置
  336. configObj := new(models.ReportMessageConfig)
  337. config, err := configObj.GetItemByClassifyId(sendClassifyId)
  338. if err != nil {
  339. if !utils.IsErrNoRow(err) {
  340. br.Msg = "查询失败"
  341. br.ErrMsg = "查询失败,Err:" + err.Error()
  342. return
  343. }else{
  344. br.Msg = "该报告分类未设置接收人,请配置后重试"
  345. return
  346. }
  347. }
  348. if config == nil || config.ConfigId <= 0 {
  349. br.Msg = "该报告分类未设置接收人,请配置后重试"
  350. return
  351. }else if config.NotifyUsers == "" {
  352. br.Msg = "该报告分类未设置接收人,请配置后重试"
  353. return
  354. }
  355. // 获取推送人的工号
  356. adminids := strings.Split(config.NotifyUsers, ",")
  357. adminList, err := system.GetSysAdminByIdSlice(adminids)
  358. if err != nil {
  359. br.Msg = "查询失败"
  360. br.ErrMsg = "查询失败,Err:" + err.Error()
  361. return
  362. }
  363. if len(adminList) == 0 {
  364. br.Msg = "该报告分类未设置接收人,请配置后重试"
  365. return
  366. }
  367. // 生成推送记录
  368. recordList := make([]*models.ReportMessageRecord, 0)
  369. successCount := 0
  370. for _, item := range adminList {
  371. if item.EmployeeId != "" {
  372. // 推送模版消息
  373. sendStatus := 1
  374. // 生成taskId
  375. taskId := utils.MD5(fmt.Sprintf("%d_%d_%d_%s", req.ReportId, req.PptId, item.AdminId, time.Now().Format("20060102150405")))
  376. err = ice_message.PushIceMessage(title, summary, content, item.EmployeeId, taskId, req.ReportId, req.PptId, url, classifyName)
  377. if err != nil {
  378. sendStatus = 2
  379. }else{
  380. successCount++
  381. }
  382. pushRecord := &models.ReportMessageRecord{
  383. ReportId: int64(req.ReportId),
  384. PptId: int64(req.PptId),
  385. ReportTitle: title,
  386. ClassifyId: sendClassifyId,
  387. ClassifyType: int8(classifyType),
  388. SendAdminId: int64(sysUser.AdminId),
  389. SendTime: time.Now(),
  390. ReceiveAdminId: int64(item.AdminId),
  391. ReceiveAdminCode: item.EmployeeId,
  392. Status: int8(sendStatus),
  393. CreateTime: time.Now(),
  394. ModifyTime: time.Now(),
  395. TaskId: taskId,
  396. }
  397. recordList = append(recordList, pushRecord)
  398. }
  399. }
  400. recordObj := new(models.ReportMessageRecord)
  401. err = recordObj.BatchAdd(recordList)
  402. if err != nil {
  403. br.Msg = "推送失败"
  404. br.ErrMsg = "推送失败,Err:" + err.Error()
  405. return
  406. }
  407. if successCount > 0 {
  408. // 更新报告表的推送记录
  409. if classifyType == 1 {
  410. reportInfo.MsgIsSend = 1
  411. reportInfo.MsgSendTime = time.Now()
  412. err = reportInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  413. if err != nil {
  414. br.Msg = "更新推送记录失败"
  415. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  416. return
  417. }
  418. }else if classifyType == 2 {
  419. pptInfo.MsgIsSend = 1
  420. pptInfo.MsgSendTime = time.Now()
  421. err = pptInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  422. if err != nil {
  423. br.Msg = "更新推送记录失败"
  424. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  425. return
  426. }
  427. }
  428. br.Msg = "推送成功"
  429. br.Success = true
  430. br.Ret = 200
  431. }else{
  432. br.Msg = "推送失败"
  433. br.ErrMsg = "推送失败,Err:" + err.Error()
  434. br.Ret = 408
  435. }
  436. }
  437. // ListClassify
  438. // @Title 获取分类列表
  439. // @Description 获取分类列表
  440. // @Param KeyWord query string true "检索关键词"
  441. // @Param ClassifyType query int false "分类类型:0-全部(默认);1-研报;2-PPT"
  442. // @Param Enabled query int false "启用状态:-1-全部(默认);0-禁用;1-启用"
  443. // @Success 200 {object} models.Classify
  444. // @router /ice_msg/classify [get]
  445. func (c *ReportIceMessageController) ListClassify() {
  446. br := new(models.BaseResponse).Init()
  447. defer func() {
  448. c.Data["json"] = br
  449. c.ServeJSON()
  450. }()
  451. classifyNames := make([]string, 0)
  452. classifyNames = append(classifyNames, utils.REPORT_ICE_MSG_CLASSIFY_NAMES...)
  453. // 获取所有分类
  454. originList, err := models.GetClassifyListByClassifyNameList(classifyNames)
  455. if err != nil {
  456. br.Msg = "获取失败"
  457. br.ErrMsg = "获取失败,Err:" + err.Error()
  458. return
  459. }
  460. //查找所有的父级分类
  461. parentIds := make([]int, 0)
  462. for _, v := range originList {
  463. // 解析levelpath
  464. levelPath := strings.Split(v.LevelPath, ",")
  465. for _, i := range levelPath {
  466. if i != "" {
  467. parentId, _ := strconv.Atoi(i)
  468. parentIds = append(parentIds, parentId)
  469. }
  470. }
  471. }
  472. originList, err = models.GetClassifyListByParentIdList(parentIds)
  473. if err != nil {
  474. br.Msg = "获取失败"
  475. br.ErrMsg = "获取失败,Err:" + err.Error()
  476. return
  477. }
  478. list := originList
  479. classifyIds := make([]int, 0)
  480. for _, v := range list {
  481. classifyIds = append(classifyIds, v.Id)
  482. }
  483. // 指定分类类型(上级中的分类类型可能与最下层的不一致,但是要把上级也一起取出来, 这需求...=_=!)'
  484. reportMsgConfigMap := make(map[int][]int)
  485. // 根据分类ID获取配置项
  486. reportMsgObj := new(models.ReportMessageConfig)
  487. configList, err := reportMsgObj.GetListByClassifyIdList(classifyIds)
  488. if err != nil {
  489. br.Msg = "获取失败"
  490. br.ErrMsg = "获取失败,Err:" + err.Error()
  491. return
  492. }
  493. for _, v := range configList {
  494. if v.NotifyUsers != "" {
  495. notifyUsers := strings.Split(v.NotifyUsers, ",")
  496. for _, user := range notifyUsers {
  497. userInt, _ := strconv.Atoi(user)
  498. reportMsgConfigMap[v.ClassifyId] = append(reportMsgConfigMap[v.ClassifyId], userInt)
  499. }
  500. }
  501. }
  502. for _, v := range list {
  503. if iceMessageUsers, ok := reportMsgConfigMap[v.Id]; ok {
  504. v.IceMsgUsers = iceMessageUsers
  505. }
  506. }
  507. // 先将分类列表排序
  508. services.SortClassifyListBySortAndCreateTime(list)
  509. // 接着转换结构
  510. list = services.GetClassifyListTreeRecursive(list, 0)
  511. // 过滤掉没有子目录的分类
  512. list = services.RecursiveFilterNoChildTreeClassify(list)
  513. resp := new(models.ClassifyListResp)
  514. resp.List = list
  515. br.Data = resp
  516. br.Ret = 200
  517. br.Success = true
  518. br.Msg = "获取成功"
  519. }