package com.norteksoft.acs.service.authorization;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.acs.base.enumeration.BranchDataType;
import com.norteksoft.acs.base.orm.hibernate.SimpleHibernateTemplate;
import com.norteksoft.acs.base.utils.log.LogUtilDao;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.acs.entity.authorization.Function;
import com.norteksoft.acs.entity.authorization.FunctionGroup;
import com.norteksoft.acs.entity.authorization.Role;
import com.norteksoft.acs.entity.authorization.RoleDepartment;
import com.norteksoft.acs.entity.authorization.RoleFunction;
import com.norteksoft.acs.entity.authorization.RoleUser;
import com.norteksoft.acs.entity.authorization.RoleWorkgroup;
import com.norteksoft.acs.entity.organization.Company;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.entity.organization.DepartmentUser;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.acs.entity.organization.Workgroup;
import com.norteksoft.acs.entity.organization.WorkgroupUser;
import com.norteksoft.acs.service.AcsUtils;
import com.norteksoft.acs.service.organization.CompanyManager;
import com.norteksoft.mms.module.entity.Menu;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.PropUtils;
import com.norteksoft.product.util.tree.ZTreeNode;
/**
* 角色管理
*/
@Service
@Transactional
public class RoleManager {
private static String COMPANY_ID = "company.id";
private static String DELETED = "deleted";
private static String COMPANYID = "companyId";
private static String ROLE_ID = "role.id";
private static String ACS = "acs";
private static String ACS_SYSTEM_ADMIN="acsSystemAdmin";//系统管理员角色编码
private static String ACS_SECURITY_ADMIN="acsSecurityAdmin";//安全管理员角色编码
private static String ACS_AUDIT_ADMIN="acsAuditAdmin";//审计管理员角色编码
private static String ACS_BRANCH_ADMIN="acsBranchAdmin";//分支机构管理员角色编码
private SimpleHibernateTemplate<Role, Long> roleDao;
private SimpleHibernateTemplate<Function, Long> functionDao;
private SimpleHibernateTemplate<RoleFunction, Long> role_fDao;
private SimpleHibernateTemplate<RoleDepartment, Long> roleDepartmentDao;
private SimpleHibernateTemplate<RoleUser, Long> roleUserDao;
private SimpleHibernateTemplate<Workgroup, Long> workGroupDao;
private SimpleHibernateTemplate<RoleWorkgroup, Long> role_wDao;// FunctionGroup
private SimpleHibernateTemplate<FunctionGroup, Long> functionGroupDao;
private SimpleHibernateTemplate<User, Long> userDao;
private SimpleHibernateTemplate<Department, Long> departmentDao;
private SimpleHibernateTemplate<Menu, Long> menuDao;
private LogUtilDao logUtilDao;
private Long companyId;
@Autowired
private AcsUtils acsUtils;
@Autowired
private CompanyManager companyManager;
public Long getCompanyId() {
if (companyId == null) {
return ContextUtils.getCompanyId();
} else
return companyId;
}
public Long getSystemIdByCode(String code) {
return acsUtils.getSystemsByCode(code).getId();
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
menuDao = new SimpleHibernateTemplate<Menu, Long>(sessionFactory,Menu.class);
roleDao = new SimpleHibernateTemplate<Role, Long>(sessionFactory,
Role.class);
functionDao = new SimpleHibernateTemplate<Function, Long>(
sessionFactory, Function.class);
role_fDao = new SimpleHibernateTemplate<RoleFunction, Long>(
sessionFactory, RoleFunction.class);
roleDepartmentDao = new SimpleHibernateTemplate<RoleDepartment, Long>(
sessionFactory, RoleDepartment.class);
roleUserDao = new SimpleHibernateTemplate<RoleUser, Long>(
sessionFactory, RoleUser.class);
workGroupDao = new SimpleHibernateTemplate<Workgroup, Long>(
sessionFactory, Workgroup.class);
role_wDao = new SimpleHibernateTemplate<RoleWorkgroup, Long>(
sessionFactory, RoleWorkgroup.class);
functionGroupDao = new SimpleHibernateTemplate<FunctionGroup, Long>(
sessionFactory, FunctionGroup.class);
userDao = new SimpleHibernateTemplate<User, Long>(sessionFactory,
User.class);
departmentDao = new SimpleHibernateTemplate<Department, Long>(sessionFactory,
Department.class);
logUtilDao = new LogUtilDao(sessionFactory);
}
public Role getRole(Long id) {
return roleDao.get(id);
}
public Role getRole(Long systemId,String code) {
List<Role> roles=roleDao.findList("from Role role where role.code = ? and role.deleted = ? and role.businessSystem.id=? ", code,false,systemId);
if(roles!=null && roles.size()>0){
return roles.get(0);
}else{
return null;
}
}
public Role getRoleByCode(String code) {
return (Role)roleDao.findUnique(
"select role from Role role where role.code = ? and role.deleted = ?",
code,false);
}
public List<Role> getRolesByCodes(String... codes){
if(codes == null || codes.length==0) return new ArrayList<Role>();
Object[] prmts = new Object[codes.length+1];
prmts[0] = Boolean.FALSE;
System.arraycopy(codes, 0, prmts, 1, codes.length);
StringBuilder hql = new StringBuilder("from Role role where role.deleted=?");
for(int i=0;i<codes.length;i++){
if(i == 0){
hql.append(" and (role.code = ?");
}else{
hql.append(" or role.code = ?");
}
if(i == (codes.length-1)) hql.append(")");
}
return roleDao.findList(hql.toString(), prmts);
}
public void saveRoleUser(RoleUser roleUser){
roleUserDao.save(roleUser);
}
public Page<Role> getAllRoles(Page<Role> page, Long businessSystemId) {
return roleDao.find(page,
"select role from Role role join role.businessSystem bs where bs.id = ? and role.deleted=? " +
"and (role.companyId is null or role.companyId=?) order by role.weight desc ",
businessSystemId, false, ContextUtils.getCompanyId());
}
public List<Role> getAllRoles() {
return roleDao.findAll();
}
public void saveRole(Role role) {
roleDao.save(role);
}
public void deleteRole(Long id) {
Role role = roleDao.get(id);
if("acsSystemAdmin".equals(role.getCode()) ||
"acsSecurityAdmin".equals(role.getCode()) ||
"acsAuditAdmin".equals(role.getCode())) return;
roleDao.delete(role);
}
public void deleteRoles(List<Long> ids){
String logSign="";//该字段只是为了标识日志信息:角色名称
for(Long id : ids){
Role role=getRole(id);
if(StringUtils.isNotEmpty(logSign)){
logSign+=",";
}
logSign+=role.getName();
deleteRole(id);
}
if(StringUtils.isNotEmpty(logSign))
logUtilDao.debugLog("角色管理", "删除角色:" + logSign ,getSystemIdByCode(ACS));
}
public void addSubRole(Role role, Long id) {
Role roleEntity = roleDao.get(id);
role.setParentRole(roleEntity);
role.setCompanyId(getCompanyId());
role.setBusinessSystem(roleEntity.getBusinessSystem());
roleDao.save(role);
}
public Page<Function> roleToFunctionList(Page<Function> functionpage,
Function entity) {
if (entity != null) {
String functionName = entity.getName();
String functionId = entity.getCode();
if (functionName != null && !"".equals(functionName)
&& functionId != null && !"".equals(functionId)) {
return functionDao.findByCriteria(functionpage, Restrictions
.like("name", "%" + entity.getName()
+ "%"), Restrictions.like("code", "%"
+ entity.getCode() + "%"));
}
if (functionName != null && !"".equals(functionName)) {
return functionDao.findByCriteria(functionpage, Restrictions
.like("name", "%" + entity.getName() + "%"));
}
if (functionId != null && !"".equals(functionId)) {
return functionDao
.findByCriteria(functionpage, Restrictions.like(
"code", "%" + entity.getCode() + "%"));
}
}
return functionDao.findByCriteria(functionpage);
}
public Page<FunctionGroup> roleToFunctionList2(
Page<FunctionGroup> functionpage, Function entity, Long sysId) {
return functionGroupDao.findByCriteria(functionpage, Restrictions.eq(
"businessSystem.id", sysId), Restrictions.eq(DELETED, false));
}
public Page<FunctionGroup> roleRomoveFunctionList2(
Page<FunctionGroup> functionpage, Function entity, Long sysId,
Long roleId) {
String hql = "select distinct fung from FunctionGroup fung "
+ "join fung.function fun join fun.roleFunctions r_f "
+ "where r_f.role.id=? and r_f.companyId=? and fun.deleted=? "
+ "and r_f.deleted=? and fung. deleted=? and fung.businessSystem.id=?";
return functionGroupDao.find(functionpage, hql, roleId, getCompanyId(),
false, false, false, sysId);
}
public List<Long> getFunctionIds(Long roleId, Long sysId) {
List<Long> FunctionIds = new ArrayList<Long>();
List<RoleFunction> role_Functions = role_fDao.findByCriteria(
Restrictions.eq("role.id", roleId), Restrictions.eq("deleted", false));
for (RoleFunction role_Function : role_Functions) {
FunctionIds.add(role_Function.getFunction().getId());
}
return FunctionIds;
}
public List<Function> getFunctions(Long roleId) {
List<Function> Functions = new ArrayList<Function>();
List<RoleFunction> role_Functions = role_fDao.findByCriteria(
Restrictions.eq("role.id", roleId), Restrictions.eq("deleted", false));
for (RoleFunction role_Function : role_Functions) {
Functions.add(role_Function.getFunction());
}
return Functions;
}
public void roleAddFunction(Long roleId,String fIds,Integer isAdd){
Role role = roleDao.get(roleId);
String[] function = fIds.split(",");
if(isAdd.equals(0)){
RoleFunction role_f = null;
for (int i=0;i< function.length;i++) {
role_f = new RoleFunction();
role_f.setRole(role);
role_f.setFunction(functionDao.get(Long.parseLong(function[i])));
role_f.setCompanyId(getCompanyId());
role_fDao.save(role_f);
}
logUtilDao.debugLog("角色管理", role.getName()+"添加资源" ,getSystemIdByCode(ACS));
}else if(isAdd.equals(1)){
Long[] fs=new Long[function.length];
for(int i=0;i<function.length;i++){
fs[i]=Long.parseLong(function[i]);
}
List<RoleFunction> funList = null;
funList = role_fDao.findByCriteria( Restrictions.in("function.id", fs),Restrictions.eq("role.id", roleId), Restrictions.eq("deleted", false));
for (RoleFunction role_Function : funList) {
role_fDao.delete(role_Function);
}
logUtilDao.debugLog("角色管理", role.getName()+"删除资源" ,getSystemIdByCode(ACS));
}
}
/**
* 角色中添加部门 0 为添加, 1 为移除
*/
public void addDepartmentsToRole(Long roleId, List<Long> departmentsIds,
Integer isAdd) {
Role role = roleDao.get(roleId);
RoleDepartment roleDepartment = null;
if (isAdd == 0) {
Department department = null;
for (Long id : departmentsIds) {
department = new Department();
department.setId(id);
roleDepartment = new RoleDepartment();
roleDepartment.setDepartment(department);
roleDepartment.setRole(role);
roleDepartment.setCompanyId(getCompanyId());
roleDepartmentDao.save(roleDepartment);
}
} else if (isAdd == 1) {
List<RoleDepartment> rds = roleDepartmentDao.findByCriteria(
Restrictions.eq(ROLE_ID, roleId), Restrictions.in(
"department.id", departmentsIds));
for (RoleDepartment rd : rds) {
rd.setDeleted(true);
roleDepartmentDao.save(rd);
}
}
}
/**
* 角色中移除部门
*/
public void deleteDepartmentsFromRole(Long roleId, List<Long> departmentsIds) {
List<RoleDepartment> roleDepartments = roleDepartmentDao
.findByCriteria(Restrictions.eq(ROLE_ID, roleId),
Restrictions.eq(COMPANYID, getCompanyId()));
for (RoleDepartment rd : roleDepartments) {
if (departmentsIds.contains(rd.getDepartment().getId())) {
roleDepartmentDao.delete(rd.getId());
}
}
}
public List<Long> getCheckedDepartmentByRole(Long roleId) {
List<RoleDepartment> roleDepartmentList = roleDepartmentDao
.findByCriteria(Restrictions.eq(ROLE_ID, roleId),
Restrictions.eq(COMPANYID, getCompanyId()),
Restrictions.eq(DELETED, false));
List<Long> checkDepartments = new ArrayList<Long>();
for (RoleDepartment roleDepartment : roleDepartmentList) {
checkDepartments.add(roleDepartment.getDepartment().getId());
}
return checkDepartments;
}
public void addUsersToRole(Long roleId, List<Long> userIds, Integer isAdd) {
Set<Long> uIds = new HashSet<Long>();
uIds.addAll(userIds);
Role role = roleDao.get(roleId);
RoleUser roleUser = null;
if (isAdd == 0) {
User user = null;
for (Long id : uIds) {
user = new User();
user.setId(id);
roleUser = new RoleUser();
roleUser.setRole(role);
roleUser.setUser(user);
roleUser.setCompanyId(getCompanyId());
roleUserDao.save(roleUser);
}
} else if (isAdd == 1) {
List<RoleUser> roleUsers = roleUserDao.findByCriteria(Restrictions
.in("user.id", uIds), Restrictions.eq(ROLE_ID, roleId),
Restrictions.eq(COMPANYID, getCompanyId()));
for (RoleUser ru : roleUsers) {
ru.setDeleted(true);
roleUserDao.save(ru);
}
}
}
/**
* 获取具有该角色的用户Id
*/
public List<Long> getCheckedUserByRole(Long roleId) {
List<RoleUser> roleUserList = roleUserDao.findByCriteria(Restrictions
.eq(ROLE_ID, roleId), Restrictions.eq(COMPANYID,
getCompanyId()), Restrictions.eq(DELETED, false));
List<Long> checkUsers = new ArrayList<Long>();
for (RoleUser roleUser : roleUserList) {
checkUsers.add(roleUser.getUser().getId());
}
return checkUsers;
}
/**
* 获取具有该角色的用户
*/
@SuppressWarnings("unchecked")
public List<User> getCheckedUsersByRole(Long roleId) {
return userDao.find(
"select distinct u from User u join u.roleUsers ru join ru.role r where u.deleted=? and ru.deleted=? and ru.consigner is null and r.deleted=? and r.id=? and u.companyId=? order by u.weight desc",
false, false, false, roleId, getCompanyId());
}
/**
* 获取具有该角色的工作组
*/
public List<Workgroup> getCheckedWorkgroupByRole(Long roleId) {
List<RoleWorkgroup> roleWorkgroupList = role_wDao.findByCriteria(Restrictions
.eq(ROLE_ID, roleId), Restrictions.eq(COMPANYID,
getCompanyId()), Restrictions.eq(DELETED, false));
List<Workgroup> checkUsers = new ArrayList<Workgroup>();
for (RoleWorkgroup rw : roleWorkgroupList) {
if(rw.getWorkgroup().isDeleted()) continue;
checkUsers.add(rw.getWorkgroup());
}
return checkUsers;
}
public Page<Workgroup> roleToWorkGroupList(Page<Workgroup> page,
Workgroup entity) {
if (entity != null) {
String workGroupCode = entity.getCode();
String workGroupName = entity.getName();
if (workGroupCode != null && !"".equals(workGroupCode)
&& workGroupName != null && !"".equals(workGroupName)) {
return workGroupDao.findByCriteria(page, Restrictions.like(
"code", "%" + workGroupCode + "%"),
Restrictions.like("name", "%" + workGroupName
+ "%"), Restrictions.eq(DELETED, false),
Restrictions.eq(COMPANY_ID, getCompanyId()));
}
if (workGroupCode != null && !"".equals(workGroupCode)) {
return workGroupDao.findByCriteria(page, Restrictions.like(
"code", "%" + workGroupCode + "%"),
Restrictions.eq(DELETED, false), Restrictions.eq(
COMPANY_ID, getCompanyId()));
}
if (workGroupName != null && !"".equals(workGroupName)) {
return workGroupDao.findByCriteria(page, Restrictions.like(
"name", "%" + workGroupName + "%"),
Restrictions.eq(DELETED, false), Restrictions.eq(
COMPANY_ID, getCompanyId()));
}
}
return workGroupDao.findByCriteria(page, Restrictions.eq(DELETED,
false), Restrictions.eq(COMPANY_ID, getCompanyId()));
}
public Page<Workgroup> roleRomoveWorkGroupList(Page<Workgroup> page,
Workgroup entity, Long roleId) {
String hql = "select work from WorkGroup work join work.roleWorkgroups r_w where r_w.role.id=? and r_w.companyId=? and work.deleted=? and r_w.deleted=? ";
if (entity != null) {
String workGroupCode = entity.getCode();
String workGroupName = entity.getName();
StringBuilder hqL = new StringBuilder(hql);
if (workGroupCode != null && !"".equals(workGroupCode)
&& workGroupName != null && !"".equals(workGroupName)) {
hqL.append(" and work.code like ? ");
hqL.append(" and work.name like ? ");
return workGroupDao.find(page, hql, roleId, getCompanyId(),
false, false, "%" + workGroupCode + "%", "%"
+ workGroupName + "%");
}
if (workGroupCode != null && !"".equals(workGroupCode)) {
hqL.append(" and work.code like ? ");
return workGroupDao.find(page, hql, roleId, getCompanyId(),
false, false, "%" + workGroupCode + "%");
}
if (workGroupName != null && !"".equals(workGroupName)) {
hqL.append(" and work.name like ? ");
return workGroupDao.find(page, hql, roleId, getCompanyId(),
false, false, "%" + workGroupName + "%");
}
}
return workGroupDao.find(page, hql, roleId, getCompanyId(), false, false);
}
public List<Long> getWorkGroupIds(Long roleId) {
List<Long> workGroupIds = new ArrayList<Long>();
List<RoleWorkgroup> role_WorkGroups = role_wDao.findByCriteria(
Restrictions.eq(ROLE_ID, roleId), Restrictions.eq(DELETED,
false), Restrictions.eq(COMPANYID, getCompanyId()));
for (RoleWorkgroup role_WorkGroup : role_WorkGroups) {
workGroupIds.add(role_WorkGroup.getWorkgroup().getId());
}
return workGroupIds;
}
public void roleAddWorkGroup(Long roleId, List<Long> workGroupIds,
Integer isAdd) {
Role role = getRole(roleId);
if (isAdd == 0) {
RoleWorkgroup role_WorkGroup;
for (Long workId : workGroupIds) {
role_WorkGroup = new RoleWorkgroup();
role_WorkGroup.setRole(role);
role_WorkGroup.setWorkgroup(workGroupDao.get(workId));
role_WorkGroup.setCompanyId(getCompanyId());
role_wDao.save(role_WorkGroup);
}
}
if (isAdd == 1) {
List<RoleWorkgroup> role_WorkGroups = role_wDao.findByCriteria(
Restrictions.in("workgroup.id", workGroupIds), Restrictions
.eq(ROLE_ID, roleId), Restrictions.eq(
COMPANYID, getCompanyId()), Restrictions.eq(
DELETED, false));
for (RoleWorkgroup role_WorkGroup : role_WorkGroups) {
role_WorkGroup.setDeleted(true);
role_wDao.save(role_WorkGroup);
}
}
}
public Page<Role> getRolesByRoleGroup(Page<Role> page, Long roleGroupId) {
return roleDao.findByCriteria(page, Restrictions.eq("roleGroup.id", roleGroupId));
}
/**
* 查询公司里面的所有的角色(含标准角色和自定义角色)
*/
public List<Role> getAllRolesByCompany() {
List<Role> roles = roleDao.findAll();
List<Role> customRoles = roleDao.findByCriteria(Restrictions.eq(COMPANY_ID, getCompanyId()));
roles.addAll(customRoles);
return roles;
}
public SimpleHibernateTemplate<Role, Long> getRoleDao() {
return roleDao;
}
public SimpleHibernateTemplate<RoleFunction, Long> getRole_fDao() {
return role_fDao;
}
public SimpleHibernateTemplate<RoleWorkgroup, Long> getRole_wDao() {
return role_wDao;
}
public SimpleHibernateTemplate<Workgroup, Long> getWorkGroupDao() {
return workGroupDao;
}
public SimpleHibernateTemplate<Function, Long> getFunctionDao() {
return functionDao;
}
public SimpleHibernateTemplate<FunctionGroup, Long> getFunctionGroupDao() {
return functionGroupDao;
}
/**
* 角色中移除用户、部门、工作组
* @param roleId
* @param uIds
* @param dIds
* @param wIds
*/
public void removeUDWFromRoel(Long roleId, List<Long> uIds, List<Long> dIds, List<Long> wIds){
Role role=getRole(roleId);
//移除用户
boolean isFirst = true;
String roleName = null;
StringBuilder logMsg = null;
if(uIds != null && uIds.size() > 0){
List<RoleUser> roleUsers = roleUserDao.findByCriteria(Restrictions
.in("user.id", uIds), Restrictions.eq(ROLE_ID, roleId),
Restrictions.eq(COMPANYID, getCompanyId()),Restrictions.isNull("consigner"));
logMsg = new StringBuilder();
for (RoleUser ru : roleUsers) {
if(ru.isDeleted())continue;
ru.setDeleted(true);
roleUserDao.save(ru);
if(!isFirst){ logMsg.append(",");}
if(isFirst){ roleName = ru.getRole().getName(); isFirst = false; }
logMsg.append(ru.getUser().getName());
}
isFirst = true;
if(logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "移除用户:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
}
//移除部门
if(dIds != null && dIds.size() > 0){
List<RoleDepartment> rds = roleDepartmentDao.findByCriteria(
Restrictions.eq(ROLE_ID, roleId), Restrictions.in("department.id", dIds));
logMsg = new StringBuilder();
for (RoleDepartment rd : rds) {
if(rd.isDeleted())continue;
rd.setDeleted(true);
roleDepartmentDao.save(rd);
if(!isFirst){ logMsg.append(",");}
if(isFirst){ roleName = rd.getRole().getName(); isFirst = false;}
logMsg.append(rd.getDepartment().getName());
}
isFirst = true;
if(logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "移除部门:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
}
//移除工作组
if(wIds != null && wIds.size() > 0){
List<RoleWorkgroup> role_WorkGroups = role_wDao.findByCriteria(
Restrictions.in("workgroup.id", wIds), Restrictions
.eq(ROLE_ID, roleId), Restrictions.eq(
COMPANYID, getCompanyId()), Restrictions.eq(
DELETED, false));
logMsg = new StringBuilder();
for (RoleWorkgroup role_WorkGroup : role_WorkGroups) {
if(role_WorkGroup.isDeleted())continue;
role_WorkGroup.setDeleted(true);
role_wDao.save(role_WorkGroup);
if(!isFirst){ logMsg.append(","); }
if(isFirst){ roleName = role_WorkGroup.getRole().getName(); isFirst = false;}
logMsg.append(role_WorkGroup.getWorkgroup().getName());
}
if(logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "移除工作组:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
}
}
public String addUDWFromRoel(Role role, List<Long> userIds,
List<Long> departmentsIds, List<Long> workGroupIds,String allInfos) {
StringBuilder result=new StringBuilder();
//=============== 添加用户 ===================
result.append(roleAddUsers(role, userIds, departmentsIds, workGroupIds, allInfos));
//=============== 添加部门 ===================
roleAddDepartments(role, userIds, departmentsIds, workGroupIds, allInfos);
//=============== 添加工作组 ===================
roleAddWorkgroups(role, userIds, departmentsIds, workGroupIds, allInfos);
if(StringUtils.isEmpty(result.toString())){
result.append("保存成功。");
}
return result.toString();
}
public String roleAddUsers(Role role, List<Long> userIds,
List<Long> departmentsIds, List<Long> workGroupIds,String allInfos){
StringBuilder result=new StringBuilder();
StringBuilder logMsg = new StringBuilder();
StringBuilder logErrMsg = new StringBuilder();
StringBuilder logIsDefaultAdminMsg = new StringBuilder();
StringBuilder haveRoleMsg = new StringBuilder();
boolean isFirst = true;
RoleUser roleUser = null;
User user = null;
if("user_allDepartment".equals(allInfos) || "user_company".equals(allInfos) ||"user_usersNotIndept".equals(allInfos) ){
List<User> users =null ;
boolean noDeptUser = false;
if("user_allDepartment".equals(allInfos) || "user_company".equals(allInfos)){
String authoritySetting = PropUtils.getProp("applicationContent.properties", "authority.setting.alone");
// if(StringUtils.isEmpty(authoritySetting)||authoritySetting.equals("true")){//设置了三员独立
// users= queryAllUserWithoutAdmin();
// }else{
users= queryAllUser();
// }
logMsg.append("所有用户");
}else{
users = getUsersWithoutDepartment();
noDeptUser = true;
}
for(User us:users){
userIds.add(us.getId());
if(noDeptUser){
if(!isFirst) logMsg.append(",");
logMsg.append(us.getName());
isFirst = false;
}
}
}
boolean needMsg = (logMsg.length() == 0);
for (Long id : userIds) {
boolean flag=checkRoleUser(id,role.getId());
User myuser=userDao.get(id);
if(!flag){
String authoritySetting = PropUtils.getProp("applicationContent.properties", "authority.setting.alone");
boolean sign=false;
if(StringUtils.isEmpty(authoritySetting)||authoritySetting.equals("true")){//设置了三员独立
sign=!hasAdminRole(role,myuser);
}else{
sign=true;
}
if(sign){
user = new User();
user.setId(id);
roleUser = new RoleUser();
roleUser.setRole(role);
roleUser.setUser(user);
roleUser.setCompanyId(getCompanyId());
roleUserDao.save(roleUser);
if(needMsg){
if(!isFirst){ logMsg.append(","); }
logMsg.append(userDao.get(id).getName());
isFirst = false;
}
}else{
logErrMsg.append(myuser.getName()).append(",");
}
}else{
haveRoleMsg.append(myuser.getName()).append(",");
}
}
boolean logSign=true;//该字段只是为了标识日志信息
if(StringUtils.isNotEmpty(logErrMsg.toString())){
result.append(logErrMsg.substring(0, logErrMsg.lastIndexOf(","))).append("已经有了管理员的权限。");
logMsg.append(logErrMsg.substring(0, logErrMsg.lastIndexOf(","))).append("已经有了管理员的权限。");
logSign=false;
}
if(StringUtils.isNotEmpty(haveRoleMsg.toString())){
result.append(haveRoleMsg.substring(0, haveRoleMsg.lastIndexOf(","))).append(" 已经有了 ").append(role.getName()).append(" 的权限。");
logMsg.append(haveRoleMsg.substring(0, haveRoleMsg.lastIndexOf(","))).append(" 已经有了 ").append(role.getName()).append(" 的权限。");
logSign=false;
}
if(logSign && logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "添加用户:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
return result.toString();
}
private List<User> getUsersWithoutDepartment(){
StringBuilder sqlString = new StringBuilder();
sqlString.append("SELECT u.* FROM ACS_USERINFO ");
sqlString.append("inner join ACS_USER u on ACS_USERINFO.FK_USER_ID=u.id ");
sqlString.append("LEFT OUTER JOIN ");
sqlString.append("(SELECT * FROM ACS_DEPARTMENT_USER WHERE ACS_DEPARTMENT_USER.DELETED = 0)");
sqlString.append(" DEPT_USER ON ACS_USERINFO.FK_USER_ID = DEPT_USER.FK_USER_ID ");
sqlString.append("WHERE ACS_USERINFO.DELETED=0 AND ACS_USERINFO.FK_COMPANY_ID = ? ");
sqlString.append("AND DEPT_USER.ID IS NULL ORDER BY ACS_USERINFO.ID DESC ");
return userDao.findByJdbc(sqlString.toString(), ContextUtils.getCompanyId());
}
private boolean hasAdminRole(Role role,User user){
String authoritySetting = PropUtils.getProp("applicationContent.properties", "authority.setting.alone");
if(StringUtils.isEmpty(authoritySetting)||authoritySetting.equals("true")){//设置了三员独立
String userRoles=getRoleUsersIncludeTrustedRole(user);
if(ACS_SYSTEM_ADMIN.equals(role.getCode())||ACS_AUDIT_ADMIN.equals(role.getCode())||ACS_SECURITY_ADMIN.equals(role.getCode())){
//如果是系统管理员
if(userRoles.contains(ACS_SYSTEM_ADMIN)){
return true;
}
//如果是安全管理员
if(userRoles.contains(ACS_SECURITY_ADMIN)){
return true;
}
//如果是审计管理员
if(userRoles.contains(ACS_AUDIT_ADMIN)){
return true;
}
}
return false;
}else{
return false;
}
}
//判断用户是否具有系统管理员
public boolean hasSystemAdminRole(Long userId){
return hasSystemAdminRole(userDao.get(userId));
}
//判断用户是否具有三员的角色
public boolean hasAdminRole(Long userId){
String userRoles=getRoleUsersIncludeTrustedRole(userDao.get(userId));
//如果是系统管理员
if(userRoles.contains(ACS_SYSTEM_ADMIN)){
return true;
}
if(userRoles.contains(ACS_SECURITY_ADMIN)){
return true;
}
if(userRoles.contains(ACS_AUDIT_ADMIN)){
return true;
}
return false;
}
/*
* 获得用户的所有角色,包括委托的权限
*/
public String getRoleUsersIncludeTrustedRole(User user){
if(user == null) return "";
Set<com.norteksoft.acs.entity.authorization.Role> roles = new HashSet<com.norteksoft.acs.entity.authorization.Role>();
// 用户具有的角色
Set<RoleUser> roleUsers = user.getRoleUsers();
for(RoleUser ru : roleUsers){
if(ru.isDeleted()) continue;
// if(ru.getConsigner()!= null) continue;//是否是委托的权限
com.norteksoft.acs.entity.authorization.Role role = ru.getRole();
if(!role.isDeleted()) roles.add(role);
}
return getRolesIncludeTrustedRole(user,roles);
}
private String getRolesIncludeTrustedRole(User user,Set<com.norteksoft.acs.entity.authorization.Role> roles){
// 用户具有的部门拥有的角色
Set<DepartmentUser> departmentUsers = user.getDepartmentUsers();
for(DepartmentUser du : departmentUsers){
if(du.isDeleted() || du.getDepartment().isDeleted()) continue;
for(RoleDepartment rd : du.getDepartment().getRoleDepartments()){
if(!rd.isDeleted() && !rd.getRole().isDeleted()) roles.add(rd.getRole());
}
}
// 用户具有的分支机构拥有的角色
if(user.getSubCompanyId()!=null){
Set<RoleDepartment> rds=departmentDao.get(user.getSubCompanyId()).getRoleDepartments();
for(RoleDepartment rd : rds){
if(!rd.isDeleted() && !rd.getRole().isDeleted())roles.add(rd.getRole());
}
}
// 用户具有的工作组拥有的角色
Set<WorkgroupUser> workgroupUsers = user.getWorkgroupUsers();
for(WorkgroupUser wu : workgroupUsers){
if(wu.isDeleted() || wu.getWorkgroup().isDeleted()) continue;
for(RoleWorkgroup rw : wu.getWorkgroup().getRoleWorkgroups()){
if(!rw.isDeleted() && !rw.getRole().isDeleted()) roles.add(rw.getRole());
}
}
List< com.norteksoft.acs.entity.authorization.Role> roleList = new ArrayList<com.norteksoft.acs.entity.authorization.Role>();
roleList.addAll(roles);
//角色按权重排序
sortRole(roleList);
// 生成字符串形式
StringBuilder roleStrings = new StringBuilder();
for(com.norteksoft.acs.entity.authorization.Role role : roleList){
roleStrings.append(role.getCode()).append(",");
}
// 去掉最后一个逗号
if(roleStrings.lastIndexOf(",") != -1 && roleStrings.lastIndexOf(",") == roleStrings.length()-1){
roleStrings.replace(roleStrings.length()-1, roleStrings.length(), "");
}
return roleStrings.toString();
}
//角色按权重排序
private void sortRole(List<Role> roles){
Collections.sort(roles, new Comparator<Role>() {
public int compare(Role role1, Role role2) {
if(role1.getWeight()==null&&role2.getWeight()!=null)return 1;
if(role1.getWeight()!=null&&role2.getWeight()==null)return 0;
if(role1.getWeight()==null&&role2.getWeight()==null)return 0;
if(role1.getWeight()<role2.getWeight()){
return 1;
}
return 0;
}
});
}
private boolean isNotDefaultAdmin(User user){
Company company = companyManager.getCompany(user.getCompanyId());
String systemAdmin = company.getCode()+".systemAdmin";
String securityAdmin = company.getCode()+".securityAdmin";
String auditAdmin = company.getCode()+".auditAdmin";
if(user.getLoginName().equals(systemAdmin)
||user.getLoginName().equals(securityAdmin)
||user.getLoginName().equals(auditAdmin)){
return false;
}
return true;
}
private void roleAddDepartments(Role role, List<Long> userIds,
List<Long> departmentsIds, List<Long> workGroupIds,String allInfos){
StringBuilder logMsg = new StringBuilder();
boolean isFirst = true;
RoleDepartment roleDepartment = null;
Department department = null;
if("department_allDepartment".equals(allInfos) || "department_company".equals(allInfos)){
List<Department> depts = queryAllDepts();
for(Department dept:depts){
departmentsIds.add(dept.getId());
if(!isFirst){ logMsg.append(","); }
logMsg.append(dept.getName());
isFirst = false;
}
}
boolean needMsg = (logMsg.length() == 0);
for (Long id : departmentsIds) {
boolean flag=checkRoleDepartment(id,role.getId());
if(!flag){
department = new Department();
department.setId(id);
roleDepartment = new RoleDepartment();
roleDepartment.setDepartment(department);
roleDepartment.setRole(role);
roleDepartment.setCompanyId(getCompanyId());
roleDepartmentDao.save(roleDepartment);
if(needMsg){
if(!isFirst){ logMsg.append(","); }
logMsg.append(departmentDao.get(id).getName());
isFirst = false;
}
}
}
if(logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "添加部门:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
}
private void roleAddWorkgroups(Role role, List<Long> userIds,
List<Long> departmentsIds, List<Long> workGroupIds,String allInfos){
StringBuilder logMsg = new StringBuilder();
boolean isFirst = true;
RoleWorkgroup role_WorkGroup = null;
Workgroup wg = null;
if("workGroup_allWorkGroup".equals(allInfos) || "workGroup_company".equals(allInfos)){
List<Workgroup> workGroups = queryAllWorkGroups();
for(Workgroup workGroup:workGroups){
workGroupIds.add(workGroup.getId());
if(isFirst){ logMsg.append(","); isFirst = false;}
logMsg.append(workGroup.getName());
}
}
boolean needMsg = (logMsg.length() == 0);
for (Long workId : workGroupIds) {
boolean flag=checkRoleWokGroup(workId,role.getId());
if(!flag){
wg = new Workgroup();
wg.setId(workId);
role_WorkGroup = new RoleWorkgroup();
role_WorkGroup.setRole(role);
role_WorkGroup.setWorkgroup(wg);
role_WorkGroup.setCompanyId(getCompanyId());
role_wDao.save(role_WorkGroup);
if(needMsg){
if(!isFirst){ logMsg.append(",");}
logMsg.append(workGroupDao.get(workId).getName());
isFirst = false;
}
}
}
if(logMsg.length() != 0)
logUtilDao.debugLog("授权管理", role.getName()
+ "添加工作组:" + logMsg.toString() + "}",getSystemIdByCode(ACS));
}
/**
* 将角色分配给其他人
* @param anthorId
* @param roleIds
* @param companyId
*/
public void assignRolesToSomeone(Long someoneId,String[] roleIds,Long companyId,Long sourceUserId){
deleteAssignedAuthority(sourceUserId,someoneId,companyId);
for(int i=0;i<roleIds.length;i++){
if(!StringUtils.isEmpty(roleIds[i])){
if(roleIds[i].endsWith("/")){
roleIds[i] = roleIds[i].replace("/", "");
}
if((getRoleUserByRelation(someoneId, Long.parseLong(roleIds[i]), companyId))==null){
RoleUser roleUser = new RoleUser();
Role role = roleDao.get(Long.parseLong(roleIds[i]));
User user = userDao.get(someoneId);
roleUser.setRole(role);
roleUser.setUser(user);
roleUser.setCompanyId(companyId);
roleUser.setConsigner(sourceUserId);
roleUserDao.save(roleUser);
}
}
}
}
/**
* 按条件获取角色用户表数据
* @param userId
* @param roleId
* @param companyId
*/
public RoleUser getRoleUserByRelation(Long userId,Long roleId,Long companyId){
String hql = "FROM RoleUser ru WHERE ru.role.id=? AND ru.user.id=? AND ru.companyId=?";
return (RoleUser)roleUserDao.findUnique(hql, roleId,userId,companyId);
}
/**
* 删除由别人分配的权限
* @param sourceId
* @param userId
* @param companyId
*/
@SuppressWarnings("unchecked")
public void deleteAssignedAuthority(Long sourceId,Long userId,Long companyId){
String hql = "FROM RoleUser ru WHERE ru.consigner=? AND ru.user.id=? AND ru.companyId=?";
List<RoleUser> roleUsers = roleUserDao.find(hql, sourceId,userId,companyId);
for(RoleUser ru:roleUsers){
roleUserDao.delete(ru);
}
}
@SuppressWarnings("unchecked")
public List<User> queryUserByTrueName(String name){
return userDao.find("select user from User user join user.userInfos ui where user.loginName = ? and user.deleted = false and dr=0 and user.companyId=?", name,getCompanyId());
}
@SuppressWarnings("unchecked")
public List<User> queryAllUserWithoutAdmin(){
return userDao.find("from User user where user.companyId=? and user.deleted = false and (user.loginName not like ? and user.loginName not like ? and user.loginName not like ?)",getCompanyId(),"%.systemAdmin%","%.securityAdmin%","%.auditAdmin%");
}
@SuppressWarnings("unchecked")
public List<User> queryAllUser(){
return userDao.find("from User user where user.companyId=? and user.deleted = false ",getCompanyId());
}
@SuppressWarnings("unchecked")
public List<Department> queryAllDepts(){
return departmentDao.find("FROM Department d WHERE d.company.id=? AND d.deleted=?", getCompanyId(), false);
}
public List<Workgroup> queryAllWorkGroups(){
return workGroupDao.findByCriteria(Restrictions.eq("company.id", getCompanyId()),Restrictions.eq(DELETED,false));
}
@SuppressWarnings("unchecked")
public List<Role> queryRolesByUserName(Long userId, Long sysId){
String hql = "select role from Role role join role.roleUsers ru join ru.user user where user.id = ? and role.businessSystem.id= ? " +
"and role.deleted = false and ru.deleted = false and user.deleted = false";
return roleDao.find(hql, userId, sysId);
}
@SuppressWarnings("unchecked")
public List<Role> queryRolesByDepartmentName(String name, Long sysId){
String hql = "select role from Role role join role.roleDepartments rd join rd.department dept where dept.name = ? and role.businessSystem.id= ? " +
"and role.deleted = false and rd.deleted = false and dept.deleted = false and dept.company.id=?";
return roleDao.find(hql, name, sysId,ContextUtils.getCompanyId());
}
@SuppressWarnings("unchecked")
public List<Role> queryRolesByWorkgroupName(String name, Long sysId){
String hql = "select role from Role role join role.roleWorkgroups rw join rw.workgroup wg where wg.name = ? and role.businessSystem.id= ? " +
"and role.deleted = false and rw.deleted = false and wg.deleted = false and wg.company.id=?";
return roleDao.find(hql, name, sysId,ContextUtils.getCompanyId());
}
/**
* 确定该用户是否已经具有该权限
* @param userId:用户id
* @param roleId:角色id
* @return true:已经有 false:没有该权限
*/
@SuppressWarnings("unchecked")
public boolean checkRoleUser(Long userId, Long roleId){
String hql = "from RoleUser ru where ru.user.id = ? and ru.role.id= ? and ru.companyId=? and ru.deleted = false";
List<RoleUser> rus = roleUserDao.find(hql, userId, roleId,getCompanyId());
if(rus.size()>0){
return true;
}else{
return false;
}
}
/**
* 确定该部门是否已经具有该权限
* @param deptId:部门id
* @param roleId:角色id
* @return true:已经有 false:没有该权限
*/
@SuppressWarnings("unchecked")
public boolean checkRoleDepartment(Long deptId, Long roleId){
String hql = "from RoleDepartment rd where rd.department.id = ? and rd.role.id= ? and rd.companyId=? and rd.deleted = false";
List<RoleUser> rus = roleUserDao.find(hql, deptId, roleId,getCompanyId());
if(rus.size()>0){
return true;
}else{
return false;
}
}
/**
* 确定该工作组是否已经具有该权限
* @param workGroupId:工作组id
* @param roleId:角色id
* @return true:已经有 false:没有该权限
*/
@SuppressWarnings("unchecked")
public boolean checkRoleWokGroup(Long workGroupId, Long roleId){
String hql = "from RoleWorkgroup rw where rw.workgroup.id = ? and rw.role.id= ? and rw.companyId=? and rw.deleted = false";
List<RoleUser> rus = roleUserDao.find(hql, workGroupId, roleId,getCompanyId());
if(rus.size()>0){
return true;
}else{
return false;
}
}
public boolean hasSystemAdminRole(User user){
String userRoles=getRoleUsersIncludeTrustedRole(user);
//如果是系统管理员
if(userRoles.contains(ACS_SYSTEM_ADMIN)){
return true;
}
return false;
}
public boolean hasSecurityAdminRole(User user){
String userRoles=getRoleUsersIncludeTrustedRole(user);
//如果是安全管理员
if(userRoles.contains(ACS_SECURITY_ADMIN)){
return true;
}
return false;
}
public boolean hasSecurityAdminRole(Long userId){
User user = userDao.get(userId);
return hasSecurityAdminRole(user);
}
public boolean hasBranchAdminRole(User user){
String userRoles=getRoleUsersIncludeTrustedRole(user);
//如果是分支机构管理员
if(userRoles.contains(ACS_BRANCH_ADMIN)){
return true;
}
return false;
}
public boolean hasBranchAdminRole(Long userId){
User user = userDao.get(userId);
return hasBranchAdminRole(user);
}
public boolean hasAuditAdminRole(User user) {
String userRoles=getRoleUsersIncludeTrustedRole(user);
//如果是审计管理员
if(userRoles.contains(ACS_AUDIT_ADMIN)){
return true;
}
return false;
}
public boolean hasAuditAdminRole(Long userId) {
User user = userDao.get(userId);
return hasAuditAdminRole(user);
}
/**
* 获得角色编码为默认编码的所有角色
* @return
*/
@SuppressWarnings("unchecked")
public List<Role> getDefaultCodeRoles() {
String hql = "from Role role where (role.companyId is null or role.companyId=?) and role.code like 'role-%' and role.deleted=? " ;
return roleDao.find(hql, ContextUtils.getCompanyId(),false);
}
@SuppressWarnings("unchecked")
public List<Role> getRoles(Long businessSystemId, Long subCompanyId,
String roleName) {
StringBuilder sql=new StringBuilder();
sql.append("select role from Role role join role.businessSystem bs ");
sql.append("where bs.id = ? and (role.companyId is null or role.companyId=?) ");
sql.append("and role.name=? and role.deleted=?");
if(subCompanyId==null){
sql.append("and role.subCompanyId is null ");
return roleDao.find(sql.toString(),businessSystemId, ContextUtils.getCompanyId(),roleName,false);
}else{
sql.append("and role.subCompanyId = ? ");
return roleDao.find(sql.toString(),businessSystemId, ContextUtils.getCompanyId(),roleName,false,subCompanyId);
}
}
@SuppressWarnings("unchecked")
public List<Role> getRoles(String code) {
StringBuilder hql=new StringBuilder();
hql.append("from Role role where (role.companyId is null or role.companyId=?) and role.code=? and role.deleted=? ");
return roleDao.find(hql.toString(), ContextUtils.getCompanyId(),code,false);
}
@SuppressWarnings("unchecked")
public List<Role> getRoleByBranches(Long branchesId) {
StringBuilder hql=new StringBuilder();
hql.append("from Role role where (role.companyId is null or role.companyId=?) ");
hql.append(" and role.subCompanyId = ? and role.deleted=? ");
return roleDao.find(hql.toString(), ContextUtils.getCompanyId(),branchesId,false);
}
public Page<Role> getRoles(Page<Role> page, Long businessSystemId,Set<Long> branchesSet) {
StringBuilder sql=new StringBuilder();
sql.append("select distinct role from Role role join role.businessSystem bs ");
sql.append("where bs.id = ? and role.deleted=? ");
sql.append("and (role.companyId is null or role.companyId=?) ");
sql.append("and (role.id in (");
sql.append("select r.dataId from BranchAuthority r ");
sql.append(" where r.companyId=? and r.branchDataType=? and ");
sql.append("(r.branchesId in (");
sql.append("select b.branchesId from BranchAuthority b ");
sql.append(" where b.companyId=? and b.branchDataType=? and b.dataId=?))) ");
for(Long branchesId:branchesSet){
sql.append("or role.subCompanyId =");
sql.append(branchesId+" ");
}
sql.append(") ");
sql.append("order by role.weight desc ");
return roleDao.find(page,sql.toString(),businessSystemId, false,ContextUtils.getCompanyId(),ContextUtils.getCompanyId(),BranchDataType.ROLE,ContextUtils.getCompanyId(),BranchDataType.USER,ContextUtils.getUserId());
}
@SuppressWarnings("unchecked")
public List<Role> getRoles(Long businessSystemId,Set<Long> branchesSet) {
StringBuilder sql=new StringBuilder();
sql.append("select distinct role from Role role join role.businessSystem bs ");
sql.append("where bs.id = ? and role.deleted=? ");
sql.append("and (role.companyId is null or role.companyId=?) ");
sql.append("and (role.id in (");
sql.append("select r.dataId from BranchAuthority r ");
sql.append(" where r.companyId=? and r.branchDataType=? and ");
sql.append("(r.branchesId in (");
sql.append("select b.branchesId from BranchAuthority b ");
sql.append(" where b.companyId=? and b.branchDataType=? and b.dataId=?))) ");
for(Long branchesId:branchesSet){
sql.append("or role.subCompanyId =");
sql.append(branchesId+" ");
}
sql.append(") ");
sql.append("order by role.weight desc ");
return roleDao.find(sql.toString(),businessSystemId, false,ContextUtils.getCompanyId(),ContextUtils.getCompanyId(),BranchDataType.ROLE,ContextUtils.getCompanyId(),BranchDataType.USER,ContextUtils.getUserId());
}
@SuppressWarnings("unchecked")
public List<Role> getRoleList(Long businessSystemId,Set<Long> branchesSet) {
int resultLength=8;
if(branchesSet!=null){
resultLength+=branchesSet.size();
}
Object[] result =new Object[resultLength];
StringBuilder sql=new StringBuilder();
sql.append("select distinct role from Role role join role.businessSystem bs ");
sql.append("where bs.id = ? and role.deleted=? ");
sql.append("and (role.companyId is null or role.companyId=?) ");
sql.append("and (role.id in (");
sql.append("select r.dataId from BranchAuthority r ");
sql.append(" where r.companyId=? and r.branchDataType=? and ");
sql.append("(r.branchesId in (");
sql.append("select b.branchesId from BranchAuthority b ");
sql.append(" where b.companyId=? and b.branchDataType=? and b.dataId=?))) ");
for(Long branchesId:branchesSet){
sql.append(" or (role.id in (select ba.dataId from BranchAuthority ba where ba.companyId=");
sql.append(ContextUtils.getCompanyId());
sql.append(" and ba.branchesId=");
sql.append(branchesId);
sql.append(" and ba.branchDataType=?");
sql.append(")) ");
}
for(Long branchesId:branchesSet){
sql.append("or role.subCompanyId =");
sql.append(branchesId+" ");
}
sql.append(") ");
sql.append("order by role.weight desc ");
result[0]=businessSystemId;
result[1]=false;
result[2]=ContextUtils.getCompanyId();
result[3]=ContextUtils.getCompanyId();
result[4]=BranchDataType.ROLE;
result[5]=ContextUtils.getCompanyId();
result[6]=BranchDataType.USER;
result[7]=ContextUtils.getUserId();
for(int i=8;i<resultLength;i++){
result[i]=BranchDataType.ROLE;
}
// return roleDao.find(sql.toString(),businessSystemId, false,ContextUtils.getCompanyId(),ContextUtils.getCompanyId(),BranchDataType.ROLE,ContextUtils.getCompanyId(),BranchDataType.USER,ContextUtils.getUserId());
return roleDao.find(sql.toString(),result);
}
/**
* 根据用户id删除用户角色
* @param userId
*/
public void deleteRoleUserByUserId(Long userId) {
roleUserDao.executeUpdate("delete RoleUser where user.id=? ", userId);
}
/**
* 根据用户id获得角色
* @param userId
* @return
*/
@SuppressWarnings("unchecked")
public List<Role> getRolesByUserId(Long userId) {
StringBuilder hql=new StringBuilder();
hql.append("select distinct role from Role role join role.roleUsers ru join ru.user user where user.id = ? and role.deleted = false and ru.deleted = false and user.deleted = false");
return roleDao.find(hql.toString(),userId);
}
/**
* 根据部门id获得角色
* @param departmentId
* @return
*/
@SuppressWarnings("unchecked")
public List<Role> getRolesByDepartmentId(Long departmentId) {
StringBuilder hql=new StringBuilder();
hql.append("select distinct role from Role role join role.roleDepartments rd join rd.department dept where dept.id = ? and role.deleted = false and rd.deleted = false and dept.deleted = false");
return roleDao.find(hql.toString(),departmentId);
}
/**
* 根据工作组id获得角色
* @param workgroupId
* @return
*/
@SuppressWarnings("unchecked")
public List<Role> getRolesByWorkgroupId(Long workgroupId) {
StringBuilder hql=new StringBuilder();
hql.append("select distinct role from Role role join role.roleWorkgroups rw join rw.workgroup w where w.id = ? and role.deleted = false and rw.deleted = false and w.deleted = false");
return roleDao.find(hql.toString(),workgroupId);
}
//删除角色时删除角色对应的中间表
public void clean(Long rId) {
Role role=roleDao.get(rId);
Set<RoleUser> roleUsers=role.getRoleUsers();
Set<RoleDepartment> roleDepartments =role.getRoleDepartments();
Set<RoleWorkgroup> roleWorkgroups = role.getRoleWorkgroups();
Set<RoleFunction> roleFunctions = role.getRoleFunctions();
if(!roleUsers.isEmpty()){
for(RoleUser ru:roleUsers){
roleUserDao.delete(ru);
}
}
if(!roleDepartments.isEmpty()){
for(RoleDepartment rd:roleDepartments){
roleDepartmentDao.delete(rd);
}
}
if(!roleWorkgroups.isEmpty()){
for(RoleWorkgroup rw:roleWorkgroups){
role_wDao.delete(rw);
}
}
if(!roleFunctions.isEmpty()){
for(RoleFunction rf:roleFunctions){
role_fDao.delete(rf);
}
}
}
public String createTree(BusinessSystem bs,Long roleId,Integer isAddOrRomove) {
Role entity = roleDao.get(roleId);
List<ZTreeNode> ztreeNodes=new ArrayList<ZTreeNode>();
List<Function> functions=null;
if(isAddOrRomove.equals(1)){
functions=functionDao.findList("select distinct f from RoleFunction rf join rf.role r join rf.function f where r.id=? and f.businessSystem.id=? and rf.deleted=? and f.deleted=? order by f.ordinal,f.name",entity.getId(),bs.getId(),false,false);
}else{
functions=functionDao.findList("from Function f where f.id not in (select distinct rf.function.id from RoleFunction rf where rf.role.id=? and rf.deleted=?) and f.businessSystem.id=? and f.deleted=? order by f.ordinal,f.name",entity.getId(),false,bs.getId(),false);
}
//系统节点
ZTreeNode business_=new ZTreeNode("business_"+bs.getId().toString(),"0", bs.getName(),"false","false",bs.getPath(),"","system","system","false","true","false","true","false");
ZTreeNode void_=new ZTreeNode("void_"+bs.getId().toString(),"0", "未分类","false","false","root",bs.getPath(),"void","void","false","true","false","true","false");
//递归拼树
for(Function function:functions){
setNodes(function,functions,ztreeNodes);
}
if(hasChildInBusiness(ztreeNodes,business_.getId())){
business_.setIsParent("true");
business_.setOpen("true");
}
if(hasChildInVoid(ztreeNodes,void_.getId())){
void_.setIsParent("true");
void_.setOpen("true");
}
ztreeNodes.add(business_);
ztreeNodes.add(void_);
return JsonParser.object2Json(ztreeNodes);
}
private boolean hasChildInVoid(List<ZTreeNode> ztreeNodes,String void_) {
for(ZTreeNode zNode:ztreeNodes){
if(zNode.getpId().equals(void_)){
return true;
}
}
return false;
}
private boolean hasChildInBusiness(List<ZTreeNode> ztreeNodes,String Business_) {
for(ZTreeNode zNode:ztreeNodes){
if(zNode.getpId().equals(Business_)){
return true;
}
}
return false;
}
//拼接已选资源节点
private void setNodes(Function function,List<Function> functions,List<ZTreeNode> ztreeNodes) {
Function parent=function.getPid()==null?null:functionDao.get(function.getPid());
ZTreeNode node=null;
if(parent!=null){
if(!functions.contains(parent)){
node=new ZTreeNode(parent.getId().toString(),parent.getPid()==null?(parent.getIsmenu()?"business_"+parent.getBusinessSystem().getId().toString():"void_"+parent.getBusinessSystem().getId().toString()):parent.getPid().toString(), parent.getName(),"true","true",parent.getPath(),"",getStringType(parent),getStringType(parent),"false","true","false","true","false");
if(!ztreeNodes.contains(node)){
ztreeNodes.add(node);
}
setNodes(parent,functions,ztreeNodes);
}
}
node=new ZTreeNode(function.getId().toString(),parent==null?(function.getIsmenu()?"business_"+function.getBusinessSystem().getId().toString():"void_"+function.getBusinessSystem().getId().toString()):parent.getId().toString(), function.getName(),"true","false",function.getPath(),"",getStringType(function),getStringType(function),"false","false","false","true","false");
if(hasChildInFunctions(function,functions)){
node.setIsParent("true");
}
if(!ztreeNodes.contains(node)){
ztreeNodes.add(node);
}
}
//查找当前集合里有没有节点是给定节点的子节点
private boolean hasChildInFunctions(Function function,List<Function> functions) {
List<Function> fs=getFunctionsByPid(function.getId());
for(Function f:fs){
if(functions.contains(f)){
return true;
}else{
return hasChildInFunctions(f,functions);
}
}
return false;
}
//根据function菜单属性返回
private String getStringType(Function function){
if(function.getIsmenu()){
return "menu";
}else{
return "function";
}
}
public List<Function> getFunctionsByPid(Long id) {
return functionDao.findList("from Function f where f.deleted=? and f.pid=? order by f.ordinal,f.name ", false,id);
}
private List<Menu> getMenusByPid(Menu menu,BusinessSystem system) {
return menuDao.findList("from Menu m where m.parent.id=? and m.systemId=?", menu.getId(),system.getId());
}
}