diff --git a/src/main/java/tech/riemann/ims/controller/platform/material/TypeController.java b/src/main/java/tech/riemann/ims/controller/platform/material/TypeController.java new file mode 100644 index 0000000..bc06edf --- /dev/null +++ b/src/main/java/tech/riemann/ims/controller/platform/material/TypeController.java @@ -0,0 +1,82 @@ +package tech.riemann.ims.controller.platform.material; + +import club.zhcs.lina.starter.exception.BizException; +import club.zhcs.lina.utils.enums.Codebook; +import club.zhcs.lina.utils.enums.ICodeBook; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nutz.lang.Strings; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import tech.riemann.ims.dto.response.TypeTree; +import tech.riemann.ims.entity.material.Type; +import tech.riemann.ims.service.material.ITypeService; + +import java.util.Arrays; +import java.util.List; + +/** + * @author mayong + * @since 2025/3/2 14:14 + */ +@RestController +@Slf4j +@Tag(name = "Type", description = "物料类型管理") +@RequiredArgsConstructor +public class TypeController { + + private final ITypeService typeService; + + @GetMapping("areas") + @Operation(summary = "查询类型") + public List areas( + @Parameter(description = "搜索关键词") @RequestParam(required = false, defaultValue = "") String key) { + boolean hasLike = Strings.isNotBlank(key); + key = String.format("%%%s%%", key); + return typeService.list( + Wrappers.lambdaQuery() + .like(hasLike, Type::getName, key)); + } + + @PostMapping("area") + @Operation(summary = "增加/更新地区") + public Type addAndModify(@Validated @Parameter(description = "类型") @RequestBody Type area) { + if (area.getId() == null) { + typeService.save(area); + } else { + typeService.updateById(area); + } + return area; + } + + @DeleteMapping("area/{id}") + @Operation(summary = "删除类型") + public void deleteArea(@Parameter(description = "id", required = true) @PathVariable long id) { + if (!typeService.removeById(id)) { + throw BizException.create("删除失败!"); + } + } + + @GetMapping("area/levels") + @Operation(summary = "级别") + public List levels() { + return Arrays.stream(Type.Level.values()).map(ICodeBook::build).toList(); + } + + @GetMapping("area/trees") + @Operation(summary = "类型树") + public List trees() { + List all = typeService.list(); + List data = all.stream().map(area -> TypeTree.builder() + .value(area.getNo()) + .label(area.getName()) + .parentNo(area.getParentNo()) + .build()) + .toList(); + return TypeTree.buildTree(data, null); + } +} diff --git a/src/main/java/tech/riemann/ims/dto/response/TypeTree.java b/src/main/java/tech/riemann/ims/dto/response/TypeTree.java new file mode 100644 index 0000000..9328fb7 --- /dev/null +++ b/src/main/java/tech/riemann/ims/dto/response/TypeTree.java @@ -0,0 +1,36 @@ +package tech.riemann.ims.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author mayong + * @since 2025/1/18 19:20 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TypeTree { + @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED) + private String value; + @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String label; + private String parentNo; + private List children; + + + public static List buildTree(List data, String root) { + return data.stream() + .filter(t -> Objects.equals(t.getParentNo(), root)) + .peek(t -> t.setChildren(buildTree(data, t.getValue()))). + collect(Collectors.toList()); + } +} diff --git a/src/main/java/tech/riemann/ims/entity/material/Type.java b/src/main/java/tech/riemann/ims/entity/material/Type.java new file mode 100644 index 0000000..4c96915 --- /dev/null +++ b/src/main/java/tech/riemann/ims/entity/material/Type.java @@ -0,0 +1,90 @@ +package tech.riemann.ims.entity.material; + +import club.zhcs.lina.utils.enums.Codebook; +import club.zhcs.lina.utils.enums.ICodeBook; +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonGetter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; +import lombok.experimental.SuperBuilder; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.json.JsonField; +import tech.riemann.ims.entity.IdBaseEntity; + +import java.io.Serial; + +/** + * @author mayong + * @since 2025/3/2 14:07 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("t_material") +@Table("t_material") +@Comment("物料") +@Schema(name = "Material", description = "物料") +public class Type extends IdBaseEntity { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED) + @TableField("a_no") + @Column("a_no") + @Comment("类型编码") + @ColDefine(notNull = true, width = 10, precision = 0) + private String no; + + @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED) + @TableField("a_name") + @Column("a_name") + @Comment("类型名称") + @ColDefine(notNull = true, width = 255, precision = 0) + private String name; + + @Schema(description = "类型级别", requiredMode = Schema.RequiredMode.REQUIRED) + @TableField("a_level") + @Column("a_level") + @Comment("类型级别") + @ColDefine(notNull = true, width = 10, precision = 0) + private Level level; + + @Schema(description = "上级类型编码", requiredMode = Schema.RequiredMode.NOT_REQUIRED) + @TableField("a_parent_no") + @Column("a_parent_no") + @Comment("上级类型编码") + @ColDefine(notNull = false, width = 10, precision = 0) + private String parentNo; + + @Getter + @AllArgsConstructor + public enum Level implements ICodeBook { + ONE("town", "一级"), + TWO("village", "二级"), + ; + + @EnumValue + final String code; + final String description; + } + + @JsonGetter + @JsonField + public Codebook getLevelInfo() { + return level == null ? null : level.build(); + } + + public void setLevelInfo(Codebook areaLevel) { + } +} diff --git a/src/main/java/tech/riemann/ims/mapper/material/TypeMapper.java b/src/main/java/tech/riemann/ims/mapper/material/TypeMapper.java new file mode 100644 index 0000000..b595311 --- /dev/null +++ b/src/main/java/tech/riemann/ims/mapper/material/TypeMapper.java @@ -0,0 +1,11 @@ +package tech.riemann.ims.mapper.material; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import tech.riemann.ims.entity.material.Type; + +/** + * @author mayong + * @since 2024/11/27 15:42 + */ +public interface TypeMapper extends BaseMapper { +} diff --git a/src/main/java/tech/riemann/ims/service/material/ITypeService.java b/src/main/java/tech/riemann/ims/service/material/ITypeService.java new file mode 100644 index 0000000..61d3584 --- /dev/null +++ b/src/main/java/tech/riemann/ims/service/material/ITypeService.java @@ -0,0 +1,12 @@ +package tech.riemann.ims.service.material; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nutz.spring.boot.service.interfaces.IdNameEntityService; +import tech.riemann.ims.entity.material.Type; + +/** + * @author mayong + * @since 2024/11/27 15:40 + */ +public interface ITypeService extends IService, IdNameEntityService { +} diff --git a/src/main/java/tech/riemann/ims/service/material/impl/TypeServiceImpl.java b/src/main/java/tech/riemann/ims/service/material/impl/TypeServiceImpl.java new file mode 100644 index 0000000..11872f6 --- /dev/null +++ b/src/main/java/tech/riemann/ims/service/material/impl/TypeServiceImpl.java @@ -0,0 +1,24 @@ +package tech.riemann.ims.service.material.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.nutz.dao.Dao; +import org.springframework.stereotype.Service; +import tech.riemann.ims.entity.material.Type; +import tech.riemann.ims.mapper.material.TypeMapper; +import tech.riemann.ims.service.material.ITypeService; + +/** + * @author mayong + * @since 2024/11/27 15:41 + */ +@Service +@RequiredArgsConstructor +public class TypeServiceImpl extends ServiceImpl implements ITypeService { + private final Dao dao; + + @Override + public Dao dao() { + return dao; + } +}