From a333887bc07b645953d017992387cf213f4d4f10 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 15 May 2026 15:26:14 +0800 Subject: [PATCH] feat(wms): 持久化单据行金额并补全库存流水与仓库删除校验 --- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java | 4 ++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java | 1 + yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java | 8 ++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java | 18 ++++++++++++------ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java | 8 ++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java | 3 ++- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java | 5 +++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java | 6 ++++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java | 6 ++---- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java | 6 ++++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java | 6 ++---- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java | 6 ++++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java | 3 ++- yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java | 2 ++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 119 insertions(+), 24 deletions(-) create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java index d6268d9..1e1a17a 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java @@ -49,6 +49,10 @@ public interface WmsInventoryMapper extends BaseMapperX { return selectCount(WmsInventoryDO::getSkuId, skuId); } + default Long selectCountByWarehouseId(Long warehouseId) { + return selectCount(WmsInventoryDO::getWarehouseId, warehouseId); + } + default List selectList(WmsInventoryListReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .eq(WmsInventoryDO::getWarehouseId, reqVO.getWarehouseId()) 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 1b07e1d..c3ca935 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 @@ -14,6 +14,7 @@ public interface ErrorCodeConstants { ErrorCode WAREHOUSE_NAME_DUPLICATE = new ErrorCode(1_060_100_001, "仓库名称重复"); ErrorCode WAREHOUSE_CODE_DUPLICATE = new ErrorCode(1_060_100_002, "仓库编号重复"); ErrorCode WAREHOUSE_HAS_ORDER = new ErrorCode(1_060_100_004, "删除失败!仓库已被{}使用!"); + ErrorCode WAREHOUSE_HAS_INVENTORY = new ErrorCode(1_060_100_005, "删除失败!仓库已存在库存余额!"); // ========== WMS 基础数据-商品分类 1-060-102-000 ========== ErrorCode ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_060_102_000, "商品分类不存在"); 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 index 294dbe3..8eb2c5d 100644 --- 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 @@ -41,6 +41,14 @@ public interface WmsInventoryService { long getInventoryCountBySkuId(Long skuId); /** + * 获得指定仓库的库存数量 + * + * @param warehouseId 仓库编号 + * @return 库存数量 + */ + long getInventoryCountByWarehouseId(Long warehouseId); + + /** * 盘点库存 * * @param reqDTO 盘点库存请求 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 index 61b080a..3ff81ad 100644 --- 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 @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO; import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; @@ -71,6 +72,11 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { } @Override + public long getInventoryCountByWarehouseId(Long warehouseId) { + return inventoryMapper.selectCountByWarehouseId(warehouseId); + } + + @Override @Transactional(rollbackFor = Exception.class) public void checkInventory(WmsInventoryCheckReqDTO reqDTO) { if (reqDTO == null || CollUtil.isEmpty(reqDTO.getItems())) { @@ -223,12 +229,12 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { WmsInventoryCheckReqDTO.Item item, BigDecimal beforeQuantity, BigDecimal afterQuantity) { - return new WmsInventoryHistoryDO() - .setWarehouseId(item.getWarehouseId()).setSkuId(item.getSkuId()) - .setQuantity(afterQuantity.subtract(beforeQuantity)) - .setBeforeQuantity(beforeQuantity).setAfterQuantity(afterQuantity) - .setPrice(item.getPrice()).setRemark(item.getRemark()) - .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()); + BigDecimal quantity = afterQuantity.subtract(beforeQuantity); + return new WmsInventoryHistoryDO().setWarehouseId(item.getWarehouseId()).setSkuId(item.getSkuId()) + .setQuantity(quantity).setBeforeQuantity(beforeQuantity).setAfterQuantity(afterQuantity) + .setPrice(item.getPrice()).setTotalPrice(MoneyUtils.priceMultiply(item.getPrice(), quantity)) + .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()) + .setRemark(item.getRemark()); } private WmsInventoryDO getOrCreateCheckInventory(WmsInventoryCheckReqDTO.Item item) { diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java index f7ce2ee..48f727c 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo.WmsWarehouse import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; import cn.iocoder.yudao.module.wms.dal.mysql.md.warehouse.WmsWarehouseMapper; import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService; import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService; import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService; import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService; @@ -37,6 +38,10 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService { @Resource private WmsWarehouseMapper warehouseMapper; + + @Resource + @Lazy // 延迟加载,避免循环依赖 + private WmsInventoryService inventoryService; @Resource @Lazy // 延迟加载,避免循环依赖 private WmsReceiptOrderService receiptOrderService; @@ -113,6 +118,9 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService { } private void validateWarehouseUnused(Long id) { + if (inventoryService.getInventoryCountByWarehouseId(id) > 0) { + throw exception(WAREHOUSE_HAS_INVENTORY); + } if (receiptOrderService.getReceiptOrderCountByWarehouseId(id) > 0) { throw exception(WAREHOUSE_HAS_ORDER, WmsOrderTypeEnum.RECEIPT.getName()); } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java index d934b3a..6afeebc 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.wms.service.order.check; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO; @@ -53,7 +54,7 @@ public class WmsCheckOrderDetailServiceImpl implements WmsCheckOrderDetailServic List list = buildCheckOrderDetailList(reqVO); List newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; List> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId())); // 第二步,批量添加、修改、删除 if (CollUtil.isNotEmpty(diffList.get(0))) { diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java index 5fb2ce5..0fe35b0 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.check; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailSaveReqVO; import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderPageReqVO; @@ -167,10 +168,10 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { continue; } if (detail.getQuantity() != null) { - totalPrice = totalPrice.add(detail.getQuantity().multiply(detail.getPrice())); + totalPrice = totalPrice.add(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity())); } if (detail.getCheckQuantity() != null) { - actualPrice = actualPrice.add(detail.getCheckQuantity().multiply(detail.getPrice())); + actualPrice = actualPrice.add(MoneyUtils.priceMultiply(detail.getPrice(), detail.getCheckQuantity())); } } } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java index ff2fd4e..e5b4bb0 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.movement; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO; @@ -53,7 +55,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail List list = buildMovementOrderDetailList(reqVO); List newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; List> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId())); // 第二步,批量添加、修改、删除 if (CollUtil.isNotEmpty(diffList.get(0))) { @@ -124,7 +126,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { return; } - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity())); } } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java index f236d89..9a15ecd 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.movement; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailSaveReqVO; import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderPageReqVO; @@ -183,10 +184,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { if (totalPrice != null) { return totalPrice; } - if (quantity == null || price == null) { - return null; - } - return quantity.multiply(price); + return MoneyUtils.priceMultiply(price, quantity); } private WmsMovementOrderDO validateMovementOrderExists(Long id) { diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java index 62f0e1f..67ae8d0 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.receipt; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO; @@ -53,7 +55,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe List list = buildReceiptOrderDetailList(reqVO); List newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; List> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId())); // 第二步,批量添加、修改、删除 if (CollUtil.isNotEmpty(diffList.get(0))) { @@ -123,7 +125,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { return; } - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity())); } } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java index 93a280e..b10f73e 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.receipt; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailSaveReqVO; import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderPageReqVO; @@ -190,10 +191,7 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { if (totalPrice != null) { return totalPrice; } - if (quantity == null || price == null) { - return null; - } - return quantity.multiply(price); + return MoneyUtils.priceMultiply(price, quantity); } private WmsReceiptOrderDO validateReceiptOrderExists(Long id) { diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java index bd2e352..ed9e633 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.shipment; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO; @@ -53,7 +55,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail List list = buildShipmentOrderDetailList(reqVO); List newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; List> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId())); // 第二步,批量添加、修改、删除 if (CollUtil.isNotEmpty(diffList.get(0))) { @@ -123,7 +125,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { return; } - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity())); } } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java index bd583f8..e3542e5 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.shipment; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailSaveReqVO; import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderPageReqVO; @@ -193,7 +194,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { if (quantity == null || price == null) { return null; } - return quantity.multiply(price); + return MoneyUtils.priceMultiply(price, quantity); } private WmsShipmentOrderDO validateShipmentOrderExists(Long id) { diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java index 5b6c208..3dc11db 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java @@ -366,6 +366,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { assertEquals(0, new BigDecimal("10.00").compareTo(history.getBeforeQuantity())); assertEquals(0, new BigDecimal("7.00").compareTo(history.getAfterQuantity())); assertEquals(0, new BigDecimal("-3.00").compareTo(history.getQuantity())); + assertEquals(0, new BigDecimal("-300.00").compareTo(history.getTotalPrice())); assertEquals(reqDTO.getOrderId(), history.getOrderId()); assertEquals(reqDTO.getOrderNo(), history.getOrderNo()); assertEquals(reqDTO.getOrderType(), history.getOrderType()); @@ -410,6 +411,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { assertEquals(0, BigDecimal.ZERO.compareTo(histories.get(0).getBeforeQuantity())); assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getAfterQuantity())); assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getQuantity())); + assertEquals(0, new BigDecimal("500.00").compareTo(histories.get(0).getTotalPrice())); } @Test diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java new file mode 100644 index 0000000..42f28e2 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.wms.service.md.warehouse; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.dal.mysql.md.warehouse.WmsWarehouseMapper; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService; +import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService; +import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService; +import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService; +import cn.iocoder.yudao.module.wms.service.order.shipment.WmsShipmentOrderService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.WAREHOUSE_HAS_INVENTORY; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + +@Import(WmsWarehouseServiceImpl.class) +public class WmsWarehouseServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsWarehouseServiceImpl warehouseService; + + @Resource + private WmsWarehouseMapper warehouseMapper; + + @MockitoBean + private WmsInventoryService inventoryService; + @MockitoBean + private WmsReceiptOrderService receiptOrderService; + @MockitoBean + private WmsShipmentOrderService shipmentOrderService; + @MockitoBean + private WmsMovementOrderService movementOrderService; + @MockitoBean + private WmsCheckOrderService checkOrderService; + + @Test + public void testDeleteWarehouse_hasInventory() { + // mock 数据 + WmsWarehouseDO warehouse = createWarehouse(); + warehouseMapper.insert(warehouse); + when(inventoryService.getInventoryCountByWarehouseId(warehouse.getId())).thenReturn(1L); + + // 调用,并断言 + assertServiceException(() -> warehouseService.deleteWarehouse(warehouse.getId()), WAREHOUSE_HAS_INVENTORY); + assertNotNull(warehouseMapper.selectById(warehouse.getId())); + } + + private static WmsWarehouseDO createWarehouse() { + return WmsWarehouseDO.builder() + .code("WH001") + .name("成品仓") + .sort(1) + .build(); + } + +} -- libgit2 0.21.4