工单自动分配算法实现

工单自动平均分配给工号


最近一个需求,需要上游分配的工单平均分配给所有工号,每个人相差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;
    }

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页