feat 短信通知

master
zhangjinli 3 years ago
parent bd22db52f2
commit 01d062c14a

@ -119,6 +119,16 @@
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.22</version>
</dependency>
</dependencies>

@ -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) {
}
}

@ -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 = "停止问卷")

@ -82,6 +82,6 @@ public interface CompanyQnMapper extends BaseMapper<CompanyQn> {
"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<MapperResultAnswererQnList> qnList(IPage page,int answererId);
}

@ -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<CompanyQn> {
Result release(CompanyQn qn);
// 全量发送邮件
Result groupSendMail(int qnId);
Result groupSendMail(int qnId, Company company);
// 停止问卷
Result end(int qnId);

@ -234,7 +234,7 @@ public class CompanyQnAnswerServiceImpl extends ServiceImpl<CompanyQnAnswerMappe
qnTitleMap.put(qnTitle.getTitle(), qnTitle.getTitle());
}
List<Map> resultList = new ArrayList<>();
List<CompanyQnController.ResultPartnerChoice> list = partnerChoiceResultData(qnId, false);
List<CompanyQnController.ResultPartnerChoice> 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<CompanyQnAnswerMappe
try {
String day = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd"));
String fileName = URLEncoder.encode(qn.getTitle(), "UTF8");
response.setContentType("application/vnd.ms-excel;chartset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + "-" + day + ".xls");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;chartset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + "-" + day + ".xlsx");
ServletOutputStream out = response.getOutputStream();
wb.write(out);
out.flush();

@ -1,5 +1,7 @@
package com.zh.lingnuo.serviceImpl;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -18,7 +20,10 @@ import com.zh.lingnuo.model.CompanyQnAnswerer;
import com.zh.lingnuo.service.ICompanyQnAnswererService;
import com.zh.lingnuo.service.ICompanyQnService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zh.lingnuo.utils.Common;
import com.zh.lingnuo.utils.FuncRes;
import com.zh.lingnuo.utils.PageUtil;
import com.zh.lingnuo.utils.SmsService;
import com.zh.lingnuo.utils.result.Result;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -28,6 +33,8 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>
@ -43,11 +50,19 @@ public class CompanyQnServiceImpl extends ServiceImpl<CompanyQnMapper, CompanyQn
@Value("${web.webUrl}")
private String webUrl;
@Value("${aliyun.sms.signName}")
private String signName;
@Value("${aliyun.sms.templateCode}")
private String templateCode;
@Autowired
private ICompanyQnAnswererService companyQnAnswererService;
@Autowired
MailServiceImpl mailServiceImpl;
@Autowired
private SmsService smsService;
@Autowired
private CompanyQnMapper companyQnMapper;
@Autowired
private AnswererMapper answererMapper;
@ -118,31 +133,59 @@ public class CompanyQnServiceImpl extends ServiceImpl<CompanyQnMapper, CompanyQn
}
// 全量发送邮件
public Result groupSendMail(int qnId){
public Result groupSendMail(int qnId,Company company) {
CompanyQn qn = super.getById(qnId);
String companyName = company.getName();
String isSecret = CompanyQn.getIsSecretDesc(qn.getIsSecret());
List<Answerer> answerers = answererMapper.answererList(qn.getId());
List<String> mailList = new ArrayList();
List<String> illegalMailList = new ArrayList();
System.out.println("发送邮件开始");
List<String> 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 subject = "问卷填写通知";
String content = "请您用提供的账号密码登录该平台,并回答相应问题。\n"
+"问卷地址:"+webUrl+"\n"
+"账号:"+answerer.getMail()+"\n"
+"密码:"+answerer.getTel()+"\n"
+"注意:本次调研采用【"+isSecret+"】形式。在最后的群体报告中,您的个人信息均会隐去。您的个人报告只有您自己能看到。";
if (!mailServiceImpl.sendMail(mail, subject, content)) {
// 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 + "!");
}

@ -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;
}
}

@ -53,7 +53,8 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
BeanUtils.copyProperties(user,userInfo);
break;
case 2:
Company company = companyService.getOne(new QueryWrapper<Company>().eq("name", params.getName()));
Company company = companyService.getOne(new QueryWrapper<Company>()
.eq("name", params.getName()).or().eq("mail",params.getName()));
if(null == company){
return Result.err("账号错误");
}

@ -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));
}

@ -11,6 +11,7 @@ public class ExcelExport {
/**
* src:
*
* @param src
* @return
*/
@ -33,6 +34,9 @@ public class ExcelExport {
//根据需要给第一行每一列设置标题
int rowCellIndex = 0;
XSSFCell cell = row.createCell(rowCellIndex);
if (null == list || list.size() == 0) {
return wb;
}
Set<Object> keys = list.get(0).keySet();
Object[] keysArray = keys.toArray();
for (Object key : keys) {
@ -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++;
}
}

@ -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("发送成功");
}
}

@ -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路径

@ -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路径

Loading…
Cancel
Save