diff --git a/core/src/main/java/net/rzdata/exception/NotExistDataException.java b/core/src/main/java/net/rzdata/exception/NotExistDataException.java new file mode 100644 index 0000000..ab32ae1 --- /dev/null +++ b/core/src/main/java/net/rzdata/exception/NotExistDataException.java @@ -0,0 +1,18 @@ +package net.rzdata.exception; + +/** + * 操作不存在的数据异常 + */ +public class NotExistDataException extends ClientException { + + public static final String ERROR_CODE = "A0429"; + public static final String ERROR_MESSAGE = "数据不存在"; + + public NotExistDataException() { + super(ERROR_CODE, ERROR_MESSAGE); + } + + public NotExistDataException(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 e6d2ee3..71a9ed8 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 @@ -2,8 +2,10 @@ package net.rzdata.demo.dict; 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,7 +20,7 @@ public class DictController { } @PostMapping() - public Id addDictData(AddDictReq req) { + public Id addDict(AddDictReq req) { Dict dict = req.into(); if (dict.getParentId() == null) { dict.setParentId(Dict.ROOT.getId()); @@ -27,4 +29,11 @@ public class DictController { dictService.addDict(dict); return Id.of(dict.getId()); } + + @PutMapping() + public Id updateDict(UpdateDictReq req) { + Dict dict = req.into(); + dictService.updateDict(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 86d790f..50d94a6 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 @@ -2,6 +2,7 @@ package net.rzdata.demo.dict; import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.dict.mapper.DictRepository; +import net.rzdata.exception.NotExistDataException; import net.rzdata.exception.RepeatDataException; import org.springframework.stereotype.Service; @@ -19,10 +20,7 @@ public class DictService { } 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())); - } + check(dict); dictRepository.get().insert(dict); } @@ -30,10 +28,32 @@ public class DictService { return dictRepository.findByTypeOrderBySortAsc(type); } + protected void updateDict(Dict dict) { + Dict exist = dictRepository.get().selectById(dict.getId()); + if (exist == null) { + throw new NotExistDataException("字典已被删除,无法更新"); + } + if (!Objects.equals(dict.getValue(), exist.getValue())) { + check(dict); + } + dictRepository.get().updateById(dict); + // 如果是字典类 则需要更新该类下所有值的type字段 + if (Objects.equals(exist.getParentId(), Dict.ROOT.getId())) { + dictRepository.updateType(exist.getType(), dict.getType()); + } + } + private Optional getDictByTypeAndValue(String type, String value) { List dictList = this.getDictByType(type); return dictList.parallelStream() .filter(d -> Objects.equals(d.getValue(), value)) .findAny(); } + + private void check(Dict dict) { + Optional exist = this.getDictByTypeAndValue(dict.getType(), dict.getValue()); + if (exist.isPresent()) { + throw new RepeatDataException(String.format("字典类型:%s, 值:%s 已存在", dict.getType(), dict.getValue())); + } + } } diff --git a/service/system/src/main/java/net/rzdata/demo/dict/domain/UpdateDictReq.java b/service/system/src/main/java/net/rzdata/demo/dict/domain/UpdateDictReq.java new file mode 100644 index 0000000..46f79a7 --- /dev/null +++ b/service/system/src/main/java/net/rzdata/demo/dict/domain/UpdateDictReq.java @@ -0,0 +1,56 @@ +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 UpdateDictReq implements IQuery { + + /** + * 字典ID + */ + private String id; + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 排序 + */ + private Integer sort; + /** + * 父级ID + */ + private String parentId; + /** + * 是否禁用 + */ + private Boolean disabled; + + public Dict into() { + return UpdateDictReqConverter.INSTANCE.convert(this); + } +} + +@Mapper +interface UpdateDictReqConverter extends IConverter { + + UpdateDictReqConverter INSTANCE = Mappers.getMapper(UpdateDictReqConverter.class); + + @Mapping(target = "type", ignore = true) + @Mapping(target = "children", ignore = true) + @Override + Dict convert(UpdateDictReq 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 4dbdf0b..9b86f1b 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,6 +1,7 @@ package net.rzdata.demo.dict.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.trait.BaseRepository; import org.springframework.stereotype.Repository; @@ -20,4 +21,11 @@ public class DictRepository extends BaseRepository { .orderByAsc(Dict::getSort) ); } + + public int updateType(String oldValue, String newValue) { + return this.get().update(null, new LambdaUpdateWrapper() + .set(Dict::getType, newValue) + .eq(Dict::getType, oldValue) + ); + } }