ZxConferenceServiceImpl.java 15 KB

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