场景介绍
类似京东的售后有一个对应的跟进客服,我想在下单的时候就直接指定这个订单的跟进人,目前是均分策略,后续可能会按照其他方式分发。
方案一mysql+sort
利用mysql ,建立一张中间表,关联用户id 和sort 字段,当用户被分配订单时sort字段 = max(id) + 1 .选取用户时则取min(sort) 对应的用户,此流程可以让订单被均分到每个用户身上,但是比较重。
方案二redis+list
在redis 中维护一个list ,里面存放了所有的用户,分配订单的时候从中出栈一个用户,当list 中用户全部为空时,从db 中再将用户列表拉入redis 的list 中。此方案较灵活。list 中的用户可以按照自定义规则进行排序,让某些用户优先分到订单。
代码demo如下
public String getNextUserId(){
String userId = stringRedisTemplate.opsForList().leftPop(averageDispatchAppointmentkey);
if(StringUtils.isBlank(userId)){
UserParamDTO param = new UserParamDTO();
param.setRoleId(26L);
ClientResult<List<UserDTO>> feignResult = saAuthFeign.findUsersByRoleId(param);
log.info("客户运营专员列表 feignResult:{}", feignResult);
if(Objects.equals(feignResult.getCode(), ErrorCodeEnum.SUCCESS.getCode()) && Objects.nonNull(feignResult.getData())){
List<UserDTO> data = feignResult.getData();
stringRedisTemplate.opsForList().leftPushAll(
averageDispatchAppointmentkey,
data.stream().map(it -> it.getId().toString()).collect(Collectors.toList())
);
return stringRedisTemplate.opsForList().leftPop(averageDispatchAppointmentkey);
}else {
log.error("请求客户运营专员列表失败------failed\n");
}
}
return userId;
}
|