NewsServiceImpl.java 39 KB

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