NewsServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  10. import com.github.yulichang.base.MPJBaseServiceImpl;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.xjrsoft.common.enums.EnabledMark;
  13. import com.xjrsoft.common.page.ConventPage;
  14. import com.xjrsoft.common.utils.LocalDateTimeUtil;
  15. import com.xjrsoft.common.utils.TreeUtil;
  16. import com.xjrsoft.common.utils.VoToColumnUtil;
  17. import com.xjrsoft.config.CommonPropertiesConfig;
  18. import com.xjrsoft.module.base.entity.BaseClass;
  19. import com.xjrsoft.module.base.entity.BaseGrade;
  20. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  21. import com.xjrsoft.module.oa.dto.*;
  22. import com.xjrsoft.module.oa.entity.News;
  23. import com.xjrsoft.module.oa.entity.NewsAppendix;
  24. import com.xjrsoft.module.oa.entity.NewsRelation;
  25. import com.xjrsoft.module.oa.entity.NewsRelationConfig;
  26. import com.xjrsoft.module.oa.mapper.NewsAppendixMapper;
  27. import com.xjrsoft.module.oa.mapper.NewsMapper;
  28. import com.xjrsoft.module.oa.mapper.NewsRelationConfigMapper;
  29. import com.xjrsoft.module.oa.mapper.NewsRelationMapper;
  30. import com.xjrsoft.module.oa.service.INewsService;
  31. import com.xjrsoft.module.oa.vo.NewsGradeClassTreeVo;
  32. import com.xjrsoft.module.oa.vo.NewsPageVo;
  33. import com.xjrsoft.module.oa.vo.NewsRelationVo;
  34. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  35. import com.xjrsoft.module.organization.entity.Department;
  36. import com.xjrsoft.module.organization.entity.User;
  37. import com.xjrsoft.module.organization.entity.UserDeptRelation;
  38. import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
  39. import com.xjrsoft.module.organization.mapper.UserMapper;
  40. import com.xjrsoft.module.organization.service.IWeChatService;
  41. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  42. import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
  43. import com.xjrsoft.module.teacher.entity.XjrUser;
  44. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  45. import lombok.AllArgsConstructor;
  46. import org.springframework.stereotype.Service;
  47. import org.springframework.transaction.annotation.Transactional;
  48. import java.util.ArrayList;
  49. import java.util.List;
  50. import java.util.stream.Collectors;
  51. /**
  52. * <p>
  53. * 新闻中心表 服务实现类
  54. * </p>
  55. *
  56. * @author zlf
  57. * @since 2022-06-16
  58. */
  59. @Service
  60. @AllArgsConstructor
  61. public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implements INewsService {
  62. private final NewsMapper newsMapper;
  63. private final NewsAppendixMapper newsAppendixMapper;
  64. private final NewsRelationMapper newsRelationMapper;
  65. private final NewsRelationConfigMapper newsRelationConfigMapper;
  66. private final UserDeptRelationMapper userDeptRelationMapper;
  67. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  68. private final IWeChatService weChatService;
  69. private final UserMapper userMapper;
  70. private final BaseClassMapper baseClassMapper;
  71. private final XjrUserMapper xjrUserMapper;
  72. private final CommonPropertiesConfig commonPropertiesConfig;
  73. @Override
  74. public List<NewsGradeClassTreeVo> getGradeClassTree() {
  75. List<NewsGradeClassTreeVo> treeVoList = new ArrayList<NewsGradeClassTreeVo>();
  76. //获取所有班级的年级作为树的父级
  77. MPJLambdaWrapper<BaseClass> queryGrade = new MPJLambdaWrapper<>();
  78. queryGrade
  79. .distinct()
  80. .selectAs(BaseGrade::getId, BaseGrade::getId)
  81. .selectAs(BaseGrade::getName, BaseGrade::getName)
  82. .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId);
  83. List<BaseGrade> gradeList = baseClassMapper.selectJoinList(BaseGrade.class, queryGrade);
  84. gradeList.forEach((node) -> {
  85. treeVoList.add(new NewsGradeClassTreeVo(){{
  86. setId(node.getId());
  87. setName(node.getName());
  88. }});
  89. });
  90. List<BaseClass> classList = baseClassMapper.selectList(new QueryWrapper<BaseClass>());
  91. //获取班级荣誉中出现的学期下的所有班级作为树的子级
  92. classList.forEach((node) -> {
  93. treeVoList.add(new NewsGradeClassTreeVo(){{
  94. setId(node.getId());
  95. setName(node.getName());
  96. setParentId(node.getGradeId());
  97. }});
  98. });
  99. List<NewsGradeClassTreeVo> resultTreeVoList = TreeUtil.build(treeVoList);
  100. return resultTreeVoList;
  101. }
  102. @Override
  103. @Transactional(rollbackFor = Exception.class)
  104. public Boolean add(AddNewsDto addNewsDto) {
  105. News news = BeanUtil.toBean(addNewsDto, News.class);
  106. news.setEnabledMark(EnabledMark.ENABLED.getCode());
  107. newsMapper.insert(news);
  108. //添加附件子表
  109. if (addNewsDto.getAppendixList() != null) {
  110. for (AddNewsAppendixDto appendixDto : addNewsDto.getAppendixList()) {
  111. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  112. newsAppendix.setNewsId(news.getId());
  113. newsAppendixMapper.insert(newsAppendix);
  114. }
  115. }
  116. //公告需要添加阅读关系,发送范围 1=全校教职工 2=全校师生 3=指定人员
  117. //1=全校教职工,添加全校教职工到关系表
  118. if(addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1){
  119. // MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  120. // queryUser
  121. // .leftJoin(UserRoleRelation.class,UserRoleRelation::getUserId,XjrUser::getId)
  122. // .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
  123. // .eq(Department::getId,deptId);
  124. // List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
  125. }
  126. if (addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1) {
  127. for (AddNewsRelationDto relationDto : addNewsDto.getRelationList()) {
  128. NewsRelationConfig newsRelationConfig = BeanUtil.toBean(relationDto, NewsRelationConfig.class);
  129. newsRelationConfig.setNewsId(news.getId());
  130. newsRelationConfigMapper.insert(newsRelationConfig);
  131. NewsRelation newsRelation = BeanUtil.toBean(relationDto, NewsRelation.class);
  132. newsRelation.setNewsId(news.getId());
  133. newsRelation.setReadMark(0);
  134. if (relationDto.getRelationType() == 1) {
  135. // 获取部门下的人员添加
  136. Long deptId = relationDto.getRelationId();
  137. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  138. queryUser
  139. .leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
  140. .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
  141. .eq(Department::getId,deptId);
  142. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
  143. List<Long> userIdList = new ArrayList<>();
  144. for (XjrUser user: userList) {
  145. userIdList.add(user.getId());
  146. }
  147. for (Long userId: userIdList) {
  148. newsRelation.setUserId(userId);
  149. newsRelationMapper.insert(newsRelation);
  150. }
  151. }
  152. if (relationDto.getRelationType() == 2) {
  153. newsRelation.setUserId(relationDto.getRelationId());
  154. newsRelationMapper.insert(newsRelation);
  155. }
  156. if (relationDto.getRelationType() == 3) {
  157. // 获取班级下的人员添加
  158. Long deptId = relationDto.getRelationId();
  159. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  160. queryUser
  161. .leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
  162. .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
  163. .eq(Department::getId,deptId);
  164. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
  165. List<Long> userIdList = new ArrayList<>();
  166. for (XjrUser user: userList) {
  167. userIdList.add(user.getId());
  168. }
  169. for (Long userId: userIdList) {
  170. newsRelation.setUserId(userId);
  171. newsRelationMapper.insert(newsRelation);
  172. }
  173. }
  174. }
  175. }
  176. //添加新闻和公告的时候,如果状态是2,表示新闻和公告实时发布了,张贴开始时间就应该是发布时间需要发送消息
  177. if(ObjectUtil.isNotNull(addNewsDto.getStatus()) && addNewsDto.getStatus() == 2){
  178. SendMessage(news.getId());
  179. }
  180. return true;
  181. }
  182. @Override
  183. public IPage<NewsPageVo> manageBox(NewsPageDto dto) {
  184. dto.setLoginId(StpUtil.getLoginIdAsLong());
  185. IPage<NewsPageVo> page = newsMapper.manageBox(ConventPage.getPage(dto), dto);
  186. return page;
  187. }
  188. @Override
  189. public IPage<NewsPageVo> receiptBox(NewsPageDto dto) {
  190. dto.setLoginId(StpUtil.getLoginIdAsLong());
  191. IPage<NewsPageVo> page = newsMapper.receiptBox(ConventPage.getPage(dto), dto);
  192. return page;
  193. }
  194. @Override
  195. @Transactional(rollbackFor = Exception.class)
  196. public boolean update(UpdateNewsDto updateNewsDto) {
  197. News news = BeanUtil.toBean(updateNewsDto, News.class);
  198. newsMapper.updateById(news);
  199. newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
  200. if (updateNewsDto.getAppendixList() != null) {
  201. for (AddNewsAppendixDto appendixDto : updateNewsDto.getAppendixList()) {
  202. NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
  203. newsAppendix.setNewsId(news.getId());
  204. newsAppendixMapper.insert(newsAppendix);
  205. }
  206. }
  207. if (updateNewsDto.getRelationList() != null) {
  208. newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
  209. newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
  210. for (AddNewsRelationDto relationDto : updateNewsDto.getRelationList()) {
  211. NewsRelationConfig newsRelationConfig = BeanUtil.toBean(relationDto, NewsRelationConfig.class);
  212. newsRelationConfig.setNewsId(news.getId());
  213. newsRelationConfigMapper.insert(newsRelationConfig);
  214. NewsRelation newsRelation = BeanUtil.toBean(relationDto, NewsRelation.class);
  215. newsRelation.setNewsId(news.getId());
  216. newsRelation.setReadMark(0);
  217. if (relationDto.getRelationType() == 1) {
  218. // 获取部门下的人员添加
  219. } else {
  220. newsRelation.setUserId(relationDto.getRelationId());
  221. newsRelationMapper.insert(newsRelation);
  222. }
  223. }
  224. }
  225. return true;
  226. }
  227. /**
  228. * 设置新闻阅读权限
  229. */
  230. @Override
  231. @Transactional(rollbackFor = Exception.class)
  232. public boolean updateRelation(UpdateNewsRelationDto updateRelationDto) {
  233. if (updateRelationDto.getRelationList() != null) {
  234. for (NewsRelationConfigDto newsRelationConfigDto : updateRelationDto.getRelationList()) {
  235. NewsRelationConfig newsRelationConfig = new NewsRelationConfig();
  236. newsRelationConfig.setNewsId(updateRelationDto.getId());
  237. newsRelationConfig.setRelationId(newsRelationConfigDto.getRelationId());
  238. newsRelationConfig.setRelationName(newsRelationConfigDto.getRelationName());
  239. newsRelationConfig.setRelationType(updateRelationDto.getRelationType());
  240. newsRelationConfigMapper.insert(newsRelationConfig);
  241. // 部门
  242. if (updateRelationDto.getRelationType() == 1) {
  243. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  244. .eq(UserDeptRelation::getDeptId, newsRelationConfigDto.getRelationId()));
  245. for (UserDeptRelation userDeptRelation : userDeptRelationList) {
  246. NewsRelation newsRelation = new NewsRelation();
  247. newsRelation.setUserId(userDeptRelation.getUserId());
  248. newsRelation.setNewsId(updateRelationDto.getId());
  249. newsRelation.setReadMark(0);
  250. newsRelationMapper.insert(newsRelation);
  251. }
  252. }
  253. // 人员
  254. if (updateRelationDto.getRelationType() == 2) {
  255. NewsRelation newsRelation = new NewsRelation();
  256. newsRelation.setUserId(newsRelationConfigDto.getRelationId());
  257. newsRelation.setNewsId(updateRelationDto.getId());
  258. newsRelation.setReadMark(0);
  259. newsRelationMapper.insert(newsRelation);
  260. }
  261. // 班级
  262. if (updateRelationDto.getRelationType() == 3) {
  263. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  264. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfigDto.getRelationId()));
  265. for (BaseStudentSchoolRoll baseStudentSchoolRoll : baseStudentSchoolRollList) {
  266. NewsRelation newsRelation = new NewsRelation();
  267. newsRelation.setUserId(baseStudentSchoolRoll.getUserId());
  268. newsRelation.setNewsId(updateRelationDto.getId());
  269. newsRelation.setReadMark(0);
  270. newsRelationMapper.insert(newsRelation);
  271. }
  272. }
  273. }
  274. }
  275. return true;
  276. }
  277. @Override
  278. @Transactional(rollbackFor = Exception.class)
  279. public boolean deleteRelation(DeleteNewsRelationDto deleteNewsRelationDto) {
  280. if (deleteNewsRelationDto.getRelationId() != null) {
  281. List<NewsRelationConfig> newsRelationConfigList = newsRelationConfigMapper.selectList(Wrappers.<NewsRelationConfig>query().lambda()
  282. .eq(NewsRelationConfig::getNewsId, deleteNewsRelationDto.getNewsId())
  283. .in(NewsRelationConfig::getId, deleteNewsRelationDto.getRelationId())
  284. );
  285. for (NewsRelationConfig newsRelationConfig : newsRelationConfigList) {
  286. // 部门
  287. if (newsRelationConfig.getRelationType() == 1) {
  288. List<UserDeptRelation> userDeptRelationList = userDeptRelationMapper.selectList(Wrappers.<UserDeptRelation>query().lambda()
  289. .eq(UserDeptRelation::getDeptId, newsRelationConfig.getRelationId()));
  290. List<Long> userIdList = userDeptRelationList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList());
  291. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  292. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  293. .in(NewsRelation::getUserId, userIdList));
  294. }
  295. // 人员
  296. if (newsRelationConfig.getRelationType() == 2) {
  297. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  298. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  299. .eq(NewsRelation::getUserId, newsRelationConfig.getRelationId()));
  300. }
  301. // 班级
  302. if (newsRelationConfig.getRelationType() == 3) {
  303. List<BaseStudentSchoolRoll> baseStudentSchoolRollList = baseStudentSchoolRollMapper.selectList(Wrappers.<BaseStudentSchoolRoll>query().lambda()
  304. .eq(BaseStudentSchoolRoll::getClassId, newsRelationConfig.getRelationId()));
  305. List<Long> userIdList = baseStudentSchoolRollList.stream().map(BaseStudentSchoolRoll::getUserId).collect(Collectors.toList());
  306. newsRelationMapper.delete(Wrappers.<NewsRelation>query().lambda()
  307. .eq(NewsRelation::getNewsId, deleteNewsRelationDto.getNewsId())
  308. .in(NewsRelation::getUserId, userIdList));
  309. }
  310. }
  311. newsRelationConfigMapper.deleteBatchIds(deleteNewsRelationDto.getRelationId());
  312. }
  313. return true;
  314. }
  315. @Override
  316. @Transactional(rollbackFor = Exception.class)
  317. public boolean delete(List<Long> ids) {
  318. newsMapper.deleteBatchIds(ids);
  319. return true;
  320. }
  321. @Override
  322. public boolean SendMessage(Long id) {
  323. try {
  324. News news = newsMapper.selectById(id);
  325. if (news.getSendRange() == 1) {
  326. List<User> userList = userMapper.selectList(Wrappers.<User>query().lambda().isNotNull(User::getOpenId).ne(User::getOpenId, ""));
  327. if (userList.size() > 0) {
  328. for (User user : userList) {
  329. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  330. weChatSendMessageDto.setUserId(user.getOpenId());
  331. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4");
  332. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  333. weChatSendMessageDto.setMsgId(id.toString());
  334. JSONObject data = new JSONObject();
  335. JSONObject data1 = new JSONObject();
  336. data1.put("value", news.getFullHead());
  337. data.put("thing23", data1);
  338. JSONObject data2 = new JSONObject();
  339. data2.put("value", news.getAuthorName());
  340. data.put("thing18", data2);
  341. JSONObject data3 = new JSONObject();
  342. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  343. data.put("time17", data3);
  344. weChatSendMessageDto.setContent(data);
  345. weChatService.sendTemplateMessage(weChatSendMessageDto);
  346. }
  347. }
  348. } else {
  349. List<NewsRelationVo> newsRelationVoList = newsRelationMapper.selectJoinList(NewsRelationVo.class,
  350. new MPJLambdaWrapper<NewsRelation>().distinct()
  351. .eq(NewsRelation::getNewsId, id)
  352. .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
  353. .innerJoin(User.class, onWrapper -> onWrapper.eq(NewsRelation::getUserId, User::getId).isNotNull(User::getOpenId).ne(User::getOpenId, ""))
  354. .selectAs(User::getOpenId, NewsRelationVo::getUserName)
  355. );
  356. if (newsRelationVoList.size() > 0) {
  357. for (NewsRelationVo newsRelationVo : newsRelationVoList) {
  358. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  359. weChatSendMessageDto.setUserId(newsRelationVo.getUserName());
  360. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4");
  361. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  362. weChatSendMessageDto.setMsgId(id.toString());
  363. JSONObject data = new JSONObject();
  364. JSONObject data1 = new JSONObject();
  365. data1.put("value", news.getFullHead());
  366. data.put("thing23", data1);
  367. JSONObject data2 = new JSONObject();
  368. data2.put("value", news.getAuthorName());
  369. data.put("thing18", data2);
  370. JSONObject data3 = new JSONObject();
  371. data3.put("value", LocalDateTimeUtil.format(news.getReleaseTime(), "yyyy-MM-dd HH:mm:ss"));
  372. data.put("time17", data3);
  373. weChatSendMessageDto.setContent(data);
  374. weChatService.sendTemplateMessage(weChatSendMessageDto);
  375. }
  376. }
  377. }
  378. } catch (Exception ex) {
  379. }
  380. return true;
  381. }
  382. }