Prechádzať zdrojové kódy

feat: 设备表导出加入部门森林聚合,新增用户表导出

zengweijie 2 rokov pred
rodič
commit
cba25a1be1

+ 4 - 0
smsb-customer-manager-adapter/pom.xml

@@ -42,6 +42,10 @@
             <groupId>org.keycloak</groupId>
             <artifactId>keycloak-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 179 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/utils/EasyExcelUtil.java

@@ -0,0 +1,179 @@
+package com.inspur.customer.utils;
+
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
+import com.alibaba.excel.write.handler.WriteHandler;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.google.common.collect.Lists;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.util.ReflectionUtils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/12/12
+ **/
+public class EasyExcelUtil {
+
+    /**
+     * 导出 Excel :一个 sheet,带表头.
+     *
+     * @param response  HttpServletResponse
+     * @param data      数据 list,每个元素为一个 BaseRowModel
+     * @param fileName  导出的文件名
+     * @param sheetName 导入文件的 sheet 名
+     * @param model     映射实体类,Excel 模型
+     * @throws Exception 异常
+     */
+    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class<?> model, boolean putExportTimeToHead) throws Exception {
+        writeExcel(response, data, fileName, sheetName, model, null, putExportTimeToHead);
+    }
+
+    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class<?> model, List<WriteHandler> writeHandlerList, boolean putExportTimeToHead) throws Exception {
+        // 头的策略
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        //设置表头居中对齐
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 颜色
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontHeightInPoints((short) 16);
+        // 字体
+        headWriteCellStyle.setWriteFont(headWriteFont);
+        headWriteCellStyle.setWrapped(true);
+        // 内容的策略
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+        WriteFont contentWriteFont = new WriteFont();
+        contentWriteFont.setFontHeightInPoints((short) 12);
+        contentWriteCellStyle.setWriteFont(contentWriteFont);
+        //设置内容靠中对齐
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
+        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
+        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
+        ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcelFactory.write(getOutputStream(fileName, response), model).excelType(ExcelTypeEnum.XLSX).sheet(sheetName);
+        if (writeHandlerList != null && !writeHandlerList.isEmpty()) {
+            for (WriteHandler writeHandler : writeHandlerList) {
+                excelWriterSheetBuilder.registerWriteHandler(writeHandler);
+            }
+        }
+        if (putExportTimeToHead) {
+            excelWriterSheetBuilder.head(getHeadWithExportTime(model));
+        }
+        excelWriterSheetBuilder.registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(data);
+    }
+
+    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, List<List<String>> head, List<WriteHandler> writeHandlerList, boolean putExportTimeToHead) throws Exception {
+        // 头的策略
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        //设置表头居中对齐
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 颜色
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontHeightInPoints((short) 16);
+        // 字体
+        headWriteCellStyle.setWriteFont(headWriteFont);
+        headWriteCellStyle.setWrapped(true);
+        // 内容的策略
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+        WriteFont contentWriteFont = new WriteFont();
+        contentWriteFont.setFontHeightInPoints((short) 12);
+        contentWriteCellStyle.setWriteFont(contentWriteFont);
+        //设置内容靠中对齐
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
+        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
+        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
+        ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcelFactory.write(getOutputStream(fileName, response)).excelType(ExcelTypeEnum.XLSX).sheet(sheetName);
+        if (writeHandlerList != null && !writeHandlerList.isEmpty()) {
+            for (WriteHandler writeHandler : writeHandlerList) {
+                excelWriterSheetBuilder.registerWriteHandler(writeHandler);
+            }
+        }
+        if (putExportTimeToHead) {
+            excelWriterSheetBuilder.head(getHeadWithExportTime(head));
+        }
+        excelWriterSheetBuilder.registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(data);
+    }
+
+    /**
+     * 导出文件时为Writer生成OutputStream.
+     *
+     * @param fileName 文件名
+     * @param response response
+     * @return ""
+     */
+    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
+        try {
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            response.setContentType("application/vnd.ms-excel;charset=utf-8");
+            response.setCharacterEncoding("utf8");
+            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
+            response.setHeader("Pragma", "public");
+            response.setHeader("Cache-Control", "no-store");
+            response.addHeader("Cache-Control", "max-age=0");
+            return response.getOutputStream();
+        } catch (IOException e) {
+            throw new Exception("导出excel表格失败!", e);
+        }
+    }
+
+    private static List<List<String>> getHeadWithExportTime(Class<?> clazz) {
+        List<List<String>> head = new ArrayList<>();
+        List<Field> fieldList = new ArrayList<>();
+        ReflectionUtils.doWithFields(clazz, fieldList::add);
+        List<ExcelProperty> annotationList = new ArrayList<>();
+        for (Field field : fieldList) {
+            ExcelProperty annotation = AnnotationUtils.getAnnotation(field, ExcelProperty.class);
+            if (annotation != null) {
+                annotationList.add(annotation);
+            }
+        }
+        annotationList.sort(Comparator.comparing(ExcelProperty::index));
+        for (ExcelProperty excelProperty : annotationList) {
+            head.add(Lists.newArrayList(excelProperty.value()));
+        }
+        String top = String.format("导出时间:%s", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        for (List<String> strings : head) {
+            strings.add(0, top);
+        }
+        return head;
+    }
+
+    private static List<List<String>> getHeadWithExportTime(List<List<String>> head) {
+        String top = String.format("导出时间:%s", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        for (List<String> strings : head) {
+            strings.add(0, top);
+        }
+        return head;
+    }
+}

+ 228 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/org/DepartmentExportController.java

@@ -0,0 +1,228 @@
+package com.inspur.customer.web.controller.org;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.inspur.customer.client.keycloak.KeycloakService;
+import com.inspur.customer.client.org.SmsbDepartmentService;
+import com.inspur.customer.object.keycloak.KeycloakUserCO;
+import com.inspur.customer.object.org.SmsbDepartmentCO;
+import com.inspur.customer.object.org.SmsbDepartmentCmd;
+import com.inspur.customer.object.org.SmsbSimpleUserCO;
+import com.inspur.customer.utils.EasyExcelUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/12/19
+ **/
+@Slf4j
+@RestController
+public class DepartmentExportController {
+    @DubboReference
+    private SmsbDepartmentService departmentService;
+    @DubboReference
+    private KeycloakService keycloakService;
+
+    @GetMapping("/admin/department/user/export")
+    public void queryDepartmentUserList(HttpServletResponse response, @Valid SmsbDepartmentCmd departmentCmd) throws Exception {
+        List<SmsbSimpleUserCO> dataList = departmentService.listDepartmentUser(departmentCmd);
+        List<SimpleUserCOHolder> holderList = recursiveFindChildrenAndRemove(dataList, null);
+        dataList.sort(Comparator.comparing(SmsbSimpleUserCO::getUserName, Comparator.nullsLast(String::compareTo)));
+        recursiveAddToDataList(dataList, holderList);
+
+        Set<String> ros = keycloakService.getAllRoleOperationSupervisor().stream().map(KeycloakUserCO::getUsername).collect(Collectors.toUnmodifiableSet());
+        Set<String> ra = keycloakService.getAllRoleAdmin().stream().map(KeycloakUserCO::getUsername).collect(Collectors.toUnmodifiableSet());
+        Set<String> sa = keycloakService.getSuperAdmin().stream().map(KeycloakUserCO::getUsername).collect(Collectors.toUnmodifiableSet());
+
+        if (Integer.valueOf(1).equals(departmentCmd.getRecursive())) {
+            List<UserRow> rowList = Lists.newArrayListWithCapacity(dataList.size());
+            for (SmsbSimpleUserCO data : dataList) {
+                UserRow row = new UserRow();
+                rowList.add(row);
+
+                row.setDeptChainName(CollectionUtils.isEmpty(data.getDeptNameChain()) ? "根部门" : Joiner.on("/").join(data.getDeptNameChain()));
+                row.setUserName(data.getUserName());
+                row.setName(data.getName());
+                row.setEnabled(Integer.valueOf(1).equals(data.getEnabled()) ? "启用" : "禁用");
+                List<String> roleNameList = Lists.newArrayListWithCapacity(3);
+                if (ros.contains(data.getUserName())) {
+                    roleNameList.add("运营专员");
+                }
+                if (ra.contains(data.getUserName())) {
+                    roleNameList.add("管理员");
+                }
+                if (sa.contains(data.getUserName())) {
+                    roleNameList.add("超级管理员");
+                }
+                row.setRole(Joiner.on("/").join(roleNameList));
+            }
+            String deptNameChain = departmentCmd.getDepartmentId() == null
+                ? "根部门" : dataList.isEmpty() || CollectionUtils.isEmpty(dataList.get(0).getDeptNameChain())
+                ? Joiner.on("/").join(departmentService.queryDeptChain(departmentCmd.getDepartmentId()).stream().map(SmsbDepartmentCO::getName).collect(Collectors.toList()))
+                : Joiner.on("/").join(dataList.get(0).getDeptNameChain());
+            EasyExcelUtil.writeExcel(response, rowList, "操作员汇总表", "操作员汇总表", getDynamicHead2(deptNameChain), null, true);
+        } else {
+            List<DepartmentUserRow> rowList = Lists.newArrayListWithCapacity(dataList.size());
+            for (SmsbSimpleUserCO data : dataList) {
+                DepartmentUserRow row = new DepartmentUserRow();
+                rowList.add(row);
+
+                row.setUserName(data.getUserName());
+                row.setName(data.getName());
+                row.setEnabled(Integer.valueOf(1).equals(data.getEnabled()) ? "启用" : "禁用");
+                List<String> roleNameList = Lists.newArrayListWithCapacity(3);
+                if (ros.contains(data.getUserName())) {
+                    roleNameList.add("运营专员");
+                }
+                if (ra.contains(data.getUserName())) {
+                    roleNameList.add("管理员");
+                }
+                if (sa.contains(data.getUserName())) {
+                    roleNameList.add("超级管理员");
+                }
+                row.setRole(Joiner.on("/").join(roleNameList));
+            }
+            String deptNameChain = departmentCmd.getDepartmentId() == null
+                ? "根部门" : dataList.isEmpty() || CollectionUtils.isEmpty(dataList.get(0).getDeptNameChain())
+                ? Joiner.on("/").join(departmentService.queryDeptChain(departmentCmd.getDepartmentId()).stream().map(SmsbDepartmentCO::getName).collect(Collectors.toList()))
+                : Joiner.on("/").join(dataList.get(0).getDeptNameChain());
+
+            EasyExcelUtil.writeExcel(response, rowList, "操作员汇总表", "操作员汇总表", getDynamicHead(deptNameChain), null, true);
+        }
+    }
+
+    @Data
+    public static class SimpleUserCOHolder {
+        Long deptId;
+        String deptName;
+        List<SmsbSimpleUserCO> userList;
+        List<SimpleUserCOHolder> children;
+    }
+
+    private void recursiveAddToDataList(List<SmsbSimpleUserCO> dataList, List<SimpleUserCOHolder> holderList) {
+        for (SimpleUserCOHolder holder : holderList) {
+            dataList.addAll(holder.getUserList());
+            recursiveAddToDataList(dataList, holder.getChildren());
+        }
+    }
+
+    private List<SimpleUserCOHolder> recursiveFindChildrenAndRemove(List<SmsbSimpleUserCO> dataList, SimpleUserCOHolder parent) {
+        Map<Long, SimpleUserCOHolder> map = Maps.newHashMap();
+        Iterator<SmsbSimpleUserCO> iterator = dataList.iterator();
+
+        while (iterator.hasNext()) {
+            SmsbSimpleUserCO next = iterator.next();
+            List<Long> deptIdChain = next.getDeptIdChain();
+            if (parent == null && !CollectionUtils.isEmpty(deptIdChain) && deptIdChain.size() == 1
+                || parent != null && deptIdChain != null && deptIdChain.size() > 1 && deptIdChain.get(deptIdChain.size() - 2).equals(parent.getDeptId())) {
+                Long deptId = next.getDeptIdChain().get(next.getDeptIdChain().size() - 1);
+                map.computeIfAbsent(deptId, key -> {
+                    SimpleUserCOHolder holder = new SimpleUserCOHolder();
+                    holder.setDeptId(key);
+                    holder.setUserList(Lists.newArrayList());
+                    holder.setDeptName(next.getDeptNameChain().get(next.getDeptNameChain().size() - 1));
+                    return holder;
+                });
+                map.get(deptId).getUserList().add(next);
+                iterator.remove();
+            }
+        }
+        List<SimpleUserCOHolder> result = Lists.newArrayList(map.values());
+        for (SimpleUserCOHolder holder : result) {
+            holder.setChildren(recursiveFindChildrenAndRemove(dataList, holder));
+            holder.getUserList().sort(Comparator.comparing(SmsbSimpleUserCO::getUserName, Comparator.nullsLast(String::compareTo)));
+        }
+        result.sort(Comparator.comparing(SimpleUserCOHolder::getDeptName, Comparator.nullsLast(String::compareTo)));
+        return result;
+    }
+
+    private List<List<String>> getDynamicHead(String deptNameChain) {
+        List<List<String>> head = Lists.newArrayList();
+        LinkedList<String> temp = Lists.newLinkedList();
+        temp.add(deptNameChain);
+        temp.add("账号");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(deptNameChain);
+        temp.add("使用者");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(deptNameChain);
+        temp.add("账号状态");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(deptNameChain);
+        temp.add("权限");
+        head.add(temp);
+        return head;
+    }
+
+    private List<List<String>> getDynamicHead2(String deptNameChain) {
+        List<List<String>> head = Lists.newArrayList();
+        String top = String.format("%s  全量", deptNameChain);
+        LinkedList<String> temp = Lists.newLinkedList();
+        temp.add(top);
+        temp.add("账号");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(top);
+        temp.add("部门");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(top);
+        temp.add("使用者");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(top);
+        temp.add("账号状态");
+        head.add(temp);
+        temp = Lists.newLinkedList();
+        temp.add(top);
+        temp.add("权限");
+        head.add(temp);
+        return head;
+    }
+
+
+    @Data
+    public static class UserRow implements Serializable {
+        private static final long serialVersionUID = 2787092030966414730L;
+
+        private String deptChainName;
+
+        private String userName;
+
+        private String name;
+
+        private String enabled;
+
+        private String role;
+    }
+
+    @Data
+    public static class DepartmentUserRow implements Serializable {
+        private static final long serialVersionUID = 2787092030966414730L;
+
+        private String userName;
+
+        private String name;
+
+        private String enabled;
+
+        private String role;
+    }
+}

+ 16 - 1
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.cola.dto.PageResponse;
 import com.alibaba.cola.dto.Response;
 import com.alibaba.cola.dto.SingleResponse;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import com.inspur.customer.client.keycloak.KeycloakService;
 import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
@@ -148,6 +147,22 @@ public class KeycloakServiceImpl implements KeycloakService {
             .collect(Collectors.toList());
     }
 
+    @Override
+    public List<KeycloakUserCO> getAllRoleAdmin() {
+        return realmResource.roles().get("ROLE_ADMIN").getRoleUserMembers()
+            .stream()
+            .map(this::transfer)
+            .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<KeycloakUserCO> getAllRoleOperationSupervisor() {
+        return realmResource.roles().get("ROLE_OPERATION_SUPERVISOR").getRoleUserMembers()
+            .stream()
+            .map(this::transfer)
+            .collect(Collectors.toList());
+    }
+
     @Override
     public List<KeycloakUserCO> getGroupAdmin(String group) {
         return getUserByRoleAndGroup(group, "ROLE_ADMIN");

+ 52 - 3
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.inspur.customer.client.keycloak.KeycloakService;
 import com.inspur.customer.client.org.SmsbDepartmentService;
 import com.inspur.customer.client.org.SmsbDepartmentUserService;
@@ -26,9 +27,7 @@ import org.springframework.util.CollectionUtils;
 
 import javax.ws.rs.NotFoundException;
 import java.time.LocalDateTime;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -167,6 +166,56 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
             Objects.nonNull(departmentCmd.getDepartmentId()) ? super.getById(departmentCmd.getDepartmentId()).getPath() : null);
     }
 
+    @Override
+    public List<SmsbSimpleUserCO> listDepartmentUser(SmsbDepartmentCmd departmentCmd) {
+        List<SmsbSimpleUserCO> simpleUserCOList = departmentUserService.listUserByDeprIds(departmentCmd,
+            Objects.nonNull(departmentCmd.getDepartmentId()) ? super.getById(departmentCmd.getDepartmentId()).getPath() : null);
+        List<Long> deptIdList = simpleUserCOList.stream().map(SmsbSimpleUserCO::getDepartmentId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        if (deptIdList.isEmpty()) {
+            return simpleUserCOList;
+        }
+        Map<Long, List<SmsbSimpleUserCO>> deptIdUserMap = simpleUserCOList
+            .stream()
+            .filter(t -> Objects.nonNull(t.getDepartmentId()))
+            .collect(Collectors.groupingBy(SmsbSimpleUserCO::getDepartmentId, Collectors.toList()));
+        List<SmsbDepartmentDO> departmentDOList = super.listByIds(deptIdList);
+        for (SmsbDepartmentDO departmentDO : departmentDOList) {
+            LinkedList<Long> deptIdChain = Lists.newLinkedList();
+            LinkedList<String> deptNameChain = Lists.newLinkedList();
+            SmsbDepartmentDO temp = departmentDO;
+            do {
+                deptIdChain.addFirst(temp.getId());
+                deptNameChain.addFirst(temp.getName());
+            } while (temp.getParentId() != null && (temp = super.getById(temp.getParentId())) != null && !temp.getId().equals(departmentDO.getId()));
+            for (SmsbSimpleUserCO simpleUserCO : deptIdUserMap.get(departmentDO.getId())) {
+                simpleUserCO.setDeptIdChain(deptIdChain);
+                simpleUserCO.setDeptNameChain(deptNameChain);
+            }
+        }
+        return simpleUserCOList;
+    }
+
+    @Override
+    public List<SmsbDepartmentCO> queryDeptChain(Long deptId) {
+        LinkedList<SmsbDepartmentCO> result = Lists.newLinkedList();
+
+        SmsbDepartmentDO departmentDO = super.getById(deptId);
+
+        if (departmentDO == null) {
+            return result;
+        }
+
+        SmsbDepartmentDO temp = departmentDO;
+
+        do {
+            SmsbDepartmentCO smsbDepartmentCO = new SmsbDepartmentCO();
+            BeanUtils.copyProperties(temp, smsbDepartmentCO);
+            result.addFirst(smsbDepartmentCO);
+        } while (temp.getParentId() != null && (temp = super.getById(temp.getParentId())) != null && !temp.getId().equals(departmentDO.getId()));
+
+        return result;
+    }
+
     private List<SmsbDepartmentCO> getChilde(Long id) {
         List<SmsbDepartmentDO> childList = this.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
             .eq(SmsbDepartmentDO::getIsDel, 0)

+ 33 - 2
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java

@@ -124,9 +124,40 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
             .eq(SmsbDepartmentUserDO::getUserId, userId)
             .last("limit 1"));
         SmsbSimpleUserCO simpleUser = new SmsbSimpleUserCO();
-        if(Objects.nonNull(user)){
-            BeanUtils.copyProperties(user , simpleUser);
+        if (Objects.nonNull(user)) {
+            BeanUtils.copyProperties(user, simpleUser);
         }
         return simpleUser;
     }
+
+    @Override
+    public List<SmsbSimpleUserCO> listUserByDeprIds(SmsbDepartmentCmd departmentCmd, String path) {
+        LambdaQueryWrapper<SmsbDepartmentUserDO> queryWrapper = Wrappers.lambdaQuery();
+        if (StringUtils.isNotEmpty(path)) {
+            switch (departmentCmd.getRecursive()) {
+                case 0:
+                    queryWrapper.eq(SmsbDepartmentUserDO::getPath, path);
+                    break;
+                case 1:
+                    queryWrapper.likeRight(SmsbDepartmentUserDO::getPath, path);
+                    break;
+                default:
+                    break;
+            }
+        } else {
+            queryWrapper.eq(SmsbDepartmentUserDO::getTenant, departmentCmd.getTenant());
+            if (departmentCmd.getRecursive() == 0) {
+                queryWrapper.isNull(SmsbDepartmentUserDO::getPath);
+            }
+        }
+        queryWrapper.orderByDesc(SmsbDepartmentUserDO::getCreateTime);
+        List<SmsbDepartmentUserDO> list = this.list(queryWrapper);
+        List<SmsbSimpleUserCO> smsbSimpleUserList = Lists.newArrayListWithCapacity(list.size());
+        list.forEach(user -> {
+            SmsbSimpleUserCO smsbSimpleUserCO = new SmsbSimpleUserCO();
+            BeanUtils.copyProperties(user, smsbSimpleUserCO);
+            smsbSimpleUserList.add(smsbSimpleUserCO);
+        });
+        return smsbSimpleUserList;
+    }
 }

+ 4 - 0
smsb-customer-manager-client/pom.xml

@@ -66,6 +66,10 @@
             <groupId>org.keycloak</groupId>
             <artifactId>keycloak-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 5 - 3
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/keycloak/KeycloakService.java

@@ -1,4 +1,5 @@
 package com.inspur.customer.client.keycloak;
+
 import com.alibaba.cola.dto.PageResponse;
 import com.alibaba.cola.dto.Response;
 import com.alibaba.cola.dto.SingleResponse;
@@ -7,11 +8,8 @@ import com.inspur.customer.object.keycloak.UsersRoleMappingDTO;
 import com.inspur.customer.object.org.SmsbDepartmentCmd;
 import com.inspur.customer.object.org.SmsbUserAdd;
 import com.inspur.customer.object.wechat.Pair;
-import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.representations.idm.GroupRepresentation;
-import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 import java.util.Map;
@@ -64,6 +62,10 @@ public interface KeycloakService {
 
     List<KeycloakUserCO> getSuperAdmin();
 
+    List<KeycloakUserCO> getAllRoleAdmin();
+
+    List<KeycloakUserCO> getAllRoleOperationSupervisor();
+
     List<KeycloakUserCO> getGroupAdmin(String group);
 
     String getSingleAttrByGroupPath(String group, String key);

+ 5 - 1
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentService.java

@@ -66,6 +66,10 @@ public interface SmsbDepartmentService {
      */
     PageResponse<SmsbSimpleUserCO> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd);
 
+    List<SmsbSimpleUserCO> listDepartmentUser(SmsbDepartmentCmd departmentCmd);
+
+    List<SmsbDepartmentCO> queryDeptChain(Long deptId);
+
     /**
      * 检查用户是否超级管理员以及该租户权限
      *
@@ -73,7 +77,7 @@ public interface SmsbDepartmentService {
      * @param tenant
      * @return
      */
-    Response checkOperationAuthority(String userId , String tenant);
+    Response checkOperationAuthority(String userId, String tenant);
 
     /**
      * 通过id获取一条

+ 2 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java

@@ -90,4 +90,6 @@ public interface SmsbDepartmentUserService {
      * @return
      */
     SmsbSimpleUserCO getOneByUserId(String userId);
+
+    List<SmsbSimpleUserCO> listUserByDeprIds(SmsbDepartmentCmd departmentCmd, String path);
 }

+ 7 - 2
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbSimpleUserCO.java

@@ -3,6 +3,7 @@ package com.inspur.customer.object.org;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * @Author wangbo13
@@ -45,8 +46,12 @@ public class SmsbSimpleUserCO implements Serializable {
 
     /**
      * 状态
-     * 0:
-     * 1:
+     * 0:
+     * 1:
      */
     private Integer enabled;
+
+    private List<Long> deptIdChain;
+
+    private List<String> deptNameChain;
 }

+ 2 - 2
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbDepartmentUserDO.java

@@ -59,8 +59,8 @@ public class SmsbDepartmentUserDO implements Serializable {
 
     /**
      * 状态
-     * 0:
-     * 1:
+     * 0:
+     * 1:
      */
     private Integer enabled;