ProclamationController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package com.xjrsoft.module.oa.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.stp.StpUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  9. import com.xjrsoft.common.annotation.XjrLog;
  10. import com.xjrsoft.common.constant.GlobalConstant;
  11. import com.xjrsoft.common.enums.DeleteMark;
  12. import com.xjrsoft.common.model.result.RT;
  13. import com.xjrsoft.common.page.ConventPage;
  14. import com.xjrsoft.common.page.PageOutput;
  15. import com.xjrsoft.common.utils.VoToColumnUtil;
  16. import com.xjrsoft.module.oa.dto.AddProclamationDto;
  17. import com.xjrsoft.module.oa.dto.ChangeNewsDto;
  18. import com.xjrsoft.module.oa.dto.DeleteNewsRelationDto;
  19. import com.xjrsoft.module.oa.dto.NewsRelationPageDto;
  20. import com.xjrsoft.module.oa.dto.NewsReplyDto;
  21. import com.xjrsoft.module.oa.dto.ProclamationPageDto;
  22. import com.xjrsoft.module.oa.dto.UpdateNewsRelationDto;
  23. import com.xjrsoft.module.oa.dto.UpdateProclamationDto;
  24. import com.xjrsoft.module.oa.entity.News;
  25. import com.xjrsoft.module.oa.entity.NewsRelation;
  26. import com.xjrsoft.module.oa.entity.NewsRelationConfig;
  27. import com.xjrsoft.module.oa.service.INewsRelationConfigService;
  28. import com.xjrsoft.module.oa.service.INewsRelationService;
  29. import com.xjrsoft.module.oa.service.INewsService;
  30. import com.xjrsoft.module.oa.vo.NewsCountTypeVo;
  31. import com.xjrsoft.module.oa.vo.NewsGradeClassTreeVo;
  32. import com.xjrsoft.module.oa.vo.NewsRelationConfigVo;
  33. import com.xjrsoft.module.oa.vo.NewsRelationVo;
  34. import com.xjrsoft.module.oa.vo.ProclamationPageVo;
  35. import com.xjrsoft.module.oa.vo.ProclamationVo;
  36. import com.xjrsoft.module.teacher.entity.XjrUser;
  37. import io.swagger.annotations.Api;
  38. import io.swagger.annotations.ApiOperation;
  39. import lombok.AllArgsConstructor;
  40. import org.springframework.web.bind.annotation.DeleteMapping;
  41. import org.springframework.web.bind.annotation.GetMapping;
  42. import org.springframework.web.bind.annotation.PostMapping;
  43. import org.springframework.web.bind.annotation.PutMapping;
  44. import org.springframework.web.bind.annotation.RequestBody;
  45. import org.springframework.web.bind.annotation.RequestMapping;
  46. import org.springframework.web.bind.annotation.RequestParam;
  47. import org.springframework.web.bind.annotation.RestController;
  48. import java.time.LocalDateTime;
  49. import java.util.ArrayList;
  50. import java.util.List;
  51. import java.util.concurrent.CompletableFuture;
  52. /**
  53. * 公告
  54. *
  55. * @author zlf
  56. * @since 2022-06-16
  57. */
  58. @RestController
  59. @RequestMapping(GlobalConstant.OA_MODULE_PREFIX + "/proclamation")
  60. @Api(value = GlobalConstant.OA_MODULE_PREFIX + "/proclamation", tags = "公告")
  61. @AllArgsConstructor
  62. public class ProclamationController {
  63. private INewsService newsService;
  64. private INewsRelationService newsRelationService;
  65. private INewsRelationConfigService newsRelationConfigService;
  66. @GetMapping(value = "/gradeClassTree")
  67. @ApiOperation(value = "公告年级班级树")
  68. @SaCheckPermission("proclamation:gradeclasstree")
  69. @XjrLog(value = "公告年级班级树")
  70. public RT<List<NewsGradeClassTreeVo>> gradeClassTree() {
  71. List<NewsGradeClassTreeVo> list = newsService.getGradeClassTree();
  72. if (ObjectUtil.isNull(list) || list.size() == 0) {
  73. return RT.error("找不到此数据!");
  74. }
  75. return RT.ok(list);
  76. }
  77. @GetMapping("/manage-box")
  78. @ApiOperation(value = "获取管理公告分页")
  79. @SaCheckPermission("proclamation:managebox")
  80. @XjrLog(value = "获取管理公告分页")
  81. public RT<PageOutput<ProclamationPageVo>> manageBox(ProclamationPageDto dto) {
  82. IPage<ProclamationPageVo> page = newsService.proclamationManageBox(dto);
  83. PageOutput<ProclamationPageVo> pageOutput = ConventPage.getPageOutput(page, ProclamationPageVo.class);
  84. return RT.ok(pageOutput);
  85. }
  86. @GetMapping("/receipt-box")
  87. @ApiOperation(value = "获取接受公告分页")
  88. @SaCheckPermission("proclamation:receiptbox")
  89. @XjrLog(value = "获取接受公告分页")
  90. public RT<PageOutput<ProclamationPageVo>> receiptBox(ProclamationPageDto dto) {
  91. IPage<ProclamationPageVo> page = newsService.proclamationReceiptBox(dto);
  92. PageOutput<ProclamationPageVo> pageOutput = ConventPage.getPageOutput(page, ProclamationPageVo.class);
  93. return RT.ok(pageOutput);
  94. }
  95. @PostMapping
  96. @ApiOperation(value = "新增公告")
  97. @SaCheckPermission("proclamation:add")
  98. @XjrLog(value = "新增公告", saveResponseData = true)
  99. public RT<Boolean> add(@RequestBody AddProclamationDto addProclamationDto) {
  100. Long newsId = newsService.addProclamation(addProclamationDto);
  101. if (newsId != -1L) {
  102. CompletableFuture.runAsync(() -> {
  103. newsService.SendMessage(newsId);
  104. });
  105. }
  106. return RT.ok(true);
  107. }
  108. @GetMapping(value = "/info")
  109. @ApiOperation(value = "公告详情")
  110. @SaCheckPermission("proclamation:info")
  111. @XjrLog(value = "公告详情", saveResponseData = true)
  112. public RT<ProclamationVo> info(@RequestParam Long id) {
  113. ProclamationVo proclamationVo = newsService.getProclamationById(id);
  114. if (proclamationVo == null) {
  115. return RT.error("该内容不存在或已被删除!");
  116. }
  117. return RT.ok(proclamationVo);
  118. }
  119. @PutMapping
  120. @ApiOperation(value = "修改公告")
  121. @SaCheckPermission("proclamation:edit")
  122. @XjrLog(value = "修改公告", saveResponseData = true)
  123. public RT<Boolean> update(@RequestBody UpdateProclamationDto updateProclamationDto) {
  124. //News news = BeanUtil.toBean(updateNewsDto, News.class);
  125. return RT.ok(newsService.updateProclamation(updateProclamationDto));
  126. }
  127. @DeleteMapping
  128. @ApiOperation(value = "删除公告")
  129. @SaCheckPermission("proclamation:delete")
  130. @XjrLog(value = "删除公告", saveResponseData = true)
  131. public RT<Boolean> delete(@RequestBody List<Long> ids) {
  132. return RT.ok(newsService.delete(ids));
  133. }
  134. @PutMapping("/change-status")
  135. @ApiOperation(value = "发布或下架公告")
  136. @SaCheckPermission("proclamation:changestatus")
  137. @XjrLog(value = "发布或下架公告", saveResponseData = true)
  138. public RT<Boolean> changeStatus(@RequestBody ChangeNewsDto changeNewsDto) {
  139. if (newsService.changeStatus(changeNewsDto)) {
  140. CompletableFuture.runAsync(() -> {
  141. newsService.SendMessage(changeNewsDto.getId());
  142. });
  143. }
  144. return RT.ok(true);
  145. }
  146. @PutMapping("/read")
  147. @ApiOperation(value = "读公告")
  148. @SaCheckPermission("proclamation:read")
  149. @XjrLog(value = "读公告", saveResponseData = true)
  150. public RT<Boolean> read(@RequestBody List<Long> ids) {
  151. List<NewsRelation> toSaveList = newsRelationService.list(
  152. Wrappers.<NewsRelation>query().lambda()
  153. .in(NewsRelation::getNewsId, ids)
  154. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
  155. for (NewsRelation newsRelation : toSaveList) {
  156. newsRelation.setReadMark(1);
  157. newsRelation.setReadDate(LocalDateTime.now());
  158. }
  159. // newsRelationService.remove(Wrappers.<NewsRelation>query().lambda()
  160. // .in(NewsRelation::getNewsId, ids)
  161. // .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
  162. return RT.ok(newsRelationService.updateBatchById(toSaveList));
  163. }
  164. @PutMapping("/reply")
  165. @ApiOperation(value = "公告回复")
  166. @SaCheckPermission("proclamation:reply")
  167. @XjrLog(value = "公告回复", saveResponseData = true)
  168. public RT<Boolean> reply(@RequestBody NewsReplyDto newsReplyDto) {
  169. NewsRelation newsRelation = newsRelationService.getOne(
  170. Wrappers.<NewsRelation>query().lambda()
  171. .eq(NewsRelation::getNewsId, newsReplyDto.getId())
  172. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
  173. if (newsRelation == null) {
  174. newsRelation = new NewsRelation();
  175. newsRelation.setNewsId(newsReplyDto.getId());
  176. newsRelation.setUserId(StpUtil.getLoginIdAsLong());
  177. newsRelation.setReadMark(1);
  178. newsRelation.setReadDate(LocalDateTime.now());
  179. newsRelation.setReplyContent(newsReplyDto.getReplyContent());
  180. return RT.ok(newsRelationService.save(newsRelation));
  181. }
  182. if (newsRelation.getReadMark() == null || newsRelation.getReadMark() == 0) {
  183. newsRelation.setReadMark(1);
  184. newsRelation.setReadDate(LocalDateTime.now());
  185. }
  186. newsRelation.setReplyContent(newsReplyDto.getReplyContent());
  187. return RT.ok(newsRelationService.updateById(newsRelation));
  188. }
  189. @GetMapping("/page-relation")
  190. @ApiOperation(value = "获取公告阅读权限分页")
  191. @SaCheckPermission("proclamation:pagerelation")
  192. @XjrLog(value = "获取公告阅读权限分页")
  193. public RT<PageOutput<NewsRelationVo>> pageRelation(NewsRelationPageDto dto) {
  194. IPage<NewsRelationVo> page = newsRelationService.selectJoinListPage(ConventPage.getPage(dto), NewsRelationVo.class,
  195. new MPJLambdaWrapper<NewsRelation>()
  196. .eq(NewsRelation::getNewsId, dto.getNewsId())
  197. .eq(ObjectUtil.isNotEmpty(dto.getReadMark()) && dto.getReadMark() > 0, NewsRelation::getReadMark, dto.getReadMark() == 1 ? 0 : 1)
  198. .isNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 1, NewsRelation::getReplyContent)
  199. .isNotNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 2, NewsRelation::getReplyContent)
  200. .select(NewsRelation::getId)
  201. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  202. .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId, ext -> ext.selectAs(XjrUser::getName, NewsRelationVo::getUserName))
  203. );
  204. PageOutput<NewsRelationVo> pageOutput = ConventPage.getPageOutput(page);
  205. return RT.ok(pageOutput);
  206. }
  207. @GetMapping("/page-relation-config")
  208. @ApiOperation(value = "获取公告权限分页")
  209. @SaCheckPermission("proclamation:pagerelationconfig")
  210. @XjrLog(value = "获取公告权限分页")
  211. public RT<PageOutput<NewsRelationConfigVo>> pageRelationConfig(NewsRelationPageDto dto) {
  212. Wrapper<NewsRelationConfig> wrapper = Wrappers.<NewsRelationConfig>query().lambda()
  213. .eq(NewsRelationConfig::getNewsId, dto.getNewsId())
  214. .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()));
  215. IPage<NewsRelationConfig> page = newsRelationConfigService.page(ConventPage.getPage(dto), wrapper);
  216. PageOutput<NewsRelationConfigVo> pageOutput = ConventPage.getPageOutput(page, NewsRelationConfigVo.class);
  217. return RT.ok(pageOutput);
  218. }
  219. @PutMapping("/update-relation")
  220. @ApiOperation(value = "设置公告阅读权限")
  221. @SaCheckPermission("proclamation:updaterelation")
  222. @XjrLog(value = "设置公告阅读权限", saveResponseData = true)
  223. public RT<Boolean> updateRelation(@RequestBody UpdateNewsRelationDto updateRelationDto) {
  224. return RT.ok(newsService.updateRelation(updateRelationDto));
  225. }
  226. @DeleteMapping("/delete-relation")
  227. @ApiOperation(value = "删除公告阅读权限")
  228. @SaCheckPermission("proclamation:deleterelation")
  229. @XjrLog(value = "删除公告阅读权限", saveResponseData = true)
  230. public RT<Boolean> deleteRelation(@RequestBody DeleteNewsRelationDto deleteNewsRelationDto) {
  231. return RT.ok(newsService.deleteRelation(deleteNewsRelationDto));
  232. }
  233. @GetMapping("/count-relation")
  234. @ApiOperation(value = "公告阅读权限统计")
  235. @SaCheckPermission("proclamation:countrelation")
  236. @XjrLog(value = "公告阅读权限统计", saveResponseData = true)
  237. public RT<Long[]> countRelation(@RequestParam Long id) {
  238. Long total = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id));
  239. Long notRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 0));
  240. Long isRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 1));
  241. Long isReply = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).isNotNull(NewsRelation::getReplyContent));
  242. Long notReply = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).isNull(NewsRelation::getReplyContent));
  243. Long[] arrayRefVar = {total, notRead, isRead, isReply, notReply};
  244. return RT.ok(arrayRefVar);
  245. }
  246. @GetMapping("/count-type")
  247. @ApiOperation(value = "未读类型统计")
  248. @SaCheckPermission("proclamation:counttype")
  249. @XjrLog(value = "未读类型统计", saveResponseData = true)
  250. public RT<List<NewsCountTypeVo>> countType() {
  251. List<NewsCountTypeVo> newsCountTypeVoList = new ArrayList<>();
  252. Integer[] typeIds = {1, 2, 3};
  253. for (Integer typeId : typeIds) {
  254. Long totalType = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()).eq(NewsRelation::getReadMark, 0).in(NewsRelation::getNewsId, "SELECT id from xjr_oa_news where delete_mark = 0 and type_id=" + typeId));
  255. NewsCountTypeVo newsCountTypeVo = new NewsCountTypeVo();
  256. newsCountTypeVo.setTypeId(typeId);
  257. newsCountTypeVo.setTotal(totalType);
  258. News news = new News();
  259. if (typeId == 1) {
  260. news = newsService.getOne(Wrappers.<News>query().lambda().eq(News::getTypeId, typeId).orderByDesc(News::getReleaseTime).last("limit 1"));
  261. }
  262. if (typeId == 2) {
  263. //找到和该登录用户有关系的最后一条公告
  264. News newsRelation = newsService.selectJoinOne(News.class,
  265. new MPJLambdaWrapper<News>()
  266. .disableSubLogicDel()
  267. .eq(News::getTypeId, typeId)
  268. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  269. .orderByDesc(News::getReleaseTime)
  270. .last("limit 1")
  271. .innerJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId));
  272. news = newsRelation;
  273. //找到晚于和该登录用户有关系的所有公告
  274. List<News> newsList = newsService.list(Wrappers.<News>query().lambda().eq(News::getTypeId, typeId).lt(News::getReleaseTime, newsRelation.getReleaseTime()).orderByDesc(News::getReleaseTime));
  275. for (News n : newsList) {
  276. if (n.getSendRange() == 1) {//是发给所有人的
  277. news = n;
  278. break;
  279. }
  280. }
  281. }
  282. if (news != null) {
  283. newsCountTypeVo.setTime(news.getReleaseTime());
  284. newsCountTypeVo.setTitle(news.getBriefHead());
  285. }
  286. newsCountTypeVoList.add(newsCountTypeVo);
  287. }
  288. return RT.ok(newsCountTypeVoList);
  289. }
  290. @GetMapping("/send-message")
  291. @ApiOperation(value = "发送消息")
  292. @SaCheckPermission("proclamation:sendmessage")
  293. @XjrLog(value = "发送消息", saveResponseData = true)
  294. public RT<Boolean> sendMessage(@RequestParam Long id) {
  295. return RT.ok(newsService.SendMessage(id));
  296. }
  297. @GetMapping("/unread-count")
  298. @ApiOperation(value = "获取登录人未读消息数量")
  299. @SaCheckPermission("proclamation:unreadcount")
  300. @XjrLog(value = "获取登录人未读消息数量", saveResponseData = true)
  301. public RT<Integer> unreadCount() {
  302. Integer count = newsService.selectJoinCount(
  303. new MPJLambdaWrapper<News>()
  304. .eq(NewsRelation::getReadMark, 0)
  305. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  306. .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
  307. .innerJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  308. );
  309. return RT.ok(count);
  310. }
  311. }