NewsServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. package com.xjrsoft.module.oa.service.impl;
  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.alibaba.fastjson.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.github.yulichang.base.MPJBaseServiceImpl;
  12. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  13. import com.xjrsoft.common.enums.EnabledMark;
  14. import com.xjrsoft.common.exception.MyException;
  15. import com.xjrsoft.common.page.ConventPage;
  16. import com.xjrsoft.common.utils.LocalDateTimeUtil;
  17. import com.xjrsoft.common.utils.TreeUtil;
  18. import com.xjrsoft.common.utils.VoToColumnUtil;
  19. import com.xjrsoft.config.CommonPropertiesConfig;
  20. import com.xjrsoft.module.base.entity.BaseClass;
  21. import com.xjrsoft.module.base.entity.BaseGrade;
  22. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  23. import com.xjrsoft.module.base.mapper.BaseGradeMapper;
  24. import com.xjrsoft.module.oa.dto.*;
  25. import com.xjrsoft.module.oa.entity.News;
  26. import com.xjrsoft.module.oa.entity.NewsAppendix;
  27. import com.xjrsoft.module.oa.entity.NewsRelation;
  28. import com.xjrsoft.module.oa.entity.NewsRelationConfig;
  29. import com.xjrsoft.module.oa.mapper.NewsAppendixMapper;
  30. import com.xjrsoft.module.oa.mapper.NewsMapper;
  31. import com.xjrsoft.module.oa.mapper.NewsRelationConfigMapper;
  32. import com.xjrsoft.module.oa.mapper.NewsRelationMapper;
  33. import com.xjrsoft.module.oa.service.INewsAppendixService;
  34. import com.xjrsoft.module.oa.service.INewsRelationService;
  35. import com.xjrsoft.module.oa.service.INewsService;
  36. import com.xjrsoft.module.oa.vo.*;
  37. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  38. import com.xjrsoft.module.organization.entity.Department;
  39. import com.xjrsoft.module.organization.entity.User;
  40. import com.xjrsoft.module.organization.entity.UserDeptRelation;
  41. import com.xjrsoft.module.organization.mapper.DepartmentMapper;
  42. import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
  43. import com.xjrsoft.module.organization.mapper.UserMapper;
  44. import com.xjrsoft.module.organization.service.IWeChatService;
  45. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  46. import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
  47. import com.xjrsoft.module.system.entity.File;
  48. import com.xjrsoft.module.teacher.entity.XjrUser;
  49. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  50. import lombok.AllArgsConstructor;
  51. import org.springframework.stereotype.Service;
  52. import org.springframework.transaction.annotation.Transactional;
  53. import java.time.LocalDateTime;
  54. import java.util.ArrayList;
  55. import java.util.Date;
  56. import java.util.List;
  57. import java.util.concurrent.CompletableFuture;
  58. import java.util.stream.Collectors;
  59. /**
  60. * <p>
  61. * 新闻中心表 服务实现类
  62. * </p>
  63. *
  64. * @author zlf
  65. * @since 2022-06-16
  66. */
  67. @Service
  68. @AllArgsConstructor
  69. public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implements INewsService {
  70. private final NewsMapper newsMapper;
  71. private final NewsAppendixMapper newsAppendixMapper;
  72. private final NewsRelationMapper newsRelationMapper;
  73. private final NewsRelationConfigMapper newsRelationConfigMapper;
  74. private final UserDeptRelationMapper userDeptRelationMapper;
  75. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  76. private final IWeChatService weChatService;
  77. private final UserMapper userMapper;
  78. private final BaseGradeMapper baseGradeMapper;
  79. private final DepartmentMapper departmentMapper;
  80. private final BaseClassMapper baseClassMapper;
  81. private final XjrUserMapper xjrUserMapper;
  82. private final CommonPropertiesConfig commonPropertiesConfig;
  83. private INewsRelationService newsRelationService;
  84. private INewsAppendixService newsAppendixService;
  85. @Override
  86. public List<NewsGradeClassTreeVo> getGradeClassTree() {
  87. List<NewsGradeClassTreeVo> treeVoList = new ArrayList<NewsGradeClassTreeVo>();
  88. //虚拟父级
  89. treeVoList.add(new NewsGradeClassTreeVo() {{
  90. setId(666666L);
  91. setName("班级");
  92. }});
  93. //获取所有班级的年级作为树的父级
  94. MPJLambdaWrapper<BaseClass> queryGrade = new MPJLambdaWrapper<>();
  95. queryGrade
  96. .distinct()
  97. .selectAs(BaseGrade::getId, BaseGrade::getId)
  98. .selectAs(BaseGrade::getName, BaseGrade::getName)
  99. .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId);
  100. List<BaseGrade> gradeList = baseClassMapper.selectJoinList(BaseGrade.class, queryGrade);
  101. gradeList.forEach((node) -> {
  102. treeVoList.add(new NewsGradeClassTreeVo() {{
  103. setId(node.getId());
  104. setName(node.getName());
  105. setParentId(666666L);
  106. }});
  107. });
  108. List<BaseClass> classList = baseClassMapper.selectList(new QueryWrapper<BaseClass>());
  109. //获取班级荣誉中出现的学期下的所有班级作为树的子级
  110. classList.forEach((node) -> {
  111. treeVoList.add(new NewsGradeClassTreeVo() {{
  112. setId(node.getId());
  113. setName(node.getName());
  114. setParentId(node.getGradeId());
  115. }});
  116. });
  117. List<NewsGradeClassTreeVo> resultTreeVoList = TreeUtil.build(treeVoList);
  118. return resultTreeVoList;
  119. }
  120. @Override
  121. @Transactional
  122. public Long addProclamation(AddProclamationDto addProclamationDto) {
  123. Boolean isSuccess = false;
  124. News news = BeanUtil.toBean(addProclamationDto, News.class);
  125. news.setTypeId(2);
  126. news.setEnabledMark(EnabledMark.ENABLED.getCode());
  127. //LambdaQueryWrapper<News> queryWrapperSortcode = new LambdaQueryWrapper<>();
  128. //queryWrapperSortcode.select("SELECT IFNULL(MAX(sort_code),1)");
  129. newsMapper.insert(news);
  130. //添加附件子表
  131. if (addProclamationDto.getAppendixList() != null) {
  132. for (AddNewsAppendixDto appendixDto : addProclamationDto.getAppendixList()) {
  133. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  134. newsAppendix.setNewsId(news.getId());
  135. newsAppendixMapper.insert(newsAppendix);
  136. }
  137. }
  138. //如果状态是2,表示立即发布的公告,需要将阅读人添加进阅读关系表
  139. if(addProclamationDto.getStatus() == 2){
  140. addRelation(news, addProclamationDto, 2);
  141. }
  142. //公告需要添加阅读关系,关系类型 1=部门 2=人员 3=班级
  143. if (addProclamationDto.getSendRange() == 3 && addProclamationDto.getRelationList() != null) {
  144. addRelationConfig(news, addProclamationDto);
  145. }
  146. return news.getId();
  147. }
  148. @Override
  149. public ProclamationVo getProclamationById(Long id) {
  150. MPJLambdaWrapper<News> queryWrapperNews = new MPJLambdaWrapper<>();
  151. queryWrapperNews
  152. .select(News::getId)
  153. .selectAs(Department::getName, ProclamationVo::getSendDeptIdCN)
  154. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationVo.class).contains(x.getProperty()))
  155. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  156. .eq(News::getId, id);
  157. ProclamationVo proclamationVo = this.selectJoinOne(ProclamationVo.class, queryWrapperNews);
  158. if (proclamationVo == null) {
  159. return null;
  160. }
  161. //添加阅读关系集合
  162. List<NewsRelationConfigVo> newsRelationConfigVoList = new ArrayList<>();
  163. //公告在草稿状态还没有阅读状态,只有阅读关系
  164. if (proclamationVo.getStatus() == 1) {
  165. MPJLambdaWrapper<NewsRelationConfig> queryWrapperNewsRelationConfig = new MPJLambdaWrapper<>();
  166. queryWrapperNewsRelationConfig
  167. .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()))
  168. .eq(NewsRelationConfig::getNewsId, proclamationVo.getId());
  169. newsRelationConfigVoList = newsRelationConfigMapper.selectJoinList(NewsRelationConfigVo.class, queryWrapperNewsRelationConfig);
  170. }
  171. proclamationVo.setNewsRelationConfigVoList(newsRelationConfigVoList);
  172. //添加阅读状态集合
  173. List<NewsRelationVo> newsRelationVoList = new ArrayList<>();
  174. //公告在发布状态或下架状态
  175. if (proclamationVo.getStatus() == 2 || proclamationVo.getStatus() == 3) {
  176. MPJLambdaWrapper<NewsRelation> queryWrapper = new MPJLambdaWrapper<>();
  177. queryWrapper
  178. .select(NewsRelation::getId)
  179. .selectAs(XjrUser::getName, NewsRelationVo::getUserName)
  180. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  181. .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId)
  182. .eq(NewsRelation::getNewsId, proclamationVo.getId())
  183. .disableSubLogicDel();
  184. //当是发布人点击了该公告可以看到其下所有人的回复
  185. if (ObjectUtil.isNotNull(proclamationVo.getCreateUserId()) && StpUtil.getLoginIdAsLong() == proclamationVo.getCreateUserId()) {
  186. newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class, queryWrapper);
  187. } else {//当不是发布人点击了该公告只能看到自己的回复
  188. queryWrapper.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong());
  189. NewsRelationVo newsRelationVo = newsRelationService.selectJoinOne(NewsRelationVo.class, queryWrapper);
  190. if (ObjectUtil.isNotNull(newsRelationVo)) {
  191. newsRelationVoList.add(newsRelationVo);
  192. }
  193. }
  194. }
  195. proclamationVo.setRelationList(newsRelationVoList);
  196. //添加附件
  197. List<NewsAppendixVo> newsAppendixVoList = newsAppendixService.selectJoinList(NewsAppendixVo.class,
  198. new MPJLambdaWrapper<NewsAppendix>().eq(NewsAppendix::getNewsId, id)
  199. .select(NewsRelation::getId)
  200. .select(NewsAppendix.class, x -> VoToColumnUtil.fieldsToColumns(NewsAppendixVo.class).contains(x.getProperty()))
  201. .leftJoin(File.class, File::getId, NewsAppendix::getFileId, ext -> ext.selectAs(File::getFileName, NewsAppendixVo::getFileName)
  202. .selectAs(File::getFolderId, NewsAppendixVo::getFolderId)
  203. .selectAs(File::getFileUrl, NewsAppendixVo::getFileUrl))
  204. );
  205. if (newsAppendixVoList.size() > 0) {
  206. proclamationVo.setAppendixList(newsAppendixVoList);
  207. }
  208. return proclamationVo;
  209. }
  210. @Override
  211. public IPage<ProclamationPageVo> proclamationManageBox(ProclamationPageDto dto) {
  212. MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
  213. queryNews
  214. .select(News::getId)
  215. .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
  216. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
  217. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  218. .eq(News::getCreateUserId, StpUtil.getLoginIdAsLong())
  219. .eq(News::getTypeId, 2)
  220. .like(dto.getFullHead() != null, News::getFullHead, dto.getFullHead())
  221. .like(dto.getKeyword() != null, News::getNewsContent, dto.getKeyword())
  222. .orderByDesc(News::getId)
  223. .disableSubLogicDel();
  224. IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
  225. return page;
  226. }
  227. @Override
  228. public IPage<ProclamationPageVo> proclamationReceiptBox(ProclamationPageDto dto) {
  229. MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
  230. queryNews
  231. .select(News::getId)
  232. .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
  233. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
  234. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  235. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  236. .eq(News::getTypeId, 2)
  237. .eq(News::getStatus, 2)
  238. .gt(News::getSendEndDate, new Date())
  239. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  240. .or()
  241. .eq(News::getSendRange, 2)
  242. .orderByDesc(News::getId)
  243. .disableSubLogicDel();
  244. ;
  245. IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
  246. return page;
  247. }
  248. @Override
  249. @Transactional(rollbackFor = Exception.class)
  250. public Boolean changeStatus(ChangeNewsDto changeNewsDto) {
  251. News xjrNews = this.getById(changeNewsDto.getId());
  252. if (changeNewsDto.getStatus() == null || xjrNews == null) {
  253. throw new MyException("参数异常");
  254. }
  255. if (changeNewsDto.getStatus().equals(xjrNews.getStatus())) {
  256. if (changeNewsDto.getStatus() == 2) {
  257. throw new MyException("公告已发布!!!");
  258. } else if (changeNewsDto.getStatus() == 3) {
  259. throw new MyException("公告已下架!!!");
  260. }
  261. }
  262. xjrNews.setStatus(changeNewsDto.getStatus());
  263. //发布公告,将阅读关系中选择的阅读人添加到关系表
  264. if (xjrNews.getStatus() == 2) {
  265. //将发布时间改为当前时间
  266. xjrNews.setReleaseTime(LocalDateTime.now());
  267. //将张贴时间改为当前时间
  268. xjrNews.setSendStartDate(LocalDateTime.now());
  269. xjrNews.setModifyUserId(StpUtil.getLoginIdAsLong());
  270. xjrNews.setModifyDate(LocalDateTime.now());
  271. addRelation(xjrNews, null, 1);
  272. }
  273. if (xjrNews.getStatus() == 3) {
  274. //应该将关系配置表和关系表的数据设置为删除
  275. }
  276. return this.updateById(xjrNews);
  277. }
  278. @Override
  279. @Transactional(rollbackFor = Exception.class)
  280. public boolean updateProclamation(UpdateProclamationDto updateProclamationDto) {
  281. News news = BeanUtil.toBean(updateProclamationDto, News.class);
  282. news.setModifyDate(LocalDateTime.now());
  283. news.setModifyUserId(StpUtil.getLoginIdAsLong());
  284. newsMapper.updateById(news);
  285. newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
  286. if (updateProclamationDto.getAppendixList() != null) {
  287. for (AddNewsAppendixDto appendixDto : updateProclamationDto.getAppendixList()) {
  288. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  289. newsAppendix.setNewsId(news.getId());
  290. newsAppendixMapper.insert(newsAppendix);
  291. }
  292. }
  293. if (updateProclamationDto.getSendRange() == 3 && updateProclamationDto.getRelationList() != null) {
  294. newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
  295. newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
  296. updateRelationConfig(news, updateProclamationDto);
  297. }
  298. return true;
  299. }
  300. /**
  301. * 添加阅读关系配置表
  302. * @param news
  303. * @return
  304. */
  305. private Boolean updateRelationConfig(News news, UpdateProclamationDto updateProclamationDto){
  306. AddProclamationDto addProclamationDto = BeanUtil.toBean(updateProclamationDto, AddProclamationDto.class);
  307. return addRelationConfig(news, addProclamationDto);
  308. }
  309. private Boolean addRelationConfig(News news, AddProclamationDto addProclamationDto){
  310. for (AddNewsRelationDto relationDto : addProclamationDto.getRelationList()) {
  311. if (relationDto.getRelationType() == 1) {
  312. Department department = departmentMapper.selectById(relationDto.getRelationId());
  313. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  314. setNewsId(news.getId());
  315. setRelationId(relationDto.getRelationId());
  316. setRelationType(relationDto.getRelationType());
  317. if (department != null) {
  318. setRelationName(department.getName());
  319. }
  320. }});
  321. }
  322. if (relationDto.getRelationType() == 2) {
  323. XjrUser xjrUser = xjrUserMapper.selectById(relationDto.getRelationId());
  324. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  325. setNewsId(news.getId());
  326. setRelationId(relationDto.getRelationId());
  327. setRelationType(relationDto.getRelationType());
  328. if (xjrUser != null) {
  329. setRelationName(xjrUser.getName());
  330. }
  331. }});
  332. }
  333. if (relationDto.getRelationType() == 3) {
  334. BaseClass baseClass = baseClassMapper.selectById(relationDto.getRelationId());
  335. BaseGrade baseGrade = null;
  336. if (baseClass == null) {
  337. baseGrade = baseGradeMapper.selectById(relationDto.getRelationId());
  338. }
  339. BaseGrade finalBaseGrade = baseGrade;
  340. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  341. setNewsId(news.getId());
  342. setRelationId(relationDto.getRelationId());
  343. setRelationType(relationDto.getRelationType());
  344. if (baseClass != null) {
  345. setRelationName(baseClass.getName());
  346. }
  347. if (finalBaseGrade != null) {
  348. setRelationName(finalBaseGrade.getName());
  349. }
  350. }});
  351. }
  352. }
  353. return true;
  354. }
  355. /**
  356. * 添加阅读关系到关系表
  357. * @param xjrNews
  358. * @return
  359. */
  360. private Boolean addRelation(News xjrNews ,AddProclamationDto addProclamationDto, int flag){
  361. if (xjrNews.getSendRange() == 3) {
  362. List<Long> deptIdList = new ArrayList<>();
  363. List<Long> personalIdList = new ArrayList<>();
  364. List<Long> classIdList = new ArrayList<>();
  365. if(flag == 1) {
  366. //查出当前公告的关系配置
  367. //部门
  368. LambdaQueryWrapper<NewsRelationConfig> queryDeptList = new LambdaQueryWrapper<>();
  369. queryDeptList
  370. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  371. .eq(NewsRelationConfig::getRelationType, 1);
  372. List<NewsRelationConfig> deptList = newsRelationConfigMapper.selectList(queryDeptList);
  373. for (NewsRelationConfig newsRelationConfig : deptList) {
  374. deptIdList.add(newsRelationConfig.getRelationId());
  375. }
  376. //人员
  377. LambdaQueryWrapper<NewsRelationConfig> queryPersonalList = new LambdaQueryWrapper<>();
  378. queryPersonalList
  379. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  380. .eq(NewsRelationConfig::getRelationType, 2);
  381. List<NewsRelationConfig> personalList = newsRelationConfigMapper.selectList(queryPersonalList);
  382. for (NewsRelationConfig newsRelationConfig : personalList) {
  383. personalIdList.add(newsRelationConfig.getRelationId());
  384. }
  385. //班级
  386. LambdaQueryWrapper<NewsRelationConfig> queryClassList = new LambdaQueryWrapper<>();
  387. queryClassList
  388. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  389. .eq(NewsRelationConfig::getRelationType, 3);
  390. List<NewsRelationConfig> classList = newsRelationConfigMapper.selectList(queryClassList);
  391. for (NewsRelationConfig newsRelationConfig : classList) {
  392. classIdList.add(newsRelationConfig.getRelationId());
  393. }
  394. }
  395. if(flag == 2){
  396. for (AddNewsRelationDto addNewsRelationDto : addProclamationDto.getRelationList()) {
  397. if(addNewsRelationDto.getRelationType() == 1){
  398. deptIdList.add(addNewsRelationDto.getRelationId());
  399. }
  400. if(addNewsRelationDto.getRelationType() == 2){
  401. personalIdList.add(addNewsRelationDto.getRelationId());
  402. }
  403. if(addNewsRelationDto.getRelationType() == 3){
  404. classIdList.add(addNewsRelationDto.getRelationId());
  405. }
  406. }
  407. }
  408. //对人员进行筛选,避免重复添加
  409. List<Long> userIdList = new ArrayList<>();
  410. if (personalIdList != null) {
  411. //获取人员的班级或者部门
  412. List<DeptIdOrClassIdVo> deptIdOrClassIdVoList = newsMapper.getDeptIdOrClassId(personalIdList);
  413. for (DeptIdOrClassIdVo deptIdOrClassIdVo : deptIdOrClassIdVoList) {
  414. if (deptIdOrClassIdVo.getClassId() != null) {//有班级是学生
  415. if (!classIdList.contains(deptIdOrClassIdVo.getClassId())) {
  416. userIdList.add(deptIdOrClassIdVo.getUserId());
  417. }
  418. } else {
  419. if (!deptIdList.contains(deptIdOrClassIdVo.getDeptId())) {
  420. userIdList.add(deptIdOrClassIdVo.getUserId());
  421. }
  422. }
  423. }
  424. }
  425. //添加部门人员
  426. if (deptIdList.size() > 0) {
  427. newsRelationMapper.insertDeptUser(xjrNews.getId(), deptIdList);
  428. }
  429. //添加部门人员
  430. if (classIdList.size() > 0) {
  431. newsRelationMapper.insertClassUser(xjrNews.getId(), classIdList);
  432. }
  433. //添加部门人员
  434. if (userIdList.size() > 0) {
  435. newsRelationMapper.insertPersonl(xjrNews.getId(), userIdList);
  436. }
  437. }
  438. //遍历所有关系配置
  439. /* for (NewsRelationConfig newsRelationConfig : newsRelationConfigList) {
  440. //阅读关系是部门
  441. if (newsRelationConfig.getRelationType() == 1) {
  442. // 获取部门下的人员添加
  443. Long deptId = newsRelationConfig.getRelationId();
  444. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  445. queryUser
  446. .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
  447. .leftJoin(Department.class, Department::getId, UserDeptRelation::getDeptId)
  448. .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  449. .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
  450. .eq(Department::getId, deptId)
  451. .eq(Role::getId, 2);
  452. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryUser);
  453. for (XjrUser user : userList) {
  454. if (!userMap.containsKey(user.getId())) {
  455. userMap.put(user.getId(), user);
  456. newsRelationMapper.insert(new NewsRelation() {{
  457. setNewsId(xjrNews.getId());
  458. setUserId(user.getId());
  459. setReadMark(0);
  460. setCreateDate(LocalDateTime.now());
  461. }});
  462. }
  463. }
  464. }
  465. //阅读关系是人员
  466. if (newsRelationConfig.getRelationType() == 2) {
  467. if (!userMap.containsKey(newsRelationConfig.getRelationId())) {
  468. userMap.put(newsRelationConfig.getRelationId(), new XjrUser() {{
  469. setId(newsRelationConfig.getRelationId());
  470. }});
  471. newsRelationMapper.insert(new NewsRelation() {{
  472. setNewsId(xjrNews.getId());
  473. setUserId(newsRelationConfig.getRelationId());
  474. setReadMark(0);
  475. setCreateDate(LocalDateTime.now());
  476. }});
  477. }
  478. }
  479. //阅读关系是班级
  480. if (newsRelationConfig.getRelationType() == 3) {
  481. // 获取班级下的人员添加
  482. Long classId = newsRelationConfig.getRelationId();
  483. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  484. queryUser
  485. .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  486. .eq(BaseStudentSchoolRoll::getClassId, classId);
  487. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryUser);
  488. for (XjrUser user : userList) {
  489. if (!userMap.containsKey(user.getId())) {
  490. userMap.put(user.getId(), user);
  491. newsRelationMapper.insert(new NewsRelation() {{
  492. setNewsId(xjrNews.getId());
  493. setUserId(user.getId());
  494. setReadMark(0);
  495. setCreateDate(LocalDateTime.now());
  496. }});
  497. }
  498. }
  499. }
  500. }*/
  501. if (xjrNews.getSendRange() == 2) {
  502. // MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  503. // queryUser
  504. // .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  505. // .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
  506. // .eq(Role::getId, 2);
  507. // List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryUser);
  508. // for (XjrUser user : userList) {
  509. // newsRelationMapper.insert(new NewsRelation() {{
  510. // setNewsId(xjrNews.getId());
  511. // setUserId(user.getId());
  512. // setReadMark(0);
  513. // setCreateDate(LocalDateTime.now());
  514. // }});
  515. // }
  516. newsRelationMapper.insertAllTeaStaff(xjrNews.getId());
  517. }
  518. return true;
  519. }
  520. @Override
  521. @Transactional(rollbackFor = Exception.class)
  522. public Boolean add(AddNewsDto addNewsDto) {
  523. News news = BeanUtil.toBean(addNewsDto, News.class);
  524. news.setEnabledMark(EnabledMark.ENABLED.getCode());
  525. newsMapper.insert(news);
  526. //添加附件子表
  527. if (addNewsDto.getAppendixList() != null) {
  528. for (AddNewsAppendixDto appendixDto : addNewsDto.getAppendixList()) {
  529. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  530. newsAppendix.setNewsId(news.getId());
  531. newsAppendixMapper.insert(newsAppendix);
  532. }
  533. }
  534. //公告需要添加阅读关系,发送范围 1=全校教职工 2=全校师生 3=指定人员
  535. //1=全校教职工,添加全校教职工到关系表
  536. // if(addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1){
  537. // MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  538. // queryUser
  539. // .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  540. // .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
  541. // .eq(Role::getId, 2);
  542. // List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
  543. // for (XjrUser user: userList) {
  544. // newsRelation.setUserId(user.getId());
  545. // newsRelationMapper.insert(newsRelation);
  546. // }
  547. // }
  548. if (addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1) {
  549. for (AddNewsRelationDto relationDto : addNewsDto.getRelationList()) {
  550. NewsRelationConfig newsRelationConfig = BeanUtil.toBean(relationDto, NewsRelationConfig.class);
  551. newsRelationConfig.setNewsId(news.getId());
  552. newsRelationConfigMapper.insert(newsRelationConfig);
  553. NewsRelation newsRelation = BeanUtil.toBean(relationDto, NewsRelation.class);
  554. newsRelation.setNewsId(news.getId());
  555. newsRelation.setReadMark(0);
  556. if (relationDto.getRelationType() == 1) {
  557. // 获取部门下的人员添加
  558. Long deptId = relationDto.getRelationId();
  559. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  560. queryUser
  561. .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
  562. .leftJoin(Department.class, Department::getId, UserDeptRelation::getDeptId)
  563. .eq(Department::getId, deptId);
  564. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryUser);
  565. for (XjrUser user : userList) {
  566. newsRelation.setUserId(user.getId());
  567. newsRelationMapper.insert(newsRelation);
  568. }
  569. }
  570. if (relationDto.getRelationType() == 2) {
  571. newsRelation.setUserId(relationDto.getRelationId());
  572. newsRelationMapper.insert(newsRelation);
  573. }
  574. if (relationDto.getRelationType() == 3) {
  575. // 获取班级下的人员添加
  576. Long deptId = relationDto.getRelationId();
  577. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  578. queryUser
  579. .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
  580. .leftJoin(Department.class, Department::getId, UserDeptRelation::getDeptId)
  581. .eq(Department::getId, deptId);
  582. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryUser);
  583. List<Long> userIdList = new ArrayList<>();
  584. for (XjrUser user : userList) {
  585. userIdList.add(user.getId());
  586. }
  587. for (Long userId : userIdList) {
  588. newsRelation.setUserId(userId);
  589. newsRelationMapper.insert(newsRelation);
  590. }
  591. }
  592. }
  593. }
  594. //添加新闻和公告的时候,如果状态是2,表示新闻和公告实时发布了,张贴开始时间就应该是发布时间需要发送消息
  595. if (ObjectUtil.isNotNull(addNewsDto.getStatus()) && addNewsDto.getStatus() == 2) {
  596. SendMessage(news.getId());
  597. }
  598. return true;
  599. }
  600. @Override
  601. public IPage<NewsPageVo> manageBox(NewsPageDto dto) {
  602. dto.setLoginId(StpUtil.getLoginIdAsLong());
  603. IPage<NewsPageVo> page = newsMapper.manageBox(ConventPage.getPage(dto), dto);
  604. return page;
  605. }
  606. @Override
  607. public IPage<NewsPageVo> receiptBox(NewsPageDto dto) {
  608. dto.setLoginId(StpUtil.getLoginIdAsLong());
  609. IPage<NewsPageVo> page = newsMapper.receiptBox(ConventPage.getPage(dto), dto);
  610. return page;
  611. }
  612. @Override
  613. @Transactional(rollbackFor = Exception.class)
  614. public boolean update(UpdateNewsDto updateNewsDto) {
  615. News news = BeanUtil.toBean(updateNewsDto, News.class);
  616. newsMapper.updateById(news);
  617. newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
  618. if (updateNewsDto.getAppendixList() != null) {
  619. for (AddNewsAppendixDto appendixDto : updateNewsDto.getAppendixList()) {
  620. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  621. newsAppendix.setNewsId(news.getId());
  622. newsAppendixMapper.insert(newsAppendix);
  623. }
  624. }
  625. if (updateNewsDto.getRelationList() != null) {
  626. newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
  627. newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
  628. for (AddNewsRelationDto relationDto : updateNewsDto.getRelationList()) {
  629. NewsRelationConfig newsRelationConfig = BeanUtil.toBean(relationDto, NewsRelationConfig.class);
  630. newsRelationConfig.setNewsId(news.getId());
  631. newsRelationConfigMapper.insert(newsRelationConfig);
  632. NewsRelation newsRelation = BeanUtil.toBean(relationDto, NewsRelation.class);
  633. newsRelation.setNewsId(news.getId());
  634. newsRelation.setReadMark(0);
  635. if (relationDto.getRelationType() == 1) {
  636. // 获取部门下的人员添加
  637. } else {
  638. newsRelation.setUserId(relationDto.getRelationId());
  639. newsRelationMapper.insert(newsRelation);
  640. }
  641. }
  642. }
  643. return true;
  644. }
  645. /**
  646. * 设置新闻阅读权限
  647. */
  648. @Override
  649. @Transactional(rollbackFor = Exception.class)
  650. public boolean updateRelation(UpdateNewsRelationDto updateRelationDto) {
  651. if (updateRelationDto.getRelationList() != null) {
  652. for (NewsRelationConfigDto newsRelationConfigDto : updateRelationDto.getRelationList()) {
  653. NewsRelationConfig newsRelationConfig = new NewsRelationConfig();
  654. newsRelationConfig.setNewsId(updateRelationDto.getId());
  655. newsRelationConfig.setRelationId(newsRelationConfigDto.getRelationId());
  656. newsRelationConfig.setRelationName(newsRelationConfigDto.getRelationName());
  657. newsRelationConfig.setRelationType(updateRelationDto.getRelationType());
  658. newsRelationConfigMapper.insert(newsRelationConfig);
  659. // 部门
  660. if (updateRelationDto.getRelationType() == 1) {
  661. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  662. .eq(UserDeptRelation::getDeptId, newsRelationConfigDto.getRelationId()));
  663. for (UserDeptRelation userDeptRelation : userDeptRelationList) {
  664. NewsRelation newsRelation = new NewsRelation();
  665. newsRelation.setUserId(userDeptRelation.getUserId());
  666. newsRelation.setNewsId(updateRelationDto.getId());
  667. newsRelation.setReadMark(0);
  668. newsRelationMapper.insert(newsRelation);
  669. }
  670. }
  671. // 人员
  672. if (updateRelationDto.getRelationType() == 2) {
  673. NewsRelation newsRelation = new NewsRelation();
  674. newsRelation.setUserId(newsRelationConfigDto.getRelationId());
  675. newsRelation.setNewsId(updateRelationDto.getId());
  676. newsRelation.setReadMark(0);
  677. newsRelationMapper.insert(newsRelation);
  678. }
  679. // 班级
  680. if (updateRelationDto.getRelationType() == 3) {
  681. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  682. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfigDto.getRelationId()));
  683. for (BaseStudentSchoolRoll baseStudentSchoolRoll : baseStudentSchoolRollList) {
  684. NewsRelation newsRelation = new NewsRelation();
  685. newsRelation.setUserId(baseStudentSchoolRoll.getUserId());
  686. newsRelation.setNewsId(updateRelationDto.getId());
  687. newsRelation.setReadMark(0);
  688. newsRelationMapper.insert(newsRelation);
  689. }
  690. }
  691. }
  692. }
  693. return true;
  694. }
  695. @Override
  696. @Transactional(rollbackFor = Exception.class)
  697. public boolean deleteRelation(DeleteNewsRelationDto deleteNewsRelationDto) {
  698. if (deleteNewsRelationDto.getRelationId() != null) {
  699. List<NewsRelationConfig> newsRelationConfigList = newsRelationConfigMapper.selectList(Wrappers.<NewsRelationConfig>query().lambda()
  700. .eq(NewsRelationConfig::getNewsId, deleteNewsRelationDto.getNewsId())
  701. .in(NewsRelationConfig::getId, deleteNewsRelationDto.getRelationId())
  702. );
  703. for (NewsRelationConfig newsRelationConfig : newsRelationConfigList) {
  704. // 部门
  705. if (newsRelationConfig.getRelationType() == 1) {
  706. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  707. .eq(UserDeptRelation::getDeptId, newsRelationConfig.getRelationId()));
  708. List<Long> userIdList = userDeptRelationList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList());
  709. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  710. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  711. .in(NewsRelation::getUserId, userIdList));
  712. }
  713. // 人员
  714. if (newsRelationConfig.getRelationType() == 2) {
  715. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  716. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  717. .eq(NewsRelation::getUserId, newsRelationConfig.getRelationId()));
  718. }
  719. // 班级
  720. if (newsRelationConfig.getRelationType() == 3) {
  721. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  722. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfig.getRelationId()));
  723. List<Long> userIdList = baseStudentSchoolRollList.stream().map(BaseStudentSchoolRoll::getUserId).collect(Collectors.toList());
  724. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  725. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  726. .in(NewsRelation::getUserId, userIdList));
  727. }
  728. }
  729. newsRelationConfigMapper.deleteBatchIds(deleteNewsRelationDto.getRelationId());
  730. }
  731. return true;
  732. }
  733. @Override
  734. @Transactional(rollbackFor = Exception.class)
  735. public boolean delete(List<Long> ids) {
  736. newsMapper.deleteBatchIds(ids);
  737. return true;
  738. }
  739. @Override
  740. public boolean SendMessage(Long id) {
  741. try {
  742. News news = newsMapper.selectById(id);
  743. Department department = departmentMapper.selectById(news.getSendDeptId());
  744. if (news.getSendRange() == 1) {
  745. List<User> userList = userMapper.selectList(Wrappers.<User>query().lambda().isNotNull(User::getOpenId).ne(User::getOpenId, ""));
  746. if (userList.size() > 0) {
  747. for (User user : userList) {
  748. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  749. weChatSendMessageDto.setUserId(user.getOpenId());
  750. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4");
  751. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  752. weChatSendMessageDto.setMsgId(id.toString());
  753. JSONObject data = new JSONObject();
  754. JSONObject data1 = new JSONObject();
  755. data1.put("value", news.getFullHead());
  756. data.put("thing23", data1);
  757. JSONObject data2 = new JSONObject();
  758. data2.put("value", (department == null) ? "重庆铜梁职业教育中心" : department.getName());
  759. data.put("thing18", data2);
  760. JSONObject data3 = new JSONObject();
  761. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  762. data.put("time17", data3);
  763. weChatSendMessageDto.setContent(data);
  764. weChatService.sendTemplateMessage(weChatSendMessageDto);
  765. }
  766. //
  767. }
  768. } else {
  769. List<NewsRelationVo> newsRelationVoList = newsRelationMapper.selectJoinList(NewsRelationVo.class,
  770. new MPJLambdaWrapper<NewsRelation>().distinct()
  771. .eq(NewsRelation::getNewsId, id)
  772. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  773. .innerJoin(User.class, onWrapper -> onWrapper.eq(NewsRelation::getUserId, User::getId).isNotNull(User::getOpenId).ne(User::getOpenId, ""))
  774. .selectAs(User::getOpenId, NewsRelationVo::getUserName)
  775. );
  776. if (newsRelationVoList.size() > 0) {
  777. for (NewsRelationVo newsRelationVo : newsRelationVoList) {
  778. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  779. weChatSendMessageDto.setUserId(newsRelationVo.getUserName());
  780. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4");
  781. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  782. weChatSendMessageDto.setMsgId(id.toString());
  783. JSONObject data = new JSONObject();
  784. JSONObject data1 = new JSONObject();
  785. data1.put("value", news.getFullHead());
  786. data.put("thing23", data1);
  787. JSONObject data2 = new JSONObject();
  788. data2.put("value", (department == null) ? "重庆铜梁职业教育中心" : department.getName());
  789. data.put("thing18", data2);
  790. JSONObject data3 = new JSONObject();
  791. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  792. data.put("time17", data3);
  793. weChatSendMessageDto.setContent(data);
  794. weChatService.sendTemplateMessage(weChatSendMessageDto);
  795. }
  796. }
  797. }
  798. } catch (Exception ex) {
  799. }
  800. return true;
  801. }
  802. @Override
  803. public boolean dataHandle(Long id) {
  804. CompletableFuture.runAsync(() -> {
  805. this.SendMessage(id);
  806. });
  807. return true;
  808. }
  809. }