zoukankan      html  css  js  c++  java
  • 外呼系统实现平均分配策略的实现方式之一

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

      每个坐席有坐席状态,我们把每个坐席在更新状态时,把当前的时间戳存储在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姓名是王兆斌

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

  • 相关阅读:
    Atom 和 markdown 基本使用
    c++11 正则表达式基本使用
    Emacs 之窗口管理
    Emacs 之列编辑模式
    Emacs 之查看帮助
    使用 json_in_java
    Linux服务 httpd
    Linux 编译安装BIND
    Kerberos
    Linux服务 DNS&BIND
  • 原文地址:https://www.cnblogs.com/pangyangqi/p/10373443.html
Copyright © 2011-2022 走看看