diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDO.java new file mode 100644 index 0000000..328c8e7 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDO.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; +import cn.iocoder.yudao.module.wms.enums.DictTypeConstants; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * WMS 入库单 DO + * + * @author 芋道源码 + */ +@TableName("wms_receipt_order") +@KeySequence("wms_receipt_order_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WmsReceiptOrderDO extends BaseDO { + + /** + * 主键编号 + */ + @TableId + private Long id; + /** + * 入库单号 + */ + private String no; + /** + * 入库类型 + * + * 字典 {@link DictTypeConstants#RECEIPT_ORDER_TYPE} + */ + private Integer type; + /** + * 入库状态 + * + * 字典 {@link DictTypeConstants#RECEIPT_ORDER_STATUS} + */ + private Integer status; + /** + * 业务订单号 + */ + private String bizOrderNo; + /** + * 往来企业编号 + * + * 关联 {@link WmsMerchantDO#getId()} + */ + private Long merchantId; + /** + * 备注 + */ + private String remark; + + // ========= 仓库库区字段 ========= + + /** + * 仓库编号 + * + * 关联 {@link WmsWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区编号 + * + * 关联 {@link WmsWarehouseAreaDO#getId()} + */ + private Long areaId; + + // ========= 汇总金额字段 ========= + + /** + * 总数量 + */ + private BigDecimal totalQuantity; + /** + * 总金额 + */ + private BigDecimal totalAmount; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java new file mode 100644 index 0000000..2b9fe16 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * WMS 入库单明细 DO + * + * @author 芋道源码 + */ +@TableName("wms_receipt_order_detail") +@KeySequence("wms_receipt_order_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WmsReceiptOrderDetailDO extends BaseDO { + + /** + * 主键编号 + */ + @TableId + private Long id; + /** + * 备注 + */ + private String remark; + + // ========= 单据商品字段 ========= + + /** + * 入库单编号 + * + * 关联 {@link WmsReceiptOrderDO#getId()} + */ + private Long orderId; + /** + * 商品 SKU 编号 + * + * 关联 {@link WmsItemSkuDO#getId()} + */ + private Long skuId; + + // ========= 仓库库区字段 ========= + + /** + * 仓库编号 + * + * 关联 {@link WmsWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区编号 + * + * 关联 {@link WmsWarehouseAreaDO#getId()} + */ + private Long areaId; + + // ========= 批次效期字段 ========= + + /** + * 批号 + */ + private String batchNo; + /** + * 生产日期 + */ + private LocalDateTime productionDate; + /** + * 过期日期 + */ + private LocalDateTime expirationDate; + + // ========= 汇总金额字段 ========= + + /** + * 入库数量 + */ + private BigDecimal quantity; + /** + * 金额(小计、非单价) + */ + private BigDecimal amount; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java index eece235..9fe1cd6 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java @@ -8,8 +8,8 @@ package cn.iocoder.yudao.module.wms.enums; public interface DictTypeConstants { String MERCHANT_TYPE = "merchant_type"; - String RECEIPT_STATUS = "wms_receipt_status"; - String RECEIPT_TYPE = "wms_receipt_type"; + String RECEIPT_ORDER_STATUS = "wms_receipt_order_status"; + String RECEIPT_ORDER_TYPE = "wms_receipt_order_type"; String SHIPMENT_STATUS = "wms_shipment_status"; String SHIPMENT_TYPE = "wms_shipment_type"; String INVENTORY_HISTORY_TYPE = "wms_inventory_history_type"; diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java new file mode 100644 index 0000000..7ac3611 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.wms.service.inventory; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; +import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryDetailMapper; +import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemMapper; +import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemSkuMapper; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Import(WmsInventoryDetailServiceImpl.class) +public class WmsInventoryDetailServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsInventoryDetailServiceImpl inventoryDetailService; + + @Resource + private WmsInventoryDetailMapper inventoryDetailMapper; + @Resource + private WmsItemMapper itemMapper; + @Resource + private WmsItemSkuMapper skuMapper; + + @Test + public void testGetInventoryDetailPage_daysToExpires() { + // mock 数据 + WmsItemDO item = createItem("ITEM-001", "红富士苹果"); + WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); + WmsInventoryDetailDO dbDetail = createInventoryDetail(sku.getId(), 100L, 1001L, "10.00", + LocalDateTime.of(LocalDate.now().plusDays(10), LocalTime.MIN)); + inventoryDetailMapper.insert(dbDetail); + inventoryDetailMapper.insert(createInventoryDetail(sku.getId(), 100L, 1002L, "20.00", + LocalDateTime.of(LocalDate.now().plusDays(40), LocalTime.MIN))); + // 准备参数 + WmsInventoryDetailPageReqVO reqVO = new WmsInventoryDetailPageReqVO(); + reqVO.setType(WmsInventoryDetailPageReqVO.TYPE_WAREHOUSE); + reqVO.setDaysToExpires(30); + + // 调用 + PageResult pageResult = inventoryDetailService.getInventoryDetailPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertEquals(dbDetail.getId(), pageResult.getList().get(0).getId()); + } + + private WmsItemDO createItem(String code, String name) { + WmsItemDO item = WmsItemDO.builder() + .code(code) + .name(name) + .unit("箱") + .categoryId(1L) + .build(); + itemMapper.insert(item); + return item; + } + + private WmsItemSkuDO createSku(Long itemId, String code, String name) { + WmsItemSkuDO sku = WmsItemSkuDO.builder() + .itemId(itemId) + .code(code) + .name(name) + .barCode("69010001") + .build(); + skuMapper.insert(sku); + return sku; + } + + private static WmsInventoryDetailDO createInventoryDetail(Long skuId, Long warehouseId, Long areaId, + String quantity, LocalDateTime expirationDate) { + return WmsInventoryDetailDO.builder() + .skuId(skuId) + .warehouseId(warehouseId) + .areaId(areaId) + .quantity(new BigDecimal(quantity)) + .remainQuantity(new BigDecimal(quantity)) + .expirationDate(expirationDate) + .build(); + } + +}