zhongrj
2023-07-31 307f0f4713a87dabb0031a7bb9a2d7a9e0726cfc
智能外呼新增未接通,未呼叫水库定时呼叫
8 files modified
184 ■■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallClient.java 15 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallClientFallback.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallImplImplClient.java 12 ●●●●● 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 55 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java 9 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java 56 ●●●●● 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/feign/OutCallClient.java
@@ -19,6 +19,7 @@
    String API_PREFIX = "/client";
    String CREATE_OUT_CALL_TASK_JOB_HANDLER = API_PREFIX + "/createOutCallTaskJobHandler";
    String CREATE_OUT_CALL_TASK_JOB_HANDLER_BY_NOT_CALL = API_PREFIX + "/createOutCallTaskJobHandlerByNotCall";
    String CREATE_OUT_CALL_TASK_BY_NOT_CONNECT_JOB_HANDLER = API_PREFIX + "/createOutCallTaskByNotConnectJobHandler";
    String GET_CALL_NOT_FILL_RECORD_INFO = API_PREFIX + "/getCallNotFillRecordInfo";
    String CREATE_CALL_SMS_NOTICE_TASK = API_PREFIX + "/createCallSmsNoticeTask";
@@ -39,6 +40,20 @@
                                               @RequestParam("day") String day);
    /**
     * 智能外呼定时创建任务执行器--一直未接通,一直未呼叫的水库
     * @param isOver
     * @param taskScheduleTime
     * @param personNumber
     * @param day
     * @return
     */
    @GetMapping(CREATE_OUT_CALL_TASK_JOB_HANDLER_BY_NOT_CALL)
    List<String> createOutCallTaskJobHandlerByNotCall(@RequestParam("isOver") String isOver,
                                               @RequestParam("taskScheduleTime") String taskScheduleTime,
                                               @RequestParam("personNumber") String personNumber,
                                               @RequestParam("day") String day);
    /**
     * 测试
     * @param isOver
     * @param taskScheduleTime
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallClientFallback.java
@@ -18,6 +18,11 @@
    }
    @Override
    public List<String> createOutCallTaskJobHandlerByNotCall(String isOver, String taskScheduleTime, String personNumber, String day) {
        return null;
    }
    @Override
    public String testOutCall(String isOver, String taskScheduleTime, String personNumber, String day) {
        return null;
    }
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/feign/OutCallImplImplClient.java
@@ -43,6 +43,18 @@
        return callService.createCallTaskByParam(map);
    }
    @Override
    @GetMapping(CREATE_OUT_CALL_TASK_JOB_HANDLER_BY_NOT_CALL)
    public List<String> createOutCallTaskJobHandlerByNotCall(String isOver, String taskScheduleTime, String personNumber, String day) {
        Map<String, Object> map = new HashMap<>(4);
        map.put("isOver",isOver);
        map.put("taskScheduleTime",taskScheduleTime);
        map.put("personNumber",personNumber);
        map.put("day",day);
        // 创建定时任务并返回
        return callService.createCallTaskByParamByNotCall(map);
    }
    /**
     * 测试
     * @param isOver
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.java
@@ -189,4 +189,12 @@
    List<CallTaskResultVO> getCallResultListTemp(@Param("page") IPage<CallTaskResultVO> page,
                                                 @Param("callTaskResult")  CallTaskResultVO callTaskResult,
                                                 @Param("list")  List<String> list);
    /**
     * 查询从未接通和从未呼叫的水库
     * @return
     */
    @DS("ztznwh")
    @InterceptorIgnore(tenantLine = "true")
    List<Scene> getNotCallOrCallNotConnect();
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/mapper/CallTaskMapper.xml
@@ -928,4 +928,59 @@
        order by ctr."gmt_create" desc
    </select>
    <!--查询从未接通和从未呼叫的水库-->
    <select id="getNotCallOrCallNotConnect" resultType="cn.gistack.sm.intelligentCall.entity.Scene">
        (
        select b."guid" as waterCode,b."name" as waterName,c."user_name" as username,
            c."user_phone" as phone,c."user_phone" as userId from (
        select * from SJZT_MD."att_res_base"  arb right join (
            select e.* from (
                select JSON_VALUE("call_task_callee_content",'$."$水库编码$"') as waterCode
             from "SJZT_ODS"."call_task_callee" where date_format("gmt_create",'%Y-%m-%d') >='2023-05-01' group by JSON_VALUE("call_task_callee_content",'$."$水库编码$"')
             ) e left join
            (
            select waterCode from (
            select a.*,b."callee_number",b."call_result",c.id from (
            select "call_id",
            JSON_VALUE("call_task_callee_content",'$."$水库编码$"') as waterCode
             from "SJZT_ODS"."call_task_callee"
                where date_format("gmt_create",'%Y-%m-%d') >='2023-05-01'
                ) a left join "SJZT_ODS"."call_task_result" b on a."call_id" = b."call_id"
                left join "YWXT".sm_call_not_fill_record c on c.call_id = a."call_id"
                where ("call_result" = '200000' or  (b."call_result"!='200000' and c.id is not null))
                ) d group by waterCode
                ) f on e.waterCode = f.waterCode
                where f.waterCode is null
                )a on arb."guid" = a.waterCode) b
                 LEFT JOIN SJZT_MD."att_res_manage_person" c ON b."guid" = c."res_guid" and c."type" = 5
                 where "user_phone" is not null
        order by b."interior_ad_guid"
        )
        union
        (
            select
            e."code" as waterCode,e."name" as waterName,e."user_name" as username,
                e."user_phone" as phone,e."user_phone" as userId
            from (
            select b."code",b."name",b."res_reg_code",b."eng_scal",c."user_name",
                c."user_phone",aab.*
                     from (
            select * from SJZT_MD."att_res_base"  arb left join
            (
                select JSON_VALUE("call_task_callee_content",'$."$水库编码$"') as waterCode from "SJZT_ODS"."call_task_callee"
                    where date_format("gmt_create",'%Y-%m-%d') >='2023-05-01'
                    group by JSON_VALUE("call_task_callee_content",'$."$水库编码$"')
             ) a on arb."guid" = a.waterCode
             where waterCode is null) b
             LEFT JOIN SJZT_MD."att_res_manage_person" c ON b."guid" = c."res_guid" and c."type" = 5
             left join "SJZT_MD"."att_ad_base" aab on aab."guid" = b."interior_ad_guid"
            order by b."interior_ad_guid" ) e
            left join "SJZT_MD"."att_ad_base" aab on aab."ad_code" = e."p_ad_code"
            where e."user_phone" is not null
        )
    </select>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java
@@ -72,6 +72,15 @@
    List<String> createCallTaskByParam(Map<String, Object> params);
    /**
     * 根据条件自动创建外呼任务--一直未接通,一直未呼叫的水库
     * @param params
     * @return
     */
    List<String> createCallTaskByParamByNotCall(Map<String, Object> params);
    /**
     * 智能外呼呼叫前一天未接通人员
     * @param map 包含调度时间
     * @return
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -97,7 +97,7 @@
        LocalDateTime now = LocalDateTime.now();
        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS"));
        String transId = generateTransId(now);
        String taskName = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")) + "智能外呼";;
        String taskName = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")) + "智能外呼";
        if(null!= map.get("taskName") && !map.get("taskName").equals("")){
            taskName = map.get("taskName").toString();
        }
@@ -637,6 +637,28 @@
    }
    /**
     * 根据条件自动创建外呼任务--一直未接通,一直未呼叫的水库
     * @param params
     * @return
     */
    @Override
    public List<String> createCallTaskByParamByNotCall(Map<String, Object> params) {
        // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
        String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
        if (null==redisOneKey){
            List<String> stringList = everydayCallByNotCall(params);
            // 取出数据进行设置 taskId
            bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
            // 异步保存日常关联呼叫任务信息
            asyncCallService.saveDailyCallTask(stringList.get(1),1);
            // 响应
            return stringList;
        }else {
            return createEverydayAfter(redisOneKey);
        }
    }
    /**
     * 日常外呼任务未接通的继续拨打
     * @param redisOneKey 取值为上一次外呼的任务id
     * @return
@@ -676,6 +698,36 @@
        }
        // 返回
        return stringList;
    }
    /**
     * 日常外呼任务创建--从未接通和从未呼叫的水库
     * @param params
     * @return
     */
    private List<String> everydayCallByNotCall(Map<String, Object> params) {
        // 查询从未接通和从未呼叫的水库
        List<Scene> totalList = callTaskMapper.getNotCallOrCallNotConnect();
        // 取出随机的150人
        Set<Scene> taskRandomList = new HashSet<>();
        Integer personNumber = 150;
        Random random = new Random();
        for (int i = 0; i < totalList.size(); i++) {
            // 获取随机数作为下标索引
            int num = random.nextInt(totalList.size());
            // 保存到 hashSet ,保证唯一
            taskRandomList.add(totalList.get(num));
            // 数量达到预期设定退出循环
            if (taskRandomList.size() == personNumber) {
                break;
            }
        }
        //4. 传入调度时间和随机得到的人员信息进行任务的创建并返回
        params.put("list",setForListMap(taskRandomList));
        // 调度时间处理
        params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " +params.get("taskScheduleTime") + ":00");
        // 创建任务并返回结果
        return createTask(params);
    }
    /**
@@ -838,7 +890,7 @@
    }
    /**
     * 将 jsonArray 取出手机号得到新的集合
     * 将 jsonArray 取出手机号得到新的集合--超汛限场景
     * @param jsonArray
     * @return
     */
skjcmanager/skjcmanager-service/skjcmanager-xxljob/src/main/java/cn/gistack/job/executor/jobhandler/OutCallXxlJob.java
@@ -52,6 +52,30 @@
    }
    /**
     * 智能外呼定时创建任务执行器--一直未接通,一直未呼叫的水库
     * @param param
     * @return
     * @throws Exception
     */
    @XxlJob("createOutCallTaskJobHandlerByNotCall")
    public ReturnT<String> createOutCallTaskJobHandlerByNotCall(String param){
        XxlJobLogger.log("开始执行任务...");
        JSONObject jsonParam = JSON.parseObject(param);
        String isOver = jsonParam.getString("isOver");
        String taskScheduleTime = jsonParam.getString("taskScheduleTime");
        String personNumber = jsonParam.getString("personNumber");
        String day = jsonParam.getString("day");
        // 创建外呼任务
        List<String> result = outCallClient.createOutCallTaskJobHandlerByNotCall(isOver,taskScheduleTime,personNumber, day);
        XxlJobLogger.log("任务响应结果..." + result);
        // 创建外呼短信发送任务记录
        Boolean flag = createCallSmsNoticeTaskByEvery(result);
        XxlJobLogger.log("外呼短信通知任务创建结果:" + flag);
        XxlJobLogger.log("结束自动创建任务...");
        return ReturnT.SUCCESS;
    }
    /**
     * 创建外呼短信发送任务记录--日常定时任务
     * @param result
     */