From ccaae6675e517319a97cbc9bbeea7e7853054123 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 11 May 2026 13:07:36 +0800 Subject: [PATCH] feat(wms):增加 inventory history --- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java | 22 ++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java | 28 ++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java | 22 ++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java | 28 ++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java | 30 ++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java | 33 +++++++++++++++++++++++++++++++++ 14 files changed, 690 insertions(+), 0 deletions(-) create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java new file mode 100644 index 0000000..f4e2783 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java @@ -0,0 +1,90 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory; + +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.inventory.vo.detail.WmsInventoryDetailPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailRespVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryDetailService; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseAreaService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +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; + +@Tag(name = "管理后台 - WMS 库存明细") +@RestController +@RequestMapping("/wms/inventory-detail") +@Validated +public class WmsInventoryDetailController { + + @Resource + private WmsInventoryDetailService inventoryDetailService; + @Resource + private WmsItemService itemService; + @Resource + private WmsItemSkuService itemSkuService; + @Resource + private WmsWarehouseService warehouseService; + @Resource + private WmsWarehouseAreaService warehouseAreaService; + @Resource + private WmsProperties wmsProperties; + + @GetMapping("/page") + @Operation(summary = "获得库存明细分页") + @PreAuthorize("@ss.hasPermission('wms:inventory-detail:query')") + public CommonResult> getInventoryDetailPage( + @Valid WmsInventoryDetailPageReqVO pageReqVO) { + PageResult pageResult = inventoryDetailService.getInventoryDetailPage(pageReqVO); + return success(new PageResult<>(buildInventoryDetailRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + // ==================== 拼接 VO ==================== + + private List buildInventoryDetailRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsInventoryDetailDO::getSkuId)); + Map itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, WmsInventoryDetailDO::getWarehouseId)); + Map areaMap = wmsProperties.isAreaEnabled() + ? warehouseAreaService.getWarehouseAreaMap(convertSet(list, WmsInventoryDetailDO::getAreaId)) + : Collections.emptyMap(); + return BeanUtils.toBean(list, WmsInventoryDetailRespVO.class, vo -> { + MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> { + vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId()); + MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode()) + .setItemName(item.getName()).setUnit(item.getUnit())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java new file mode 100644 index 0000000..16721fd --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java @@ -0,0 +1,90 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory; + +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.inventory.vo.history.WmsInventoryHistoryPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryRespVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryHistoryService; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseAreaService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +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; + +@Tag(name = "管理后台 - WMS 库存流水") +@RestController +@RequestMapping("/wms/inventory-history") +@Validated +public class WmsInventoryHistoryController { + + @Resource + private WmsInventoryHistoryService inventoryHistoryService; + @Resource + private WmsItemService itemService; + @Resource + private WmsItemSkuService itemSkuService; + @Resource + private WmsWarehouseService warehouseService; + @Resource + private WmsWarehouseAreaService warehouseAreaService; + @Resource + private WmsProperties wmsProperties; + + @GetMapping("/page") + @Operation(summary = "获得库存流水分页") + @PreAuthorize("@ss.hasPermission('wms:inventory-history:query')") + public CommonResult> getInventoryHistoryPage( + @Valid WmsInventoryHistoryPageReqVO pageReqVO) { + PageResult pageResult = inventoryHistoryService.getInventoryHistoryPage(pageReqVO); + return success(new PageResult<>(buildInventoryHistoryRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + // ==================== 拼接 VO ==================== + + private List buildInventoryHistoryRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsInventoryHistoryDO::getSkuId)); + Map itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, WmsInventoryHistoryDO::getWarehouseId)); + Map areaMap = wmsProperties.isAreaEnabled() + ? warehouseAreaService.getWarehouseAreaMap(convertSet(list, WmsInventoryHistoryDO::getAreaId)) + : Collections.emptyMap(); + return BeanUtils.toBean(list, WmsInventoryHistoryRespVO.class, vo -> { + MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> { + vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId()); + MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode()) + .setItemName(item.getName()).setUnit(item.getUnit())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java new file mode 100644 index 0000000..e667ef2 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail; + +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; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - WMS 库存明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WmsInventoryDetailPageReqVO extends PageParam { + + /** + * 按仓库库区维度统计 + */ + public static final String TYPE_WAREHOUSE = "warehouse"; + /** + * 按商品维度统计 + */ + public static final String TYPE_ITEM = "item"; + + @Schema(description = "统计维度", example = "warehouse") + private String type; + + @Schema(description = "商品编号", example = "ITEM001") + private String itemCode; + + @Schema(description = "商品名称", example = "红富士苹果") + private String itemName; + + @Schema(description = "商品 SKU 编号", example = "1024") + private Long skuId; + + @Schema(description = "规格编号", example = "SKU001") + private String skuCode; + + @Schema(description = "规格名称", example = "10kg 箱装") + private String skuName; + + @Schema(description = "仓库编号", example = "2048") + private Long warehouseId; + + @Schema(description = "库区编号", example = "4096") + private Long areaId; + + @Schema(description = "批号", example = "BATCH001") + private String batchNo; + + @Schema(description = "过期日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] expirationDate; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java new file mode 100644 index 0000000..7c03259 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - WMS 库存明细 Response VO") +@Data +public class WmsInventoryDetailRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private Long itemId; + @Schema(description = "商品编码", example = "ITEM001") + private String itemCode; + @Schema(description = "商品名称", example = "红富士苹果") + private String itemName; + @Schema(description = "商品单位", example = "箱") + private String unit; + + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") + private Long skuId; + @Schema(description = "规格编号", example = "SKU001") + private String skuCode; + @Schema(description = "规格名称", example = "10kg 箱装") + private String skuName; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8192") + private Long warehouseId; + @Schema(description = "仓库名称", example = "成品仓") + private String warehouseName; + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Long areaId; + @Schema(description = "库区名称", example = "A 区") + private String areaName; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + @Schema(description = "剩余数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "60.00") + private BigDecimal remainQuantity; + @Schema(description = "批号", example = "BATCH001") + private String batchNo; + @Schema(description = "生产日期") + private LocalDateTime productionDate; + @Schema(description = "过期日期") + private LocalDateTime expirationDate; + @Schema(description = "金额", example = "1000.00") + private BigDecimal amount; + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "操作单编号", example = "1024") + private Long orderId; + @Schema(description = "操作单号", example = "RK202605110001") + private String orderNo; + @Schema(description = "操作类型", example = "1") + private Integer orderType; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java new file mode 100644 index 0000000..77e09cd --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history; + +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; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - WMS 库存流水分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WmsInventoryHistoryPageReqVO extends PageParam { + + @Schema(description = "商品编号", example = "ITEM001") + private String itemCode; + + @Schema(description = "商品名称", example = "红富士苹果") + private String itemName; + + @Schema(description = "商品 SKU 编号", example = "1024") + private Long skuId; + + @Schema(description = "规格编号", example = "SKU001") + private String skuCode; + + @Schema(description = "规格名称", example = "10kg 箱装") + private String skuName; + + @Schema(description = "仓库编号", example = "2048") + private Long warehouseId; + + @Schema(description = "库区编号", example = "4096") + private Long areaId; + + @Schema(description = "操作单号", example = "RK202605110001") + private String orderNo; + + @Schema(description = "操作类型", example = "1") + private Integer orderType; + + @Schema(description = "操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java new file mode 100644 index 0000000..2835436 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - WMS 库存流水 Response VO") +@Data +public class WmsInventoryHistoryRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private Long itemId; + @Schema(description = "商品编码", example = "ITEM001") + private String itemCode; + @Schema(description = "商品名称", example = "红富士苹果") + private String itemName; + @Schema(description = "商品单位", example = "箱") + private String unit; + + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") + private Long skuId; + @Schema(description = "规格编号", example = "SKU001") + private String skuCode; + @Schema(description = "规格名称", example = "10kg 箱装") + private String skuName; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8192") + private Long warehouseId; + @Schema(description = "仓库名称", example = "成品仓") + private String warehouseName; + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Long areaId; + @Schema(description = "库区名称", example = "A 区") + private String areaName; + + @Schema(description = "库存变化数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10.00") + private BigDecimal quantity; + @Schema(description = "变化前库存数量", example = "90.00") + private BigDecimal beforeQuantity; + @Schema(description = "变化后库存数量", example = "100.00") + private BigDecimal afterQuantity; + @Schema(description = "批号", example = "BATCH001") + private String batchNo; + @Schema(description = "生产日期") + private LocalDateTime productionDate; + @Schema(description = "过期日期") + private LocalDateTime expirationDate; + @Schema(description = "金额", example = "1000.00") + private BigDecimal amount; + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "操作单编号", example = "1024") + private Long orderId; + @Schema(description = "操作单号", example = "RK202605110001") + private String orderNo; + @Schema(description = "操作类型", example = "1") + private Integer orderType; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java new file mode 100644 index 0000000..ba30ab0 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.wms.dal.mysql.inventory; + +import cn.hutool.core.util.StrUtil; +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.MPJLambdaWrapperX; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * WMS 库存明细 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface WmsInventoryDetailMapper extends BaseMapperX { + + default PageResult selectPage(WmsInventoryDetailPageReqVO reqVO) { + MPJLambdaWrapperX query = new MPJLambdaWrapperX() + .selectAll(WmsInventoryDetailDO.class) + .innerJoin(WmsItemSkuDO.class, WmsItemSkuDO::getId, WmsInventoryDetailDO::getSkuId) + .innerJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId) + .likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode()) + .likeIfPresent(WmsItemDO::getName, reqVO.getItemName()) + .eqIfPresent(WmsInventoryDetailDO::getSkuId, reqVO.getSkuId()) + .likeIfPresent(WmsItemSkuDO::getCode, reqVO.getSkuCode()) + .likeIfPresent(WmsItemSkuDO::getName, reqVO.getSkuName()) + .eqIfPresent(WmsInventoryDetailDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(WmsInventoryDetailDO::getAreaId, reqVO.getAreaId()) + .likeIfPresent(WmsInventoryDetailDO::getBatchNo, reqVO.getBatchNo()) + .betweenIfPresent(WmsInventoryDetailDO::getExpirationDate, reqVO.getExpirationDate()) + .betweenIfPresent(WmsInventoryDetailDO::getCreateTime, reqVO.getCreateTime()); + appendDimensionOrder(query, reqVO.getType()); + return selectJoinPage(reqVO, WmsInventoryDetailDO.class, query); + } + + private static void appendDimensionOrder(MPJLambdaWrapperX query, String type) { + if (StrUtil.equals(WmsInventoryDetailPageReqVO.TYPE_WAREHOUSE, type)) { + query.orderByAsc(WmsInventoryDetailDO::getWarehouseId) + .orderByAsc(WmsInventoryDetailDO::getAreaId) + .orderByAsc(WmsItemSkuDO::getItemId) + .orderByAsc(WmsInventoryDetailDO::getSkuId) + .orderByAsc(WmsInventoryDetailDO::getId); + return; + } + if (StrUtil.equals(WmsInventoryDetailPageReqVO.TYPE_ITEM, type)) { + query.orderByAsc(WmsItemSkuDO::getItemId) + .orderByAsc(WmsInventoryDetailDO::getSkuId) + .orderByAsc(WmsInventoryDetailDO::getWarehouseId) + .orderByAsc(WmsInventoryDetailDO::getAreaId) + .orderByAsc(WmsInventoryDetailDO::getId); + return; + } + throw new IllegalArgumentException("未知库存明细统计维度:" + type); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java new file mode 100644 index 0000000..f304e54 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.wms.dal.mysql.inventory; + +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.MPJLambdaWrapperX; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * WMS 库存流水 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface WmsInventoryHistoryMapper extends BaseMapperX { + + default PageResult selectPage(WmsInventoryHistoryPageReqVO reqVO) { + MPJLambdaWrapperX query = new MPJLambdaWrapperX() + .selectAll(WmsInventoryHistoryDO.class) + .leftJoin(WmsItemSkuDO.class, WmsItemSkuDO::getId, WmsInventoryHistoryDO::getSkuId) + .leftJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId) + .likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode()) + .likeIfPresent(WmsItemDO::getName, reqVO.getItemName()) + .eqIfPresent(WmsInventoryHistoryDO::getSkuId, reqVO.getSkuId()) + .likeIfPresent(WmsItemSkuDO::getCode, reqVO.getSkuCode()) + .likeIfPresent(WmsItemSkuDO::getName, reqVO.getSkuName()) + .eqIfPresent(WmsInventoryHistoryDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(WmsInventoryHistoryDO::getAreaId, reqVO.getAreaId()) + .eqIfPresent(WmsInventoryHistoryDO::getOrderNo, reqVO.getOrderNo()) + .eqIfPresent(WmsInventoryHistoryDO::getOrderType, reqVO.getOrderType()) + .betweenIfPresent(WmsInventoryHistoryDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WmsInventoryHistoryDO::getCreateTime) + .orderByDesc(WmsInventoryHistoryDO::getId); + return selectJoinPage(reqVO, WmsInventoryHistoryDO.class, query); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java new file mode 100644 index 0000000..d224aa2 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; + +/** + * WMS 库存明细 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsInventoryDetailService { + + /** + * 获得库存明细分页 + * + * @param pageReqVO 分页查询 + * @return 库存明细分页 + */ + PageResult getInventoryDetailPage(WmsInventoryDetailPageReqVO pageReqVO); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java new file mode 100644 index 0000000..a5c33fc --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryDetailMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * WMS 库存明细 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class WmsInventoryDetailServiceImpl implements WmsInventoryDetailService { + + @Resource + private WmsInventoryDetailMapper inventoryDetailMapper; + + @Override + public PageResult getInventoryDetailPage(WmsInventoryDetailPageReqVO pageReqVO) { + return inventoryDetailMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java new file mode 100644 index 0000000..6700fb5 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; + +/** + * WMS 库存流水 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsInventoryHistoryService { + + /** + * 获得库存流水分页 + * + * @param pageReqVO 分页查询 + * @return 库存流水分页 + */ + PageResult getInventoryHistoryPage(WmsInventoryHistoryPageReqVO pageReqVO); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java new file mode 100644 index 0000000..8c38011 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; +import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryHistoryMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * WMS 库存流水 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class WmsInventoryHistoryServiceImpl implements WmsInventoryHistoryService { + + @Resource + private WmsInventoryHistoryMapper inventoryHistoryMapper; + + @Override + public PageResult getInventoryHistoryPage(WmsInventoryHistoryPageReqVO pageReqVO) { + return inventoryHistoryMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java new file mode 100644 index 0000000..741b284 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; + +/** + * WMS 库存 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsInventoryService { + + /** + * 获得库存统计分页 + * + * @param pageReqVO 分页查询 + * @return 库存统计分页 + */ + PageResult getInventoryPage(WmsInventoryPageReqVO pageReqVO); + + /** + * 获得指定 SKU 的库存数量 + * + * @param skuId SKU 编号 + * @return 库存数量 + */ + long getInventoryCountBySkuId(Long skuId); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java new file mode 100644 index 0000000..8296bcf --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; +import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * WMS 库存 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class WmsInventoryServiceImpl implements WmsInventoryService { + + @Resource + private WmsInventoryMapper inventoryMapper; + + @Override + public PageResult getInventoryPage(WmsInventoryPageReqVO pageReqVO) { + return inventoryMapper.selectPage(pageReqVO); + } + + @Override + public long getInventoryCountBySkuId(Long skuId) { + return inventoryMapper.selectCountBySkuId(skuId); + } + +} -- libgit2 0.21.4