package com.norteksoft.acs.service.organization; import java.util.Date; import java.util.List; import java.util.Set; import javax.ws.rs.core.Response; 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.orm.hibernate.SimpleHibernateTemplate; import com.norteksoft.acs.entity.authorization.BranchAuthority; import com.norteksoft.acs.entity.authorization.Role; import com.norteksoft.acs.entity.authorization.RoleDepartment; 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.UserInfo; 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.authorization.BranchAuthorityManager; import com.norteksoft.acs.service.authorization.RoleManager; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.ParameterUtils; import com.norteksoft.product.util.ThreadParameters; /** * 同步组织机构使用的service * */ @Service @Transactional public class AsynOrgManager { private SimpleHibernateTemplate<Company, Long> companyDao; private SimpleHibernateTemplate<User, Long> userDao; private SimpleHibernateTemplate<UserInfo, Long> userInfoDao; private SimpleHibernateTemplate<DepartmentUser, Long> departmentToUserDao; private SimpleHibernateTemplate<WorkgroupUser, Long> workGroupToUserDao; private SimpleHibernateTemplate<Department, Long> departmentDao; private SimpleHibernateTemplate<RoleDepartment, Long> roleDepartmentDao; private static String USERID = "user.id"; @Autowired private AcsUtils acsUtils; @Autowired private UserInfoManager userInfoManager; @Autowired private UserManager userManager; @Autowired private DepartmentManager departmentManager; @Autowired private CompanyManager companyManager; @Autowired private WorkGroupManager workGroupManager; @Autowired private RoleManager roleManager; @Autowired private BranchAuthorityManager branchAuthorityManager; public Long getSystemIdByCode(String code) { return acsUtils.getSystemsByCode(code).getId(); } @Autowired public void setSessionFactory(SessionFactory sessionFactory){ userDao = new SimpleHibernateTemplate<User, Long>(sessionFactory, User.class); workGroupToUserDao = new SimpleHibernateTemplate<WorkgroupUser, Long>(sessionFactory, WorkgroupUser.class); departmentToUserDao = new SimpleHibernateTemplate<DepartmentUser, Long>(sessionFactory, DepartmentUser.class); departmentDao = new SimpleHibernateTemplate<Department, Long>(sessionFactory, Department.class); userInfoDao = new SimpleHibernateTemplate<UserInfo, Long>(sessionFactory, UserInfo.class); roleDepartmentDao=new SimpleHibernateTemplate<RoleDepartment, Long>(sessionFactory,RoleDepartment.class); companyDao=new SimpleHibernateTemplate<Company,Long>(sessionFactory,Company.class); } @Transactional public Response saveUserForWebService(String path,String loginName, String name, String password) { if(StringUtils.isEmpty(path)){ return Response.status(500).entity("path必填!").build(); } if(StringUtils.isEmpty(loginName)){ return Response.status(500).entity("登陆名必填!").build(); } if(StringUtils.isEmpty(name)){ return Response.status(500).entity("用户名必填!").build(); } if(StringUtils.isEmpty(password)){ return Response.status(500).entity("密码必填!").build(); } Object o = parsePath(path); if(o!=null){ if(o instanceof Company){ Company company=(Company)o; return saveUserToCompany(company,loginName,name,password,null); }else if(o instanceof Department){ Department department=(Department)o; if(department.getBranch()){ return saveUserToBranch(department,loginName,name,password,null); }else{ if(department.getSubCompanyId()==null){ return saveUserToCompany(department.getCompany(),loginName,name,password,department); }else{ return saveUserToBranch(departmentDao.get(department.getSubCompanyId()),loginName,name,password,department); } } } }else{ return Response.status(500).entity("path错误!").build(); } return Response.status(200).entity("ok").build(); } private Response saveUserToBranch(Department branch, String loginName, String name, String password, Department object) { List<User> us=userDao.findList("select user from User user join user.userInfos ui where ui.companyId=? and ui.deleted=? and user.deleted=? and user.subCompanyId=? and user.loginName=?", branch.getCompany().getId(),true,true,branch.getId(),loginName); if(us!=null&&us.size()>0){ return Response.status(500).entity("已存在登录名是相同的已删除用户!").build(); } List<User> users=userDao.findList("from User u where u.deleted=? and u.companyId=? and u.subCompanyId=? and u.loginName=?", false,branch.getCompany().getId(),branch.getId(),loginName); User user=null; if(users!=null&&users.size()>0){ user=users.get(0); departmentToUserDao.createQuery("delete from DepartmentUser du where du.user.id=?",user.getId()).executeUpdate(); if(object!=null){ user.setMainDepartmentId(object.getId()); DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(object); du.setSubCompanyId(user.getSubCompanyId()); du.setCompanyId(branch.getCompany().getId()); departmentToUserDao.save(du); }else{ DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(branch); du.setCompanyId(branch.getCompany().getId()); du.setSubCompanyId(branch.getId()); departmentToUserDao.save(du); } user.setName(name); user.setPassword(password); userDao.save(user); }else{ ThreadParameters parameters = new ThreadParameters(branch.getCompany().getId()); ParameterUtils.setParameters(parameters); UserInfo userInfo=null; //新建用户 user=new User(); user.setLoginName(loginName); user.setName(name); user.setPassword(password); user.setCompanyId(branch.getCompany().getId()); user.setSubCompanyId(branch.getId()); user.setSubCompanyName(branch.getName()); userManager.saveUser(user); if(object!=null){ user.setMainDepartmentId(object.getId()); DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(object); du.setCompanyId(branch.getCompany().getId()); du.setSubCompanyId(branch.getId()); departmentToUserDao.save(du); }else{ DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(branch); du.setCompanyId(branch.getCompany().getId()); du.setSubCompanyId(branch.getId()); departmentToUserDao.save(du); } //给用户添加基本的权限 userInfoManager.giveNewUserPortalCommonRole(user); userInfo=new UserInfo(); userInfo.setUser(user); userInfo.setPasswordUpdatedTime(new Date()); userInfoManager.add(userInfo); } return Response.status(200).entity("ok").build(); } private Response saveUserToCompany(Company company, String loginName,String name,String password,Department department) { User user=null; List<User> us=userDao.findList("select user from User user join user.userInfos ui where ui.companyId=? and ui.deleted=? and user.deleted=? and user.subCompanyId is null and user.loginName=?", company.getId(),true,true,loginName); if(us!=null&&us.size()>0){ return Response.status(500).entity("已存在登录名是相同的已删除用户!").build(); } List<User> users = userDao.findList("from User u where u.companyId=? and u.deleted=? and u.subCompanyId is null and loginName=?",company.getId(),false,loginName); if(users!=null&&users.size()>0){ user=users.get(0); departmentToUserDao.createQuery("delete from DepartmentUser du where du.user.id=?",user.getId()).executeUpdate(); if(department!=null){ user.setMainDepartmentId(department.getId()); DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(department); du.setSubCompanyId(department.getSubCompanyId()); du.setCompanyId(company.getId()); departmentToUserDao.save(du); } user.setName(name); user.setPassword(password); userDao.save(user); }else{ ThreadParameters parameters = new ThreadParameters(company.getId()); ParameterUtils.setParameters(parameters); UserInfo userInfo=null; //新建用户 user=new User(); user.setLoginName(loginName); user.setName(name); user.setPassword(password); user.setCompanyId(company.getId()); user.setSubCompanyId(null); user.setSubCompanyName(company.getName()); userManager.saveUser(user); if(department!=null){ user.setMainDepartmentId(department.getId()); DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(department); du.setSubCompanyId(department.getSubCompanyId()); du.setCompanyId(company.getId()); departmentToUserDao.save(du); } //给用户添加基本的权限 userInfoManager.giveNewUserPortalCommonRole(user); userInfo=new UserInfo(); userInfo.setUser(user); userInfo.setPasswordUpdatedTime(new Date()); userInfoManager.add(userInfo); } return Response.status(200).entity("ok").build(); } @Transactional public Response saveDepartmentForWebService(String path,Boolean branchFlag, String name, String code) { if(StringUtils.isEmpty(path)){ return Response.status(500).entity("path必填!").build(); } if(StringUtils.isEmpty(name)){ return Response.status(500).entity("部门名称必填!").build(); } Object o = parsePath(path); if(o!=null){ return addDepartment(o,branchFlag,name,code); }else{ return Response.status(500).entity("path错误!").build(); } } private Response addDepartment(Object o, Boolean branchFlag, String name, String code) { Department department=null; if(o instanceof Company){ Company company=(Company)o; Long count = departmentDao.findLong("select count(*) from Department d where d.deleted=? and d.company.id=? and d.subCompanyId is null and d.name=?",false, company.getId(),name); if(count>0){ return Response.status(500).entity("该部门已存在!").build(); } ThreadParameters parameters = new ThreadParameters(company.getId()); ParameterUtils.setParameters(parameters); department = new Department(); department.setCode(departmentManager.createDepartmentCode()); department.setCompany(company); department.setName(name); department.setBranch(branchFlag==null?false:branchFlag); }else if(o instanceof Department){ Department dept=(Department)o; Long count = departmentDao.findLong("select count(*) from Department d where d.deleted=? and d.company.id=? and d.parent.id=? and d.name=?",false,dept.getCompany().getId(),dept.getId(),name); if(count>0){ return Response.status(500).entity("该部门已存在!").build(); } ThreadParameters parameters = new ThreadParameters(dept.getCompany().getId()); ParameterUtils.setParameters(parameters); department = new Department(); department.setCode(departmentManager.createDepartmentCode()); department.setCompany(dept.getCompany()); department.setName(name); department.setParent(dept); department.setSubCompanyId(dept.getSubCompanyId()); department.setSubCompanyName(dept.getSubCompanyName()); department.setBranch(branchFlag==null?false:branchFlag); } departmentDao.save(department); return Response.status(200).entity("ok").build(); } @Transactional public Response deleteDepartmentForWebService(String path,String code) { Object o = parsePath(path); if(o!=null){ if(o instanceof Company){ return Response.status(500).entity("路径错误!").build(); }else if(o instanceof Department){ Department department=(Department)o; ThreadParameters parameters = new ThreadParameters(department.getCompany().getId()); ParameterUtils.setParameters(parameters); if(department.getBranch()){ if(validateBranchDelete(department.getId())){ departmentDao.delete(department); return Response.status(200).entity("ok").build(); }else{ return Response.status(500).entity("请先删除分支机构下的部门,人员,工作组,分支机构,分支机构授权管理,角色!").build(); } }else{ if(validateDepartmentDelete(department.getId())){ List<User> users=userManager.getUsersByDeptId(department.getId()); for(User user:users){ departmentToUserDao.createQuery("delete from DepartmentUser du where du.user.id=? and du.department.id=?",user.getId(),department.getId()).executeUpdate(); List<DepartmentUser> departmentToUser = departmentToUserDao.findList("from DepartmentUser du where du.deleted=? and du.user.id=?",false,user.getId()); if(departmentToUser==null||departmentToUser.size()==0){ if(department.getSubCompanyId()!=null){ DepartmentUser du=new DepartmentUser(); du.setUser(user); du.setDepartment(departmentDao.get(user.getSubCompanyId())); du.setCompanyId(user.getCompanyId()); du.setSubCompanyId(user.getSubCompanyId()); departmentToUserDao.save(du); } } if(user.getMainDepartmentId().equals(department.getId())){ user.setMailboxDeploy(null); } } departmentDao.delete(department); return Response.status(200).entity("ok").build(); }else{ return Response.status(500).entity("请先删除子部门或分支机构!").build(); } } }else{ return Response.status(500).entity("未知错误!").build(); } }else{ return Response.status(500).entity("路径错误!").build(); } } @Transactional public Response deleteUserForWebService(String path,String loginName) { if(StringUtils.isEmpty(path)){ return Response.status(500).entity("path必填!").build(); } if(StringUtils.isEmpty(loginName)){ return Response.status(500).entity("登陆名必填!").build(); } Object o = parsePath(path); if(o!=null){ return deleteUser(o,loginName); }else{ return Response.status(500).entity("path错误!").build(); } } private Response deleteUser(Object o,String loginName) { List<User> users=null; if(o instanceof Company){ Company company=(Company)o; users=userDao.findList("from User u where u.companyId=? and u.deleted=? and u.subCompanyId is null and u.loginName=?",company.getId(),false,loginName); if(users!=null&&users.size()>0){ User user=users.get(0); clearUser(user.getId()); user.setDeleted(true); return Response.status(200).entity("ok").build(); }else{ return Response.status(500).entity("用户不存在!").build(); } }else if(o instanceof Department){ Department department=(Department)o; if(department.getSubCompanyId()==null){ users=userDao.findList("from User u where u.companyId=? and u.deleted=? and u.subCompanyId is null and u.loginName=?",department.getCompany().getId(),false,loginName); }else{ users=userDao.findList("from User u where u.companyId=? and u.deleted=? and u.companyId=? and u.subCompanyId=? and u.loginName=?",department.getCompany().getId(),false,department.getCompany().getId(),department.getSubCompanyId(),loginName); } if(users!=null&&users.size()>0){ User user=users.get(0); clearUser(user.getId()); user.setDeleted(true); return Response.status(200).entity("ok").build(); }else{ return Response.status(500).entity("用户不存在!").build(); } }else{ return Response.status(500).entity("用户不存在!").build(); } } /** * 解析路径 --测试公司\部门1\分支机构1-3\部门1 * @param path * @return */ private Object parsePath(String path) { if(StringUtils.isEmpty(path)){ return null; } String[] names=path.split("\\\\"); List<Company> companys=companyDao.findList("from Company c where c.deleted=? and c.name=?", false,names[0]); for(Company company:companys){ if(1==names.length){ return company; } Object o=findDepartment(company,null,names,1); if(o!=null){ return o; } } return null; } private Object findDepartment(Company company,Department dept,String[] names, int i) { Object obj=null; if(i>names.length-1){ return null; } StringBuilder hql=new StringBuilder("from Department d where d.deleted=? and d.name=? and d.company.id=? "); if(dept!=null){ hql.append("and d.parent.id="+dept.getId().toString()); }else{ hql.append("and d.parent is null"); } List<Department> departments=departmentDao.findList(hql.toString(),false,names[i],company.getId()); for(Department department:departments){ if(i==names.length-1){ obj=department; }else{ obj=findDepartment(company,department,names,++i); } } return obj; } private void clearUser(Long id) { User user=userManager.getUserById(id); UserInfo userInfo = user.getUserInfo(); userInfo.setDeleted(true); departmentToUserDao.createQuery("delete from DepartmentUser du where du.user.id=?",id).executeUpdate(); workGroupToUserDao.createQuery("delete from WorkgroupUser du where du.user.id=?",id).executeUpdate(); userInfo.setDeleted(true); userInfoDao.save(userInfo); userDao.save(user); } private void deleteDepartmemtToUser(Long id, Long id2) { List<DepartmentUser> departmentToUser = departmentToUserDao.findByCriteria(Restrictions.eq("department.id", id),Restrictions.eq(USERID, id2)); for (DepartmentUser departmentToUser2 : departmentToUser) { departmentToUserDao.delete(departmentToUser2); } } /** * webService版 * @param departmentId2 * @param company */ private void cleanDept(Long departmentId2) { Department dept=(Department)departmentDao.findUnique("from Department d where d.company.id=? and d.id=? and d.deleted=? ",ContextUtils.getCompanyId(), departmentId2,false); Set<RoleDepartment> roleDepartments=dept.getRoleDepartments(); if(!roleDepartments.isEmpty()){ for(RoleDepartment roleDepartment:roleDepartments){ roleDepartmentDao.delete(roleDepartment); } } } private void deleteDepartment(Long id) { Department dept=departmentDao.get(id); departmentToUserDao.createQuery("delete from DepartmentUser du where du.deleted=? and du.department.id=?", false,id).executeUpdate(); departmentDao.delete(dept); } private boolean validateDepartmentDelete(Long deptId){ List<Department> subDepartments=departmentManager.getSubDeptments(deptId); List<Workgroup> workgroups=workGroupManager.getWorkgroupsByBranch(deptId); List<BranchAuthority> branchAuthoritys=branchAuthorityManager.getBranchAuthorityByBranch(deptId); List<Role> roles=roleManager.getRoleByBranches(deptId); if((subDepartments!=null && subDepartments.size()>0) || (workgroups!=null && workgroups.size()>0) || (branchAuthoritys!=null&&branchAuthoritys.size()>0) || (roles!=null&&roles.size()>0)){ return false; }else{ return true; } } private boolean validateBranchDelete(Long deptId){ List<Department> subDepartments=departmentManager.getSubDeptments(deptId); List<User> users=userManager.getUsersBySubCompany(deptId); List<Workgroup> workgroups=workGroupManager.getWorkgroupsByBranch(deptId); List<BranchAuthority> branchAuthoritys=branchAuthorityManager.getBranchAuthorityByBranch(deptId); List<Role> roles=roleManager.getRoleByBranches(deptId); if((subDepartments!=null && subDepartments.size()>0) || (users!=null&& users.size()>0) || (workgroups!=null && workgroups.size()>0) || (branchAuthoritys!=null&&branchAuthoritys.size()>0) || (roles!=null&&roles.size()>0)){ return false; }else{ return true; } } private Department getDepartmentByCode(String code) { List<Department> depts=departmentDao.findList("from Department d where d.code=? and d.deleted=? and d.company.id=?", code,false,ContextUtils.getCompanyId()); if(depts.size()>0){ return depts.get(0); } return null; } }