NewsServiceImpl.java 41 KB

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