From 273d911edc75b2e96362c4f27bd649117b49cfdd Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 09:07:27 +0800 Subject: [PATCH] feat(wms):出库管理,调整合计金额、数量的字段与交互。(前端负责展示,后端负责计算) --- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java | 4 ++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java | 6 +++--- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java | 4 ++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java | 2 +- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java | 9 --------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java | 2 +- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java | 4 ++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java | 4 ++-- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java | 20 ++++++++++++++++++++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java | 4 ++-- yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- yudao-module-wms/src/test/resources/sql/create_tables.sql | 4 ++-- 12 files changed, 101 insertions(+), 28 deletions(-) diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java index 266fcf7..c3a3def 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java @@ -46,8 +46,8 @@ public class WmsShipmentOrderDetailRespVO { @Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") private BigDecimal quantity; - @Schema(description = "金额", example = "1000.00") - private BigDecimal amount; + @Schema(description = "单价", example = "100.00") + private BigDecimal price; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java index 8c0a159..9039782 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java @@ -23,8 +23,8 @@ public class WmsShipmentOrderDetailSaveReqVO { @DecimalMin(value = "0", inclusive = false, message = "出库数量必须大于 0") private BigDecimal quantity; - @Schema(description = "金额", example = "1000.00") - @DecimalMin(value = "0", message = "金额不能小于 0") - private BigDecimal amount; + @Schema(description = "单价", example = "100.00") + @DecimalMin(value = "0", message = "单价不能小于 0") + private BigDecimal price; } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java index 02efd63..2a9f058 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java @@ -45,10 +45,10 @@ public class WmsShipmentOrderPageReqVO extends PageParam { private BigDecimal totalQuantityMax; @Schema(description = "最小总金额", example = "1.00") - private BigDecimal totalAmountMin; + private BigDecimal totalPriceMin; @Schema(description = "最大总金额", example = "1000.00") - private BigDecimal totalAmountMax; + private BigDecimal totalPriceMax; @Schema(description = "出库类型", example = "201") @InEnum(WmsShipmentOrderTypeEnum.class) diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java index 7a1fbb6..b391c1d 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java @@ -66,7 +66,7 @@ public class WmsShipmentOrderRespVO { @Schema(description = "总金额", example = "1000.00") @ExcelProperty("总金额") - private BigDecimal totalAmount; + private BigDecimal totalPrice; @Schema(description = "出库明细") private List details; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java index 8923775..232b92d 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java @@ -10,7 +10,6 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.Data; -import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @@ -50,14 +49,6 @@ public class WmsShipmentOrderSaveReqVO { @NotNull(message = "仓库不能为空") private Long warehouseId; - @Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") - @NotNull(message = "出库数量不能为空") - private BigDecimal totalQuantity; - - @Schema(description = "总金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") - @NotNull(message = "总金额不能为空") - private BigDecimal totalAmount; - @Schema(description = "出库明细") @Valid private List details; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java index 75ce67a..d2e3e4a 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java @@ -87,6 +87,6 @@ public class WmsShipmentOrderDO extends BaseDO { /** * 总金额 */ - private BigDecimal totalAmount; + private BigDecimal totalPrice; } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java index c8bf50f..b566a81 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java @@ -61,8 +61,8 @@ public class WmsShipmentOrderDetailDO extends BaseDO { */ private BigDecimal quantity; /** - * 金额(小计、非单价) + * 单价 */ - private BigDecimal amount; + private BigDecimal price; } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java index 4b140e9..34a6e40 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java @@ -24,8 +24,8 @@ public interface WmsShipmentOrderMapper extends BaseMapperX .betweenIfPresent(WmsShipmentOrderDO::getOrderTime, reqVO.getOrderTime()) .geIfPresent(WmsShipmentOrderDO::getTotalQuantity, reqVO.getTotalQuantityMin()) .leIfPresent(WmsShipmentOrderDO::getTotalQuantity, reqVO.getTotalQuantityMax()) - .geIfPresent(WmsShipmentOrderDO::getTotalAmount, reqVO.getTotalAmountMin()) - .leIfPresent(WmsShipmentOrderDO::getTotalAmount, reqVO.getTotalAmountMax()) + .geIfPresent(WmsShipmentOrderDO::getTotalPrice, reqVO.getTotalPriceMin()) + .leIfPresent(WmsShipmentOrderDO::getTotalPrice, reqVO.getTotalPriceMax()) .eqIfPresent(WmsShipmentOrderDO::getType, reqVO.getType()) .likeIfPresent(WmsShipmentOrderDO::getBizOrderNo, reqVO.getBizOrderNo()) .eqIfPresent(WmsShipmentOrderDO::getCreator, reqVO.getCreator()) 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 1f400f3..2580cba 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 @@ -1,8 +1,10 @@ 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.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; import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDO; @@ -55,6 +57,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { // 2.1 插入出库单 WmsShipmentOrderDO order = BeanUtils.toBean(createReqVO, WmsShipmentOrderDO.class); order.setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); + fillShipmentOrderTotal(order, createReqVO); shipmentOrderMapper.insert(order); // 2.2 插入出库单明细 shipmentOrderDetailService.createShipmentOrderDetailList(order.getId(), createReqVO); @@ -71,6 +74,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { // 2.1 更新出库单 WmsShipmentOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsShipmentOrderDO.class) .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); + fillShipmentOrderTotal(updateObj, updateReqVO); shipmentOrderMapper.updateById(updateObj); // 2.2 更新出库单明细 shipmentOrderDetailService.updateShipmentOrderDetailList(updateReqVO.getId(), updateReqVO); @@ -160,6 +164,22 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { } } + private void fillShipmentOrderTotal(WmsShipmentOrderDO order, WmsShipmentOrderSaveReqVO reqVO) { + BigDecimal totalQuantity = BigDecimal.ZERO; + BigDecimal totalPrice = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(reqVO.getDetails())) { + for (WmsShipmentOrderDetailSaveReqVO detail : reqVO.getDetails()) { + if (detail.getQuantity() != null) { + totalQuantity = totalQuantity.add(detail.getQuantity()); + } + if (detail.getQuantity() != null && detail.getPrice() != null) { + totalPrice = totalPrice.add(detail.getQuantity().multiply(detail.getPrice())); + } + } + } + order.setTotalQuantity(totalQuantity).setTotalPrice(totalPrice); + } + private WmsShipmentOrderDO validateShipmentOrderExists(Long id) { WmsShipmentOrderDO order = id == null ? null : shipmentOrderMapper.selectById(id); if (order == null) { diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java index b9ba624..e7aac9a 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java @@ -127,7 +127,7 @@ public class WmsShipmentOrderDetailServiceImplTest extends BaseDbUnitTest { reqVO.setId(id); reqVO.setSkuId(skuId); reqVO.setQuantity(new BigDecimal(quantity)); - reqVO.setAmount(new BigDecimal("100.00")); + reqVO.setPrice(new BigDecimal("100.00")); return reqVO; } @@ -137,7 +137,7 @@ public class WmsShipmentOrderDetailServiceImplTest extends BaseDbUnitTest { .skuId(skuId) .warehouseId(100L) .quantity(new BigDecimal(quantity)) - .amount(new BigDecimal("100.00")) + .price(new BigDecimal("100.00")) .build(); } diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java index 65b6868..319395f 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.wms.service.order.shipment; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +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.WmsShipmentOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO; import cn.iocoder.yudao.module.wms.dal.mysql.order.shipment.WmsShipmentOrderDetailMapper; @@ -21,6 +23,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Arrays; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.SHIPMENT_ORDER_DETAIL_REQUIRED; @@ -53,6 +56,43 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { private WmsInventoryService inventoryService; @Test + public void testCreateShipmentOrder_calculateTotal() { + // mock 数据 + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderSaveReqVO(null, + createShipmentOrderDetailReqVO(null, 2001L, "1.50", "10.00"), + createShipmentOrderDetailReqVO(null, 2002L, "2.50", "20.00")); + + // 调用 + Long orderId = shipmentOrderService.createShipmentOrder(reqVO); + + // 断言 + WmsShipmentOrderDO dbOrder = shipmentOrderMapper.selectById(orderId); + assertNotNull(dbOrder); + assertEquals(0, new BigDecimal("4.00").compareTo(dbOrder.getTotalQuantity())); + assertEquals(0, new BigDecimal("65.00").compareTo(dbOrder.getTotalPrice())); + assertEquals(2, shipmentOrderDetailMapper.selectListByOrderId(orderId).size()); + } + + @Test + public void testUpdateShipmentOrder_calculateTotal() { + // mock 数据 + WmsShipmentOrderDO order = createShipmentOrder(100L); + shipmentOrderMapper.insert(order); + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderSaveReqVO(order.getId(), + createShipmentOrderDetailReqVO(null, 2001L, "3.00", "30.00")); + + // 调用 + shipmentOrderService.updateShipmentOrder(reqVO); + + // 断言 + WmsShipmentOrderDO dbOrder = shipmentOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(0, new BigDecimal("3.00").compareTo(dbOrder.getTotalQuantity())); + assertEquals(0, new BigDecimal("90.00").compareTo(dbOrder.getTotalPrice())); + assertEquals(1, shipmentOrderDetailMapper.selectListByOrderId(order.getId()).size()); + } + + @Test public void testCompleteShipmentOrder_success() { // mock 数据 Long warehouseId = 100L; @@ -143,7 +183,29 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()) .setWarehouseId(warehouseId) .setTotalQuantity(new BigDecimal("2.00")) - .setTotalAmount(new BigDecimal("20.00")); + .setTotalPrice(new BigDecimal("20.00")); + } + + private static WmsShipmentOrderSaveReqVO createShipmentOrderSaveReqVO(Long id, + WmsShipmentOrderDetailSaveReqVO... details) { + WmsShipmentOrderSaveReqVO reqVO = new WmsShipmentOrderSaveReqVO(); + reqVO.setId(id); + reqVO.setNo("CK202605120001"); + reqVO.setType(WmsShipmentOrderTypeEnum.SALE.getType()); + reqVO.setOrderTime(LocalDateTime.of(2026, 5, 12, 0, 0)); + reqVO.setWarehouseId(100L); + reqVO.setDetails(Arrays.asList(details)); + return reqVO; + } + + private static WmsShipmentOrderDetailSaveReqVO createShipmentOrderDetailReqVO(Long id, Long skuId, + String quantity, String price) { + WmsShipmentOrderDetailSaveReqVO reqVO = new WmsShipmentOrderDetailSaveReqVO(); + reqVO.setId(id); + reqVO.setSkuId(skuId); + reqVO.setQuantity(new BigDecimal(quantity)); + reqVO.setPrice(new BigDecimal(price)); + return reqVO; } private static WmsShipmentOrderDetailDO createShipmentOrderDetail(Long orderId, Long skuId, Long warehouseId) { @@ -152,7 +214,7 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { .skuId(skuId) .warehouseId(warehouseId) .quantity(new BigDecimal("2.00")) - .amount(new BigDecimal("20.00")) + .price(new BigDecimal("20.00")) .build(); } diff --git a/yudao-module-wms/src/test/resources/sql/create_tables.sql b/yudao-module-wms/src/test/resources/sql/create_tables.sql index 918380a..2003711 100644 --- a/yudao-module-wms/src/test/resources/sql/create_tables.sql +++ b/yudao-module-wms/src/test/resources/sql/create_tables.sql @@ -122,7 +122,7 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order" ( "remark" varchar(255) DEFAULT NULL, "warehouse_id" bigint NOT NULL, "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', - "total_amount" decimal(10, 2) DEFAULT NULL, + "total_price" decimal(10, 2) DEFAULT NULL, "creator" varchar(64) DEFAULT '', "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "updater" varchar(64) DEFAULT '', @@ -138,7 +138,7 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" ( "sku_id" bigint NOT NULL, "warehouse_id" bigint NOT NULL, "quantity" decimal(20, 2) NOT NULL DEFAULT '0', - "amount" decimal(10, 2) DEFAULT NULL, + "price" decimal(10, 2) DEFAULT NULL, "creator" varchar(64) DEFAULT '', "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "updater" varchar(64) DEFAULT '', -- libgit2 0.21.4