zhongrj
2023-07-03 f758555462e55eb53d7175556650bf3114288497
智能外呼逻辑调整,修改为每天11点2点5点依次拨打
6 files modified
113 ■■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/constant/CallConstant.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.java 8 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.xml 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java 62 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/AlarmXxlJob.java 2 ●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/OutCallXxlJob.java 24 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/constant/CallConstant.java
@@ -41,4 +41,9 @@
     */
    public static final String taskDetailUrl = "/api/task/callDetail.json";
    /**
     * key
     */
    public static final String call_task_key = "blade:sm:call";
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.java
@@ -152,4 +152,12 @@
                                                        @Param("list") List<String> list,
                                                        @Param("callTaskStatistic") CallTaskStatistic callTaskStatistic,
                                                        @Param("day") Map<String, Object> day);
    /**
     * 通过 taskId 查询未呼叫人员(mysql)
     * @param taskId
     * @return
     */
    @DS("znwh")
    List<Scene> getCallNotConnectListByTaskId(@Param("taskId") String taskId);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.xml
@@ -444,4 +444,16 @@
        </if>
    </select>
    <!--通过 taskId 查询未呼叫人员(mysql)-->
    <select id="getCallNotConnectListByTaskId" resultType="cn.gistack.sm.intelligentCall.entity.Scene">
        select ctc.callee_number as phone,ctc.callee_number as userId,
        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
        join  call_task_result ctr on ctc.call_id = ctr.call_id
        and ctc.call_status = 4 and ctr.call_result!='200000' and ctc.task_id = #{taskId}
    </select>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -19,11 +19,11 @@
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.redis.cache.BladeRedis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@@ -50,6 +50,9 @@
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private BladeRedis bladeRedis;
//    @Value("${dial.task.url}")
    private String url = CallConstant.HOST;
@@ -538,6 +541,63 @@
     */
    @Override
    public List<String> createCallTaskByParam(Map<String, Object> params) {
        // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
        String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
        if (null==redisOneKey){
            List<String> stringList = everydayCall(params);
            // 取出数据进行设置 taskId
            bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
            // 响应
            return stringList;
        }else {
            return createEverydayAfter(redisOneKey);
        }
    }
    /**
     * 日常外呼任务未接通的继续拨打
     * @param redisOneKey 取值为上一次外呼的任务id
     * @return
     */
    private List<String> createEverydayAfter(String redisOneKey) {
//        redisOneKey = "2216,1";
        String[] split = redisOneKey.split(",");
        String taskId = split[0];
        String type = split[1];
        List<String> stringList = new ArrayList<>();
        Map<String, Object> params = new HashMap<>();
        // 通过 taskId 查询未呼叫人员(mysql)
        List<Scene> list = callTaskMapper.getCallNotConnectListByTaskId(taskId);
        if (list.size()>0){
            Set<Scene> scenes = new HashSet<>(list);
            // 传入调度时间和随机得到的人员信息进行任务的创建并返回
            params.put("list",setForListMap(scenes));
            // 调度时间处理
            params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            // 创建任务
            stringList = createTask(params);
            // 判断是否发送短信
            if (type.equals("1")){
                // 取出数据进行设置 taskId
                bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+2,6*60*60L);
            }
            // 判断是否发送短信
            if (type.equals("2")){
                // 新增一个参数代表需要发短信
                stringList.add("3");
            }
        }
        // 返回
        return stringList;
    }
    /**
     * 日常外呼任务创建
     * @param params
     * @return
     */
    private List<String> everydayCall(Map<String, Object> params) {
        // 自动创建任务的 4个条件  1:呼叫人数  2:调度时间  3:是否超汛限  4:多少天内呼叫过的不呼叫(天数)
        //1. 调用中台接口查询出所有需要发任务的水库巡查责任人相关信息(该处需要将是否超汛限条件传入)
        JSONArray jsonArray = getZtWaterMangerData(params);
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/AlarmXxlJob.java
@@ -107,7 +107,7 @@
     * @return
     * @throws Exception
     */
    @XxlJob("waterFirstOverHandle_test_0703")
    @XxlJob("waterFirstOverHandle")
    public ReturnT<String> waterFirstOverHandle(String param){
        XxlJobLogger.log("开始执行任务...");
        // 创建外呼任务
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/OutCallXxlJob.java
@@ -45,10 +45,26 @@
        List<String> result = outCallClient.createOutCallTaskJobHandler(isOver,taskScheduleTime,personNumber, day);
        XxlJobLogger.log("任务响应结果..." + result);
        // 创建外呼短信发送任务记录
        Boolean flag = createCallSmsNoticeTask(result);
        Boolean flag = createCallSmsNoticeTaskByEvery(result);
        XxlJobLogger.log("外呼短信通知任务创建结果:" + flag);
        XxlJobLogger.log("结束自动创建任务...");
        return ReturnT.SUCCESS;
    }
    /**
     * 创建外呼短信发送任务记录--日常定时任务
     * @param result
     */
    private Boolean createCallSmsNoticeTaskByEvery(List<String> result) {
        Boolean flag = false;
        if (null != result && result.size()>3) {
            if (result.get(2).equals("true")) {
                // 获取任务id
                String taskId = result.get(1);
                flag = outCallClient.createCallSmsNoticeTask(taskId);
            }
        }
        return flag;
    }
    /**
@@ -94,7 +110,7 @@
     * @return
     * @throws Exception
     */
    @XxlJob("testOutCall_0628")
    @XxlJob("testOutCall_0703")
    public ReturnT<String> testOutCall(String param){
        XxlJobLogger.log("开始执行任务...");
        JSONObject jsonParam = JSON.parseObject(param);
@@ -103,8 +119,8 @@
//        String personNumber = jsonParam.getString("personNumber");
//        String day = jsonParam.getString("day");
        // 创建外呼任务
        Object result = outCallClient.testOutCall("","","", "");
        XxlJobLogger.log("任务响应结果:" + result);
//        Object result = outCallClient.createOutCallTaskJobHandler("","","", "");
//        XxlJobLogger.log("任务响应结果:" + result);
        XxlJobLogger.log("结束自动创建任务...");
        return ReturnT.SUCCESS;
    }