From 743e72a533ad243b4eee6f0588d13c6c690117e3 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Thu, 4 Sep 2025 16:54:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=8F=B0=E8=B4=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增库存台账相关的 BO 和 VO 类 - 在 InventoryService 中添加查询库存台账的方法 - 在 InventoryController 中添加库存台账的 API 接口 - 在 InventoryMapper 中添加查询各类库存变动记录的方法 - 在 XML 文件中添加对应的 SQL 查询语句 --- .../controller/WmsInventoryController.java | 22 ++ .../wms/domain/bo/WmsInventoryLedgerBo.java | 86 ++++++ .../wms/domain/vo/WmsInventoryLedgerVo.java | 147 ++++++++++ .../wms/mapper/WmsInventoryMapper.java | 27 ++ .../wms/service/IWmsInventoryService.java | 19 ++ .../service/impl/WmsInventoryServiceImpl.java | 111 +++++++ .../mapper/wms/WmsInventoryMapper.xml | 272 ++++++++++++++++++ 7 files changed, 684 insertions(+) create mode 100644 ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInventoryLedgerBo.java create mode 100644 ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInventoryLedgerVo.java diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInventoryController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInventoryController.java index 7d75fade..9eb5f153 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInventoryController.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInventoryController.java @@ -17,7 +17,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.wms.domain.WmsInventory; import org.dromara.wms.domain.bo.WmsInventoryBo; +import org.dromara.wms.domain.bo.WmsInventoryLedgerBo; import org.dromara.wms.domain.vo.WmsInventoryVo; +import org.dromara.wms.domain.vo.WmsInventoryLedgerVo; import org.dromara.wms.service.IWmsInventoryService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -136,4 +138,24 @@ public class WmsInventoryController extends BaseController { public R> getMaterialInfoList(WmsInventoryBo bo) { return R.ok(wmsInventoryService.getMaterialInfoList(bo)); } + + /** + * 查询库存台账列表 + */ + @SaCheckPermission("system:inventory:list") + @GetMapping("/ledger/list") + public TableDataInfo ledgerList(WmsInventoryLedgerBo bo, PageQuery pageQuery) { + return wmsInventoryService.queryInventoryLedgerPageList(bo, pageQuery); + } + + /** + * 导出库存台账列表 + */ + @SaCheckPermission("system:inventory:export") + @Log(title = "库存台账", businessType = BusinessType.EXPORT) + @PostMapping("/ledger/export") + public void exportLedger(WmsInventoryLedgerBo bo, HttpServletResponse response) { + List list = wmsInventoryService.queryInventoryLedgerList(bo); + ExcelUtil.exportExcel(list, "库存台账", WmsInventoryLedgerVo.class, response); + } } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInventoryLedgerBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInventoryLedgerBo.java new file mode 100644 index 00000000..d5004b23 --- /dev/null +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInventoryLedgerBo.java @@ -0,0 +1,86 @@ +package org.dromara.wms.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 库存台账业务对象 wms_inventory_ledger + * + * @author LionLi + * @date 2025-01-07 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class WmsInventoryLedgerBo extends BaseEntity { + + /** + * 物料ID + */ + private Long materialId; + + /** + * 物料编码 + */ + private String materialCode; + + /** + * 物料名称 + */ + private String materialName; + + /** + * 批次码 + */ + private String batchCode; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 仓库编码 + */ + private String warehouseCode; + + /** + * 库位编码 + */ + private String locationCode; + + /** + * 变动类型(1入库,2出库,3调拨,4退库,5盘点调账) + */ + private String changeType; + + /** + * 关联单号 + */ + private String relatedCode; + + /** + * 开始日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + /** + * 结束日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + /** + * 物料大类ID + */ + private Long materialCategoryId; + + /** + * 记账周期类型(1按日,2按月) + */ + private String periodType; +} diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInventoryLedgerVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInventoryLedgerVo.java new file mode 100644 index 00000000..24b25f65 --- /dev/null +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInventoryLedgerVo.java @@ -0,0 +1,147 @@ +package org.dromara.wms.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 库存台账视图对象 wms_inventory_ledger + * + * @author LionLi + * @date 2025-01-07 + */ +@Data +@ExcelIgnoreUnannotated +public class WmsInventoryLedgerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 物料ID + */ + private Long materialId; + + /** + * 物料编码 + */ + @ExcelProperty(value = "物料编码") + private String materialCode; + + /** + * 物料名称 + */ + @ExcelProperty(value = "物料名称") + private String materialName; + + /** + * 物料规格 + */ + @ExcelProperty(value = "物料规格") + private String materialSpec; + + /** + * 物料单位 + */ + @ExcelProperty(value = "物料单位") + private String materialUnit; + + /** + * 批次码 + */ + @ExcelProperty(value = "批次码") + private String batchCode; + + /** + * 仓库ID + */ + @ExcelProperty(value = "仓库ID") + private Long warehouseId; + + /** + * 仓库编码 + */ + @ExcelProperty(value = "仓库编码") + private String warehouseCode; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "仓库名称") + private String warehouseName; + + /** + * 库位编码 + */ + @ExcelProperty(value = "库位编码") + private String locationCode; + + /** + * 变动日期 + */ + @ExcelProperty(value = "变动日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date changeDate; + + /** + * 变动类型(1入库,2出库,3调拨,4退库,5盘点调账) + */ + @ExcelProperty(value = "变动类型") + private String changeType; + + /** + * 变动类型名称 + */ + @ExcelProperty(value = "变动类型名称") + private String changeTypeName; + + /** + * 关联单号 + */ + @ExcelProperty(value = "关联单号") + private String relatedCode; + + /** + * 变动数量(正数为入库,负数为出库) + */ + @ExcelProperty(value = "变动数量") + private BigDecimal changeQty; + + /** + * 结存数量 + */ + @ExcelProperty(value = "结存数量") + private BigDecimal balanceQty; + + /** + * 物料大类ID + */ + private Long materialCategoryId; + + /** + * 物料大类名称 + */ + private String materialCategoryName; + + /** + * 操作人 + */ + private String operatorName; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户ID + */ + private String tenantId; +} diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/mapper/WmsInventoryMapper.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/mapper/WmsInventoryMapper.java index 8189ab14..6506385a 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/mapper/WmsInventoryMapper.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/mapper/WmsInventoryMapper.java @@ -4,7 +4,9 @@ import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.wms.domain.WmsInventory; import org.dromara.wms.domain.bo.WmsInventoryBo; +import org.dromara.wms.domain.bo.WmsInventoryLedgerBo; import org.dromara.wms.domain.vo.WmsInventoryVo; +import org.dromara.wms.domain.vo.WmsInventoryLedgerVo; import org.springframework.stereotype.Repository; import java.math.BigDecimal; @@ -28,4 +30,29 @@ public interface WmsInventoryMapper extends BaseMapperPlus selectSemiInventoryListByLocation(@Param("locationCode") String locationCode); // WmsInventoryVo outSelectInVentoryByBatch(WmsOutstockRecord outstockRecord); + + /** + * 查询入库台账记录 + */ + List selectInstockLedgerRecords(@Param("bo") WmsInventoryLedgerBo bo); + + /** + * 查询出库台账记录 + */ + List selectOutstockLedgerRecords(@Param("bo") WmsInventoryLedgerBo bo); + + /** + * 查询盘点调账台账记录 + */ + List selectInventoryCheckLedgerRecords(@Param("bo") WmsInventoryLedgerBo bo); + + /** + * 查询退库台账记录 + */ + List selectReturnOrderLedgerRecords(@Param("bo") WmsInventoryLedgerBo bo); + + /** + * 查询调拨台账记录 + */ + List selectTransferLedgerRecords(@Param("bo") WmsInventoryLedgerBo bo); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java index 12e7cc28..fd1a08c2 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java @@ -4,8 +4,10 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.wms.domain.WmsInventory; import org.dromara.wms.domain.bo.WmsInventoryBo; +import org.dromara.wms.domain.bo.WmsInventoryLedgerBo; import org.dromara.wms.domain.bo.WmsMoveOrderBo; import org.dromara.wms.domain.vo.WmsInventoryVo; +import org.dromara.wms.domain.vo.WmsInventoryLedgerVo; import java.math.BigDecimal; import java.util.ArrayList; @@ -99,4 +101,21 @@ public interface IWmsInventoryService { * @return 库存VO */ WmsInventoryVo queryByBatchAndLocation(String batchCode); + + /** + * 分页查询库存台账列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 库存台账分页列表 + */ + TableDataInfo queryInventoryLedgerPageList(WmsInventoryLedgerBo bo, PageQuery pageQuery); + + /** + * 查询库存台账列表 + * + * @param bo 查询条件 + * @return 库存台账列表 + */ + List queryInventoryLedgerList(WmsInventoryLedgerBo bo); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java index 2bc4d5da..abbf2c4e 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java @@ -16,8 +16,10 @@ import org.dromara.wms.domain.BaseMaterialInfo; import org.dromara.wms.domain.WmsBaseWarehouse; import org.dromara.wms.domain.WmsInventory; import org.dromara.wms.domain.bo.WmsInventoryBo; +import org.dromara.wms.domain.bo.WmsInventoryLedgerBo; import org.dromara.wms.domain.bo.WmsMoveOrderBo; import org.dromara.wms.domain.vo.WmsInventoryVo; +import org.dromara.wms.domain.vo.WmsInventoryLedgerVo; import org.dromara.wms.mapper.WmsInventoryMapper; import org.dromara.wms.service.IWmsInventoryService; import org.springframework.stereotype.Service; @@ -280,5 +282,114 @@ public class WmsInventoryServiceImpl implements IWmsInventoryService { return baseMapper.selectVoOne(lqw); } + /** + * 分页查询库存台账列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 库存台账分页列表 + */ + @Override + public TableDataInfo queryInventoryLedgerPageList(WmsInventoryLedgerBo bo, PageQuery pageQuery) { + List ledgerList = queryInventoryLedgerList(bo); + + // 手动分页处理 + int total = ledgerList.size(); + int pageNum = pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize(); + int fromIndex = (pageNum - 1) * pageSize; + int toIndex = Math.min(fromIndex + pageSize, total); + + List pageList = fromIndex < total ? ledgerList.subList(fromIndex, toIndex) : new ArrayList<>(); + + TableDataInfo dataInfo = TableDataInfo.build(pageList); + dataInfo.setTotal(total); + return dataInfo; + } + + /** + * 查询库存台账列表 + * + * @param bo 查询条件 + * @return 库存台账列表 + */ + @Override + public List queryInventoryLedgerList(WmsInventoryLedgerBo bo) { + List ledgerList = new ArrayList<>(); + + // 1. 查询入库记录 + ledgerList.addAll(getInstockRecords(bo)); + + // 2. 查询出库记录 + ledgerList.addAll(getOutstockRecords(bo)); + + // 3. 查询盘点调账记录 + ledgerList.addAll(getInventoryCheckRecords(bo)); + + // 4. 查询退库记录 + ledgerList.addAll(getReturnOrderRecords(bo)); + + // 5. 查询调拨记录 + ledgerList.addAll(getTransferRecords(bo)); + + // 按时间排序 + ledgerList.sort(Comparator.comparing(WmsInventoryLedgerVo::getChangeDate)); + + // 计算结存数量 + calculateBalanceQty(ledgerList); + + return ledgerList; + } + + /** + * 获取入库记录 + */ + private List getInstockRecords(WmsInventoryLedgerBo bo) { + return baseMapper.selectInstockLedgerRecords(bo); + } + + /** + * 获取出库记录 + */ + private List getOutstockRecords(WmsInventoryLedgerBo bo) { + return baseMapper.selectOutstockLedgerRecords(bo); + } + + /** + * 获取盘点调账记录 + */ + private List getInventoryCheckRecords(WmsInventoryLedgerBo bo) { + return baseMapper.selectInventoryCheckLedgerRecords(bo); + } + + /** + * 获取退库记录 + */ + private List getReturnOrderRecords(WmsInventoryLedgerBo bo) { + return baseMapper.selectReturnOrderLedgerRecords(bo); + } + + /** + * 获取调拨记录 + */ + private List getTransferRecords(WmsInventoryLedgerBo bo) { + return baseMapper.selectTransferLedgerRecords(bo); + } + + /** + * 计算结存数量 + */ + private void calculateBalanceQty(List ledgerList) { + Map balanceMap = new HashMap<>(); + + for (WmsInventoryLedgerVo record : ledgerList) { + String key = record.getMaterialId() + "_" + record.getBatchCode() + "_" + record.getLocationCode(); + BigDecimal currentBalance = balanceMap.getOrDefault(key, BigDecimal.ZERO); + BigDecimal newBalance = currentBalance.add(record.getChangeQty()); + balanceMap.put(key, newBalance); + record.setBalanceQty(newBalance); + } + } + } diff --git a/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsInventoryMapper.xml b/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsInventoryMapper.xml index 388aac58..9aaa2ae9 100644 --- a/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsInventoryMapper.xml +++ b/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsInventoryMapper.xml @@ -26,6 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" MAX(b.min_stock_amount) min_stock_amount, MAX(b.max_stock_amount) max_stock_amount, MAX(c.warehouse_code) warehouse_code, + MAX(c.warehouse_name) warehouse_name, MAX(b.material_code) material_code, MAX(b.material_name) material_name, MAX(x.lock_state) lock_state, @@ -103,4 +104,275 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where store_place_code= #{locationCode} + + + + + + + + + + + + + + +