Commit a333887bc07b645953d017992387cf213f4d4f10

Authored by YunaiV
1 parent 5f31b32c

feat(wms): 持久化单据行金额并补全库存流水与仓库删除校验

Showing 15 changed files with 119 additions and 24 deletions
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<WmsInventoryDO> { @@ -49,6 +49,10 @@ public interface WmsInventoryMapper extends BaseMapperX<WmsInventoryDO> {
49 return selectCount(WmsInventoryDO::getSkuId, skuId); 49 return selectCount(WmsInventoryDO::getSkuId, skuId);
50 } 50 }
51 51
  52 + default Long selectCountByWarehouseId(Long warehouseId) {
  53 + return selectCount(WmsInventoryDO::getWarehouseId, warehouseId);
  54 + }
  55 +
52 default List<WmsInventoryDO> selectList(WmsInventoryListReqVO reqVO) { 56 default List<WmsInventoryDO> selectList(WmsInventoryListReqVO reqVO) {
53 return selectList(new LambdaQueryWrapperX<WmsInventoryDO>() 57 return selectList(new LambdaQueryWrapperX<WmsInventoryDO>()
54 .eq(WmsInventoryDO::getWarehouseId, reqVO.getWarehouseId()) 58 .eq(WmsInventoryDO::getWarehouseId, reqVO.getWarehouseId())
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java
@@ -14,6 +14,7 @@ public interface ErrorCodeConstants { @@ -14,6 +14,7 @@ public interface ErrorCodeConstants {
14 ErrorCode WAREHOUSE_NAME_DUPLICATE = new ErrorCode(1_060_100_001, "仓库名称重复"); 14 ErrorCode WAREHOUSE_NAME_DUPLICATE = new ErrorCode(1_060_100_001, "仓库名称重复");
15 ErrorCode WAREHOUSE_CODE_DUPLICATE = new ErrorCode(1_060_100_002, "仓库编号重复"); 15 ErrorCode WAREHOUSE_CODE_DUPLICATE = new ErrorCode(1_060_100_002, "仓库编号重复");
16 ErrorCode WAREHOUSE_HAS_ORDER = new ErrorCode(1_060_100_004, "删除失败!仓库已被{}使用!"); 16 ErrorCode WAREHOUSE_HAS_ORDER = new ErrorCode(1_060_100_004, "删除失败!仓库已被{}使用!");
  17 + ErrorCode WAREHOUSE_HAS_INVENTORY = new ErrorCode(1_060_100_005, "删除失败!仓库已存在库存余额!");
17 18
18 // ========== WMS 基础数据-商品分类 1-060-102-000 ========== 19 // ========== WMS 基础数据-商品分类 1-060-102-000 ==========
19 ErrorCode ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_060_102_000, "商品分类不存在"); 20 ErrorCode ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_060_102_000, "商品分类不存在");
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java
@@ -41,6 +41,14 @@ public interface WmsInventoryService { @@ -41,6 +41,14 @@ public interface WmsInventoryService {
41 long getInventoryCountBySkuId(Long skuId); 41 long getInventoryCountBySkuId(Long skuId);
42 42
43 /** 43 /**
  44 + * 获得指定仓库的库存数量
  45 + *
  46 + * @param warehouseId 仓库编号
  47 + * @return 库存数量
  48 + */
  49 + long getInventoryCountByWarehouseId(Long warehouseId);
  50 +
  51 + /**
44 * 盘点库存 52 * 盘点库存
45 * 53 *
46 * @param reqDTO 盘点库存请求 54 * @param reqDTO 盘点库存请求
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; @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Tuple;
5 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
6 import cn.iocoder.yudao.framework.common.exception.ServiceException; 6 import cn.iocoder.yudao.framework.common.exception.ServiceException;
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
8 import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO; 9 import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO;
9 import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; 10 import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO;
10 import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; 11 import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO;
@@ -71,6 +72,11 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { @@ -71,6 +72,11 @@ public class WmsInventoryServiceImpl implements WmsInventoryService {
71 } 72 }
72 73
73 @Override 74 @Override
  75 + public long getInventoryCountByWarehouseId(Long warehouseId) {
  76 + return inventoryMapper.selectCountByWarehouseId(warehouseId);
  77 + }
  78 +
  79 + @Override
74 @Transactional(rollbackFor = Exception.class) 80 @Transactional(rollbackFor = Exception.class)
75 public void checkInventory(WmsInventoryCheckReqDTO reqDTO) { 81 public void checkInventory(WmsInventoryCheckReqDTO reqDTO) {
76 if (reqDTO == null || CollUtil.isEmpty(reqDTO.getItems())) { 82 if (reqDTO == null || CollUtil.isEmpty(reqDTO.getItems())) {
@@ -223,12 +229,12 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { @@ -223,12 +229,12 @@ public class WmsInventoryServiceImpl implements WmsInventoryService {
223 WmsInventoryCheckReqDTO.Item item, 229 WmsInventoryCheckReqDTO.Item item,
224 BigDecimal beforeQuantity, 230 BigDecimal beforeQuantity,
225 BigDecimal afterQuantity) { 231 BigDecimal afterQuantity) {
226 - return new WmsInventoryHistoryDO()  
227 - .setWarehouseId(item.getWarehouseId()).setSkuId(item.getSkuId())  
228 - .setQuantity(afterQuantity.subtract(beforeQuantity))  
229 - .setBeforeQuantity(beforeQuantity).setAfterQuantity(afterQuantity)  
230 - .setPrice(item.getPrice()).setRemark(item.getRemark())  
231 - .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()); 232 + BigDecimal quantity = afterQuantity.subtract(beforeQuantity);
  233 + return new WmsInventoryHistoryDO().setWarehouseId(item.getWarehouseId()).setSkuId(item.getSkuId())
  234 + .setQuantity(quantity).setBeforeQuantity(beforeQuantity).setAfterQuantity(afterQuantity)
  235 + .setPrice(item.getPrice()).setTotalPrice(MoneyUtils.priceMultiply(item.getPrice(), quantity))
  236 + .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType())
  237 + .setRemark(item.getRemark());
232 } 238 }
233 239
234 private WmsInventoryDO getOrCreateCheckInventory(WmsInventoryCheckReqDTO.Item item) { 240 private WmsInventoryDO getOrCreateCheckInventory(WmsInventoryCheckReqDTO.Item item) {
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 @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo.WmsWarehouse
10 import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; 10 import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
11 import cn.iocoder.yudao.module.wms.dal.mysql.md.warehouse.WmsWarehouseMapper; 11 import cn.iocoder.yudao.module.wms.dal.mysql.md.warehouse.WmsWarehouseMapper;
12 import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum; 12 import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum;
  13 +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService;
13 import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService; 14 import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService;
14 import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService; 15 import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService;
15 import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService; 16 import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService;
@@ -37,6 +38,10 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService { @@ -37,6 +38,10 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService {
37 38
38 @Resource 39 @Resource
39 private WmsWarehouseMapper warehouseMapper; 40 private WmsWarehouseMapper warehouseMapper;
  41 +
  42 + @Resource
  43 + @Lazy // 延迟加载,避免循环依赖
  44 + private WmsInventoryService inventoryService;
40 @Resource 45 @Resource
41 @Lazy // 延迟加载,避免循环依赖 46 @Lazy // 延迟加载,避免循环依赖
42 private WmsReceiptOrderService receiptOrderService; 47 private WmsReceiptOrderService receiptOrderService;
@@ -113,6 +118,9 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService { @@ -113,6 +118,9 @@ public class WmsWarehouseServiceImpl implements WmsWarehouseService {
113 } 118 }
114 119
115 private void validateWarehouseUnused(Long id) { 120 private void validateWarehouseUnused(Long id) {
  121 + if (inventoryService.getInventoryCountByWarehouseId(id) > 0) {
  122 + throw exception(WAREHOUSE_HAS_INVENTORY);
  123 + }
116 if (receiptOrderService.getReceiptOrderCountByWarehouseId(id) > 0) { 124 if (receiptOrderService.getReceiptOrderCountByWarehouseId(id) > 0) {
117 throw exception(WAREHOUSE_HAS_ORDER, WmsOrderTypeEnum.RECEIPT.getName()); 125 throw exception(WAREHOUSE_HAS_ORDER, WmsOrderTypeEnum.RECEIPT.getName());
118 } 126 }
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; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.wms.service.order.check;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderSaveReqVO; 7 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderSaveReqVO;
7 import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO; 8 import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO;
@@ -53,7 +54,7 @@ public class WmsCheckOrderDetailServiceImpl implements WmsCheckOrderDetailServic @@ -53,7 +54,7 @@ public class WmsCheckOrderDetailServiceImpl implements WmsCheckOrderDetailServic
53 List<WmsCheckOrderDetailDO> list = buildCheckOrderDetailList(reqVO); 54 List<WmsCheckOrderDetailDO> list = buildCheckOrderDetailList(reqVO);
54 List<WmsCheckOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; 55 List<WmsCheckOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list;
55 List<List<WmsCheckOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 56 List<List<WmsCheckOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录
56 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); 57 + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
57 58
58 // 第二步,批量添加、修改、删除 59 // 第二步,批量添加、修改、删除
59 if (CollUtil.isNotEmpty(diffList.get(0))) { 60 if (CollUtil.isNotEmpty(diffList.get(0))) {
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; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.check;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailSaveReqVO;
8 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderPageReqVO; 9 import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderPageReqVO;
@@ -167,10 +168,10 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { @@ -167,10 +168,10 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService {
167 continue; 168 continue;
168 } 169 }
169 if (detail.getQuantity() != null) { 170 if (detail.getQuantity() != null) {
170 - totalPrice = totalPrice.add(detail.getQuantity().multiply(detail.getPrice())); 171 + totalPrice = totalPrice.add(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity()));
171 } 172 }
172 if (detail.getCheckQuantity() != null) { 173 if (detail.getCheckQuantity() != null) {
173 - actualPrice = actualPrice.add(detail.getCheckQuantity().multiply(detail.getPrice())); 174 + actualPrice = actualPrice.add(MoneyUtils.priceMultiply(detail.getPrice(), detail.getCheckQuantity()));
174 } 175 }
175 } 176 }
176 } 177 }
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; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.movement;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO;
7 import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO; 9 import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO;
@@ -53,7 +55,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail @@ -53,7 +55,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail
53 List<WmsMovementOrderDetailDO> list = buildMovementOrderDetailList(reqVO); 55 List<WmsMovementOrderDetailDO> list = buildMovementOrderDetailList(reqVO);
54 List<WmsMovementOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; 56 List<WmsMovementOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list;
55 List<List<WmsMovementOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 57 List<List<WmsMovementOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录
56 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); 58 + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
57 59
58 // 第二步,批量添加、修改、删除 60 // 第二步,批量添加、修改、删除
59 if (CollUtil.isNotEmpty(diffList.get(0))) { 61 if (CollUtil.isNotEmpty(diffList.get(0))) {
@@ -124,7 +126,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail @@ -124,7 +126,7 @@ public class WmsMovementOrderDetailServiceImpl implements WmsMovementOrderDetail
124 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { 126 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) {
125 return; 127 return;
126 } 128 }
127 - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); 129 + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity()));
128 } 130 }
129 131
130 } 132 }
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; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.movement;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailSaveReqVO;
8 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderPageReqVO; 9 import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderPageReqVO;
@@ -183,10 +184,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { @@ -183,10 +184,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService {
183 if (totalPrice != null) { 184 if (totalPrice != null) {
184 return totalPrice; 185 return totalPrice;
185 } 186 }
186 - if (quantity == null || price == null) {  
187 - return null;  
188 - }  
189 - return quantity.multiply(price); 187 + return MoneyUtils.priceMultiply(price, quantity);
190 } 188 }
191 189
192 private WmsMovementOrderDO validateMovementOrderExists(Long id) { 190 private WmsMovementOrderDO validateMovementOrderExists(Long id) {
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; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.receipt;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderSaveReqVO;
7 import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO; 9 import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO;
@@ -53,7 +55,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe @@ -53,7 +55,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe
53 List<WmsReceiptOrderDetailDO> list = buildReceiptOrderDetailList(reqVO); 55 List<WmsReceiptOrderDetailDO> list = buildReceiptOrderDetailList(reqVO);
54 List<WmsReceiptOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; 56 List<WmsReceiptOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list;
55 List<List<WmsReceiptOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 57 List<List<WmsReceiptOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录
56 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); 58 + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
57 59
58 // 第二步,批量添加、修改、删除 60 // 第二步,批量添加、修改、删除
59 if (CollUtil.isNotEmpty(diffList.get(0))) { 61 if (CollUtil.isNotEmpty(diffList.get(0))) {
@@ -123,7 +125,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe @@ -123,7 +125,7 @@ public class WmsReceiptOrderDetailServiceImpl implements WmsReceiptOrderDetailSe
123 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { 125 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) {
124 return; 126 return;
125 } 127 }
126 - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); 128 + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity()));
127 } 129 }
128 130
129 } 131 }
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; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.receipt;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailSaveReqVO;
8 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderPageReqVO; 9 import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderPageReqVO;
@@ -190,10 +191,7 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { @@ -190,10 +191,7 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
190 if (totalPrice != null) { 191 if (totalPrice != null) {
191 return totalPrice; 192 return totalPrice;
192 } 193 }
193 - if (quantity == null || price == null) {  
194 - return null;  
195 - }  
196 - return quantity.multiply(price); 194 + return MoneyUtils.priceMultiply(price, quantity);
197 } 195 }
198 196
199 private WmsReceiptOrderDO validateReceiptOrderExists(Long id) { 197 private WmsReceiptOrderDO validateReceiptOrderExists(Long id) {
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; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.wms.service.order.shipment;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO;
7 import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO; 9 import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO;
@@ -53,7 +55,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail @@ -53,7 +55,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail
53 List<WmsShipmentOrderDetailDO> list = buildShipmentOrderDetailList(reqVO); 55 List<WmsShipmentOrderDetailDO> list = buildShipmentOrderDetailList(reqVO);
54 List<WmsShipmentOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list; 56 List<WmsShipmentOrderDetailDO> newList = CollUtil.isEmpty(list) ? ListUtil.of() : list;
55 List<List<WmsShipmentOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录 57 List<List<WmsShipmentOrderDetailDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录
56 - (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); 58 + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
57 59
58 // 第二步,批量添加、修改、删除 60 // 第二步,批量添加、修改、删除
59 if (CollUtil.isNotEmpty(diffList.get(0))) { 61 if (CollUtil.isNotEmpty(diffList.get(0))) {
@@ -123,7 +125,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail @@ -123,7 +125,7 @@ public class WmsShipmentOrderDetailServiceImpl implements WmsShipmentOrderDetail
123 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) { 125 if (detail.getTotalPrice() != null || detail.getQuantity() == null || detail.getPrice() == null) {
124 return; 126 return;
125 } 127 }
126 - detail.setTotalPrice(detail.getQuantity().multiply(detail.getPrice())); 128 + detail.setTotalPrice(MoneyUtils.priceMultiply(detail.getPrice(), detail.getQuantity()));
127 } 129 }
128 130
129 } 131 }
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; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.wms.service.order.shipment;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailSaveReqVO; 8 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailSaveReqVO;
8 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderPageReqVO; 9 import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderPageReqVO;
@@ -193,7 +194,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { @@ -193,7 +194,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService {
193 if (quantity == null || price == null) { 194 if (quantity == null || price == null) {
194 return null; 195 return null;
195 } 196 }
196 - return quantity.multiply(price); 197 + return MoneyUtils.priceMultiply(price, quantity);
197 } 198 }
198 199
199 private WmsShipmentOrderDO validateShipmentOrderExists(Long id) { 200 private WmsShipmentOrderDO validateShipmentOrderExists(Long id) {
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java
@@ -366,6 +366,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @@ -366,6 +366,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest {
366 assertEquals(0, new BigDecimal("10.00").compareTo(history.getBeforeQuantity())); 366 assertEquals(0, new BigDecimal("10.00").compareTo(history.getBeforeQuantity()));
367 assertEquals(0, new BigDecimal("7.00").compareTo(history.getAfterQuantity())); 367 assertEquals(0, new BigDecimal("7.00").compareTo(history.getAfterQuantity()));
368 assertEquals(0, new BigDecimal("-3.00").compareTo(history.getQuantity())); 368 assertEquals(0, new BigDecimal("-3.00").compareTo(history.getQuantity()));
  369 + assertEquals(0, new BigDecimal("-300.00").compareTo(history.getTotalPrice()));
369 assertEquals(reqDTO.getOrderId(), history.getOrderId()); 370 assertEquals(reqDTO.getOrderId(), history.getOrderId());
370 assertEquals(reqDTO.getOrderNo(), history.getOrderNo()); 371 assertEquals(reqDTO.getOrderNo(), history.getOrderNo());
371 assertEquals(reqDTO.getOrderType(), history.getOrderType()); 372 assertEquals(reqDTO.getOrderType(), history.getOrderType());
@@ -410,6 +411,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @@ -410,6 +411,7 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest {
410 assertEquals(0, BigDecimal.ZERO.compareTo(histories.get(0).getBeforeQuantity())); 411 assertEquals(0, BigDecimal.ZERO.compareTo(histories.get(0).getBeforeQuantity()));
411 assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getAfterQuantity())); 412 assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getAfterQuantity()));
412 assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getQuantity())); 413 assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getQuantity()));
  414 + assertEquals(0, new BigDecimal("500.00").compareTo(histories.get(0).getTotalPrice()));
413 } 415 }
414 416
415 @Test 417 @Test
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.wms.service.md.warehouse;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
  5 +import cn.iocoder.yudao.module.wms.dal.mysql.md.warehouse.WmsWarehouseMapper;
  6 +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService;
  7 +import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService;
  8 +import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService;
  9 +import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService;
  10 +import cn.iocoder.yudao.module.wms.service.order.shipment.WmsShipmentOrderService;
  11 +import jakarta.annotation.Resource;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
  15 +
  16 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  17 +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.WAREHOUSE_HAS_INVENTORY;
  18 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  19 +import static org.mockito.Mockito.when;
  20 +
  21 +@Import(WmsWarehouseServiceImpl.class)
  22 +public class WmsWarehouseServiceImplTest extends BaseDbUnitTest {
  23 +
  24 + @Resource
  25 + private WmsWarehouseServiceImpl warehouseService;
  26 +
  27 + @Resource
  28 + private WmsWarehouseMapper warehouseMapper;
  29 +
  30 + @MockitoBean
  31 + private WmsInventoryService inventoryService;
  32 + @MockitoBean
  33 + private WmsReceiptOrderService receiptOrderService;
  34 + @MockitoBean
  35 + private WmsShipmentOrderService shipmentOrderService;
  36 + @MockitoBean
  37 + private WmsMovementOrderService movementOrderService;
  38 + @MockitoBean
  39 + private WmsCheckOrderService checkOrderService;
  40 +
  41 + @Test
  42 + public void testDeleteWarehouse_hasInventory() {
  43 + // mock 数据
  44 + WmsWarehouseDO warehouse = createWarehouse();
  45 + warehouseMapper.insert(warehouse);
  46 + when(inventoryService.getInventoryCountByWarehouseId(warehouse.getId())).thenReturn(1L);
  47 +
  48 + // 调用,并断言
  49 + assertServiceException(() -> warehouseService.deleteWarehouse(warehouse.getId()), WAREHOUSE_HAS_INVENTORY);
  50 + assertNotNull(warehouseMapper.selectById(warehouse.getId()));
  51 + }
  52 +
  53 + private static WmsWarehouseDO createWarehouse() {
  54 + return WmsWarehouseDO.builder()
  55 + .code("WH001")
  56 + .name("成品仓")
  57 + .sort(1)
  58 + .build();
  59 + }
  60 +
  61 +}