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.entity.TaskPermission;
import com.norteksoft.product.api.impl.WorkflowClientManager;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.task.base.enumeration.TaskState;
import com.norteksoft.task.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;
import com.norteksoft.wf.engine.entity.WorkflowInstance;
/**
* 管理流程权限
* @author Administrator
*
*/
@Service
@Transactional
public class WorkflowRightsManager {
private Log log = LogFactory.getLog(WorkflowClientManager.class);
private FormViewManager formViewManager;
private WorkflowDefinitionManager workflowDefinitionManager;
private TaskService taskService;
private WorkflowInstanceManager workflowInstanceManager;
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 setWorkflowInstanceManager(
WorkflowInstanceManager workflowInstanceManager) {
this.workflowInstanceManager = workflowInstanceManager;
}
@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\"}");
}
}
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(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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.setDocumentCreator(instance.getCreator());
upc.setHandledTransactors(taskService.getHandledTransactors(instance));
upc.setAllHandleTransactors(taskService.getAllHandleTransactors(instance));
Set<String> users = upc.getUsers(condition,instance.getSystemId(),instance.getCompanyId());
return users.contains(getLoginName());
}
/**
* 意见查看权限(流程启用后使用)
* @param instance
* @param taskName
* @return true为有权限打印,否则为没有权限
*/
public boolean viewOpinionRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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.getEditOpinion(definition.getProcessId(), firstTaskName);
return havaRight(rightSetting);
}
/**
* 意见必填权限(流程启用后使用)
* @param instance
* @param taskName
* @return true为有权限打印,否则为没有权限
*/
public boolean mustOpinionRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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){
WorkflowTask task = taskService.getMyTask(instance.getProcessInstanceId(), instance.getCompanyId(), getLoginName());
String currentTrasactor="";
if(task!=null){
if(task.getName().equals(taskName)){//当前用户的当前任务名是taskName时,则当前办理人为当前用户
currentTrasactor=getLoginName();
}
}
if(StringUtils.isEmpty(currentTrasactor)){//判断当前用户为空时,取任一当前任务名为taskName的任务的办理人为当前办理人
List<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();
}else{
currentTrasactor=tasks.get(0).getTransactor();
}
}
}
}
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.setProcessAdmin(definition.getAdminLoginName());
upc.setDocumentCreator(instance.getCreator());
Set<String> users = upc.getUsers(condition==null?"":condition,instance.getSystemId(),instance.getCompanyId());
return users.contains(getLoginName());
}
/**
* 会签结果查看权限(流程启用后使用)
* @param instance
* @param taskName
* @return true为有权限,否则为没有权限
*/
public boolean viewMeetingResultRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
String[] rightSetting = DefinitionXmlParse.getViewMeetingResultRight(instance.getProcessDefinitionId(), task.getName());
return havaRight(task,rightSetting);
}
/**
* 投票结果查看权限(流程启用后使用)
* @param instance
* @param taskName
* @return true为有权限,否则为没有权限
*/
public boolean viewVoteResultRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
String[] rightSetting = DefinitionXmlParse.getViewVoteResultRight(instance.getProcessDefinitionId(), task.getName());
return havaRight(task,rightSetting);
}
/**
* 上传附件的权限
*/
public boolean attachmentAddRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
String[] rightSetting = DefinitionXmlParse.getAttachmentAddCondition(instance.getProcessDefinitionId(), task.getName());
return havaRight(task,rightSetting);
}
/**
* 删除附件的权限
*/
public boolean attachmentDeleteRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
String[] rightSetting = DefinitionXmlParse.getAttachmentDeleteCondition(instance.getProcessDefinitionId(), task.getName());
return havaRight(task,rightSetting);
}
/**
* 下载附件的权限
*/
public boolean attachmentDownloadRight(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(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 = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
UserParseCalculator calculator = new UserParseCalculator();
if(StringUtils.isEmpty(task.getTrustor())){
calculator.setCurrentTransactor(ContextUtils.getLoginName());
}else{//当是委托任务时,当前办理人为委托人
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());
}
}
calculator.setDataId(instance.getDataId());
calculator.setDocumentCreator(instance.getCreator());
calculator.setFormView(formViewManager.getFormView(instance.getFormId()));
return calculator;
}
/*
* 返回需要必填的字段
*/
private List<String> getRequiredFieldsNotType(WorkflowTask task){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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());
}else{//当是委托任务时,当前办理人为委托人
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());
}
}
calculator.setDataId(instance.getDataId());
calculator.setDocumentCreator(instance.getCreator());
calculator.setFormView(formViewManager.getFormView(instance.getFormId()));
if(ConditionParseUtil.parseCondition(userCondition,calculator)){
list.add(name.split(":")[0].trim());
}
}
return list;
}
/*
* 返回需要必填的字段
*/
private void getRequiredFields(StringBuilder builder,WorkflowTask task,boolean request){
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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());
}else{//当是委托任务时,当前办理人为委托人
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());
}
}
calculator.setDataId(instance.getDataId());
calculator.setDocumentCreator(instance.getCreator());
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 = workflowInstanceManager.getWorkflowInstance(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());
}else{//当是委托任务时,当前办理人为委托人
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());
}
}
calculator.setDataId(instance.getDataId());
calculator.setDocumentCreator(instance.getCreator());
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 = taskService.getTask(taskId);
if(task==null)return new TaskPermission();
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(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.setCountersignResultVisible(getPermission(task,permissionConditions.get("countersignResultVisible")));
taskPermission.setHistoryVisible(getPermission(task,permissionConditions.get("historyVisible")));
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")));
}
return taskPermission;
}
private boolean getPermission(WorkflowTask task,String[] rightSetting ){
if(task==null){//流程未发起时
return havaRight(rightSetting);
}else{//办理任务过程中,判断任务的权限
return havaRight(task,rightSetting);
}
}
}