Browse Source

1.更改需求
2.元素表、元素批量导入

liuyc 2 years ago
parent
commit
a57cab4c55
20 changed files with 846 additions and 80 deletions
  1. 28 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeBatchImportDTO.java
  2. 29 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO2.java
  3. 5 5
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java
  4. 1 1
      blade-service/blade-manager/pom.xml
  5. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  6. 3 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java
  7. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  8. 318 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java
  9. 91 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsFormElementBatchExcel.java
  10. 26 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsFormElementBatchImporter.java
  11. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java
  12. 12 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  13. 10 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java
  14. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  15. 18 27
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  16. 3 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  17. 209 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  18. 41 3
      blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java
  19. 4 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java
  20. 10 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

+ 28 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeBatchImportDTO.java

@@ -0,0 +1,28 @@
+package org.springblade.manager.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * wbsTree批量导入封装DTO
+ */
+@Data
+public class WbsTreeBatchImportDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 表主键节点id
+     */
+    private Long id;
+
+    /**
+     * 表名
+     */
+    private String tableName;
+
+    /**
+     * 初始化实体表名
+     */
+    private String initTableName;
+}

+ 29 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO2.java

@@ -0,0 +1,29 @@
+package org.springblade.system.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RoleVO2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * roleId
+     */
+    private String roleId;
+
+
+    /**
+     *
+     */
+    private String roleName;
+
+}
+

+ 5 - 5
blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java

@@ -171,11 +171,11 @@ public class FunctionMain {
           System.out.println(sql);
     }
 
-    public static void main(String[] args)  {
-//        createTable(Formula.class,"公式配置");
-//        System.out.println(builder(Formula.class));
-          getToken();
-    }
+//    public static void main(String[] args)  {
+////        createTable(Formula.class,"公式配置");
+////        System.out.println(builder(Formula.class));
+//          getToken();
+//    }
 
 
 }

+ 1 - 1
blade-service/blade-manager/pom.xml

@@ -11,7 +11,7 @@
 
     <artifactId>blade-manager</artifactId>
     <name>${project.artifactId}</name>
-    <version>${bladex.project.version}</version>
+<!--    <version>${bladex.project.version}</version>-->
     <packaging>jar</packaging>
 
     <repositories>

+ 5 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -223,10 +223,10 @@ public class ContractInfoController extends BladeController {
     /**
      * 根据项目id、合同id、角色id查询当前运维的用户
      */
-    @PostMapping("/findUserListByCondition")
+    @GetMapping("/findUserListByCondition")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "查询当前项目角色下的运维用户列表", notes = "传入项目id、角色id、合同id(非必传)、size每页数量、current当前页")
-    public R<IPage<User>> findUserListByCondition(@RequestBody FindAllUserByConditionDTO values, Query query) {
+    public R<IPage<User>> findUserListByCondition(FindAllUserByConditionDTO values, Query query) {
         IPage<User> users = contractInfoService.findUserListByCondition(Condition.getPage(query), values);
         return R.data(users);
     }
@@ -274,10 +274,10 @@ public class ContractInfoController extends BladeController {
     /**
      * 根据项目id、合同id、岗位id查询当前分配的用户-查询当前项目合同岗位下的用户
      */
-    @PostMapping("/findAllUserByCondition")
+    @GetMapping("/findAllUserByCondition")
     @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "查询当前项目合同岗位下的用户", notes = "传入项目id、合同id、岗位id")
-    public R<IPage<UserVO2>> findAllUserByCondition(@RequestBody FindAllUserByConditionDTO values, Query query) {
+    @ApiOperation(value = "查询当前项目合同岗位下的用户", notes = "传入项目id、合同id、岗位id、size每页数量、current当前页")
+    public R<IPage<UserVO2>> findAllUserByCondition(FindAllUserByConditionDTO values, Query query) {
         IPage<UserVO2> users = contractInfoService.findAllUserByCondition(Condition.getPage(query), values);
         return R.data(users);
     }

+ 3 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java

@@ -28,15 +28,13 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.excel.WbsExcelUtil;
-import org.springblade.manager.excel.WbsFormElementExcel;
-import org.springblade.manager.excel.WbsFormElementImporter;
-import org.springblade.manager.excel.WbsTreeExcel;
+import org.springblade.manager.excel.*;
 import org.springblade.manager.vo.WbsFormElementVO;
 import org.springblade.manager.vo.WbsTreeVO;
 import org.springblade.manager.wrapper.WbsFormElementWrapper;
@@ -143,7 +141,7 @@ public class WbsFormElementController extends BladeController {
     }
 
     /**
-     * 导入Wbs元素模板
+     * 导入Wbs元素
      */
     @PostMapping("/import-wbsElement")
     @ApiOperationSupport(order = 6)
@@ -192,16 +190,4 @@ public class WbsFormElementController extends BladeController {
     }
 
 
-    /**
-     * Wbs公有树节点批量导入元素表、元素
-     */
-    @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "Wbs公有树节点批量导入元素表与元素", notes = "传入excel文件")
-    @RequestMapping(value = "/import-wbsTreeTableAndForm", method = RequestMethod.POST)
-    public R importWbsTreeTableAndForm(@RequestPart("excelFile") MultipartFile excelFile,
-                                       @RequestPart("nodeId") String nodeId) {
-        boolean b = wbsFormElementService.importWbsTreeTableAndForm(excelFile, nodeId);
-        return R.status(b);
-    }
-
 }

+ 24 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -40,6 +40,7 @@ import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.excel.WbsExcelUtil;
+import org.springblade.manager.excel.WbsFormElementBatchExcel;
 import org.springblade.manager.excel.WbsTreeExcel;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsFormElementService;
@@ -343,6 +344,29 @@ public class WbsTreeController extends BladeController {
     }
 
 
+    /**
+     * 导出WBS元素批量模板
+     */
+    @GetMapping("/export-batchTemplate")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "导出WBS元素批量模板")
+    public void exportWbsTreeFormBatch(HttpServletResponse response) {
+        List<WbsFormElementBatchExcel> list = new ArrayList<>();
+        ExcelUtil.export(response, "WBS元素批量模板", "WBS元素批量模板", list, WbsFormElementBatchExcel.class);
+    }
+
+
+    /**
+     * Wbs公有树节点批量导入元素表、元素
+     */
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "Wbs公有树节点批量导入元素表与元素", notes = "传入excel文件/wbsTree对象")
+    @RequestMapping(value = "/import-wbsTreeFormBatch", method = RequestMethod.POST)
+    public R importWbsTreeTableAndForm(@RequestPart("excelFile") MultipartFile excelFile,
+                                       @RequestPart("wbsTree") WbsTree wbsTree) {
+        boolean b = wbsTreeService.importWbsTreeTableAndForm(excelFile, wbsTree);
+        return R.status(b);
+    }
 
 }
 

+ 318 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java

@@ -0,0 +1,318 @@
+package org.springblade.manager.excel;
+
+import com.alibaba.excel.util.CollectionUtils;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class WbsExcelBatchUtil {
+/*    public static void main(String[] args) throws IOException {
+        WbsExcelBatchUtil excelUtil = new WbsExcelBatchUtil();
+        //读取excel数据
+        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\隧道总体.xlsx");
+        for (Map<String, String> map : result) {
+            System.out.println(map);
+        }
+        List<Map<String, String>> maps = WbsExcelBatchUtil.removeRepeatMapByKey(result, "表名");
+
+    }*/
+
+
+
+
+
+    /**
+     * List<Map>去重
+     * @param list
+     * @param mapKey
+     * @return
+     */
+    public static List<Map<String, String>> removeRepeatMapByKey(List<Map<String, String>> list, String mapKey) {
+        if (CollectionUtils.isEmpty(list)) return null;
+        List<Map<String, String>> listMap = new ArrayList<>();
+        Map<String, Map> msp = new HashMap<>();
+        for (int i = list.size() - 1; i >= 0; i--) {
+            Map map = list.get(i);
+            String id = map.get(mapKey).toString();//错误举例 (String)map.get(mapKey);
+            map.remove(mapKey);
+            msp.put(id, map);
+        }
+        Set<String> mspKey = msp.keySet();
+        for (String key : mspKey) {
+            Map newMap = msp.get(key);
+            newMap.put(mapKey, key);
+            listMap.add(newMap);
+        }
+        return listMap;
+    }
+
+
+    /**
+     * 读取excel数据
+     * @param path
+     */
+    public ArrayList<Map<String, String>> readExcelToObj(String path) throws IOException {
+        Workbook wb = null;
+        ArrayList<Map<String, String>> result = null;
+        try {
+            wb = WorkbookFactory.create(new File(path));
+            result = readExcel(wb, 0, 2, 0);
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            wb.close();
+        }
+        return result;
+    }
+
+    /**
+     * 读取excel文件
+     * @param wb
+     * @param sheetIndex    sheet页下标:从0开始
+     * @param startReadLine 开始读取的行:从0开始
+     * @param tailLine      去除最后读取的行
+     */
+    private ArrayList<Map<String, String>> readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
+        Sheet sheet = wb.getSheetAt(sheetIndex);
+        Row row = null;
+        ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
+        for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {
+            row = sheet.getRow(i);
+            Map<String, String> map = new HashMap<String, String>();
+            for (Cell c : row) {
+                String returnStr = "";
+                boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
+                //判断是否具有合并单元格
+                if (isMerge) {
+                    String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
+                    returnStr = rs;
+                } else {
+                    c.setCellType(CellType.STRING);
+                    returnStr = c.getRichStringCellValue().getString();
+                }
+                if (c.getColumnIndex() == 1) {
+                    map.put("表名", returnStr);
+                } else if (c.getColumnIndex() == 2) {
+                    map.put("字段名", returnStr);
+                } else if (c.getColumnIndex() == 3) {
+                    map.put("数据类型", returnStr);
+                } else if (c.getColumnIndex() == 5) {
+                    map.put("允许偏差范围", returnStr);
+                } else if (c.getColumnIndex() == 6) {
+                    map.put("计算公式、方法或数值", returnStr);
+                } else if (c.getColumnIndex() == 7) {
+                    map.put("表类型", returnStr);
+                } else if (c.getColumnIndex() == 9) {
+                    map.put("备注", returnStr);
+                }
+            }
+            result.add(map);
+        }
+        return result;
+    }
+
+    /**
+     * 获取合并单元格的值
+     *
+     * @param sheet
+     * @param row
+     * @param column
+     * @return
+     */
+    private String getMergedRegionValue(Sheet sheet, int row, int column) {
+        int sheetMergeCount = sheet.getNumMergedRegions();
+        for (int i = 0; i < sheetMergeCount; i++) {
+            CellRangeAddress ca = sheet.getMergedRegion(i);
+            int firstColumn = ca.getFirstColumn();
+            int lastColumn = ca.getLastColumn();
+            int firstRow = ca.getFirstRow();
+            int lastRow = ca.getLastRow();
+            if (row >= firstRow && row <= lastRow) {
+                if (column >= firstColumn && column <= lastColumn) {
+                    Row fRow = sheet.getRow(firstRow);
+                    Cell fCell = fRow.getCell(firstColumn);
+                    return getCellValue(fCell);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 判断合并行
+     * @param sheet
+     * @param row
+     * @param column
+     * @return
+     */
+    private boolean isMergedRow(Sheet sheet, int row, int column) {
+        int sheetMergeCount = sheet.getNumMergedRegions();
+        for (int i = 0; i < sheetMergeCount; i++) {
+            CellRangeAddress range = sheet.getMergedRegion(i);
+            int firstColumn = range.getFirstColumn();
+            int lastColumn = range.getLastColumn();
+            int firstRow = range.getFirstRow();
+            int lastRow = range.getLastRow();
+            if (row == firstRow && row == lastRow) {
+                if (column >= firstColumn && column <= lastColumn) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断指定的单元格是否是合并单元格
+     * @param sheet
+     * @param row    行下标
+     * @param column 列下标
+     * @return
+     */
+    private boolean isMergedRegion(Sheet sheet, int row, int column) {
+        int sheetMergeCount = sheet.getNumMergedRegions();
+        for (int i = 0; i < sheetMergeCount; i++) {
+            CellRangeAddress range = sheet.getMergedRegion(i);
+            int firstColumn = range.getFirstColumn();
+            int lastColumn = range.getLastColumn();
+            int firstRow = range.getFirstRow();
+            int lastRow = range.getLastRow();
+            if (row >= firstRow && row <= lastRow) {
+                if (column >= firstColumn && column <= lastColumn) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断sheet页中是否含有合并单元格
+     * @param sheet
+     * @return
+     */
+    private boolean hasMerged(Sheet sheet) {
+        return sheet.getNumMergedRegions() > 0 ? true : false;
+    }
+
+    /**
+     * 合并单元格
+     * @param sheet
+     * @param firstRow 开始行
+     * @param lastRow  结束行
+     * @param firstCol 开始列
+     * @param lastCol  结束列
+     */
+    private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
+        sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
+    }
+
+    /**
+     * 获取单元格的值
+     * @param cell
+     * @return
+     */
+    private String getCellValue(Cell cell) {
+
+        if (cell == null) return "";
+
+        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
+
+            return cell.getStringCellValue();
+
+        } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
+
+            return String.valueOf(cell.getBooleanCellValue());
+
+        } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
+
+            return cell.getCellFormula();
+
+        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
+
+            return String.valueOf(cell.getNumericCellValue());
+
+        }
+        return "";
+    }
+
+    /**
+     * 从excel读取内容
+     */
+    private static void readContent(String fileName) {
+        boolean isE2007 = false;    //判断是否是excel2007格式
+        if (fileName.endsWith("xlsx"))
+            isE2007 = true;
+        try {
+            InputStream input = new FileInputStream(fileName);  //建立输入流
+            Workbook wb = null;
+            //根据文件格式(2003或者2007)来初始化
+            if (isE2007) {
+                wb = new XSSFWorkbook(input);
+            } else {
+                wb = new HSSFWorkbook(input);
+            }
+            Sheet sheet = wb.getSheetAt(0);     //获得第一个表单
+            Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
+            while (rows.hasNext()) {
+                Row row = rows.next();  //获得行数据
+                System.out.println("Row #" + row.getRowNum());  //获得行号从0开始
+                Iterator<Cell> cells = row.cellIterator();    //获得第一行的迭代器
+                while (cells.hasNext()) {
+                    Cell cell = cells.next();
+                    System.out.println("Cell #" + cell.getColumnIndex());
+                    switch (cell.getCellType()) {   //根据cell中的类型来输出数据
+                        case HSSFCell.CELL_TYPE_NUMERIC:
+                            System.out.println(cell.getNumericCellValue());
+                            break;
+                        case HSSFCell.CELL_TYPE_STRING:
+                            System.out.println(cell.getStringCellValue());
+                            break;
+                        case HSSFCell.CELL_TYPE_BOOLEAN:
+                            System.out.println(cell.getBooleanCellValue());
+                            break;
+                        case HSSFCell.CELL_TYPE_FORMULA:
+                            System.out.println(cell.getCellFormula());
+                            break;
+                        default:
+                            System.out.println("unsuported sell type=======" + cell.getCellType());
+                            break;
+                    }
+                }
+            }
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取path路径
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static File convert(MultipartFile file) throws IOException {
+        File convFile = new File(Objects.requireNonNull(Objects.requireNonNull(file.getOriginalFilename())));
+        FileOutputStream fos = null;
+        try {
+            convFile.createNewFile();
+            fos = new FileOutputStream(convFile);
+            fos.write(file.getBytes());
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            fos.close();
+        }
+        return convFile;
+    }
+}

+ 91 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsFormElementBatchExcel.java

@@ -0,0 +1,91 @@
+package org.springblade.manager.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * WbsFormElementExcel
+ *
+ * @author liuyc
+ */
+@Data
+@ColumnWidth(16)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class WbsFormElementBatchExcel implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * AID
+     */
+    @ExcelProperty({"标题", "AID"})
+    private String aId;
+
+    /**
+     * 表单名
+     */
+    @ExcelProperty({"标题", "表名"})
+    private String tableName;
+
+
+    /**
+     * 表单类型
+     */
+    @ExcelProperty({"标题", "表类型"})
+    private String tableType;
+
+    /**
+     * 字段名称
+     */
+    @ExcelProperty({"标题", "字段名称"})
+    private String elementName;
+
+    /**
+     * 元素类型
+     */
+    @ExcelProperty({"标题", "数据类型"})
+    private String elementType;
+
+    /**
+     * 获取方式
+     */
+    @ExcelProperty({"标题", "获取方式"})
+    private String getMethod;
+
+    /**
+     * 元素长度
+     */
+    @ExcelProperty({"标题", "长度"})
+    private String elementLength;
+
+    /**
+     * 允许偏差值
+     */
+    @ExcelProperty({"标题", "允许偏差值"})
+    private String elementAllowDeviation;
+
+    /**
+     * 检查方法
+     */
+    @ExcelProperty({"标题", "检查方法和频率"})
+    private String elementInspectionMethod;
+
+    /**
+     * 是否必填
+     */
+    @ExcelProperty({"标题", "必填"})
+    private String isRequired;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty({"标题", "备注"})
+    private String remark;
+
+
+}

+ 26 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsFormElementBatchImporter.java

@@ -0,0 +1,26 @@
+package org.springblade.manager.excel;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.excel.support.ExcelImporter;
+import org.springblade.manager.service.IWbsFormElementService;
+
+import java.util.List;
+
+
+/**
+ * Wbs元素批量导入
+ *
+ * @author liuyc
+ */
+@RequiredArgsConstructor
+public class WbsFormElementBatchImporter implements ExcelImporter<WbsFormElementBatchExcel> {
+
+    private final IWbsFormElementService service;
+    private final Boolean isCovered;
+    private final String tableId;
+
+    @Override
+    public void save(List<WbsFormElementBatchExcel> data) {
+        service.importElement2(data, isCovered, tableId);
+    }
+}

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java

@@ -127,4 +127,8 @@ public interface WbsTreeMapper extends BaseMapper<WbsTree> {
     int deleteLogicByWbsId(String ids);
 
     int updateIsExistFormById(Long id);
+
+    Integer createTable(String tableName);
+
+    void alterTableFiled(String initTableName, String eKey, String eType, Integer eLength);
 }

+ 12 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -153,6 +153,17 @@
         UPDATE m_wbs_tree SET is_exist_form = 1 WHERE id = #{id} AND status = 1 AND is_deleted = 0
     </update>
 
+    <update id="createTable">
+        create table ${newTableName} (
+        `id` bigint(20) NOT NULL,
+         PRIMARY KEY (`id`) USING BTREE
+        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
+    </update>
+
+    <update id="alterTableFiled">
+        ALTER TABLE ${initTableName} ADD COLUMN ${eKey} ${eType}(${eLength})
+    </update>
+
     <select id="selectWbsTreePage" resultMap="wbsTreeResultMap">
         select * from m_wbs_tree where is_deleted = 0
     </select>
@@ -294,6 +305,7 @@
         WHERE mpau.is_deleted = 0 AND mpau.`status` = 1
         AND mpau.user_id = #{userId}
     </select>
+
     <select id="selectWbsTreeListByParentId" resultType="org.springblade.manager.dto.WbsTreeDTO2">
         SELECT id,dept_name AS "deptName",sort
         FROM m_wbs_tree

+ 10 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java

@@ -20,9 +20,11 @@ package org.springblade.manager.service;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
+import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.entity.WbsFormElement;
+import org.springblade.manager.excel.WbsFormElementBatchExcel;
 import org.springblade.manager.excel.WbsFormElementExcel;
 import org.springblade.manager.vo.WbsFormElementVO;
 import org.springframework.web.multipart.MultipartFile;
@@ -37,30 +39,29 @@ import java.util.List;
  */
 public interface IWbsFormElementService extends BaseService<WbsFormElement> {
 
-	IPage<WbsFormElementVO> selectWbsFormElementPage(IPage<WbsFormElementVO> page, WbsFormElementVO wbsFormElement);
+    IPage<WbsFormElementVO> selectWbsFormElementPage(IPage<WbsFormElementVO> page, WbsFormElementVO wbsFormElement);
 
-	boolean addFormElement (WbsFormElement wbsFormElement);
+    boolean addFormElement(WbsFormElement wbsFormElement);
 
-	Boolean selectElementsById(List<WbsFormElement> wbsFormElementList);
+    Boolean selectElementsById(List<WbsFormElement> wbsFormElementList);
 
-    Boolean initTable(List<WbsFormElement> elementList,String tableName);
+    Boolean initTable(List<WbsFormElement> elementList, String tableName);
 
-	List<WbsFormElement> selectElementListByFid(String tableId);
+    List<WbsFormElement> selectElementListByFid(String tableId);
 
-    void importElement(List<WbsFormElementExcel> data, Boolean isCovered,String tableId);
+    void importElement(List<WbsFormElementExcel> data, Boolean isCovered, String tableId);
 
     R saveAndSyn(WbsFormElement wbsFormElement, String tableName);
 
     boolean deleteAndSyn(String ids, String elementName, String tableName);
 
-    String updateAndSyn(List<WbsFormElement> wbsFormElementList,String initTableName);
+    String updateAndSyn(List<WbsFormElement> wbsFormElementList, String initTableName);
 
     List<WbsFormElementDTO2> findWbsTreeTableSameLevel(String parentId);
 
     boolean wbsTreeTableSort(List<WbsFormElementDTO2> wbsTreeDTO);
 
-    boolean importWbsTreeTableAndForm(MultipartFile excelFile, String nodeId);
-
     WbsFormElementVO getDetailById(WbsFormElement wbsFormElement);
 
+    void importElement2(List<WbsFormElementBatchExcel> data, Boolean isCovered, String tableId);
 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java

@@ -110,4 +110,9 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
     int deleteLogicByWbsId(String ids);
 
     List<WbsTree> selectByWbsId(String id);
+
+    boolean submit2(FormElementDTO formElementDTO);
+
+    boolean importWbsTreeTableAndForm(MultipartFile excelFile, WbsTree wbsTree);
+
 }

+ 18 - 27
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -18,18 +18,25 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO2;
-import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
-import org.springblade.manager.excel.WbsExcelUtil;
+import org.springblade.manager.excel.WbsExcelBatchUtil;
+import org.springblade.manager.excel.WbsFormElementBatchExcel;
 import org.springblade.manager.excel.WbsFormElementExcel;
 import org.springblade.manager.mapper.WbsFormElementMapper;
 import org.springblade.manager.service.IWbsFormElementService;
+import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.vo.WbsFormElementVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -48,10 +55,10 @@ import java.util.Map;
  * @since 2022-04-27
  */
 @Service
+@AllArgsConstructor
 public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMapper, WbsFormElement> implements IWbsFormElementService {
 
-    @Resource
-    private WbsFormElementMapper wbsFormElementMapper;
+    private final WbsFormElementMapper wbsFormElementMapper;
 
 
     @Override
@@ -293,32 +300,16 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         return true;
     }
 
-    @Override
-    public boolean importWbsTreeTableAndForm(MultipartFile excelFile, String nodeId) {
-        try {
-            //解析excel
-            File file = WbsExcelUtil.convert(excelFile);
-            String canonicalPath = file.getCanonicalPath();
-            WbsExcelUtil excelUtil = new WbsExcelUtil();
-            ArrayList<Map<String, String>> result = excelUtil.readExcelToObj(canonicalPath);
-            for (Map<String, String> map : result) {
-                map.forEach((nodeType, nodeName) -> {
-                    //TODO
-
-
-                });
-            }
-
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        return false;
-    }
-
     @Override
     public WbsFormElementVO getDetailById(WbsFormElement wbsFormElement) {
         WbsFormElementVO detail = baseMapper.selectDetailById(wbsFormElement.getId());
         return detail;
     }
+
+    @Override
+    public void importElement2(List<WbsFormElementBatchExcel> data, Boolean isCovered, String tableId) {
+        //TODO
+    }
+
+
 }

+ 3 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -45,14 +45,12 @@ public class WbsTreeContractServiceImpl
         String[] ids = wbsTreeIds.split(",");
         List<String> idList1 = Arrays.asList(ids);
         List<String> idList2 = new ArrayList<>();
-        //查找合同段wbs私有库的节点树
         List<WbsTreeContract> list = baseMapper.findAllNodeList2(pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
         if (list.size() > 0) {
             for (WbsTreeContract wbsTreeContract : list) {
                 idList2.add(String.valueOf(wbsTreeContract.getId()));
             }
         }
-        //比较
         List<String> diffrent = getDiffrent(idList1, idList2);
         if (diffrent.size() == 0) {//相同
             throw new ServiceException("未进行任何操作");
@@ -60,16 +58,16 @@ public class WbsTreeContractServiceImpl
             if (idList1.size() > idList2.size()) {
                 WbsInfo wbsInfo = wbsInfoMapper.selectById(pawDTO.getWbsId());
                 for (String id : diffrent) {
-                    //合同段wbs节点库存在,修改is_deleted=0,否则新增
+                    //是否存在,否则新增
                     WbsTreeContract wbsTreeContract = baseMapper.selectByCondition2(id, pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
                     if (wbsTreeContract != null) {
                         baseMapper.updateByCondition(id, pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
                     } else {
-                        //获取WbsTreePrivate对象
                         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getWbsId(), pawDTO.getProjectId());
                         Integer wbsType = wbsInfo.getWbsType();
                         Long snowId = SnowFlakeUtil.getId();
                         if (wbsTreePrivate != null) {
+                            wbsTreePrivate.setFullName(wbsTreePrivate.getDeptName());
                             //新增
                             baseMapper.insertWbsTreeContract1(snowId, wbsType, pawDTO.getContractId(), wbsTreePrivate);
                             WbsTreePrivate wbsTreePrivateParent = baseMapper.selectParent(wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getParentId());
@@ -86,7 +84,7 @@ public class WbsTreeContractServiceImpl
                         }
                     }
                 }
-            } else { //逻辑删除当前多余的合同段节点
+            } else { //删除当前多余的合同段节点
                 for (String id : diffrent) {
                     baseMapper.deleteByCondition(id, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
                 }

+ 209 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -39,9 +39,11 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.FormElementDTO;
+import org.springblade.manager.dto.WbsTreeBatchImportDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.IWbsFormElementService;
@@ -53,6 +55,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
@@ -67,7 +70,6 @@ import java.util.*;
 @AllArgsConstructor
 public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree> implements IWbsTreeService {
 
-    private final BladeLogger logger;
     private final WbsTreeMapper wbsTreeMapper;
     private final IWbsFormElementService wbsFormElementService;
     private final WbsInfoMapper wbsInfoMapper;
@@ -119,7 +121,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return saveOrUpdate(dept);
     }
 
-    private boolean submit2(FormElementDTO dept) {
+    public boolean submit2(FormElementDTO dept) {
         if (Func.isEmpty(dept.getParentId())) {
             dept.setTenantId(AuthUtil.getTenantId());
             dept.setParentId(BladeConstant.TOP_PARENT_ID);
@@ -140,8 +142,213 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         dept.setType(2);
         dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
         return saveOrUpdate(dept);
+
+    }
+
+    public boolean submit3(WbsTree dept) {
+        if (Func.isEmpty(dept.getParentId())) {
+            dept.setTenantId(AuthUtil.getTenantId());
+            dept.setParentId(BladeConstant.TOP_PARENT_ID);
+            dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
+        }
+        if (dept.getParentId() > 0) {
+            WbsTree parent = getById(dept.getParentId());
+            if (Func.toLong(dept.getParentId()) == Func.toLong(dept.getId())) {
+                throw new ServiceException("父节点不可选择自身!");
+            }
+            dept.setTenantId(parent.getTenantId());
+            String ancestors = parent.getAncestors() + StringPool.COMMA + dept.getParentId();
+            dept.setAncestors(ancestors);
+            //设置表示该父节点下存在表单
+            baseMapper.updateIsExistFormById(parent.getId());
+        }
+        //设置类型默认值为 '2' 表单
+        dept.setType(2);
+        dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+        return saveOrUpdate(dept);
+
+    }
+
+    /**
+     * wbs元素表、元素批量导入
+     * @param excelFile
+     * @param wbsTree
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean importWbsTreeTableAndForm(MultipartFile excelFile, WbsTree wbsTree) {
+        String canonicalPath = null;
+        try {
+            //解析excel
+            File file = WbsExcelBatchUtil.convert(excelFile);
+            canonicalPath = file.getCanonicalPath();
+            WbsExcelBatchUtil excelUtil = new WbsExcelBatchUtil();
+            ArrayList<Map<String, String>> result = excelUtil.readExcelToObj(canonicalPath);
+            List<Map<String, String>> maps = WbsExcelBatchUtil.removeRepeatMapByKey(result, "表名");
+            assert maps != null;
+            //创建表单,获取Id、deptName、initTableName集合
+            List<WbsTreeBatchImportDTO> list = new ArrayList<>();
+            for (Map<String, String> map : maps) {
+                String deptName = map.get("表名");
+                if (deptName.length() > 100 || deptName.length() < 1) {
+                    throw new ServiceException("表名长度错误,输入范围1-100个字符长度");
+                }
+                wbsTree.setWbsId(wbsTree.getWbsId());
+                wbsTree.setDeptName(deptName);
+                wbsTree.setTableType(getTableType(map.get("表类型")));
+                //初始化实体表名
+                Long id = SnowFlakeUtil.getId();
+                wbsTree.setId(id);
+                String initTableName = "m_wbs_form_" + DateUtil.time() + "_" + id.toString();
+                wbsTree.setInitTableName(initTableName);
+                //创建表单
+                submit3(wbsTree);
+                //创建对应实体表
+                initTable(initTableName);
+                //返回信息
+                WbsTreeBatchImportDTO wbsTreeBatchImportDTO = new WbsTreeBatchImportDTO();
+                wbsTreeBatchImportDTO.setId(id);
+                wbsTreeBatchImportDTO.setTableName(deptName);
+                wbsTreeBatchImportDTO.setInitTableName(initTableName);
+                list.add(wbsTreeBatchImportDTO);
+            }
+            //创建元素、修改新增对应实体表字段
+            list.forEach(i -> {
+                for (Map<String, String> map : result) {
+                    Long elementTableId = i.getId();
+                    String tableName = i.getTableName();
+                    String initTableName = i.getInitTableName();
+                    int keyNumb = 0;
+                    if (tableName.equals(map.get("表名"))) {
+                        keyNumb++;
+                        WbsFormElement wbsFormElement = new WbsFormElement();
+                        wbsFormElement.setEName(map.get("字段名"));
+                        String key = "key_" + keyNumb;
+                        wbsFormElement.setEKey(key);
+                        wbsFormElement.setFId(String.valueOf(elementTableId));
+                        wbsFormElement.setELength(getElementLength(map.get("数据类型")));
+                        wbsFormElement.setEType(getElementType(map.get("数据类型")));
+                        wbsFormElement.setEInspectionMethod(map.get("计算公式、方法或数值"));
+                        wbsFormElement.setEAllowDeviation(map.get("允许偏差范围"));
+                        wbsFormElement.setRemark(map.get("备注"));
+                        wbsFormElementService.save(wbsFormElement);
+                        //初始化实体表字段
+                        baseMapper.alterTableFiled(initTableName,
+                                wbsFormElement.getEKey(),
+                                getInitTableFiledType(wbsFormElement.getEType()),
+                                wbsFormElement.getELength());
+                    }
+                }
+            });
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            File file2 = new File(canonicalPath);
+            if (file2.isFile() && file2.exists()) {
+                file2.delete();
+                System.gc();
+            }
+        }
+        return false;
+    }
+
+    private Boolean initTable(String tableName) {
+        //建表
+        Integer row = baseMapper.createTable(tableName);
+        if (row >= 0) {
+            return true;
+        }
+        return false;
+    }
+
+    private String getInitTableFiledType(Integer type) {
+        switch (type) {
+            case 2:
+                return "bigint"; //整数
+            case 3:
+                return "decimal"; //小数
+            case 4:
+                return "datetime"; //日期
+            case 5:
+                return "bigint";  //数值
+            case 6:
+                return "varchar"; //签名
+            case 7:
+                return "varchar"; //文件
+            case 1:
+            default:
+                return "varchar"; //字符串
+        }
+    }
+
+    private Integer getElementType(String type) {
+        switch (type) {
+            case "字符串":
+                return 1;
+            case "整数":
+                return 2;
+            case "小数":
+                return 3;
+            case "日期":
+                return 4;
+            case "数值":
+                return 5;
+            case "签名":
+                return 6;
+            case "文件":
+                return 7;
+            default:
+                return 0;
+        }
+    }
+
+    private Integer getElementLength(String type) {
+        switch (type) {
+            case "字符串":
+            case "签名":
+            case "文件":
+                return 1000;
+            case "整数":
+            case "数值":
+                return 255;
+            case "小数":
+                return 65;
+            case "日期":
+            default:
+                return 0;
+        }
+    }
+
+    private Integer getTableType(String tableType) {
+        switch (tableType) {
+            case "检验表":
+                return 1;
+            case "记录表":
+                return 2;
+            case "通用表":
+                return 3;
+            case "监表":
+                return 4;
+            case "评定表":
+                return 5;
+            case "测量表":
+                return 6;
+            case "竣工表":
+                return 7;
+            case "汇总表":
+                return 8;
+            case "试验记录表":
+                return 9;
+            case "试验报告表":
+                return 10;
+            default:
+                return 0;
+        }
     }
 
+
     @Override
     public List<WbsNodeTableVO> selectByNodeTable(String id) {
         //查询节点下的所有表单
@@ -164,7 +371,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return wbsFormElements;
     }
 
-
     private String selectTableIdByTableName(String id) {
         QueryWrapper<WbsTree> queryWrapper = new QueryWrapper<>();
         queryWrapper.in("id", id);
@@ -177,7 +383,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return String.valueOf(wbsTree.getId());
     }
 
-
     @Override
     public String importWbsTree(MultipartFile excelFile, WbsTree wbsTreeFu, WbsTree wbsTree1) throws IOException {
         //赋值
@@ -236,7 +441,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         }
     }
 
-
     private WbsTree importTree(WbsTree wbsTreeZi) {
         //查重
         QueryWrapper<WbsTree> queryWrapper = new QueryWrapper<>();
@@ -318,7 +522,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         );
     }
 
-
     private boolean updateData(String ancestors, Long id) {
         Integer row = baseMapper.updateById2(ancestors, id);
         if (row > 0) {
@@ -565,7 +768,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         }
     }
 
-
     /**
      * 获取汉字串拼音首字母,英文字符不变
      *
@@ -637,7 +839,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return rs;
     }
 
-
     public int updateByCondition(Long id, String wbsName, Integer status) {
         int row = baseMapper.updateByCondition(id, wbsName, status);
         return row;

+ 41 - 3
blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java

@@ -41,11 +41,13 @@ import org.springblade.system.user.cache.UserCache;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.vo.GrantVO;
 import org.springblade.system.vo.RoleVO;
+import org.springblade.system.vo.RoleVO2;
 import org.springblade.system.wrapper.RoleWrapper;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -98,12 +100,46 @@ public class RoleController extends BladeController {
      */
     @GetMapping("/tree")
     @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "树形结构", notes = "树形结构")
+    @ApiOperation(value = "树形结构1", notes = "树形结构1")
     public R<List<RoleVO>> tree(String tenantId, BladeUser bladeUser) {
         List<RoleVO> tree = roleService.tree(Func.toStrWithEmpty(tenantId, bladeUser.getTenantId()));
         return R.data(tree);
     }
 
+    /**
+     * 获取角色树形结构2
+     */
+    @GetMapping("/treeTow")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "树形结构2", notes = "树形结构2")
+    public R<List<RoleVO2>> treeTow() {
+        //父级节点
+        List<Role> parentRole = roleService.seleteParentRole();
+        List<RoleVO2> list = new ArrayList<>();
+        parentRole.forEach(role -> {
+            //admin
+            if (role.getRoleName().equals("超级管理员") && role.getRoleAlias().equals("administrator")) {
+                RoleVO2 roleVo2 = new RoleVO2();
+                roleVo2.setRoleName(role.getRoleName());
+                roleVo2.setRoleId(String.valueOf(role.getId()));
+                list.add(roleVo2);
+            }
+            String roleName = role.getRoleName();
+            Long id = role.getId();
+            //子级
+            List<Role> roles = roleService.getByParentId(id);
+            roles.forEach(role1 -> {
+                RoleVO2 roleVo2 = new RoleVO2();
+                Long id1 = role1.getId();
+                roleVo2.setRoleName(roleName + " | " + role1.getRoleName());
+                roleVo2.setRoleId(String.valueOf(id1));
+                list.add(roleVo2);
+            });
+        });
+        return R.data(list);
+    }
+
+
     /**
      * 获取指定角色树形结构
      */
@@ -118,8 +154,9 @@ public class RoleController extends BladeController {
 
     /**
      * 新增或修改
+     *
      * @author liuyc
-     * @since  2022-05-11
+     * @since 2022-05-11
      */
     @PostMapping("/submit")
     @ApiOperationSupport(order = 5)
@@ -132,8 +169,9 @@ public class RoleController extends BladeController {
 
     /**
      * 删除
+     *
      * @author liuyc
-     * @since  2022-05-11
+     * @since 2022-05-11
      */
     @PostMapping("/remove")
     @ApiOperationSupport(order = 6)

+ 4 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java

@@ -110,4 +110,8 @@ public interface IRoleService extends IService<Role> {
 	 */
 	boolean removeRole(String ids);
 
+	List<Role> getByParentId(Long id);
+
+	List<Role> seleteParentRole();
+
 }

+ 10 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -269,6 +269,16 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         return b;
     }
 
+    @Override
+    public List<Role> getByParentId(Long id) {
+        return baseMapper.selectList(Wrappers.<Role>query().lambda().eq(Role::getParentId, id));
+    }
+
+    @Override
+    public List<Role> seleteParentRole() {
+        return baseMapper.selectList(Wrappers.<Role>query().lambda().eq(Role::getParentId, 0));
+    }
+
     private Boolean removeRoleAndPostByRid(String ids) {
         Integer row = roleMapper.deleteRoleAndPostByRid(ids);
         if (row > 0) {