diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Employee.java b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Employee.java index e1f7bc4a..ab8b950b 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Employee.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Employee.java @@ -55,8 +55,8 @@ public class Employee extends DataEntity { private String empNo; // 员工工号 private String empName; // 员工姓名 private String empNameEn; // 员工英文名 - private Office office; // 机构编码 - private Company company; // 公司编码 + private Office office; // 机构对象 + private Company company; // 公司对象 private String postCode; // 根据职位查询 diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/utils/EmpUtils.java b/modules/core/src/main/java/com/jeesite/modules/sys/utils/EmpUtils.java index 3b6d64fd..565f6c47 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/utils/EmpUtils.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/utils/EmpUtils.java @@ -6,12 +6,17 @@ package com.jeesite.modules.sys.utils; import com.jeesite.common.collect.ListUtils; import com.jeesite.common.collect.SetUtils; +import com.jeesite.common.lang.ObjectUtils; import com.jeesite.common.lang.StringUtils; import com.jeesite.common.utils.SpringUtils; +import com.jeesite.common.web.http.ServletUtils; import com.jeesite.modules.sys.entity.*; import com.jeesite.modules.sys.service.CompanyService; import com.jeesite.modules.sys.service.EmployeeService; import com.jeesite.modules.sys.service.OfficeService; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.shiro.session.Session; +import org.springframework.core.NamedThreadLocal; import java.util.List; import java.util.Set; @@ -27,6 +32,10 @@ public class EmpUtils { public static final String CACHE_OFFICE_ALL_LIST = "officeAllList"; public static final String CACHE_COMPANY_ALL_LIST = "companyAllList"; public static final String CACHE_COMPANY_OFFICE_LIST = "employeeOfficeList"; + + // 当前线程部门,没有session环境下使用,优先级低于session + private static final ThreadLocal currentOfficeCode = new NamedThreadLocal<>("CurrentOfficeCode"); + private static final ThreadLocal currentOfficeName = new NamedThreadLocal<>("CurrentOfficeName"); /** * 静态内部类,延迟加载,懒汉式,线程安全的单例模式 @@ -326,4 +335,114 @@ public class EmpUtils { CorpUtils.removeCache(key); } } + + /** + * 获取当前登录用户的部门代码 + * @return + */ + public static String getCurrentOfficeCode() { + String officeCode = StringUtils.EMPTY; + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null){ + officeCode = (String)request.getAttribute("officeCode__"); + } + if (StringUtils.isBlank(officeCode)){ + Session session = UserUtils.getSubject().getSession(false); + if (session != null){ + officeCode = ObjectUtils.toString(session.getAttribute("officeCode")); + }else{ + officeCode = currentOfficeCode.get(); + } + } + if (StringUtils.isBlank(officeCode)){ + officeCode = getOffice().getOfficeCode(); + } + if (request != null){ + request.setAttribute("officeCode__", officeCode); + } + return ObjectUtils.toStringIgnoreNull(officeCode); + } + + /** + * 获取当前登录用户的部门名称 + * @return + */ + public static String getCurrentOfficeName() { + String officeName = StringUtils.EMPTY; + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null){ + officeName = (String)request.getAttribute("officeName__"); + } + if (StringUtils.isBlank(officeName)){ + Session session = UserUtils.getSubject().getSession(false); + if (session != null){ + officeName = ObjectUtils.toString(session.getAttribute("officeName")); + }else{ + officeName = currentOfficeName.get(); + } + } + if (StringUtils.isBlank(officeName)){ + officeName = getOffice().getOfficeName(); + } + if (request != null){ + request.setAttribute("officeName__", officeName); + } + return ObjectUtils.toStringIgnoreNull(officeName); + } + + /** + * 设置当前线程部门,没有session环境下使用,优先级低于session + * @author ThinkGem + */ + public static void setCurrentOffice(String officeCode, String officeName) { + Session session = UserUtils.getSubject().getSession(false); + setCurrentOffice(session, officeCode, officeName); + } + + /** + * 设置当前线程部门,没有session环境下使用,优先级低于session + * @author ThinkGem + */ + public static void setCurrentOffice(Session session, String officeCode, String officeName) { + if (session != null){ + session.setAttribute("officeCode", officeCode); + session.setAttribute("officeName", officeName); + }else{ + currentOfficeCode.set(officeCode); + currentOfficeName.set(officeName); + } + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null){ + request.setAttribute("officeCode__", officeCode); + request.setAttribute("officeName__", officeName); + } + } + + /** + * 移除当前线程部门,没有session环境下使用,优先级低于session + * @author ThinkGem + */ + public static void removeCurrentOffice() { + Session session = UserUtils.getSubject().getSession(false); + removeCurrentOffice(session); + } + + /** + * 移除当前线程部门,没有session环境下使用,优先级低于session + * @author ThinkGem + */ + public static void removeCurrentOffice(Session session) { + if (session != null){ + session.removeAttribute("officeCode"); + session.removeAttribute("officeName"); + }else { + currentOfficeCode.remove(); + currentOfficeName.remove(); + } + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null){ + request.removeAttribute("officeCode__"); + request.removeAttribute("officeName__"); + } + } } diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/web/user/EmpUserController.java b/modules/core/src/main/java/com/jeesite/modules/sys/web/user/EmpUserController.java index e5d8f7da..670a1b0e 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/web/user/EmpUserController.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/web/user/EmpUserController.java @@ -41,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 员工用户Controller @@ -449,5 +450,43 @@ public class EmpUserController extends BaseController { model.addAttribute("empUser", empUser); return "modules/sys/user/empUserSelect"; } + + /** + * 获取当前用户附属部门 + * @return + */ + @RequiresPermissions("user") + @RequestMapping(value = "officeListData") + @ResponseBody + public List officeListData () { + Employee employee = EmpUtils.getEmployee(); + return employeeService.findEmployeeOfficeList(employee); + } + + + /** + * 切换当前用户到附属部门 + * @param officeCode + * @return + */ + @RequiresPermissions("user") + @RequestMapping(value = "switchOffice/{officeCode}") + @ResponseBody + public String switchOffice(@PathVariable String officeCode) { + if (StringUtils.equals(officeCode, "default")) { + Office office = EmpUtils.getOffice(); + EmpUtils.setCurrentOffice(office.getOfficeCode(), office.getOfficeName()); + return renderResult(Global.TRUE, text("部门切换成功!")); + } + List employeeOfficeList = EmpUtils.getEmployeeOfficeList().stream() + .filter(e -> StringUtils.equals(e.getOfficeCode(), officeCode)).collect(Collectors.toList()); + if (!employeeOfficeList.isEmpty()) { + EmployeeOffice office = employeeOfficeList.get(0); + EmpUtils.setCurrentOffice(office.getOfficeCode(), office.getOfficeName()); + return renderResult(Global.TRUE, text("部门切换成功!")); + } else { + return renderResult(Global.FALSE, text("部门切换失败,所切换部门不是您的附属部门!")); + } + } }