package com.norteksoft.wf.engine.service; import java.util.ArrayList; import java.util.Collection; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import com.norteksoft.mms.form.entity.FormView; import com.norteksoft.mms.form.service.FormViewManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.TaskPermission; import com.norteksoft.product.api.entity.User; import com.norteksoft.product.api.entity.WorkflowInstance; import com.norteksoft.product.api.impl.WorkflowClientManager; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.task.base.enumeration.TaskState; import com.norteksoft.product.api.entity.WorkflowTask; import com.norteksoft.wf.engine.core.ConditionParseUtil; import com.norteksoft.wf.engine.core.DefinitionXmlParse; import com.norteksoft.wf.engine.core.impl.UserParseCalculator; import com.norteksoft.wf.engine.entity.WorkflowDefinition; /** * 管理流程权限 * @author Administrator * */ @Service @Transactional public class WorkflowRightsManager { private Log log = LogFactory.getLog(WorkflowClientManager.class); private FormViewManager formViewManager; private WorkflowDefinitionManager workflowDefinitionManager; private TaskService taskService; private DelegateMainManager delegateManager; @Autowired public void setTaskService(TaskService taskService) { this.taskService = taskService; } @Autowired public void setWorkflowDefinitionManager( WorkflowDefinitionManager workflowDefinitionManager) { this.workflowDefinitionManager = workflowDefinitionManager; } @Autowired public void setFormViewManager(FormViewManager formManager) { this.formViewManager = formManager; } @Autowired public void setDelegateManager(DelegateMainManager delegateManager) { this.delegateManager = delegateManager; } /** * 根据流程名称查询第一环节的字段编辑权限,以JSON格式返回 * @param processName * @return */ public String getFieldPermissionNotStarted(WorkflowDefinition definition){ Assert.notNull(definition, "WorkflowDefinition实体不能为null"); String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); boolean editable = DefinitionXmlParse.haveEditRight(definition.getProcessId(), firstTaskName); StringBuilder builder = new StringBuilder("["); if(editable){ getFieldList(builder,DefinitionXmlParse.getRequiredFields(definition.getProcessId(),firstTaskName).keySet(),Boolean.TRUE); getFieldList(builder,DefinitionXmlParse.getNonEditableFields(definition.getProcessId(), firstTaskName).keySet(),Boolean.FALSE); } return org.apache.commons.lang.StringUtils.removeEnd(builder.toString(), ",")+"]"; } private void getFieldList(StringBuilder builder,Collection<String> collections,boolean request){ for(String str:collections){ formateFields(builder,str,request); builder.append(","); } } private void formateFields(StringBuilder builder,String fieldKey,boolean request){ String[] strs = fieldKey.split(":"); if(strs.length==1){//兼容bkyoa历史版本 builder.append( "{request:\"").append(request) .append("\",readonly:\"").append((!request)) .append("\",id:\"").append(strs[0]) .append("\",datatype:\"") .append("TEXT") .append("\",controlType:\"") .append("TEXT") .append("\",formatType:\"null\"}"); }else if(strs.length==2){//兼容bkyoa历史版本 builder.append( "{request:\"").append(request) .append("\",readonly:\"").append((!request)) .append("\",id:\"").append(strs[0]) .append("\",datatype:\""); if(StringUtils.isEmpty(strs[1])){//默认是文本类型 builder.append("TEXT"); }else{ builder.append(strs[1]); } builder.append("\",controlType:\"") .append("TEXT") .append("\",formatType:\"null\"}"); }else if(strs.length==3){//兼容bkyoa历史版本 builder.append( "{request:\"").append(request) .append("\",readonly:\"").append((!request)) .append("\",id:\"").append(strs[0]) .append("\",datatype:\""); if(StringUtils.isEmpty(strs[1])){//默认是文本类型 builder.append("TEXT"); }else{ builder.append(strs[1]); } builder.append("\",controlType:\""); if(StringUtils.isEmpty(strs[2])){//默认是文本框 builder.append("TEXT"); }else{ builder.append(strs[2]); } builder.append("\",formatType:\"null\"}"); }else if(strs.length>=4){//新版本中 builder.append( "{request:\"").append(request) .append("\",readonly:\"").append((!request)) .append("\",id:\"").append(strs[0]) .append("\",datatype:\""); if(StringUtils.isEmpty(strs[1])){//默认是文本类型 builder.append("TEXT"); }else{ builder.append(strs[1]); } builder.append("\",controlType:\""); if(StringUtils.isEmpty(strs[2])){//默认是文本框 builder.append("TEXT"); }else{ builder.append(strs[2]); } builder.append("\",name:\""); builder.append(strs[3]); builder.append("\",formatType:\"null"); if(strs.length>4){ builder.append("\",customType:\""); builder.append(strs[4]); builder.append("\",format:\""); builder.append(strs[5]); } builder.append("\"}"); } } public Collection<String> getforbiddenFieldsNotStarted(WorkflowDefinition definition){ Assert.notNull(definition, "WorkflowDefinition实体不能为null"); String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); boolean editable = DefinitionXmlParse.haveEditRight(definition.getProcessId(), firstTaskName); if(editable){ return getFieldLists(DefinitionXmlParse.getNonEditableFields(definition.getProcessId(), firstTaskName).keySet()); }else{ return new ArrayList<String>(); } } /* * 将静止填写字段中类型标识去掉 */ private Collection<String> getFieldLists(Collection<String> keys){ Collection<String> set = new HashSet<String>(); for(String key:keys){ set.add(key.split(":")[0].trim()); } return set; } public Collection<String> getNeedFillFieldsNotStarted(WorkflowDefinition definition){ Assert.notNull(definition, "WorkflowDefinition实体不能为null"); String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); boolean editable = DefinitionXmlParse.haveEditRight(definition.getProcessId(), firstTaskName); if(editable){ return getFieldLists(DefinitionXmlParse.getRequiredFields(definition.getProcessId(),firstTaskName).keySet()); }else{ return new ArrayList<String>(); } } /** * 获得该环节对字段的编辑权限 * @param instance * @param taskName * @return json表示的可编辑字段和不可编辑字段 */ public String getFieldPermission(com.norteksoft.product.api.entity.WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); boolean editable = DefinitionXmlParse.haveEditRight(instance.getProcessDefinitionId(), task.getName()); StringBuilder builder = new StringBuilder("["); if(editable){ getRequiredFields(builder,task,Boolean.TRUE); getRequiredFields(builder,task,Boolean.FALSE); }else{ builder.append( "{request:\"").append(editable) .append("\",readonly:\"").append((!editable)) .append("\",controlType:\"allReadolny\"}"); } return org.apache.commons.lang.StringUtils.removeEnd(builder.toString(), ",")+"]"; } public List<String> getforbiddenFields( WorkflowTask task){ Assert.notNull(task, "WorkflowTask实体不能为null"); WorkflowInstance instance =ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(instance==null){ log.debug("WorkflowInstance实体不能为null"); throw new RuntimeException("WorkflowInstance实体不能为null"); } boolean editable = DefinitionXmlParse.haveEditRight(instance.getProcessDefinitionId(), task.getName()); if(editable){ return getNonEditableFieldsNoType(task); }else{ return new ArrayList<String>(); } } public List<String> getNeedFillFields(WorkflowTask task){ WorkflowInstance instance =ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); boolean editable = DefinitionXmlParse.haveEditRight(instance.getProcessDefinitionId(), task.getName()); if(editable){ return getRequiredFieldsNotType(task); }else{ return new ArrayList<String>(); } } /** * 所有字段可编辑状态信息查询 * @param editable 当editable为false时 表示所有字段都禁止填写 * @return 返回json格式表示的字段可编辑状态信息 */ public String getFieldPermission(boolean editable){ return new StringBuilder("[").append( "{request:\"").append(editable) .append("\",readonly:\"").append((!editable)) .append("\",controlType:\"allReadolny\"}]").toString(); } /** * 表单打印权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限打印,否则为没有权限 */ public boolean printFormRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getPrintFormRight(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } public boolean formPrintRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getPrintFormRight(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } /** * 流转历史查看权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限打印,否则为没有权限 */ public boolean viewFlowHistoryRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(viewFlowHistoryRightInProcess(instance)) return true; String[] rightSetting = DefinitionXmlParse.getViewFlowHistoryRight(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } public boolean viewFlowHistoryRightInProcess(WorkflowInstance instance){ String condition = DefinitionXmlParse.getProcessHistoryPermissions(instance.getProcessDefinitionId()); if(StringUtils.isEmpty(condition))return false; WorkflowDefinition definition = workflowDefinitionManager.getWfDefinition(instance.getWorkflowDefinitionId()); UserParseCalculator upc = new UserParseCalculator(); upc.setDataId(instance.getDataId()); upc.setProcessAdmin(definition.getAdminLoginName()); upc.setProcessAdminId(definition.getAdminId()); upc.setDocumentCreator(instance.getCreator()); upc.setDocumentCreatorId(instance.getCreatorId()); upc.setHandledTransactors(taskService.getHandledTransactors(instance.getProcessInstanceId())); upc.setHandledTransactorIds(taskService.getHandledTransactorIds(instance.getProcessInstanceId())); upc.setAllHandleTransactors(taskService.getAllHandleTransactors(instance.getProcessInstanceId())); upc.setAllHandleTransactorIds(taskService.getAllHandleTransactorIds(instance.getProcessInstanceId())); Set<Long> users = upc.getUsers(condition,instance.getSystemId(),instance.getCompanyId()); return users.contains(ContextUtils.getUserId()); } /** * 意见查看权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限打印,否则为没有权限 */ public boolean viewOpinionRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(editOpinionRight(task))return true; String[] rightSetting = DefinitionXmlParse.getViewOpinion(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 意见编辑权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限打印,否则为没有权限 */ public boolean editOpinionRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(mustOpinionRight(task)) return true; String[] rightSetting = DefinitionXmlParse.getEditOpinion(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * @param definition * @return */ public boolean editOpinionRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getEditOpinion(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } public boolean mustOpinionRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getMustOpinion(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } /** * 意见必填权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限打印,否则为没有权限 */ public boolean mustOpinionRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getMustOpinion(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 流程删除权限 * @param instance * @param taskName * @return */ public boolean workflowDeleteRight(WorkflowInstance instance,String taskName){ com.norteksoft.task.entity.WorkflowTask task = taskService.getMyTask(instance.getProcessInstanceId(), instance.getCompanyId(), getLoginName()); String currentTrasactor=""; Long currentTrasactorId=null; if(task!=null){ if(task.getName().equals(taskName)){//当前用户的当前任务名是taskName时,则当前办理人为当前用户 currentTrasactor=getLoginName(); currentTrasactorId = ContextUtils.getUserId(); } } if(StringUtils.isEmpty(currentTrasactor)){//判断当前用户为空时,取任一当前任务名为taskName的任务的办理人为当前办理人 List< com.norteksoft.task.entity.WorkflowTask> tasks= taskService.getActivityTasks(instance.getProcessInstanceId(), instance.getCompanyId()); if(tasks.size()>0){ task = tasks.get(0); if(task.getName().equals(taskName)){ if(StringUtils.isNotEmpty(task.getTrustor())){ currentTrasactor=tasks.get(0).getTrustor(); currentTrasactorId = tasks.get(0).getTrustorId(); }else{ currentTrasactor=tasks.get(0).getTransactor(); currentTrasactorId = tasks.get(0).getTransactorId(); } } } } String condition = DefinitionXmlParse.getDeleteInstancePermissionsInTask(instance.getProcessDefinitionId(), taskName); FormView form = formViewManager.getFormView(instance.getFormId()); WorkflowDefinition definition = workflowDefinitionManager.getWfDefinition(instance.getWorkflowDefinitionId()); UserParseCalculator upc = new UserParseCalculator(); upc.setDataId(instance.getDataId()); upc.setFormView(form); upc.setCurrentTransactor(currentTrasactor); upc.setCurrentTransactorId(currentTrasactorId); upc.setProcessAdmin(definition.getAdminLoginName()); upc.setProcessAdminId(definition.getAdminId()); upc.setDocumentCreator(instance.getCreator()); upc.setDocumentCreatorId(instance.getCreatorId()); Set<Long> users = upc.getUsers(condition==null?"":condition,instance.getSystemId(),instance.getCompanyId()); return users.contains(ContextUtils.getUserId()); } /** * 会签结果查看权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限,否则为没有权限 */ public boolean viewMeetingResultRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(viewMeetingResultRightInProcess(instance)) return true; String[] rightSetting = DefinitionXmlParse.getViewMeetingResultRight(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } public boolean viewMeetingResultRightInProcess(WorkflowInstance instance){ String condition = DefinitionXmlParse.getProcessMeetingPermissions(instance.getProcessDefinitionId()); if(StringUtils.isEmpty(condition))return false; WorkflowDefinition definition = workflowDefinitionManager.getWfDefinition(instance.getWorkflowDefinitionId()); UserParseCalculator upc = new UserParseCalculator(); upc.setDataId(instance.getDataId()); upc.setProcessAdmin(definition.getAdminLoginName()); upc.setProcessAdminId(definition.getAdminId()); upc.setDocumentCreator(instance.getCreator()); upc.setDocumentCreatorId(instance.getCreatorId()); upc.setHandledTransactors(taskService.getHandledTransactors(instance.getProcessInstanceId())); upc.setHandledTransactorIds(taskService.getHandledTransactorIds(instance.getProcessInstanceId())); upc.setAllHandleTransactors(taskService.getAllHandleTransactors(instance.getProcessInstanceId())); upc.setAllHandleTransactorIds(taskService.getAllHandleTransactorIds(instance.getProcessInstanceId())); Set<Long> users = upc.getUsers(condition,definition.getSystemId(),definition.getCompanyId()); return users.contains(ContextUtils.getUserId()); } /** * 投票结果查看权限(流程启用后使用) * @param instance * @param taskName * @return true为有权限,否则为没有权限 */ public boolean viewVoteResultRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(viewVoteResultRightInProcess(instance)) return true; String[] rightSetting = DefinitionXmlParse.getViewVoteResultRight(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } public boolean viewVoteResultRightInProcess(WorkflowInstance instance){ String condition = DefinitionXmlParse.getProcessVotePermissions(instance.getProcessDefinitionId()); if(StringUtils.isEmpty(condition))return false; WorkflowDefinition definition = workflowDefinitionManager.getWfDefinition(instance.getWorkflowDefinitionId()); UserParseCalculator upc = new UserParseCalculator(); upc.setDataId(instance.getDataId()); upc.setProcessAdmin(definition.getAdminLoginName()); upc.setProcessAdminId(definition.getAdminId()); upc.setDocumentCreator(instance.getCreator()); upc.setDocumentCreatorId(instance.getCreatorId()); upc.setHandledTransactors(taskService.getHandledTransactors(instance.getProcessInstanceId())); upc.setHandledTransactorIds(taskService.getHandledTransactorIds(instance.getProcessInstanceId())); upc.setAllHandleTransactors(taskService.getAllHandleTransactors(instance.getProcessInstanceId())); upc.setAllHandleTransactorIds(taskService.getAllHandleTransactorIds(instance.getProcessInstanceId())); Set<Long> users = upc.getUsers(condition,instance.getSystemId(),instance.getCompanyId()); return users.contains(ContextUtils.getUserId()); } /** * 上传附件的权限 */ public boolean attachmentAddRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getAttachmentAddCondition(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 删除附件的权限 */ public boolean attachmentDeleteRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getAttachmentDeleteCondition(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 下载附件的权限 */ public boolean attachmentDownloadRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getAttachmentDownloadCondition(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 流程未启动是查询附件添加权限 * @param definition * @return */ public boolean attachmentAddRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getAttachmentAddCondition(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } /** * 流程未启动是查询附件删除权限 * @param definition * @return */ public boolean attachmentDeleteRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getAttachmentDeleteCondition(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } public boolean attachmentDownloadRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getAttachmentDownloadCondition(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } /** * 正文是否创建 * @param instance * @param taskName * @return 权限 */ public boolean officialTextCreateRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextCreateCondition(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 删除正文权限 * @param instance * @param taskName * @return 权限 */ public boolean officialTextDeleteRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextDeleteCondition(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 正文下载权限 * @param instance * @param taskName * @return 权限 */ public boolean officialTextDownloadRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextDownloadSetting(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 正文打印权限 * @param instance * @param taskName * @return 权限 */ public boolean officialTextPrintRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextPrintSetting(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 正文编辑权限 * @param instance * @param taskName * @return 权限 */ public boolean officialTextEditRight(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextEditSetting(instance.getProcessDefinitionId(), task.getName()); return havaRight(task,rightSetting); } /** * 编辑正文时是否保留痕迹 * @param instance * @param taskName * @return */ public boolean officialTextRetainTrace(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(officialTextEditRight(task)){ String[] rightSetting = DefinitionXmlParse.getOfficialTextEditSetting(instance.getProcessDefinitionId(), task.getName()); return Boolean.valueOf(rightSetting[2]); }else{ return false; } } /** * 编辑正文时是否保留痕迹 * @param instance * @param taskName * @return */ public boolean officialTextViewTrace(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); String[] editRightSetting = DefinitionXmlParse.getOfficialTextEditSetting(instance.getProcessDefinitionId(), task.getName()); boolean viewRightSetting = DefinitionXmlParse.getOfficialTextViewSetting(instance.getProcessDefinitionId(), task.getName()); return Boolean.valueOf(editRightSetting[3])||viewRightSetting; } public boolean officialTextCreateRightNotStarted(WorkflowDefinition definition){ String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); String[] rightSetting = DefinitionXmlParse.getOfficialTextCreateCondition(definition.getProcessId(), firstTaskName); return havaRight(rightSetting); } private boolean havaRight(String[] rightSetting){ boolean result = false; if(rightSetting[0].equalsIgnoreCase(DefinitionXmlParse.RIGHT_ALLOW)){ result = true; }else{ result = false; } return result; } private boolean havaRight(WorkflowTask task,String[] rightSetting){ boolean result = false; if(rightSetting==null)return result; if(rightSetting[0].equalsIgnoreCase(DefinitionXmlParse.RIGHT_ALLOW)){ result = ConditionParseUtil.parseCondition(rightSetting[1],getUserParseCalculator(task)); }else if(rightSetting[0].equalsIgnoreCase(DefinitionXmlParse.RIGHT_UNALLOW)){ result = !ConditionParseUtil.parseCondition(rightSetting[1],getUserParseCalculator(task)); } return result; } private UserParseCalculator getUserParseCalculator(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); UserParseCalculator calculator = new UserParseCalculator(); if(StringUtils.isEmpty(task.getTrustor())){ calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); }else{//当是委托任务时,当前办理人为委托人 calculator.setCurrentTransactor(task.getTrustor()); calculator.setCurrentTransactorId(task.getTrustorId()); //注释以下代码的原因是:当人员A把某一环节的任务委托给人员B时,人员B收到任务后指派给人员C,人员C收到任务后查看任务,然后关闭任务,这时待办事宜列表中的任务名称就不再是“A委托+任务名”了,而是”任务名“,造成这种情况是因为trustorName被置为null了。 //注释start // String delegateTransactor = delegateManager.getDelegateMainName( // task.getCompanyId(), task.getTrustor(),instance.getProcessDefinitionId() , task.getName()); // if(StringUtils.isNotEmpty(delegateTransactor)&&delegateTransactor.equals(task.getTransactor())){ // calculator.setCurrentTransactor(task.getTrustor()); // }else{ // task.setTrustor(null); // task.setTrustorName(null); // calculator.setCurrentTransactor(ContextUtils.getLoginName()); // } //注释end } calculator.setDataId(instance.getDataId()); calculator.setDocumentCreator(instance.getCreator()); calculator.setDocumentCreatorId(instance.getCreatorId()); calculator.setFormView(formViewManager.getFormView(instance.getFormId())); return calculator; } /* * 返回需要必填的字段 */ private List<String> getRequiredFieldsNotType(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); Map<String,String> requiredFields = DefinitionXmlParse.getRequiredFields(instance.getProcessDefinitionId(),task.getName()); List<String> list = new ArrayList<String>(); for(String name: requiredFields.keySet()){ String userCondition = requiredFields.get(name); UserParseCalculator calculator = new UserParseCalculator(); if(StringUtils.isEmpty(task.getTrustor())){ calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); }else{//当是委托任务时,当前办理人为委托人 User delegateUser = delegateManager.getDelegateUser( task.getCompanyId(), task.getTrustor(),task.getTrustorId(),instance.getProcessDefinitionId() , task.getName()); if(delegateUser!=null&&(delegateUser.getId().equals(task.getTransactorId()) ||delegateUser.getLoginName().equals(task.getTransactor())) ){ calculator.setCurrentTransactor(task.getTrustor()); calculator.setCurrentTransactorId(task.getTrustorId()); }else{ //注释以下代码的原因是:子流程的任务,在 委托监控-已完成 和受托监控-已完成 中,查看任务时报错;出错的原因是在TaskService.java下方法为getMyFirstTask中的resultTask为null。 //注释start // task.setTrustor(null); // task.setTrustorName(null); //注释end calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); } } calculator.setDataId(instance.getDataId()); calculator.setDocumentCreator(instance.getCreator()); calculator.setDocumentCreatorId(instance.getCreatorId()); calculator.setFormView(formViewManager.getFormView(instance.getFormId())); if(ConditionParseUtil.parseCondition(userCondition,calculator)){ list.add(name.split(":")[0].trim()); } } return list; } /* * 返回需要必填的字段 */ private void getRequiredFields(StringBuilder builder,com.norteksoft.product.api.entity.WorkflowTask task,boolean request){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); Map<String,String> requiredFields = null; if(request){ requiredFields = DefinitionXmlParse.getRequiredFields(instance.getProcessDefinitionId(),task.getName()); }else{ requiredFields = DefinitionXmlParse.getNonEditableFields(instance.getProcessDefinitionId(), task.getName()); } for(String name: requiredFields.keySet()){ String userCondition = requiredFields.get(name); UserParseCalculator calculator = new UserParseCalculator(); if(StringUtils.isEmpty(task.getTrustor())){ calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); }else{//当是委托任务时,当前办理人为委托人 User delegateUser = delegateManager.getDelegateUser( task.getCompanyId(), task.getTrustor(),task.getTrustorId(),instance.getProcessDefinitionId() , task.getName()); if(delegateUser!=null&&(delegateUser.getId().equals(task.getTransactorId()) ||delegateUser.getLoginName().equals(task.getTransactor()))){ calculator.setCurrentTransactor(task.getTrustor()); calculator.setCurrentTransactorId(task.getTrustorId()); }else{ //注释以下代码的原因是:子流程的任务,在 委托监控-已完成 和受托监控-已完成 中,查看任务时报错;出错的原因是在TaskService.java下方法为getMyFirstTask中的resultTask为null。 //注释start // task.setTrustor(null); // task.setTrustorName(null); //注释end calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); } } calculator.setDataId(instance.getDataId()); calculator.setDocumentCreator(instance.getCreator()); calculator.setDocumentCreatorId(instance.getCreatorId()); calculator.setFormView(formViewManager.getFormView(instance.getFormId())); if(ConditionParseUtil.parseCondition(userCondition,calculator)){ formateFields(builder,name,request); builder.append(","); } } } /** * 返回不带类型字段id * @param instance * @param taskName * @return */ private List<String> getNonEditableFieldsNoType(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); Map<String,String> requiredFields = DefinitionXmlParse.getNonEditableFields(instance.getProcessDefinitionId(), task.getName()); List<String> list = new ArrayList<String>(); for(String name: requiredFields.keySet()){ String userCondition = requiredFields.get(name); UserParseCalculator calculator = new UserParseCalculator(); if(StringUtils.isEmpty(task.getTrustor())){ calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); }else{//当是委托任务时,当前办理人为委托人 User delegateUser = delegateManager.getDelegateUser( task.getCompanyId(), task.getTrustor(),task.getTrustorId(),instance.getProcessDefinitionId() , task.getName()); //任务的办理人id为null表示是历史任务 if(delegateUser!=null&&(delegateUser.getId().equals(task.getTransactorId()) ||(task.getTransactorId()==null&&delegateUser.getLoginName().equals(task.getTransactor())))){ calculator.setCurrentTransactor(task.getTrustor()); calculator.setCurrentTransactorId(task.getTrustorId()); }else{ //注释以下代码的原因是:子流程的任务,在 委托监控-已完成 和受托监控-已完成 中,查看任务时报错;出错的原因是在TaskService.java下方法为getMyFirstTask中的resultTask为null。 //注释start // task.setTrustor(null); // task.setTrustorName(null); //注释end calculator.setCurrentTransactor(ContextUtils.getLoginName()); calculator.setCurrentTransactorId(ContextUtils.getUserId()); } } calculator.setDataId(instance.getDataId()); calculator.setDocumentCreator(instance.getCreator()); calculator.setDocumentCreatorId(instance.getCreatorId()); calculator.setFormView(formViewManager.getFormView(instance.getFormId())); if(ConditionParseUtil.parseCondition(userCondition,calculator)){ list.add(name.split(":")[0]); } } return list; } private String getLoginName(){ return ContextUtils.getLoginName(); } public TaskPermission getActivityPermission(Long taskId){ if(taskId==null)return new TaskPermission(); WorkflowTask task = ApiFactory.getTaskService().getTask(taskId); if(task==null)return new TaskPermission(); WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(instance==null){ log.debug("WorkflowInstance实体不能为null"); throw new RuntimeException("WorkflowInstance实体不能为null"); } Map<String,String[]> permissionConditions=DefinitionXmlParse.getActivityPermissionCondition(instance.getProcessDefinitionId(), task.getName()); return getTaskPermission(task,permissionConditions); } public TaskPermission getActivityPermission(WorkflowDefinition definition){ if(definition==null)return new TaskPermission(); String firstTaskName = DefinitionXmlParse.getFirstTaskName(definition.getProcessId()); Map<String,String[]> permissionConditions=DefinitionXmlParse.getActivityPermissionCondition(definition.getProcessId(), firstTaskName); return getTaskPermission(null,permissionConditions); } private TaskPermission getTaskPermission(WorkflowTask task,Map<String,String[]> permissionConditions){ TaskPermission taskPermission = new TaskPermission(); taskPermission.setAttachmentDownloadable(getPermission(task,permissionConditions.get("attachmentDownloadable"))); taskPermission.setDocumentDownloadable(getPermission(task,permissionConditions.get("documentDownloadable"))); taskPermission.setDocumentPrintable(getPermission(task,permissionConditions.get("documentPrintable"))); taskPermission.setFormPrintable(getPermission(task,permissionConditions.get("formPrintable"))); if(task!=null){//任务的编辑意见权限 if(task.getActive().equals(TaskState.WAIT_TRANSACT.getIndex())||task.getActive().equals(TaskState.WAIT_DESIGNATE_TRANSACTOR.getIndex())){//任务未完成时,某些权限的设置 taskPermission.setAttachmentCreateable(getPermission(task,permissionConditions.get("attachmentCreateable"))); taskPermission.setAttachmentDeletable(getPermission(task,permissionConditions.get("attachmentDeletable"))); taskPermission.setDocumentCreateable(getPermission(task,permissionConditions.get("documentCreateable"))); taskPermission.setDocumentDeletable(getPermission(task,permissionConditions.get("documentDeletable"))); taskPermission.setDocumentEditable(getPermission(task,permissionConditions.get("documentEditable"))); taskPermission.setOpinionEditable(getPermission(task,permissionConditions.get("opinionEditable"))); taskPermission.setOpinionRequired(getPermission(task,permissionConditions.get("opinionRequired"))); }else{//任务已完成时,某些权限的设置 taskPermission.setAttachmentCreateable(false); taskPermission.setAttachmentDeletable(false); taskPermission.setDocumentCreateable(false); taskPermission.setDocumentDeletable(false); taskPermission.setDocumentEditable(false); taskPermission.setOpinionEditable(false); taskPermission.setOpinionRequired(false); } taskPermission.setOpinionVisible(getPermission(task,permissionConditions.get("opinionVisible"))); taskPermission.setDocumentTraceRetainable(getDocumentTraceRetainable(taskPermission.getDocumentEditable(),permissionConditions.get("documentEditable"))); taskPermission.setDocumentTraceVisible(getDocumentTraceVisible(taskPermission.getDocumentEditable(),permissionConditions.get("documentEditable"),task)); taskPermission.setDocumentTraceView(getDocumentTraceView(task)); WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); if(viewMeetingResultRightInProcess(instance)) { taskPermission.setCountersignResultVisible(true); }else{ taskPermission.setCountersignResultVisible(getPermission(task,permissionConditions.get("countersignResultVisible"))); } if(viewFlowHistoryRightInProcess(instance)) { taskPermission.setHistoryVisible(true); }else{ taskPermission.setHistoryVisible(getPermission(task,permissionConditions.get("historyVisible"))); } if(viewVoteResultRightInProcess(instance)){ taskPermission.setVoteResultVisible(true); }else{ taskPermission.setVoteResultVisible(getPermission(task,permissionConditions.get("voteResultVisible"))); } }else{//流程未发起时 taskPermission.setAttachmentCreateable(getPermission(task,permissionConditions.get("attachmentCreateable"))); taskPermission.setAttachmentDeletable(getPermission(task,permissionConditions.get("attachmentDeletable"))); taskPermission.setDocumentCreateable(getPermission(task,permissionConditions.get("documentCreateable"))); taskPermission.setOpinionEditable(getPermission(task,permissionConditions.get("opinionEditable"))); taskPermission.setOpinionRequired(getPermission(task,permissionConditions.get("opinionRequired"))); taskPermission.setOpinionVisible(getPermission(task,permissionConditions.get("opinionVisible"))); } return taskPermission; } private boolean getPermission(WorkflowTask task,String[] rightSetting ){ if(task==null){//流程未发起时 return havaRight(rightSetting); }else{//办理任务过程中,判断任务的权限 return havaRight(task,rightSetting); } } private boolean getDocumentTraceRetainable(boolean editable,String[] rightSetting){ if(editable){ return Boolean.valueOf(rightSetting[2]); }else{ return false; } } private boolean getDocumentTraceVisible(boolean editable,String[] rightSetting,WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); boolean viewRightSetting = DefinitionXmlParse.getOfficialTextViewSetting(instance.getProcessDefinitionId(), task.getName()); if(editable){ return Boolean.valueOf(rightSetting[3])||viewRightSetting; }else{ return viewRightSetting; } } /** * 是否显示编辑痕迹 * @param instance * @param taskName * @return */ public boolean getDocumentTraceView(WorkflowTask task){ WorkflowInstance instance = ApiFactory.getInstanceService().getInstance(task.getProcessInstanceId()); boolean viewRightSetting = DefinitionXmlParse.getOfficialTextViewSetting(instance.getProcessDefinitionId(), task.getName()); return viewRightSetting; } }