NewsController.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. package com.xjrsoft.module.oa.controller;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  10. import com.github.yulichang.toolkit.MPJWrappers;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.xjrsoft.common.annotation.XjrLog;
  13. import com.xjrsoft.common.constant.GlobalConstant;
  14. import com.xjrsoft.common.enums.DeleteMark;
  15. import com.xjrsoft.common.enums.EnabledMark;
  16. import com.xjrsoft.common.model.result.RT;
  17. import com.xjrsoft.common.page.ConventPage;
  18. import com.xjrsoft.common.page.PageOutput;
  19. import com.xjrsoft.common.utils.VoToColumnUtil;
  20. import com.xjrsoft.module.oa.dto.*;
  21. import com.xjrsoft.module.oa.entity.News;
  22. import com.xjrsoft.module.oa.entity.NewsAppendix;
  23. import com.xjrsoft.module.oa.entity.NewsRelation;
  24. import com.xjrsoft.module.oa.entity.NewsRelationConfig;
  25. import com.xjrsoft.module.oa.service.INewsAppendixService;
  26. import com.xjrsoft.module.oa.service.INewsRelationConfigService;
  27. import com.xjrsoft.module.oa.service.INewsRelationService;
  28. import com.xjrsoft.module.oa.service.INewsService;
  29. import com.xjrsoft.module.oa.vo.*;
  30. import com.xjrsoft.module.organization.entity.Department;
  31. import com.xjrsoft.module.organization.mapper.DepartmentMapper;
  32. import com.xjrsoft.module.system.entity.File;
  33. import com.xjrsoft.module.system.entity.SystemUpdateMessage;
  34. import com.xjrsoft.module.system.entity.SystemUpdateMessageNotice;
  35. import com.xjrsoft.module.system.service.IFileService;
  36. import com.xjrsoft.module.system.service.ISystemUpdateMessageService;
  37. import com.xjrsoft.module.teacher.entity.XjrUser;
  38. import io.swagger.annotations.Api;
  39. import io.swagger.annotations.ApiOperation;
  40. import lombok.AllArgsConstructor;
  41. import org.apache.commons.lang3.BooleanUtils;
  42. import org.springframework.web.bind.annotation.*;
  43. import java.time.LocalDateTime;
  44. import java.util.ArrayList;
  45. import java.util.List;
  46. /**
  47. * 新闻
  48. *
  49. * @author zlf
  50. * @since 2022-06-16
  51. */
  52. @RestController
  53. @RequestMapping(GlobalConstant.OA_MODULE_PREFIX + "/news")
  54. @Api(value = GlobalConstant.OA_MODULE_PREFIX + "/news", tags = "新闻")
  55. @AllArgsConstructor
  56. public class NewsController {
  57. private final ISystemUpdateMessageService systemUpdateMessageService;
  58. private final IFileService fileService;
  59. private INewsService newsService;
  60. private INewsRelationService newsRelationService;
  61. private INewsAppendixService newsAppendixService;
  62. private DepartmentMapper departmentMapper;
  63. private INewsRelationConfigService newsRelationConfigService;
  64. @GetMapping
  65. @ApiOperation(value = "获取新闻分页")
  66. @XjrLog(value = "获取新闻分页")
  67. public RT<PageOutput<NewsPageVo>> page(NewsPageDto dto) {
  68. Wrapper<News> wrapper = Wrappers.<News>query().lambda()
  69. .eq(News::getTypeId, dto.getType())
  70. .like(StrUtil.isNotBlank(dto.getKeyword()), News::getFullHead, dto.getKeyword())
  71. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(NewsPageVo.class).contains(x.getProperty()))
  72. .orderByDesc(News::getSendEndDate);
  73. IPage<News> page = newsService.page(ConventPage.getPage(dto), wrapper);
  74. PageOutput<NewsPageVo> pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
  75. return RT.ok(pageOutput);
  76. }
  77. @GetMapping("/manage-box")
  78. @ApiOperation(value = "获取管理新闻分页")
  79. @XjrLog(value = "获取管理新闻分页", saveRequestData = false)
  80. public RT<PageOutput<NewsPageVo>> manageBox(NewsPageDto dto) {
  81. IPage<NewsPageVo> page = newsService.manageBox(dto);
  82. PageOutput<NewsPageVo> pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
  83. return RT.ok(pageOutput);
  84. }
  85. @GetMapping("/receipt-box")
  86. @ApiOperation(value = "获取接受新闻分页")
  87. @XjrLog(value = "获取接受新闻分页")
  88. public RT<PageOutput<NewsPageVo>> receiptBox(NewsPageDto dto) {
  89. IPage<NewsPageVo> page = newsService.receiptBox(dto);
  90. for (NewsPageVo record : page.getRecords()) {
  91. File file = fileService.getOne(
  92. new QueryWrapper<File>().lambda()
  93. .eq(File::getFolderId, record.getCover())
  94. .eq(File::getDeleteMark, DeleteMark.NODELETE.getCode())
  95. );
  96. if (file == null) {
  97. continue;
  98. }
  99. record.setCoverUrl(file.getFileUrl());
  100. }
  101. PageOutput<NewsPageVo> pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
  102. return RT.ok(pageOutput);
  103. }
  104. @PostMapping
  105. @ApiOperation(value = "新增新闻")
  106. @XjrLog(value = "新增新闻", saveResponseData = true)
  107. public RT<Boolean> add(@RequestBody AddNewsDto addNewsDto) {
  108. return RT.ok(newsService.add(addNewsDto));
  109. }
  110. @GetMapping(value = "/info")
  111. @ApiOperation(value = "新闻详情")
  112. @XjrLog(value = "新闻详情", saveResponseData = true)
  113. public RT<NewsVo> info(@RequestParam Long id, @RequestParam(required = false) Boolean isRead) {
  114. News news = newsService.getById(id);
  115. if (news == null) {
  116. return RT.error("该内容不存在或已被删除!");
  117. }
  118. List<NewsRelationVo> newsRelationVoList = new ArrayList<>();
  119. MPJLambdaWrapper<NewsRelation> queryWrapper = new MPJLambdaWrapper<>();
  120. queryWrapper
  121. .select(NewsRelation::getId)
  122. .selectAs(XjrUser::getName, NewsRelationVo::getUserName)
  123. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  124. .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId)
  125. .eq(NewsRelation::getNewsId, id)
  126. .disableSubLogicDel();
  127. if (ObjectUtil.isNotNull(news.getCreateUserId()) && StpUtil.getLoginIdAsLong() == news.getCreateUserId()) {
  128. newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class, queryWrapper);
  129. } else {
  130. queryWrapper.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong());
  131. NewsRelationVo newsRelationVo = newsRelationService.selectJoinOne(NewsRelationVo.class, queryWrapper);
  132. if (ObjectUtil.isNotNull(newsRelationVo)) {
  133. newsRelationVoList.add(newsRelationVo);
  134. }
  135. }
  136. NewsVo newsVo = BeanUtil.toBean(news, NewsVo.class);
  137. newsVo.setRelationList(newsRelationVoList);
  138. Department department = departmentMapper.selectById(newsVo.getSendDeptId());
  139. if (department != null) {
  140. newsVo.setSendDeptIdCN(department.getName());
  141. }
  142. if (BooleanUtils.isTrue(isRead)) {
  143. // NewsRelation newsRelation = new NewsRelation();
  144. // newsRelation.setNewsId(id);
  145. // newsRelation.setUserId(StpUtil.getLoginIdAsLong());
  146. // newsRelationService.remove(Wrappers.<NewsRelation>query().lambda()
  147. // .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  148. // .eq(NewsRelation::getNewsId, id));
  149. // newsRelationService.save(newsRelation);
  150. }
  151. // List<NewsRelationVo> newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class,
  152. // new MPJLambdaWrapper<NewsRelation>()
  153. // .eq(NewsRelation::getNewsId, id)
  154. // .select(NewsRelation::getId)
  155. // .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  156. // .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId, ext -> ext.selectAs(XjrUser::getName, NewsRelationVo::getUserName)));
  157. // if (newsRelationVoList.size() > 0) {
  158. // newsVo.setRelationList(newsRelationVoList);
  159. // }
  160. List<NewsAppendixVo> newsAppendixVoList = newsAppendixService.selectJoinList(NewsAppendixVo.class,
  161. new MPJLambdaWrapper<NewsAppendix>().eq(NewsAppendix::getNewsId, id)
  162. .select(NewsRelation::getId)
  163. .select(NewsAppendix.class, x -> VoToColumnUtil.fieldsToColumns(NewsAppendixVo.class).contains(x.getProperty()))
  164. .leftJoin(File.class, File::getFolderId, NewsAppendix::getFileId, ext -> ext.selectAs(File::getFileName, NewsAppendixVo::getFileName)
  165. .selectAs(File::getFolderId, NewsAppendixVo::getFolderId)
  166. .selectAs(File::getFileUrl, NewsAppendixVo::getFileUrl))
  167. );
  168. if (newsAppendixVoList.size() > 0) {
  169. newsVo.setAppendixList(newsAppendixVoList);
  170. }
  171. return RT.ok(newsVo);
  172. }
  173. @PutMapping
  174. @ApiOperation(value = "修改新闻")
  175. @XjrLog(value = "修改新闻", saveResponseData = true)
  176. public RT<Boolean> update(@RequestBody UpdateNewsDto updateNewsDto) {
  177. //News news = BeanUtil.toBean(updateNewsDto, News.class);
  178. return RT.ok(newsService.update(updateNewsDto));
  179. }
  180. @DeleteMapping
  181. @ApiOperation(value = "删除新闻")
  182. @XjrLog(value = "删除新闻", saveResponseData = true)
  183. public RT<Boolean> delete(@RequestBody List<Long> ids) {
  184. return RT.ok(newsService.delete(ids));
  185. }
  186. @PutMapping("/change-status")
  187. @ApiOperation(value = "发布或下架新闻")
  188. @XjrLog(value = "发布或下架新闻", saveResponseData = true)
  189. public RT<Boolean> changeStatus(@RequestBody ChangeNewsDto changeNewsDto) throws Exception {
  190. News xjrNews = newsService.getById(changeNewsDto.getId());
  191. if (changeNewsDto.getStatus() == null || xjrNews == null) {
  192. throw new Exception("参数异常");
  193. }
  194. if (changeNewsDto.getStatus().equals(xjrNews.getStatus())) {
  195. if (changeNewsDto.getStatus() == 2) {
  196. throw new Exception("新闻已发布!!!");
  197. } else if (changeNewsDto.getStatus() == 3) {
  198. throw new Exception("新闻已下架!!!");
  199. }
  200. }
  201. //将原来的修改enabled_mark改为修改status
  202. xjrNews.setStatus(changeNewsDto.getStatus());
  203. if (xjrNews.getStatus() == 2) {
  204. //将发布时间改为当前时间
  205. xjrNews.setReleaseTime(LocalDateTime.now());
  206. //将张贴时间改为当前时间
  207. xjrNews.setSendStartDate(LocalDateTime.now());
  208. newsService.SendMessage(xjrNews.getId());
  209. }
  210. return RT.ok(newsService.updateById(xjrNews));
  211. }
  212. @PutMapping("/read")
  213. @ApiOperation(value = "读新闻")
  214. @XjrLog(value = "读新闻", saveResponseData = true)
  215. public RT<Boolean> read(@RequestBody List<Long> ids) {
  216. for (Long id : ids) {
  217. NewsRelation newsRelation = newsRelationService.getOne(
  218. Wrappers.<NewsRelation>query().lambda()
  219. .eq(NewsRelation::getNewsId, id)
  220. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
  221. if (newsRelation == null) {
  222. newsRelationService.save(new NewsRelation() {{
  223. setNewsId(id);
  224. setUserId(StpUtil.getLoginIdAsLong());
  225. setReadMark(1);
  226. setReadDate(LocalDateTime.now());
  227. }});
  228. continue;
  229. }
  230. newsRelationService.updateById(new NewsRelation() {{
  231. setId(newsRelation.getId());
  232. setReadMark(1);
  233. setReadDate(LocalDateTime.now());
  234. }});
  235. }
  236. return RT.ok(true);
  237. }
  238. @PutMapping("/reply")
  239. @ApiOperation(value = "新闻回复")
  240. @XjrLog(value = "新闻回复", saveResponseData = true)
  241. public RT<Boolean> reply(@RequestBody NewsReplyDto newsReplyDto) {
  242. NewsRelation newsRelation = newsRelationService.getOne(
  243. Wrappers.<NewsRelation>query().lambda()
  244. .eq(NewsRelation::getNewsId, newsReplyDto.getId())
  245. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
  246. if (newsRelation == null) {
  247. newsRelation = new NewsRelation();
  248. newsRelation.setNewsId(newsReplyDto.getId());
  249. newsRelation.setUserId(StpUtil.getLoginIdAsLong());
  250. newsRelation.setReadMark(1);
  251. newsRelation.setReadDate(LocalDateTime.now());
  252. newsRelation.setReplyContent(newsReplyDto.getReplyContent());
  253. return RT.ok(newsRelationService.save(newsRelation));
  254. }
  255. if (newsRelation.getReadMark() == null || newsRelation.getReadMark() == 0) {
  256. newsRelation.setReadMark(1);
  257. newsRelation.setReadDate(LocalDateTime.now());
  258. }
  259. newsRelation.setReplyContent(newsReplyDto.getReplyContent());
  260. return RT.ok(newsRelationService.updateById(newsRelation));
  261. }
  262. @GetMapping("/page-relation")
  263. @ApiOperation(value = "获取新闻阅读权限分页")
  264. @XjrLog(value = "获取新闻阅读权限分页")
  265. public RT<PageOutput<NewsRelationVo>> pageRelation(NewsRelationPageDto dto) {
  266. IPage<NewsRelationVo> page = newsRelationService.selectJoinListPage(ConventPage.getPage(dto), NewsRelationVo.class,
  267. new MPJLambdaWrapper<NewsRelation>()
  268. .eq(NewsRelation::getNewsId, dto.getNewsId())
  269. .eq(ObjectUtil.isNotEmpty(dto.getReadMark()) && dto.getReadMark() > 0, NewsRelation::getReadMark, dto.getReadMark() == 1 ? 0 : 1)
  270. .isNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 1, NewsRelation::getReplyContent)
  271. .isNotNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 2, NewsRelation::getReplyContent)
  272. .select(NewsRelation::getId)
  273. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  274. .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId, ext -> ext.selectAs(XjrUser::getName, NewsRelationVo::getUserName))
  275. );
  276. PageOutput<NewsRelationVo> pageOutput = ConventPage.getPageOutput(page);
  277. return RT.ok(pageOutput);
  278. }
  279. @GetMapping("/page-relation-config")
  280. @ApiOperation(value = "获取新闻权限分页")
  281. @XjrLog(value = "获取新闻权限分页")
  282. public RT<PageOutput<NewsRelationConfigVo>> pageRelationConfig(NewsRelationPageDto dto) {
  283. Wrapper<NewsRelationConfig> wrapper = Wrappers.<NewsRelationConfig>query().lambda()
  284. .eq(NewsRelationConfig::getNewsId, dto.getNewsId())
  285. .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()));
  286. IPage<NewsRelationConfig> page = newsRelationConfigService.page(ConventPage.getPage(dto), wrapper);
  287. PageOutput<NewsRelationConfigVo> pageOutput = ConventPage.getPageOutput(page, NewsRelationConfigVo.class);
  288. return RT.ok(pageOutput);
  289. }
  290. @GetMapping("/count-relation")
  291. @ApiOperation(value = "公告阅读权限统计")
  292. @XjrLog(value = "公告阅读权限统计")
  293. public RT<Long[]> countRelation(@RequestParam Long id) {
  294. Long total = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id));
  295. Long notRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 0));
  296. Long isRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 1));
  297. Long isReply = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).isNotNull(NewsRelation::getReplyContent));
  298. Long notReply = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).isNull(NewsRelation::getReplyContent));
  299. Long[] arrayRefVar = {total, notRead, isRead, isReply, notReply};
  300. return RT.ok(arrayRefVar);
  301. }
  302. @PutMapping("/update-relation")
  303. @ApiOperation(value = "设置新闻阅读权限")
  304. @XjrLog(value = "设置新闻阅读权限", saveResponseData = true)
  305. public RT<Boolean> updateRelation(@RequestBody UpdateNewsRelationDto updateRelationDto) {
  306. return RT.ok(newsService.updateRelation(updateRelationDto));
  307. }
  308. @DeleteMapping("/delete-relation")
  309. @ApiOperation(value = "删除新闻阅读权限")
  310. @XjrLog(value = "删除新闻阅读权限", saveResponseData = true)
  311. public RT<Boolean> deleteRelation(@RequestBody DeleteNewsRelationDto deleteNewsRelationDto) {
  312. return RT.ok(newsService.deleteRelation(deleteNewsRelationDto));
  313. }
  314. @GetMapping("/count-type")
  315. @ApiOperation(value = "未读类型统计")
  316. @XjrLog(value = "未读类型统计")
  317. public RT<List<NewsCountTypeVo>> countType() {
  318. List<NewsCountTypeVo> newsCountTypeVoList = new ArrayList<>();
  319. Integer[] typeIds = {1, 2, 3};
  320. for (Integer typeId : typeIds) {
  321. NewsCountTypeVo newsCountTypeVo = new NewsCountTypeVo();
  322. News news = new News();
  323. //新闻
  324. if (typeId == 1) {
  325. Long notReadCount = newsService.count(
  326. MPJWrappers.<News>lambdaJoin()
  327. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  328. .eq(News::getStatus, 2)
  329. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  330. .eq(News::getTypeId, typeId)
  331. .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
  332. .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
  333. .eq(NewsRelation::getReadMark, 0)
  334. .gt(News::getSendEndDate, LocalDateTime.now())
  335. );
  336. newsCountTypeVo.setTypeId(typeId);
  337. newsCountTypeVo.setTotal(notReadCount);
  338. news = newsService.getOne(Wrappers.<News>query().lambda()
  339. .eq(News::getTypeId, typeId)
  340. .eq(News::getStatus, 2)
  341. .gt(News::getSendEndDate, LocalDateTime.now())
  342. .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
  343. .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
  344. .eq(News::getWfStatus, 1)
  345. //.notInSql(News::getId, "select distinct news_id from xjr_oa_news_relation where read_mark = 1 and user_id = " + StpUtil.getLoginIdAsLong())
  346. .orderByDesc(News::getReleaseTime)
  347. .last("limit 1"));
  348. }
  349. //公告
  350. if (typeId == 2) {
  351. //公告发给全体的
  352. Long notReadCountProclamation = newsService.count(
  353. MPJWrappers.<News>lambdaJoin()
  354. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  355. .eq(News::getStatus, 2)
  356. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  357. .eq(News::getTypeId, typeId)
  358. .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
  359. .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
  360. .gt(News::getSendEndDate, LocalDateTime.now())
  361. .eq(NewsRelation::getReadMark, 0)
  362. );
  363. News newsAll = newsService.getOne(Wrappers.<News>query().lambda()
  364. .eq(News::getTypeId, 2)
  365. .eq(News::getStatus, 2)
  366. .eq(News::getSendRange, 1)
  367. .and(wp -> wp.gt(News::getSendEndDate, LocalDateTime.now())
  368. .or()
  369. .isNull(News::getSendEndDate))
  370. .orderByDesc(News::getReleaseTime)
  371. .last("limit 1"));
  372. MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
  373. queryNews
  374. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  375. .eq(News::getTypeId, typeId)
  376. .eq(News::getStatus, 2)
  377. .and(wp -> wp.eq(News::getSendRange, 2)
  378. .or()
  379. .eq(News::getSendRange, 3))
  380. .and(wp -> wp.gt(News::getSendEndDate, LocalDateTime.now())
  381. .or()
  382. .isNull(News::getSendEndDate))
  383. //.eq(NewsRelation::getReadMark, 0)
  384. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  385. .orderByDesc(News::getReleaseTime)
  386. .last("limit 1");
  387. News newsNotAll = newsService.selectJoinOne(News.class, queryNews);
  388. if (newsAll != null && newsNotAll != null) {
  389. if (newsAll.getReleaseTime().isBefore(newsNotAll.getReleaseTime())) {
  390. news = newsNotAll;
  391. } else {
  392. news = newsAll;
  393. }
  394. }
  395. if (newsAll != null && newsNotAll == null) {
  396. news = newsAll;
  397. }
  398. if (newsAll == null && newsNotAll != null) {
  399. news = newsNotAll;
  400. }
  401. newsCountTypeVo.setTypeId(typeId);
  402. newsCountTypeVo.setTotal(notReadCountProclamation);
  403. }
  404. if (news != null) {
  405. newsCountTypeVo.setTime(news.getReleaseTime());
  406. newsCountTypeVo.setTitle(news.getFullHead());
  407. }
  408. if (typeId == 3) {
  409. List<SystemUpdateMessage> list = systemUpdateMessageService.list(
  410. MPJWrappers.<SystemUpdateMessage>lambdaJoin()
  411. .select(SystemUpdateMessage::getId)
  412. .select(SystemUpdateMessage.class, x -> VoToColumnUtil.fieldsToColumns(SystemUpdateMessage.class).contains(x.getProperty()))
  413. .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
  414. .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
  415. .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
  416. .eq(SystemUpdateMessage::getStatus, 1)
  417. .eq(SystemUpdateMessageNotice::getStatus, 0)
  418. .orderByDesc(SystemUpdateMessage::getReleaseDate)
  419. );
  420. if (!list.isEmpty()) {
  421. newsCountTypeVo.setTypeId(typeId);
  422. newsCountTypeVo.setTotal(list.stream().count());
  423. SystemUpdateMessage message = list.get(0);
  424. newsCountTypeVo.setTitle(message.getTitle());
  425. newsCountTypeVo.setTime(message.getReleaseDate());
  426. }
  427. }
  428. newsCountTypeVoList.add(newsCountTypeVo);
  429. }
  430. return RT.ok(newsCountTypeVoList);
  431. }
  432. @GetMapping("/send-message")
  433. @ApiOperation(value = "发送消息")
  434. @XjrLog(value = "发送消息", saveResponseData = true)
  435. public RT<Boolean> sendMessage(@RequestParam Long id) {
  436. return RT.ok(newsService.SendMessage(id));
  437. }
  438. @GetMapping("/unread-count")
  439. @ApiOperation(value = "获取登录人未读消息数量")
  440. @XjrLog(value = "获取登录人未读消息数量", saveResponseData = true)
  441. public RT<Long> unreadCount() {
  442. Long notReadCountNews = newsService.count(
  443. MPJWrappers.<News>lambdaJoin()
  444. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  445. .eq(News::getStatus, 2)
  446. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  447. .eq(NewsRelation::getReadMark, 0)
  448. .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
  449. .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
  450. );
  451. //公告发给非全体的
  452. long systemUpdateMessageCount = systemUpdateMessageService.count(
  453. MPJWrappers.<SystemUpdateMessage>lambdaJoin()
  454. .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
  455. .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
  456. .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
  457. .eq(SystemUpdateMessage::getStatus, 1)
  458. .eq(SystemUpdateMessageNotice::getStatus, 0)
  459. .eq(SystemUpdateMessageNotice::getDeleteMark, DeleteMark.NODELETE.getCode())
  460. .eq(SystemUpdateMessageNotice::getEnabledMark, EnabledMark.ENABLED.getCode())
  461. );
  462. Long notReadCount = notReadCountNews + systemUpdateMessageCount;
  463. return RT.ok(notReadCount);
  464. }
  465. @GetMapping("/all-read")
  466. @ApiOperation(value = "全部已读")
  467. @XjrLog(value = "全部已读", saveResponseData = true)
  468. public RT<Boolean> allRead() {
  469. return RT.ok(newsService.allRead(StpUtil.getLoginIdAsLong()));
  470. }
  471. }