ZxConferenceServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. package com.ruoyi.system.service.impl;
  2. import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
  3. import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
  4. import com.ruoyi.common.config.RuoYiConfig;
  5. import com.ruoyi.common.utils.*;
  6. import com.ruoyi.system.domain.ZxFj;
  7. import com.ruoyi.system.domain.conference.ZxConference;
  8. import com.ruoyi.system.domain.conference.ZxConferenceUser;
  9. import com.ruoyi.system.domain.notice.ZxNotice;
  10. import com.ruoyi.system.mapper.ZxFjMapper;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import com.ruoyi.system.mapper.ZxConferenceMapper;
  15. import com.ruoyi.system.service.IZxConferenceService;
  16. import java.time.LocalDate;
  17. import java.time.format.TextStyle;
  18. import java.util.ArrayList;
  19. import java.util.Date;
  20. import java.util.List;
  21. import java.util.Locale;
  22. import static com.ruoyi.common.constant.CommonConstants.*;
  23. /**
  24. * 政协会议活动Service业务层处理
  25. *
  26. * @author boman
  27. * @date 2024-03-06
  28. */
  29. @Service
  30. public class ZxConferenceServiceImpl implements IZxConferenceService {
  31. @Autowired
  32. private ZxConferenceMapper zxConferenceMapper;
  33. @Autowired
  34. private ZxFjMapper zxFjMapper;
  35. /**
  36. * 获取政协会议活动详细信息
  37. */
  38. @Override
  39. public ZxConference selectZxConferenceInfo(ZxConference zxConference) {
  40. ZxConference zxConferenceNew = zxConferenceMapper.selectZxConferenceInfo(zxConference);
  41. ZxFj zxFj = new ZxFj();
  42. zxFj.setSourceId(zxConferenceNew.getConferenceId());
  43. zxFj.setType(FOR);
  44. List<ZxFj> zxFjs = zxFjMapper.selectZxFjList(zxFj);
  45. if (zxFjs != null){
  46. zxConferenceNew.setZxFjList(zxFjs);
  47. }
  48. return zxConferenceNew;
  49. }
  50. /**
  51. * 查询政协会议活动人员详情
  52. *
  53. * @param conferenceId 政协会议活动主键
  54. * @return
  55. */
  56. @Override
  57. public List<ZxConferenceUser> selectZxConferenceUserByConferenceId(Long conferenceId) {
  58. return zxConferenceMapper.selectZxConferenceUserByConferenceId(conferenceId);
  59. }
  60. /**
  61. *查询政协会议活动人员详情
  62. * @return
  63. */
  64. @Override
  65. public List<ZxConferenceUser> selectZxConferenceUser(ZxConferenceUser zxConferenceUser) {
  66. return zxConferenceMapper.selectZxConferenceUser(zxConferenceUser);
  67. }
  68. /**
  69. * 查询政协会议活动列表
  70. *
  71. * @param zxConference 政协会议活动
  72. * @return 政协会议活动
  73. */
  74. @Override
  75. public List<ZxConference> selectZxConferenceList(ZxConference zxConference) {
  76. //查询是否答复,不答复算未读
  77. List<ZxConference> zxConferences = zxConferenceMapper.selectZxConferenceList(zxConference);
  78. if (zxConferences != null && zxConferences.size() > 0) {
  79. long count;
  80. for (ZxConference conference : zxConferences) {
  81. List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
  82. conference.setRead("0");
  83. conference.setNoRead("0");
  84. if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
  85. //找出答复字段不是null的
  86. count = zxConferenceUserList.stream().filter(e -> e.getIsJoin() != null).count();
  87. conference.setRead(count + "");
  88. conference.setNoRead(String.valueOf(zxConferenceUserList.size() - count));
  89. String isJoin = zxConferenceUserList.get(0).getIsJoin();
  90. if (StringUtils.isNotEmpty(isJoin)){
  91. conference.setIsJoin(isJoin);
  92. }
  93. }
  94. }
  95. }
  96. return zxConferences;
  97. }
  98. /**
  99. * 新增政协会议活动
  100. *
  101. * @param zxConference 政协会议活动
  102. * @return 结果
  103. */
  104. @Transactional(rollbackFor = Exception.class)
  105. @Override
  106. public int insertZxConference(ZxConference zxConference) {
  107. zxConference.setCreateTime(DateUtils.getNowDate());
  108. zxConference.setPublishTime(DateUtils.getNowDate());
  109. int rows = zxConferenceMapper.insertZxConference(zxConference);
  110. insertZxConferenceUser(zxConference);
  111. insertZxFj(zxConference);
  112. try {
  113. String imagePath= QRCodeUtils.encode(zxConference.getConferenceId().toString(), null, RuoYiConfig.getUploadQrPath(), true);
  114. zxConference.setConferenceQr(imagePath);
  115. zxConferenceMapper.updateZxConference(zxConference);
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. return rows;
  120. }
  121. /**
  122. * 修改政协会议活动
  123. *
  124. * @param zxConference 政协会议活动
  125. * @return 结果
  126. */
  127. @Transactional(rollbackFor = Exception.class)
  128. @Override
  129. public int updateZxConference(ZxConference zxConference) {
  130. zxConference.setUpdateTime(DateUtils.getNowDate());
  131. zxConferenceMapper.deleteZxConferenceUserByConferenceId(zxConference.getConferenceId());
  132. ZxFj fj = new ZxFj();
  133. fj.setSourceId(zxConference.getConferenceId());
  134. fj.setType(FOR);
  135. //删除附件
  136. zxFjMapper.deleteZxFj(fj);
  137. insertZxConferenceUser(zxConference);
  138. insertZxFj(zxConference);
  139. return zxConferenceMapper.updateZxConference(zxConference);
  140. }
  141. /**
  142. * 修改会议答复信息
  143. */
  144. @Override
  145. public int updateReply(ZxConferenceUser zxConferenceUser) {
  146. zxConferenceUser.setUserId(SecurityUtils.getUserId());
  147. zxConferenceUser.setReplyTime(DateUtils.getNowDate());
  148. return zxConferenceMapper.updateReply(zxConferenceUser);
  149. }
  150. /**
  151. * 修改请假审批
  152. */
  153. @Override
  154. public int updateApproval(ZxConferenceUser zxConferenceUser) {
  155. return zxConferenceMapper.updateReply(zxConferenceUser);
  156. }
  157. /**
  158. * 会议签到
  159. * @param zxConferenceUser
  160. * @return
  161. */
  162. @Override
  163. public int signIn(ZxConferenceUser zxConferenceUser) {
  164. zxConferenceUser.setSignIn(DateUtils.getNowDate());
  165. return zxConferenceMapper.signIn(zxConferenceUser);
  166. }
  167. /**
  168. * 批量删除政协会议活动
  169. *
  170. * @param conferenceIds 需要删除的政协会议活动主键
  171. * @return 结果
  172. */
  173. @Transactional(rollbackFor = Exception.class)
  174. @Override
  175. public int deleteZxConferenceByConferenceIds(Long[] conferenceIds) {
  176. zxConferenceMapper.deleteZxConferenceUserByConferenceIds(conferenceIds);
  177. return zxConferenceMapper.deleteZxConferenceByConferenceIds(conferenceIds);
  178. }
  179. /**
  180. * 删除政协会议活动信息
  181. *
  182. * @param conferenceId 政协会议活动主键
  183. * @return 结果
  184. */
  185. @Transactional(rollbackFor = Exception.class)
  186. @Override
  187. public int deleteZxConferenceByConferenceId(Long conferenceId) {
  188. zxConferenceMapper.deleteZxConferenceUserByConferenceId(conferenceId);
  189. return zxConferenceMapper.deleteZxConferenceByConferenceId(conferenceId);
  190. }
  191. /**
  192. * 新增政协会议活动-用户关联信息
  193. *
  194. * @param zxConference 政协会议活动对象
  195. */
  196. public void insertZxConferenceUser(ZxConference zxConference) {
  197. List<ZxConferenceUser> zxConferenceUserList = zxConference.getZxConferenceUserList();
  198. Long conferenceId = zxConference.getConferenceId();
  199. if (StringUtils.isNotNull(zxConferenceUserList)) {
  200. LocalDate localDate = DateUtils.toLocalDate(zxConference.getConferenceDate());
  201. String conferenceTime = zxConference.getConferenceTime();
  202. String conferenceAddress = zxConference.getConferenceAddress();
  203. String conferenceTitle = zxConference.getConferenceTitle();
  204. List<ZxConferenceUser> list = new ArrayList<ZxConferenceUser>();
  205. List<String> phoneList = new ArrayList<>();
  206. List<String> userNameList = new ArrayList<>();
  207. for (ZxConferenceUser zxConferenceUser : zxConferenceUserList) {
  208. String userName = zxConferenceUser.getUserName();
  209. zxConferenceUser.setConferenceId(conferenceId);
  210. list.add(zxConferenceUser);
  211. //获取手机号
  212. String phonenumber = zxConferenceUser.getPhonenumber().trim();
  213. if (StringUtils.isNotEmpty(phonenumber)){
  214. phoneList.add(phonenumber);
  215. userNameList.add(userName);
  216. }
  217. }
  218. if (list.size() > 0) {
  219. zxConferenceMapper.batchZxConferenceUser(list);
  220. }
  221. if (phoneList.size() > 0) {
  222. int maxNums = 100; //每次最多发送100条,我们一次批量发100条
  223. int times = 0;// 循环几个100 用List的长度 除 100
  224. int size = phoneList.size(); // 数据数量
  225. //会议通知模板id
  226. String templateCode = "SMS_469105819";
  227. //签名
  228. String signName = "潜山市政协办公室";
  229. List<String> signNameList = new ArrayList<>();
  230. List<String> templateList = new ArrayList<>();
  231. List<String> phoneJsonList = new ArrayList<>();
  232. StringBuffer signNameJson;
  233. StringBuffer phoneNumberJson;
  234. StringBuffer templateParamJson;
  235. //返回提示
  236. String backResult = "";
  237. if (size < maxNums) {
  238. times = 1;
  239. } else {
  240. times = (size - 1) / maxNums + 1; //为什么要-1 因为如果是200的时候,理论上次数应该是2,而不是3,如果是101,那么次数也是2,这样就保证次数准确。
  241. }
  242. for (int j = 0; j < times; j++) {
  243. if (j > 0 && (j * maxNums + 1 > size)) { //边界判定,如果刚好是100条,那么times的值为2,这时候j 为1的时候 101 大于100结束循环,100条以内不生效
  244. break;
  245. } else {
  246. phoneNumberJson = new StringBuffer();
  247. signNameJson = new StringBuffer();
  248. templateParamJson = new StringBuffer();
  249. phoneNumberJson.append("[");
  250. signNameJson.append("[");
  251. templateParamJson.append("[");
  252. for (int k = j * maxNums; k < size && k < (j + 1) * maxNums; k++) {
  253. // 防止有空行,手机号是必须要有的
  254. String phone = phoneList.get(k);
  255. if (StringUtils.isEmpty(phone)) {
  256. continue;
  257. }
  258. phoneNumberJson.append("\"" + phoneList.get(k) + "\",");
  259. signNameJson.append("\"" + signName + "\",");
  260. /**
  261. * 定于${month}月${day}日(${week}) ${time} 在${place}召开${content},请${name}委员准时参加。
  262. */
  263. templateParamJson.append("{\"month\":\"" + localDate.getMonthValue() + "\",\"day\":\"" + localDate.getDayOfMonth() + "\",\"week\":\"" + localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE) + "\",\"time\":\"" + conferenceTime + "\",\"place\":\"" + conferenceAddress + "\",\"content\":\"" + conferenceTitle + "\",\"name\":\"" + userNameList.get(k) + "\"},");
  264. }
  265. phoneNumberJson.deleteCharAt(phoneNumberJson.length() - 1);//移除最后一个逗号字符,
  266. signNameJson.deleteCharAt(signNameJson.length() - 1);
  267. templateParamJson.deleteCharAt(templateParamJson.length() - 1);//移除最后一个逗号字符
  268. phoneNumberJson.append("]");
  269. signNameJson.append("]");
  270. templateParamJson.append("]");
  271. phoneJsonList.add(phoneNumberJson.toString());
  272. signNameList.add(signNameJson.toString());
  273. templateList.add(templateParamJson.toString());
  274. }
  275. //组装请求对象
  276. if (times == phoneJsonList.size()) {
  277. for (int i = 0; i < times; i++) {
  278. long startTimeSql = System.currentTimeMillis();
  279. SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest();
  280. //组装电话号码
  281. sendBatchSmsRequest.setPhoneNumberJson(phoneJsonList.get(i));
  282. //签名名称
  283. sendBatchSmsRequest.setSignNameJson(signNameList.get(i));
  284. //替换参数
  285. sendBatchSmsRequest.setTemplateParamJson(templateList.get(i));
  286. //固定的模板名称
  287. sendBatchSmsRequest.setTemplateCode(templateCode);
  288. long endTimeSql = System.currentTimeMillis() - startTimeSql;
  289. System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发会议短信通知计算:" + (i + 1) + "次,时间" + endTimeSql + "ms");
  290. long startTimeSend = System.currentTimeMillis();
  291. SendBatchSmsResponse sendBatchSmsResponse = SendSmsUtils.sendBatchSms(sendBatchSmsRequest);
  292. long endTimeSend = System.currentTimeMillis() - startTimeSend;
  293. System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发会议短信通知接口请求:" + (i + 1) + "次,时间" + endTimeSend + "ms");
  294. if (sendBatchSmsResponse != null) {
  295. String code = sendBatchSmsResponse.getBody().getCode();
  296. if (sendBatchSmsResponse.getBody().getCode() != null && "OK".equals(code)) {
  297. //批量请求发送短信成功
  298. System.out.println("批量会议短信发送成功:" + phoneJsonList.get(i).split(",").length + "条");
  299. backResult = backResult + "第" + i + "次批量成功 ";
  300. } else {
  301. System.out.println("批量会议短信发送失败!");
  302. backResult = backResult + "第" + i + "次批量失败 ";
  303. }
  304. }
  305. }
  306. }
  307. }
  308. }
  309. }
  310. }
  311. /**
  312. * 新增政协会议附件关联信息
  313. *
  314. */
  315. public void insertZxFj(ZxConference zxConference)
  316. {
  317. List<ZxFj> zxFjListFj = zxConference.getZxFjList();
  318. Long conferenceId = zxConference.getConferenceId();
  319. if (StringUtils.isNotNull(zxFjListFj))
  320. {
  321. List<ZxFj> list = new ArrayList<ZxFj>();
  322. for (ZxFj zxFj : zxFjListFj)
  323. {
  324. zxFj.setType(FOR);
  325. zxFj.setMainId(conferenceId);
  326. zxFj.setSourceId(conferenceId);
  327. list.add(zxFj);
  328. }
  329. if (list.size() > 0)
  330. {
  331. zxFjMapper.batchZxFj(list);
  332. }
  333. }
  334. }
  335. }