report_ice_message.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  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. reportTitle := c.GetString("ReportTitle")
  112. if pageSize <= 0 {
  113. pageSize = utils.PageSize20
  114. }
  115. if currentIndex <= 0 {
  116. currentIndex = 1
  117. }
  118. startSize := utils.StartIndex(currentIndex, pageSize)
  119. condition := ""
  120. pars := make([]interface{}, 0)
  121. if sendTime != "" {
  122. // 校验时间格式
  123. _, err := time.Parse(utils.FormatDate, sendTime)
  124. if err != nil {
  125. br.Msg = "时间格式错误"
  126. br.ErrMsg = "时间格式错误,Err:" + err.Error()
  127. return
  128. }
  129. startTime, _ := time.Parse(utils.FormatDate, sendTime)
  130. endTime := startTime.AddDate(0, 0, 1)
  131. condition += " AND send_time >= ? and send_time < ?"
  132. pars = append(pars, startTime)
  133. pars = append(pars, endTime)
  134. }
  135. if classifyId > 0 {
  136. condition += " AND classify_id = ?"
  137. pars = append(pars, classifyId)
  138. }
  139. if classifyType > 0 {
  140. condition += " AND classify_type = ?"
  141. pars = append(pars, classifyType)
  142. }
  143. if sendStatus > 0 {
  144. condition += " AND status = ?"
  145. pars = append(pars, sendStatus)
  146. }
  147. if reportTitle != "" {
  148. condition += " AND report_title like ?"
  149. pars = append(pars, "%"+reportTitle+"%")
  150. }
  151. recordObj := new(models.ReportMessageRecord)
  152. total, err := recordObj.GetListCount(condition, pars)
  153. if err != nil {
  154. br.Msg = "查询失败"
  155. br.ErrMsg = "查询失败,Err:" + err.Error()
  156. return
  157. }
  158. tmpList, err := recordObj.GetList(condition, pars, startSize, pageSize)
  159. if err != nil {
  160. br.Msg = "查询失败"
  161. br.ErrMsg = "查询失败,Err:" + err.Error()
  162. return
  163. }
  164. // 获取分类名称
  165. classifyFullNameMap := make(map[int]string)
  166. // 有三级分类,想要获取全称,一级/二级/三级
  167. classifyList, err := models.GetAllClassifyOrderByLevel()
  168. if err != nil {
  169. br.Msg = "查询失败"
  170. br.ErrMsg = "查询失败,Err:" + err.Error()
  171. return
  172. }
  173. for _, item := range classifyList {
  174. if item.ParentId == 0 {
  175. classifyFullNameMap[item.Id] = item.ClassifyName
  176. }else if item.ParentId >0 {
  177. parentClassifyName, ok := classifyFullNameMap[item.ParentId]
  178. if ok {
  179. classifyFullNameMap[item.Id] = parentClassifyName + "/" + item.ClassifyName
  180. }
  181. }
  182. }
  183. // 查找账号名称
  184. adminIds := make([]int, 0)
  185. adminNameMap := make(map[int]string)
  186. for _, item := range tmpList {
  187. adminIds = append(adminIds, int(item.SendAdminId), int(item.ReceiveAdminId))
  188. }
  189. adminList, err := system.GetAdminListByIdList(adminIds)
  190. if err != nil {
  191. br.Msg = "查询失败"
  192. br.ErrMsg = "查询失败,Err:" + err.Error()
  193. return
  194. }
  195. for _, item := range adminList {
  196. adminNameMap[int(item.AdminId)] = item.RealName
  197. }
  198. list := make([]*models.ReportIceMsgRecordListItem, 0)
  199. for _, item := range tmpList {
  200. list = append(list, &models.ReportIceMsgRecordListItem{
  201. MessageId: item.MessageId,
  202. ReportId: item.ReportId,
  203. ReportTitle: item.ReportTitle,
  204. PptId: item.PptId,
  205. ClassifyId: item.ClassifyId,
  206. ClassifyFullName: classifyFullNameMap[item.ClassifyId],
  207. SendAdminId: item.SendAdminId,
  208. SendAdminName: adminNameMap[int(item.SendAdminId)],
  209. ReceiveAdminId: item.ReceiveAdminId,
  210. ReceiveAdminName: adminNameMap[int(item.ReceiveAdminId)],
  211. ClassifyType: item.ClassifyType,
  212. SendTime: item.SendTime.Format(utils.FormatDateTime),
  213. Status: item.Status,
  214. CreateTime: item.CreateTime.Format(utils.FormatDateTime),
  215. })
  216. }
  217. page := paging.GetPaging(currentIndex, pageSize, total)
  218. resp := new(models.ReportIceMsgRecordListResp)
  219. resp.Paging = page
  220. resp.List = list
  221. br.Ret = 200
  222. br.Success = true
  223. br.Msg = "获取成功"
  224. br.Data = resp
  225. }
  226. // 消息推送
  227. // @Title 消息推送
  228. // @Description 消息推送
  229. // @Param Id query int true "版本ID"
  230. // @Success 200 {object} models.ReportIceMsgConfigReq
  231. // @router /ice_msg/push [post]
  232. func (c *ReportIceMessageController) IceMsgPush() {
  233. br := new(models.BaseResponse).Init()
  234. defer func() {
  235. c.Data["json"] = br
  236. c.ServeJSON()
  237. }()
  238. sysUser := c.SysUser
  239. if sysUser == nil {
  240. br.Msg = "请登录"
  241. br.ErrMsg = "请登录,SysUser Is Empty"
  242. br.Ret = 408
  243. return
  244. }
  245. var req models.ReportIceMsgPushReq
  246. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  247. if err != nil {
  248. br.Msg = "参数解析异常!"
  249. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  250. return
  251. }
  252. sendClassifyId := 0
  253. classifyType := 1
  254. if req.ReportId > 0 {
  255. classifyType = 1
  256. }else if req.PptId > 0 {
  257. classifyType = 2
  258. }
  259. // 新增缓存判断消息还在处理中
  260. cacheKey := fmt.Sprintf("%s_%d_%d", utils.CACHE_REPORT_ICE_MSG_PUSH, req.ReportId, req.PptId)
  261. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  262. br.Msg = "系统处理中,请稍后重试!"
  263. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  264. return
  265. }
  266. defer func() {
  267. _ = utils.Rc.Delete(cacheKey)
  268. }()
  269. var title, summary, content string
  270. var reportInfo *models.Report
  271. var pptInfo *models.PptV2
  272. var classifyName string
  273. var url string
  274. successAdminMap := make(map[int]struct{})
  275. // 根据类型判断
  276. if classifyType == 1 {// 推送研报
  277. if req.ReportId <= 0 {
  278. br.Msg = "研报ID不能为空"
  279. return
  280. }
  281. //查询研报
  282. reportInfo, err = models.GetBaseReportInfoByReportId(int(req.ReportId))
  283. if err != nil {
  284. if !utils.IsErrNoRow(err) {
  285. br.Msg = "查询失败"
  286. br.ErrMsg = "查询失败,Err:" + err.Error()
  287. return
  288. }else{
  289. br.Msg = "研报不存在"
  290. return
  291. }
  292. }
  293. //判断研报状态,只有已发布的研报和已审核的研报才能推动
  294. if reportInfo.State != 2 && reportInfo.State != 6 {
  295. br.Msg = "该研报未发布,请发布后重试"
  296. return
  297. }
  298. sendClassifyId = reportInfo.ClassifyIdThird
  299. if sendClassifyId <= 0 {
  300. sendClassifyId = reportInfo.ClassifyIdSecond
  301. }
  302. if sendClassifyId <= 0 {
  303. sendClassifyId = reportInfo.ClassifyIdFirst
  304. }
  305. title = reportInfo.Title
  306. content = reportInfo.Title
  307. url = reportInfo.DetailPdfUrl
  308. // 查询当前这篇报告成功的推送记录
  309. recordObj := new(models.ReportMessageRecord)
  310. adminIds, err := recordObj.GetSuccessRecordAdminIdsByReportId(req.ReportId, title, content, url)
  311. if err != nil {
  312. br.Msg = "查询失败"
  313. br.ErrMsg = "查询失败,Err:" + err.Error()
  314. }
  315. for _, adminId := range adminIds {
  316. successAdminMap[adminId] = struct{}{}
  317. }
  318. } else if classifyType == 2 {// 推送PPT
  319. if req.PptId <= 0 {
  320. br.Msg = "PPTID不能为空"
  321. return
  322. }
  323. // PPT
  324. pptInfo, err = models.GetBasePptV2ByPptId(int(req.PptId))
  325. if err != nil {
  326. br.Msg = "PPT不存在"
  327. return
  328. }
  329. if pptInfo.State != 2 && pptInfo.State != 6 {
  330. br.Msg = "该PPT未发布,请发布后重试"
  331. return
  332. }
  333. sendClassifyId = pptInfo.ClassifyId
  334. title = pptInfo.Title
  335. content = pptInfo.Title
  336. url = pptInfo.PptxUrl
  337. // 查询当前这篇报告成功的推送记录
  338. recordObj := new(models.ReportMessageRecord)
  339. adminIds, err := recordObj.GetSuccessRecordAdminIdsByPptId(req.PptId, title, content, url)
  340. if err != nil {
  341. br.Msg = "查询失败"
  342. br.ErrMsg = "查询失败,Err:" + err.Error()
  343. }
  344. for _, adminId := range adminIds {
  345. successAdminMap[adminId] = struct{}{}
  346. }
  347. }
  348. // 获取分类名称
  349. classify, err := models.GetClassifyById(sendClassifyId)
  350. if err != nil {
  351. if !utils.IsErrNoRow(err) {
  352. br.Msg = "查询失败"
  353. br.ErrMsg = "查询失败,Err:" + err.Error()
  354. return
  355. }else{
  356. br.Msg = "分类不存在"
  357. return
  358. }
  359. }
  360. classifyName = classify.ClassifyName
  361. // 判断该分类是否设置了消息推送配置
  362. configObj := new(models.ReportMessageConfig)
  363. config, err := configObj.GetItemByClassifyId(sendClassifyId)
  364. if err != nil {
  365. if !utils.IsErrNoRow(err) {
  366. br.Msg = "查询失败"
  367. br.ErrMsg = "查询失败,Err:" + err.Error()
  368. return
  369. }else{
  370. br.Msg = "该报告分类未设置接收人,请配置后重试"
  371. return
  372. }
  373. }
  374. if config == nil || config.ConfigId <= 0 {
  375. br.Msg = "该报告分类未设置接收人,请配置后重试"
  376. return
  377. }else if config.NotifyUsers == "" {
  378. br.Msg = "该报告分类未设置接收人,请配置后重试"
  379. return
  380. }
  381. // 获取推送人的工号
  382. adminids := strings.Split(config.NotifyUsers, ",")
  383. adminList, err := system.GetSysAdminByIdSlice(adminids)
  384. if err != nil {
  385. br.Msg = "查询失败"
  386. br.ErrMsg = "查询失败,Err:" + err.Error()
  387. return
  388. }
  389. if len(adminList) == 0 {
  390. br.Msg = "该报告分类未设置接收人,请配置后重试"
  391. return
  392. }
  393. // 生成推送记录
  394. recordList := make([]*models.ReportMessageRecord, 0)
  395. successCount := 0
  396. needPush := false
  397. for _, item := range adminList {
  398. if item.EmployeeId != "" {
  399. if _, ok := successAdminMap[int(item.AdminId)]; ok {
  400. continue
  401. }
  402. needPush = true
  403. // 推送模版消息
  404. sendStatus := 1
  405. // 生成taskId
  406. taskId := utils.MD5(fmt.Sprintf("%d_%d_%d_%s", req.ReportId, req.PptId, item.AdminId, time.Now().Format("20060102150405")))
  407. err = ice_message.PushIceMessage(title, summary, content, item.EmployeeId, taskId, req.ReportId, req.PptId, url, classifyName)
  408. if err != nil {
  409. sendStatus = 2
  410. }else{
  411. successCount++
  412. }
  413. pushRecord := &models.ReportMessageRecord{
  414. ReportId: int64(req.ReportId),
  415. PptId: int64(req.PptId),
  416. ReportTitle: title,
  417. ClassifyId: sendClassifyId,
  418. ClassifyType: int8(classifyType),
  419. SendAdminId: int64(sysUser.AdminId),
  420. SendTime: time.Now(),
  421. ReceiveAdminId: int64(item.AdminId),
  422. ReceiveAdminCode: item.EmployeeId,
  423. Status: int8(sendStatus),
  424. CreateTime: time.Now(),
  425. ModifyTime: time.Now(),
  426. TaskId: taskId,
  427. Content: content,
  428. Url: url,
  429. }
  430. recordList = append(recordList, pushRecord)
  431. }
  432. }
  433. if len(recordList) > 0 {
  434. recordObj := new(models.ReportMessageRecord)
  435. err = recordObj.BatchAdd(recordList)
  436. if err != nil {
  437. br.Msg = "推送失败"
  438. br.ErrMsg = "推送失败,Err:" + err.Error()
  439. return
  440. }
  441. }
  442. if successCount > 0 {
  443. sendTime := time.Now()
  444. // 更新报告表的推送记录
  445. if classifyType == 1 {
  446. reportInfo.MsgIsSend = 1
  447. reportInfo.MsgSendTime = sendTime
  448. err = reportInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  449. if err != nil {
  450. br.Msg = "更新推送记录失败"
  451. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  452. return
  453. }
  454. }else if classifyType == 2 {
  455. pptInfo.MsgIsSend = 1
  456. pptInfo.MsgSendTime = sendTime
  457. err = pptInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  458. if err != nil {
  459. br.Msg = "更新推送记录失败"
  460. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  461. return
  462. }
  463. }
  464. br.Msg = "推送成功"
  465. br.Success = true
  466. br.Ret = 200
  467. br.Data = &models.ReportIceMsgPushResp{
  468. MsgSendTime: sendTime,
  469. }
  470. }else{
  471. if !needPush {
  472. br.Msg = "已推送成功,请勿重复推送!"
  473. return
  474. }else{
  475. br.Msg = "推送失败"
  476. br.ErrMsg = "推送失败,Err:" + err.Error()
  477. br.Ret = 408
  478. }
  479. }
  480. }
  481. // ListClassify
  482. // @Title 获取分类列表
  483. // @Description 获取分类列表
  484. // @Param KeyWord query string true "检索关键词"
  485. // @Param ClassifyType query int false "分类类型:0-全部(默认);1-研报;2-PPT"
  486. // @Param Enabled query int false "启用状态:-1-全部(默认);0-禁用;1-启用"
  487. // @Success 200 {object} models.Classify
  488. // @router /ice_msg/classify [get]
  489. func (c *ReportIceMessageController) ListClassify() {
  490. br := new(models.BaseResponse).Init()
  491. defer func() {
  492. c.Data["json"] = br
  493. c.ServeJSON()
  494. }()
  495. classifyNames := make([]string, 0)
  496. classifyNames = append(classifyNames, utils.REPORT_ICE_MSG_CLASSIFY_NAMES...)
  497. // 获取所有分类
  498. originList, err := models.GetClassifyListByClassifyNameList(classifyNames)
  499. if err != nil {
  500. br.Msg = "获取失败"
  501. br.ErrMsg = "获取失败,Err:" + err.Error()
  502. return
  503. }
  504. //查找所有的父级分类
  505. parentIds := make([]int, 0)
  506. for _, v := range originList {
  507. // 解析levelpath
  508. levelPath := strings.Split(v.LevelPath, ",")
  509. for _, i := range levelPath {
  510. if i != "" {
  511. parentId, _ := strconv.Atoi(i)
  512. parentIds = append(parentIds, parentId)
  513. }
  514. }
  515. }
  516. originList, err = models.GetClassifyListByParentIdList(parentIds)
  517. if err != nil {
  518. br.Msg = "获取失败"
  519. br.ErrMsg = "获取失败,Err:" + err.Error()
  520. return
  521. }
  522. list := originList
  523. classifyIds := make([]int, 0)
  524. for _, v := range list {
  525. classifyIds = append(classifyIds, v.Id)
  526. }
  527. // 指定分类类型(上级中的分类类型可能与最下层的不一致,但是要把上级也一起取出来, 这需求...=_=!)'
  528. reportMsgConfigMap := make(map[int][]int)
  529. // 根据分类ID获取配置项
  530. reportMsgObj := new(models.ReportMessageConfig)
  531. configList, err := reportMsgObj.GetListByClassifyIdList(classifyIds)
  532. if err != nil {
  533. br.Msg = "获取失败"
  534. br.ErrMsg = "获取失败,Err:" + err.Error()
  535. return
  536. }
  537. for _, v := range configList {
  538. if v.NotifyUsers != "" {
  539. notifyUsers := strings.Split(v.NotifyUsers, ",")
  540. for _, user := range notifyUsers {
  541. userInt, _ := strconv.Atoi(user)
  542. reportMsgConfigMap[v.ClassifyId] = append(reportMsgConfigMap[v.ClassifyId], userInt)
  543. }
  544. }
  545. }
  546. for _, v := range list {
  547. if iceMessageUsers, ok := reportMsgConfigMap[v.Id]; ok {
  548. v.IceMsgUsers = iceMessageUsers
  549. }
  550. }
  551. // 先将分类列表排序
  552. services.SortClassifyListBySortAndCreateTime(list)
  553. // 接着转换结构
  554. list = services.GetClassifyListTreeRecursive(list, 0)
  555. // 过滤掉没有子目录的分类
  556. list = services.RecursiveFilterNoChildTreeClassify(list)
  557. resp := new(models.ClassifyListResp)
  558. resp.List = list
  559. br.Data = resp
  560. br.Ret = 200
  561. br.Success = true
  562. br.Msg = "获取成功"
  563. }