package com.norteksoft.task.service; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jbpm.api.ProcessEngine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import rtx.RtxMsgSender; import com.norteksoft.acs.entity.organization.User; import com.norteksoft.acs.service.AcsUtils; import com.norteksoft.acs.service.authorization.BusinessSystemManager; import com.norteksoft.acs.service.organization.UserManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.orm.Page; import com.norteksoft.product.util.AsyncMailUtils; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.PropUtils; import com.norteksoft.product.util.SystemUrls; import com.norteksoft.task.base.enumeration.TaskCategory; import com.norteksoft.task.base.enumeration.TaskProcessingMode; import com.norteksoft.task.base.enumeration.TaskState; import com.norteksoft.task.base.enumeration.TaskProcessingResult; import com.norteksoft.task.dao.TaskDao; import com.norteksoft.task.dao.WorkflowTaskDao; import com.norteksoft.task.entity.Task; import com.norteksoft.task.entity.WorkflowTask; import com.norteksoft.task.webservice.WorkflowTaskService; import com.norteksoft.wf.engine.core.DefinitionXmlParse; import com.norteksoft.wf.engine.entity.InstanceHistory; import com.norteksoft.wf.engine.entity.WorkflowDefinition; import com.norteksoft.wf.engine.entity.WorkflowInstance; import com.norteksoft.wf.engine.entity.WorkflowType; import com.norteksoft.wf.engine.service.DelegateMainManager; import com.norteksoft.wf.engine.service.InstanceHistoryManager; import com.norteksoft.wf.engine.service.WorkflowDefinitionManager; import com.norteksoft.wf.engine.service.WorkflowInstanceManager; import com.norteksoft.wf.engine.service.WorkflowTypeManager; //@WebService(endpointInterface = "com.norteksoft.task.webservice.WorkflowTaskService") @Service @Transactional public class WorkflowTaskManager implements WorkflowTaskService{ private Log log = LogFactory.getLog(WorkflowTaskManager.class); private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //流转历史常量 private static final String COMMA = ", "; private static final String DELTA_START = "[ "; private static final String DELTA_END = " ]"; private WorkflowTaskDao workflowTaskDao; private TaskDao taskDao; private UserManager userManager; private ProcessEngine processEngine; private DelegateMainManager delegateManager; private WorkflowDefinitionManager workflowDefinitionManager; private AcsUtils acsUtils; private InstanceHistoryManager instanceHistoryManager; @Autowired public void setInstanceHistoryManager( InstanceHistoryManager instanceHistoryManager) { this.instanceHistoryManager = instanceHistoryManager; } @Autowired public void setAcsUtils(AcsUtils acsUtils) { this.acsUtils = acsUtils; } @Autowired private WorkflowInstanceManager workflowInstanceManager; @Autowired private WorkflowTypeManager workflowTypeManager; @Autowired public void setUserManager(UserManager userManager) { this.userManager = userManager; } @Autowired public void setWorkflowTaskDao(WorkflowTaskDao workflowTaskDao) { this.workflowTaskDao = workflowTaskDao; } @Autowired public void setTaskDao(TaskDao taskDao) { this.taskDao = taskDao; } @Autowired public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; } @Autowired public void setDelegateManager(DelegateMainManager delegateManager) { this.delegateManager = delegateManager; } @Autowired public void setWorkflowDefinitionManager( WorkflowDefinitionManager workflowDefinitionManager) { this.workflowDefinitionManager = workflowDefinitionManager; } public Page<WorkflowTask> getDelegateTasks( Long companyId, String loginName, Page<WorkflowTask> page){ return workflowTaskDao.getDelegateTasks(companyId, loginName, page); } public Page<WorkflowTask> getDelegateTasksByActive( Long companyId, String loginName, Page<WorkflowTask> page, boolean isEnd){ return workflowTaskDao.getDelegateTasks(companyId, loginName, page, isEnd); } public Page<WorkflowTask> getTaskAsTrustee( Long companyId, String loginName, Page<WorkflowTask> page, boolean isEnd){ return workflowTaskDao.getTaskAsTrustee(companyId, loginName, page, isEnd); } public List<WorkflowTask> getAllTasksByInstance(Long companyId, String instanceId){ return workflowTaskDao.getAllTasksByInstance(companyId, instanceId); } public Integer getDelegateTasksNum(Long companyId, String loginName){ return workflowTaskDao.getDelegateTasksNum(companyId, loginName); } public Integer getDelegateTasksNumByActive(Long companyId, String loginName, Boolean isCompleted){ return workflowTaskDao.getDelegateTasksNum(companyId, loginName, isCompleted); } public Integer getTrusteeTasksNum(Long companyId, String loginName, Boolean isCompleted){ return workflowTaskDao.getTrusteeTasksNum(companyId, loginName, isCompleted); } /** * 流程被手动结束时,强制结束流程实例的当前任务 */ @Transactional(readOnly=false) public void endTasks(String instanceId,Long companyId){ log.debug("*** endTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = getActivityTasks(instanceId,companyId); for(WorkflowTask task:tasks){ task.setActive(TaskState.CANCELLED.getIndex()); saveTask(task); } log.debug("*** endTasks 方法结束"); } /** * 流程被强制结束时,强制结束流程实例的当前任务 */ @Transactional(readOnly=false) public void compelEndTasks(String instanceId,Long companyId){ log.debug("*** endTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = getActivityTasks(instanceId,companyId); for(WorkflowTask task:tasks){ task.setActive(TaskState.COMPLETED.getIndex()); saveTask(task); } log.debug("*** endTasks 方法结束"); } /** * 活动该流程实例的当前任务 */ public List<WorkflowTask> getActivityTasks(String instanceId,Long companyId){ log.debug("*** getActivityTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = workflowTaskDao.getActivityTasks(instanceId,companyId); log.debug("*** getActivityTasks 方法结束"); return tasks; } /** * 活动该流程实例的当前任务 */ public List<WorkflowTask> getActivitySignTasks(String instanceId,Long companyId){ log.debug("*** getActivityTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = workflowTaskDao.getActivitySignTasks(instanceId,companyId); log.debug("*** getActivityTasks 方法结束"); return tasks; } /** * 查询办理人的当前任务 * @param instanceId * @param companyId * @param loginName * @return */ public WorkflowTask getMyTask(String instanceId,Long companyId,String loginName){ log.debug("*** getMyTask 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append(", loginName:").append(loginName) .append("]").toString()); WorkflowTask task = workflowTaskDao.getMyTask(instanceId, companyId, loginName); log.debug("*** getMyTask 方法结束"); return task; } /** * 删除该流程实例中的所有任务。 * @param processInstanceId * @param companyId */ @Transactional(readOnly=false) public void deleteTaskByProcessId(String processInstanceId,Long companyId) { workflowTaskDao.deleteTaskByProcessId(processInstanceId,companyId); } /** * 保存工作流任务 * @param wfTask */ @Transactional(readOnly=false) public void saveTask(WorkflowTask wfTask){ workflowTaskDao.save(wfTask); if(wfTask.getSendingMessage() && ApiFactory.getAcsService().isRtxEnable()) { String url=null; if(StringUtils.isEmpty(wfTask.getUrl()))return; if(wfTask.getUrl().contains("?")){ url=SystemUrls.getSystemUrl(StringUtils.substringBefore(wfTask.getUrl(), "/"))+StringUtils.substring(wfTask.getUrl(), wfTask.getUrl().indexOf('/'))+wfTask.getId(); }else{ url=SystemUrls.getSystemUrl(StringUtils.substringBefore(wfTask.getUrl(), "/"))+StringUtils.substring(wfTask.getUrl(), wfTask.getUrl().indexOf('/'))+"?taskId="+wfTask.getId(); } RtxMsgSender.sendNotify(wfTask.getTransactor(), "新任务-"+wfTask.getName(), "1", "你有一个新任务:"+wfTask.getName(), url,getCompanyId()); } } public Long getCompanyId(){ return ContextUtils.getCompanyId(); } /** * 领取任务 * @param taskId */ @Transactional(readOnly=false) public String receive(String taskIds){ String[] taskIdStr = taskIds.split(","); StringBuilder sb=new StringBuilder(""); int successNum=0; int failNum=0; for(int i=0;i<taskIdStr.length;i++){ log.debug("*** receive 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("taskId:").append(taskIdStr[i]) .append("]").toString()); Long taskId = Long.parseLong(taskIdStr[i]); WorkflowTask task = workflowTaskDao.get(taskId); if(task.getActive().equals(TaskState.DRAW_WAIT.getIndex())){ List<WorkflowTask> tasks = workflowTaskDao.getNotCompleteTasksByName(getCompanyId(), task.getProcessInstanceId(), task.getName()); for(WorkflowTask tsk : tasks){ if(taskId.equals(tsk.getId())){ successNum++; task.setDrawTask(true); tsk.setActive(TaskState.WAIT_TRANSACT.getIndex());//待办理 }else{ tsk.setActive(TaskState.HAS_DRAW_OTHER.getIndex());//已领取 } } } } failNum=taskIdStr.length-successNum; log.debug("*** receive 方法结束"); sb.append("成功领取").append(successNum).append("个,"); sb.append("操作失败").append(failNum).append("个."); return sb.toString(); } /** * 放弃领取的任务 * @return */ @Transactional(readOnly=false) public String abandonReceive(Long taskId){ log.debug("*** abandonReceiveTask 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("taskId:").append(taskId) .append("]").toString()); WorkflowTask task = workflowTaskDao.get(taskId); if(task.getDrawTask()){ task.setDrawTask(false); task.setActive(TaskState.DRAW_WAIT.getIndex()); } String msg = ""; List<WorkflowTask> tasks = workflowTaskDao.getHasDrawOtherTasks(getCompanyId(), task.getProcessInstanceId(), task.getName()); for(WorkflowTask tsk : tasks){ tsk.setActive(TaskState.DRAW_WAIT.getIndex()); } msg = "task.abandon.receive.success"; log.debug("*** abandonReceiveTask 方法结束"); return msg; } /** * 指派任务给指定的人员 * @param taskId * @param transactor */ @Transactional(readOnly=false) public void assign(Long taskId, String transactor){ log.debug("*** assign 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("taskId:").append(taskId) .append(", transactor:").append(transactor) .append("]").toString()); //<s:if test="task.processingMode != '编辑式' && task.processingMode != '交办式' && task.active!=2" > WorkflowTask task = workflowTaskDao.get(taskId); //被指派人的新任务 WorkflowTask targetTask = task.clone(); //设置指派人任务已完成 task.setTaskProcessingResult(null); task.setActive(TaskState.ASSIGNED.getIndex()); task.setTransactDate(new Date()); task.setNextTasks("assign to:" + transactor); //新任务办理人 targetTask.setId(null); targetTask.setAssignable(true); //任务委托设置 WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId()); String processId= ""; if(wi!=null) processId= wi.getProcessDefinitionId(); String delegateTransactor = delegateManager.getDelegateMainName( task.getCompanyId(), transactor, processId, task.getName()); WorkflowDefinition wfDef = workflowDefinitionManager.getWorkflowDefinitionByProcessId(processId); //流程类型 WorkflowType type=null; if(wfDef!=null){//修改了流程名称或类型后需要重新赋值 targetTask.setGroupName(wfDef.getName()); targetTask.setCustomType(wfDef.getCustomType()); //流程类型 type=workflowTypeManager.getWorkflowType(wfDef.getTypeId()); if(type!=null)targetTask.setCategory(type.getName()); } if(delegateTransactor != null){ targetTask.setTrustor(transactor); targetTask.setTrustorName(ApiFactory.getAcsService().getUserByLoginName(transactor).getName()); targetTask.setTransactor(delegateTransactor); if(userManager.getUserByLoginName(delegateTransactor)!=null){ targetTask.setTransactorName(userManager.getUserByLoginName(delegateTransactor).getName()); } }else{ targetTask.setTransactor(transactor); if(userManager.getUserByLoginName(transactor)!=null){ targetTask.setTransactorName(userManager.getUserByLoginName(transactor).getName()); } } targetTask.setRead(false); List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(); tasks.add(task); tasks.add(targetTask); saveTasks(tasks); //发送消息 sendMessage(targetTask,type,"指派"); //发送邮件 sendMail(task,processId); //生成流转历史 generateAssignHistory(task,transactor,targetTask,delegateTransactor); log.debug("*** assign 方法结束"); } /** *生成流转历史 * @param task * @param transactor */ private void generateAssignHistory(WorkflowTask task, String transactor,WorkflowTask delegateTask,String trustee) { StringBuilder historyMessage = new StringBuilder(); if(StringUtils.isNotEmpty(trustee)){//生成指派和委托的流转历史 historyMessage.append(acsUtils.getUserByLoginName(delegateTask.getTrustor()).getName()) .append("已把任务委托给了") .append(delegateTask.getTransactorName()).append("。\n") .append(dateFormat.format(new Date())) .append(COMMA).append(ContextUtils.getUserName()).append("把当前任务指派给了") .append(acsUtils.getUserByLoginName(transactor).getName()).append(DELTA_START) .append(task.getName()).append(DELTA_END).append("\n"); }else{//生成指派流转历史 historyMessage.append(dateFormat.format(new Date())) .append(COMMA).append(ContextUtils.getUserName()).append("把任务指派给了") .append(acsUtils.getUserByLoginName(transactor).getName()).append(DELTA_START) .append(task.getName()).append(DELTA_END).append("\n"); } InstanceHistory history = new InstanceHistory(task.getCompanyId(), task.getProcessInstanceId(), InstanceHistory.TYPE_TASK, historyMessage.toString(), task.getName()); history.setEffective(false); history.setCreatedTime(new Date()); history.setExecutionId(task.getProcessInstanceId()); instanceHistoryManager.saveHistory(history); } /** * 消息提醒 * @param task * @param type */ private void sendMessage(WorkflowTask task,WorkflowType type,String customType){ if(StringUtils.isNotEmpty(task.getTransactor())){//子流程时Transactor为null try { if(StringUtils.isNotEmpty(customType)){ ApiFactory.getPortalService().addMessage("task", ContextUtils.getUserName(), ContextUtils.getLoginName(), task.getTransactor(),type==null?customType+":待办任务":customType+":"+type.getName(), task.getTitle(), "/task/message-task.htm?id="+task.getId()); }else{ ApiFactory.getPortalService().addMessage("task", ContextUtils.getUserName(), ContextUtils.getLoginName(), task.getTransactor(),type==null?"待办任务":type.getName(), task.getTitle(), "/task/message-task.htm?id="+task.getId()); } } catch (Exception e) { e.printStackTrace(); } } } private void sendMail(WorkflowTask task,String processId){ if(StringUtils.isNotEmpty(task.getTransactor())){//子流程时Transactor为null try{ boolean isMailNotice=DefinitionXmlParse.isMailNotice(processId, task.getName()); if(isMailNotice){ String mailContent=PropUtils.getProp("mail.properties", "task.notice.content"); if(StringUtils.isNotEmpty(mailContent)){ mailContent=mailContent.replace("${url}", getTaskUrl(task)); } com.norteksoft.product.api.entity.User user=ApiFactory.getAcsService().getUserByLoginName(task.getTransactor()); if(user==null){ throw new RuntimeException("用户不存在:"+task.getTransactor()); }else if(StringUtils.isEmpty(user.getEmail())){ throw new RuntimeException("用户邮件地址没有输入:"+task.getTransactor()); }else{ AsyncMailUtils.sendMail(user.getEmail(), task.getTitle(),mailContent ); } } }catch (Exception e) { e.printStackTrace(); log.error(PropUtils.getExceptionInfo(e)); } } } /** * 批量保存Task * @param tasks */ @Transactional(readOnly=false) public void saveTasks(List<WorkflowTask> tasks){ for(WorkflowTask task : tasks){ saveTask(task); } } public List<String> getParticipantsTransactor(Long companyId, String instanceId) { return workflowTaskDao.getParticipantsTransactor(companyId, instanceId); } /** * 查询task * @param id * @return */ public WorkflowTask getTask(Long id){ return workflowTaskDao.get(id); } /** * 查询task * @param id * @return */ public WorkflowTask getTaskById(Long id){ return workflowTaskDao.getTask(id); } /** * 删除Task * @param task */ @Transactional(readOnly=false) public void deleteTask(WorkflowTask task){ workflowTaskDao.delete(task); } /** * 根据名称删除Task * @param companyId * @param instanceId * @param taskName */ @Transactional(readOnly=false) public void deleteTasksByName(Long companyId, String instanceId, String[] taskName){ log.debug("*** deleteTasksByName 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("companyId:").append(companyId) .append(", instanceId:").append(instanceId) .append(", taskName:").append(taskName) .append("]").toString()); workflowTaskDao.deleteTasksByName(companyId, instanceId, taskName); log.debug("*** deleteTasksByName 方法结束"); } /** * 查询流程实例的第一个任务 * @param companyId * @param instanceId * @param transactor * @return */ public WorkflowTask getFirstTaskByInstance(Long companyId, String instanceId, String transactor) { return workflowTaskDao.getFirstTaskByInstance(companyId, instanceId, transactor); } /** * 根据流程名字和实例id查询workflowTask * @param instanceId * @param taskName * @return */ public List<WorkflowTask> getWorkflowTasks(String instanceId, String taskName) { return workflowTaskDao.getWorkflowTasks(instanceId, taskName); } /** * 查询流程实例所有已经生成的任务 * @param companyId * @param instanceId * @return */ public List<String> getTaskNamesByInstance(Long companyId, String instanceId){ log.debug("*** getTaskNamesByInstance 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("companyId:").append(companyId) .append(", instanceId:").append(instanceId) .append("]").toString()); List<WorkflowTask> tasks = workflowTaskDao.find("from WorkflowTask wft where wft.companyId=? and wft.processInstanceId=? and wft.specialTask=? and (wft.active=? or wft.active=? or wft.active=? or wft.active=?)", companyId, instanceId, false,TaskState.WAIT_TRANSACT.getIndex(), TaskState.WAIT_DESIGNATE_TRANSACTOR.getIndex(),TaskState.DRAW_WAIT.getIndex(),TaskState.WAIT_CHOICE_TACHE.getIndex()); List<String> result = new ArrayList<String>(); for(WorkflowTask task : tasks){ if(!result.contains(task.getName())){ result.add(task.getName()); } } log.debug("*** getTaskNamesByInstance 方法结束"); return result; } /** * 查询所有任务 * @return */ public List<Task> getAllTasks(){ return taskDao.getAll(); } public List<WorkflowTask> getTasksByActivity(Long companyId, String executionId, String taskName){ return taskDao.find("from WorkflowTask wft where wft.companyId=? and wft.executionId=? and wft.name=? and wft.active = 0 and wft.distributable=0", companyId, executionId, taskName); } /** * 查询用户所有未完成任务(不是分页) * @param page */ public List<WorkflowTask> getAllTasksByUser(Long companyId, String loginName){ return taskDao.find("from Task t where t.companyId = ? and t.transactor = ? and t.visible = true and (t.active=? or t.active=? or t.active=? or t.active=?) order by t.groupName,t.createdTime desc", companyId, loginName,TaskState.DRAW_WAIT.getIndex(), TaskState.WAIT_TRANSACT.getIndex(), TaskState.WAIT_DESIGNATE_TRANSACTOR.getIndex(),TaskState.WAIT_CHOICE_TACHE.getIndex()); } /** * 分页查询用户已完成任务 * @param companyId * @param loginName * @param page */ public void getReadTasksByUser(Long companyId, String loginName, Page<WorkflowTask> page) { workflowTaskDao.getReadTasksByUser(companyId,loginName,page); } /** * 分页查询用户已完成任务 * @param companyId * @param loginName * @param page */ public void getCompletedTasksByUser(Long companyId, String loginName, Page<WorkflowTask> page) { workflowTaskDao.getCompletedTasksByUser(companyId, loginName, page); } /** * 根据任务名称查询任务 * @param instanceId * @param name * @return */ public List<WorkflowTask> getTasksByName(Long companyId, String instanceId, String name){ return workflowTaskDao.getTasksByName(companyId, instanceId, name); } /** * 根据任务名称查询任务,不含指派 * @param instanceId * @param name * @return */ public List<WorkflowTask> getNoAssignTasksByName(Long companyId, String instanceId, String taskName,Integer groupNum) { return workflowTaskDao.getNoAssignTasksByName(companyId, instanceId, taskName,groupNum); } /** * 根据办理人查询办理人未完成任务 * @param companyId * @param stransactor * @return */ public List<Task> getTasksByTransactor(Long companyId, String stransactor){ return null; } /** * 返回对应办理模式的所有环节 * @param processInstanceId * @param processingMode * @return */ public List<String> getCountersignByProcessInstanceId(String processInstanceId,TaskProcessingMode processingMode){ return workflowTaskDao.getCountersignByProcessInstanceId(processInstanceId, processingMode); } /** * 自定义流程中取会签环节名称 */ public List<String> getSignByProcessInstanceId(String processInstanceId,TaskProcessingMode processingMode){ return workflowTaskDao.getSignByProcessInstanceId(processInstanceId, processingMode); } /** * 根据办理结果查询环节 */ public List<WorkflowTask> getCountersignByProcessInstanceIdResult(String processInstanceId,String taskName,TaskProcessingResult result){ return workflowTaskDao.getCountersignByProcessInstanceIdResult(processInstanceId, taskName, result); } /** * 获得审批任务组数 * @param processInstanceId * @param taskName * @param result * @return */ public List<Integer> getGroupNumByTaskName(String processInstanceId,String taskName){ return workflowTaskDao.getGroupNumByTaskName(processInstanceId, taskName); } @Transactional(readOnly=false) public void deleteWorkflowTask(List<Long> ids) { for(Long id:ids){ workflowTaskDao.delete(id); } } public List<WorkflowTask> getCountersigns(Long id) { WorkflowTask wt = workflowTaskDao.get(id); return workflowTaskDao.getCountersigns(wt.getProcessInstanceId(), wt.getName()); } public List<WorkflowTask> getProcessCountersigns(Long id) { WorkflowTask wt = workflowTaskDao.get(id); return workflowTaskDao.getCountersigns(id,wt.getProcessInstanceId(), wt.getName()); } public List<String> getCountersignsHandler(Long id,Integer handlingState){ WorkflowTask wt = workflowTaskDao.get(id); if(wt==null){throw new RuntimeException("获得会签环节的会签办理人时任务不能为null");} return workflowTaskDao.getCountersignsHandler(wt.getProcessInstanceId(), wt.getName(),handlingState); } @Transactional(readOnly=false) public void deleteCountersignHandler(Long taskId, Collection<String> users) { WorkflowTask wt = workflowTaskDao.get(taskId); if(wt==null){throw new RuntimeException("减签时任务不能为null");} workflowTaskDao.deleteCountersignHandler(wt.getProcessInstanceId(), wt.getName(),users); //生成减签流转历史 generateRemoveSingerHistory(wt,users); } /** * 生成减签流转历史 * @param task * @param transactor */ private void generateRemoveSingerHistory(WorkflowTask task, Collection<String> historyTransactors) { StringBuilder historyMessage = new StringBuilder(); historyMessage.append(dateFormat.format(new Date())) .append(COMMA).append(ContextUtils.getUserName()).append("给:") .append(getTansactorNamesByLoginName(historyTransactors)).append("减签。") .append(DELTA_START) .append(task.getName()).append(DELTA_END).append("\n"); InstanceHistory history = new InstanceHistory(task.getCompanyId(), task.getProcessInstanceId(), InstanceHistory.TYPE_TASK, historyMessage.toString(), task.getName()); history.setEffective(false); history.setCreatedTime(new Date()); history.setExecutionId(task.getProcessInstanceId()); instanceHistoryManager.saveHistory(history); } private String getTansactorNamesByLoginName(Collection<String> historyTransactors) { String result = ""; for(String name : historyTransactors ){ result+=acsUtils.getUserByLoginName(name).getName()+","; } return StringUtils.isEmpty(result)?"":result.substring(0,result.length()-1); } public Set<String> getHandledTransactors(String workflowId) { return new HashSet<String>(workflowTaskDao.getHandledTransactors(workflowId)); } public Set<String> getAllHandleTransactors(String workflowId) { return new HashSet<String>(workflowTaskDao.getAllHandleTransactors(workflowId)); } /** * 得到所有需要催办的task */ public List<WorkflowTask> getNeedReminderTasks(){ return workflowTaskDao.getNeedReminderTasks(); } /** * 获得 已完成的任务 */ public List<WorkflowTask> getCompletedTasks(String workflowId, Long companyId) { return workflowTaskDao.getCompletedTasks( workflowId, companyId); } /** * 查询任务 * @param tasks * @param names * @param values */ public void searchTask(Page<Task> tasks, List<String> names, List<String> values, String finish){ if(Boolean.valueOf(finish)){ taskDao.findFinishTaskForPage(tasks, names, values); }else{ taskDao.findUNFinishTaskForPage(tasks, names, values); } } public List<WorkflowTask> getNeedReminderTasks(String loginName, Long companyId) { return workflowTaskDao.getNeedReminderTasks(loginName,companyId); } public List<WorkflowTask> getTasksOrderByWdfName(String definitionName, String loginName) { return workflowTaskDao.getTasksOrderByWdfName(definitionName, loginName); } public List<WorkflowTask> getCompletedTasksByTaskName(String workflowId, Long companyId,String taskName){ return workflowTaskDao.getCompletedTasksByTaskName(workflowId,companyId,taskName); } /** * 根据当前用户查询未完成任务总数 * @param companyId 公司id * @param loginName 当前用户登录名 * @return 未完成任务总数 */ public Integer getTasksNumByTransactor(Long companyId, String loginName){ return workflowTaskDao.getNotCompleteTasksNumByTransactor(companyId, loginName); } /** * 查找公司中所有的超期任务 * @param companyId * @return */ public List<WorkflowTask> getOverdueTasks(Long companyId) { return workflowTaskDao.getOverdueTasks(companyId); } /** * 查找当前办理人所有的超期任务的总数 * @param companyId * @param transactorName * @return */ public Map<String,Integer> getOverdueTasksNumByTransactor(Long companyId) { List<WorkflowTask> list=workflowTaskDao.getOverdueTasks(companyId); Map<String,Integer> map=new HashMap<String,Integer>(); for(WorkflowTask task:list){ map.put(task.getTransactor(), workflowTaskDao.getOverdueTasksNumByTransactor(companyId, task.getTransactor())); } return map; } /** * 查找公司中所有的超期任务,包括已完成的任务 * @param companyId * @return */ public List<WorkflowTask> getTotalOverdueTasks(Long companyId) { return workflowTaskDao.getTotalOverdueTasks(companyId); } /** * 查找当前办理人所有的超期任务的总数,包括已完成的任务 * @param companyId * @param transactorName * @return */ public Map<String,Integer> getTotalOverdueTasksNumByTransactor(Long companyId) { List<WorkflowTask> list=workflowTaskDao.getTotalOverdueTasks(companyId); Map<String,Integer> map=new HashMap<String,Integer>(); for(WorkflowTask task:list){ map.put(task.getTransactor(), workflowTaskDao.getTotalOverdueTasksNumByTransactor(companyId, task.getTransactor())); } return map; } public List<String> getTransactorsExceptTask(Long taskId) { if(taskId==null)return null; WorkflowTask task=getTask(taskId); return workflowTaskDao.getTransactorsExceptTask(task); } /** * 根据“任务组”查询任务列表 * @param companyId * @param instanceId * @param taskName * @return */ public List<WorkflowTask> getTaskOrderByGroupNum(Long companyId,String instanceId,String taskName){ return workflowTaskDao.getTaskOrderByGroupNum(companyId,instanceId,taskName); } public List<WorkflowTask> getActivityTasksByName(String instanceId,Long companyId,String taskName) { return workflowTaskDao.getActivityTasksByName(instanceId, companyId, taskName); } public List<String[]> getActivityTaskTransactors(String instanceId,Long companyId) { return workflowTaskDao.getActivityTaskTransactors(instanceId,companyId); } public List<String> getActivityTaskPrincipals(String instanceId,Long companyId) { return workflowTaskDao.getActivityTaskPrincipals(instanceId,companyId); } public List<String[]> getActivityTaskPrincipalsDetail(String instanceId,Long companyId) { return workflowTaskDao.getActivityTaskPrincipalsDetail(instanceId,companyId); } public List<String> getCompletedTaskNames(String workflowId, Long companyId) { return workflowTaskDao.getCompletedTaskNames(workflowId, companyId); } public String receive(Long taskId) { log.debug("*** receive 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("taskId:").append(taskId) .append("]").toString()); if(taskId==null){log.debug("领取任务时,任务id不能为null");throw new RuntimeException("领取任务时,任务id不能为null");} WorkflowTask task = workflowTaskDao.get(taskId); if(task==null){log.debug("领取任务时,任务不能为null");throw new RuntimeException("领取任务时,任务不能为null");} String msg = "task.not.need.receive"; if(task.getActive().equals(TaskState.DRAW_WAIT.getIndex())){ List<WorkflowTask> tasks = workflowTaskDao.getNotCompleteTasksByName(getCompanyId(), task.getProcessInstanceId(), task.getName()); for(WorkflowTask tsk : tasks){ if(taskId.equals(tsk.getId())){ task.setDrawTask(true); tsk.setActive(TaskState.WAIT_TRANSACT.getIndex()); }else{ tsk.setActive(TaskState.HAS_DRAW_OTHER.getIndex()); } } msg = "task.receive.success"; } log.debug("*** receive 方法结束"); return msg; } /** * 流程被暂停时,强制暂停的当前任务 */ @Transactional(readOnly=false) public void pauseTasks(String instanceId,Long companyId){ log.debug("*** pauseTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = getActivityTasks(instanceId,companyId); for(WorkflowTask task:tasks){ task.setPaused(true); saveTask(task); } log.debug("*** pauseTasks 方法结束"); } /** * 流程被暂停时,强制暂停的当前任务 */ @Transactional(readOnly=false) public void continueTasks(String instanceId,Long companyId){ log.debug("*** continueTasks 方法开始"); log.debug(new StringBuilder("*** Received parameter:[") .append("instanceId:").append(instanceId) .append(", companyId:").append(companyId) .append("]").toString()); List<WorkflowTask> tasks = workflowTaskDao.getPauseTasksByInstance(instanceId,companyId); for(WorkflowTask task:tasks){ task.setPaused(false); saveTask(task); String processId= processEngine.getExecutionService().findProcessInstanceById(task.getProcessInstanceId()).getProcessDefinitionId(); WorkflowDefinition wfDef = workflowDefinitionManager.getWorkflowDefinitionByProcessId(processId); //流程类型 WorkflowType type=null; if(wfDef!=null){ //流程类型 type=workflowTypeManager.getWorkflowType(wfDef.getTypeId()); } //生成消息提醒 if(task.getTransactor()!=null){ sendMessage(task, type,""); } //*******************邮件通知************************* sendMail(task,processId); } log.debug("*** continueTasks 方法结束"); } /** * 批量移除任务中根据办理人查询当前任务列表 * @param tasks * @param transactorName * @param typeId * @param defCode * @param wfdId */ public void getActivityTasksByTransactorName(Page<WorkflowTask> tasks,Long typeId, String defCode,Long wfdId){ workflowTaskDao.getActivityTasksByTransactorName(tasks, typeId, defCode, wfdId); } public void getAllTasksByUser(Long companyId, String loginName, Page<WorkflowTask> page) { workflowTaskDao.getAllTasksByUser(companyId, loginName, page); } public List<WorkflowTask> getTasksByInstance(List<String> instanceIds,String taskName,String recieveUser,String consignor,Long companyId){ return workflowTaskDao.getTasksByInstance(instanceIds, taskName,recieveUser,consignor,companyId); } public List<String> getActiveTaskNameWithoutSpecial(String instanceId){ return workflowTaskDao.getActiveTaskNameWithoutSpecial(instanceId); } /** * 获得所有流程名称 * @param isComplete * @return */ public List<Object[]> getGroupNames(String taskCategory){ if(TaskCategory.COMPLETE.equals(taskCategory)){ return workflowTaskDao.getAllCompleteTaskGroupNames(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); }else if(TaskCategory.CANCEL.equals(taskCategory)){ return workflowTaskDao.getAllCancelTaskGroupNames(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); }else{ return workflowTaskDao.getAllActiveTaskGroupNames(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); } } /** * 获得所有流程自定义类别 * @param isComplete * @return */ public List<Object[]> getCustomTypes(String taskCategory){ if(TaskCategory.COMPLETE.equals(taskCategory)){ return workflowTaskDao.getAllCompleteTaskCustomTypes(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); }else if(TaskCategory.CANCEL.equals(taskCategory)){ return workflowTaskDao.getAllCancelTaskCustomTypes(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); }else{ return workflowTaskDao.getAllActiveTaskCustomTypes(ContextUtils.getCompanyId(), ContextUtils.getLoginName()); } } /** * 分页查询用户所有未完成任务 * @param page */ public void getAllTasksByGroupName(Long companyId, String loginName, Page<Task> page,String typeName){ taskDao.getAllTasksByUserType(companyId, loginName, page,typeName); } /** * 获得办理任务页面 */ @Transactional(readOnly=true) public String getTaskUrl(Task task){ String url=task.getUrl(); if(!task.getUrl().contains("http://")&&task.getUrl().contains("?")){ url=SystemUrls.getSystemUrl(StringUtils.substringBefore(task.getUrl(), "/"))+StringUtils.substring(task.getUrl(), task.getUrl().indexOf('/'))+task.getId(); }else if(!task.getUrl().contains("http://")){ url=SystemUrls.getSystemUrl(StringUtils.substringBefore(task.getUrl(), "/"))+StringUtils.substring(task.getUrl(), task.getUrl().indexOf('/'))+"?taskId="+task.getId(); } //重新加载页面样式 if(!url.contains("_r=1")){ if(url.contains("?")){ url=url+"&_r=1"; }else{ url=url+"?_r=1"; } } return url; } public WorkflowTask getLastCompletedTaskByTaskName(String workflowId, Long companyId,String taskName){ return workflowTaskDao.getLastCompletedTaskByTaskName(workflowId,companyId,taskName); } public List<WorkflowTask> getActivityTasksByNameWithout(String workflowId, Long taskId, String taskName) { return workflowTaskDao.getActivityTasksByNameWithout(workflowId, taskId, taskName); } /** * 根据办理人查找待办理的委托任务 * @param workflowId * @param transactor * @return */ public List<WorkflowTask> getActivityTrustorTasksByTransactor(String workflowId,String transactor,Long taskId) { return workflowTaskDao.getActivityTrustorTasksByTransactor(workflowId, transactor,taskId); } }