外呼系统实现平均分配策略的实现方式之一

   之前我们做的外呼系统中,转接分机时我们随机选择一个空闲的坐席,转接给他;但我发现,随机分配的,有的坐席接的很多,而有的坐席接的不多,没有达到均分的理想,所以潜心研究了 一下:我想出来一种均分的思想,与大家分享;

  每个坐席有坐席状态,我们把每个坐席在更新状态时,把当前的时间戳存储在Redis中,在找空闲分机时,查询出空闲的坐席,根据坐席的分机号,从Redis中取出时间戳,用当前的时间戳减去取出的时间戳,时间差最大者就分给此坐席,大概思想就是这个样子;看一下大概代码:

  

    // 更新坐席状态
    @PostMapping("/updateStatus")
    public ResultVO updateStatus(@RequestParam(value = "number") String number,
                                 @RequestParam(value = "status") String status){
        ucExtensionService.updateStatus(number, status);
        return ResultVOUtil.success(true);
    }

    @Override
    public void updateStatus(String number, String status) {
        // String[] columnName, T entry
        String[] columnName = {"extensionNumber"};
        UcExtension entry = new UcExtension();
        entry.setExtensionNumber(number);
        entry.setExtensionStatus(status);
        //分机存入redis中,key为前缀加分机号 value为当前时间戳
        redisTemplate.opsForValue().set(REDIS_PREFIX+number,new Date().getTime());
        extensionDao.updateByColumn(columnName, entry);
    }

  再根据当前设定的策略查找分机:

  // 获取一个可用分机
    @GetMapping("/getOneByGroup/{groupId}/{taskId}")
    public ResultVO getOneByGroup(@PathVariable(value = "groupId") Long groupId, @PathVariable("taskId") Long taskId){
        List<ExtensionDTO> extensionDTOS = ucExtensionService.queryFreeStatusExtensions(groupId);
        if (extensionDTOS.size()==0) {
            return ResultVOUtil.error(-1, "暂无空闲分机", new ExtensionDTO());
        }
        ResultVO<TaskInfoDTO> resultVO = businessMoudleService.queryTaskInfoByTaskId(taskId);
        int distributeWay = resultVO.getData().getDistributeWay();
        ExtensionDTO extension =new ExtensionDTO();
        switch (distributeWay){
            case 2:
                log.info("随机分配");
                int index = random.nextInt(extensionDTOS.size());
                extension = extensionDTOS.get(index);
                break;
            case 3:
                log.info("最长空闲者优先");
                Long currentTimeStamp = new Date().getTime();
                Long waiteTime = 0L;
                for (ExtensionDTO ext:extensionDTOS) {
                     Long waitTimeStamp = (Long) redisTemplate.opsForValue().get(REDIS_PREFIX + ext.getExtensionNumber());
                    Long time = currentTimeStamp - Long.valueOf(waitTimeStamp);
                    log.info("分机{}的等待时间为{}",ext.getExtensionNumber(),time);
                    if(time > waiteTime){
                        waiteTime = time;
                        extension = ext;
                    }
                }
                log.info("选出的分机是{}姓名是{}",extension.getExtensionNumber(),extension.getRealName());
                break;
            default:
                log.info("随机分配");
                int index1 = random.nextInt(extensionDTOS.size());
                extension = extensionDTOS.get(index1);
        }
        // 2. 将此分机状态改为忙碌
        ucExtensionService.updateStatus(extension.getExtensionNumber(), "2");
        return ResultVOUtil.success(extension);
    }

来看一下日志分析:

  

2019-02-14 09:26:56,025 [http-nio-8050-exec-12] INFO  com.hmzj.callcenteruser.controller.ExtensionController - 最长空闲者优先
2019-02-14 09:26:56,028 [http-nio-8050-exec-12] INFO  com.hmzj.callcenteruser.controller.ExtensionController - 分机10891017的等待时间为20120
2019-02-14 09:26:56,031 [http-nio-8050-exec-12] INFO  com.hmzj.callcenteruser.controller.ExtensionController - 分机10891050的等待时间为26957
2019-02-14 09:26:56,034 [http-nio-8050-exec-12] INFO  com.hmzj.callcenteruser.controller.ExtensionController - 分机10891054的等待时间为4209
2019-02-14 09:26:56,034 [http-nio-8050-exec-12] INFO  com.hmzj.callcenteruser.controller.ExtensionController - 选出的分机是10891050姓名是王兆斌

  此不失为一种简单的均分策略,仅供参考!

猜你喜欢

转载自www.cnblogs.com/pangyangqi/p/10373443.html
今日推荐