场景介绍
类似京东的售后有一个对应的跟进客服,我想在下单的时候就直接指定这个订单的跟进人,目前是均分策略,后续可能会按照其他方式分发。
方案一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);
//list中空了,再拉一批用户列表过来
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;
}