diff --git a/README.en.md b/README.en.md
index ca78df24870acbda116c2ea9b27c3b3466c1c2aa..ca1e7d7e39f1526a5a0b55f11006a9705a7dc334 100644
--- a/README.en.md
+++ b/README.en.md
@@ -1,4 +1,4 @@
-# java-based
+# java-base
#### Description
编写Java基础
diff --git a/README.md b/README.md
index 75f3d0e21d2c61210efd25d9588187332805f8c9..52ffb39b4b385862dba5599fdaad2c7c2336c52a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# java-based
+# java-base
#### 介绍
编写Java基础
diff --git a/pom.xml b/pom.xml
index e5928be7fe1c9d70d67a0fbf26cefd9e03b73b96..9c8144f604ed028f7b9904a495e697a719cd3431 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,23 +1,54 @@
-
+
4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.3
+
+
+ com.example
+ java-base
+ 0.0.1-SNAPSHOT
+ java-based
+ Demo project for Spring Boot
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
- org.example
- java-based
- 1.0-SNAPSHOT
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
- org.apache.maven.plugins
- maven-compiler-plugin
+ org.springframework.boot
+ spring-boot-maven-plugin
- 1.8
- 1.8
+
+
+ org.projectlombok
+ lombok
+
+
-
\ No newline at end of file
+
+
diff --git a/src/main/java/com/example/javabase/JavaBasedApplication.java b/src/main/java/com/example/javabase/JavaBasedApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..05e0dac97e2eab9247e515510ec099812b983785
--- /dev/null
+++ b/src/main/java/com/example/javabase/JavaBasedApplication.java
@@ -0,0 +1,13 @@
+package com.example.javabase;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class JavaBasedApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(JavaBasedApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java b/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..8892d3a378826e7ea9d7f9293b31790e0788dfaf
--- /dev/null
+++ b/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java
@@ -0,0 +1,61 @@
+package com.example.javabase.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 工作任务
+ */
+@Data
+public class WorkTaskRegisterDto {
+
+ /**
+ * 主键ID
+ */
+ private String id;
+
+ /**
+ * 工作任务标题
+ */
+ private String taskName;
+
+ /**
+ * 工作任务类型
+ */
+ private String taskType;
+
+ /**
+ * 任务级别
+ */
+ private String taskLevel;
+
+ /**
+ * 完成期限
+ */
+ private Date completeTime;
+
+ /**
+ * 父级任务ID
+ */
+ private String parentId;
+
+ /**
+ * 是否为末级(0否,1是)
+ */
+ private String isEnd;
+
+ public List children;
+
+ /**
+ * 牵头单位字符串
+ */
+ private String leadDepartNames;
+
+ /**
+ * 配合单位字符串
+ */
+ private String cooperateDepartNames;
+
+}
diff --git a/src/main/java/com/example/javabase/tools/RecursionUtils.java b/src/main/java/com/example/javabase/tools/RecursionUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..eca89339a4351df5ba115b58d1cb7c7719e43df7
--- /dev/null
+++ b/src/main/java/com/example/javabase/tools/RecursionUtils.java
@@ -0,0 +1,49 @@
+package com.example.javabase.tools;
+
+
+import com.example.javabase.entity.WorkTaskRegisterDto;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecursionUtils {
+
+ public static void main(String[] args) {
+
+ }
+
+ //建立树形结构
+ public List buildTree(List departList) {
+ List treeMenus = new ArrayList<>();
+ for (WorkTaskRegisterDto menuNode : getRootNode(departList)) {
+ buildChildTree(departList, menuNode);
+ treeMenus.add(menuNode);
+ }
+ return treeMenus;
+ }
+
+ //递归,建立子树形结构
+ private WorkTaskRegisterDto buildChildTree(List departList, WorkTaskRegisterDto pNode) {
+ List childDepart = new ArrayList<>();
+ for (WorkTaskRegisterDto menuNode : departList) {
+ if (!StringUtils.isEmpty(menuNode.getParentId()) && menuNode.getParentId().equals(pNode.getId())) {
+ childDepart.add(buildChildTree(departList, menuNode));
+ }
+ }
+ pNode.setChildren(childDepart);
+ return pNode;
+ }
+
+ //获取根节点
+ private List getRootNode(List departList) {
+ List rootMenuLists = new ArrayList<>();
+ for (WorkTaskRegisterDto menuNode : departList) {
+ if (StringUtils.isEmpty(menuNode.getParentId())) {
+ rootMenuLists.add(menuNode);
+ }
+ }
+ return rootMenuLists;
+ }
+
+}
diff --git a/src/main/java/com/example/javabase/tools/RecursionUtils1.java b/src/main/java/com/example/javabase/tools/RecursionUtils1.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e9833b6a1cc7a60db79e3933da8b292fa5f79bf
--- /dev/null
+++ b/src/main/java/com/example/javabase/tools/RecursionUtils1.java
@@ -0,0 +1,177 @@
+package com.example.javabase.tools;
+
+
+import com.example.javabase.entity.WorkTaskRegisterDto;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class RecursionUtils1 {
+
+ public static void main(String[] args) {
+
+ }
+
+ /**
+ * 说明方法描述:将list转为树tree结构
+ */
+ public List useListRecordToTree(List allRecords) {
+ List listParentRecord = new ArrayList<>();
+ List listNotParentRecord = new ArrayList<>();
+ // 第一步:遍历allRecords保存所有数据的uuid用于判断是不是根节点
+ Map mapAllUuid = new HashMap<>();
+ //Map allRecordMap = new HashMap<>();
+ for (WorkTaskRegisterDto record : allRecords) {
+ mapAllUuid.put(record.getId(), record.getId());
+ //allRecordMap.put(record.getId(), record);
+ }
+ // 第二步:遍历allRecords找出所有的根节点和非根节点
+ if (allRecords.size() > 0) {
+ for (WorkTaskRegisterDto record : allRecords) {
+ if (StringUtils.isEmpty(record.getParentId())
+ || !mapAllUuid.containsKey(record.getParentId())) {
+ listParentRecord.add(record);
+ } else {
+ listNotParentRecord.add(record);
+ }
+ }
+ }
+
+ // 第三步: 递归获取所有子节点
+ if (listParentRecord.size() > 0) {
+ for (WorkTaskRegisterDto record : listParentRecord) {
+ // 添加所有子级
+ record.setChildren(this.getTreeChildRecord(listNotParentRecord, record.getId()));
+ }
+ }
+ return listParentRecord;
+ }
+
+ /**
+ * 说明方法描述:使list转换为树并根据关键字和节点名称过滤
+ *
+ * @param allRecords 所有节点
+ * @param keywords 要过滤的关键字
+ * @param filterFields 要过滤的字段
+ */
+ public List useListRecordToTreeByKeywords(List allRecords, String keywords, String... filterFields) {
+ List listRecord = new ArrayList<>();
+ Map allRecordMap = new HashMap<>();
+ for (WorkTaskRegisterDto record : allRecords) {
+ allRecordMap.put(record.getId(), record);
+ }
+ // 遍历allRecords找出所有的nodeName和关键字keywords相关的数据
+ if (allRecords.size() > 0) {
+ for (WorkTaskRegisterDto record : allRecords) {
+ // 比较
+ if (record.getTaskName().contains(keywords)) {
+ listRecord.add(record);
+ }
+ }
+ /*if (filterFields.length > 1) {
+ for (WorkTaskRegisterDto record : allRecords) {
+ for (String field : filterFields) {
+ // 比较
+ if (record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {
+ listRecord.add(record);
+ }
+ }
+ }
+ } else {
+ for (WorkTaskRegisterDto record : allRecords) {
+ // 比较
+ if (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {
+ listRecord.add(record);
+ }
+ }
+ }*/
+ }
+ // 查找过滤出来的节点和他们的父节点
+ listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayList<>(),
+ new HashMap<>(), allRecordMap);
+ // 将过滤出来的数据变成树tree结构
+ listRecord = this.useListRecordToTree(listRecord);
+ return listRecord;
+ }
+
+ /**
+ * 说明方法描述:递归查询子节点
+ *
+ * @param childList 子节点
+ * @param parentUuid 父节点id
+ */
+ private List getTreeChildRecord(List childList, String parentUuid) {
+ List listParentRecord = new ArrayList<>();
+ List listNotParentRecord = new ArrayList<>();
+ // 遍历tmpList,找出所有的根节点和非根节点
+ if (childList != null && childList.size() > 0) {
+ for (WorkTaskRegisterDto record : childList) {
+ // 对比找出父节点
+ if (record.getParentId().equals(parentUuid)) {
+ listParentRecord.add(record);
+ } else {
+ listNotParentRecord.add(record);
+ }
+
+ }
+ }
+ // 查询子节点
+ if (listParentRecord.size() > 0) {
+ for (WorkTaskRegisterDto record : listParentRecord) {
+ // 递归查询子节点
+ record.setChildren(getTreeChildRecord(listNotParentRecord, record.getId()));
+ }
+ }
+ return listParentRecord;
+ }
+
+ /**
+ * 说明方法描述:递归找出本节点和他们的父节点
+ *
+ * @param parentList 根据关键字过滤出来的相关节点的父节点
+ * @param resultList 返回的过滤出来的节点
+ * @param filterRecordMap 已经过滤出来的节点
+ * @param allRecordMap 所有节点
+ */
+ private List getSelfAndTheirParentRecord(List parentList, List resultList,
+ Map filterRecordMap,
+ Map allRecordMap) {
+ // 当父节点为null或者节点数量为0时返回结果,退出递归
+ if (parentList == null || parentList.size() == 0) {
+ return resultList;
+ }
+ // 重新创建父节点集合
+ List listParentRecord = new ArrayList<>();
+ // 遍历已经过滤出来的节点
+ for (WorkTaskRegisterDto record : parentList) {
+
+ String uuid = record.getId();
+ String parent_uuid = record.getParentId();
+
+ // 如果已经过滤出来的节点不存在则添加到list中
+ if (!filterRecordMap.containsKey(uuid)) {
+ listParentRecord.add(record);// 添加到父节点中
+ filterRecordMap.put(uuid, record);// 添加到已过滤的map中
+ allRecordMap.remove(uuid);// 移除集合中相应的元素
+ resultList.add(record);// 添加到结果集中
+ }
+
+ // 找出本节点的父节点并添加到listParentRecord父节点集合中,并移除集合中相应的元素
+ if (StringUtils.isEmpty(parent_uuid)) {
+ WorkTaskRegisterDto parentRecord = allRecordMap.get(parent_uuid);
+ if (parentRecord != null) {
+ listParentRecord.add(parentRecord);
+ allRecordMap.remove(parent_uuid);
+ }
+ }
+
+ }
+ // 递归调用
+ getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap);
+ return resultList;
+ }
+
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/src/test/java/com/example/javabase/JavaBasedApplicationTests.java b/src/test/java/com/example/javabase/JavaBasedApplicationTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7d8045b44738ad9d2e62b4575d7f77a0090672e
--- /dev/null
+++ b/src/test/java/com/example/javabase/JavaBasedApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.javabase;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class JavaBasedApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}