feat 短信通知

master
zhangjinli 3 years ago
parent bd22db52f2
commit 01d062c14a

@ -119,6 +119,16 @@
<artifactId>spring-boot-starter-mail</artifactId> <artifactId>spring-boot-starter-mail</artifactId>
</dependency> </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> </dependencies>

@ -1,11 +1,15 @@
package com.zh.lingnuo.controller; package com.zh.lingnuo.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.zh.lingnuo.utils.Common; 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.HttpStatusEnum;
import com.zh.lingnuo.utils.result.Result; import com.zh.lingnuo.utils.result.Result;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; 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.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -55,14 +59,7 @@ public class UtilController {
return Result.fail(HttpStatusEnum.CUSTOM_EXCEPTION, "上传失败"); return Result.fail(HttpStatusEnum.CUSTOM_EXCEPTION, "上传失败");
} }
public static void main(String[] args) { public static void main(String[] args) {
} }
} }

@ -249,7 +249,7 @@ public class CompanyQnController {
@PostMapping("/groupSendMail") @PostMapping("/groupSendMail")
@Token(requireUser = 1, level = {2}) @Token(requireUser = 1, level = {2})
public Result groupSendMail(@Validated @RequestBody ParamsQnOpr params) { public Result groupSendMail(@Validated @RequestBody ParamsQnOpr params) {
return companyQnService.groupSendMail(params.getQnId()); return companyQnService.groupSendMail(params.getQnId(),params.getUserInfo());
} }
@Operation(summary = "停止问卷") @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_answer t3 on t3.answerer_id = t2.answerer_id\n" +
"LEFT JOIN company_qn_title t4 on t1.id = t4.qn_id \n" + "LEFT JOIN company_qn_title t4 on t1.id = t4.qn_id \n" +
"WHERE t1.status != 0 and t2.answerer_id = #{answererId} " + "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); 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.baomidou.mybatisplus.core.metadata.IPage;
import com.zh.lingnuo.controller.company.CompanyQnController; import com.zh.lingnuo.controller.company.CompanyQnController;
import com.zh.lingnuo.controller.manage.ManageCompanyQnController; import com.zh.lingnuo.controller.manage.ManageCompanyQnController;
import com.zh.lingnuo.model.Company;
import com.zh.lingnuo.model.CompanyQn; import com.zh.lingnuo.model.CompanyQn;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.zh.lingnuo.utils.result.Result; import com.zh.lingnuo.utils.result.Result;
@ -33,7 +34,7 @@ public interface ICompanyQnService extends IService<CompanyQn> {
Result release(CompanyQn qn); Result release(CompanyQn qn);
// 全量发送邮件 // 全量发送邮件
Result groupSendMail(int qnId); Result groupSendMail(int qnId, Company company);
// 停止问卷 // 停止问卷
Result end(int qnId); Result end(int qnId);

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

@ -1,5 +1,7 @@
package com.zh.lingnuo.serviceImpl; 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.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; 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.ICompanyQnAnswererService;
import com.zh.lingnuo.service.ICompanyQnService; import com.zh.lingnuo.service.ICompanyQnService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.PageUtil;
import com.zh.lingnuo.utils.SmsService;
import com.zh.lingnuo.utils.result.Result; import com.zh.lingnuo.utils.result.Result;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -28,6 +33,8 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* <p> * <p>
@ -43,11 +50,19 @@ public class CompanyQnServiceImpl extends ServiceImpl<CompanyQnMapper, CompanyQn
@Value("${web.webUrl}") @Value("${web.webUrl}")
private String webUrl; private String webUrl;
@Value("${aliyun.sms.signName}")
private String signName;
@Value("${aliyun.sms.templateCode}")
private String templateCode;
@Autowired @Autowired
private ICompanyQnAnswererService companyQnAnswererService; private ICompanyQnAnswererService companyQnAnswererService;
@Autowired @Autowired
MailServiceImpl mailServiceImpl; MailServiceImpl mailServiceImpl;
@Autowired @Autowired
private SmsService smsService;
@Autowired
private CompanyQnMapper companyQnMapper; private CompanyQnMapper companyQnMapper;
@Autowired @Autowired
private AnswererMapper answererMapper; private AnswererMapper answererMapper;
@ -110,40 +125,68 @@ public class CompanyQnServiceImpl extends ServiceImpl<CompanyQnMapper, CompanyQn
public Result release(CompanyQn qn) { public Result release(CompanyQn qn) {
int qnId = qn.getId(); int qnId = qn.getId();
List<Answerer> answerers = answererMapper.answererList(qnId); List<Answerer> answerers = answererMapper.answererList(qnId);
if(answerers.size()==0){ if (answerers.size() == 0) {
return Result.err("答题人为空"); return Result.err("答题人为空");
} }
super.update(new UpdateWrapper<CompanyQn>().eq("id", qnId).eq("status", CompanyQn.CompanyQnStatusNotRelease).set("status", CompanyQn.CompanyQnStatusRelease)); super.update(new UpdateWrapper<CompanyQn>().eq("id", qnId).eq("status", CompanyQn.CompanyQnStatusNotRelease).set("status", CompanyQn.CompanyQnStatusRelease));
return Result.success("发布成功"); return Result.success("发布成功");
} }
// 全量发送邮件 // 全量发送邮件
public Result groupSendMail(int qnId){ public Result groupSendMail(int qnId,Company company) {
CompanyQn qn = super.getById(qnId); CompanyQn qn = super.getById(qnId);
String isSecret = CompanyQn.getIsSecretDesc(qn.getIsSecret()); String companyName = company.getName();
List<Answerer> answerers = answererMapper.answererList(qn.getId()); String isSecret = CompanyQn.getIsSecretDesc(qn.getIsSecret());
List<String> mailList = new ArrayList(); List<Answerer> answerers = answererMapper.answererList(qn.getId());
List<String> illegalMailList = new ArrayList(); List<String> illegalMailList = new ArrayList();
System.out.println("发送邮件开始"); List<String> illegalTelList = new ArrayList();
for (Answerer answerer : answerers) { System.out.println("发送短信邮件开始");
String mail = answerer.getMail(); for (Answerer answerer : answerers) {
if (null != mail) { String mail = answerer.getMail();
String subject = "问卷填写通知"; String usrName = answerer.getMail();
String content = "请您用提供的账号密码登录该平台,并回答相应问题。\n" String password = answerer.getTel();
+"问卷地址:"+webUrl+"\n" if (null != mail) {
+"账号:"+answerer.getMail()+"\n" // String content = "请您用提供的账号密码登录该平台,并回答相应问题。\n"
+"密码:"+answerer.getTel()+"\n" // +"问卷地址:"+webUrl+"\n"
+"注意:本次调研采用【"+isSecret+"】形式。在最后的群体报告中,您的个人信息均会隐去。您的个人报告只有您自己能看到。"; // +"账号:"+usrName+"\n"
if (!mailServiceImpl.sendMail(mail, subject, content)) { // +"密码:"+password+"\n"
illegalMailList.add(answerer.getName()); // +"注意:本次调研采用【"+isSecret+"】形式。在最后的群体报告中,您的个人信息均会隐去。您的个人报告只有您自己能看到。";
} String content = "欢迎您参加" + companyName + "发起的组织网络问卷调查。\n"
} + "问卷填写地址:" + webUrl + "\n"
} + "账号:" + usrName + "\n"
String msg = "发布成功"; + "密码" + password + "\n";
if (illegalMailList.size() > 0) { if (!mailServiceImpl.sendMail(mail, signName, content)) {
msg = msg + "," + illegalMailList.toString() + "邮箱错误"; illegalMailList.add(answerer.getName());
} }
return Result.success("", msg + "!"); }
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); mailMessage.setText(content);
try { try {
javaMailSender.send(mailMessage); javaMailSender.send(mailMessage);
System.out.println("发送简单邮件成功"); // System.out.println("发送简单邮件成功");
return true; return true;
}catch (Exception e){ }catch (Exception e){
System.out.println("发送简单邮件失败"+e.getMessage()); // System.out.println("发送简单邮件失败"+e.getMessage());
return false; return false;
} }
} }

@ -53,7 +53,8 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
BeanUtils.copyProperties(user,userInfo); BeanUtils.copyProperties(user,userInfo);
break; break;
case 2: 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){ if(null == company){
return Result.err("账号错误"); return Result.err("账号错误");
} }

@ -8,6 +8,8 @@ import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Common { public class Common {
@ -22,6 +24,19 @@ public class Common {
return sb.toString(); 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) { public static String md5(String str) {
return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8)); return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));
} }

@ -11,6 +11,7 @@ public class ExcelExport {
/** /**
* src: * src:
*
* @param src * @param src
* @return * @return
*/ */
@ -33,15 +34,18 @@ public class ExcelExport {
//根据需要给第一行每一列设置标题 //根据需要给第一行每一列设置标题
int rowCellIndex = 0; int rowCellIndex = 0;
XSSFCell cell = row.createCell(rowCellIndex); XSSFCell cell = row.createCell(rowCellIndex);
Set<Object> keys = list.get(0).keySet(); if (null == list || list.size() == 0) {
return wb;
}
Set<Object> keys = list.get(0).keySet();
Object[] keysArray = keys.toArray(); Object[] keysArray = keys.toArray();
for (Object key : keys) { for (Object key : keys) {
cell = row.createCell(rowCellIndex); cell = row.createCell(rowCellIndex);
cell.setCellValue( key.toString()); cell.setCellValue(key.toString());
rowCellIndex++; rowCellIndex++;
} }
XSSFRow rows; XSSFRow rows;
XSSFCell cells; XSSFCell cells;
//循环拿到的数据给所有行每一列设置对应的值 //循环拿到的数据给所有行每一列设置对应的值
@ -53,7 +57,7 @@ public class ExcelExport {
rowCellIndex = 0; rowCellIndex = 0;
for (Object s : keysArray) { for (Object s : keysArray) {
cells = rows.createCell(rowCellIndex); 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++; rowCellIndex++;
} }
} }
@ -66,7 +70,7 @@ public class ExcelExport {
// } catch (IOException e) { // } catch (IOException e) {
// e.printStackTrace(); // e.printStackTrace();
// } // }
return wb; return wb;
} }
} }

@ -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 logic-delete-value: 0
aliyun:
sms:
accessKeyId: LTAI5tRBUQJ2x1H1cgYcX282
accessKeySecret: zqvQfEtR7r5lVazmU9CGeHCmEpyZr5
region: cn-hangzhou
endpoint: dysmsapi.aliyuncs.com
signName: 领诺CenteRONA
templateCode: SMS_255286086
#springdoc: #springdoc:
# swagger-ui: # swagger-ui:
# # 修改Swagger UI路径 # # 修改Swagger UI路径

@ -62,6 +62,17 @@ mybatis-plus:
# 删除后 # 删除后
logic-delete-value: 0 logic-delete-value: 0
aliyun:
sms:
accessKeyId: LTAI5tRBUQJ2x1H1cgYcX282
accessKeySecret: zqvQfEtR7r5lVazmU9CGeHCmEpyZr5
region: cn-hangzhou
endpoint: dysmsapi.aliyuncs.com
signName: 领诺CenteRONA
templateCode: SMS_255286086
#springdoc: #springdoc:
# swagger-ui: # swagger-ui:
# # 修改Swagger UI路径 # # 修改Swagger UI路径

Loading…
Cancel
Save