diff --git a/pom.xml b/pom.xml index f5b53f2..534ec95 100644 --- a/pom.xml +++ b/pom.xml @@ -119,6 +119,16 @@ spring-boot-starter-mail + + com.aliyun + aliyun-java-sdk-core + 4.5.3 + + + com.aliyun + dysmsapi20170525 + 2.0.22 + diff --git a/src/main/java/com/zh/lingnuo/controller/UtilController.java b/src/main/java/com/zh/lingnuo/controller/UtilController.java index c5e1d75..3c9178a 100644 --- a/src/main/java/com/zh/lingnuo/controller/UtilController.java +++ b/src/main/java/com/zh/lingnuo/controller/UtilController.java @@ -1,11 +1,15 @@ package com.zh.lingnuo.controller; import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.Client; import com.zh.lingnuo.utils.Common; +import com.zh.lingnuo.utils.FuncRes; +import com.zh.lingnuo.utils.SmsService; import com.zh.lingnuo.utils.result.HttpStatusEnum; import com.zh.lingnuo.utils.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -55,14 +59,7 @@ public class UtilController { return Result.fail(HttpStatusEnum.CUSTOM_EXCEPTION, "上传失败"); } - - public static void main(String[] args) { - - - - } - } diff --git a/src/main/java/com/zh/lingnuo/controller/company/CompanyQnController.java b/src/main/java/com/zh/lingnuo/controller/company/CompanyQnController.java index 5244c90..101c643 100644 --- a/src/main/java/com/zh/lingnuo/controller/company/CompanyQnController.java +++ b/src/main/java/com/zh/lingnuo/controller/company/CompanyQnController.java @@ -249,7 +249,7 @@ public class CompanyQnController { @PostMapping("/groupSendMail") @Token(requireUser = 1, level = {2}) public Result groupSendMail(@Validated @RequestBody ParamsQnOpr params) { - return companyQnService.groupSendMail(params.getQnId()); + return companyQnService.groupSendMail(params.getQnId(),params.getUserInfo()); } @Operation(summary = "停止问卷") diff --git a/src/main/java/com/zh/lingnuo/mapper/CompanyQnMapper.java b/src/main/java/com/zh/lingnuo/mapper/CompanyQnMapper.java index 7a839af..86642ea 100644 --- a/src/main/java/com/zh/lingnuo/mapper/CompanyQnMapper.java +++ b/src/main/java/com/zh/lingnuo/mapper/CompanyQnMapper.java @@ -82,6 +82,6 @@ public interface CompanyQnMapper extends BaseMapper { "LEFT JOIN company_qn_answer t3 on t3.answerer_id = t2.answerer_id\n" + "LEFT JOIN company_qn_title t4 on t1.id = t4.qn_id \n" + "WHERE t1.status != 0 and t2.answerer_id = #{answererId} " + - "ORDER BY t1.id DESC GROUP BY t1.id") + "GROUP BY t1.id ORDER BY t1.id DESC") IPage qnList(IPage page,int answererId); } diff --git a/src/main/java/com/zh/lingnuo/service/ICompanyQnService.java b/src/main/java/com/zh/lingnuo/service/ICompanyQnService.java index 8ccf12b..dd4945f 100644 --- a/src/main/java/com/zh/lingnuo/service/ICompanyQnService.java +++ b/src/main/java/com/zh/lingnuo/service/ICompanyQnService.java @@ -3,6 +3,7 @@ package com.zh.lingnuo.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zh.lingnuo.controller.company.CompanyQnController; import com.zh.lingnuo.controller.manage.ManageCompanyQnController; +import com.zh.lingnuo.model.Company; import com.zh.lingnuo.model.CompanyQn; import com.baomidou.mybatisplus.extension.service.IService; import com.zh.lingnuo.utils.result.Result; @@ -33,7 +34,7 @@ public interface ICompanyQnService extends IService { Result release(CompanyQn qn); // 全量发送邮件 - Result groupSendMail(int qnId); + Result groupSendMail(int qnId, Company company); // 停止问卷 Result end(int qnId); diff --git a/src/main/java/com/zh/lingnuo/serviceImpl/CompanyQnAnswerServiceImpl.java b/src/main/java/com/zh/lingnuo/serviceImpl/CompanyQnAnswerServiceImpl.java index 4874d52..e8493b2 100644 --- a/src/main/java/com/zh/lingnuo/serviceImpl/CompanyQnAnswerServiceImpl.java +++ b/src/main/java/com/zh/lingnuo/serviceImpl/CompanyQnAnswerServiceImpl.java @@ -234,7 +234,7 @@ public class CompanyQnAnswerServiceImpl extends ServiceImpl resultList = new ArrayList<>(); - List list = partnerChoiceResultData(qnId, false); + List list = partnerChoiceResultData(qnId, qn.getIsSecret()==1?true:false); for (CompanyQnController.ResultPartnerChoice resultPartnerChoice : list) { Map map = new LinkedHashMap(); map.put("SourceId", resultPartnerChoice.getAnswererName()); @@ -248,8 +248,8 @@ public class CompanyQnAnswerServiceImpl extends ServiceImpl @@ -43,11 +50,19 @@ public class CompanyQnServiceImpl extends ServiceImpl answerers = answererMapper.answererList(qnId); - if(answerers.size()==0){ + if (answerers.size() == 0) { return Result.err("答题人为空"); } super.update(new UpdateWrapper().eq("id", qnId).eq("status", CompanyQn.CompanyQnStatusNotRelease).set("status", CompanyQn.CompanyQnStatusRelease)); - return Result.success("发布成功"); + return Result.success("发布成功"); } // 全量发送邮件 - public Result groupSendMail(int qnId){ - CompanyQn qn = super.getById(qnId); - String isSecret = CompanyQn.getIsSecretDesc(qn.getIsSecret()); - List answerers = answererMapper.answererList(qn.getId()); - List mailList = new ArrayList(); - List illegalMailList = new ArrayList(); - System.out.println("发送邮件开始"); - for (Answerer answerer : answerers) { - String mail = answerer.getMail(); - if (null != mail) { - String subject = "问卷填写通知"; - String content = "请您用提供的账号密码登录该平台,并回答相应问题。\n" - +"问卷地址:"+webUrl+"\n" - +"账号:"+answerer.getMail()+"\n" - +"密码:"+answerer.getTel()+"\n" - +"注意:本次调研采用【"+isSecret+"】形式。在最后的群体报告中,您的个人信息均会隐去。您的个人报告只有您自己能看到。"; - if (!mailServiceImpl.sendMail(mail, subject, content)) { - illegalMailList.add(answerer.getName()); - } - } - } - String msg = "发布成功"; - if (illegalMailList.size() > 0) { - msg = msg + "," + illegalMailList.toString() + "邮箱错误"; - } - return Result.success("", msg + "!"); + public Result groupSendMail(int qnId,Company company) { + CompanyQn qn = super.getById(qnId); + String companyName = company.getName(); + String isSecret = CompanyQn.getIsSecretDesc(qn.getIsSecret()); + List answerers = answererMapper.answererList(qn.getId()); + List illegalMailList = new ArrayList(); + List illegalTelList = new ArrayList(); + System.out.println("发送短信邮件开始"); + for (Answerer answerer : answerers) { + String mail = answerer.getMail(); + String usrName = answerer.getMail(); + String password = answerer.getTel(); + if (null != mail) { +// String content = "请您用提供的账号密码登录该平台,并回答相应问题。\n" +// +"问卷地址:"+webUrl+"\n" +// +"账号:"+usrName+"\n" +// +"密码:"+password+"\n" +// +"注意:本次调研采用【"+isSecret+"】形式。在最后的群体报告中,您的个人信息均会隐去。您的个人报告只有您自己能看到。"; + String content = "欢迎您参加" + companyName + "发起的组织网络问卷调查。\n" + + "问卷填写地址:" + webUrl + "\n" + + "账号:" + usrName + "\n" + + "密码" + password + "\n"; + if (!mailServiceImpl.sendMail(mail, signName, content)) { + illegalMailList.add(answerer.getName()); + } + } + String tel = answerer.getTel(); + Client client = null; + try { + client = smsService.createClient(); + } catch (Exception e) { +// System.out.println("注册smsClient错误"); + } + if (null != client) { + if (Common.telRegex(tel)) { + JSONObject obj = new JSONObject(); + obj.put("company", companyName); + obj.put("usrname", usrName); + obj.put("password", password); + FuncRes funcRes = smsService.smsRequest(client, signName, templateCode, tel, obj.toString()); + if (!funcRes.isSuccess()) { + illegalTelList.add(answerer.getName()); + } + } + } + } + String msg = "发布成功"; + if (illegalMailList.size() > 0) { + msg = msg + "," + illegalMailList.toString() + "邮箱错误"; + } + if (illegalTelList.size() > 0) { + msg = msg + "," + illegalTelList.toString() + "手机号错误"; + } + return Result.success("", msg + "!"); } diff --git a/src/main/java/com/zh/lingnuo/serviceImpl/MailServiceImpl.java b/src/main/java/com/zh/lingnuo/serviceImpl/MailServiceImpl.java index 4518604..47964d7 100644 --- a/src/main/java/com/zh/lingnuo/serviceImpl/MailServiceImpl.java +++ b/src/main/java/com/zh/lingnuo/serviceImpl/MailServiceImpl.java @@ -30,10 +30,10 @@ public class MailServiceImpl implements MailService { mailMessage.setText(content); try { javaMailSender.send(mailMessage); - System.out.println("发送简单邮件成功"); +// System.out.println("发送简单邮件成功"); return true; }catch (Exception e){ - System.out.println("发送简单邮件失败"+e.getMessage()); +// System.out.println("发送简单邮件失败"+e.getMessage()); return false; } } diff --git a/src/main/java/com/zh/lingnuo/serviceImpl/UserTokenServiceImpl.java b/src/main/java/com/zh/lingnuo/serviceImpl/UserTokenServiceImpl.java index 7a52e6c..f4d9590 100644 --- a/src/main/java/com/zh/lingnuo/serviceImpl/UserTokenServiceImpl.java +++ b/src/main/java/com/zh/lingnuo/serviceImpl/UserTokenServiceImpl.java @@ -53,7 +53,8 @@ public class UserTokenServiceImpl extends ServiceImpl().eq("name", params.getName())); + Company company = companyService.getOne(new QueryWrapper() + .eq("name", params.getName()).or().eq("mail",params.getName())); if(null == company){ return Result.err("账号错误"); } diff --git a/src/main/java/com/zh/lingnuo/utils/Common.java b/src/main/java/com/zh/lingnuo/utils/Common.java index 7eccce9..8df49dd 100644 --- a/src/main/java/com/zh/lingnuo/utils/Common.java +++ b/src/main/java/com/zh/lingnuo/utils/Common.java @@ -8,6 +8,8 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Common { @@ -22,6 +24,19 @@ public class Common { return sb.toString(); } + // 验证是否是正确合法的手机号码 + public static Boolean telRegex(String tel) { + if (tel.length() != 11) { + return false; + } + Pattern pattern = Pattern.compile("^1[3,4,5,6,7,8,9]\\d{9}$"); + Matcher matcher = pattern.matcher(tel); + if (matcher.matches()) { + return true; + } + return false; + } + public static String md5(String str) { return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8)); } diff --git a/src/main/java/com/zh/lingnuo/utils/ExcelExport.java b/src/main/java/com/zh/lingnuo/utils/ExcelExport.java index 384bbbb..602cd5f 100644 --- a/src/main/java/com/zh/lingnuo/utils/ExcelExport.java +++ b/src/main/java/com/zh/lingnuo/utils/ExcelExport.java @@ -11,6 +11,7 @@ public class ExcelExport { /** * src:定义下载的文件路径 + * * @param src * @return */ @@ -33,15 +34,18 @@ public class ExcelExport { //根据需要给第一行每一列设置标题 int rowCellIndex = 0; XSSFCell cell = row.createCell(rowCellIndex); - Set keys = list.get(0).keySet(); + if (null == list || list.size() == 0) { + return wb; + } + Set keys = list.get(0).keySet(); Object[] keysArray = keys.toArray(); for (Object key : keys) { - cell = row.createCell(rowCellIndex); + cell = row.createCell(rowCellIndex); - cell.setCellValue( key.toString()); + cell.setCellValue(key.toString()); - rowCellIndex++; - } + rowCellIndex++; + } XSSFRow rows; XSSFCell cells; //循环拿到的数据给所有行每一列设置对应的值 @@ -53,7 +57,7 @@ public class ExcelExport { rowCellIndex = 0; for (Object s : keysArray) { cells = rows.createCell(rowCellIndex); - cells.setCellValue(list.get(i).get(s).toString()); + cells.setCellValue(null == list.get(i).get(s) ? "" : list.get(i).get(s).toString()); rowCellIndex++; } } @@ -66,7 +70,7 @@ public class ExcelExport { // } catch (IOException e) { // e.printStackTrace(); // } - return wb; + return wb; } - } +} diff --git a/src/main/java/com/zh/lingnuo/utils/SmsService.java b/src/main/java/com/zh/lingnuo/utils/SmsService.java new file mode 100644 index 0000000..9fd9763 --- /dev/null +++ b/src/main/java/com/zh/lingnuo/utils/SmsService.java @@ -0,0 +1,86 @@ +package com.zh.lingnuo.utils; + + +import com.aliyun.tea.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +@Component +public class SmsService { + + @Value("${aliyun.sms.accessKeyId}") + private String accessKeyId; + + @Value("${aliyun.sms.accessKeySecret}") + private String accessKeySecret; + + @Value("${aliyun.sms.region}") + private String region; + + @Value("${aliyun.sms.endpoint}") + private String endpoint; + + public com.aliyun.dysmsapi20170525.Client createClient() throws Exception { + com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() + .setAccessKeyId(accessKeyId) + .setAccessKeySecret(accessKeySecret) + .setEndpoint(endpoint); + return new com.aliyun.dysmsapi20170525.Client(config); + } + + public FuncRes sms(String phone,String signName,String templateCode, String templateParam) { + com.aliyun.dysmsapi20170525.Client client = null; + try { + client = createClient(); + } catch (Exception e) { + return FuncRes.fail("初始化sms服务失败"); + } + com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest() + .setPhoneNumbers(phone) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(templateParam); +// .setTemplateParam("{\"company\":\"1234\",\"usrname\":\"1234\",\"password\":\"1234\"}"); + com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); + try { + // 复制代码运行请自行打印 API 的返回值 + client.sendSmsWithOptions(sendSmsRequest, runtime); + } catch (TeaException error) { + // 如有需要,请打印 error + com.aliyun.teautil.Common.assertAsString(error.message); + return FuncRes.fail(error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + // 如有需要,请打印 error + com.aliyun.teautil.Common.assertAsString(error.message); + return FuncRes.fail(error.message); + } + return FuncRes.success("发送成功"); + } + + public FuncRes smsRequest( com.aliyun.dysmsapi20170525.Client client,String signName,String templateCode,String phone, String templateParam) { + com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest() + .setPhoneNumbers(phone) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(templateParam); +// .setTemplateParam("{\"company\":\"1234\",\"usrname\":\"1234\",\"password\":\"1234\"}"); + com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); + try { + // 复制代码运行请自行打印 API 的返回值 + client.sendSmsWithOptions(sendSmsRequest, runtime); + } catch (TeaException error) { + // 如有需要,请打印 error + com.aliyun.teautil.Common.assertAsString(error.message); + return FuncRes.fail(error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + // 如有需要,请打印 error + com.aliyun.teautil.Common.assertAsString(error.message); + return FuncRes.fail(error.message); + } + return FuncRes.success("发送成功"); + } +} + diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7515743..4198976 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -62,6 +62,17 @@ mybatis-plus: # 删除后 logic-delete-value: 0 +aliyun: + sms: + accessKeyId: LTAI5tRBUQJ2x1H1cgYcX282 + accessKeySecret: zqvQfEtR7r5lVazmU9CGeHCmEpyZr5 + region: cn-hangzhou + endpoint: dysmsapi.aliyuncs.com + signName: 领诺CenteRONA + templateCode: SMS_255286086 + + + #springdoc: # swagger-ui: # # 修改Swagger UI路径 diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 533f746..92f8159 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -62,6 +62,17 @@ mybatis-plus: # 删除后 logic-delete-value: 0 + +aliyun: + sms: + accessKeyId: LTAI5tRBUQJ2x1H1cgYcX282 + accessKeySecret: zqvQfEtR7r5lVazmU9CGeHCmEpyZr5 + region: cn-hangzhou + endpoint: dysmsapi.aliyuncs.com + signName: 领诺CenteRONA + templateCode: SMS_255286086 + + #springdoc: # swagger-ui: # # 修改Swagger UI路径