9 天以前 d5cd948848595b0cffe098ba542a9c879b0f9165
1.仓储物流-采购模块联动
2.仓储物流-销售模块联动
3.清理表数据
已添加8个文件
已修改7个文件
856 ■■■■■ 文件已修改
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsStockApiImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsTransactionApiImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsPurchaseInboundReqDTO.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsSalesOutboundReqDTO.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsStockDetailRespDTO.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsStockQueryReqDTO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsTransactionCreateReqDTO.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/stock/WmsStockApi.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/transaction/WmsTransactionApi.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-server/src/main/resources/application-test.yaml 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
@@ -118,11 +118,11 @@
        // æ‹¼æŽ¥äº§å“é¡¹
        List<CrmBusinessProductDO> businessProducts = businessService.getBusinessProductListByBusinessId(businessVO.getId());
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(businessProducts, CrmBusinessProductDO::getProductId));
                convertSet(businessProducts, CrmBusinessProductDO::getItemId));
        businessVO.setProducts(BeanUtils.toBean(businessProducts, CrmBusinessRespVO.Product.class, businessProductVO ->
                MapUtils.findAndThen(itemMap, businessProductVO.getProductId(),
                        item -> businessProductVO.setProductName(item.getName())
                                .setProductNo(item.getCode()).setProductUnit(item.getUnitMeasureId() != null ? item.getUnitMeasureId().intValue() : null))));
                MapUtils.findAndThen(itemMap, businessProductVO.getItemId(),
                        item -> businessProductVO.setItemName(item.getName())
                                .setItemCode(item.getCode()).setItemUnitId(item.getUnitMeasureId()))));
        return businessVO;
    }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java
@@ -124,22 +124,22 @@
        @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "888")
        private Long id;
        @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        private Long productId;
        @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
        private String productName;
        @Schema(description = "产品条码", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        private String productNo;
        @Schema(description = "产品单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
        private Integer productUnit;
        @Schema(description = "MDM ç‰©æ–™ç¼–号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        private Long itemId;
        @Schema(description = "物料名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
        private String itemName;
        @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        private String itemCode;
        @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
        private Long itemUnitId;
        @Schema(description = "产品单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        private BigDecimal productPrice;
        @Schema(description = "物料原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        private BigDecimal itemPrice;
        @Schema(description = "商机价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        private BigDecimal businessPrice;
        @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911")
        @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911")
        private BigDecimal count;
        @Schema(description = "总计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java
@@ -74,21 +74,25 @@
    @AllArgsConstructor
    public static class BusinessProduct {
        @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        @NotNull(message = "产品编号不能为空")
        private Long productId;
        @Schema(description = "MDM ç‰©æ–™ç¼–号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
        @NotNull(message = "物料编号不能为空")
        private Long itemId;
        @Schema(description = "产品单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        @NotNull(message = "产品单价不能为空")
        private BigDecimal productPrice;
        @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
        @NotNull(message = "计量单位不能为空")
        private Long itemUnitId;
        @Schema(description = "物料原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        @NotNull(message = "物料原价不能为空")
        private BigDecimal itemPrice;
        @Schema(description = "商机价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00")
        @NotNull(message = "商机价格不能为空")
        private BigDecimal businessPrice;
        @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911")
        @NotNull(message = "产品数量不能为空")
        private Integer count;
        @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911")
        @NotNull(message = "数量不能为空")
        private BigDecimal count;
    }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.crm.dal.dataobject.business;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -38,17 +37,21 @@
     */
    private Long businessId;
    /**
     * äº§å“ç¼–号
     * MDM ç‰©æ–™ç¼–号
     *
     * å…³è” {@link CrmProductDO#getId()}
     * å…³è” MdmItemRespDTO.id
     */
    private Long productId;
    private Long itemId;
    /**
     * äº§å“å•价,单位:元
     * è®¡é‡å•位编号
     *
     * å†—ä½™ {@link CrmProductDO#getPrice()}
     * å…³è” MdmUnitMeasureRespDTO.id
     */
    private BigDecimal productPrice;
    private Long itemUnitId;
    /**
     * ç‰©æ–™åŽŸä»·ï¼Œå•ä½ï¼šå…ƒï¼ˆå†—ä½™ï¼‰
     */
    private BigDecimal itemPrice;
    /**
     * å•†æœºä»·æ ¼, å•位:元
     */
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -217,7 +217,7 @@
    private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.BusinessProduct> list) {
        // 1. æ ¡éªŒç‰©æ–™å­˜åœ¨
        Set<Long> itemIds = convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId);
        Set<Long> itemIds = convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getItemId);
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds);
        for (Long itemId : itemIds) {
            if (itemMap.get(itemId) == null) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsStockApiImpl.java
@@ -2,6 +2,11 @@
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsPurchaseInboundReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsSalesOutboundReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockDetailRespDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockQueryReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.stock.WmsStockApi;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
@@ -14,11 +19,6 @@
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
import cn.iocoder.yudao.module.wms.api.dto.WmsPurchaseInboundReqDTO;
import cn.iocoder.yudao.module.wms.api.dto.WmsSalesOutboundReqDTO;
import cn.iocoder.yudao.module.wms.api.dto.WmsStockDetailRespDTO;
import cn.iocoder.yudao.module.wms.api.dto.WmsStockQueryReqDTO;
import cn.iocoder.yudao.module.wms.api.stock.WmsStockApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsTransactionApiImpl.java
@@ -2,10 +2,10 @@
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsTransactionCreateReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.transaction.WmsTransactionApi;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.wms.api.transaction.WmsTransactionApi;
import cn.iocoder.yudao.module.wms.api.transaction.WmsTransactionCreateReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsPurchaseInboundReqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package cn.iocoder.yudao.module.mes.api.wms.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * WMS é‡‡è´­å…¥åº“请求 DTO
 */
@Data
public class WmsPurchaseInboundReqDTO {
    /**
     * ä¸šåŠ¡å•æ®ID
     */
    private Long bizId;
    /**
     * ä¸šåŠ¡å•æ®ç¼–ç 
     */
    private String bizCode;
    /**
     * ä¾›åº”商ID
     */
    private Long vendorId;
    /**
     * å…¥åº“æ—¶é—´
     */
    private LocalDateTime receiptTime;
    /**
     * ç‰©æ–™æ˜Žç»†åˆ—表
     */
    private List<Item> items;
    @Data
    public static class Item {
        /**
         * ä¸šåŠ¡è¡ŒID
         */
        private Long bizLineId;
        /**
         * ç‰©æ–™ID
         */
        private Long itemId;
        /**
         * ä»“库ID
         */
        private Long warehouseId;
        /**
         * åº“位ID
         */
        private Long locationId;
        /**
         * åŒºåŸŸID
         */
        private Long areaId;
        /**
         * æ‰¹æ¬¡ID
         */
        private Long batchId;
        /**
         * æ‰¹æ¬¡ç¼–码
         */
        private String batchCode;
        /**
         * æ•°é‡
         */
        private BigDecimal quantity;
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsSalesOutboundReqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package cn.iocoder.yudao.module.mes.api.wms.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * WMS é”€å”®å‡ºåº“请求 DTO
 */
@Data
public class WmsSalesOutboundReqDTO {
    /**
     * ä¸šåŠ¡å•æ®ID
     */
    private Long bizId;
    /**
     * ä¸šåŠ¡å•æ®ç¼–ç 
     */
    private String bizCode;
    /**
     * å‡ºåº“æ—¶é—´
     */
    private LocalDateTime outboundTime;
    /**
     * ç‰©æ–™æ˜Žç»†åˆ—表
     */
    private List<Item> items;
    @Data
    public static class Item {
        /**
         * ä¸šåŠ¡è¡ŒID
         */
        private Long bizLineId;
        /**
         * ç‰©æ–™ID
         */
        private Long itemId;
        /**
         * ä»“库ID
         */
        private Long warehouseId;
        /**
         * åº“位ID
         */
        private Long locationId;
        /**
         * åŒºåŸŸID
         */
        private Long areaId;
        /**
         * æ‰¹æ¬¡ID
         */
        private Long batchId;
        /**
         * æ‰¹æ¬¡ç¼–码
         */
        private String batchCode;
        /**
         * æ•°é‡
         */
        private BigDecimal quantity;
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsStockDetailRespDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package cn.iocoder.yudao.module.mes.api.wms.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * WMS åº“存明细响应 DTO
 */
@Data
public class WmsStockDetailRespDTO {
    /**
     * ä¸»é”®
     */
    private Long id;
    /**
     * ç‰©æ–™ID
     */
    private Long itemId;
    /**
     * ç‰©æ–™ç¼–码
     */
    private String itemCode;
    /**
     * ç‰©æ–™åç§°
     */
    private String itemName;
    /**
     * ä»“库ID
     */
    private Long warehouseId;
    /**
     * ä»“库名称
     */
    private String warehouseName;
    /**
     * åº“位ID
     */
    private Long locationId;
    /**
     * åŒºåŸŸID
     */
    private Long areaId;
    /**
     * æ‰¹æ¬¡ID
     */
    private Long batchId;
    /**
     * æ‰¹æ¬¡ç¼–码
     */
    private String batchCode;
    /**
     * ä¾›åº”商ID
     */
    private Long vendorId;
    /**
     * æ•°é‡
     */
    private BigDecimal quantity;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createTime;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsStockQueryReqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.mes.api.wms.dto;
import lombok.Data;
/**
 * WMS åº“存查询请求 DTO
 */
@Data
public class WmsStockQueryReqDTO {
    /**
     * ç‰©æ–™ID
     */
    private Long itemId;
    /**
     * ä»“库ID
     */
    private Long warehouseId;
    /**
     * åº“位ID
     */
    private Long locationId;
    /**
     * åŒºåŸŸID
     */
    private Long areaId;
    /**
     * æ‰¹æ¬¡ID
     */
    private Long batchId;
    /**
     * ä¾›åº”商ID
     */
    private Long vendorId;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/dto/WmsTransactionCreateReqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package cn.iocoder.yudao.module.mes.api.wms.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * WMS åº“存事务创建请求 DTO
 */
@Data
public class WmsTransactionCreateReqDTO {
    /**
     * äº‹åŠ¡ç±»åž‹ï¼ˆIN/OUT)
     */
    private String type;
    /**
     * ä¸šåŠ¡ç±»åž‹
     */
    private String bizType;
    /**
     * ä¸šåŠ¡å•æ®ID
     */
    private Long bizId;
    /**
     * ä¸šåŠ¡å•æ®ç¼–ç 
     */
    private String bizCode;
    /**
     * ä¸šåŠ¡è¡ŒID
     */
    private Long bizLineId;
    /**
     * ç‰©æ–™ID
     */
    private Long itemId;
    /**
     * ä»“库ID
     */
    private Long warehouseId;
    /**
     * åº“位ID
     */
    private Long locationId;
    /**
     * åŒºåŸŸID
     */
    private Long areaId;
    /**
     * æ‰¹æ¬¡ID
     */
    private Long batchId;
    /**
     * æ‰¹æ¬¡ç¼–码
     */
    private String batchCode;
    /**
     * ä¾›åº”商ID
     */
    private Long vendorId;
    /**
     * æ•°é‡ï¼ˆæ­£æ•°å…¥åº“,负数出库)
     */
    private BigDecimal quantity;
    /**
     * å…¥åº“/出库时间
     */
    private java.time.LocalDateTime receiptTime;
    /**
     * æ˜¯å¦å·²å®¡æ ¸
     */
    private Boolean checkFlag;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/stock/WmsStockApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.mes.api.wms.stock;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsPurchaseInboundReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsSalesOutboundReqDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockDetailRespDTO;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockQueryReqDTO;
import java.math.BigDecimal;
import java.util.List;
/**
 * WMS åº“å­˜ API æŽ¥å£
 */
public interface WmsStockApi {
    /**
     * é‡‡è´­å…¥åº“
     *
     * @param reqDTO å…¥åº“请求
     * @return äº‹åŠ¡ID
     */
    Long purchaseInbound(WmsPurchaseInboundReqDTO reqDTO);
    /**
     * é‡‡è´­é€€è´§å‡ºåº“
     *
     * @param reqDTO å‡ºåº“请求
     * @return äº‹åŠ¡ID
     */
    Long purchaseReturnOutbound(WmsPurchaseInboundReqDTO reqDTO);
    /**
     * é”€å”®å‡ºåº“
     *
     * @param reqDTO å‡ºåº“请求
     * @return äº‹åŠ¡ID
     */
    Long salesOutbound(WmsSalesOutboundReqDTO reqDTO);
    /**
     * é”€å”®é€€è´§å…¥åº“
     *
     * @param reqDTO å…¥åº“请求
     * @return äº‹åŠ¡ID
     */
    Long salesReturnInbound(WmsSalesOutboundReqDTO reqDTO);
    /**
     * èŽ·å–åº“å­˜æ•°é‡
     *
     * @param itemId ç‰©æ–™ID
     * @param warehouseId ä»“库ID
     * @return åº“存数量
     */
    BigDecimal getStockQuantity(Long itemId, Long warehouseId);
    /**
     * èŽ·å–åº“å­˜æ˜Žç»†
     *
     * @param reqDTO æŸ¥è¯¢è¯·æ±‚
     * @return åº“存明细
     */
    WmsStockDetailRespDTO getStockDetail(WmsStockQueryReqDTO reqDTO);
    /**
     * èŽ·å–åº“å­˜æ˜Žç»†åˆ—è¡¨
     *
     * @param reqDTO æŸ¥è¯¢è¯·æ±‚
     * @return åº“存明细列表
     */
    List<WmsStockDetailRespDTO> getStockDetailList(WmsStockQueryReqDTO reqDTO);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/transaction/WmsTransactionApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.mes.api.wms.transaction;
import cn.iocoder.yudao.module.mes.api.wms.dto.WmsTransactionCreateReqDTO;
import java.util.List;
/**
 * WMS åº“存事务 API æŽ¥å£
 */
public interface WmsTransactionApi {
    /**
     * åˆ›å»ºåº“存事务
     *
     * @param reqDTO äº‹åŠ¡è¯·æ±‚
     * @return äº‹åŠ¡ID
     */
    Long createTransaction(WmsTransactionCreateReqDTO reqDTO);
    /**
     * æ‰¹é‡åˆ›å»ºåº“存事务
     *
     * @param reqDTOs äº‹åŠ¡è¯·æ±‚åˆ—è¡¨
     */
    void createTransactionBatch(List<WmsTransactionCreateReqDTO> reqDTOs);
}
yudao-server/src/main/resources/application-test.yaml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,298 @@
server:
  port: 48080
--- #################### æ•°æ®åº“相关配置 ####################
spring:
  autoconfigure:
    # noinspection SpringBootApplicationYaml
    exclude:
      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # é»˜è®¤ local çŽ¯å¢ƒï¼Œä¸å¼€å¯ Quartz çš„自动配置
      - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # ç¦ç”¨ AI æ¨¡å—çš„ Qdrant,手动创建
      - org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreAutoConfiguration # ç¦ç”¨ AI æ¨¡å—çš„ Redis,手动创建
      - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # ç¦ç”¨ AI æ¨¡å—çš„ Milvus,手动创建
      - org.dromara.trans.config.TransServiceConfig # TODO èŠ‹è‰¿ï¼šeasy-trans å…¼å®¹ Spring Boot 4 åŽç§»é™¤ï¼ˆTransServiceConfig å¼•用了已移除的 RestTemplateBuilder)
      # TODO èŠ‹è‰¿ï¼šspring-ai-alibaba 2.0.0-M1.1 çš„ DashScope è‡ªåŠ¨é…ç½®æš‚ä¸å…¼å®¹ Spring AI 2.0.0
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeChatAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAgentAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeImageAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeVideoAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAudioSpeechAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAudioTranscriptionAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeRerankAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeEmbeddingAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeMultimodalEmbeddingAutoConfiguration
      - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAsyncToolCallingManagerAutoConfiguration
  # æ•°æ®æºé…ç½®é¡¹
  datasource:
    druid: # Druid ã€ç›‘控】相关的全局配置
      web-stat-filter:
        enabled: true
      stat-view-servlet:
        enabled: true
        allow: # è®¾ç½®ç™½åå•,不填则允许所有访问
        url-pattern: /druid/*
        login-username: # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-password:
      filter:
        stat:
          enabled: true
          log-slow-sql: true # æ…¢ SQL è®°å½•
          slow-sql-millis: 100
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
    dynamic: # å¤šæ•°æ®æºé…ç½®
      druid: # Druid ã€è¿žæŽ¥æ± ã€‘相关的全局配置
        initial-size: 1 # åˆå§‹è¿žæŽ¥æ•°
        min-idle: 1 # æœ€å°è¿žæŽ¥æ± æ•°é‡
        max-active: 20 # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
        max-wait: 60000 # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´ï¼Œå•ä½ï¼šæ¯«ç§’ï¼ˆ1 åˆ†é’Ÿï¼‰
        time-between-eviction-runs-millis: 60000 # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 åˆ†é’Ÿï¼‰
        min-evictable-idle-time-millis: 600000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位:毫秒(10 åˆ†é’Ÿï¼‰
        max-evictable-idle-time-millis: 1800000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位:毫秒(30 åˆ†é’Ÿï¼‰
        validation-query: SELECT 1 FROM DUAL # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        pool-prepared-statements: true # æ˜¯å¦å¼€å¯ PreparedStatement ç¼“å­˜
        max-pool-prepared-statement-per-connection-size: 20 # æ¯ä¸ªè¿žæŽ¥ç¼“存的 PreparedStatement æ•°é‡
      primary: master
      datasource:
        master:
          url: jdbc:mysql://172.17.0.1:11101/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X è¿žæŽ¥çš„示例
          #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X è¿žæŽ¥çš„示例
          #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL è¿žæŽ¥çš„示例
          #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle è¿žæŽ¥çš„示例
          #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer è¿žæŽ¥çš„示例
          #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM è¿žæŽ¥çš„示例
          #          url: jdbc:kingbase8://127.0.0.1:54321/test  # äººå¤§é‡‘仓 KingbaseES è¿žæŽ¥çš„示例
          #          url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss è¿žæŽ¥çš„示例
          #          url: jdbc:postgresql://127.0.0.1:5866/ruoyi-vue-pro # ç€šé«˜ HighGo è¿žæŽ¥çš„示例
          username: root
          password: xd@123456..
          #          username: sa # SQL Server è¿žæŽ¥çš„示例
          #          password: Yudao@2024 # SQL Server è¿žæŽ¥çš„示例
          #          username: SYSDBA # DM è¿žæŽ¥çš„示例
          #          password: SYSDBA001 # DM è¿žæŽ¥çš„示例
          #          username: root # OpenGauss è¿žæŽ¥çš„示例
          #          password: Yudao@2024 # OpenGauss è¿žæŽ¥çš„示例
          #          username: root # ç€šé«˜ HighGo è¿žæŽ¥çš„示例
          #          password: 123456 # ç€šé«˜ HighGo è¿žæŽ¥çš„示例
        slave: # æ¨¡æ‹Ÿä»Žåº“,可根据自己需要修改
          lazy: true # å¼€å¯æ‡’加载,保证启动速度
          url: jdbc:mysql://172.17.0.1:11101/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
          username: root
          password: xd@123456
#        tdengine: # IoT æ•°æ®åº“(需要 IoT ç‰©è”网再开启噢!)
#          lazy: true # å¼€å¯æ‡’加载,保证启动速度
#          url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro?varcharAsString=true&enableAutoReconnect=true # å‚见:https://t.zsxq.com/qaX9c,开启 TDengine WebSocket è‡ªåŠ¨é‡è¿ž
#          driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
#          username: root
#          password: taosdata
#          druid:
#            validation-query: SELECT SERVER_STATUS() # TDengine æ•°æ®æºçš„æœ‰æ•ˆæ€§æ£€æŸ¥ SQL
  # Redis é…ç½®ã€‚Redisson é»˜è®¤çš„配置足够使用,一般不需要进行调优
  data:
    redis:
      host: 172.17.0.1 # åœ°å€
      port: 11102 # ç«¯å£
      database: 0 # æ•°æ®åº“索引
#      password: dev # å¯†ç ï¼Œå»ºè®®ç”Ÿäº§çŽ¯å¢ƒå¼€å¯
--- #################### å®šæ—¶ä»»åŠ¡ç›¸å…³é…ç½® ####################
# Quartz é…ç½®é¡¹ï¼Œå¯¹åº” QuartzProperties é…ç½®ç±»
spring:
  quartz:
    auto-startup: true # æœ¬åœ°å¼€å‘环境,尽量不要开启 Job
    scheduler-name: schedulerName # Scheduler åå­—。默认为 schedulerName
    job-store-type: jdbc # Job å­˜å‚¨å™¨ç±»åž‹ã€‚默认为 memory è¡¨ç¤ºå†…存,可选 jdbc ä½¿ç”¨æ•°æ®åº“。
    wait-for-jobs-to-complete-on-shutdown: true # åº”用关闭时,是否等待定时任务执行完成。默认为 false ï¼Œå»ºè®®è®¾ç½®ä¸º true
    properties: # æ·»åŠ  Quartz Scheduler é™„加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html æ–‡æ¡£
      org:
        quartz:
          # Scheduler ç›¸å…³é…ç½®
          scheduler:
            instanceName: schedulerName
            instanceId: AUTO # è‡ªåŠ¨ç”Ÿæˆ instance ID
          # JobStore ç›¸å…³é…ç½®
          jobStore:
            # JobStore å®žçŽ°ç±»ã€‚å¯è§åšå®¢ï¼šhttps://blog.csdn.net/weixin_42458219/article/details/122247162
            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
            isClustered: true # æ˜¯é›†ç¾¤æ¨¡å¼
            clusterCheckinInterval: 15000 # é›†ç¾¤æ£€æŸ¥é¢‘率,单位:毫秒。默认为 15000,即 15 ç§’
            misfireThreshold: 60000 # misfire é˜€å€¼ï¼Œå•位:毫秒。
          # çº¿ç¨‹æ± ç›¸å…³é…ç½®
          threadPool:
            threadCount: 25 # çº¿ç¨‹æ± å¤§å°ã€‚默认为 10 ã€‚
            threadPriority: 5 # çº¿ç¨‹ä¼˜å…ˆçº§
            class: org.quartz.simpl.SimpleThreadPool # çº¿ç¨‹æ± ç±»åž‹
    jdbc: # ä½¿ç”¨ JDBC çš„ JobStore çš„æ—¶å€™ï¼ŒJDBC çš„配置
      initialize-schema: NEVER # æ˜¯å¦è‡ªåŠ¨ä½¿ç”¨ SQL åˆå§‹åŒ– Quartz è¡¨ç»“构。这里设置成 never ï¼Œæˆ‘们手动创建表结构。
--- #################### æ¶ˆæ¯é˜Ÿåˆ—相关 ####################
# rocketmq é…ç½®é¡¹ï¼Œå¯¹åº” RocketMQProperties é…ç½®ç±»
rocketmq:
  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
spring:
  # RabbitMQ é…ç½®é¡¹ï¼Œå¯¹åº” RabbitProperties é…ç½®ç±»
  rabbitmq:
    host: 127.0.0.1 # RabbitMQ æœåŠ¡çš„åœ°å€
    port: 5672 # RabbitMQ æœåŠ¡çš„ç«¯å£
    username: rabbit # RabbitMQ æœåŠ¡çš„è´¦å·
    password: rabbit # RabbitMQ æœåŠ¡çš„å¯†ç 
  # Kafka é…ç½®é¡¹ï¼Œå¯¹åº” KafkaProperties é…ç½®ç±»
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # æŒ‡å®š Kafka Broker åœ°å€ï¼Œå¯ä»¥è®¾ç½®å¤šä¸ªï¼Œä»¥é€—号分隔
--- #################### æœåŠ¡ä¿éšœç›¸å…³é…ç½® ####################
# Lock4j é…ç½®é¡¹
lock4j:
  acquire-timeout: 3000 # èŽ·å–åˆ†å¸ƒå¼é”è¶…æ—¶æ—¶é—´ï¼Œé»˜è®¤ä¸º 3000 æ¯«ç§’
  expire: 30000 # åˆ†å¸ƒå¼é”çš„超时时间,默认为 30000 æ¯«ç§’
--- #################### ç›‘控相关配置 ####################
# Actuator ç›‘控端点的配置项
management:
  endpoints:
    web:
      base-path: /actuator # Actuator æä¾›çš„ API æŽ¥å£çš„æ ¹ç›®å½•。默认为 /actuator
      exposure:
        include: '*' # éœ€è¦å¼€æ”¾çš„端点。默认值只打开 health å’Œ info ä¸¤ä¸ªç«¯ç‚¹ã€‚通过设置 * ï¼Œå¯ä»¥å¼€æ”¾æ‰€æœ‰ç«¯ç‚¹ã€‚
# Spring Boot Admin é…ç½®é¡¹
spring:
  boot:
    admin:
      # Spring Boot Admin Client å®¢æˆ·ç«¯çš„相关配置
      client:
        url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # è®¾ç½® Spring Boot Admin Server åœ°å€
        instance:
          service-host-type: IP # æ³¨å†Œå®žä¾‹æ—¶ï¼Œä¼˜å…ˆä½¿ç”¨ IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
        username: admin
        password: admin
      # Spring Boot Admin Server æœåŠ¡ç«¯çš„ç›¸å…³é…ç½®
      context-path: /admin # é…ç½® Spring
      # å…è®¸åµŒå…¥ iframe çš„域名(支持通配符),实际部署时,可以改为 "'self' [你的公网域名]"
      frame-ancestors: "'self' localhost localhost:48080 127.0.0.1 127.0.0.1:48080"
# æ—¥å¿—文件配置
logging:
  file:
    name: ${user.home}/logs/${spring.application.name}.log # æ—¥å¿—文件名,全路径
  level:
    # é…ç½®è‡ªå·±å†™çš„ MyBatis Mapper æ‰“印日志
    cn.iocoder.yudao.module.bpm.dal.mysql: debug
    cn.iocoder.yudao.module.infra.dal.mysql: debug
    cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # é…ç½® ApiErrorLogMapper çš„æ—¥å¿—级别为 info,避免和 GlobalExceptionHandler é‡å¤æ‰“印
    cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper: INFO # é…ç½® JobLogMapper çš„æ—¥å¿—级别为 info
    cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # é…ç½® FileConfigMapper çš„æ—¥å¿—级别为 info
    cn.iocoder.yudao.module.pay.dal.mysql: debug
    cn.iocoder.yudao.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # é…ç½® PayNotifyTaskMapper çš„æ—¥å¿—级别为 info
    cn.iocoder.yudao.module.system.dal.mysql: debug
    cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # é…ç½® SmsChannelMapper çš„æ—¥å¿—级别为 info
    cn.iocoder.yudao.module.tool.dal.mysql: debug
    cn.iocoder.yudao.module.member.dal.mysql: debug
    cn.iocoder.yudao.module.trade.dal.mysql: debug
    cn.iocoder.yudao.module.promotion.dal.mysql: debug
    cn.iocoder.yudao.module.statistics.dal.mysql: debug
    cn.iocoder.yudao.module.crm.dal.mysql: debug
    cn.iocoder.yudao.module.erp.dal.mysql: debug
    cn.iocoder.yudao.module.mes.dal.mysql: debug
    cn.iocoder.yudao.module.wms.dal.mysql: debug
    cn.iocoder.yudao.module.iot.dal.mysql: debug
    cn.iocoder.yudao.module.iot.dal.tdengine: DEBUG
    cn.iocoder.yudao.module.iot.service.rule: debug
    cn.iocoder.yudao.module.ai.dal.mysql: debug
    cn.iocoder.yudao.module.im.dal.mysql: debug
    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO èŠ‹è‰¿ï¼šå…ˆç¦ç”¨ï¼ŒSpring Boot 3.X å­˜åœ¨éƒ¨åˆ†é”™è¯¯çš„ WARN æç¤º
debug: false
--- #################### å¾®ä¿¡å…¬ä¼—号、小程序相关配置 ####################
wx:
  mp: # å…¬ä¼—号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md æ–‡æ¡£
#    app-id: wx041349c6f39b268b # æµ‹è¯•号(牛希尧提供的)
#    secret: 5abee519483bc9f8cb37ce280e814bd0
#    app-id: wx5b23ba7a5589ecbb # æµ‹è¯•号(自己的)
#    secret: 2a7b3b20c537e52e74afd395eb85f61f
    app-id: wxf56b1542b9e85f8a # æµ‹è¯•号(Kongdy æä¾›çš„)
    secret: 496379dcef1ba869e9234de8d598cfd3
    # å­˜å‚¨é…ç½®ï¼Œè§£å†³ AccessToken çš„跨节点的共享
    config-storage:
      type: RedisTemplate # é‡‡ç”¨ RedisTemplate æ“ä½œ Redis,会自动从 Spring ä¸­èŽ·å–
      key-prefix: wx # Redis Key çš„前缀
      http-client-type: HttpComponents # é‡‡ç”¨ HttpComponents(HttpClient 5)请求微信公众号平台
  miniapp: # å°ç¨‹åºé…ç½®ï¼ˆå¿…填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md æ–‡æ¡£
    #    appid: wx62056c0d5e8db250 # æµ‹è¯•号(牛希尧提供的)
    #    secret: 333ae72f41552af1e998fe1f54e1584a
#    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
#    secret: 6f270509224a7ae1296bbf1c8cb97aed
    appid: wxc4598c446f8a9cb3 # æµ‹è¯•号(Kongdy æä¾›çš„)
    secret: 4a1a04e07f6a4a0751b39c3064a92c8b
#    appid: wx66186af0759f47c9 # æµ‹è¯•号(puhui æä¾›çš„)
#    secret: 3218bcbd112cbc614c7264ceb20144ac
    config-storage:
      type: RedisTemplate # é‡‡ç”¨ RedisTemplate æ“ä½œ Redis,会自动从 Spring ä¸­èŽ·å–
      key-prefix: wa # Redis Key çš„前缀
      http-client-type: HttpComponents # é‡‡ç”¨ HttpComponents(HttpClient 5)请求微信小程序平台
--- #################### èŠ‹é“ç›¸å…³é…ç½® ####################
# èŠ‹é“é…ç½®é¡¹ï¼Œè®¾ç½®å½“å‰é¡¹ç›®æ‰€æœ‰è‡ªå®šä¹‰çš„é…ç½®
yudao:
  captcha:
    enable: false # æœ¬åœ°çŽ¯å¢ƒï¼Œæš‚æ—¶å…³é—­å›¾ç‰‡éªŒè¯ç ï¼Œæ–¹ä¾¿ç™»å½•ç­‰æŽ¥å£çš„æµ‹è¯•ï¼›
  security:
    mock-enable: true
  pay:
    order-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/order # æ”¯ä»˜æ¸ é“的【支付】回调地址
    refund-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/refund # æ”¯ä»˜æ¸ é“的【退款】回调地址
    transfer-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/transfer # æ”¯ä»˜æ¸ é“的【转账】回调地址
  access-log: # è®¿é—®æ—¥å¿—的配置项
    enable: false
  demo: false # å…³é—­æ¼”示模式
  wxa-code:
    env-version: develop # å°ç¨‹åºç‰ˆæœ¬: æ­£å¼ç‰ˆä¸º "release";体验版为 "trial";开发版为 "develop"
  wxa-subscribe-message:
    miniprogram-state: developer # è·³è½¬å°ç¨‹åºç±»åž‹ï¼šå¼€å‘版为 â€œdeveloper”;体验版为 â€œtrial”为;正式版为 â€œformal”
  tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ åœ°å›¾çš„密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
justauth:
  enabled: true
  type:
    DINGTALK: # é’‰é’‰
      client-id: dingvrnreaje3yqvzhxg
      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
      ignore-check-redirect-uri: true
    WECHAT_ENTERPRISE: # ä¼ä¸šå¾®ä¿¡
      client-id: wwd411c69a39ad2e54
      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
      agent-id: 1000004
      ignore-check-redirect-uri: true
    # noinspection SpringBootApplicationYaml
    WECHAT_MINI_PROGRAM: # å¾®ä¿¡å°ç¨‹åº
      client-id: ${wx.miniapp.appid}
      client-secret: ${wx.miniapp.secret}
      ignore-check-redirect-uri: true
      ignore-check-state: true # å¾®ä¿¡å°ç¨‹åºï¼Œä¸ä¼šä½¿ç”¨åˆ° state,所以不进行校验
    WECHAT_MP: # å¾®ä¿¡å…¬ä¼—号
      client-id: ${wx.mp.app-id}
      client-secret: ${wx.mp.secret}
      ignore-check-redirect-uri: true
    ALIPAY: # æ”¯ä»˜å®å°ç¨‹åº
      client-id: xx
      client-secret: xx
      alipay-public-key: xx
      ignore-check-redirect-uri: true
      ignore-check-state: true
  cache:
    type: REDIS
    prefix: 'social_auth_state:' # ç¼“存前缀,目前只对 Redis ç¼“存生效,默认 JUSTAUTH::STATE::
    timeout: 24h # è¶…时时长,目前只对 Redis ç¼“存生效,默认 3 åˆ†é’Ÿ