package com.norteksoft.wf.engine.service; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.acs.service.organization.UserManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.User; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.task.base.enumeration.TaskState; import com.norteksoft.task.entity.WorkflowTask; import com.norteksoft.task.webservice.WorkflowTaskService; import com.norteksoft.wf.engine.dao.InstanceHistoryDao; import com.norteksoft.wf.engine.entity.InstanceHistory; import com.norteksoft.wf.engine.entity.Opinion; @Service @Transactional public class InstanceHistoryManager { private Log log = LogFactory.getLog(InstanceHistoryManager.class); private InstanceHistoryDao instanceHistoryDao; private WorkflowTaskService workflowTaskService; @Autowired public void setInstanceHistoryDao(InstanceHistoryDao instanceHistoryDao) { this.instanceHistoryDao = instanceHistoryDao; } @Autowired public void setWorkflowTaskService(WorkflowTaskService workflowTaskService) { this.workflowTaskService = workflowTaskService; } /** * 保存流转历史 * @param ih */ @Transactional(readOnly=false) public void saveHistory(InstanceHistory ih){ instanceHistoryDao.save(ih); } @Transactional(readOnly=false) public void saveHistories(List<InstanceHistory> ihs){ for(InstanceHistory ih : ihs){ instanceHistoryDao.save(ih); } } /** * 根据流程实例ID查询历史记录(flex用) * @param companyId * @param instanceId * @return String[][]: [环节名称,办理人,操作,办理意见];自动环节没有办理人 */ public String[][] getHistoryByInstanceId(Long companyId, String instanceId){ List<Object[]> specialHistorieAndOpinions = instanceHistoryDao.getHistoryBySpecial(companyId, instanceId, true); List<Object[]> historieAndOpinions = instanceHistoryDao.getHistoryBySpecial(companyId, instanceId, false); List<InstanceHistory> specialHistories = getHistoryFromHistoryAndOpinion(specialHistorieAndOpinions); List<InstanceHistory> histories = getHistoryFromHistoryAndOpinion(historieAndOpinions); String[][] result = new String[specialHistories.size()+histories.size()][5]; int num=0; for(int i = 0; i < specialHistories.size(); i++){ result[num++] = new String[]{specialHistories.get(i).getTaskName(), specialHistories.get(i).getTransactor(), specialHistories.get(i).getTransactionResult(), specialHistories.get(i).getTransactorOpinion(),specialHistories.get(i).getSpecialTask()+""}; } for(int i = 0; i < histories.size(); i++){ result[num++] = new String[]{histories.get(i).getTaskName(), histories.get(i).getTransactor(), histories.get(i).getTransactionResult(), histories.get(i).getTransactorOpinion(),histories.get(i).getSpecialTask()+""}; } return result; } public List<InstanceHistory> getHistorysByWorkflowId(Long companyId, String workflowId){ List<Object[]> histories=instanceHistoryDao.getHistoryByWorkflowId(companyId, workflowId); return getHistoryFromHistoryAndOpinion(histories); } private List<InstanceHistory> getHistoryFromHistoryAndOpinion(List<Object[]> histories){ List<InstanceHistory> list = new ArrayList<InstanceHistory>(); InstanceHistory ih = null; Opinion opinion = null; Long lastTaskId = null; for(int i = 0; i < histories.size(); i++){ opinion = (Opinion) histories.get(i)[1]; //处理同一条流转历史多条意见 if(opinion != null && lastTaskId != null && lastTaskId.equals(opinion.getTaskId())){ if(ih.getTransactorOpinion() != null){ ih.setTransactorOpinion(ih.getTransactorOpinion()+";"+opinion.getOpinion()); }else{ ih.setTransactorOpinion(opinion.getOpinion()); } }else{ ih = (InstanceHistory) histories.get(i)[0]; if(opinion != null) ih.setTransactorOpinion(opinion.getOpinion()); lastTaskId = ih.getTaskId(); list.add(ih); } } return list; } /** * 查询流程的人工环节流转历史 * @param companyId * @param instanceId * @return */ public List<InstanceHistory> getArtificialHistory(Long companyId, String instanceId){ return instanceHistoryDao.getArtificialHistory(companyId, instanceId); } /** * 查询流程实例所有有效的流转历史 * @param companyId * @param instanceId * @return */ public List<InstanceHistory> getAllHistoryByInstance(Long companyId, String instanceId){ return instanceHistoryDao.getAllHistoryByInstance(companyId, instanceId); } /** * 查询流程进入环节的流转历史 * @param companyId * @param instanceId * @return */ public List<InstanceHistory> getIntoTaskHistory(Long companyId, String instanceId){ return instanceHistoryDao.getIntoTaskHistory(companyId, instanceId); } /** * 查询主流程的人工环节流转历史 * @param companyId * @param instanceId * @return */ public List<InstanceHistory> getMainProcessHistory(Long companyId, String instanceId){ return instanceHistoryDao.getMainProcessHistory(companyId, instanceId); } /** * 删除取回后的流转历史 * @param companyId * @param instanceId * @param taskName * @param taskNames */ @Transactional(readOnly=false) public void deleteHistoryByTask(Long companyId, String instanceId,Long taskId, String[] taskNames){ instanceHistoryDao.deleteHistoryByTask(companyId, instanceId, taskId, taskNames); } @Transactional(readOnly=false) public void deleteHistoryByworkflowId(String workflowId){ instanceHistoryDao.deleteHistoryByworkflowId(workflowId,ContextUtils.getCompanyId()); } /** * 查询当前环节(flex用) * @param companyId * @param instanceId * @return List 当前环节 */ public List<String[]> getCurrentTasks(Long companyId, String instanceId){ //FIXME 重构:逻辑过于复杂,二十天后自己都难读明白 //存放任务及候选人(任务待领取的) <任务名称,办理任务的候选人> Map<String, StringBuilder> transactorCandidates = new HashMap<String, StringBuilder>(); //存放任务及办理人(任务已经领取的或不需要领取的) <任务名称,任务办理人> Map<String, StringBuilder> transactors = new HashMap<String, StringBuilder>(); Map<String, Boolean> specials = new HashMap<String, Boolean>(); List<WorkflowTask> tasks = workflowTaskService.getActivityTasks(instanceId, companyId); processTasks(tasks, transactors, transactorCandidates,specials,companyId); List<String[]> result = new ArrayList<String[]>(); String[] taskTransactor = null; String resultTransactors = ""; for(Map.Entry<String, StringBuilder> taskTransactorPair : transactors.entrySet()){ taskTransactor = new String[3]; resultTransactors = taskTransactorPair.getValue().toString(); if(!resultTransactors.endsWith(",")){ resultTransactors = transactorCandidates.get(taskTransactorPair.getKey()).toString(); } taskTransactor[0] = taskTransactorPair.getKey(); if(resultTransactors.length()>0){ taskTransactor[1] = resultTransactors.substring(0, resultTransactors.length()-1); }else{ taskTransactor[1] = ""; } taskTransactor[2] = specials.get(taskTransactorPair.getKey()).toString(); result.add(taskTransactor); } log.debug("*** getCurrentTasks 方法结束"); return result; } /* * 处理任务及其办理人 */ private void processTasks(List<WorkflowTask> tasks, Map<String, StringBuilder> transactors, Map<String, StringBuilder> transactorCandidates,Map<String,Boolean> specials,Long companyId){ String userName = ""; List<String> candiLoginNames=new ArrayList<String>(); List<String> loginNames=new ArrayList<String>(); //遍历当前待办的任务 for(WorkflowTask task : tasks){ if(transactors.get(task.getName()) == null){ transactors.put(task.getName(), new StringBuilder()); } if(transactorCandidates.get(task.getName()) == null){ transactorCandidates.put(task.getName(), new StringBuilder()); } if(TaskState.DRAW_WAIT.getIndex().equals(task.getActive())){//未领取的, candiLoginNames.add(task.getTransactor()); }else{//已领取的任务 loginNames.add(task.getTransactor()); } if(task.isSpecialTask()){ specials.put(task.getName(), true); }else{ specials.put(task.getName(), false); } } //未领取任务办理人排序 List<User> results=null; if(candiLoginNames.size()>0){ results=ApiFactory.getAcsService().getUsersByLoginNames(companyId,candiLoginNames); Collections.sort(results, new Comparator<User>() { public int compare(User user1, User user2) { if(user1.getWeight()<user2.getWeight()){ return 1; } return 0; } }); for(User u:results){ for(WorkflowTask task : tasks){ if(TaskState.DRAW_WAIT.getIndex().equals(task.getActive())){//未领取的, if(u.getLoginName().equals(task.getTransactor())){ userName = getUserNameByLoginName(task.getTransactor()); if(task.isSpecialTask()){ transactorCandidates.get(task.getName()).append(userName).append("(特)").append(","); }else{ transactorCandidates.get(task.getName()).append(userName).append(","); } break; } } } } } //已领取的任务办理人排序 if(loginNames.size()>0){ results=ApiFactory.getAcsService().getTacheUsersByLoginNames(companyId,loginNames); Collections.sort(results, new Comparator<User>() { public int compare(User user1, User user2) { if(user1.getWeight()<user2.getWeight()){ return 1; } return 0; } }); List<WorkflowTask> tempTasks = tasks; for(User u:results){ for(WorkflowTask task : tempTasks){ if(!TaskState.DRAW_WAIT.getIndex().equals(task.getActive())){//已领取的任务 if(u!=null&&u.getLoginName().equals(task.getTransactor())){ userName = getUserNameByLoginName(task.getTransactor()); if(task.isSpecialTask()){ transactors.get(task.getName()).append(userName).append("(特)").append(","); }else{ transactors.get(task.getName()).append(userName).append(","); } tempTasks.remove(task); break; } } } } } } /* * 通过登陆名查询用户名 */ private String getUserNameByLoginName(String loginName){ UserManager userManager = (UserManager) ContextUtils.getBean("userManager"); com.norteksoft.acs.entity.organization.User user = userManager.getUserByLoginName(loginName); String userName = ""; if(user != null){ userName = user.getName(); } return userName; } }