package com.norteksoft.product.web.wf; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.Document; import com.norteksoft.product.api.entity.Opinion; import com.norteksoft.product.api.entity.TaskPermission; import com.norteksoft.product.api.entity.WorkflowAttachment; import com.norteksoft.task.base.enumeration.TaskProcessingResult; import com.norteksoft.product.api.entity.WorkflowTask; import com.norteksoft.wf.base.enumeration.CompleteTaskTipType; import com.norteksoft.wf.base.exception.NotFoundEnabledWorkflowDefinitionException; import com.norteksoft.wf.engine.client.FormFlowable; /** * 工作流manager基类 * @author qiao * @param <T> */ @Transactional public abstract class WorkflowManagerSupport<T extends FormFlowable> { /** * 保存并初始化流程 * @param definitionCode 流程编号 * @param t */ public void saveInstance(String definitionCode, T t) { saveEntity(t); ApiFactory.getInstanceService().startInstance(definitionCode, t); } /** * 保存并初始化流程 * @param definitionCode 流程编号 * @param definitionVersion 版本号 * @param t */ public void saveInstance(String definitionCode,Integer definitionVersion, T t) { saveEntity(t); ApiFactory.getInstanceService().startInstance(definitionCode, definitionVersion, t); } /** * 保存并初始化流程 * @param definitionId 流程定义id * @param t */ public void saveInstance(Long definitionId, T t) { saveEntity(t); ApiFactory.getInstanceService().startInstance(definitionId, t); } /** * 第一次提交流程 * @param opinion * @param definitionCode * @param definitionVersion * @param t */ public CompleteTaskTipType submitProcess(String opinion,String definitionCode,Integer definitionVersion, T t) { saveEntity(t); CompleteTaskTipType type = ApiFactory.getInstanceService().submitInstance(definitionCode, definitionVersion, t); //保存意见 Long taskId= t.getWorkflowInfo().getFirstTaskId(); saveOpinion(taskId,opinion); return type; } /** * 第一次提交流程 * @param expenseReport * @param opinion * @param workFlowCode */ public CompleteTaskTipType submitProcess(T t,String opinion,String workFlowCode) { saveEntity(t); CompleteTaskTipType type = ApiFactory.getInstanceService().submitInstance(workFlowCode, t); //保存意见 Long taskId= t.getWorkflowInfo().getFirstTaskId(); saveOpinion(taskId,opinion); return type; } /** * 第一次提交流程 * @param t * @param opinion * @param definitionId */ public CompleteTaskTipType submitProcess(T t,String opinion,Long definitionId) { saveEntity(t); CompleteTaskTipType type = ApiFactory.getInstanceService().submitInstance(definitionId, t); //保存意见 Long taskId= t.getWorkflowInfo().getFirstTaskId(); saveOpinion(taskId,opinion); return type; } /** * 办理任务 * @param expenseReport * @param taskId * @param taskTransact * @return */ public CompleteTaskTipType completeTask(T t, Long taskId,TaskProcessingResult result) { saveEntity(t); CompleteTaskTipType type= ApiFactory.getTaskService().completeWorkflowTask(taskId,result); return type; } /** * 完成任务 * @param taskId * @param lists * @param opinion */ public CompleteTaskTipType distributeTask(Long taskId, List<String> lists, String opinion) { saveOpinion(taskId,opinion); return ApiFactory.getTaskService().completeInteractiveWorkflowTask(taskId, lists, null); } /** * 完成任务 * @param taskId * @param transitionName */ public CompleteTaskTipType distributeTask(Long taskId, String transitionName,String opinion) { saveOpinion(taskId,opinion); return ApiFactory.getTaskService().selectActivity(taskId, transitionName); } /** * 保存意见 * @param taskId * @param opinion */ public void saveOpinion(Long taskId, String opinion) { if(StringUtils.isNotEmpty(opinion)){ Opinion ap=new Opinion(opinion, new Date(), taskId, ""); ApiFactory.getOpinionService().saveOpinion(ap); } } /** * 根据taskId获取所有字段权限 * @param taskId * @param workFlowCode * @return */ public String getFieldPermissionByTaskId(Long taskId) { WorkflowTask task = ApiFactory.getTaskService().getTask(taskId); if (isTaskCompleted(task)) { return ApiFactory.getFormService().getFieldPermission(false); } else { return ApiFactory.getFormService().getFieldPermission(taskId); } } /** * 获得任务是否已完成,已取消,已指派,他人已领取状态 * * @param task * @return */ private boolean isTaskCompleted(WorkflowTask task) { return task.getActive().equals(2) || task.getActive().equals(3) || task.getActive().equals(5) || task.getActive().equals(7); } /** * 获取所有字段权限 * @param workFlowCode * @param definitionVersion * @return */ public String getFieldPermissionByCodeAndVersion(String workFlowCode,Integer definitionVersion) { com.norteksoft.product.api.entity.WorkflowDefinition definition = ApiFactory.getDefinitionService().getWorkflowDefinitionByCodeAndVersion(workFlowCode,definitionVersion); if(definition==null) throw new NotFoundEnabledWorkflowDefinitionException("not found started workflowDefinition by workFlowCode,definitionVersion:"+workFlowCode+","+definitionVersion); Long processId = ApiFactory.getDefinitionService().getWorkflowDefinitionByCodeAndVersion(workFlowCode, definitionVersion).getId(); return ApiFactory.getFormService().getFieldPermissionNotStarted(processId); } /** * 获取所有字段权限 * @param workflowDefinitionId * @return */ public String getFieldPermission(Long workflowDefinitionId) { com.norteksoft.product.api.entity.WorkflowDefinition definition = ApiFactory.getDefinitionService().getWorkflowDefinition(workflowDefinitionId); if(definition==null) throw new NotFoundEnabledWorkflowDefinitionException("not found started workflowDefinition by workflowDefinitionId:"+workflowDefinitionId); Long processId = ApiFactory.getDefinitionService().getWorkflowDefinition(workflowDefinitionId).getId(); return ApiFactory.getFormService().getFieldPermissionNotStarted(processId); } /** * 获取所有字段权限,没有流程版本是,默认取流程最高版本的权限 * @param defCode 流程编号 * @return */ public String getFieldPermission(String defCode) { List<com.norteksoft.product.api.entity.WorkflowDefinition> definitions = ApiFactory.getDefinitionService().getWorkflowDefinitionsByCode(defCode); if(definitions.size()<1) throw new NotFoundEnabledWorkflowDefinitionException("not found started workflowDefinition by code:"+defCode); Long processId = ApiFactory.getDefinitionService().getWorkflowDefinitionsByCode(defCode).get(0).getId(); return ApiFactory.getFormService().getFieldPermissionNotStarted(processId); } /** * 办理人正文的所有权限 * @return */ public String getDocumentRight(Long taskId){ if(taskId!=null){ return ApiFactory.getPermissionService().getDocumentPermission(taskId); } return null; } /** * 根据流程定义编号取任务的权限 * @param definitionCode * @return */ public TaskPermission getActivityPermission(String definitionCode){ return ApiFactory.getPermissionService().getActivityPermission(definitionCode); } /** * 根据流程定义编号取任务的权限 * @param definitionCode * @param definitionVersion * @return */ public TaskPermission getActivityPermission(String definitionCode,Integer definitionVersion){ return ApiFactory.getPermissionService().getActivityPermission(definitionCode, definitionVersion); } /** * 根据流程定义编号取任务的权限 * @param definitionCode * @param definitionVersion * @return */ public TaskPermission getActivityPermission(Long taskId){ return ApiFactory.getPermissionService().getActivityPermission(taskId); } /** * 根据实体和版本号自动填写实体字段(流程发起前) * @param t * @param wfDefinationCode * @param version */ public void fillEntityByDefinition(T t,String wfDefinationCode,Integer version){ ApiFactory.getFormService().fillEntityByDefinition(t, wfDefinationCode, version); } /** * 根据实体和taskId自动填写实体字段(办理任务页面) * @param t * @param taskId */ public void fillEntityByDefinition(T t,Long taskId){ ApiFactory.getFormService().fillEntityByTask(t, taskId); } /** * 根据taskID取实体 * @param taskId * @return */ public T getEntityByTaskId(Long taskId) { if(taskId==null)return null; return getEntity(ApiFactory.getFormService().getFormFlowableIdByTask(taskId)); } /** * 取回任务 * @param taskId */ public String retrieve(Long taskId){ return ApiFactory.getTaskService().retrieve(taskId); } /** * 获得loginName用户的该实例的当前任务 * * @param taskId * @return */ public WorkflowTask getMyTask(T t, String loginName) { return ApiFactory.getTaskService().getActiveTaskByLoginName(t, loginName); } /** * 加签 * @param taskId * @param lists */ public void addSigner(Long taskId,List<String> lists){ ApiFactory.getTaskService().addSigner(taskId,lists); } /** * 减签 * @param taskId * @param lists */ public void removeSigner(Long taskId, List<String> lists) { ApiFactory.getTaskService().removeSigner(taskId,lists); } /** * 获得任务 * @param taskId * @return */ public WorkflowTask getWorkflowTask(Long taskId) { return ApiFactory.getTaskService().getTask(taskId); } /** * 得到当前环节办理人 * @param expenseReport * @return */ public List<String[]> getActivityTaskTransactors(T t) { return ApiFactory.getTaskService().getActivityTaskTransactors(t); } /** * 领取任务 * @param taskId * @return task.not.need.receive(不需要领取,可能已被他人领取) * task.receive.success(领取成功) */ public String drawTask(Long taskId) { return ApiFactory.getTaskService().drawTask(taskId); } /** * * @param taskId * @return task.abandon.receive.success(放弃领取成功) */ public String abandonReceive(Long taskId){ return ApiFactory.getTaskService().abandonReceive(taskId); } /** * 指派任务 * @param taskId * @param assignee 制定人员 */ public void assign(Long taskId,String assignee) { ApiFactory.getTaskService().assign(taskId,assignee); } /** * 抄送任务 * @param taskId * @param transactors * @param title * @param url */ public void createCopyTasks(Long taskId,List<String> transactors,String title,String url) { ApiFactory.getTaskService().createCopyTasks(taskId, transactors, title, url); } /** * 当前任务是否是第一环节 * @param taskId * @return */ public boolean isFirstTask(Long taskId){ return ApiFactory.getTaskService().isFirstTask(taskId); } /** * 根据taskId取当前环节正文列表 * @param taskId * @return */ public List<Document> getDocumentList(Long taskId){ return ApiFactory.getDocumentService().getDocuments(taskId); } /** * 获得整个实例正文列表 * @param t * @return */ public List<Document> getDocumentList(T t){ return ApiFactory.getDocumentService().getDocuments(t); } /** * 保存正文 * @param document * @return */ public void saveDocument(Document document){ ApiFactory.getDocumentService().saveDocument(document); } /** * 保存正文 * @param document * @return */ public void saveDocument(Document document,T t){ ApiFactory.getDocumentService().saveDocument(document, t); } /** * 删除正文 * @param documentId * @return */ public void deleteDocument(Long documentId){ ApiFactory.getDocumentService().deleteDocument(documentId); } /** * 根据taskId取当前环节附件列表 * @param taskId * @return */ public List<WorkflowAttachment> getAttachmentList(Long taskId){ return ApiFactory.getAttachmentService().getAttachments(taskId); } /** * 获得整个实例附件列表 * @param t * @return */ public List<WorkflowAttachment> getAttachmentList(T t){ return ApiFactory.getAttachmentService().getAttachments(t); } /** * 保存附件 * @param attachment * @return */ public void saveAttachment(WorkflowAttachment attachment){ ApiFactory.getAttachmentService().saveAttachment(attachment); } /** * 保存附件 * @param attachment * @param t */ public void saveAttachment(WorkflowAttachment attachment,T t){ ApiFactory.getAttachmentService().saveAttachment(attachment, t); } /** * 删除附件 * @param attachmentId * @return */ public void deleteAttachment(Long attachmentId){ ApiFactory.getAttachmentService().deleteAttachment(attachmentId); } public String getCompleteTaskTipType( CompleteTaskTipType completeTaskTipType, T t) { switch (completeTaskTipType) { case MESSAGE: return t.getId().toString()+";"+completeTaskTipType.getContent(); case RETURN_URL: return t.getId().toString()+";"+completeTaskTipType.getContent(); case TACHE_CHOICE_URL: return t.getId().toString()+";"+completeTaskTipType.getCanChoiceTaches()+";"+"selectTache"; case SINGLE_TRANSACTOR_CHOICE: return t.getId().toString()+";"+completeTaskTipType.getCanChoiceTransactor()+";"+"selectTransactor"; default: return t.getId().toString(); } } protected abstract void saveEntity(T t); protected abstract T getEntity(Long entityId); }