diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseAreaController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseAreaController.java new file mode 100644 index 0000000..537c92c --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseAreaController.java @@ -0,0 +1,111 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaRespVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.service.warehouse.WmsWarehouseAreaService; +import cn.iocoder.yudao.module.wms.service.warehouse.WmsWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getFirst; + +@Tag(name = "管理后台 - WMS 库区") +@RestController +@RequestMapping("/wms/warehouse-area") +@Validated +public class WmsWarehouseAreaController { + + @Resource + private WmsWarehouseAreaService warehouseAreaService; + @Resource + private WmsWarehouseService warehouseService; + + @PostMapping("/create") + @Operation(summary = "创建库区") + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:create')") + public CommonResult createWarehouseArea(@Valid @RequestBody WmsWarehouseAreaSaveReqVO createReqVO) { + return success(warehouseAreaService.createWarehouseArea(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新库区") + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:update')") + public CommonResult updateWarehouseArea(@Valid @RequestBody WmsWarehouseAreaSaveReqVO updateReqVO) { + warehouseAreaService.updateWarehouseArea(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库区") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:delete')") + public CommonResult deleteWarehouseArea(@RequestParam("id") Long id) { + warehouseAreaService.deleteWarehouseArea(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得库区") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:query')") + public CommonResult getWarehouseArea(@RequestParam("id") Long id) { + WmsWarehouseAreaDO area = warehouseAreaService.getWarehouseArea(id); + return success(buildWarehouseAreaRespVO(area)); + } + + @GetMapping("/page") + @Operation(summary = "获得库区分页") + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:query')") + public CommonResult> getWarehouseAreaPage(@Valid WmsWarehouseAreaPageReqVO pageReqVO) { + PageResult pageResult = warehouseAreaService.getWarehouseAreaPage(pageReqVO); + return success(new PageResult<>(buildWarehouseAreaRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得库区精简列表", description = "可按仓库过滤") + @PreAuthorize("@ss.hasPermission('wms:warehouse-area:query')") + public CommonResult> getWarehouseAreaSimpleList( + @Parameter(name = "warehouseId", description = "仓库编号") @RequestParam(value = "warehouseId", required = false) Long warehouseId) { + List list = warehouseAreaService.getWarehouseAreaList(warehouseId); + return success(buildWarehouseAreaRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private WmsWarehouseAreaRespVO buildWarehouseAreaRespVO(WmsWarehouseAreaDO area) { + if (area == null) { + return null; + } + return getFirst(buildWarehouseAreaRespVOList(Collections.singletonList(area))); + } + + private List buildWarehouseAreaRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map warehouseMap = warehouseService.getWarehouseMap(convertSet(list, WmsWarehouseAreaDO::getWarehouseId)); + return BeanUtils.toBean(list, WmsWarehouseAreaRespVO.class, vo -> + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()))); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseController.java new file mode 100644 index 0000000..6a12c96 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/WmsWarehouseController.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehousePageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehouseRespVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehouseSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.service.warehouse.WmsWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - WMS 仓库") +@RestController +@RequestMapping("/wms/warehouse") +@Validated +public class WmsWarehouseController { + + @Resource + private WmsWarehouseService warehouseService; + + @PostMapping("/create") + @Operation(summary = "创建仓库") + @PreAuthorize("@ss.hasPermission('wms:warehouse:create')") + public CommonResult createWarehouse(@Valid @RequestBody WmsWarehouseSaveReqVO createReqVO) { + return success(warehouseService.createWarehouse(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新仓库") + @PreAuthorize("@ss.hasPermission('wms:warehouse:update')") + public CommonResult updateWarehouse(@Valid @RequestBody WmsWarehouseSaveReqVO updateReqVO) { + warehouseService.updateWarehouse(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除仓库") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:warehouse:delete')") + public CommonResult deleteWarehouse(@RequestParam("id") Long id) { + warehouseService.deleteWarehouse(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得仓库") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('wms:warehouse:query')") + public CommonResult getWarehouse(@RequestParam("id") Long id) { + WmsWarehouseDO warehouse = warehouseService.getWarehouse(id); + return success(BeanUtils.toBean(warehouse, WmsWarehouseRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得仓库分页") + @PreAuthorize("@ss.hasPermission('wms:warehouse:query')") + public CommonResult> getWarehousePage(@Valid WmsWarehousePageReqVO pageReqVO) { + PageResult pageResult = warehouseService.getWarehousePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WmsWarehouseRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得仓库精简列表", description = "主要用于前端下拉") + @PreAuthorize("@ss.hasPermission('wms:warehouse:query')") + public CommonResult> getWarehouseSimpleList() { + List list = warehouseService.getWarehouseList(); + return success(BeanUtils.toBean(list, WmsWarehouseRespVO.class)); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehousePageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehousePageReqVO.java new file mode 100644 index 0000000..7ec1686 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehousePageReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - WMS 仓库分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WmsWarehousePageReqVO extends PageParam { + + @Schema(description = "仓库编号", example = "WH001") + private String code; + + @Schema(description = "仓库名称", example = "原料仓") + private String name; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseRespVO.java new file mode 100644 index 0000000..d17def8 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseRespVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - WMS 仓库 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WmsWarehouseRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "仓库编号", example = "WH001") + @ExcelProperty("仓库编号") + private String code; + + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓") + @ExcelProperty("仓库名称") + private String name; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("排序") + private Integer sort; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseSaveReqVO.java new file mode 100644 index 0000000..816e1a4 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/WmsWarehouseSaveReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Schema(description = "管理后台 - WMS 仓库新增/修改 Request VO") +@Data +public class WmsWarehouseSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") + @NotEmpty(message = "仓库编号不能为空") + @Size(max = 20, message = "仓库编号长度不能超过 20 个字符") + private String code; + + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓") + @NotEmpty(message = "仓库名称不能为空") + private String name; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "排序不能为空") + private Integer sort; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaPageReqVO.java new file mode 100644 index 0000000..f257a66 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaPageReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - WMS 库区分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WmsWarehouseAreaPageReqVO extends PageParam { + + @Schema(description = "库区编号", example = "A001") + private String code; + + @Schema(description = "库区名称", example = "A 区") + private String name; + + @Schema(description = "所属仓库编号", example = "1024") + private Long warehouseId; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaRespVO.java new file mode 100644 index 0000000..3a976b3 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - WMS 库区 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WmsWarehouseAreaRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "库区编号", example = "A001") + @ExcelProperty("库区编号") + private String code; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A 区") + @ExcelProperty("库区名称") + private String name; + + @Schema(description = "所属仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("所属仓库编号") + private Long warehouseId; + + @Schema(description = "所属仓库名称", example = "原料仓") + @ExcelProperty("所属仓库名称") + private String warehouseName; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaSaveReqVO.java new file mode 100644 index 0000000..6ac93cc --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/warehouse/vo/area/WmsWarehouseAreaSaveReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Schema(description = "管理后台 - WMS 库区新增/修改 Request VO") +@Data +public class WmsWarehouseAreaSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "A001") + @NotEmpty(message = "库区编号不能为空") + @Size(max = 20, message = "库区编号长度不能超过 20 个字符") + private String code; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A 区") + @NotEmpty(message = "库区名称不能为空") + private String name; + + @Schema(description = "所属仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "所属仓库不能为空") + private Long warehouseId; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseAreaDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseAreaDO.java new file mode 100644 index 0000000..ab54d1e --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseAreaDO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.wms.dal.dataobject.warehouse; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * WMS 库区 DO + * + * @author 芋道源码 + */ +@TableName("wms_warehouse_area") +@KeySequence("wms_warehouse_area_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WmsWarehouseAreaDO extends BaseDO { + + /** + * 主键编号 + */ + @TableId + private Long id; + /** + * 库区编号 + */ + private String code; + /** + * 名称 + */ + private String name; + /** + * 所属仓库编号 + * + * 关联 {@link WmsWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseDO.java new file mode 100644 index 0000000..3693887 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/warehouse/WmsWarehouseDO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.wms.dal.dataobject.warehouse; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * WMS 仓库 DO + * + * @author 芋道源码 + */ +@TableName("wms_warehouse") +@KeySequence("wms_warehouse_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WmsWarehouseDO extends BaseDO { + + /** + * 主键编号 + */ + @TableId + private Long id; + /** + * 仓库编号 + */ + private String code; + /** + * 名称 + */ + private String name; + /** + * 备注 + */ + private String remark; + /** + * 排序 + */ + private Integer sort; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseAreaMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseAreaMapper.java new file mode 100644 index 0000000..593b435 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseAreaMapper.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.wms.dal.mysql.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseAreaDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * WMS 库区 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface WmsWarehouseAreaMapper extends BaseMapperX { + + default PageResult selectPage(WmsWarehouseAreaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WmsWarehouseAreaDO::getCode, reqVO.getCode()) + .likeIfPresent(WmsWarehouseAreaDO::getName, reqVO.getName()) + .eqIfPresent(WmsWarehouseAreaDO::getWarehouseId, reqVO.getWarehouseId()) + .orderByDesc(WmsWarehouseAreaDO::getId)); + } + + default WmsWarehouseAreaDO selectByCode(String code) { + return selectOne(WmsWarehouseAreaDO::getCode, code); + } + + default WmsWarehouseAreaDO selectByName(Long warehouseId, String name) { + return selectOne(new LambdaQueryWrapperX() + .eq(WmsWarehouseAreaDO::getWarehouseId, warehouseId) + .eq(WmsWarehouseAreaDO::getName, name)); + } + + default List selectListByWarehouseId(Long warehouseId) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WmsWarehouseAreaDO::getWarehouseId, warehouseId) + .orderByDesc(WmsWarehouseAreaDO::getId)); + } + + default Long selectCountByWarehouseId(Long warehouseId) { + return selectCount(WmsWarehouseAreaDO::getWarehouseId, warehouseId); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseMapper.java new file mode 100644 index 0000000..6849270 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/warehouse/WmsWarehouseMapper.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.wms.dal.mysql.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehousePageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * WMS 仓库 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface WmsWarehouseMapper extends BaseMapperX { + + default PageResult selectPage(WmsWarehousePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WmsWarehouseDO::getCode, reqVO.getCode()) + .likeIfPresent(WmsWarehouseDO::getName, reqVO.getName()) + .orderByAsc(WmsWarehouseDO::getSort) + .orderByDesc(WmsWarehouseDO::getId)); + } + + default WmsWarehouseDO selectByCode(String code) { + return selectOne(WmsWarehouseDO::getCode, code); + } + + default WmsWarehouseDO selectByName(String name) { + return selectOne(WmsWarehouseDO::getName, name); + } + + default List selectSimpleList() { + return selectList(new LambdaQueryWrapperX() + .orderByAsc(WmsWarehouseDO::getSort) + .orderByDesc(WmsWarehouseDO::getId)); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java index ed14d59..bcc047c 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java @@ -1,9 +1,26 @@ package cn.iocoder.yudao.module.wms.enums; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + /** * WMS 错误码枚举类 *

* wms 系统,使用 1-060-000-000 段 */ public interface ErrorCodeConstants { + + // ========== WMS 配置 1-060-000-000 ========== + ErrorCode WMS_AREA_DISABLED = new ErrorCode(1_060_000_000, "WMS 库区模式未开启"); + + // ========== WMS 基础数据-仓库 1-060-100-000 ========== + ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_060_100_000, "仓库不存在"); + ErrorCode WAREHOUSE_NAME_DUPLICATE = new ErrorCode(1_060_100_001, "仓库名称重复"); + ErrorCode WAREHOUSE_CODE_DUPLICATE = new ErrorCode(1_060_100_002, "仓库编号重复"); + ErrorCode WAREHOUSE_HAS_AREA = new ErrorCode(1_060_100_003, "删除失败!请先删除该仓库下的库区!"); + + // ========== WMS 基础数据-库区 1-060-101-000 ========== + ErrorCode WAREHOUSE_AREA_NOT_EXISTS = new ErrorCode(1_060_101_000, "库区不存在"); + ErrorCode WAREHOUSE_AREA_NAME_DUPLICATE = new ErrorCode(1_060_101_001, "库区名称重复"); + ErrorCode WAREHOUSE_AREA_CODE_DUPLICATE = new ErrorCode(1_060_101_002, "库区编号重复"); + } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaService.java new file mode 100644 index 0000000..fef28e8 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaService.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.wms.service.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseAreaDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * WMS 库区 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsWarehouseAreaService { + + /** + * 创建库区 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouseArea(@Valid WmsWarehouseAreaSaveReqVO createReqVO); + + /** + * 更新库区 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouseArea(@Valid WmsWarehouseAreaSaveReqVO updateReqVO); + + /** + * 删除库区 + * + * @param id 编号 + */ + void deleteWarehouseArea(Long id); + + /** + * 校验库区存在 + * + * @param id 编号 + * @return 库区 + */ + WmsWarehouseAreaDO validateWarehouseAreaExists(Long id); + + /** + * 获得库区 + * + * @param id 编号 + * @return 库区 + */ + WmsWarehouseAreaDO getWarehouseArea(Long id); + + /** + * 获得库区分页 + * + * @param pageReqVO 分页查询 + * @return 库区分页 + */ + PageResult getWarehouseAreaPage(WmsWarehouseAreaPageReqVO pageReqVO); + + /** + * 获得库区列表 + * + * @param warehouseId 仓库编号 + * @return 库区列表 + */ + List getWarehouseAreaList(Long warehouseId); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaServiceImpl.java new file mode 100644 index 0000000..7d3e400 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseAreaServiceImpl.java @@ -0,0 +1,136 @@ +package cn.iocoder.yudao.module.wms.service.warehouse; + +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.area.WmsWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.mysql.warehouse.WmsWarehouseAreaMapper; +import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; + +/** + * WMS 库区 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class WmsWarehouseAreaServiceImpl implements WmsWarehouseAreaService { + + @Resource + private WmsWarehouseAreaMapper warehouseAreaMapper; + @Resource + private WmsWarehouseService warehouseService; + @Resource + private WmsProperties wmsProperties; + + @Override + public Long createWarehouseArea(WmsWarehouseAreaSaveReqVO createReqVO) { + validateAreaEnabled(); + // 校验数据 + validateWarehouseAreaSaveData(createReqVO); + + // 插入 + WmsWarehouseAreaDO area = BeanUtils.toBean(createReqVO, WmsWarehouseAreaDO.class); + warehouseAreaMapper.insert(area); + // 返回 + return area.getId(); + } + + @Override + public void updateWarehouseArea(WmsWarehouseAreaSaveReqVO updateReqVO) { + validateAreaEnabled(); + // 校验存在 + validateWarehouseAreaExists(updateReqVO.getId()); + // 校验数据 + validateWarehouseAreaSaveData(updateReqVO); + + // 更新 + WmsWarehouseAreaDO updateObj = BeanUtils.toBean(updateReqVO, WmsWarehouseAreaDO.class); + warehouseAreaMapper.updateById(updateObj); + } + + private void validateWarehouseAreaSaveData(WmsWarehouseAreaSaveReqVO reqVO) { + warehouseService.validateWarehouseExists(reqVO.getWarehouseId()); + validateWarehouseAreaNameUnique(reqVO.getId(), reqVO.getWarehouseId(), reqVO.getName()); + validateWarehouseAreaCodeUnique(reqVO.getId(), reqVO.getCode()); + } + + private void validateWarehouseAreaNameUnique(Long id, Long warehouseId, String name) { + WmsWarehouseAreaDO area = warehouseAreaMapper.selectByName(warehouseId, name); + if (area == null) { + return; + } + if (ObjUtil.notEqual(area.getId(), id)) { + throw exception(WAREHOUSE_AREA_NAME_DUPLICATE); + } + } + + private void validateWarehouseAreaCodeUnique(Long id, String code) { + if (StrUtil.isBlank(code)) { + return; + } + WmsWarehouseAreaDO area = warehouseAreaMapper.selectByCode(code); + if (area == null) { + return; + } + if (ObjUtil.notEqual(area.getId(), id)) { + throw exception(WAREHOUSE_AREA_CODE_DUPLICATE); + } + } + + @Override + public void deleteWarehouseArea(Long id) { + validateAreaEnabled(); + // 校验存在 + validateWarehouseAreaExists(id); + + // 删除 + warehouseAreaMapper.deleteById(id); + } + + @Override + public WmsWarehouseAreaDO validateWarehouseAreaExists(Long id) { + validateAreaEnabled(); + WmsWarehouseAreaDO area = warehouseAreaMapper.selectById(id); + if (area == null) { + throw exception(WAREHOUSE_AREA_NOT_EXISTS); + } + return area; + } + + @Override + public WmsWarehouseAreaDO getWarehouseArea(Long id) { + validateAreaEnabled(); + return warehouseAreaMapper.selectById(id); + } + + @Override + public PageResult getWarehouseAreaPage(WmsWarehouseAreaPageReqVO pageReqVO) { + validateAreaEnabled(); + return warehouseAreaMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseAreaList(Long warehouseId) { + validateAreaEnabled(); + return warehouseAreaMapper.selectListByWarehouseId(warehouseId); + } + + private void validateAreaEnabled() { + if (!wmsProperties.isAreaEnabled()) { + throw exception(WMS_AREA_DISABLED); + } + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseService.java new file mode 100644 index 0000000..9e2c5da --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseService.java @@ -0,0 +1,87 @@ +package cn.iocoder.yudao.module.wms.service.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehousePageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehouseSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * WMS 仓库 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsWarehouseService { + + /** + * 创建仓库 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouse(@Valid WmsWarehouseSaveReqVO createReqVO); + + /** + * 更新仓库 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouse(@Valid WmsWarehouseSaveReqVO updateReqVO); + + /** + * 删除仓库 + * + * @param id 编号 + */ + void deleteWarehouse(Long id); + + /** + * 校验仓库存在 + * + * @param id 编号 + * @return 仓库 + */ + WmsWarehouseDO validateWarehouseExists(Long id); + + /** + * 获得仓库 + * + * @param id 编号 + * @return 仓库 + */ + WmsWarehouseDO getWarehouse(Long id); + + /** + * 获得仓库分页 + * + * @param pageReqVO 分页查询 + * @return 仓库分页 + */ + PageResult getWarehousePage(WmsWarehousePageReqVO pageReqVO); + + /** + * 获得仓库列表 + * + * @return 仓库列表 + */ + List getWarehouseList(); + + /** + * 按编号集合获得仓库列表 + * + * @param ids 编号集合 + * @return 仓库列表 + */ + List getWarehouseList(Collection ids); + + default Map getWarehouseMap(Collection ids) { + return convertMap(getWarehouseList(ids), WmsWarehouseDO::getId); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseServiceImpl.java new file mode 100644 index 0000000..eaa2d2d --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/warehouse/WmsWarehouseServiceImpl.java @@ -0,0 +1,137 @@ +package cn.iocoder.yudao.module.wms.service.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehousePageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.warehouse.vo.WmsWarehouseSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.dal.mysql.warehouse.WmsWarehouseAreaMapper; +import cn.iocoder.yudao.module.wms.dal.mysql.warehouse.WmsWarehouseMapper; +import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; + +/** + * WMS 仓库 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class WmsWarehouseServiceImpl implements WmsWarehouseService { + + @Resource + private WmsWarehouseMapper warehouseMapper; + @Resource + private WmsWarehouseAreaMapper warehouseAreaMapper; + @Resource + private WmsProperties wmsProperties; + + @Override + public Long createWarehouse(WmsWarehouseSaveReqVO createReqVO) { + // 校验数据 + validateWarehouseSaveData(createReqVO); + + // 插入 + WmsWarehouseDO warehouse = BeanUtils.toBean(createReqVO, WmsWarehouseDO.class); + warehouseMapper.insert(warehouse); + return warehouse.getId(); + } + + @Override + public void updateWarehouse(WmsWarehouseSaveReqVO updateReqVO) { + // 校验存在 + validateWarehouseExists(updateReqVO.getId()); + // 校验数据 + validateWarehouseSaveData(updateReqVO); + + // 更新 + WmsWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, WmsWarehouseDO.class); + warehouseMapper.updateById(updateObj); + } + + private void validateWarehouseSaveData(WmsWarehouseSaveReqVO reqVO) { + validateWarehouseNameUnique(reqVO.getId(), reqVO.getName()); + validateWarehouseCodeUnique(reqVO.getId(), reqVO.getCode()); + } + + private void validateWarehouseNameUnique(Long id, String name) { + WmsWarehouseDO warehouse = warehouseMapper.selectByName(name); + if (warehouse == null) { + return; + } + if (ObjUtil.notEqual(warehouse.getId(), id)) { + throw exception(WAREHOUSE_NAME_DUPLICATE); + } + } + + private void validateWarehouseCodeUnique(Long id, String code) { + if (StrUtil.isBlank(code)) { + return; + } + WmsWarehouseDO warehouse = warehouseMapper.selectByCode(code); + if (warehouse == null) { + return; + } + if (ObjUtil.notEqual(warehouse.getId(), id)) { + throw exception(WAREHOUSE_CODE_DUPLICATE); + } + } + + @Override + public void deleteWarehouse(Long id) { + // 校验存在 + validateWarehouseExists(id); + // 库区模式下,存在库区时不允许删除仓库 + if (wmsProperties.isAreaEnabled() && warehouseAreaMapper.selectCountByWarehouseId(id) > 0) { + throw exception(WAREHOUSE_HAS_AREA); + } + + // 删除 + warehouseMapper.deleteById(id); + } + + @Override + public WmsWarehouseDO validateWarehouseExists(Long id) { + WmsWarehouseDO warehouse = warehouseMapper.selectById(id); + if (warehouse == null) { + throw exception(WAREHOUSE_NOT_EXISTS); + } + return warehouse; + } + + @Override + public WmsWarehouseDO getWarehouse(Long id) { + return warehouseMapper.selectById(id); + } + + @Override + public PageResult getWarehousePage(WmsWarehousePageReqVO pageReqVO) { + return warehouseMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseList() { + return warehouseMapper.selectSimpleList(); + } + + @Override + public List getWarehouseList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return warehouseMapper.selectByIds(ids); + } + +}