report_ice_message.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  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. // 根据类型判断
  275. if classifyType == 1 {// 推送研报
  276. if req.ReportId <= 0 {
  277. br.Msg = "研报ID不能为空"
  278. return
  279. }
  280. //查询研报
  281. reportInfo, err = models.GetBaseReportInfoByReportId(int(req.ReportId))
  282. if err != nil {
  283. if !utils.IsErrNoRow(err) {
  284. br.Msg = "查询失败"
  285. br.ErrMsg = "查询失败,Err:" + err.Error()
  286. return
  287. }else{
  288. br.Msg = "研报不存在"
  289. return
  290. }
  291. }
  292. //判断研报状态,只有已发布的研报和已审核的研报才能推动
  293. if reportInfo.State != 2 && reportInfo.State != 6 {
  294. br.Msg = "该研报未发布,请发布后重试"
  295. return
  296. }
  297. sendClassifyId = reportInfo.ClassifyIdThird
  298. if sendClassifyId <= 0 {
  299. sendClassifyId = reportInfo.ClassifyIdSecond
  300. }
  301. if sendClassifyId <= 0 {
  302. sendClassifyId = reportInfo.ClassifyIdFirst
  303. }
  304. title = reportInfo.Title
  305. content = reportInfo.Title
  306. url = reportInfo.DetailPdfUrl
  307. } else if classifyType == 2 {// 推送PPT
  308. if req.PptId <= 0 {
  309. br.Msg = "PPTID不能为空"
  310. return
  311. }
  312. // PPT
  313. pptInfo, err = models.GetBasePptV2ByPptId(int(req.PptId))
  314. if err != nil {
  315. br.Msg = "PPT不存在"
  316. return
  317. }
  318. if pptInfo.State != 2 && pptInfo.State != 6 {
  319. br.Msg = "该PPT未发布,请发布后重试"
  320. return
  321. }
  322. sendClassifyId = pptInfo.ClassifyId
  323. title = pptInfo.Title
  324. content = pptInfo.Title
  325. url = pptInfo.PptxUrl
  326. }
  327. // 获取分类名称
  328. classify, err := models.GetClassifyById(sendClassifyId)
  329. if err != nil {
  330. if !utils.IsErrNoRow(err) {
  331. br.Msg = "查询失败"
  332. br.ErrMsg = "查询失败,Err:" + err.Error()
  333. return
  334. }else{
  335. br.Msg = "分类不存在"
  336. return
  337. }
  338. }
  339. classifyName = classify.ClassifyName
  340. // 判断该分类是否设置了消息推送配置
  341. configObj := new(models.ReportMessageConfig)
  342. config, err := configObj.GetItemByClassifyId(sendClassifyId)
  343. if err != nil {
  344. if !utils.IsErrNoRow(err) {
  345. br.Msg = "查询失败"
  346. br.ErrMsg = "查询失败,Err:" + err.Error()
  347. return
  348. }else{
  349. br.Msg = "该报告分类未设置接收人,请配置后重试"
  350. return
  351. }
  352. }
  353. if config == nil || config.ConfigId <= 0 {
  354. br.Msg = "该报告分类未设置接收人,请配置后重试"
  355. return
  356. }else if config.NotifyUsers == "" {
  357. br.Msg = "该报告分类未设置接收人,请配置后重试"
  358. return
  359. }
  360. // 获取推送人的工号
  361. adminids := strings.Split(config.NotifyUsers, ",")
  362. adminList, err := system.GetSysAdminByIdSlice(adminids)
  363. if err != nil {
  364. br.Msg = "查询失败"
  365. br.ErrMsg = "查询失败,Err:" + err.Error()
  366. return
  367. }
  368. if len(adminList) == 0 {
  369. br.Msg = "该报告分类未设置接收人,请配置后重试"
  370. return
  371. }
  372. // 生成推送记录
  373. recordList := make([]*models.ReportMessageRecord, 0)
  374. successCount := 0
  375. for _, item := range adminList {
  376. if item.EmployeeId != "" {
  377. // 推送模版消息
  378. sendStatus := 1
  379. // 生成taskId
  380. taskId := utils.MD5(fmt.Sprintf("%d_%d_%d_%s", req.ReportId, req.PptId, item.AdminId, time.Now().Format("20060102150405")))
  381. err = ice_message.PushIceMessage(title, summary, content, item.EmployeeId, taskId, req.ReportId, req.PptId, url, classifyName)
  382. if err != nil {
  383. sendStatus = 2
  384. }else{
  385. successCount++
  386. }
  387. pushRecord := &models.ReportMessageRecord{
  388. ReportId: int64(req.ReportId),
  389. PptId: int64(req.PptId),
  390. ReportTitle: title,
  391. ClassifyId: sendClassifyId,
  392. ClassifyType: int8(classifyType),
  393. SendAdminId: int64(sysUser.AdminId),
  394. SendTime: time.Now(),
  395. ReceiveAdminId: int64(item.AdminId),
  396. ReceiveAdminCode: item.EmployeeId,
  397. Status: int8(sendStatus),
  398. CreateTime: time.Now(),
  399. ModifyTime: time.Now(),
  400. TaskId: taskId,
  401. }
  402. recordList = append(recordList, pushRecord)
  403. }
  404. }
  405. recordObj := new(models.ReportMessageRecord)
  406. err = recordObj.BatchAdd(recordList)
  407. if err != nil {
  408. br.Msg = "推送失败"
  409. br.ErrMsg = "推送失败,Err:" + err.Error()
  410. return
  411. }
  412. if successCount > 0 {
  413. sendTime := time.Now()
  414. // 更新报告表的推送记录
  415. if classifyType == 1 {
  416. reportInfo.MsgIsSend = 1
  417. reportInfo.MsgSendTime = sendTime
  418. err = reportInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  419. if err != nil {
  420. br.Msg = "更新推送记录失败"
  421. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  422. return
  423. }
  424. }else if classifyType == 2 {
  425. pptInfo.MsgIsSend = 1
  426. pptInfo.MsgSendTime = sendTime
  427. err = pptInfo.Update([]string{"MsgIsSend", "MsgSendTime"})
  428. if err != nil {
  429. br.Msg = "更新推送记录失败"
  430. br.ErrMsg = "更新推送记录失败,Err:" + err.Error()
  431. return
  432. }
  433. }
  434. br.Msg = "推送成功"
  435. br.Success = true
  436. br.Ret = 200
  437. br.Data = &models.ReportIceMsgPushResp{
  438. MsgSendTime: sendTime,
  439. }
  440. }else{
  441. br.Msg = "推送失败"
  442. br.ErrMsg = "推送失败,Err:" + err.Error()
  443. br.Ret = 408
  444. }
  445. }
  446. // ListClassify
  447. // @Title 获取分类列表
  448. // @Description 获取分类列表
  449. // @Param KeyWord query string true "检索关键词"
  450. // @Param ClassifyType query int false "分类类型:0-全部(默认);1-研报;2-PPT"
  451. // @Param Enabled query int false "启用状态:-1-全部(默认);0-禁用;1-启用"
  452. // @Success 200 {object} models.Classify
  453. // @router /ice_msg/classify [get]
  454. func (c *ReportIceMessageController) ListClassify() {
  455. br := new(models.BaseResponse).Init()
  456. defer func() {
  457. c.Data["json"] = br
  458. c.ServeJSON()
  459. }()
  460. classifyNames := make([]string, 0)
  461. classifyNames = append(classifyNames, utils.REPORT_ICE_MSG_CLASSIFY_NAMES...)
  462. // 获取所有分类
  463. originList, err := models.GetClassifyListByClassifyNameList(classifyNames)
  464. if err != nil {
  465. br.Msg = "获取失败"
  466. br.ErrMsg = "获取失败,Err:" + err.Error()
  467. return
  468. }
  469. //查找所有的父级分类
  470. parentIds := make([]int, 0)
  471. for _, v := range originList {
  472. // 解析levelpath
  473. levelPath := strings.Split(v.LevelPath, ",")
  474. for _, i := range levelPath {
  475. if i != "" {
  476. parentId, _ := strconv.Atoi(i)
  477. parentIds = append(parentIds, parentId)
  478. }
  479. }
  480. }
  481. originList, err = models.GetClassifyListByParentIdList(parentIds)
  482. if err != nil {
  483. br.Msg = "获取失败"
  484. br.ErrMsg = "获取失败,Err:" + err.Error()
  485. return
  486. }
  487. list := originList
  488. classifyIds := make([]int, 0)
  489. for _, v := range list {
  490. classifyIds = append(classifyIds, v.Id)
  491. }
  492. // 指定分类类型(上级中的分类类型可能与最下层的不一致,但是要把上级也一起取出来, 这需求...=_=!)'
  493. reportMsgConfigMap := make(map[int][]int)
  494. // 根据分类ID获取配置项
  495. reportMsgObj := new(models.ReportMessageConfig)
  496. configList, err := reportMsgObj.GetListByClassifyIdList(classifyIds)
  497. if err != nil {
  498. br.Msg = "获取失败"
  499. br.ErrMsg = "获取失败,Err:" + err.Error()
  500. return
  501. }
  502. for _, v := range configList {
  503. if v.NotifyUsers != "" {
  504. notifyUsers := strings.Split(v.NotifyUsers, ",")
  505. for _, user := range notifyUsers {
  506. userInt, _ := strconv.Atoi(user)
  507. reportMsgConfigMap[v.ClassifyId] = append(reportMsgConfigMap[v.ClassifyId], userInt)
  508. }
  509. }
  510. }
  511. for _, v := range list {
  512. if iceMessageUsers, ok := reportMsgConfigMap[v.Id]; ok {
  513. v.IceMsgUsers = iceMessageUsers
  514. }
  515. }
  516. // 先将分类列表排序
  517. services.SortClassifyListBySortAndCreateTime(list)
  518. // 接着转换结构
  519. list = services.GetClassifyListTreeRecursive(list, 0)
  520. // 过滤掉没有子目录的分类
  521. list = services.RecursiveFilterNoChildTreeClassify(list)
  522. resp := new(models.ClassifyListResp)
  523. resp.List = list
  524. br.Data = resp
  525. br.Ret = 200
  526. br.Success = true
  527. br.Msg = "获取成功"
  528. }