skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/feign/ISmsRecordClient.java
@@ -16,6 +16,7 @@ String API_PREFIX = "/client"; String SAVE_SMS_RECORD = API_PREFIX + "/saveSmsRecord"; String SEND_SMS_BY_OUT_CALL_NOT_CONNECT = API_PREFIX + "/sendSmsByOutCallNotConnect"; /** * 保存短信发送记录 @@ -33,4 +34,14 @@ @RequestParam("code")String code, @RequestParam("msg")String msg, @RequestParam("number")Integer number); /** * 外呼未接通-发送短信 * @param taskId * @param time * @return */ @GetMapping(SEND_SMS_BY_OUT_CALL_NOT_CONNECT) String sendSmsByOutCallNotConnect(@RequestParam("taskId")String taskId, @RequestParam("time")String time); } skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/feign/ISmsRecordClientFallback.java
@@ -17,4 +17,9 @@ public void saveSmsRecord(String userNumber, String messageContent, String templateId, String code, String msg, Integer number) { } @Override public String sendSmsByOutCallNotConnect(String taskId, String time) { return null; } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/constant/MinConstant.java
New file @@ -0,0 +1,14 @@ package cn.gistack.alerts.sms.constant; /** * 小程序链接地址 * @author zhongrj * @date 2023-06-14 */ public class MinConstant { /** * 水库水位情况信息填报 url */ public static final String fillWaterInfoUrl = ""; } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/feign/SmsRecordClient.java
@@ -49,4 +49,16 @@ smsService.saveSendRecord(request, code,msg,smsResult.getId()); } } /** * 外呼未接通-发送短信 * @param taskId * @param time * @return */ @Override @GetMapping(SEND_SMS_BY_OUT_CALL_NOT_CONNECT) public String sendSmsByOutCallNotConnect(String taskId,String time) { return smsService.sendSmsByOutCallNotConnect(taskId,time); } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.java
@@ -2,11 +2,13 @@ import cn.gistack.alerts.sms.entity.SmsTemplate; import cn.gistack.alerts.sms.vo.SmsTemplateVO; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * 短信发送模板 @@ -21,4 +23,12 @@ * @return */ List<SmsTemplateVO> selectSmsTemplatePage(IPage<SmsTemplateVO> page, @Param("smsTemplate") SmsTemplateVO smsTemplate); /** * 查询当前任务未接通的人员信息(包含水库编号)--MYSQL * @param taskId * @return */ @DS("znwh") List<Map<String, Object>> getNotConnectPatrolPersonList(@Param("taskId") String taskId); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.xml
@@ -21,4 +21,15 @@ and notice_mode = #{smsTemplate.noticeMode} </if> </select> <!--查询当前任务未接通的人员信息(包含水库编号)-MYSQL--> <select id="getNotConnectPatrolPersonList" resultType="java.util.Map"> select ctc.callee_number as userPhone, TRIM(BOTH '"' FROM JSON_EXTRACT(ctc.call_task_callee_content,'$."$水库编码$"')) as waterCode, TRIM(BOTH '"' FROM JSON_EXTRACT(ctc.call_task_callee_content,'$."$水库名称$"')) as waterName, TRIM(BOTH '"' FROM JSON_EXTRACT(ctc.call_task_callee_content,'$."$用户名$"')) as userName from call_task_callee ctc left join call_task_result ctr on ctc.call_id = ctr.call_id where ctc.task_id = #{taskId} and ctc.call_status = 4 and ctr.call_result!='200000' </select> </mapper> skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/ISmsTemplateService.java
@@ -2,8 +2,12 @@ import cn.gistack.alerts.sms.entity.SmsTemplate; import cn.gistack.alerts.sms.vo.SmsTemplateVO; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import java.util.List; import java.util.Map; /** * 短信模板服务接口层 @@ -19,4 +23,12 @@ * @return */ Object selectSmsTemplatePage(IPage<SmsTemplateVO> page, SmsTemplateVO smsTemplate); /** * 查询当前任务未接通的人员信息(包含水库编号) * @param taskId * @return */ @DS("znwh") List<Map<String, Object>> getNotConnectPatrolPersonList(String taskId); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java
@@ -62,4 +62,12 @@ * @return */ Object sendSignRainMsg(Map<String, Object> params); /** * 外呼未接通-发送短信 * @param taskId * @param time * @return */ String sendSmsByOutCallNotConnect(String taskId,String time); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -7,14 +7,17 @@ import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest; import cn.gistack.alerts.alarmRule.entity.AlarmRecordDetail; import cn.gistack.alerts.alarmRule.service.AlarmRecordDetailService; import cn.gistack.alerts.sms.constant.MinConstant; import cn.gistack.alerts.sms.entity.SmsRecord; import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.entity.SmsTemplate; import cn.gistack.alerts.sms.service.ISmsRecordService; import cn.gistack.alerts.sms.service.ISmsResultService; import cn.gistack.alerts.sms.service.ISmsTemplateService; import cn.gistack.alerts.sms.service.SmsService; import cn.gistack.alerts.sms.util.SmsUtils; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.springblade.core.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; @@ -40,6 +43,9 @@ @Autowired private ISmsResultService smsResultService; @Autowired private ISmsTemplateService smsTemplateService; /** * 发送 xx 变量模板短信 @@ -323,6 +329,82 @@ } /** * 外呼未接通-发送短信 * @param taskId * @param time * @return */ @Override public String sendSmsByOutCallNotConnect(String taskId,String time) { String templateId = "2431012249882"; // 查询当前任务未接通的人员信息(包含水库编号) List<Map<String, Object>> list = smsTemplateService.getNotConnectPatrolPersonList(taskId); SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id", templateId)); if (list.size()>0) { // 组装短信数据 StringBuilder builder = new StringBuilder(); // 遍历 for (Map<String, Object> map : list) { builder.append(map.get("userPhone") + ",") .append(time + ",") .append(MinConstant.fillWaterInfoUrl + ",") .append(map.get("waterName")) .append(";"); } String datas = builder.toString(); String title = "手机号码,时间范围,链接地址,水库名称"; String[] titleArr = title.split(","); String[] rows = datas.split(";"); String[][] dyns = new String[rows.length + 1][titleArr.length]; dyns[0] = titleArr; int rowNum = 1; for (String row : rows) { String[] cols = row.split(","); dyns[rowNum++] = cols; } //请求参数 DynSMSSendRequest sendRequest = new DynSMSSendRequest(); sendRequest.setTemplateId(templateId); sendRequest.setDynData(dyns); // 发送 ComResult<DynSMSSendDataResult> resultComResult = SmsUtils.dynSendMethod(sendRequest); SMSSendRequest request = new SMSSendRequest(); request.setTemplateId(templateId); request.setMessageContent(""); request.setUserNumber(""); // 先保存结果记录 SmsResult smsResult = saveSendResult(request, rows.length); if (null != smsResult) { List<SmsRecord> smsRecordList = new ArrayList<>(); // 遍历保存 for (Map<String, Object> map : list) { SmsRecord smsRecord = new SmsRecord(); smsRecord.setId(IdWorker.getId()); smsRecord.setTel(map.get("userPhone").toString()); // 内容处理 String s = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s"); // 拼接内容 String arrString = time + "," + MinConstant.fillWaterInfoUrl + "," + map.get("waterName").toString(); // 格式转换 String format = String.format(s, arrString.split(",")); smsRecord.setContent(format); smsRecord.setTemplateId(templateId); smsRecord.setResultId(smsResult.getId()); smsRecord.setResponseStatus(resultComResult.getCode().toString()); smsRecord.setResponseMsg(resultComResult.getMsg()); // 加入集合 smsRecordList.add(smsRecord); } // 批量保存记录 Integer count = smsRecordService.batchSaveSendRecord(smsRecordList); // 返回 return count.toString(); } } return null; } /** * 校验手机号码 */ public static boolean validator(String phone) { skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsTemplateServiceImpl.java
@@ -4,9 +4,13 @@ import cn.gistack.alerts.sms.mapper.SmsTemplateMapper; import cn.gistack.alerts.sms.service.ISmsTemplateService; import cn.gistack.alerts.sms.vo.SmsTemplateVO; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * 短信发送模板服务实现层 @@ -31,4 +35,15 @@ } return page.setRecords(baseMapper.selectSmsTemplatePage(page,smsTemplate)); } /** * 查询当前任务未接通的人员信息(包含水库编号) * @param taskId * @return */ @Override @DS("znwh") public List<Map<String, Object>> getNotConnectPatrolPersonList(String taskId) { return baseMapper.getNotConnectPatrolPersonList(taskId); } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
@@ -29,7 +29,7 @@ url: ${blade.datasource.dev.zt.url} username: ${blade.datasource.dev.zt.username} password: ${blade.datasource.dev.zt.password} # 智能外呼数据库 # 中台智能外呼数据库 ztznwh: url: ${blade.datasource.dev.ztznwh.url} username: ${blade.datasource.dev.ztznwh.username} @@ -39,5 +39,11 @@ url: ${blade.datasource.dev.xxljob.url} username: ${blade.datasource.dev.xxljob.username} password: ${blade.datasource.dev.xxljob.password} ## 智能外呼数据源(mysql) znwh: driver-class-name: ${blade.datasource.dev.znwh.driver-class-name} url: ${blade.datasource.dev.znwh.url} username: ${blade.datasource.dev.znwh.username} password: ${blade.datasource.dev.znwh.password} main: allow-circular-references: true skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-prod.yml
@@ -37,5 +37,11 @@ url: ${blade.datasource.prod.xxljob.url} username: ${blade.datasource.prod.xxljob.username} password: ${blade.datasource.prod.xxljob.password} ## 智能外呼数据源(mysql) znwh: driver-class-name: ${blade.datasource.dev.znwh.driver-class-name} url: ${blade.datasource.dev.znwh.url} username: ${blade.datasource.dev.znwh.username} password: ${blade.datasource.dev.znwh.password} main: allow-circular-references: true skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallImplImplClient.java
@@ -26,7 +26,7 @@ @Override @GetMapping(CREATE_OUT_CALL_TASK_JOB_HANDLER) public String createOutCallTaskJobHandler(String isOver, String taskScheduleTime, String personNumber, String day) { Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>(4); map.put("isOver",isOver); map.put("taskScheduleTime",taskScheduleTime); map.put("personNumber",personNumber); @@ -45,7 +45,7 @@ */ @Override public String testOutCall(String isOver, String taskScheduleTime, String personNumber, String day) { Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>(4); map.put("isOver",isOver); map.put("taskScheduleTime",taskScheduleTime); map.put("personNumber",personNumber); skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -116,7 +116,10 @@ if (response.getStatusCode() != HttpStatus.OK) { log.error("创建智能外呼任务失败:{}", response.getStatusCode()); } return response.getBody(); JSONObject jsonObject = JSON.parseObject(response.getBody()); Boolean success = jsonObject.getBoolean("success"); // 返回 return success + "," + taskName; } /** skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/SendSmsXxlJob.java
New file @@ -0,0 +1,42 @@ package cn.gistack.job.executor.jobhandler; import cn.gistack.alerts.sms.feign.ISmsRecordClient; import cn.gistack.sm.intelligentCall.feign.OutCallClient; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.log.XxlJobLogger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 短信定时发送任务执行器 * @author zhongrj * @date 2023-06-03 */ @Component public class SendSmsXxlJob { @Autowired private ISmsRecordClient smsRecordClient; /** * 外呼未接通-发送短信 * @param param * @return * @throws Exception */ @XxlJob("sendSmsByOutCallNotConnect") public ReturnT<String> createOutCallTaskJobHandler(String param){ XxlJobLogger.log("开始执行任务..."); JSONObject jsonParam = JSON.parseObject(param); String taskId = jsonParam.getString("taskId"); String time = jsonParam.getString("time"); // 外呼未接通-发送短信 Object result = smsRecordClient.sendSmsByOutCallNotConnect(taskId,time); XxlJobLogger.log("任务响应结果:" + result); XxlJobLogger.log("结束自动创建任务..."); return ReturnT.SUCCESS; } }