From 8eebf7e94c3c1cdf97a64202661bf354228ebc0c Mon Sep 17 00:00:00 2001 From: jiangdingxuan Date: Mon, 8 Jan 2024 16:47:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/rzdata/demo/trait/GetReq.java | 29 +++++++++++ .../net/rzdata/demo/dict/DictController.java | 49 +++++++++++++++++++ .../net/rzdata/demo/dict/DictService.java | 31 ++++++++++-- .../demo/dict/domain/GetDictTypeListReq.java | 6 +++ .../demo/dict/mapper/DictRepository.java | 13 +++++ 5 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/net/rzdata/demo/trait/GetReq.java create mode 100644 service/system/src/main/java/net/rzdata/demo/dict/domain/GetDictTypeListReq.java diff --git a/common/src/main/java/net/rzdata/demo/trait/GetReq.java b/common/src/main/java/net/rzdata/demo/trait/GetReq.java new file mode 100644 index 0000000..be01903 --- /dev/null +++ b/common/src/main/java/net/rzdata/demo/trait/GetReq.java @@ -0,0 +1,29 @@ +package net.rzdata.demo.trait; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class GetReq { + + private Integer pageSize = 15; + private Integer pageNum = 1; + private String orderBy; + private Boolean asc = true; + + public IPage into() { + Page page = new Page<>(); + page.setSize(pageSize); + page.setCurrent(pageNum - 1); + if (orderBy != null) { + page.addOrder(this.asc ? OrderItem.asc(orderBy) : OrderItem.desc(orderBy)); + } + return page; + } +} diff --git a/service/system/src/main/java/net/rzdata/demo/dict/DictController.java b/service/system/src/main/java/net/rzdata/demo/dict/DictController.java index 337721c..6e1aa1c 100644 --- a/service/system/src/main/java/net/rzdata/demo/dict/DictController.java +++ b/service/system/src/main/java/net/rzdata/demo/dict/DictController.java @@ -1,11 +1,16 @@ package net.rzdata.demo.dict; +import com.baomidou.mybatisplus.core.metadata.IPage; import net.rzdata.demo.dict.domain.AddDictReq; import net.rzdata.demo.dict.domain.Dict; +import net.rzdata.demo.dict.domain.GetDictTypeListReq; import net.rzdata.demo.dict.domain.UpdateDictReq; import net.rzdata.domain.Id; import org.springframework.web.bind.annotation.*; +import java.util.Collections; +import java.util.List; + @RestController @RequestMapping("/dict") public class DictController { @@ -16,6 +21,11 @@ public class DictController { this.dictService = dictService; } + /** + * 新增字典 + * @param req 新增字典请求 + * @return 新增字典的ID + */ @PostMapping() public Id addDict(@RequestBody AddDictReq req) { Dict dict = req.into(); @@ -27,10 +37,49 @@ public class DictController { return Id.of(dict.getId()); } + /** + * 更新字典 + * @param req 更新字典请求 + * @return 字典的ID + */ @PutMapping() public Id updateDict(@RequestBody UpdateDictReq req) { Dict dict = req.into(); dictService.updateDict(dict); return Id.of(dict.getId()); } + + /** + * 获取字典类型列表 + * @param req 获取字典类型列表请求 + * @return 字典类型列表(分页) + */ + @GetMapping("/type") + public IPage getDictTypePage(@RequestParam GetDictTypeListReq req) { + return dictService.getDictTypePage(req); + } + + /** + * 获取字典树 + * @param parentId 父ID + * @param level 层级 + * @return 字典树 + */ + @GetMapping("/tree") + public List getDictTree( + @RequestParam(required = false, defaultValue = "0") String parentId, + @RequestParam(required = false, defaultValue = "-1") Integer level + ) { + return dictService.getDictTreeTopDown(Collections.singleton(parentId), level); + } + + /** + * 获取字典数据 + * @param type 字典类型 + * @return 字典数据 + */ + @GetMapping("/data/{type}") + public List getDictData(@PathVariable String type) { + return dictService.getDictByType(type); + } } diff --git a/service/system/src/main/java/net/rzdata/demo/dict/DictService.java b/service/system/src/main/java/net/rzdata/demo/dict/DictService.java index 50d94a6..f1ca1e7 100644 --- a/service/system/src/main/java/net/rzdata/demo/dict/DictService.java +++ b/service/system/src/main/java/net/rzdata/demo/dict/DictService.java @@ -1,14 +1,15 @@ package net.rzdata.demo.dict; +import com.baomidou.mybatisplus.core.metadata.IPage; import net.rzdata.demo.dict.domain.Dict; +import net.rzdata.demo.dict.domain.GetDictTypeListReq; import net.rzdata.demo.dict.mapper.DictRepository; import net.rzdata.exception.NotExistDataException; import net.rzdata.exception.RepeatDataException; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; @Service public class DictService { @@ -43,6 +44,30 @@ public class DictService { } } + protected IPage getDictTypePage(GetDictTypeListReq req) { + return dictRepository.getDictTypePage(req); + } + + protected List getDictTreeTopDown(Collection parentId, int level) { + if (level == 0 || level < Byte.MIN_VALUE) { + return Collections.emptyList(); + } else if (parentId.isEmpty()) { + return Collections.emptyList(); + } + List children = dictRepository.findByParentIdIn(parentId); + Set childIds = children.parallelStream() + .map(Dict::getId) + .collect(Collectors.toSet()); + List grandchildren = getDictTreeTopDown(childIds, level); + for (Dict child : children) { + List grandchild = grandchildren.parallelStream() + .filter(g -> Objects.equals(g.getParentId(), child.getId())) + .toList(); + child.setChildren(grandchild); + } + return children; + } + private Optional getDictByTypeAndValue(String type, String value) { List dictList = this.getDictByType(type); return dictList.parallelStream() diff --git a/service/system/src/main/java/net/rzdata/demo/dict/domain/GetDictTypeListReq.java b/service/system/src/main/java/net/rzdata/demo/dict/domain/GetDictTypeListReq.java new file mode 100644 index 0000000..48a7814 --- /dev/null +++ b/service/system/src/main/java/net/rzdata/demo/dict/domain/GetDictTypeListReq.java @@ -0,0 +1,6 @@ +package net.rzdata.demo.dict.domain; + +import net.rzdata.demo.trait.GetReq; + +public class GetDictTypeListReq extends GetReq { +} diff --git a/service/system/src/main/java/net/rzdata/demo/dict/mapper/DictRepository.java b/service/system/src/main/java/net/rzdata/demo/dict/mapper/DictRepository.java index 9b86f1b..5a137b7 100644 --- a/service/system/src/main/java/net/rzdata/demo/dict/mapper/DictRepository.java +++ b/service/system/src/main/java/net/rzdata/demo/dict/mapper/DictRepository.java @@ -2,10 +2,13 @@ package net.rzdata.demo.dict.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import net.rzdata.demo.dict.domain.Dict; +import net.rzdata.demo.dict.domain.GetDictTypeListReq; import net.rzdata.demo.trait.BaseRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; @Repository @@ -28,4 +31,14 @@ public class DictRepository extends BaseRepository { .eq(Dict::getType, oldValue) ); } + + public List findByParentIdIn(Collection parentId) { + return this.get().selectList(new LambdaQueryWrapper() + .in(Dict::getParentId, parentId) + ); + } + + public IPage getDictTypePage(GetDictTypeListReq req) { + return this.get().selectPage(req.into(), new LambdaQueryWrapper<>()); + } }