NewsServiceImpl.java 18 KB

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