工单自动平均分配给工号
最近一个需求,需要上游分配的工单平均分配给所有工号,每个人相差1-2张工单。
算法实现思路:参考了负载均衡轮询的思想。但是发现这个算法并不符合要求,所以将此算法改造一下,让其符合需求。
以下代码需要根据实际改造,仅供参考!!!后期会持续优化。
核心代码:
private static List<StaffInfo> NotDistributeStaff=new CopyOnWriteArrayList<StaffInfo>();
@Autowired
protected ISheetService iSheetService;
@Autowired
protected ISheetLogService iSheetLogService;
@Autowired
protected IStaffService iStaffService;
Logger logger=Logger.getLogger(AssignJobHandler.class);
@Override
public ReturnT<String> execute(String param) throws Exception {
//每天早上九点开始清除记忆未分配工单的用户
clearStaff();
logger.info("记忆中存在的员工数量"+NotDistributeStaff.size());
// 查询需要分配工单的工号
List<StaffInfo> staffs = iStaffService.queryStaff();
// 查询当天需要分配的工单号
List<BusiSheet> sheets = iSheetService.queryBusiSheet();
logger.info("查询到的员工数量"+staffs.size()+"查询到的工单数量"+sheets.size());
if (sheets.size()>0 && staffs.size()>0) {
try {
//删除上次未分配工号在本次查询到员工中不存在的工号,防止员工操作修改自动派单员工后 依然给员工分配工单
for(StaffInfo staff: NotDistributeStaff) {
if(isExistList(staffs,staff.getUserid())==0) {
NotDistributeStaff.remove(staff);
}
}
if(NotDistributeStaff.size()!=0) {
for(StaffInfo staff:NotDistributeStaff) {
if(sheets.size()!=0) {
saveBusiSheetInfo(sheets.get(0).getSheet_id(),staff);
sheets.remove(0);
NotDistributeStaff.remove(staff);
}
}
}
Map<BusiSheet,StaffInfo> map=roundSheetAutoDistirbute(staffs, sheets);
for(Map.Entry<BusiSheet, StaffInfo> entry : map.entrySet()) {
saveBusiSheetInfo(entry.getKey().getSheet_id(),entry.getValue());
}
}catch(Exception e) {
e.printStackTrace();
}
}
return SUCCESS;
}
/**
* 认领工号保存日志
* @param sheetNo
* @param staff
*/
public void saveBusiSheetInfo(String sheetNo, StaffInfo staff) {
logger.info("分配工单号"+sheetNo+"分配工单人"+staff.getUserid());
iSheetService.acceptSheet(sheetNo, staff.getUserid());
CspBusiSheetLog cspBusiSheetLog = new CspBusiSheetLog(sheetNo, "工单处理", (long) staff.getOrgid(),
staff.getUserid(), staff.getOrgname(), "自动操作", "自动派单");
iSheetLogService.saveCspBusiSheetLog(cspBusiSheetLog);
}
/**
* 每天定时清理记忆工号
*/
public void clearStaff() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int hour= calendar.get(Calendar.HOUR_OF_DAY);
if(hour==9) {
NotDistributeStaff.clear();
}
}
/**
* 判断用户是否存在
* @param user
* @param userid
* @return
*/
private int isExistList(List<StaffInfo> user, String userid) {
List<String> userinfo=new ArrayList<String>();
for(int j=0;j<user.size();j++) {
userinfo.add(user.get(j).getUserid());
}
if(userinfo.contains(userid)) {
return 1;
}else {
return 0;
}
}
/**
* 工单分配实现类
* @param staff
* @param sheet
*/
public Map<BusiSheet,StaffInfo> roundSheetAutoDistirbute(List<StaffInfo> staff,List<BusiSheet> sheets) {
Map<BusiSheet,StaffInfo> map=new HashMap<BusiSheet,StaffInfo>();
int i=staff.size();
int count=0;
for(BusiSheet sheetinfo:sheets) {
if(i!=0) {
--i;
map.put(sheetinfo, staff.get(i));
}else {
i=staff.size();
}
count=i;
}
//如果存在未分配工单人员
if(count!=0) {
for(int j=0;j<count;j++) {
logger.info("未分配工单员工"+staff.get(j).getUserid());
NotDistributeStaff.add(staff.get(j));
}
}
return map;
}