`
yiding_123
  • 浏览: 40177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 实现自动派单(自动分配任务)

    博客分类:
  • Java
阅读更多

需求:

最近要实现一个自动派单功能,就是如果有任务来了,那么任务平均分配给现有的员工,如果之前取了任务的员工下次来任务时就分配给下一个,如果有新员工则将员工添加到队列的最后,如果有员工离职就将员工信息从队列里移除。

 

实现:

1.写一个定时任务,定时将任务放入任务队列中TaskQueue,并将员工放入User队列中,如果员工已存在则不添加,如果新员工则加入队列中,如果员工不存在了就从队列中移除。

2.写一个线程,从任务队列中取任务,如果任务不存在则阻塞,取到任务后,将该任务派给下一个员工,并将该员工添加到员工队列末尾,这样达到按员工次序分配任务。

3.实现一个任务队列,如果在取任务时任务不存在则阻塞。

4.实现一个员工队列,在取下一个员工后将该员工从列头移到列尾,并且可以将新员工加入到队列未尾,可以将不存在的员工从队列中移除。

 

核心代码:

 

import java.util.Collection;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * 任务队列
 * 如果在取任务时没有任务,则阻塞
 * @author dg
 *
 */
public class TaskQueue {
	
	private static TaskQueue instance;
	
	private static BlockingQueue queue = null;
	
	private TaskQueue(){
		queue = new LinkedBlockingDeque();
	}
	
	public static TaskQueue getInstance(){
		if(instance == null){
			instance = new TaskQueue();
		}
		return instance;
	}
	
	/**
	 * 获取队列大小
	 * @return
	 */
	public static int getSize(){
		return queue.size();
	}
	
	/**
	 * 放入队列中
	 * @param msg
	 */
	public void put(Object obj){
		if(obj != null){
			try {
				queue.put(obj);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 放入队列中
	 * @param msg
	 */
	public void putAll(Collection objs){
		if(objs != null){
			queue.addAll(objs);
		}
	}
	
	/**
	 * 从队列中取出一个
	 * @return
	 */
	public Object take(){
		try {
			Object obj = queue.take();	
			return obj;
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return null;
	}

}

 

 

 

/**
 * 存放即将被派任务的员工
 * 每次取出员工时不移除该员工,而是将其放到队列末尾
 * 如果员工已不存在,将其移除
 * @author dg
 *
 */
public class UserQueue {
	
	private static UserQueue instance = null;
	private static BlockingQueue<User> queue = null;
	
	private UserQueue(){
		queue =  new LinkedBlockingDeque<User>();
	}
	
	public static UserQueue getInstance(){
		if(instance == null){
			instance = new UserQueue();
		}
		return instance;
	}

	/**
	 * 取下一个员工
	 * @return
	 */
	public User takeNext(){
		User user = null;
		try {
			user = queue.take();
			this.put(user);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return user;
	}
	
	/**
	 * 将新员工放入队列中未尾
	 */
	public void put(User user){
		if(queue.contains(user)){
			return;
		}else{
			try {
				queue.put(user);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void putAll(Collection<User> users){
		for(User user : users){
			this.put(user);
		}
	}
	
	/**
	 * 将已不存在的员工移除
	 */
	public void remove(User user){
		if(queue.contains(user)){
			queue.remove(user);
		}
	}
	
	/**
	 * 获取目前队列中所有的user
	 * @return
	 */
	public Object[] getAllUsers(){
		Object[] obj = queue.toArray();
		return obj;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user1 = new User();
		user1.setUid(1);
		user1.setAccount("11");
		
		User user2 = new User();
		user2.setUid(1);
		user2.setAccount("11");
		
		User user3 = new User();
		user3.setUid(3);
		user3.setAccount("11");
		
		User user4 = new User();
		user4.setUid(4);
		user4.setAccount("444");
		
		User user5 = new User();
		user5.setUid(5);
		user5.setAccount("555");
		
		UserQueue.getInstance().put(user1);
		UserQueue.getInstance().put(user2);
		UserQueue.getInstance().put(user3);
		UserQueue.getInstance().put(user4);
		UserQueue.getInstance().put(user5);
		
		for(int i = 0 ; i < 20; i++){
			System.out.println(UserQueue.getInstance().takeNext().getUid());
			if(i == 5){
				UserQueue.getInstance().remove(user2);
			}
		}
		
		Object[] users = UserQueue.getInstance().getAllUsers();
		System.out.println("=======");
		for(Object user:users){
			System.out.println(((User)user).getUid());
		}
	}

}

 

对于要实现User对象的比较,首先要重写equals方法.以下是我重写的User的equals方法

public boolean equals(Object obj) {
		if(!(obj instanceof User)){
			return false;
		}
		User u = (User)obj;
		return (u.getAccount().equals(account) && u.getUid().equals(uid));
	}

 

import java.util.List;
import java.util.TimerTask;

import org.apache.log4j.Logger;

import com.cms.common.ServiceUtil;
import com.cms.common.SysConfig;
import com.cms.entity.ClientRecord;
import com.cms.entity.User;
import com.cms.service.ClientService;

/**
 * 定时将客户意向放入任务队列
 * 并且重新成功员工队列 
 * @author dg
 *
 */
public class GenerateTask extends TimerTask {
	
	private static Logger logger = Logger.getLogger(GenerateTask.class);
	private ClientService clientService = (ClientService)ServiceUtil.getService("clientService");

	public void run() {
		try {
			String autoTaskRoleIds = SysConfig.getStrValue("autotask.roleid");
			if(autoTaskRoleIds == null || autoTaskRoleIds.trim().equals("") 
					|| autoTaskRoleIds.split(",").length == 0){
				logger.error("自动派单角色未设置");
				return;
			}
			//取全部名单
			List<User> userList = clientService.getAllAutoTaskUsers(autoTaskRoleIds.split(","));
			if(userList == null || userList.size() == 0){
				logger.error("目前还未有业务员无法派单");
				return;
			}
			//将已不存在的用户移除
			Object[] users = UserQueue.getInstance().getAllUsers();
			for(Object user : users){
				if(!userList.contains(user)){
					UserQueue.getInstance().remove((User)user);
				}
			}
			//重新生成名单
			UserQueue.getInstance().putAll(userList);
			//生成任务
			List<ClientRecord> recordList = clientService.getAllUnAssignRecord();
			TaskQueue.getInstance().putAll(recordList);
		} catch (Throwable t) {
			logger.error("自动派单任务异常!" ,t);
		}finally{
			logger.info("此次任务执行完毕!");
		}
	}
}

 

import org.apache.log4j.Logger;

import com.cms.common.ServiceUtil;
import com.cms.entity.ClientRecord;
import com.cms.entity.User;
import com.cms.schedule.TaskQueue;
import com.cms.schedule.UserQueue;
import com.cms.service.ClientService;

/**
 * 从任务队列里取到任务,自动派单给业务员
 * @author dg
 *
 */
public class AutoDispatchTaskThread implements Runnable{
	
	private static Logger logger = Logger.getLogger(AutoDispatchTaskThread.class);
	private ClientService clientService = (ClientService)ServiceUtil.getService("clientService");
	
	private boolean stop = false;

	@Override
	public void run() {
		try{
			while(!stop){
				ClientRecord record = (ClientRecord)TaskQueue.getInstance().take();
				User user = UserQueue.getInstance().takeNext();
				clientService.assginRecord(record.getRid(), user.getUid());
			}
		}catch(Throwable t){
			logger.error(t.getMessage(),t);
		}
	}
}

 

 

分享到:
评论
2 楼 monianhao 2018-05-29  
亲,可以发一份参考一下吗?我的邮箱monianxinhao@163.com。万分感谢!
1 楼 kidshg 2018-01-02  
亲。写的很好。有咩有完整代码?可不可以发我一份?422076408@qq.com,谢谢!

相关推荐

    java源码_派单系统平台源码完整版.zip

    java源码_派单系统平台源码完整版java源码_派单系统平台源码完整版java源码_派单系统平台源码完整版java源码_派单系统平台源码完整版java源码_派单系统平台源码完整版java源码_派单系统平台源码完整版java源码_派单...

    派单系统平台源码完整版 带项目说明 java源码

    在派单系统中,Java可能被用来构建服务器端逻辑,处理数据存储、用户认证、任务分配、状态更新等功能。后端开发者可能使用Spring Boot框架,它简化了Spring应用的初始搭建以及开发过程,提供了自动配置、内嵌式Web...

    java派单管理系统.rar

    4. **调度算法**:为了高效分配任务,系统可能采用智能调度算法,考虑服务人员的位置、工作负载、服务质量等因素,自动为订单分配最合适的工作人员。 5. **地图集成**:与GPS或地图服务(如高德、百度地图)集成,...

    Java 抢单系统源码-派单系统平台 原生安卓苹果APP 带项目说明

    这个系统通常应用于物流配送、服务预约、任务调度等多个领域,通过智能算法实现任务的自动分配,提高业务处理效率。 在Android和iOS平台上,该系统提供了原生的应用程序,确保了用户在不同设备上都能获得流畅的体验...

    基础的Java工单系统源码.zip

    4. **业务逻辑**:Java后端负责处理工单的生命周期,如创建、分配、更新和关闭工单。这可能涉及到复杂的业务规则和工作流。 5. **通知机制**:系统可能有邮件或其他通信方式的通知功能,当工单状态改变时,自动通知...

    计算机科学与技术_基于Java的家电售后服务管理系统的设计与实现.docx

    8. **派单管理**:根据用户的预约情况,自动或手动为维修人员分配任务。 9. **售后评价与进度管理**:用户可以对服务进行评价,同时跟踪服务进度。 #### 四、关键技术介绍 - **Spring框架**:一款轻量级的Java开发...

    完整版java源码调度系统平台

    【描述】中的"java 源码 _派单系统平台源码完整版"提示我们,这个系统特别关注派单功能,即任务或订单的自动分发。"喜欢的自行下载研究吧"意味着提供的是开源代码,开发者可以自由下载,用于学习、研究或者定制化...

    完整版java源码调度系统平台源码

    派单系统是指能够自动化处理订单分配、执行跟踪和优化工作流程的软件系统,常见于物流、外卖、服务行业等。研究这样的源码可以帮助开发者深入理解如何在实际项目中运用Java技术,以及如何设计和实现复杂的业务逻辑。...

    ssm项目机电公司管理信息系统(小程序.zip

    6. **员工管理**:管理员工信息,分配任务,记录工作小时数和产出。 7. **服务派单**:根据客户请求派遣技术人员进行维修或服务工作。 8. **报告和分析**:生成各种报表,如销售报告、库存报告和财务报表,以支持...

    基于Spring Boot的车辆管理系统的设计与实现 -开题报告-(1).doc

    2. **派单管理**:根据维修人员的工作负载情况,合理安排维修任务。 3. **零件库存管理**:监控库存数量,及时补充或调整库存。 4. **维修进度跟踪**:实时更新维修状态,便于客户查询。 5. **客户服务**:提供在线...

Global site tag (gtag.js) - Google Analytics