之前我们做的外呼系统中,转接分机时我们随机选择一个空闲的坐席,转接给他;但我发现,随机分配的,有的坐席接的很多,而有的坐席接的不多,没有达到均分的理想,所以潜心研究了 一下:我想出来一种均分的思想,与大家分享;
每个坐席有坐席状态,我们把每个坐席在更新状态时,把当前的时间戳存储在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姓名是王兆斌
此不失为一种简单的均分策略,仅供参考!