report_ice_message.go 15 KB

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