diff --git a/core/src/main/java/net/rzdata/exception/RepeatDataException.java b/core/src/main/java/net/rzdata/exception/RepeatDataException.java new file mode 100644 index 0000000..502ed07 --- /dev/null +++ b/core/src/main/java/net/rzdata/exception/RepeatDataException.java @@ -0,0 +1,18 @@ +package net.rzdata.exception; + +/** + * 数据重复异常 + */ +public class RepeatDataException extends ClientException { + + public static final String ERROR_CODE = "A0428"; + public static final String ERROR_MESSAGE = "数据已存在"; + + public RepeatDataException() { + super(ERROR_CODE, ERROR_MESSAGE); + } + + public RepeatDataException(String message) { + super(ERROR_CODE, message); + } +} 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 2abfb8b..e6d2ee3 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,9 @@ package net.rzdata.demo.dict; -import net.rzdata.demo.dict.domain.AddDictTypeReq; +import net.rzdata.demo.dict.domain.AddDictReq; import net.rzdata.demo.dict.domain.Dict; -import net.rzdata.demo.dict.domain.UpdateDictReq; import net.rzdata.domain.Id; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,4 +16,15 @@ public class DictController { public DictController(DictService dictService) { this.dictService = dictService; } + + @PostMapping() + public Id addDictData(AddDictReq req) { + Dict dict = req.into(); + if (dict.getParentId() == null) { + dict.setParentId(Dict.ROOT.getId()); + dict.setType(Dict.ROOT.getType()); + } + dictService.addDict(dict); + return Id.of(dict.getId()); + } } 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 2f41fab..86d790f 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,10 +1,14 @@ package net.rzdata.demo.dict; import net.rzdata.demo.dict.domain.Dict; -import net.rzdata.demo.dict.mapper.DictMapper; import net.rzdata.demo.dict.mapper.DictRepository; +import net.rzdata.exception.RepeatDataException; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + @Service public class DictService { @@ -13,4 +17,23 @@ public class DictService { public DictService(DictRepository dictRepository) { this.dictRepository = dictRepository; } + + protected void addDict(Dict dict) { + Optional exist = this.getDictByTypeAndValue(dict.getType(), dict.getValue()); + if (exist.isPresent()) { + throw new RepeatDataException(String.format("字典类型:%s, 值:%s 已存在", dict.getType(), dict.getValue())); + } + dictRepository.get().insert(dict); + } + + protected List getDictByType(String type) { + return dictRepository.findByTypeOrderBySortAsc(type); + } + + private Optional getDictByTypeAndValue(String type, String value) { + List dictList = this.getDictByType(type); + return dictList.parallelStream() + .filter(d -> Objects.equals(d.getValue(), value)) + .findAny(); + } } diff --git a/service/system/src/main/java/net/rzdata/demo/dict/domain/AddDictReq.java b/service/system/src/main/java/net/rzdata/demo/dict/domain/AddDictReq.java new file mode 100644 index 0000000..594bc5e --- /dev/null +++ b/service/system/src/main/java/net/rzdata/demo/dict/domain/AddDictReq.java @@ -0,0 +1,58 @@ +package net.rzdata.demo.dict.domain; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import net.rzdata.trait.IConverter; +import net.rzdata.trait.IQuery; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Getter +@Setter +@ToString +public class AddDictReq implements IQuery { + + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + */ + private String type; + /** + * 父级ID + * 如果是顶级字典 则为0 + */ + private String parentId; + /** + * 排序 + */ + private Integer sort; + /** + * 是否禁用 + */ + private Boolean disabled; + + @Override + public Dict into() { + return AddDictReqConverter.INSTANCE.convert(this); + } +} + +@Mapper +interface AddDictReqConverter extends IConverter { + + AddDictReqConverter INSTANCE = Mappers.getMapper(AddDictReqConverter.class); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "children", ignore = true) + @Override + Dict convert(AddDictReq req); +} 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 b8cbe79..4dbdf0b 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 @@ -1,13 +1,23 @@ package net.rzdata.demo.dict.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.trait.BaseRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public class DictRepository extends BaseRepository { public DictRepository(DictMapper mapper) { super(mapper); } + + public List findByTypeOrderBySortAsc(String type) { + return this.get().selectList(new LambdaQueryWrapper() + .eq(Dict::getType, type) + .orderByAsc(Dict::getSort) + ); + } } diff --git a/service/system/src/test/java/net/rzdata/demo/dict/DictServiceTest.java b/service/system/src/test/java/net/rzdata/demo/dict/DictServiceTest.java index c45114a..27f03f6 100644 --- a/service/system/src/test/java/net/rzdata/demo/dict/DictServiceTest.java +++ b/service/system/src/test/java/net/rzdata/demo/dict/DictServiceTest.java @@ -9,4 +9,12 @@ class DictServiceTest { @Resource private transient DictService dictService; + + @Test + void addDict() { + } + + @Test + void getDictByType() { + } }