/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.um.dao.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import com.jinhe.tss.component.support.persistence.TreeSupportDao;
import com.jinhe.tss.component.support.persistence.pagequery.PageInfo;
import com.jinhe.tss.component.support.persistence.pagequery.PaginationQueryByHQL;
import com.jinhe.tss.component.support.persistence.pagequery.PaginationQueryBySQL;
import com.jinhe.tss.core.sso.Environment;
import com.jinhe.tss.core.util.EasyUtils;
import com.jinhe.tss.um.UMConstants;
import com.jinhe.tss.um.dao.IGroupDao;
import com.jinhe.tss.um.dao.IResourceTypeDao;
import com.jinhe.tss.um.entity.Group;
import com.jinhe.tss.um.entity.User;
import com.jinhe.tss.um.helper.UMQueryCondition;
import com.jinhe.tss.um.helper.dto.OtherUserDTO;
import com.jinhe.tss.um.permission.PermissionHelper;
public class GroupDao extends TreeSupportDao<Group> implements IGroupDao {
public GroupDao() {
super(Group.class);
}
@Autowired private IResourceTypeDao resourceTypeDao;
public Group saveGroup(Group group) {
if( group.getId() == null ) {
create(group);
}
else {
update(group);
}
return group;
}
public Group moveGroup(Group group) {
update(group);
return group;
}
public Group removeGroup(Group group) {
List<?> groups = getChildrenById(group.getId()); //列表中包含了Group本身
List<?> users = getUsersByGroupIdDeeply(group.getId());
for(Iterator<?> it = users.iterator(); it.hasNext();){
User user = (User) it.next();
deleteAll(getEntities("from GroupUser gu where gu.userId = ?", new Object[]{user.getId()}));
deleteAll(getEntities("from RoleUser ru where ru.id.userId = ? and ru.strategyId is null", new Object[]{user.getId()}));
}
for(Iterator<?> it = groups.iterator(); it.hasNext();){
Group temp = (Group) it.next();
deleteAll(findGroup2UserByGroupId(temp.getId()));
deleteAll(findGroup2RoleByGroupId(temp.getId()));
}
deleteAll(users);
deleteAll(groups);
return group;
}
public Group removeAssistmentGroup(Group group) {
deleteAll(getChildrenById(group.getId()));
return group;
}
public List<?> findRolesByGroupId(Long groupId) {
String hql = "select distinct r from RoleGroup rg, Role r where rg.roleId = r.id and rg.groupId = ? and rg.strategyId is null ";
return getEntities(hql, groupId);
}
public List<?> findGroup2UserByGroupId(Long groupId) {
return getEntities("from GroupUser gu where gu.groupId = ?", groupId);
}
public List<?> findGroup2RoleByGroupId(Long groupId) {
return getEntities("from RoleGroup rg where rg.groupId = ? and rg.strategyId is null ", groupId);
}
public Group findMainGroupByUserId(Long userId){
//如此取出来的组唯一,即用户所在的主用户组
String hql = "select g from GroupUser gu, Group g where gu.groupId = g.id and gu.userId = ? and g.groupType = ? ";
List<?> list = getEntities(hql, userId, Group.MAIN_GROUP_TYPE);
return list.size() > 0 ? (Group)list.get(0) : null;
}
public List<?> findGroupsByUserId(Long userId) {
String hql = "select distinct g from GroupUser gu, Group g where gu.groupId = g.id and gu.userId = ? ";
return getEntities(hql, userId);
}
public List<?> getFatherGroupsByUserId(Long userId){
Group mainGroup = findMainGroupByUserId(userId);
return getParentsById(mainGroup.getId(), UMConstants.MAIN_GROUP_ID);
}
public List<?> getVisibleSubGroups(Long groupId){
Group group = getEntity(groupId);
String suppliedTable = resourceTypeDao.getSuppliedTable(UMConstants.TSS_APPLICATION_ID, group.getResourceType());
String hql = PermissionHelper.permissionHQL(entityName, suppliedTable, " and o.decode like ? ", true);
return getEntities(hql, Environment.getOperatorId(), UMConstants.GROUP_VIEW_OPERRATION, group.getDecode() + "%" );
}
public List<?> getGroupsByType(Integer groupType, Long operatorId) {
return getGroupsByType(groupType, operatorId, UMConstants.GROUP_VIEW_OPERRATION);
}
public List<?> getGroupsByType(Integer groupType, Long operatorId, String operationId) {
String resourceType = Group.getResourceType(groupType);
String suppliedTable = resourceTypeDao.getSuppliedTable(UMConstants.TSS_APPLICATION_ID, resourceType);
String hql = PermissionHelper.permissionHQL(entityName, suppliedTable);
return getEntities(hql, operatorId, operationId);
}
public List<?> getParentGroupByGroupIds(Integer groupType, List<Long> groupIds, Long operatorId, String operationId) {
if( EasyUtils.isNullOrEmpty(groupIds)) return new ArrayList<Group>();
String suppliedTable = resourceTypeDao.getSuppliedTable(UMConstants.TSS_APPLICATION_ID, Group.getResourceType(groupType));
String hql = "select distinct o " + PermissionHelper.formatHQLFrom(entityName, suppliedTable) + " , Group child " +
PermissionHelper.permissionConditionII() + " and child.id in (:groupIds) and child.decode like o.decode||'%'" + PermissionHelper.ORDER_BY;
return getEntities(hql, new Object[]{"operatorId", "operationId", "groupIds"}, new Object[]{operatorId, operationId, groupIds});
}
public List<?> getVisibleMainUsers(Long operatorId) {
// 先查出有查看权限的用户组
List<?> groups = getGroupsByType(Group.MAIN_GROUP_TYPE, operatorId, UMConstants.USER_BROWSE_OPERRATION);
List<Long> groupIds = new ArrayList<Long>();
for(Object temp : groups) {
groupIds.add(((Group) temp).getId());
}
if(groupIds.isEmpty()) {
return new ArrayList<User>();
}
String hql = " select distinct u from User u, GroupUser gu where u.id = gu.userId and gu.groupId in (:groupIds) ";
return getEntities(hql, new Object[] {"groupIds"}, new Object[]{ groupIds });
}
public List<?> getUsersAndRelation(Long operatorId) {
String hql = "select distinct u, gu from User u, GroupUser gu, Group g" +
" where u.id = gu.userId and gu.groupId = g.id and g.groupType = " + Group.MAIN_GROUP_TYPE;
return getEntities(hql);
}
public List<User> getUsersByGroupIdDeeply(Long groupId){
String hql = "select distinct u, g.id as groupId, g.name as groupName, gu.decode " +
" from User u, GroupUser gu, Group g " +
" where u.id = gu.userId and gu.groupId = g.id " +
" and gu.decode like ? and gu.decode <> ? " +
" order by gu.decode";
Group group = getEntity(groupId);
return fillGroupInfo2User(getEntities(hql, group.getDecode() + "%", group.getDecode()));
}
public List<User> getUsersByGroupIds(Collection<Long> groupIds){
if( EasyUtils.isNullOrEmpty(groupIds) ) return new ArrayList<User>();
String hql = "select distinct u, g.id as groupId, g.name as groupName, gu.decode " +
" from User u, GroupUser gu, Group g " +
" where u.id = gu.userId and gu.groupId = g.id and g.id in (:groupIds) " +
" order by gu.decode";
return fillGroupInfo2User(getEntities(hql, new Object[]{"groupIds"}, new Object[]{groupIds}));
}
public List<User> getUsersByGroupId(Long groupId) {
String hql = "select distinct u, g.id as groupId, g.name as groupName, gu.decode " +
" from User u, GroupUser gu, Group g " +
" where u.id = gu.userId and gu.groupId = g.id and g.id = ? " +
" order by gu.decode";
return fillGroupInfo2User(getEntities(hql, groupId));
}
/**
* 将用户所属的用户组ID,NAME设置到用户对象中
* @param users
* @return
*/
private List<User> fillGroupInfo2User(List<?> users){
List<User> result = new ArrayList<User>();
if( EasyUtils.isNullOrEmpty(users) ) return result;
for (Object temp : users) {
Object[] objs = (Object[]) temp;
User user = (User) objs[0];
user.setGroupId( EasyUtils.convertObject2Long(objs[1]) );
user.setGroupName((String) objs[2]);
result.add(user);
}
return result;
}
private List<OtherUserDTO> fillOtherGroupInfo(List<?> users){
List<OtherUserDTO> result = new ArrayList<OtherUserDTO>();
if( EasyUtils.isNullOrEmpty(users) ) return result;
for (Object temp : users) {
Object[] objs = (Object[]) temp;
OtherUserDTO otherUserDTO = new OtherUserDTO();
otherUserDTO.setId( EasyUtils.convertObject2Long(objs[0]) );
otherUserDTO.setUserName((String)objs[1]);
otherUserDTO.setLoginName((String)objs[2]);
otherUserDTO.setGroupId( EasyUtils.convertObject2Long(objs[3]));
otherUserDTO.setGroupName((String)objs[4]);
if( objs[5] != null ){
otherUserDTO.setAppUserId( EasyUtils.convertObject2Long(objs[5]));
otherUserDTO.setAppUserName((String)objs[6]);
otherUserDTO.setAppLoginName((String)objs[7]);
otherUserDTO.setAppGroupId( EasyUtils.convertObject2Long(objs[8]));
otherUserDTO.setAppGroupName((String)objs[9]);
}
result.add(otherUserDTO);
}
return result;
}
private List<Long> getChildrenGroupIds(Long groupId){
List<?> groups = getChildrenById(groupId);
List<Long> groupIds = new ArrayList<Long>();
for( Object temp : groups ){
Group group = (Group) temp;
groupIds.add(group.getId());
}
return groupIds;
}
public boolean isOperatorInGroup(Long groupId, Long operatorId) {
List<Long> groupIds = getChildrenGroupIds(groupId);
if( EasyUtils.isNullOrEmpty(groupIds) ) return false;
String hql = "select distinct gu.id from GroupUser gu where gu.groupId in (:groupIds) and gu.userId = :userId";
List<?> list = getEntities(hql, new Object[]{"groupIds", "userId"}, new Object[]{groupIds, operatorId});
return !list.isEmpty();
}
//******************************************* 按组或按查询条件查询用户 *******************************************
public PageInfo getUsersByGroup(Long groupId, Integer pageNum, String...orderBy) {
String hql = "select distinct u, g.id as groupId, g.name as groupName, gu.decode "
+ " from User u, GroupUser gu, Group g"
+ " where u.id = gu.userId and gu.groupId = g.id and g.id = :groupId ";
UMQueryCondition condition = new UMQueryCondition();
condition.setGroupId(groupId);
condition.getPage().setPageNum(pageNum);
if(orderBy != null) {
condition.getOrderByFields().addAll( Arrays.asList(orderBy) );
} else {
condition.getOrderByFields().add(" gu.decode ");
}
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
PageInfo page = pageQuery.getResultList();
page.setItems( fillGroupInfo2User(page.getItems()) );
return page;
}
public PageInfo getUsersByOtherGroupNoPermission(Long groupId, Integer pageNum, String...orderBy) {
String sql = "select distinct u.id, u.userName, u.loginName, g.id as groupId, g.name as groupName, "
+ " u1.id as appUserId, u1.userName as appUserName,u1.loginName as appLoginName, g1.id as appGroupId, g1.name as appGroupName, gu.decode "
+ " from um_user u, um_groupuser gu, um_group g, "
+ " um_user u1, um_groupuser gu1, um_group g1"
+ " where u.id = gu.userId and gu.groupId = g.id and g.id = :groupId "
+ " and u.appUserId = u1.id(+) "
+ " and u1.id = gu1.userId(+) and gu1.groupId = g1.id(+) ";
UMQueryCondition condition = new UMQueryCondition();
condition.setGroupId(groupId);
condition.getPage().setPageNum(pageNum);
if(orderBy != null) {
condition.getOrderByFields().addAll( Arrays.asList(orderBy) );
} else {
condition.getOrderByFields().add(" gu.decode ");
}
PaginationQueryBySQL pageQuery = new PaginationQueryBySQL(em, sql, condition);
PageInfo page = pageQuery.getResultList();
page.setItems(fillOtherGroupInfo(page.getItems()));
return page;
}
public PageInfo searchOtherUser(UMQueryCondition condition, Integer pageNum){
List<Long> groupIds = getChildrenGroupIds(condition.getGroupId());
if( EasyUtils.isNullOrEmpty(groupIds) ) return null;
String sql = "select distinct u.id, u.userName, u.loginName, g.id as groupId, g.name as groupName, "
+ " u1.id as appUserId, u1.userName as appUserName,u1.loginName as appLoginName, g1.id as appGroupId, g1.name as appGroupName, gu.decode "
+ " from um_user u, um_groupuser gu, um_group g, "
+ " um_user u1, um_groupuser gu1, um_group g1"
+ " where u.id = gu.userId and gu.groupId = g.id and g.id = :groupId "
+ " and u.appUserId = u1.id(+) "
+ " and u1.id = gu1.userId(+) and gu1.groupId = g1.id(+) "
+ " ${loginName} ${userName} ${employeeNo} ${sex} ${birthday} ${certificateNumber} ";
condition.getPage().setPageNum(pageNum);
condition.setGroupIds(groupIds);
condition.getOrderByFields().add(" gu.decode "); // decode 作为最后一道排序条件
Set<String> set = condition.getIgnoreProperties();
set.add("userId");
set.add("groupType");
set.add("groupId");
PaginationQueryBySQL pageQuery = new PaginationQueryBySQL(em, sql, condition);
PageInfo page = pageQuery.getResultList();
page.setItems(fillOtherGroupInfo(page.getItems()));
return page;
}
public PageInfo searchUser(UMQueryCondition condition, Integer pageNum) {
List<Long> groupIds = getChildrenGroupIds(condition.getGroupId());
if( EasyUtils.isNullOrEmpty(groupIds) ) return null;
String hql = "select distinct u, g.id as groupId, g.name as groupName, gu.decode "
+ " from User u, GroupUser gu, Group g "
+ " where u.id = gu.userId and gu.groupId = g.id and g.id in (:groupIds) "
+ " ${loginName} ${userName} ${employeeNo} ${sex} ${birthday} ${certificateNumber} ";
condition.getPage().setPageNum(pageNum);
condition.setGroupIds(groupIds);
Set<String> set = condition.getIgnoreProperties();
set.add("userId");
set.add("groupType");
set.add("groupId");
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
PageInfo page = pageQuery.getResultList();
page.setItems(fillGroupInfo2User(page.getItems()));
return page;
}
}