diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java index 3af929d..04acda2 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java @@ -52,8 +52,8 @@ public class WmsMovementOrderDetailRespVO { @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/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java index db7ff9b..d0fdc95 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java @@ -23,8 +23,8 @@ public class WmsMovementOrderDetailSaveReqVO { @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/movement/vo/order/WmsMovementOrderPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderPageReqVO.java index 238ac9a..c59bc11 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderPageReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderPageReqVO.java @@ -44,10 +44,10 @@ public class WmsMovementOrderPageReqVO 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 = "1") private String creator; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java index f401bd3..ecad02e 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java @@ -57,7 +57,7 @@ public class WmsMovementOrderRespVO { @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/movement/vo/order/WmsMovementOrderSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderSaveReqVO.java index 750bc18..982d30d 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderSaveReqVO.java @@ -8,7 +8,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; @@ -40,14 +39,6 @@ public class WmsMovementOrderSaveReqVO { @NotNull(message = "目标仓库不能为空") private Long targetWarehouseId; - @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/movement/WmsMovementOrderDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDO.java index 82ea52a..6286409 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDO.java @@ -77,6 +77,6 @@ public class WmsMovementOrderDO 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/movement/WmsMovementOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java index 61f05ba..72f2b48 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java @@ -70,8 +70,8 @@ public class WmsMovementOrderDetailDO 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/movement/WmsMovementOrderMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderMapper.java index 883c3a6..305dd66 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderMapper.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderMapper.java @@ -24,8 +24,8 @@ public interface WmsMovementOrderMapper extends BaseMapperX .betweenIfPresent(WmsMovementOrderDO::getOrderTime, reqVO.getOrderTime()) .geIfPresent(WmsMovementOrderDO::getTotalQuantity, reqVO.getTotalQuantityMin()) .leIfPresent(WmsMovementOrderDO::getTotalQuantity, reqVO.getTotalQuantityMax()) - .geIfPresent(WmsMovementOrderDO::getTotalAmount, reqVO.getTotalAmountMin()) - .leIfPresent(WmsMovementOrderDO::getTotalAmount, reqVO.getTotalAmountMax()) + .geIfPresent(WmsMovementOrderDO::getTotalPrice, reqVO.getTotalPriceMin()) + .leIfPresent(WmsMovementOrderDO::getTotalPrice, reqVO.getTotalPriceMax()) .eqIfPresent(WmsMovementOrderDO::getCreator, reqVO.getCreator()) .eqIfPresent(WmsMovementOrderDO::getUpdater, reqVO.getUpdater()) .betweenIfPresent(WmsMovementOrderDO::getCreateTime, reqVO.getCreateTime()) 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 a9e15f1..05652ae 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 @@ -1,8 +1,10 @@ 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.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; import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDO; @@ -18,6 +20,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -51,6 +54,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { // 2.1 插入移库单 WmsMovementOrderDO order = BeanUtils.toBean(createReqVO, WmsMovementOrderDO.class); order.setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); + fillMovementOrderTotal(order, createReqVO); movementOrderMapper.insert(order); // 2.2 插入移库单明细 movementOrderDetailService.createMovementOrderDetailList(order.getId(), createReqVO); @@ -67,6 +71,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { // 2.1 更新移库单 WmsMovementOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsMovementOrderDO.class) .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); + fillMovementOrderTotal(updateObj, updateReqVO); movementOrderMapper.updateById(updateObj); // 2.2 更新移库单明细 movementOrderDetailService.updateMovementOrderDetailList(updateReqVO.getId(), updateReqVO); @@ -152,6 +157,22 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { } } + private void fillMovementOrderTotal(WmsMovementOrderDO order, WmsMovementOrderSaveReqVO reqVO) { + BigDecimal totalQuantity = BigDecimal.ZERO; + BigDecimal totalPrice = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(reqVO.getDetails())) { + for (WmsMovementOrderDetailSaveReqVO 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 WmsMovementOrderDO validateMovementOrderExists(Long id) { WmsMovementOrderDO order = id == null ? null : movementOrderMapper.selectById(id); if (order == null) { diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java index 8bab4b6..63c2ef9 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java @@ -131,7 +131,7 @@ public class WmsMovementOrderDetailServiceImplTest 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; } @@ -142,7 +142,7 @@ public class WmsMovementOrderDetailServiceImplTest extends BaseDbUnitTest { .sourceWarehouseId(100L) .targetWarehouseId(200L) .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/movement/WmsMovementOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java index 59094bc..3979846 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.wms.service.order.movement; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +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.WmsMovementOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO; @@ -20,6 +21,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.MOVEMENT_ORDER_DETAIL_REQUIRED; @@ -51,6 +53,43 @@ public class WmsMovementOrderServiceImplTest extends BaseDbUnitTest { private WmsInventoryService inventoryService; @Test + public void testCreateMovementOrder_calculateTotal() { + // mock 数据 + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO(null, 100L, 200L, + createMovementOrderDetailReqVO(null, 3001L, "1.50", "10.00"), + createMovementOrderDetailReqVO(null, 3002L, "2.50", "20.00")); + + // 调用 + Long orderId = movementOrderService.createMovementOrder(reqVO); + + // 断言 + WmsMovementOrderDO dbOrder = movementOrderMapper.selectById(orderId); + assertNotNull(dbOrder); + assertEquals(0, new BigDecimal("4.00").compareTo(dbOrder.getTotalQuantity())); + assertEquals(0, new BigDecimal("65.00").compareTo(dbOrder.getTotalPrice())); + assertEquals(2, movementOrderDetailMapper.selectListByOrderId(orderId).size()); + } + + @Test + public void testUpdateMovementOrder_calculateTotal() { + // mock 数据 + WmsMovementOrderDO order = createMovementOrder(100L, 200L); + movementOrderMapper.insert(order); + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO(order.getId(), 100L, 200L, + createMovementOrderDetailReqVO(null, 3001L, "3.00", "30.00")); + + // 调用 + movementOrderService.updateMovementOrder(reqVO); + + // 断言 + WmsMovementOrderDO dbOrder = movementOrderMapper.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, movementOrderDetailMapper.selectListByOrderId(order.getId()).size()); + } + + @Test public void testCompleteMovementOrder_success() { // mock 数据 Long sourceWarehouseId = 100L; @@ -156,7 +195,7 @@ public class WmsMovementOrderServiceImplTest extends BaseDbUnitTest { .setSourceWarehouseId(sourceWarehouseId) .setTargetWarehouseId(targetWarehouseId) .setTotalQuantity(new BigDecimal("2.00")) - .setTotalAmount(new BigDecimal("20.00")); + .setTotalPrice(new BigDecimal("20.00")); } private static WmsMovementOrderDetailDO createMovementOrderDetail(Long orderId, Long skuId, @@ -167,18 +206,34 @@ public class WmsMovementOrderServiceImplTest extends BaseDbUnitTest { .sourceWarehouseId(sourceWarehouseId) .targetWarehouseId(targetWarehouseId) .quantity(new BigDecimal("2.00")) - .amount(new BigDecimal("20.00")) + .price(new BigDecimal("20.00")) .build(); } private static WmsMovementOrderSaveReqVO createMovementOrderReqVO(Long sourceWarehouseId, Long targetWarehouseId) { + return createMovementOrderReqVO(null, sourceWarehouseId, targetWarehouseId); + } + + private static WmsMovementOrderSaveReqVO createMovementOrderReqVO(Long id, Long sourceWarehouseId, + Long targetWarehouseId, + WmsMovementOrderDetailSaveReqVO... details) { WmsMovementOrderSaveReqVO reqVO = new WmsMovementOrderSaveReqVO(); + reqVO.setId(id); reqVO.setNo("YK202605120001"); reqVO.setOrderTime(LocalDateTime.of(2026, 5, 12, 0, 0)); reqVO.setSourceWarehouseId(sourceWarehouseId); reqVO.setTargetWarehouseId(targetWarehouseId); - reqVO.setTotalQuantity(new BigDecimal("2.00")); - reqVO.setTotalAmount(new BigDecimal("20.00")); + reqVO.setDetails(Arrays.asList(details)); + return reqVO; + } + + private static WmsMovementOrderDetailSaveReqVO createMovementOrderDetailReqVO(Long id, Long skuId, + String quantity, String price) { + WmsMovementOrderDetailSaveReqVO reqVO = new WmsMovementOrderDetailSaveReqVO(); + reqVO.setId(id); + reqVO.setSkuId(skuId); + reqVO.setQuantity(new BigDecimal(quantity)); + reqVO.setPrice(new BigDecimal(price)); return reqVO; } 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 2003711..6c13b96 100644 --- a/yudao-module-wms/src/test/resources/sql/create_tables.sql +++ b/yudao-module-wms/src/test/resources/sql/create_tables.sql @@ -157,7 +157,7 @@ CREATE TABLE IF NOT EXISTS "wms_movement_order" ( "source_warehouse_id" bigint NOT NULL, "target_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 '', @@ -174,7 +174,7 @@ CREATE TABLE IF NOT EXISTS "wms_movement_order_detail" ( "source_warehouse_id" bigint NOT NULL, "target_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 '',