package com.artfess.uc.util;
import com.artfess.base.feign.UCFeignService;
import com.artfess.base.util.AppUtil;
import com.artfess.base.util.BeanUtils;
import com.artfess.base.util.JsonUtil;
import com.artfess.base.util.StringUtil;
import com.artfess.uc.api.context.ICurrentContext;
import com.artfess.uc.api.model.IGroup;
import com.artfess.uc.api.model.IUser;
import com.artfess.uc.api.service.IUserService;
import com.artfess.uc.manager.UserManager;
import com.artfess.uc.model.Org;
import com.artfess.uc.model.User;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Maps;
import org.springframework.context.annotation.Primary;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
/**
* 获取上下文数据对象的工具类。
*
*
* 构建组:x5-org-core
* 作者:ray
* 邮箱:zhangyg@jee-soft.cn
* 日期:2013-12-20-上午9:38:46
* 版权:广州宏天软件有限公司版权所有
*
*/
@Service
@Primary
public class ContextUtil {
private static ContextUtil contextUtil;
private ICurrentContext currentContext;
public void setCurrentContext(ICurrentContext _currentContext){
contextUtil=this;
contextUtil.currentContext=_currentContext;
}
/**
* 获取当前执行人
* @return
* User
* @exception
* @since 1.0.0
*/
public static User getCurrentUser(){
try {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Assert.notNull(authentication, "当前登录用户不能为空");
Object principal = authentication.getPrincipal();
if(principal instanceof User) {
return (User)principal;
}else if(principal instanceof UserDetails) {
UserDetails ud = (UserDetails)principal;
User user = JsonUtil.toBean(JsonUtil.toJson(ud), User.class);
return user;
}
return null;
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public static String getCurrentUserId(){
User user = getCurrentUser();
return BeanUtils.isEmpty(user)?null:user.getUserId();
}
public static String getCurrentUserAccount(){
User user = getCurrentUser();
return BeanUtils.isEmpty(user)?null:user.getUsername();
}
public static String getCurrentUserName(){
User user = getCurrentUser();
return BeanUtils.isEmpty(user)?null:user.getFullname();
}
/**
* 获取当前人员的直属下级
* @return
* User
* @exception
* @since 1.0.0
*/
public static List getCurrentUserUnder() throws Exception {
String userId = getCurrentUserId();
UserManager userManager=AppUtil.getBean(UserManager.class);
List list = userManager.getUnderUsersByUserId(userId);
return list;
}
/**获取当前组织*/
public static IGroup getCurrentGroup(){
//return null;
//return contextUtil.currentContext.getCurrentGroup();
try {
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)){
ObjectNode orgObj = service.getMainGroup(userId);
if(BeanUtils.isNotEmpty(orgObj)){
boolean isParent = orgObj.get("isParent").asBoolean();
orgObj.put("isIsParent", isParent?1:0);
orgObj.remove("isParent");
IGroup org = JsonUtil.toBean(orgObj, Org.class);
return org;
}
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return null;
}
/**获取当前组织Id。组织为空则返回空*/
public static String getCurrentGroupId(){
IGroup iGroup = getCurrentGroup();
if(BeanUtils.isNotEmpty(iGroup)){
return iGroup.getGroupId();
}else{
return "";
}
}
public static String getCurrentOrgId(){
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)) {
ObjectNode orgObj = service.getMainGroup(userId);
if (BeanUtils.isNotEmpty(orgObj)) {
String orgKind = orgObj.get("orgKind").asText();
if(orgKind.equals("ogn")){
return orgObj.get("id").asText();
}
if(orgKind.equals("dept")){
return getParentOrgAttr(orgObj.get("parentId").asText(),"id");
}
}
}
return "";
}
public static List getCurrentAndChildOrgIds(){
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)) {
ObjectNode orgObj = service.getMainGroup(userId);
if (BeanUtils.isNotEmpty(orgObj)) {
// String orgKind = orgObj.get("orgKind").asText();
// if(orgKind.equals("ogn")){
Map map = Maps.newHashMap();
map.put("ids", orgObj.get("id").asText());
Map> childrenIds = service.getChildrenIds(map);
if (!CollectionUtils.isEmpty(childrenIds)) {
Set ids = childrenIds.get("ids");
List orgIds = new ArrayList<>(ids);
return orgIds;
}
return new ArrayList<>();
}
// }
}
return new ArrayList<>();
}
public static String getCurrentOrgName(){
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)) {
ObjectNode orgObj = service.getMainGroup(userId);
if (BeanUtils.isNotEmpty(orgObj)) {
String orgKind = orgObj.get("orgKind").asText();
if(orgKind.equals("ogn")){
return orgObj.get("name").asText();
}
if(orgKind.equals("dept")){
return getParentOrgAttr(orgObj.get("parentId").asText(),"name");
}
}
}
return "";
}
public static String getParentOrgAttr(String parentId,String attrName){
try {
UCFeignService service = AppUtil.getBean(UCFeignService.class);
ObjectNode parentOrgObj = service.getOrgByIdOrCode(parentId);
if(BeanUtils.isNotEmpty(parentOrgObj)){
String orgKind = parentOrgObj.get("orgKind").asText();
if(orgKind.equals("ogn")){
return parentOrgObj.get(attrName).asText();
}
if(orgKind.equals("dept")){
String parentOrgParentId = parentOrgObj.get("parentId").asText();
return getParentOrgAttr(parentOrgParentId,attrName);
}
}
} catch (Exception e) {
}
return "";
}
public static String getCurrentDeptId(){
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)) {
ObjectNode orgObj = service.getMainGroup(userId);
if (BeanUtils.isNotEmpty(orgObj)) {
String orgKind = orgObj.get("orgKind").asText();
if(orgKind.equals("dept")){
return orgObj.get("id").asText();
}
}
}
return "";
}
public static String getCurrentDeptName(){
UCFeignService service = AppUtil.getBean(UCFeignService.class);
String userId = getCurrentUserId();
if(StringUtil.isNotEmpty(userId)) {
ObjectNode orgObj = service.getMainGroup(userId);
if (BeanUtils.isNotEmpty(orgObj)) {
String orgKind = orgObj.get("orgKind").asText();
if(orgKind.equals("dept")){
return orgObj.get("name").asText();
}
}
}
return "";
}
/**
* 获取当前Locale。
* @return
* Locale
* @exception
* @since 1.0.0
*/
public static Locale getLocale(){
return contextUtil.currentContext.getLocale();
}
/**
* 清除当前执行人。
* void
* @exception
* @since 1.0.0
*/
public static void clearCurrentUser(){
if(contextUtil!=null){
contextUtil.currentContext.clearCurrentUser();
}
}
/**
* 设置当前执行人。
* @param user
* void
* @exception
* @since 1.0.0
*/
public static void setCurrentUser(IUser user){
Assert.isTrue(BeanUtils.isNotEmpty(user), "传入的用户不能为空");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Assert.isNull(authentication, "当前登录上下文中有登录用户时不能设置用户");
UsernamePasswordAuthenticationToken usernamePwdAuth = new UsernamePasswordAuthenticationToken(user, null);
SecurityContextHolder.getContext().setAuthentication(usernamePwdAuth);
}
/**
* 根据用户账户获取用户
*
* @param account
* @return
* @throws Exception
*/
public static IUser getUserByAccount(String account)
{
Assert.isTrue(StringUtil.isNotEmpty(account), "必须传入用户账号");
IUserService userServiceImpl=AppUtil.getBean(IUserService.class);
IUser user = userServiceImpl.getUserByAccount(account);
Assert.isTrue(BeanUtils.isNotEmpty(user), String.format("账号为:%s的用户不存在", account));
return user;
}
public static void setCurrentUserByAccount(String account){
setCurrentUser(getUserByAccount(account));
}
/**
* 设置当前组织(岗位)。
* @param group
* void
* @exception
* @since 1.0.0
*/
public static void setCurrentOrg(IGroup group){
contextUtil.currentContext.setCurrentGroup(group);
}
/**
* 设置Locale。
* @param locale
* void
* @exception
* @since 1.0.0
*/
public static void setLocale(Locale locale){
contextUtil.currentContext.setLocale(locale);
}
/**
* 清除Local。
* void
* @exception
* @since 1.0.0
*/
public static void cleanLocale(){
if(contextUtil!=null){
contextUtil.currentContext.clearLocale();
}
}
public static void clearAll() {
cleanLocale();
clearCurrentUser();
}
}