NewsServiceImpl.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  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.stream.Collectors;
  58. /**
  59. * <p>
  60. * 新闻中心表 服务实现类
  61. * </p>
  62. *
  63. * @author zlf
  64. * @since 2022-06-16
  65. */
  66. @Service
  67. @AllArgsConstructor
  68. public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implements INewsService {
  69. private final NewsMapper newsMapper;
  70. private final NewsAppendixMapper newsAppendixMapper;
  71. private final NewsRelationMapper newsRelationMapper;
  72. private final NewsRelationConfigMapper newsRelationConfigMapper;
  73. private final UserDeptRelationMapper userDeptRelationMapper;
  74. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  75. private final IWeChatService weChatService;
  76. private final UserMapper userMapper;
  77. private final BaseGradeMapper baseGradeMapper;
  78. private final DepartmentMapper departmentMapper;
  79. private final BaseClassMapper baseClassMapper;
  80. private final XjrUserMapper xjrUserMapper;
  81. private final CommonPropertiesConfig commonPropertiesConfig;
  82. private INewsRelationService newsRelationService;
  83. private INewsAppendixService newsAppendixService;
  84. @Override
  85. public List<NewsGradeClassTreeVo> getGradeClassTree() {
  86. List<NewsGradeClassTreeVo> treeVoList = new ArrayList<>();
  87. //虚拟父级
  88. treeVoList.add(new NewsGradeClassTreeVo() {{
  89. setId(666666L);
  90. setName("班级");
  91. }});
  92. //获取所有班级的年级作为树的父级
  93. MPJLambdaWrapper<BaseClass> queryGrade = new MPJLambdaWrapper<>();
  94. queryGrade
  95. .distinct()
  96. .selectAs(BaseGrade::getId, BaseGrade::getId)
  97. .selectAs(BaseGrade::getName, BaseGrade::getName)
  98. .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId);
  99. List<BaseGrade> gradeList = baseClassMapper.selectJoinList(BaseGrade.class, queryGrade);
  100. gradeList.forEach((node) -> {
  101. if (node == null) {
  102. return;
  103. }
  104. treeVoList.add(new NewsGradeClassTreeVo() {{
  105. setId(node.getId());
  106. setName(node.getName());
  107. setParentId(666666L);
  108. }});
  109. });
  110. List<BaseClass> classList = baseClassMapper.selectList(new QueryWrapper<BaseClass>());
  111. //获取班级荣誉中出现的学期下的所有班级作为树的子级
  112. classList.forEach((node) -> {
  113. treeVoList.add(new NewsGradeClassTreeVo() {{
  114. setId(node.getId());
  115. setName(node.getName());
  116. setParentId(node.getGradeId());
  117. }});
  118. });
  119. List<NewsGradeClassTreeVo> resultTreeVoList = TreeUtil.build(treeVoList);
  120. return resultTreeVoList;
  121. }
  122. @Override
  123. @Transactional(rollbackFor = Exception.class)
  124. public Long addProclamation(AddProclamationDto addProclamationDto) {
  125. News news = BeanUtil.toBean(addProclamationDto, News.class);
  126. news.setTypeId(2);
  127. news.setEnabledMark(EnabledMark.ENABLED.getCode());
  128. news.setCreateDate(LocalDateTime.now());
  129. news.setCreateUserId(StpUtil.getLoginIdAsLong());
  130. //LambdaQueryWrapper<News> queryWrapperSortcode = new LambdaQueryWrapper<>();
  131. //queryWrapperSortcode.select("SELECT IFNULL(MAX(sort_code),1)");
  132. newsMapper.insert(news);
  133. //添加附件子表
  134. if (addProclamationDto.getAppendixList() != null) {
  135. for (AddNewsAppendixDto appendixDto : addProclamationDto.getAppendixList()) {
  136. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  137. newsAppendix.setNewsId(news.getId());
  138. newsAppendixMapper.insert(newsAppendix);
  139. }
  140. }
  141. //公告需要添加阅读关系配置,关系类型 1=部门 2=人员 3=班级
  142. if (addProclamationDto.getSendRange() == 3 && addProclamationDto.getRelationList() != null && addProclamationDto.getRelationList().size() > 0) {
  143. addRelationConfig(news, addProclamationDto);
  144. }
  145. //如果状态是2,表示立即发布的公告,需要将阅读人添加进阅读关系表
  146. addRelation(news, addProclamationDto, 2);
  147. if (addProclamationDto.getStatus() == 2) {
  148. return news.getId();
  149. }
  150. //没有任何问题返回
  151. return -1L;
  152. }
  153. @Override
  154. public ProclamationVo getProclamationById(Long id) {
  155. MPJLambdaWrapper<News> queryWrapperNews = new MPJLambdaWrapper<>();
  156. queryWrapperNews
  157. .select(News::getId)
  158. .selectAs(Department::getName, ProclamationVo::getSendDeptIdCN)
  159. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationVo.class).contains(x.getProperty()))
  160. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  161. .eq(News::getId, id);
  162. ProclamationVo proclamationVo = this.selectJoinOne(ProclamationVo.class, queryWrapperNews);
  163. if (proclamationVo == null) {
  164. return null;
  165. }
  166. //添加阅读关系集合
  167. List<NewsRelationConfigVo> newsRelationConfigVoList = new ArrayList<>();
  168. //公告在草稿状态还没有阅读状态,只有阅读关系
  169. if (proclamationVo.getStatus() == 1) {
  170. MPJLambdaWrapper<NewsRelationConfig> queryWrapperNewsRelationConfig = new MPJLambdaWrapper<>();
  171. queryWrapperNewsRelationConfig
  172. .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()))
  173. .eq(NewsRelationConfig::getNewsId, proclamationVo.getId());
  174. newsRelationConfigVoList = newsRelationConfigMapper.selectJoinList(NewsRelationConfigVo.class, queryWrapperNewsRelationConfig);
  175. }
  176. proclamationVo.setNewsRelationConfigVoList(newsRelationConfigVoList);
  177. //添加阅读状态集合
  178. List<NewsRelationVo> newsRelationVoList = new ArrayList<>();
  179. //公告在发布状态或下架状态
  180. if (proclamationVo.getStatus() == 2 || proclamationVo.getStatus() == 3) {
  181. MPJLambdaWrapper<NewsRelation> queryWrapper = new MPJLambdaWrapper<>();
  182. queryWrapper
  183. .select(NewsRelation::getId)
  184. .selectAs(XjrUser::getName, NewsRelationVo::getUserName)
  185. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  186. .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId)
  187. .eq(NewsRelation::getNewsId, proclamationVo.getId())
  188. .disableSubLogicDel();
  189. //当是发布人点击了该公告可以看到其下所有人的回复
  190. if (ObjectUtil.isNotNull(proclamationVo.getCreateUserId()) && StpUtil.getLoginIdAsLong() == proclamationVo.getCreateUserId()) {
  191. newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class, queryWrapper);
  192. } else {//当不是发布人点击了该公告只能看到自己的回复
  193. queryWrapper.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong());
  194. NewsRelationVo newsRelationVo = newsRelationService.selectJoinOne(NewsRelationVo.class, queryWrapper);
  195. if (ObjectUtil.isNotNull(newsRelationVo)) {
  196. newsRelationVoList.add(newsRelationVo);
  197. }
  198. }
  199. }
  200. proclamationVo.setRelationList(newsRelationVoList);
  201. //添加附件
  202. List<NewsAppendixVo> newsAppendixVoList = newsAppendixService.selectJoinList(NewsAppendixVo.class,
  203. new MPJLambdaWrapper<NewsAppendix>().eq(NewsAppendix::getNewsId, id)
  204. .select(NewsRelation::getId)
  205. .select(NewsAppendix.class, x -> VoToColumnUtil.fieldsToColumns(NewsAppendixVo.class).contains(x.getProperty()))
  206. .leftJoin(File.class, File::getFolderId, NewsAppendix::getFileId, ext -> ext.selectAs(File::getFileName, NewsAppendixVo::getFileName)
  207. .selectAs(File::getFolderId, NewsAppendixVo::getFolderId)
  208. .selectAs(File::getFileUrl, NewsAppendixVo::getFileUrl))
  209. );
  210. if (newsAppendixVoList.size() > 0) {
  211. proclamationVo.setAppendixList(newsAppendixVoList);
  212. }
  213. return proclamationVo;
  214. }
  215. @Override
  216. public IPage<ProclamationPageVo> proclamationManageBox(ProclamationPageDto dto) {
  217. MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
  218. queryNews
  219. .select(News::getId)
  220. .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
  221. .selectAs(User::getName, ProclamationPageVo::getCreateUserName)
  222. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
  223. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  224. .leftJoin(User.class, User::getId, News::getCreateUserId)
  225. .eq(!StpUtil.getRoleList().contains("GongGao"), News::getCreateUserId, StpUtil.getLoginIdAsLong())
  226. .eq(News::getTypeId, 2)
  227. .like(dto.getFullHead() != null, News::getFullHead, dto.getFullHead())
  228. .like(dto.getKeyword() != null, News::getNewsContent, dto.getKeyword())
  229. .between((ObjectUtil.isNotNull(dto.getCreateDateStart()) && ObjectUtil.isNotNull(dto.getCreateDateEnd())), News::getCreateDate, dto.getCreateDateStart(), dto.getCreateDateEnd())
  230. .orderByDesc(News::getId)
  231. .disableSubLogicDel();
  232. IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
  233. return page;
  234. }
  235. @Override
  236. public IPage<ProclamationPageVo> proclamationReceiptBox(ProclamationPageDto dto) {
  237. MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
  238. queryNews
  239. .select(News::getId)
  240. .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
  241. .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
  242. .leftJoin(Department.class, Department::getId, News::getSendDeptId)
  243. .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
  244. .eq(News::getTypeId, 2)
  245. .eq(News::getStatus, 2)
  246. .gt(News::getSendEndDate, new Date())
  247. .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
  248. .or()
  249. .eq(News::getSendRange, 2)
  250. .orderByDesc(News::getId)
  251. .disableSubLogicDel();
  252. IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
  253. return page;
  254. }
  255. @Override
  256. @Transactional(rollbackFor = Exception.class)
  257. public Boolean changeStatus(ChangeNewsDto changeNewsDto) {
  258. News xjrNews = this.getById(changeNewsDto.getId());
  259. if (changeNewsDto.getStatus() == null || xjrNews == null) {
  260. throw new MyException("参数异常");
  261. }
  262. if (changeNewsDto.getStatus().equals(xjrNews.getStatus())) {
  263. if (changeNewsDto.getStatus() == 2) {
  264. throw new MyException("公告已发布!!!");
  265. } else if (changeNewsDto.getStatus() == 3) {
  266. throw new MyException("公告已下架!!!");
  267. }
  268. }
  269. xjrNews.setStatus(changeNewsDto.getStatus());
  270. //发布公告,将阅读关系中选择的阅读人添加到关系表
  271. if (xjrNews.getStatus() == 2) {
  272. //将发布时间改为当前时间
  273. xjrNews.setReleaseTime(LocalDateTime.now());
  274. //将张贴时间改为当前时间
  275. xjrNews.setSendStartDate(LocalDateTime.now());
  276. xjrNews.setModifyUserId(StpUtil.getLoginIdAsLong());
  277. xjrNews.setModifyDate(LocalDateTime.now());
  278. //addRelation(xjrNews, null, 1);
  279. }
  280. if (xjrNews.getStatus() == 3) {
  281. //应该将关系配置表和关系表的数据设置为删除
  282. }
  283. return this.updateById(xjrNews);
  284. }
  285. @Override
  286. @Transactional(rollbackFor = Exception.class)
  287. public boolean updateProclamation(UpdateProclamationDto updateProclamationDto) {
  288. News news = BeanUtil.toBean(updateProclamationDto, News.class);
  289. news.setModifyDate(LocalDateTime.now());
  290. news.setModifyUserId(StpUtil.getLoginIdAsLong());
  291. newsMapper.updateById(news);
  292. newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
  293. if (updateProclamationDto.getAppendixList() != null) {
  294. for (AddNewsAppendixDto appendixDto : updateProclamationDto.getAppendixList()) {
  295. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  296. newsAppendix.setNewsId(news.getId());
  297. newsAppendixMapper.insert(newsAppendix);
  298. }
  299. }
  300. if (updateProclamationDto.getSendRange() == 3 && updateProclamationDto.getRelationList() != null) {
  301. newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
  302. updateRelationConfig(news, updateProclamationDto);
  303. }
  304. newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
  305. addRelation(news, BeanUtil.toBean(updateProclamationDto, AddProclamationDto.class), 2);
  306. return true;
  307. }
  308. /**
  309. * 添加阅读关系配置表
  310. *
  311. * @param news
  312. * @return
  313. */
  314. private Boolean updateRelationConfig(News news, UpdateProclamationDto updateProclamationDto) {
  315. AddProclamationDto addProclamationDto = BeanUtil.toBean(updateProclamationDto, AddProclamationDto.class);
  316. return addRelationConfig(news, addProclamationDto);
  317. }
  318. private Boolean addRelationConfig(News news, AddProclamationDto addProclamationDto) {
  319. for (AddNewsRelationDto relationDto : addProclamationDto.getRelationList()) {
  320. if (relationDto.getRelationType() == 1) {
  321. Department department = departmentMapper.selectById(relationDto.getRelationId());
  322. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  323. setNewsId(news.getId());
  324. setRelationId(relationDto.getRelationId());
  325. setRelationType(relationDto.getRelationType());
  326. if (department != null) {
  327. setRelationName(department.getName());
  328. //setRelationName("中小微企业是经济发展的“毛细血管,十二条措施明确推进破产审判全域智治集成改革,通过推广智慧破产平台、推动执破融合机制改革、推行小微企业破产特别保护,力求在涉企破产纠纷办理中提质效、降成本。扬州中院党组成员、副院长沈红表示,将以提升经营主体司法获得感和满意度为出发点和落脚点,让法治成为扬州营商环境核心竞争力。中小微企业是经济发展的毛细血管,十二条措施明确推进破产审判全域智治集成改革,通过推广智慧破产平台、推动执破融合机制改革、推行小微企业破产特别保护,力求在涉企破产纠纷办理中提质效、降成本。扬州中院党组成员、副院长沈红表示,将以提升经营主体司法获得感和满意度为出发点和落脚点,让法治成为扬州营商环境核心竞争力。");
  329. }
  330. }});
  331. }
  332. if (relationDto.getRelationType() == 2) {
  333. XjrUser xjrUser = xjrUserMapper.selectById(relationDto.getRelationId());
  334. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  335. setNewsId(news.getId());
  336. setRelationId(relationDto.getRelationId());
  337. setRelationType(relationDto.getRelationType());
  338. if (xjrUser != null) {
  339. setRelationName(xjrUser.getName());
  340. }
  341. }});
  342. }
  343. if (relationDto.getRelationType() == 3) {
  344. BaseClass baseClass = baseClassMapper.selectById(relationDto.getRelationId());
  345. BaseGrade baseGrade = null;
  346. if (baseClass == null) {
  347. baseGrade = baseGradeMapper.selectById(relationDto.getRelationId());
  348. }
  349. BaseGrade finalBaseGrade = baseGrade;
  350. newsRelationConfigMapper.insert(new NewsRelationConfig() {{
  351. setNewsId(news.getId());
  352. setRelationId(relationDto.getRelationId());
  353. setRelationType(relationDto.getRelationType());
  354. if (baseClass != null) {
  355. setRelationName(baseClass.getName());
  356. }
  357. if (finalBaseGrade != null) {
  358. setRelationName(finalBaseGrade.getName());
  359. }
  360. }});
  361. }
  362. }
  363. return true;
  364. }
  365. /**
  366. * 添加阅读关系到关系表
  367. *
  368. * @param xjrNews
  369. * @return
  370. */
  371. private Boolean addRelation(News xjrNews, AddProclamationDto addProclamationDto, int flag) {
  372. if (xjrNews.getSendRange() == 3) {
  373. List<Long> deptIdList = new ArrayList<>();
  374. List<Long> personalIdList = new ArrayList<>();
  375. List<Long> classIdList = new ArrayList<>();
  376. if (flag == 1) {
  377. //查出当前公告的关系配置
  378. //部门
  379. LambdaQueryWrapper<NewsRelationConfig> queryDeptList = new LambdaQueryWrapper<>();
  380. queryDeptList
  381. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  382. .eq(NewsRelationConfig::getRelationType, 1);
  383. List<NewsRelationConfig> deptList = newsRelationConfigMapper.selectList(queryDeptList);
  384. for (NewsRelationConfig newsRelationConfig : deptList) {
  385. deptIdList.add(newsRelationConfig.getRelationId());
  386. }
  387. //人员
  388. LambdaQueryWrapper<NewsRelationConfig> queryPersonalList = new LambdaQueryWrapper<>();
  389. queryPersonalList
  390. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  391. .eq(NewsRelationConfig::getRelationType, 2);
  392. List<NewsRelationConfig> personalList = newsRelationConfigMapper.selectList(queryPersonalList);
  393. for (NewsRelationConfig newsRelationConfig : personalList) {
  394. personalIdList.add(newsRelationConfig.getRelationId());
  395. }
  396. //班级
  397. LambdaQueryWrapper<NewsRelationConfig> queryClassList = new LambdaQueryWrapper<>();
  398. queryClassList
  399. .eq(NewsRelationConfig::getNewsId, xjrNews.getId())
  400. .eq(NewsRelationConfig::getRelationType, 3);
  401. List<NewsRelationConfig> classList = newsRelationConfigMapper.selectList(queryClassList);
  402. for (NewsRelationConfig newsRelationConfig : classList) {
  403. classIdList.add(newsRelationConfig.getRelationId());
  404. }
  405. }
  406. if (flag == 2) {
  407. for (AddNewsRelationDto addNewsRelationDto : addProclamationDto.getRelationList()) {
  408. if (addNewsRelationDto.getRelationType() == 1) {
  409. deptIdList.add(addNewsRelationDto.getRelationId());
  410. }
  411. if (addNewsRelationDto.getRelationType() == 2) {
  412. personalIdList.add(addNewsRelationDto.getRelationId());
  413. }
  414. if (addNewsRelationDto.getRelationType() == 3) {
  415. classIdList.add(addNewsRelationDto.getRelationId());
  416. }
  417. }
  418. }
  419. //对人员进行筛选,避免重复添加
  420. List<Long> userIdList = new ArrayList<>();
  421. if (!personalIdList.isEmpty()) {
  422. //获取人员的班级或者部门
  423. List<DeptIdOrClassIdVo> deptIdOrClassIdVoList = newsMapper.getDeptIdOrClassId(personalIdList);
  424. for (DeptIdOrClassIdVo deptIdOrClassIdVo : deptIdOrClassIdVoList) {
  425. if (deptIdOrClassIdVo.getClassId() != null) {//有班级是学生
  426. if (!classIdList.contains(deptIdOrClassIdVo.getClassId())) {
  427. userIdList.add(deptIdOrClassIdVo.getUserId());
  428. }
  429. } else {
  430. if (!deptIdList.contains(deptIdOrClassIdVo.getDeptId())) {
  431. userIdList.add(deptIdOrClassIdVo.getUserId());
  432. }
  433. }
  434. }
  435. }
  436. //添加部门人员
  437. if (!deptIdList.isEmpty()) {
  438. newsRelationMapper.insertDeptUser(xjrNews.getId(), deptIdList);
  439. }
  440. //添加部门人员
  441. if (!classIdList.isEmpty()) {
  442. newsRelationMapper.insertClassUser(xjrNews.getId(), classIdList);
  443. }
  444. //添加部门人员
  445. if (!userIdList.isEmpty()) {
  446. newsRelationMapper.insertPersonl(xjrNews.getId(), userIdList);
  447. }
  448. } else if (xjrNews.getSendRange() == 2) {
  449. newsRelationMapper.insertAllTeaStaff(xjrNews.getId());
  450. } else if (xjrNews.getSendRange() == 1) {
  451. newsRelationMapper.insertAllUser(xjrNews.getId());
  452. }
  453. return true;
  454. }
  455. @Override
  456. @Transactional(rollbackFor = Exception.class)
  457. public Boolean add(AddNewsDto addNewsDto) {
  458. News news = BeanUtil.toBean(addNewsDto, News.class);
  459. news.setEnabledMark(EnabledMark.ENABLED.getCode());
  460. if(news.getTypeId() != null && news.getTypeId() == 3){
  461. news.setWfStatus(1);
  462. news.setStatus(2);
  463. }
  464. newsMapper.insert(news);
  465. //添加附件子表
  466. if (addNewsDto.getAppendixList() != null) {
  467. for (AddNewsAppendixDto appendixDto : addNewsDto.getAppendixList()) {
  468. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  469. newsAppendix.setNewsId(news.getId());
  470. newsAppendixMapper.insert(newsAppendix);
  471. }
  472. }
  473. //公告需要添加阅读关系,发送范围 1=全校教职工 2=全校师生 3=指定人员
  474. //1=全校教职工,添加全校教职工到关系表
  475. addRelation(news, BeanUtil.toBean(addNewsDto, AddProclamationDto.class), 1);
  476. //添加新闻和公告的时候,如果状态是2,表示新闻和公告实时发布了,张贴开始时间就应该是发布时间需要发送消息
  477. if (ObjectUtil.isNotNull(addNewsDto.getStatus()) && addNewsDto.getStatus() == 2 && addNewsDto.getTypeId() != 3) {
  478. SendMessage(news.getId());
  479. }
  480. return true;
  481. }
  482. @Override
  483. public IPage<NewsPageVo> manageBox(NewsPageDto dto) {
  484. dto.setLoginId(StpUtil.getLoginIdAsLong());
  485. IPage<NewsPageVo> page = newsMapper.manageBox(ConventPage.getPage(dto), dto);
  486. return page;
  487. }
  488. @Override
  489. public IPage<NewsPageVo> receiptBox(NewsPageDto dto) {
  490. dto.setLoginId(StpUtil.getLoginIdAsLong());
  491. if (StpUtil.getRoleList().contains("4")) {
  492. dto.setLoginRoleId(4L);
  493. }
  494. IPage<NewsPageVo> page = newsMapper.receiptBox(ConventPage.getPage(dto), dto);
  495. return page;
  496. }
  497. @Override
  498. @Transactional(rollbackFor = Exception.class)
  499. public boolean update(UpdateNewsDto updateNewsDto) {
  500. News news = BeanUtil.toBean(updateNewsDto, News.class);
  501. newsMapper.updateById(news);
  502. newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
  503. if (updateNewsDto.getAppendixList() != null) {
  504. for (AddNewsAppendixDto appendixDto : updateNewsDto.getAppendixList()) {
  505. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  506. newsAppendix.setNewsId(news.getId());
  507. newsAppendixMapper.insert(newsAppendix);
  508. }
  509. }
  510. if (updateNewsDto.getRelationList() != null) {
  511. newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
  512. newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
  513. addRelation(news, BeanUtil.toBean(updateNewsDto, AddProclamationDto.class), 1);
  514. }
  515. return true;
  516. }
  517. /**
  518. * 设置新闻阅读权限
  519. */
  520. @Override
  521. @Transactional(rollbackFor = Exception.class)
  522. public boolean updateRelation(UpdateNewsRelationDto updateRelationDto) {
  523. if (updateRelationDto.getRelationList() != null) {
  524. for (NewsRelationConfigDto newsRelationConfigDto : updateRelationDto.getRelationList()) {
  525. NewsRelationConfig newsRelationConfig = new NewsRelationConfig();
  526. newsRelationConfig.setNewsId(updateRelationDto.getId());
  527. newsRelationConfig.setRelationId(newsRelationConfigDto.getRelationId());
  528. newsRelationConfig.setRelationName(newsRelationConfigDto.getRelationName());
  529. newsRelationConfig.setRelationType(updateRelationDto.getRelationType());
  530. newsRelationConfigMapper.insert(newsRelationConfig);
  531. // 部门
  532. if (updateRelationDto.getRelationType() == 1) {
  533. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  534. .eq(UserDeptRelation::getDeptId, newsRelationConfigDto.getRelationId()));
  535. for (UserDeptRelation userDeptRelation : userDeptRelationList) {
  536. NewsRelation newsRelation = new NewsRelation();
  537. newsRelation.setUserId(userDeptRelation.getUserId());
  538. newsRelation.setNewsId(updateRelationDto.getId());
  539. newsRelation.setReadMark(0);
  540. newsRelationMapper.insert(newsRelation);
  541. }
  542. }
  543. // 人员
  544. if (updateRelationDto.getRelationType() == 2) {
  545. NewsRelation newsRelation = new NewsRelation();
  546. newsRelation.setUserId(newsRelationConfigDto.getRelationId());
  547. newsRelation.setNewsId(updateRelationDto.getId());
  548. newsRelation.setReadMark(0);
  549. newsRelationMapper.insert(newsRelation);
  550. }
  551. // 班级
  552. if (updateRelationDto.getRelationType() == 3) {
  553. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  554. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfigDto.getRelationId()));
  555. for (BaseStudentSchoolRoll baseStudentSchoolRoll : baseStudentSchoolRollList) {
  556. NewsRelation newsRelation = new NewsRelation();
  557. newsRelation.setUserId(baseStudentSchoolRoll.getUserId());
  558. newsRelation.setNewsId(updateRelationDto.getId());
  559. newsRelation.setReadMark(0);
  560. newsRelationMapper.insert(newsRelation);
  561. }
  562. }
  563. }
  564. }
  565. return true;
  566. }
  567. @Override
  568. @Transactional(rollbackFor = Exception.class)
  569. public boolean deleteRelation(DeleteNewsRelationDto deleteNewsRelationDto) {
  570. if (deleteNewsRelationDto.getRelationId() != null) {
  571. List<NewsRelationConfig> newsRelationConfigList = newsRelationConfigMapper.selectList(Wrappers.<NewsRelationConfig>query().lambda()
  572. .eq(NewsRelationConfig::getNewsId, deleteNewsRelationDto.getNewsId())
  573. .in(NewsRelationConfig::getId, deleteNewsRelationDto.getRelationId())
  574. );
  575. for (NewsRelationConfig newsRelationConfig : newsRelationConfigList) {
  576. // 部门
  577. if (newsRelationConfig.getRelationType() == 1) {
  578. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  579. .eq(UserDeptRelation::getDeptId, newsRelationConfig.getRelationId()));
  580. List<Long> userIdList = userDeptRelationList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList());
  581. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  582. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  583. .in(NewsRelation::getUserId, userIdList));
  584. }
  585. // 人员
  586. if (newsRelationConfig.getRelationType() == 2) {
  587. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  588. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  589. .eq(NewsRelation::getUserId, newsRelationConfig.getRelationId()));
  590. }
  591. // 班级
  592. if (newsRelationConfig.getRelationType() == 3) {
  593. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  594. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfig.getRelationId()));
  595. List<Long> userIdList = baseStudentSchoolRollList.stream().map(BaseStudentSchoolRoll::getUserId).collect(Collectors.toList());
  596. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  597. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  598. .in(NewsRelation::getUserId, userIdList));
  599. }
  600. }
  601. newsRelationConfigMapper.deleteBatchIds(deleteNewsRelationDto.getRelationId());
  602. }
  603. return true;
  604. }
  605. @Override
  606. @Transactional(rollbackFor = Exception.class)
  607. public boolean delete(List<Long> ids) {
  608. newsMapper.deleteBatchIds(ids);
  609. return true;
  610. }
  611. @Override
  612. public boolean SendMessage(Long id) {
  613. try {
  614. News news = newsMapper.selectById(id);
  615. Department department = departmentMapper.selectById(news.getSendDeptId());
  616. if (news.getSendRange() == 1) {
  617. List<User> userList = userMapper.selectList(Wrappers.<User>query().lambda().isNotNull(User::getOpenId).ne(User::getOpenId, ""));
  618. if (userList.size() > 0) {
  619. for (User user : userList) {
  620. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  621. weChatSendMessageDto.setUserId(user.getOpenId());
  622. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
  623. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  624. weChatSendMessageDto.setMsgId(id.toString());
  625. JSONObject data = new JSONObject();
  626. JSONObject data1 = new JSONObject();
  627. String hValue = news.getBriefHead().replace("“", "").replace("”", "").replace("\"", "").replace("\n", "").replace("\r", "").replace("\t", "");
  628. data1.put("value", hValue);
  629. data.put("thing23", data1);
  630. JSONObject data2 = new JSONObject();
  631. data2.put("value", (department == null) ? "重庆铜梁职业教育中心" : department.getName());
  632. data.put("thing29", data2);
  633. JSONObject data3 = new JSONObject();
  634. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  635. data.put("time17", data3);
  636. weChatSendMessageDto.setContent(data);
  637. weChatService.sendTemplateMessage(weChatSendMessageDto);
  638. }
  639. }
  640. } else {
  641. List<NewsRelationVo> newsRelationVoList = newsRelationMapper.selectJoinList(NewsRelationVo.class,
  642. new MPJLambdaWrapper<NewsRelation>().distinct()
  643. .eq(NewsRelation::getNewsId, id)
  644. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  645. .innerJoin(User.class, onWrapper -> onWrapper.eq(NewsRelation::getUserId, User::getId).isNotNull(User::getOpenId).ne(User::getOpenId, ""))
  646. .selectAs(User::getOpenId, NewsRelationVo::getUserName)
  647. );
  648. if (newsRelationVoList.size() > 0) {
  649. for (NewsRelationVo newsRelationVo : newsRelationVoList) {
  650. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  651. weChatSendMessageDto.setUserId(newsRelationVo.getUserName());
  652. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
  653. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  654. weChatSendMessageDto.setMsgId(id.toString());
  655. JSONObject data = new JSONObject();
  656. JSONObject data1 = new JSONObject();
  657. data1.put("value", news.getBriefHead());
  658. data.put("thing23", data1);
  659. JSONObject data2 = new JSONObject();
  660. data2.put("value", (department == null) ? "重庆铜梁职业教育中心" : department.getName());
  661. data.put("thing29", data2);
  662. JSONObject data3 = new JSONObject();
  663. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  664. data.put("time17", data3);
  665. weChatSendMessageDto.setContent(data);
  666. weChatService.sendTemplateMessage(weChatSendMessageDto);
  667. }
  668. }
  669. }
  670. } catch (Exception ex) {
  671. }
  672. return true;
  673. }
  674. @Override
  675. public boolean dataHandle(Long id) {
  676. News news = this.getById(id);
  677. if (news.getTypeId() != 1) {
  678. return true;
  679. }
  680. news.setSendRange(2);
  681. this.updateById(news);
  682. newsRelationMapper.insertAllTeaStaff(news.getId());
  683. return true;
  684. }
  685. @Override
  686. public boolean allRead(Long userId) {
  687. newsMapper.allRead(userId);
  688. return true;
  689. }
  690. }