package com.norteksoft.bs.rank.service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.acs.service.organization.DepartmentManager;
import com.norteksoft.acs.service.organization.UserManager;
import com.norteksoft.bs.rank.dao.RankDao;
import com.norteksoft.bs.rank.dao.RankUserDao;
import com.norteksoft.bs.rank.entity.Superior;
import com.norteksoft.bs.rank.entity.Subordinate;
import com.norteksoft.bs.rank.enumeration.SubordinateType;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.Workgroup;
import com.norteksoft.product.api.impl.AcsServiceImpl;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.ThreadParameters;
@Service
@Transactional
public class RankManager {
private Log log = LogFactory.getLog(RankManager.class);
private RankDao dataDictionaryRankDao;
private RankUserDao dataDictionaryRankuserDao;
private UserManager userManager;
@Autowired
private DepartmentManager departmentManager;
@Autowired
private AcsServiceImpl acsServiceImpl;
@Autowired
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
@Autowired
public void setDataDictionaryRankDao(RankDao dataDictionaryRankDao) {
this.dataDictionaryRankDao = dataDictionaryRankDao;
}
@Autowired
public void setDataDictionaryRankuserDao(
RankUserDao dataDictionaryRankuserDao) {
this.dataDictionaryRankuserDao = dataDictionaryRankuserDao;
}
public Long getSystemId(){
return ContextUtils.getSystemId();
}
public Long getCompanyId(){
return ContextUtils.getCompanyId();
}
public String getLoginName(){
return ContextUtils.getLoginName();
}
public void getDataDictRanksPage(Page<Superior> dictRankPage){
dataDictionaryRankDao.getDataDictRanksPage(dictRankPage,getCompanyId());
}
public Superior getDataDictRankById(Long id){
return dataDictionaryRankDao.get(id);
}
//验证用户上下级,确保一个下级只有一个上级
public int countSup(String usec,Long id,Long usid){
int countp = 0;
if(id!=null){
Superior usper=dataDictionaryRankDao.get(id);
if(usper!=null){
if(usper.getUserId().equals(usid)){
String[] uslist=usec.split(",");
if(uslist.length>0){
for(int i=0;i<uslist.length;i++){
String[] infos=uslist[i].split(";");
if(infos.length==4){
List<Subordinate> slist=dataDictionaryRankuserDao.find("select ddr from Subordinate ddr where ddr.loginName=? and ddr.name=?",infos[3],infos[0]);
if(slist.size()>0){
if(!slist.get(0).getDataDictionaryRank().getUserId().equals(usid)){
countp++;
}
}
if(countp>0){
break;
}
}else{
List<Subordinate> slist1=dataDictionaryRankuserDao.find("select ddr from Subordinate ddr where ddr.name=?",infos[0]);
if(slist1.size()>0){
if(!slist1.get(0).getDataDictionaryRank().getUserId().equals(usid)){
countp++;
}
}
if(countp>0){
break;
}
}
}
}
}
}
}else{
String[] uslist=usec.split(",");
if(uslist.length>0){
for(int i=0;i<uslist.length;i++){
String[] infos=uslist[i].split(";");
if(infos.length==4){
List<Subordinate> slist=dataDictionaryRankuserDao.find("select ddr from Subordinate ddr where ddr.loginName=? and ddr.name=?",infos[3],infos[0]);
if(slist.size()>0){
if(!slist.get(0).getDataDictionaryRank().getUserId().equals(usid)){
countp++;
}
}
if(countp>0){
break;
}
}else{
List<Subordinate> slist1=dataDictionaryRankuserDao.find("select ddr from Subordinate ddr where ddr.name=?",infos[0]);
if(slist1.size()>0){
if(!slist1.get(0).getDataDictionaryRank().getUserId().equals(usid)){
countp++;
}
}
if(countp>0){
break;
}
}
}
}
}
return countp;
}
@Transactional(readOnly=false)
public void saveDataDictRank(Superior dataDictionaryRank,List<String> userInfos){
dataDictionaryRank.setCompanyId(getCompanyId());
dataDictionaryRank.setSystemId(getSystemId());
dataDictionaryRank.setCreator(getLoginName());
dataDictionaryRankDao.save(dataDictionaryRank);
List<Subordinate> ddrus=dataDictionaryRankuserDao.getDataDictRankUsersByRankId(dataDictionaryRank.getId());
for(Subordinate ddru:ddrus){
dataDictionaryRankuserDao.delete(ddru);
}
String[] info=userInfos.get(0).split(";");
String[] ids=info[0].split(",");
String[] names=info[1].split(",");
String[] loginName=info[2].split(",");
Integer type=Integer.parseInt(info[3]);
for(int i=0;i<ids.length;i++){
Subordinate dataDictRankUser=new Subordinate();
dataDictRankUser.setCompanyId(getCompanyId());
dataDictRankUser.setSystemId(getSystemId());
dataDictRankUser.setName(names[i]);
dataDictRankUser.setTargetId(Long.parseLong(ids[i]));
dataDictRankUser.setLoginName((!loginName[0].equals(""))?loginName[i]:"");
if(type==0){
dataDictRankUser.setSubordinateType(SubordinateType.USER);
}else if(type==1){
dataDictRankUser.setSubordinateType(SubordinateType.DEPARTMENT);
}else{
dataDictRankUser.setSubordinateType(SubordinateType.WORKGROUP);
}
dataDictRankUser.setDataDictionaryRank(dataDictionaryRank);
dataDictionaryRankuserDao.save(dataDictRankUser);
}
}
@Transactional(readOnly=false)
public void deleteDataDictRanks(String dictRankIds){
List<Long> dids=getList(dictRankIds);;
for(int i=0;i<dids.size();i++){
List<Subordinate> ddrus=dataDictionaryRankuserDao.getDataDictRankUsersByRankId(dids.get(i));
for(Subordinate ddru:ddrus){
dataDictionaryRankuserDao.delete(ddru);
}
dataDictionaryRankDao.delete(dids.get(i));
}
}
public User getDirectLeader(Long userId,String loginName) {
if(userId==null){
return getDirectLeader(loginName);
}else{
return getDirectLeader(userId, getCompanyId());
}
}
public User getDirectLeader(Long userId) {
return getDirectLeader(userId, getCompanyId());
}
/**
* 根据用户ID查询该用户的直属领导
* @param userId
* @return
*/
public User getDirectLeader(Long userId, Long companyId) {
if(userId == null) throw new RuntimeException("没有给定查询直属领导的查询条件: 人员ID. ");
if(companyId == null) throw new RuntimeException("没有给定查询直属领导的查询条件: 公司ID. ");
List<Superior> dicts = dataDictionaryRankDao.getDirectLeader(userId, companyId);
Long leaderId = null;
if(!dicts.isEmpty()){
leaderId = getLeaderIdFromDict(dicts);
}else{
ThreadParameters parameters = new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
User user = userManager.getUserById(userId);
Long subCompanyId = null;
if(user!=null) subCompanyId = user.getSubCompanyId();
List<Long> deptIds = ApiFactory.getAcsService().getDepartmentIds(userId);
if(subCompanyId!=null){
deptIds.add(subCompanyId);//将分支机构id放入部门id集合中
}
dicts = dataDictionaryRankDao.getDirectLeaderByDeptId(deptIds, companyId);
if(!dicts.isEmpty()){
leaderId = getLeaderIdFromDict(dicts);
}
}
if(leaderId == null) return null;
else return userManager.getUserById(leaderId);
}
/**
* 根据用户登录名查询该用户的直属领导列表
* @param loginName
* @return
*/
public List<User> getDirectLeaders(String loginName) {
return getDirectLeaders(loginName,getCompanyId());
}
/**
* 根据用户登录名查询该用户的直属领导
* @param loginName
* @return
*/
public List<User> getDirectLeaders(String loginName,Long companyId) {
if(loginName == null) throw new RuntimeException("没有给定查询直属领导集合的查询条件: 人员登录名. ");
if(companyId == null) throw new RuntimeException("没有给定查询直属领导集合的查询条件: 公司ID. ");
List<Superior> dicts = dataDictionaryRankDao.getDirectLeader(loginName,companyId);
Long leaderId = null;
List<User> directs=new ArrayList<User>();
if(!dicts.isEmpty()){
for(Superior rank:dicts){
leaderId =rank.getUserId();
User user=userManager.getUserById(leaderId);
directs.add(user);
}
}else{
ThreadParameters parameters = new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
List<Department> depts = userManager.getDepartments(loginName);
dicts = dataDictionaryRankDao.getDirectLeader(depts, companyId);
if(!dicts.isEmpty()){
for(Superior rank:dicts){
leaderId =rank.getUserId();
User user=userManager.getUserById(leaderId);
directs.add(user);
}
}
}
if(directs.size()<=0) return null;
else return directs;
}
/**
* 根据用户登录名查询该用户的直属领导
* @param loginName
* @return
*/
public User getDirectLeader(String loginName) {
return getDirectLeader(loginName,getCompanyId());
}
/**
* 根据用户登录名查询该用户的直属领导
* @param loginName
* @return
*/
public User getDirectLeader(String loginName,Long companyId) {
if(loginName == null) throw new RuntimeException("没有给定查询直属领导的查询条件: 人员登录名. ");
if(companyId == null) throw new RuntimeException("没有给定查询直属领导的查询条件: 公司ID. ");
List<Superior> dicts = dataDictionaryRankDao.getDirectLeader(loginName,companyId);
Long leaderId = null;
if(!dicts.isEmpty()){
leaderId = getLeaderIdFromDict(dicts);
}else{
ThreadParameters parameters = new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
List<Department> depts = userManager.getDepartments(loginName);
dicts = dataDictionaryRankDao.getDirectLeader(depts, companyId);
if(!dicts.isEmpty()){
leaderId = getLeaderIdFromDict(dicts);
}
}
if(leaderId == null) return null;
else return userManager.getUserById(leaderId);
}
private Long getLeaderIdFromDict(List<Superior> dicts){
Long leaderId = null;
if(dicts.size() == 1){
leaderId = dicts.get(0).getUserId();
}else{
log.debug(" *** query direct leader error. DataDictionaryRank num [" + dicts.size() + "] *** ");
}
return leaderId;
}
public List<Superior> getDataDictRanks(String value){
return dataDictionaryRankDao.getDataDictRanks(getCompanyId(),value);
}
public static List<Long> getList(String ids){
String[] dids=ids.split(",");
List<Long> id=new ArrayList<Long>();
for(int i=0;i<dids.length;i++){
id.add(Long.parseLong(dids[i]));
}
return id;
}
public List<Superior> getRanks(Long companyId){
return dataDictionaryRankDao.getRanks(companyId);
}
public Superior getRankByTitle(String rankTitle){
return dataDictionaryRankDao.getRankByTitle(rankTitle);
}
@Transactional(readOnly=false)
public void saveDataDictRank(Superior rank){
dataDictionaryRankDao.save(rank);
}
/**
* 根据用户id查询该用户的直属下级
* @param userId
* @return
*/
public Set<User> getDirectLower(Long userId,Long companyId) {
if(userId == null) throw new RuntimeException("没有给定查询直属下级的查询条件: 人员id. ");
if(companyId == null) throw new RuntimeException("没有给定查询直属下级的查询条件: 公司ID. ");
Set<User> lowers = new HashSet<User>();
List<Superior> dicts = dataDictionaryRankDao.getDirectLower(userId,companyId);
for(Superior s:dicts){
List<Subordinate> subordinates = dataDictionaryRankuserDao.getDataDictRankUsersByRankId(s.getId());
for(Subordinate sn:subordinates){
if(sn.getSubordinateType()==SubordinateType.USER){
User user = userManager.getUserById(sn.getTargetId());
lowers.add(user);
}else if(sn.getSubordinateType()==SubordinateType.DEPARTMENT){
List<User> users = new ArrayList<User>();
Department dept = departmentManager.getDepartment(sn.getTargetId());
if(dept!=null){
if(dept.getBranch()){//如果是分支
users = acsServiceImpl.getAllUsersByBranchId(sn.getTargetId());
}else{
users = userManager.getUsersByDeptId(sn.getTargetId());
}
}
//直属下级不应包含直属上级用户
User u = userManager.getUserById(userId);
if(users.contains(u))users.remove(u);
//将所有用户添加到直属下级集合中
if(!users.isEmpty())lowers.addAll(users);
}else if(sn.getSubordinateType()==SubordinateType.WORKGROUP){
List<User> users = userManager.getUsersByWorkgroupId(sn.getTargetId());
//直属下级不应包含直属上级用户
User u = userManager.getUserById(userId);
if(users.contains(u))users.remove(u);
//将所有用户添加到直属下级集合中
if(!users.isEmpty())lowers.addAll(users);
}
}
}
return lowers;
}
}