From dbf7cb8b0fe4f2cba7e2f52764e3bb09944a2bc6 Mon Sep 17 00:00:00 2001 From: Timi Date: Thu, 15 Oct 2026 10:43:34 +0800 Subject: [PATCH] product stock total for page --- .../controller/GaoProductStockController.java | 6 ++++- .../gao/mapper/GaoProductStockMapper.java | 6 +++++ .../gao/service/GaoProductStockService.java | 7 +++-- .../GaoProductStockServiceImplement.java | 11 ++++++-- .../modules/gao/vo/GaoProductStockPage.java | 3 +++ .../gao/vo/GaoProductStockPageResult.java | 26 +++++++++++++++++++ .../timi-server/gao/GaoProductStockMapper.xml | 20 ++++++++++++++ 7 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPageResult.java diff --git a/src/main/java/com/imyeyu/api/modules/gao/controller/GaoProductStockController.java b/src/main/java/com/imyeyu/api/modules/gao/controller/GaoProductStockController.java index 3543318..8938d2a 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/controller/GaoProductStockController.java +++ b/src/main/java/com/imyeyu/api/modules/gao/controller/GaoProductStockController.java @@ -12,6 +12,7 @@ import com.imyeyu.api.modules.gao.vo.GaoProductStockChangeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualInBatchRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualRevokeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockPageResult; import com.imyeyu.api.modules.gao.vo.GaoProductStockProductView; import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPage; import com.imyeyu.java.bean.timi.TimiException; @@ -40,11 +41,14 @@ public class GaoProductStockController { private final GaoProductStockRecordService recordService; private final GaoStoreScopeService storeScopeService; + /// 分页查询产品库存;指定 SKU 时附带基础单位库存统计 + /// @param page 分页与筛选条件 + /// @return 库存分页结果,指定 SKU 时包含基础单位库存统计 @AOPLog @RequestRateLimit @RequireGaoPermission(GaoPermissionCode.PRODUCT_STOCK_READ) @PostMapping("/list") - public PageResult list(@RequestBody GaoProductStockPage page) { + public GaoProductStockPageResult list(@RequestBody GaoProductStockPage page) { TimiException.required(page, "not found stock page"); page.setStoreId(storeScopeService.resolveStoreId(page.getStoreId())); return stockService.pageByQuery(page); diff --git a/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockMapper.java b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockMapper.java index ee280c6..834768e 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockMapper.java +++ b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockMapper.java @@ -2,6 +2,7 @@ package com.imyeyu.api.modules.gao.mapper; import com.imyeyu.api.modules.gao.entity.GaoProductStock; import com.imyeyu.api.modules.gao.vo.GaoProductStockPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockPageResult; import com.imyeyu.api.modules.gao.vo.GaoProductStockProductView; import com.imyeyu.spring.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -23,6 +24,11 @@ public interface GaoProductStockMapper extends BaseMapper selectByQuery(GaoProductStockPage page); + /// 按条件统计基础单位库存数量 + /// @param page 库存分页查询条件 + /// @return 匹配 SKU 的库存数量汇总,数量均为基础单位 + GaoProductStockPageResult selectQuantitySummaryByQuery(GaoProductStockPage page); + /// 按产品汇总库存数量 long countProductByQuery(GaoProductStockPage page); diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockService.java b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockService.java index 64b68c4..10ed786 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockService.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockService.java @@ -7,6 +7,7 @@ import com.imyeyu.api.modules.gao.vo.GaoProductStockChangeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualInBatchRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualRevokeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockPageResult; import com.imyeyu.api.modules.gao.vo.GaoProductStockProductView; import com.imyeyu.api.modules.gao.vo.GaoStockChangeItem; import com.imyeyu.java.bean.timi.TimiException; @@ -20,8 +21,10 @@ import java.util.List; /// @since 2026-09-02 public interface GaoProductStockService { - /// 查询库存余额 - PageResult pageByQuery(GaoProductStockPage page); + /// 分页查询库存余额;指定 SKU 时附带基础单位库存统计 + /// @param page 分页与筛选条件 + /// @return 库存分页结果,指定 SKU 时包含基础单位库存统计 + GaoProductStockPageResult pageByQuery(GaoProductStockPage page); /// 按产品汇总查询库存 PageResult pageProductByQuery(GaoProductStockPage page); diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockServiceImplement.java index 82672ea..66bf138 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockServiceImplement.java @@ -19,6 +19,7 @@ import com.imyeyu.api.modules.gao.vo.GaoProductStockChangeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualInBatchRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockManualRevokeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductStockPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockPageResult; import com.imyeyu.api.modules.gao.vo.GaoProductStockProductView; import com.imyeyu.api.modules.gao.vo.GaoStockChangeItem; import com.imyeyu.api.modules.system.audit.AuditOperation; @@ -62,10 +63,16 @@ public class GaoProductStockServiceImplement implements GaoProductStockService { private final UserLoginService userLoginService; @Override - public PageResult pageByQuery(GaoProductStockPage page) { + public GaoProductStockPageResult pageByQuery(GaoProductStockPage page) { TimiException.required(page, "not found stock page"); - PageResult result = new PageResult<>(); + GaoProductStockPageResult result = new GaoProductStockPageResult(); result.setTotal(stockMapper.countByQuery(page)); + if (page.getSkuId() != null && !page.getSkuId().isBlank()) { + GaoProductStockPageResult summary = stockMapper.selectQuantitySummaryByQuery(page); + result.setOnHandQuantityTotal(summary.getOnHandQuantityTotal()); + result.setReservedQuantityTotal(summary.getReservedQuantityTotal()); + result.setAvailableQuantityTotal(summary.getAvailableQuantityTotal()); + } List list = stockMapper.selectByQuery(page); Map photoMap = attachmentService.mapFirstImageByIdList( Attachment.BizType.GAO_PRODUCT_SKU, diff --git a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPage.java b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPage.java index 2b6d4ec..93957b6 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPage.java +++ b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPage.java @@ -18,6 +18,9 @@ public class GaoProductStockPage extends BasePage { /// 产品 ID private String productId; + /// SKU ID + private String skuId; + /// 产品或 SKU 名称、拼音、编码、规格摘要关键词 private String keyword; } diff --git a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPageResult.java b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPageResult.java new file mode 100644 index 0000000..d887794 --- /dev/null +++ b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPageResult.java @@ -0,0 +1,26 @@ +package com.imyeyu.api.modules.gao.vo; + +import com.imyeyu.api.modules.gao.entity.GaoProductStock; +import com.imyeyu.spring.bean.PageResult; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/// GAO 产品库存分页查询结果 +/// +/// @author Codex +/// @since 2026-10-14 +@Data +@EqualsAndHashCode(callSuper = true) +public class GaoProductStockPageResult extends PageResult { + + /// SKU 筛选条件下的实际库存合计,基础单位 + private BigDecimal onHandQuantityTotal; + + /// SKU 筛选条件下的已预占库存合计,基础单位 + private BigDecimal reservedQuantityTotal; + + /// SKU 筛选条件下的可用库存合计,基础单位 + private BigDecimal availableQuantityTotal; +} diff --git a/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml b/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml index f668887..0a1a263 100644 --- a/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml +++ b/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml @@ -42,6 +42,7 @@ AND k.`stock_enabled` = 1 AND k.`status` = 'ACTIVE' AND p.`store_id` = #{storeId} AND k.`product_id` = #{productId} + AND k.`id` = #{skuId} AND (p.`code` LIKE CONCAT('%', #{keyword}, '%') OR p.`name` LIKE CONCAT('%', #{keyword}, '%') OR p.`name_pinyin_full` LIKE CONCAT(#{keyword}, '%') OR p.`name_pinyin_initial` LIKE CONCAT(#{keyword}, '%') OR p.`name_pinyin_mixed` LIKE CONCAT(#{keyword}, '%') OR k.`code` LIKE CONCAT('%', #{keyword}, '%') OR k.`name` LIKE CONCAT('%', #{keyword}, '%') OR k.`spec_summary` LIKE CONCAT('%', #{keyword}, '%') OR k.`barcode` LIKE CONCAT('%', #{keyword}, '%')) +