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 8938d2a..cfc82bb 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,9 +12,9 @@ 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.api.modules.gao.vo.GaoProductStockRecordPageResult; import com.imyeyu.java.bean.timi.TimiException; import com.imyeyu.spring.annotation.AOPLog; import com.imyeyu.spring.annotation.RequestRateLimit; @@ -41,14 +41,11 @@ 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 GaoProductStockPageResult list(@RequestBody GaoProductStockPage page) { + public PageResult list(@RequestBody GaoProductStockPage page) { TimiException.required(page, "not found stock page"); page.setStoreId(storeScopeService.resolveStoreId(page.getStoreId())); return stockService.pageByQuery(page); @@ -145,11 +142,15 @@ public class GaoProductStockController { return stockService.stocktakeLoss(normalize(request)); } + /// 按条件分页查询库存流水并汇总 SKU 基础单位变动 + /// @param page 流水分页与筛选条件 + /// @return 流水分页及匹配条件下的 SKU 基础单位汇总 + /// @throws TimiException 分页请求为空或门店范围校验失败 @AOPLog @RequestRateLimit @RequireGaoPermission(GaoPermissionCode.PRODUCT_STOCK_READ) @PostMapping("/record/list") - public PageResult recordList(@RequestBody GaoProductStockRecordPage page) { + public GaoProductStockRecordPageResult recordList(@RequestBody GaoProductStockRecordPage page) { TimiException.required(page, "not found stock record page"); page.setStoreId(storeScopeService.resolveStoreId(page.getStoreId())); return recordService.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 834768e..ee280c6 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,7 +2,6 @@ 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; @@ -24,11 +23,6 @@ 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/mapper/GaoProductStockRecordMapper.java b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockRecordMapper.java index bd5ea37..5b20d93 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockRecordMapper.java +++ b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoProductStockRecordMapper.java @@ -2,6 +2,7 @@ package com.imyeyu.api.modules.gao.mapper; import com.imyeyu.api.modules.gao.entity.GaoProductStockRecord; import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordSkuSummaryView; import com.imyeyu.spring.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -33,4 +34,9 @@ public interface GaoProductStockRecordMapper extends BaseMapper selectByQuery(GaoProductStockRecordPage page); + + /// 按条件统计指定 SKU 的出入库基础单位数量,不受分页字段限制 + /// @param page 包含 SKU 和库存流水筛选条件的请求 + /// @return 指定 SKU 的出入库基础单位数量 + GaoProductStockRecordSkuSummaryView selectSkuBaseUnitSummaryByQuery(GaoProductStockRecordPage page); } diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockRecordService.java b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockRecordService.java index 3686785..ab2beb1 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockRecordService.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductStockRecordService.java @@ -3,7 +3,7 @@ package com.imyeyu.api.modules.gao.service; import com.imyeyu.api.modules.common.entity.Attachment; import com.imyeyu.api.modules.gao.entity.GaoProductStockRecord; import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPage; -import com.imyeyu.spring.bean.PageResult; +import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPageResult; import com.imyeyu.spring.service.BaseService; import java.util.List; @@ -14,8 +14,10 @@ import java.util.List; /// @since 2026-09-02 public interface GaoProductStockRecordService extends BaseService { - /// 按条件查询库存流水 - PageResult pageByQuery(GaoProductStockRecordPage page); + /// 按条件查询库存流水;指定 SKU 时统计其出入库基础单位数量 + /// @param page 流水分页和统计筛选条件 + /// @return 流水分页及匹配条件下的 SKU 基础单位汇总 + GaoProductStockRecordPageResult pageByQuery(GaoProductStockRecordPage page); /// 查询库存流水详情 GaoProductStockRecord detail(String id); 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 10ed786..64b68c4 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,7 +7,6 @@ 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; @@ -21,10 +20,8 @@ import java.util.List; /// @since 2026-09-02 public interface GaoProductStockService { - /// 分页查询库存余额;指定 SKU 时附带基础单位库存统计 - /// @param page 分页与筛选条件 - /// @return 库存分页结果,指定 SKU 时包含基础单位库存统计 - GaoProductStockPageResult pageByQuery(GaoProductStockPage page); + /// 查询库存余额 + PageResult pageByQuery(GaoProductStockPage page); /// 按产品汇总查询库存 PageResult pageProductByQuery(GaoProductStockPage page); diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockRecordServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockRecordServiceImplement.java index c83f25b..bc55a4e 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockRecordServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductStockRecordServiceImplement.java @@ -10,12 +10,13 @@ import com.imyeyu.api.modules.gao.mapper.GaoProductStockRecordMapper; import com.imyeyu.api.modules.gao.service.GaoCustomerService; import com.imyeyu.api.modules.gao.service.GaoProductStockRecordService; import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPage; +import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordPageResult; +import com.imyeyu.api.modules.gao.vo.GaoProductStockRecordSkuSummaryView; import com.imyeyu.api.modules.user.entity.User; import com.imyeyu.api.modules.user.service.UserService; import com.imyeyu.java.TimiJava; import com.imyeyu.java.bean.timi.TimiCode; import com.imyeyu.java.bean.timi.TimiException; -import com.imyeyu.spring.bean.PageResult; import com.imyeyu.spring.mapper.BaseMapper; import com.imyeyu.spring.service.AbstractEntityService; import lombok.RequiredArgsConstructor; @@ -45,12 +46,17 @@ public class GaoProductStockRecordServiceImplement extends AbstractEntityService } @Override - public PageResult pageByQuery(GaoProductStockRecordPage page) { + public GaoProductStockRecordPageResult pageByQuery(GaoProductStockRecordPage page) { TimiException.required(page, "not found stock record page"); - PageResult result = new PageResult<>(); + GaoProductStockRecordPageResult result = new GaoProductStockRecordPageResult(); result.setTotal(mapper.countByQuery(page)); result.setList(mapper.selectByQuery(page)); fillTransient(result.getList()); + if (page.getSkuId() != null && !page.getSkuId().isBlank()) { + GaoProductStockRecordSkuSummaryView summary = mapper.selectSkuBaseUnitSummaryByQuery(page); + result.setInBaseQuantityTotal(summary.getInBaseQuantityTotal()); + result.setOutBaseQuantityTotal(summary.getOutBaseQuantityTotal()); + } return result; } 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 9852e24..f131862 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,7 +19,6 @@ 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; @@ -63,16 +62,10 @@ public class GaoProductStockServiceImplement implements GaoProductStockService { private final UserLoginService userLoginService; @Override - public GaoProductStockPageResult pageByQuery(GaoProductStockPage page) { + public PageResult pageByQuery(GaoProductStockPage page) { TimiException.required(page, "not found stock page"); - GaoProductStockPageResult result = new GaoProductStockPageResult(); + PageResult result = new PageResult<>(); 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 93957b6..2b6d4ec 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,9 +18,6 @@ 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 deleted file mode 100644 index d887794..0000000 --- a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockPageResult.java +++ /dev/null @@ -1,26 +0,0 @@ -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/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordPageResult.java b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordPageResult.java new file mode 100644 index 0000000..bfec4ff --- /dev/null +++ b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordPageResult.java @@ -0,0 +1,26 @@ +package com.imyeyu.api.modules.gao.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.imyeyu.api.modules.gao.entity.GaoProductStockRecord; +import com.imyeyu.spring.bean.PageResult; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/// GAO 库存流水分页查询结果 +/// +/// @author Codex +/// @since 2026-10-16 +@Data +@EqualsAndHashCode(callSuper = true) +public class GaoProductStockRecordPageResult extends PageResult { + + /// 指定 SKU 在查询条件下的入库基础单位数量合计 + @JsonInclude(JsonInclude.Include.NON_NULL) + private BigDecimal inBaseQuantityTotal; + + /// 指定 SKU 在查询条件下的出库基础单位数量合计 + @JsonInclude(JsonInclude.Include.NON_NULL) + private BigDecimal outBaseQuantityTotal; +} diff --git a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordSkuSummaryView.java b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordSkuSummaryView.java new file mode 100644 index 0000000..6d4790e --- /dev/null +++ b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoProductStockRecordSkuSummaryView.java @@ -0,0 +1,19 @@ +package com.imyeyu.api.modules.gao.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/// 库存流水 SKU 基础单位统计 +/// +/// @author Codex +/// @since 2026-10-16 +@Data +public class GaoProductStockRecordSkuSummaryView { + + /// 入库基础单位数量合计 + private BigDecimal inBaseQuantityTotal; + + /// 出库基础单位数量合计 + private BigDecimal outBaseQuantityTotal; +} diff --git a/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml b/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml index 0a1a263..f668887 100644 --- a/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml +++ b/src/main/resources/mapper/timi-server/gao/GaoProductStockMapper.xml @@ -42,7 +42,6 @@ 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}, '%')) - +