package com.norteksoft.wf.base.utils;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.acs.entity.organization.Workgroup;
import com.norteksoft.acs.service.authorization.BusinessSystemManager;
import com.norteksoft.acs.service.organization.UserManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.Department;
import com.norteksoft.product.api.entity.Role;
import com.norteksoft.product.api.entity.User;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.wf.base.enumeration.TextOperator;
public class UserUtil {
/**
* 判断用户是不是在部门里,如果在返回ture;否则,返回false。
* @param companyId
* @param loginName
* @param departmentName
* @return 用户在部门里,返回ture;否则,返回false。
*/
public static boolean userInDepartment(Long companyId,String loginName,String departmentName){
if(ContextUtils.getCompanyId()==null){
ThreadParameters parameters=new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
}
List<Department> departments = ApiFactory.getAcsService().getDepartments(loginName);
for (Department department : departments) {
if(department.getName().equals(departmentName)){
return true;
}
}
return false;
}
/**
* 判断用户是不是拥有某权限,如果有返回ture;否则,返回false。
* @param companyId
* @param loginName
* @param departmentName
* @return 用户拥有某权限,返回ture;否则,返回false。
*/
public static boolean userHaveRole(Long companyId,String loginName,String roleName){
//获得子系统的id集合
BusinessSystemManager businessSystemManager = (BusinessSystemManager)ContextUtils.getBean("businessSystemManager");
List<Long> subSystemIds=businessSystemManager.getSystemIdsByParentCode(ContextUtils.getSystemCode());
if(ContextUtils.getCompanyId()==null){
ThreadParameters parameters=new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
}
Set<Role> roles = ApiFactory.getAcsService().getRolesByUser(loginName);
for (Role role : roles) {
if(role.getName().equals(roleName)){
boolean result = validateRole(role,subSystemIds);
if(result){
return result;
}else{
continue;
}
}
}
return false;
}
private static boolean validateRole(Role role,List<Long> subSystemIds){
BusinessSystem system = role.getBusinessSystem();
if(system!=null){
if(subSystemIds.contains(system.getId())){//但前系统是子系统,且角色所在的系统包含在子系统集合中
return true;
}else{
if(subSystemIds.size()<=0){//当前系统不是子系统
if(ContextUtils.getSystemId().equals(system.getId())){
return true;
}
}
}
}
return false;
}
/**
* 判断用户是不是在工作组里,如果在返回ture;否则,返回false。
* @param companyId
* @param loginName
* @param departmentName
* @return 用户在工作组里,返回ture;否则,返回false。
*/
public static boolean userInWorkGroup(Long companyId,String loginName,String workGroupName){
if(ContextUtils.getCompanyId()==null){
ThreadParameters parameters=new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
}
List<com.norteksoft.product.api.entity.Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroupsByUser(loginName);
for (com.norteksoft.product.api.entity.Workgroup workGroup : workGroups) {
if(workGroup.getName().equals(workGroupName)){
return true;
}
}
return false;
}
/**
* 解析用户是否满足条件 ,判断条件的值有3中来源,分别为组织结构中、表单字段中和标准值
* ${currentTransactorName} operator.text.et '吴荣[wurong]'
* ${currentTransactorName} operator.text.et '${documentCreatorName}'
* ${currentTransactorName} operator.text.et '${field[姓名[name]]}
*/
public static boolean parseUser(String atomicExpress,String loginName){
if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) {
String userLoginName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return !loginName.equals(userLoginName);
}else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){
String userLoginName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return loginName.equals(userLoginName);
}
return false;
}
/**
* 解析用户是否拥有某角色
*/
public static boolean parseRole(String atomicExpress,String loginName){
if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) {
String roleName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return !userHaveRole(ContextUtils.getCompanyId(), loginName, roleName);
}else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){
String roleName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return userHaveRole(ContextUtils.getCompanyId(), loginName, roleName);
}
return false;
}
/**
* 解析用户和部门的关系
*/
public static boolean parseDepartment(String atomicExpress,String loginName){
if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) {
String departmentName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return !userInDepartment(ContextUtils.getCompanyId(), loginName, departmentName);
}else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){
String departmentName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return userInDepartment(ContextUtils.getCompanyId(), loginName, departmentName);
}
return false;
}
/**
* 解析用户和工作组的关系
*/
public static boolean parseWorkGroup(String atomicExpress,String loginName){
if(StringUtils.contains(atomicExpress, TextOperator.NET.getCode())) {
String workGroupName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return !userInWorkGroup(ContextUtils.getCompanyId(), loginName, workGroupName);
}else if(StringUtils.contains(atomicExpress, TextOperator.ET.getCode())){
String workGroupName = StringUtils.substringBetween(atomicExpress, "'", "'").trim();
return userInWorkGroup(ContextUtils.getCompanyId(), loginName, workGroupName);
}
return false;
}
public static Set<String> getUserExceptLoginName(String loginName){
return ApiFactory.getAcsService().getLoginNamesExclude(loginName);
}
public static Set<String> getUsersExceptRoleName(Long systemId,String roleName){
Set<String> userNames = new HashSet<String>();
for(User user: ApiFactory.getAcsService().getUsersWithoutRoleName(systemId,roleName)){
userNames.add(user.getLoginName());
}
return userNames;
}
public static Set<String> getUsersExceptRoleName(String roleName,Long systemId,Long companyId){
Set<String> userNames = new HashSet<String>();
for(User user: ApiFactory.getAcsService().getUsersWithoutRoleName(systemId,roleName)){
userNames.add(user.getLoginName());
}
return userNames;
}
public static Set<String> getUsersByRoleName( Long systemId,String roleName){
Set<String> userNames = new HashSet<String>();
for(User user: ApiFactory.getAcsService().getUsersByRoleName(systemId,roleName)){
userNames.add(user.getLoginName());
}
return userNames;
}
public static Set<String> getUsersByRoleName( String roleName,Long systemId,Long companyId){
Set<String> userNames = new HashSet<String>();
for(User user: ApiFactory.getAcsService().getUsersByRoleName(systemId,roleName)){
userNames.add(user.getLoginName());
}
return userNames;
}
public static List<Department> getDepartmentsByUser(String loginName){
return ApiFactory.getAcsService().getDepartments(loginName);
}
public static Department getDepartmentByName(String name){
return ApiFactory.getAcsService().getDepartmentByName(name);
}
public static Set<String> getUsersNotInDepartment(Set<Department> departmentSet){
Set<Department> allDepartment = new HashSet<Department>(ApiFactory.getAcsService().getDepartments());
allDepartment.removeAll(departmentSet);
return getUsersByDepartment(allDepartment);
}
public static Set<String> getUsersByDepartment(Set<Department> departmentSet){
Set<String> userNames = new HashSet<String>();
for(Department department:departmentSet){
userNames.addAll(getUserLoginName(ApiFactory.getAcsService().getUsersByDepartmentId(department.getId())));
}
return userNames;
}
public static Set<String> getUserLoginName(Collection<User> users){
Set<String> userNames = new HashSet<String>();
for(User user : users){
userNames.add(user.getLoginName());
}
return userNames;
}
public static Set<String> getUsersNotInWorkGroup(Set<Workgroup> workgroupSet){
UserManager userManager = (UserManager)ContextUtils.getBean("userManager");
Set<Workgroup> allWorkGroup = new HashSet<Workgroup>(userManager.getWorkgroups());
allWorkGroup.removeAll(workgroupSet);
return getUsersByWorkGroup(allWorkGroup);
}
public static Set<String> getUsersByWorkGroup(Set<Workgroup> workgroupSet){
Set<String> userNames = new HashSet<String>();
for(Workgroup workGroup:workgroupSet){
userNames.addAll(getUserLoginName(ApiFactory.getAcsService().getUsersByWorkgroupId(workGroup.getId())));
}
return userNames;
}
public static Workgroup getWorkGroupByName(String workGroupName){
UserManager userManager = (UserManager)ContextUtils.getBean("userManager");
return userManager.getWorkgroupByName(workGroupName);
}
public static List<Workgroup> getWorkGroupsByUser(String loginName){
UserManager userManager = (UserManager)ContextUtils.getBean("userManager");
return userManager.getWorkgroupsByUser(loginName);
}
}