zhongrj
2023-06-15 e8b2f330647999bad26d2b5e2370f83252ae9c07
新增定时发送外呼未接通人员短信
13 files modified
2 files added
245 ■■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/feign/ISmsRecordClient.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/feign/ISmsRecordClientFallback.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/constant/MinConstant.java 14 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/feign/SmsRecordClient.java 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.java 10 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.xml 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/ISmsTemplateService.java 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java 8 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java 82 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsTemplateServiceImpl.java 15 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml 8 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-prod.yml 6 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallImplImplClient.java 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java 5 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/SendSmsXxlJob.java 42 ●●●●● patch | view | raw | blame | history
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;
    }
}