package cn.gistack.alerts.sms.controller; import cn.com.flaginfo.sdk.cmc.api.result.ComResult; import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendDataResult; import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendRequest; import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendDataResult; import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest; import cn.gistack.alerts.sms.entity.SmsRequest; import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.excel.SendRainSmsExcel; import cn.gistack.alerts.sms.excel.SendSmsExcel; import cn.gistack.alerts.sms.listener.ExcelListener; import cn.gistack.alerts.sms.service.SmsService; import cn.gistack.alerts.sms.util.SmsUtils; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import cn.gistack.alerts.sms.vo.SmsResponseVO; import cn.gistack.sm.intelligentCall.excel.CallExcel; import cn.gistack.system.user.entity.User; import cn.gistack.system.user.feign.IUserClient; import com.alibaba.excel.EasyExcel; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import static cn.gistack.alerts.sms.util.SmsUtils.validator; import static cn.gistack.common.cache.CacheNames.PHONE_KEY; /** * 短信发送控制层 * @author zhongrj * @date 2023-04-22 */ @Slf4j @RestController @RequestMapping("/sms/sms") @AllArgsConstructor public class SmsController { private final SmsService smsService; private final BladeRedis bladeRedis; private final IUserClient userClient; @GetMapping("/test") public void setRedis(){ saveCodeForRedis("super_admin","123456"); } /** * 短信固定内容发送通用方法(仅支持 {xx} 模式的模板) * request 必须包含手机号,模板id,拼接好的内容 * @param request * @return */ @PostMapping("/sendFixedContentByXXModel") public R sendFixedContentByXXModel(@RequestBody SMSSendRequest request){ // 手机号码校验 if(validatePhone(request.getUserNumber())) { // 发送操作 ComResult resultComResult = SmsUtils.sendMsg(request); // 记录发送记录操作 SmsResult smsResult = smsService.saveSendResult(resultComResult.getCode().toString(),resultComResult.getMsg(),request, 1); if (null != smsResult){ smsService.saveSendRecord(request, resultComResult.getCode().toString(),resultComResult.getMsg(),smsResult.getId()); } // 返回发送信息 return R.data(resultComResult); } // 返回发送信息 return R.fail(400,"该手机号不存在!"); } /** * 发送登录验证码 * request 必须包含手机号 * @param request * @return */ @PostMapping("/sendCode") public R sendCode(@RequestBody SMSSendRequest request){ // 手机号码校验 if(validatePhone(request.getUserNumber())) { //设置模板相关信息 String templateId = "2431012205498"; String randNumber = SmsUtils.getRandNumber(); String content = "您的登录验证码是" + randNumber + ",5分钟内有效,请勿泄漏,如非本人操作,请忽略此信息"; request.setMessageContent(content); request.setTemplateId(templateId); // 发送操作 ComResult resultComResult = SmsUtils.sendMsg(request); // 记录发送记录操作 SmsResult smsResult = smsService.saveSendResult(resultComResult.getCode().toString(),resultComResult.getMsg(),request, 1); if (null != smsResult){ smsService.saveSendRecord(request, resultComResult.getCode().toString(),resultComResult.getMsg(),smsResult.getId()); } // 保存验证码到 redis saveCodeForRedis(request.getUserNumber(), randNumber); // 返回发送信息 return R.data(resultComResult); } // 返回发送信息 return R.fail(400,"该手机号不存在!"); } /** * 校验手机号码正确性 * @param userNumber * @return */ private boolean validatePhone(String userNumber) { // 校验手机号码正确性 if (validator(userNumber)){ // 校验该账户是否已注册,通过手机号查询用户是否存在,tenantId 暂时写死,未登陆情况 tenantId 获取不到 R> list = userClient.userInfoByPhoneOrAccount("000000", userNumber); if (list.getData().size()>0){ return true; } return false; } return false; } /** * 保存验证码到 redis * @param userNumber * @param randNumber */ private void saveCodeForRedis(String userNumber, String randNumber) { bladeRedis.setEx(PHONE_KEY + userNumber,randNumber,5*60L); } /** * 发送待办提醒 * @param smsRequest * @return */ @PostMapping("/sendEmailMsg") public R sendEmailMsg(@RequestBody SmsRequest smsRequest){ // 处理数据(可能是多个手机号情况) List list = Arrays.asList(smsRequest.getPhone().split(",")); // 保存发送结果 smsService.sendEmailMsg(list,smsRequest); // 返回 return R.status(true); } /** * 发送 xx 变量模板短信 * @param smsRequest 发送对象 * @return */ @PostMapping("/sendXXMsg") public R sendXXMsg(@RequestBody SmsRequestTemplate smsRequest){ return R.data(smsService.sendXXMsg(smsRequest.getSmsRequest(),smsRequest.getPhoneNumbers())); } /** * 发送 具名 变量模板短信(告警定制) * @param smsRequest 发送对象 * @return */ @PostMapping("/sendSignMsg") public R sendSignMsg(@RequestBody SmsRequestTemplate smsRequest){ return R.data(smsService.sendSignMsg(smsRequest)); } /** * 发送降雨短信 * @param params 发送对象 * @return */ @PostMapping("/sendSignRainMsg") public R sendSignRainMsg(@RequestBody Map params){ return R.data(smsService.sendSignRainMsg(params)); } /** * 通过手机号获取外呼未接通已发短信通知的人员水库信息 * @param callId 呼叫id * @return */ @GetMapping("/getCallNotConnectSmsNoticeInfo") public R getCallNotConnectSmsNoticeInfo(String callId){ return R.data(smsService.getCallNotConnectSmsNoticeInfo(callId)); } /** * 导入表格发送降雨短信 * @param file excel文件 * @param startTime 短信内容填报起始时间 * @param endTime 短信内容填报截止时间 * @return */ @PostMapping("/import-send-rain-sms") public R importSendRainSms(MultipartFile file,String startTime,String endTime){ ExcelListener listener = new ExcelListener<>(); //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据 try { EasyExcel.read(file.getInputStream(), SendRainSmsExcel.class, listener).headRowNumber(1).sheet(0).doRead(); } catch (IOException e) { e.printStackTrace(); } List list = listener.getDatas(); // 导入并返回 return R.data(smsService.importSendRainSms(list,startTime,endTime)); } /** * 批量发送短信(集合数据) * @param map (保护参数 1:短信模板id 2:数据集合 list>) * @return */ @PostMapping("/batch-send-sms") public R batchSendSms(@RequestBody Map map){ // 导入并返回 return R.data(smsService.batchSendSms(map)); } /** * 导入表格发送预警短信 * @param file excel文件 * @param templateId 模板id * @param param 通用参数 * @param content 发送内容 * @return */ @PostMapping("/import-send-sms") public R importSendSms(MultipartFile file,String templateId,String param,String content){ ExcelListener listener = new ExcelListener<>(); //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据 try { EasyExcel.read(file.getInputStream(), SendSmsExcel.class, listener).headRowNumber(1).sheet(0).doRead(); } catch (IOException e) { e.printStackTrace(); } List list = listener.getDatas(); // 导入并返回 return R.data(smsService.importSendSms(list,templateId,param,content)); } /** * 导出模板 */ @GetMapping("/export-template") @ApiOperation(value = "导出模板") public void exportTemplate(HttpServletResponse response) { List list = new ArrayList<>(); ExcelUtil.export(response, "短信发送数据模板", "短信发送数据表", list, SendSmsExcel.class); } }