package com.norteksoft.wf.engine.core.impl; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; import com.norteksoft.product.api.entity.Department; import com.norteksoft.acs.entity.organization.User; import com.norteksoft.acs.entity.organization.Workgroup; import com.norteksoft.bs.rank.service.RankManager; import com.norteksoft.mms.form.dao.GeneralDao; import com.norteksoft.mms.form.entity.FormView; import com.norteksoft.mms.form.entity.TableColumn; import com.norteksoft.mms.form.jdbc.JdbcSupport; import com.norteksoft.mms.form.service.FormViewManager; import com.norteksoft.mms.form.service.TableColumnManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.wf.base.enumeration.CommonStrings; import com.norteksoft.wf.base.enumeration.LogicOperator; import com.norteksoft.wf.base.enumeration.TextOperator; import com.norteksoft.wf.base.utils.UserUtil; import com.norteksoft.wf.engine.core.Computable; /** * 对用户解析的运算器 */ public class UserParseCalculator implements Computable { private String documentCreator;//文档创建人 private String currentTransactor;//当前办理人(如果有委托为受托人) private String previousTransactor;//上一环节办理人(如果有委托为受托人) private String processAdmin;//流程管理员 private Collection<String> handledTransactors;//已办理人员 private Collection<String> allHandleTransactors;//已办理人员 private FormView formView; private Long dataId; private String approvalResult;//审批结果 private static final String SQUARE_BRACKETS_LEFT = "["; private static final String SQUARE_BRACKETS_RIGHT = "]"; public Boolean execute(String atomicExpress) { RankManager rankManager=(RankManager)ContextUtils.getBean("rankManager"); if(StringUtils.isEmpty(atomicExpress)) return false; boolean result = false; atomicExpress = atomicExpress.trim(); if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_NAME)){ //表达式左边为文档创建人姓名 result = parseUser(atomicExpress,documentCreator); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_ROLE)){ //表达式左边为文档创建人角色 result = parseRole(atomicExpress,documentCreator); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_DEPARTMENT)){ //表达式左边为文档创建人部门 result = parseDepartment(atomicExpress,documentCreator); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_SUPERIOR_DEPARTMENT)){ //表达式左边为文档创建人上级部门 List<Department> departments2 = ApiFactory.getAcsService().getParentDepartmentsByUser(documentCreator); result = parseDepartment(atomicExpress,departments2); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_UPSTAGE_DEPARTMENT)){ //表达式左边为文档创建人顶级部门 List<Department> departments2 = ApiFactory.getAcsService().getTopDepartmentsByUser(documentCreator); result = parseDepartment(atomicExpress,departments2); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_WORKGROUP)){ //表达式左边为文档创建人工作组 result = parseWorkGroup(atomicExpress,documentCreator); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_NAME)){ //表达式左边为文档创建人直属上级名称 User user=rankManager.getDirectLeader(documentCreator); result = user==null?false:parseUser(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_DEPARTMENT)){ //表达式左边为文档创建人直属上级部门 User user=rankManager.getDirectLeader(documentCreator); result = user==null?false:parseDepartment(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_ROLE)){ //表达式左边为文档创建人直属上级角色 User user=rankManager.getDirectLeader(documentCreator); result = user==null?false:parseRole(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_WORKGROUP)){ //表达式左边为文档创建人直属上级工作组 User user=rankManager.getDirectLeader(documentCreator); result = user==null?false:parseWorkGroup(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_NAME)){ //当前办理人姓名 result = parseUser(atomicExpress,currentTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_ROLE)){ result = parseRole(atomicExpress,currentTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_DEPARTMENT)){ result = parseDepartment(atomicExpress,currentTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_SUPERIOR_DEPARTMENT)){ List<Department> departments2 = ApiFactory.getAcsService().getParentDepartmentsByUser(currentTransactor); result = parseDepartment(atomicExpress,departments2); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_UPSTAGE_DEPARTMENT)){ List<Department> departments2 = ApiFactory.getAcsService().getTopDepartmentsByUser(currentTransactor); result = parseDepartment(atomicExpress,departments2); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_WORKGROUP)){ result = parseWorkGroup(atomicExpress,currentTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_DIRECT_SUPERIOR_NAME)){ User user=rankManager.getDirectLeader(currentTransactor); result = user==null?false:parseUser(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_DIRECT_SUPERIOR_DEPARTMENT)){ User user=rankManager.getDirectLeader(currentTransactor); result = user==null?false:parseDepartment(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_DIRECT_SUPERIOR_ROLE)){ User user=rankManager.getDirectLeader(currentTransactor); result = user==null?false:parseRole(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.CURRENT_TRANSACTOR_DIRECT_SUPERIOR_WORKGROUP)){ User user=rankManager.getDirectLeader(currentTransactor); result = user==null?false:parseWorkGroup(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_NAME)){ result = parseUser(atomicExpress,previousTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_ROLE)){ result = parseRole(atomicExpress,previousTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_DEPARTMENT)){ result = parseDepartment(atomicExpress,previousTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_WORKGROUP)){ result = parseWorkGroup(atomicExpress,previousTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_NAME)){ User user=rankManager.getDirectLeader(previousTransactor); result = user==null?false:parseUser(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_DEPARTMENT)){ User user=rankManager.getDirectLeader(previousTransactor); result = user==null?false:parseDepartment(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_ROLE)){ User user=rankManager.getDirectLeader(previousTransactor); result = user==null?false:parseRole(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_WORKGROUP)){ User user=rankManager.getDirectLeader(previousTransactor); result = user==null?false:parseWorkGroup(atomicExpress,user.getLoginName()); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.PREVIOUS_TRANSACTOR_WORKGROUP)){ result = parseWorkGroup(atomicExpress,previousTransactor); }else if(StringUtils.startsWith(atomicExpress, CommonStrings.APPROVAL_RESULT)){ parseApprovalResult(atomicExpress); } return result; } /* * 解析表达式 返回部门列表 */ private List<Department> getDepartmentByExpress(String valueExpress){ List<Department> result = new ArrayList<Department>(); if(StringUtils.isEmpty(valueExpress)) return result; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String departmentName = getValue(fieldName); Department tempDepartment = ApiFactory.getAcsService().getDepartmentByName(departmentName); if(tempDepartment!=null)result.add(tempDepartment); return result; }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DEPARTMENT)){ //创建人部门 return ApiFactory.getAcsService().getDepartments(documentCreator); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_SUPERIOR_DEPARTMENT)){ //创建人上级部门 return ApiFactory.getAcsService().getParentDepartmentsByUser( documentCreator); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_UPSTAGE_DEPARTMENT)){ //创建人顶级部门 return ApiFactory.getAcsService().getTopDepartmentsByUser(documentCreator); }else if(valueExpress.trim().equals(CommonStrings.UPSTAGE_DEPARTMENT)){ //顶级部门(当前办理人所在部门为顶级部门) return ApiFactory.getAcsService().getDepartments(); }else if(valueExpress.trim().equals(CommonStrings.CURRENT_TRANSACTOR_SUPERIOR_DEPARTMENT)){ //当前办理人的上级部门 return ApiFactory.getAcsService().getParentDepartmentsByUser(currentTransactor); }else if(valueExpress.trim().equals(CommonStrings.CURRENT_TRANSACTOR_UPSTAGE_DEPARTMENT)){ //当前办理人的顶级部门 return ApiFactory.getAcsService().getTopDepartmentsByUser(currentTransactor); }else{ result.add(ApiFactory.getAcsService().getDepartmentByName(valueExpress)); return result; } } /* * 判断两个部门集合是不是有交集 */ private boolean haveIntersectionDepartment(List<Department> departments1,List<Department> departments2) { if(departments1.size()==0||departments2.size()==0) return false; if(departments1.size()<departments2.size()){ for(Department department :departments1){ if(departments2.contains(department)) return true; } }else{ for(Department department :departments2){ if(departments1.contains(department)) return true; } } return false; } /* * 解析表单式和部门的关系 */ private boolean parseDepartment(String atomicExpress,List<Department> departments2) { List<Department> department1 = getDepartmentByExpress(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { return !haveIntersectionDepartment(department1,departments2); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ return haveIntersectionDepartment(department1,departments2); } return false; } private boolean parseApprovalResult(String atomicExpress){ if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { return !approvalResult.equals(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ return approvalResult.equals(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); } return false; } private static final String SINGLE_QUOTATION_MARK = "'"; /** * 解析用户和工作组的关系 * ${documentCreatorWorkGroup} operator.text.et '${field[姓名[name]]}' * ${documentCreatorWorkGroup} operator.text.et 'SBU工作组' * ${currentTransactorWorkGroup} operator.text.et '${documentCreatorWorkGroup}' */ private boolean parseWorkGroup(String atomicExpress,String loginName){ if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { return !userInWorkGroup(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK), loginName ); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ return userInWorkGroup(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK), loginName ); } return false; } private boolean userInWorkGroup(String valueExpress,String loginName){ if(StringUtils.isEmpty(valueExpress)) return false; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String workGroupName = getValue(fieldName); return UserUtil.userInWorkGroup(ContextUtils.getCompanyId(), loginName, workGroupName); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_WORKGROUP)){ List<com.norteksoft.product.api.entity.Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroupsByUser(documentCreator); for (com.norteksoft.product.api.entity.Workgroup workGroup : workGroups) { if(UserUtil.userInWorkGroup(ContextUtils.getCompanyId(), loginName, workGroup.getName())){ return true; } } return false; }else{ return UserUtil.userInWorkGroup(ContextUtils.getCompanyId(), loginName, valueExpress); } } /** * 解析用户和部门的关系 * ${documentCreatorDepartment} operator.text.et '${upstageDepartment}' * ${documentCreatorName} operator.text.et '${field[姓名[name]]}' * ${documentCreatorDepartment} operator.text.et '财务部' * ${currentTransactorDepartment} operator.text.et '${documentCreatorDepartment}' * ${currentTransactorDepartment} operator.text.et '${superiorDepartment}' */ private boolean parseDepartment(String atomicExpress,String loginName){ if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { return !userInDepartment(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK),loginName); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ return userInDepartment(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK),loginName); } return false; } private boolean userInDepartment(String valueExpress,String loginName){ if(StringUtils.isEmpty(valueExpress)) return false; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String departmentName = getValue(fieldName); return UserUtil.userInDepartment(ContextUtils.getCompanyId(), loginName, departmentName); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DEPARTMENT) || valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_DEPARTMENT)){ //创建人部门 List<Department> departments = ApiFactory.getAcsService().getDepartments(loginName); for (Department department : departments) { if(UserUtil.userInDepartment(ContextUtils.getCompanyId(), loginName, department.getName())){ return true; } } return false; }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_SUPERIOR_DEPARTMENT)){ //创建人上级部门 List<Department> departments = ApiFactory.getAcsService().getParentDepartmentsByUser( documentCreator); for (Department department : departments) { if(UserUtil.userInDepartment(ContextUtils.getCompanyId(), loginName, department.getName())){ return true; } } return false; }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_UPSTAGE_DEPARTMENT)){ //创建人顶级部门 List<Department> departments = ApiFactory.getAcsService().getTopDepartmentsByUser(documentCreator); for (Department department : departments) { if(UserUtil.userInDepartment(ContextUtils.getCompanyId(), loginName, department.getName())){ return true; } } return false; }else if(valueExpress.trim().equals(CommonStrings.UPSTAGE_DEPARTMENT)){ //顶级部门(当前办理人所在部门为顶级部门) List<Department> departments = ApiFactory.getAcsService().getDepartments(loginName); for (Department department : departments) { Department parentDept = ApiFactory.getAcsService().getParentDepartment(department.getId()); if(parentDept==null){ return true; } } return false; }else{ return UserUtil.userInDepartment(ContextUtils.getCompanyId(), loginName, valueExpress); } } /** * 解析用户是否拥有某角色 角色来源:字段中或组织结果中 * ${currentTransactorRole} operator.text.et '${field[姓名[name]]}' * ${currentTransactorRole} operator.text.et '安全管理员' */ private boolean parseRole(String atomicExpress,String loginName){ if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { String roleName = getRoleName(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); return !UserUtil.userHaveRole(ContextUtils.getCompanyId(), loginName, roleName); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ String roleName = getRoleName(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); return UserUtil.userHaveRole(ContextUtils.getCompanyId(), loginName, roleName); } return false; } private String getRoleName(String valueExpress){ if(StringUtils.isEmpty(valueExpress)) return ""; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String roleName = getValue(fieldName); return roleName; }else{ return valueExpress; } } /** * 解析用户是否满足条件 ,判断条件的值有3中来源,分别为组织结构中、表单字段中和标准值 * ${currentTransactorName} operator.text.et '吴荣[wurong]' * ${currentTransactorName} operator.text.et '${documentCreatorName}' * ${currentTransactorName} operator.text.et '${field[姓名[name]]} */ private boolean parseUser(String atomicExpress,String loginName){ if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) { String userLoginName = getUserLoginName(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); return !loginName.equals(userLoginName); }else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){ String userLoginName = getUserLoginName(StringUtils.substringBetween(atomicExpress, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); return loginName.equals(userLoginName); } return false; } private String getUserLoginName(String valueExpress){ RankManager rankManager=(RankManager)ContextUtils.getBean("rankManager"); if(StringUtils.isEmpty(valueExpress)) return ""; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String loginName = getValue(fieldName); return loginName; }else if(valueExpress.trim().endsWith("${documentCreatorName}")){ return documentCreator; }else if(valueExpress.trim().endsWith(CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_NAME)){ User user=rankManager.getDirectLeader(documentCreator); return user==null?"":user.getLoginName(); }else{ return StringUtils.substringBetween(valueExpress, "[", "]"); } } @SuppressWarnings("unchecked") private String getValue(String fieldName){ GeneralDao generalDao = (GeneralDao)ContextUtils.getBean("generalDao"); FormViewManager formManager = (FormViewManager)ContextUtils.getBean("formViewManager"); TableColumnManager tableColumnManager = (TableColumnManager)ContextUtils.getBean("tableColumnManager"); String value = ""; boolean isSql = true; Object entity = null; Map dataMap = null; //标准表单 if(!formView.isStandardForm()){ //自定义表单 dataMap = formManager.getDataMap(formView.getDataTable().getName(), dataId); }else if(formView.isStandardForm()){ try{ Class.forName(formView.getDataTable().getEntityName());//判断是否存在该类型 entity = generalDao.getObject(formView.getDataTable().getEntityName(),dataId); isSql=false; }catch(ClassNotFoundException e){ dataMap = formManager.getDataMap(formView.getDataTable().getName(), dataId); } } if(isSql){ Object obj = null; if(!formView.isStandardForm()){ //自定义表单 obj = dataMap.get(JdbcSupport.FORM_FIELD_PREFIX_STRING+fieldName); }else{ //标准表单 String dbName = fieldName; TableColumn column=tableColumnManager.getTableColumnByColName(formView.getDataTable().getId(), fieldName); if(column!=null){ dbName=column.getDbColumnName(); } if(StringUtils.isNotEmpty(fieldName))obj = dataMap.get(dbName); } if(obj==null){ value = ""; }else{ value = obj.toString(); } }else{ //标准表单 try { Object object = BeanUtils.getProperty(entity, fieldName); if(object==null){ value = ""; }else{ value = object.toString(); } } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } return value; } //--------------获得用户 /** * 从条件中取得用户 * 算法: * A OR B AND ((C OR D) OR E AND F) AND G OR (H OR I) AND J * 截取 从右向左找第一 '(' 从'('的位置向右找第一个 ) 将它中间内容存为 x1,并将它们替换为 x1 x1= H OR I * 得 A OR B AND ((C OR D) OR E AND F) AND G OR x1 AND J * 截取 从右向左找第一 ( 从左向右找第一个 ) 将它中间内容存为 x2,并将它们替换为 x2 = C OR D * 得 A OR B AND (x2 OR E AND F) AND G OR x1 AND J * 截取 从右向左找第一 ( 从左向右找第一个 ) 将它中间内容存为 x3,并将它们替换为 x3 = x2 OR E AND F * 得 A OR B AND x3 AND G OR x1 AND J * * 再以 or 分割表达式 得 y1 = A ;y2 = B AND x3 AND G ; y3 = x1 AND J * 再以 and 分割表达式 的 y2{z1 = B ; z2 = x3; z3 = G;} y3{x1 , J} * * @param userCondition * @return 满足条件的用户 */ public Set<String> getUsers(String userCondition,Long systemId,Long companyId){ return parseBrackets(userCondition,systemId,companyId); } private Map<String,String> userMap = new HashMap<String,String>(); private static char LEFT_BRACKET = '('; private static char RIGHT_BRACKET = ')'; private static String VARIABLE_PRE = "var"; private Set<String> parseBrackets(String userCondition,Long systemId,Long companyId){ int left_Bracket_index = -1; int right__Bracket_index = -1; String subString = null; while(true){ left_Bracket_index = userCondition.lastIndexOf(LEFT_BRACKET); if(left_Bracket_index==-1) break; right__Bracket_index = userCondition.indexOf(RIGHT_BRACKET,left_Bracket_index); subString = userCondition.substring(left_Bracket_index+1,right__Bracket_index); userCondition = StringUtils.replace(userCondition, userCondition.substring(left_Bracket_index,right__Bracket_index+1), VARIABLE_PRE+subString.hashCode()); userMap.put(VARIABLE_PRE+subString.hashCode(), subString); } return parseOr(userCondition,systemId,companyId); } private Set<String> parseOr(String condition,Long systemId,Long companyId){ String[] conds = condition.split(LogicOperator.OR.getCode()); Set<String> userLoginNames = new HashSet<String>(); for(String cond :conds){ userLoginNames.addAll(parseAnd(cond,systemId,companyId)); } return userLoginNames; } private Set<String> parseAnd(String condition,Long systemId,Long companyId){ String[] conds = condition.split(LogicOperator.AND.getCode()); Map<Integer,Set<String>> map = new HashMap<Integer,Set<String>>(); int minSize = 100000;//默认为十万。如果一个公司人数超过十万,这个的初始值可能会出问题 Set<String> temp = null; int minI = 0; for(int i=0;i<conds.length;i++){ if(userMap.get(conds[i].trim())==null){ temp = parseAtomCondition(conds[i].trim(),systemId,companyId); }else{ temp = parseOr(userMap.get(conds[i].trim()),systemId,companyId); } if(temp.size()==0) return temp;//如果在and条件中有一个条件没有选出人,则整个and条件也没有人 if(temp.size()<minSize){ minSize = temp.size(); minI = i;//人数最少的条件的key } map.put(i, temp); } Set<String> result = new HashSet<String>(); List<String> minSet = new ArrayList<String>(map.get(minI)); for(int j=0;j<minSet.size();j++ ){ boolean isSelect = true; for(int i=0;i<conds.length;i++){ if(!map.get(i).contains(minSet.get(j))){ isSelect = false; break; } } if(isSelect)result.add(minSet.get(j)); } return result; } private Set<String> parseAtomCondition(String atomCondition,Long systemId,Long companyId){ Set<String> userSet = new HashSet<String>(); if(StringUtils.isEmpty(atomCondition))return userSet; if(atomCondition.trim().startsWith(CommonStrings.SYS_VAR_USER)){ userSet.addAll(parseUser(atomCondition)); }else if(atomCondition.trim().startsWith(CommonStrings.SYS_VAR_ROLE)){ userSet.addAll(parseRole(atomCondition,systemId,companyId)); }else if(atomCondition.trim().startsWith(CommonStrings.SYS_VAR_DEPARTMENT)){ userSet.addAll(parseDepartment(atomCondition)); }else if(atomCondition.trim().startsWith(CommonStrings.SYS_VAR_WORKGROUP)){ userSet.addAll(parseWorkGroup(atomCondition)); }else if(atomCondition.trim().equals(CommonStrings.PROCESS_ADMIN)){ userSet.add(processAdmin); }else if(atomCondition.trim().equals(CommonStrings.CURRENTTRANSACTOR)){ userSet.add(currentTransactor); }else if(atomCondition.trim().equals(CommonStrings.DOCUMENT_CREATOR)){ userSet.add(documentCreator); }else if(atomCondition.trim().equals(CommonStrings.PARTICIPANTS_TRANSACTOR)){ userSet.addAll(handledTransactors); }else if(atomCondition.trim().equals(CommonStrings.PARTICIPANTS_ALL_TRANSACTOR)){ userSet.addAll(allHandleTransactors); } return userSet; } private Set<String> parseWorkGroup(String condition){ Set<String> userSet = new HashSet<String>(); if(StringUtils.contains(condition, TextOperator.NET.getCode())) { Set<Workgroup> workgroupSet = getWorkGroup(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUsersNotInWorkGroup(workgroupSet)); }else if(StringUtils.contains(condition, TextOperator.ET.getCode())){ Set<Workgroup> workgroupSet = getWorkGroup(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUsersByWorkGroup(workgroupSet)); } return userSet; } private Set<com.norteksoft.acs.entity.organization.Workgroup> getWorkGroup(String valueExpress){ RankManager rankManager=(RankManager)ContextUtils.getBean("rankManager"); Set<Workgroup> workGroupSet = new HashSet<Workgroup>(); if(StringUtils.isEmpty(valueExpress)) return workGroupSet; if(valueExpress.trim().startsWith("${field[")){ int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String workGroupName = getValue(fieldName); workGroupSet.add(UserUtil.getWorkGroupByName(workGroupName)); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_WORKGROUP)){ List<Workgroup> workGroups = UserUtil.getWorkGroupsByUser( documentCreator); workGroupSet.addAll(workGroups); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_WORKGROUP)){ User user=rankManager.getDirectLeader(documentCreator); if(user!=null){ List<Workgroup> workGroups = UserUtil.getWorkGroupsByUser( user.getLoginName()); workGroupSet.addAll(workGroups); } }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_WORKGROUP)){ List<Workgroup> workGroups = UserUtil.getWorkGroupsByUser(previousTransactor); workGroupSet.addAll(workGroups); }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_WORKGROUP)){ User user=rankManager.getDirectLeader(previousTransactor); if(user!=null){ List<Workgroup> workGroups = UserUtil.getWorkGroupsByUser(user.getLoginName()); workGroupSet.addAll(workGroups); } }else{ workGroupSet.add(UserUtil.getWorkGroupByName(valueExpress)); } return workGroupSet; } private Set<String> parseDepartment(String condition){ Set<String> userSet = new HashSet<String>(); if(StringUtils.contains(condition, TextOperator.NET.getCode())) { Set<Department> departmentSet = getDepartment(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUsersNotInDepartment(departmentSet)); }else if(StringUtils.contains(condition, TextOperator.ET.getCode())){ Set<Department> departmentSet = getDepartment(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); if(departmentSet!=null)userSet.addAll(UserUtil.getUsersByDepartment(departmentSet)); } return userSet; } private Set<Department> getDepartment(String valueExpress){ RankManager rankManager=(RankManager)ContextUtils.getBean("rankManager"); Set<Department> departmentSet = new HashSet<Department>(); if(StringUtils.isEmpty(valueExpress)) return departmentSet; if(valueExpress.trim().startsWith("${field[")){ //值来自表单字段中 int start = valueExpress.lastIndexOf(SQUARE_BRACKETS_LEFT); int end = valueExpress.indexOf(SQUARE_BRACKETS_RIGHT); String fieldName = valueExpress.substring(start + 1, end); String departmentName = getValue(fieldName); Department department = UserUtil.getDepartmentByName(departmentName); if(department!=null)departmentSet.add(department); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DEPARTMENT)){ //文档创建人部门 departmentSet.addAll(UserUtil.getDepartmentsByUser( documentCreator)); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_SUPERIOR_DEPARTMENT)){ //文档创建人上级部门 departmentSet.addAll(ApiFactory.getAcsService().getParentDepartmentsByUser(documentCreator)); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_UPSTAGE_DEPARTMENT)){ //文档创建人顶级部门 departmentSet.addAll(ApiFactory.getAcsService().getTopDepartmentsByUser(documentCreator)); }else if(valueExpress.trim().equals(CommonStrings.DOCUMENT_CREATOR_DIRECT_SUPERIOR_DEPARTMENT)){ //文档创建人直属上级部门 User user=rankManager.getDirectLeader(documentCreator); if(user!=null){ departmentSet.addAll(UserUtil.getDepartmentsByUser( user.getLoginName())); } }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_DEPARTMENT)){ //上环节办理人部门 departmentSet.addAll(UserUtil.getDepartmentsByUser( previousTransactor)); }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_SUPERIOR_DEPARTMENT)){ //上环节办理人上级部门 departmentSet.addAll(ApiFactory.getAcsService().getParentDepartmentsByUser(previousTransactor)); }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_UPSTAGE_DEPARTMENT)){ //上环节办理人顶级部门 departmentSet.addAll(ApiFactory.getAcsService().getTopDepartmentsByUser(previousTransactor)); }else if(valueExpress.trim().equals(CommonStrings.UPSTAGE_DEPARTMENT)){ //顶级部门 departmentSet.addAll(ApiFactory.getAcsService().getDepartments()); }else if(valueExpress.trim().equals(CommonStrings.PREVIOUS_TRANSACTOR_DIRECT_SUPERIOR_DEPARTMENT)){ //上一环节办理人直属上级的部门 User user=rankManager.getDirectLeader(previousTransactor); if(user!=null){ departmentSet.addAll(UserUtil.getDepartmentsByUser( user.getLoginName())); } }else{ //值来自组织结构中 departmentSet.add(UserUtil.getDepartmentByName(valueExpress)); } return departmentSet; } private Set<String> parseRole(String condition,Long systemId,Long companyId){ Set<String> userSet = new HashSet<String>(); if(StringUtils.contains(condition, TextOperator.NET.getCode())) { String roleName = getRoleName(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUsersExceptRoleName(systemId,roleName)); }else if(StringUtils.contains(condition, TextOperator.ET.getCode())){ String roleName = getRoleName(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUsersByRoleName(roleName,systemId,companyId)); } return userSet; } private Set<String> parseUser(String condition){ Set<String> userSet = new HashSet<String>(); if(StringUtils.contains(condition, TextOperator.NET.getCode())) { String loginName = getUserLoginName(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); userSet.addAll(UserUtil.getUserExceptLoginName(loginName)); }else if(StringUtils.contains(condition, TextOperator.ET.getCode())){ String loginName = getUserLoginName(StringUtils.substringBetween(condition, SINGLE_QUOTATION_MARK, SINGLE_QUOTATION_MARK)); if(StringUtils.isNotEmpty(loginName)){ userSet.add(loginName); } } return userSet; } public void setDocumentCreator(String documentCreator) { this.documentCreator = documentCreator; } public void setCurrentTransactor(String currentTransactor) { this.currentTransactor = currentTransactor; } public void setPreviousTransactor(String previousTransactor) { this.previousTransactor = previousTransactor; } public void setFormView(FormView form) { this.formView = form; } public FormView getFormView() { return formView; } public void setDataId(Long dataId) { this.dataId = dataId; } public Long getDataId() { return dataId; } public String getApprovalResult() { return approvalResult; } public void setApprovalResult(String approvalResult) { this.approvalResult = approvalResult; } public void setProcessAdmin(String processAdmin) { this.processAdmin = processAdmin; } public void setHandledTransactors(Collection<String> handledTransactors) { this.handledTransactors = handledTransactors; } public void setAllHandleTransactors(Collection<String> allHandleTransactors) { this.allHandleTransactors = allHandleTransactors; } public String getDocumentCreator() { return documentCreator; } public String getCurrentTransactor() { return currentTransactor; } public String getPreviousTransactor() { return previousTransactor; } public String getProcessAdmin() { return processAdmin; } public Collection<String> getHandledTransactors() { return handledTransactors; } public Collection<String> getAllHandleTransactors() { return allHandleTransactors; } }