gaoluyang
4 小时以前 7c03ac9182b338a13dce52631b2924da7793dd5e
feat(mes): 仓储物流单据跨模块关联字段支持手工填写

北方科技不使用生产/采购/销售模块,仓储物流各单据的跨模块关联字段改为可手工输入,
不填写关联 ID 时只保存文本,不再强制校验关联档案是否存在。

- 到货通知/采购退货:采购订单号、供应商名称
- 发货通知/产品发货/销售退货:销售订单号、客户名称、发货通知单号
- 装箱单:销售订单编号、客户名称、装箱行生产订单号
- 产品入库:生产订单号
- 生产退料:生产订单号、工作站名称
- 委外发料/委外入库:外协订单号、供应商名称
- 对应 DO/SaveReqVO/PageReqVO/Mapper 增加文本列与模糊搜索,关联校验改为 ID 非空才执行
- 客户权限过滤允许 client_id 为空的单据可见
- 委外入库按工单号搜索找不到工单时回退为文本模糊匹配

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改49个文件
318 ■■■■■ 文件已修改
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/vo/MesWmOutsourceReceiptPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/vo/MesWmOutsourceReceiptSaveReqVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/MesWmProductReceiptPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/MesWmProductReceiptSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesSaveReqVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/MesWmReturnIssuePageReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/MesWmReturnIssueSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productreceipt/MesWmProductReceiptMapper.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java
@@ -26,9 +26,15 @@
    @Schema(description = "采购订单编号", example = "1")
    private Long purchaseOrderId;
    @Schema(description = "采购订单编码", example = "PO20260101")
    private String purchaseOrderCode;
    @Schema(description = "供应商编号", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称", example = "某某供应商")
    private String vendorName;
    @Schema(description = "到货日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] arrivalDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java
@@ -28,10 +28,12 @@
    @Schema(description = "采购订单编码", example = "PO20260101")
    private String purchaseOrderCode;
    @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "供应商编号不能为空")
    @Schema(description = "供应商编号", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称(手工填写)", example = "某某供应商")
    private String vendorName;
    @Schema(description = "到货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "到货日期不能为空")
    private LocalDateTime arrivalDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java
@@ -26,9 +26,15 @@
    @Schema(description = "供应商ID", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称", example = "某某供应商")
    private String vendorName;
    @Schema(description = "生产工单ID", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "发料日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] issueDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java
@@ -25,10 +25,15 @@
    @Schema(description = "供应商ID", example = "1")
    private Long vendorId;
    @Schema(description = "生产工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "生产工单ID不能为空")
    @Schema(description = "供应商名称(手工填写)", example = "某某供应商")
    private String vendorName;
    @Schema(description = "生产工单ID", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号(手工填写)", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "发料日期")
    private LocalDateTime issueDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/vo/MesWmOutsourceReceiptPageReqVO.java
@@ -26,6 +26,9 @@
    @Schema(description = "供应商编号", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称", example = "某某供应商")
    private String vendorName;
    @Schema(description = "入库日期")
    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    private LocalDateTime[] receiptDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/vo/MesWmOutsourceReceiptSaveReqVO.java
@@ -22,14 +22,18 @@
    @NotEmpty(message = "入库单名称不能为空")
    private String name;
    @Schema(description = "外协工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "外协工单不能为空")
    @Schema(description = "外协工单编号", example = "1")
    private Long workOrderId;
    @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "供应商不能为空")
    @Schema(description = "外协工单号(手工填写)", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "供应商编号", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称(手工填写)", example = "某某供应商")
    private String vendorName;
    @Schema(description = "入库日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "入库日期不能为空")
    private LocalDateTime receiptDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java
@@ -26,6 +26,9 @@
    @Schema(description = "客户 ID", example = "1")
    private Long clientId;
    @Schema(description = "客户名称", example = "某某客户")
    private String clientName;
    @Schema(description = "父箱 ID", example = "1024")
    private Long parentId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java
@@ -37,6 +37,9 @@
    @Schema(description = "客户 ID", example = "1")
    private Long clientId;
    @Schema(description = "客户名称(手工填写)", example = "某某客户")
    private String clientName;
    @Schema(description = "箱长度", example = "60.00")
    private BigDecimal length;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java
@@ -36,10 +36,12 @@
    @DecimalMin(value = "0.01", message = "装箱数量必须大于 0")
    private BigDecimal quantity;
    @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "生产工单不能为空")
    @Schema(description = "生产工单 ID", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号(手工填写)", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "有效期")
    private LocalDateTime expireDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/MesWmProductReceiptPageReqVO.java
@@ -21,6 +21,9 @@
    @Schema(description = "生产工单编号", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "产品物料编号", example = "1")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/MesWmProductReceiptSaveReqVO.java
@@ -25,6 +25,9 @@
    @Schema(description = "生产工单编号", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号(手工填写)", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "收货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "收货日期不能为空")
    private LocalDateTime receiptDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesPageReqVO.java
@@ -26,6 +26,9 @@
    @Schema(description = "客户编号", example = "1")
    private Long clientId;
    @Schema(description = "客户名称", example = "某某客户")
    private String clientName;
    @Schema(description = "状态", example = "0")
    private Integer status;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/MesWmProductSalesSaveReqVO.java
@@ -22,9 +22,11 @@
    @NotEmpty(message = "出库单名称不能为空")
    private String name;
    @Schema(description = "客户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "客户不能为空")
    @Schema(description = "客户ID", example = "1")
    private Long clientId;
    @Schema(description = "客户名称(手工填写)", example = "某某客户")
    private String clientName;
    @Schema(description = "销售订单号", example = "SO2026030001")
    private String salesOrderCode;
@@ -36,6 +38,9 @@
    @Schema(description = "发货通知单ID", example = "1")
    private Long noticeId;
    @Schema(description = "发货通知单号(手工填写)", example = "SN2026030001")
    private String noticeCode;
    @Schema(description = "收货人", example = "张三")
    private String contactName;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/MesWmReturnIssuePageReqVO.java
@@ -19,9 +19,15 @@
    @Schema(description = "工作站 ID", example = "1")
    private Long workstationId;
    @Schema(description = "工作站名称", example = "包装工位")
    private String workstationName;
    @Schema(description = "生产工单 ID", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "生产任务 ID", example = "1")
    private Long taskId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/MesWmReturnIssueSaveReqVO.java
@@ -28,9 +28,15 @@
    @Schema(description = "生产工单 ID", example = "1")
    private Long workOrderId;
    @Schema(description = "生产工单号(手工填写)", example = "WO202603010001")
    private String workOrderCode;
    @Schema(description = "工作站 ID", example = "1")
    private Long workstationId;
    @Schema(description = "工作站名称(手工填写)", example = "包装工位")
    private String workstationName;
    @Schema(description = "退料类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "退料类型不能为空")
    private Integer type;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java
@@ -35,6 +35,9 @@
    @Schema(description = "客户 ID", example = "1")
    private Long clientId;
    @Schema(description = "客户名称", example = "某某客户")
    private String clientName;
    @Schema(description = "状态", example = "0")
    private Integer status;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java
@@ -33,10 +33,12 @@
    @Schema(description = "销售订单编号", example = "SO202603010001")
    private String salesOrderCode;
    @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "客户 ID 不能为空")
    @Schema(description = "客户 ID", example = "1")
    private Long clientId;
    @Schema(description = "客户名称(手工填写)", example = "某某客户")
    private String clientName;
    @Schema(description = "退货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "退货日期不能为空")
    private LocalDate returnDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorPageReqVO.java
@@ -22,4 +22,7 @@
    @Schema(description = "供应商 ID", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称")
    private String vendorName;
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java
@@ -28,10 +28,12 @@
    @Schema(description = "采购订单编号", example = "PO20250226001")
    private String purchaseOrderCode;
    @Schema(description = "供应商 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "供应商 ID 不能为空")
    @Schema(description = "供应商 ID", example = "1")
    private Long vendorId;
    @Schema(description = "供应商名称(手工填写)", example = "某某供应商")
    private String vendorName;
    @Schema(description = "退货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "退货日期不能为空")
    private LocalDateTime returnDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java
@@ -24,6 +24,9 @@
    @Schema(description = "客户编号", example = "1")
    private Long clientId;
    @Schema(description = "客户名称", example = "某某客户")
    private String clientName;
    @Schema(description = "状态", example = "3")
    private Integer status;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java
@@ -22,10 +22,12 @@
    @NotEmpty(message = "通知单名称不能为空")
    private String name;
    @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "客户编号不能为空")
    @Schema(description = "客户编号", example = "1")
    private Long clientId;
    @Schema(description = "客户名称(手工填写)", example = "某某客户")
    private String clientName;
    @Schema(description = "销售订单ID", example = "1")
    private Long saleOrderId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java
@@ -53,6 +53,12 @@
     */
    private Long vendorId;
    /**
     * 供应商名称
     *
     * 手工填写时使用,不关联供应商档案
     */
    private String vendorName;
    /**
     * 到货日期
     */
    private LocalDateTime arrivalDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java
@@ -46,12 +46,24 @@
     */
    private Long vendorId;
    /**
     * 供应商名称
     *
     * 手工填写时使用,不关联供应商档案
     */
    private String vendorName;
    /**
     * 生产工单ID
     *
     * 关联 {@link MesProWorkOrderDO#getId()}
     */
    private Long workOrderId;
    /**
     * 生产工单号
     *
     * 手工填写时使用,不关联生产工单
     */
    private String workOrderCode;
    /**
     * 发料日期
     */
    private LocalDateTime issueDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java
@@ -43,12 +43,24 @@
     */
    private Long workOrderId;
    /**
     * 外协工单编号
     *
     * 手工填写时使用,不关联生产工单
     */
    private String workOrderCode;
    /**
     * 供应商编号
     *
     * 关联 ERP 供应商 {@link cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO#getId()}
     */
    private Long vendorId;
    /**
     * 供应商名称
     *
     * 手工填写时使用,不关联供应商档案
     */
    private String vendorName;
    /**
     * 入库日期
     */
    private LocalDateTime receiptDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java
@@ -57,6 +57,12 @@
     */
    private Long clientId;
    /**
     * 客户名称
     *
     * 手工填写时使用,不关联 CRM 客户档案
     */
    private String clientName;
    /**
     * 箱长度
     */
    private BigDecimal length;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java
@@ -56,6 +56,12 @@
     */
    private Long workOrderId;
    /**
     * 生产工单号
     *
     * 手工填写时使用,不关联生产工单
     */
    private String workOrderCode;
    /**
     * 有效期
     */
    private LocalDateTime expireDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java
@@ -45,6 +45,12 @@
     */
    private Long workOrderId;
    /**
     * 生产工单号
     *
     * 手工填写时使用,不关联生产工单
     */
    private String workOrderCode;
    /**
     * 产品物料编号
     *
     * 关联 {@link MesMdItemDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java
@@ -46,6 +46,12 @@
     */
    private Long clientId;
    /**
     * 客户名称
     *
     * 手工填写时使用,不关联 CRM 客户档案
     */
    private String clientName;
    /**
     * 销售订单ID
     */
    private Long saleOrderId;
@@ -60,6 +66,12 @@
     */
    private Long noticeId;
    /**
     * 发货通知单号
     *
     * 手工填写时使用,不关联发货通知单
     */
    private String noticeCode;
    /**
     * 出库日期
     */
    private LocalDateTime salesDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java
@@ -46,6 +46,12 @@
     */
    private Long workOrderId;
    /**
     * 生产工单号
     *
     * 手工填写时使用,不关联生产工单
     */
    private String workOrderCode;
    /**
     * 生产任务 ID
     *
     * 关联 {@link MesProTaskDO#getId()}
@@ -58,6 +64,12 @@
     */
    private Long workstationId;
    /**
     * 工作站名称
     *
     * 手工填写时使用,不关联工作站档案
     */
    private String workstationName;
    /**
     * 退料类型
     *
     * 字典 {@link DictTypeConstants#MES_WM_RETURN_ISSUE_TYPE}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java
@@ -53,6 +53,12 @@
     */
    private Long clientId;
    /**
     * 客户名称
     *
     * 手工填写时使用,不关联 CRM 客户档案
     */
    private String clientName;
    /**
     * 退货日期
     */
    private LocalDate returnDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java
@@ -53,6 +53,12 @@
     */
    private Long vendorId;
    /**
     * 供应商名称
     *
     * 手工填写时使用,不关联 SRM 供应商档案
     */
    private String vendorName;
    /**
     * 退货日期
     */
    private LocalDateTime returnDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java
@@ -42,6 +42,12 @@
     */
    private Long clientId;
    /**
     * 客户名称
     *
     * 手工填写时使用,不关联 CRM 客户档案
     */
    private String clientName;
    /**
     * 销售订单ID
     */
    private Long saleOrderId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java
@@ -18,7 +18,9 @@
                .likeIfPresent(MesWmArrivalNoticeDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmArrivalNoticeDO::getName, reqVO.getName())
                .eqIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderId, reqVO.getPurchaseOrderId())
                .likeIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode())
                .eqIfPresent(MesWmArrivalNoticeDO::getVendorId, reqVO.getVendorId())
                .likeIfPresent(MesWmArrivalNoticeDO::getVendorName, reqVO.getVendorName())
                .betweenIfPresent(MesWmArrivalNoticeDO::getArrivalDate, reqVO.getArrivalDate())
                .eqIfPresent(MesWmArrivalNoticeDO::getStatus, reqVO.getStatus())
                .orderByDesc(MesWmArrivalNoticeDO::getId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java
@@ -20,7 +20,9 @@
                .likeIfPresent(MesWmOutsourceIssueDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmOutsourceIssueDO::getName, reqVO.getName())
                .eqIfPresent(MesWmOutsourceIssueDO::getVendorId, reqVO.getVendorId())
                .likeIfPresent(MesWmOutsourceIssueDO::getVendorName, reqVO.getVendorName())
                .eqIfPresent(MesWmOutsourceIssueDO::getWorkOrderId, reqVO.getWorkOrderId())
                .likeIfPresent(MesWmOutsourceIssueDO::getWorkOrderCode, reqVO.getWorkOrderCode())
                .betweenIfPresent(MesWmOutsourceIssueDO::getIssueDate, reqVO.getIssueDate())
                .orderByDesc(MesWmOutsourceIssueDO::getId));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptMapper.java
@@ -18,8 +18,10 @@
                .likeIfPresent(MesWmOutsourceReceiptDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmOutsourceReceiptDO::getName, reqVO.getName())
                .eqIfPresent(MesWmOutsourceReceiptDO::getVendorId, reqVO.getVendorId())
                .likeIfPresent(MesWmOutsourceReceiptDO::getVendorName, reqVO.getVendorName())
                .eqIfPresent(MesWmOutsourceReceiptDO::getStatus, reqVO.getStatus())
                .inIfPresent(MesWmOutsourceReceiptDO::getWorkOrderId, workOrderIds)
                .likeIfPresent(MesWmOutsourceReceiptDO::getWorkOrderCode, reqVO.getWorkOrderCode())
                .betweenIfPresent(MesWmOutsourceReceiptDO::getReceiptDate, reqVO.getReceiptDate())
                .orderByDesc(MesWmOutsourceReceiptDO::getId));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java
@@ -25,6 +25,7 @@
                .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmPackageDO::getSalesOrderCode, reqVO.getSalesOrderCode())
                .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmPackageDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmPackageDO::getParentId, reqVO.getParentId())
                .eqIfPresent(MesWmPackageDO::getInspectorUserId, reqVO.getInspectorUserId())
                .eqIfPresent(MesWmPackageDO::getStatus, reqVO.getStatus())
@@ -39,15 +40,19 @@
                .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmPackageDO::getSalesOrderCode, reqVO.getSalesOrderCode())
                .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmPackageDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmPackageDO::getParentId, reqVO.getParentId())
                .eqIfPresent(MesWmPackageDO::getInspectorUserId, reqVO.getInspectorUserId())
                .eqIfPresent(MesWmPackageDO::getStatus, reqVO.getStatus())
                .orderByDesc(MesWmPackageDO::getId);
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
            }
            wrapper.in(MesWmPackageDO::getClientId, permittedClientIds);
            // 手工填写客户名称(未关联客户档案)的单据不属于任何客户权限范围,始终可见
            wrapper.and(w -> {
                w.isNull(MesWmPackageDO::getClientId);
                if (CollUtil.isNotEmpty(permittedClientIds)) {
                    w.or().in(MesWmPackageDO::getClientId, permittedClientIds);
                }
            });
        }
        return selectPage(reqVO, wrapper);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productreceipt/MesWmProductReceiptMapper.java
@@ -18,6 +18,7 @@
                .likeIfPresent(MesWmProductReceiptDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmProductReceiptDO::getName, reqVO.getName())
                .eqIfPresent(MesWmProductReceiptDO::getWorkOrderId, reqVO.getWorkOrderId())
                .likeIfPresent(MesWmProductReceiptDO::getWorkOrderCode, reqVO.getWorkOrderCode())
                .eqIfPresent(MesWmProductReceiptDO::getItemId, reqVO.getItemId())
                .orderByDesc(MesWmProductReceiptDO::getId));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java
@@ -23,6 +23,7 @@
                .likeIfPresent(MesWmProductSalesDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmProductSalesDO::getName, reqVO.getName())
                .eqIfPresent(MesWmProductSalesDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmProductSalesDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmProductSalesDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesWmProductSalesDO::getSalesDate, reqVO.getShipmentDate())
                .orderByDesc(MesWmProductSalesDO::getId));
@@ -36,14 +37,18 @@
                .likeIfPresent(MesWmProductSalesDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmProductSalesDO::getName, reqVO.getName())
                .eqIfPresent(MesWmProductSalesDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmProductSalesDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmProductSalesDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesWmProductSalesDO::getSalesDate, reqVO.getShipmentDate())
                .orderByDesc(MesWmProductSalesDO::getId);
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
            }
            wrapper.in(MesWmProductSalesDO::getClientId, permittedClientIds);
            // 手工填写客户名称(未关联客户档案)的单据不属于任何客户权限范围,始终可见
            wrapper.and(w -> {
                w.isNull(MesWmProductSalesDO::getClientId);
                if (CollUtil.isNotEmpty(permittedClientIds)) {
                    w.or().in(MesWmProductSalesDO::getClientId, permittedClientIds);
                }
            });
        }
        return selectPage(reqVO, wrapper);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueMapper.java
@@ -18,7 +18,9 @@
                .likeIfPresent(MesWmReturnIssueDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmReturnIssueDO::getName, reqVO.getName())
                .eqIfPresent(MesWmReturnIssueDO::getWorkstationId, reqVO.getWorkstationId())
                .likeIfPresent(MesWmReturnIssueDO::getWorkstationName, reqVO.getWorkstationName())
                .eqIfPresent(MesWmReturnIssueDO::getWorkOrderId, reqVO.getWorkOrderId())
                .likeIfPresent(MesWmReturnIssueDO::getWorkOrderCode, reqVO.getWorkOrderCode())
                .eqIfPresent(MesWmReturnIssueDO::getTaskId, reqVO.getTaskId())
                .eqIfPresent(MesWmReturnIssueDO::getType, reqVO.getType())
                .orderByDesc(MesWmReturnIssueDO::getId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java
@@ -24,6 +24,7 @@
                .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName())
                .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode())
                .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmReturnSalesDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate())
                .orderByDesc(MesWmReturnSalesDO::getId));
@@ -38,14 +39,18 @@
                .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName())
                .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode())
                .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmReturnSalesDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate())
                .orderByDesc(MesWmReturnSalesDO::getId);
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
            }
            wrapper.in(MesWmReturnSalesDO::getClientId, permittedClientIds);
            // 手工填写客户名称(未关联客户档案)的单据不属于任何客户权限范围,始终可见
            wrapper.and(w -> {
                w.isNull(MesWmReturnSalesDO::getClientId);
                if (CollUtil.isNotEmpty(permittedClientIds)) {
                    w.or().in(MesWmReturnSalesDO::getClientId, permittedClientIds);
                }
            });
        }
        return selectPage(reqVO, wrapper);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java
@@ -19,6 +19,7 @@
                .likeIfPresent(MesWmReturnVendorDO::getName, reqVO.getName())
                .likeIfPresent(MesWmReturnVendorDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode())
                .eqIfPresent(MesWmReturnVendorDO::getVendorId, reqVO.getVendorId())
                .likeIfPresent(MesWmReturnVendorDO::getVendorName, reqVO.getVendorName())
                .orderByDesc(MesWmReturnVendorDO::getId));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java
@@ -23,6 +23,7 @@
                .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName())
                .likeIfPresent(MesWmSalesNoticeDO::getSaleOrderCode, reqVO.getSaleOrderCode())
                .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmSalesNoticeDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus())
                .orderByDesc(MesWmSalesNoticeDO::getId));
    }
@@ -40,15 +41,17 @@
                .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName())
                .likeIfPresent(MesWmSalesNoticeDO::getSaleOrderCode, reqVO.getSaleOrderCode())
                .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId())
                .likeIfPresent(MesWmSalesNoticeDO::getClientName, reqVO.getClientName())
                .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus())
                .orderByDesc(MesWmSalesNoticeDO::getId);
        // 客户权限过滤
        // 客户权限过滤;手工填写客户名称(未关联客户档案)的单据不属于任何客户权限范围,始终可见
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                // 空列表表示没有任何权限,返回空结果
                return PageResult.empty();
            }
            wrapper.in(MesWmSalesNoticeDO::getClientId, permittedClientIds);
            wrapper.and(w -> {
                w.isNull(MesWmSalesNoticeDO::getClientId);
                if (CollUtil.isNotEmpty(permittedClientIds)) {
                    w.or().in(MesWmSalesNoticeDO::getClientId, permittedClientIds);
                }
            });
        }
        return selectPage(reqVO, wrapper);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -87,8 +87,10 @@
    private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) {
        // 校验编码唯一
        validateCodeUnique(reqVO.getId(), reqVO.getCode());
        // 校验供应商存在(ERP 采购供应商)
        srmSupplierApi.getSupplier(reqVO.getVendorId());
        // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验)
        if (reqVO.getVendorId() != null) {
            srmSupplierApi.getSupplier(reqVO.getVendorId());
        }
        // 校验采购订单存在
        if (reqVO.getPurchaseOrderId() != null) {
            ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java
@@ -261,10 +261,12 @@
        if (saveReqVO.getVendorId() != null) {
            srmSupplierApi.getSupplier(saveReqVO.getVendorId());
        }
        // 校验工单存在且类型为外协(代工)
        MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(saveReqVO.getWorkOrderId());
        if (ObjUtil.notEqual(workOrder.getType(), MesProWorkOrderTypeEnum.OUTSOURCE.getType())) {
            throw exception(WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID);
        // 校验工单存在且类型为外协(代工);仅关联生产工单时校验,手工填写工单号不校验
        if (saveReqVO.getWorkOrderId() != null) {
            MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(saveReqVO.getWorkOrderId());
            if (ObjUtil.notEqual(workOrder.getType(), MesProWorkOrderTypeEnum.OUTSOURCE.getType())) {
                throw exception(WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID);
            }
        }
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java
@@ -108,11 +108,11 @@
    public PageResult<MesWmOutsourceReceiptDO> getOutsourceReceiptPage(MesWmOutsourceReceiptPageReqVO pageReqVO) {
        List<Long> workOrderIds = null;
        if (StrUtil.isNotBlank(pageReqVO.getWorkOrderCode())) {
            // 工单号既可能是关联工单,也可能是手工填写文本:找到工单按 ID 过滤,找不到则按文本模糊匹配
            MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(pageReqVO.getWorkOrderCode());
            if (workOrder == null) {
                return PageResult.empty();
            if (workOrder != null) {
                workOrderIds = java.util.Collections.singletonList(workOrder.getId());
            }
            workOrderIds = java.util.Collections.singletonList(workOrder.getId());
        }
        return outsourceReceiptMapper.selectPage(pageReqVO, workOrderIds);
    }
@@ -308,8 +308,10 @@
    private void validateOutsourceReceiptSaveData(Long id, MesWmOutsourceReceiptSaveReqVO reqVO) {
        // 校验编码唯一
        validateCodeUnique(id, reqVO.getCode());
        // 校验供应商存在
        srmSupplierApi.getSupplier(reqVO.getVendorId());
        // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验)
        if (reqVO.getVendorId() != null) {
            srmSupplierApi.getSupplier(reqVO.getVendorId());
        }
        // 校验外协工单存在
        if (reqVO.getWorkOrderId() != null) {
            workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
@@ -102,8 +102,10 @@
        packageService.validatePackageStatusDraft(reqVO.getPackageId());
        // 校验产品物料存在
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
        // 校验工单已确认
        workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
        // 校验工单已确认(仅关联生产工单时;手工填写工单号不校验)
        if (reqVO.getWorkOrderId() != null) {
            workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
        }
    }
    private MesWmPackageLineDO validatePackageLineExists(Long id) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
@@ -392,15 +392,17 @@
    private void validateProductSalesSaveData(Long id, MesWmProductSalesSaveReqVO reqVO) {
        // 校验编码唯一
        validateCodeUnique(id, reqVO.getCode());
        // 校验客户存在
        customerApi.validateCustomer(reqVO.getClientId());
        // 校验客户存在(仅关联客户档案时;手工填写客户名称不校验)
        if (reqVO.getClientId() != null) {
            customerApi.validateCustomer(reqVO.getClientId());
        }
        // 校验发货通知单
        if (reqVO.getNoticeId() != null) {
            MesWmSalesNoticeDO notice = salesNoticeService.validateSalesNoticeExists(reqVO.getNoticeId());
            if (ObjUtil.notEqual(notice.getStatus(), MesWmSalesNoticeStatusEnum.APPROVED.getStatus())) {
                throw exception(WM_SALES_NOTICE_STATUS_NOT_APPROVED);
            }
            if (ObjUtil.notEqual(notice.getClientId(), reqVO.getClientId())) {
            if (reqVO.getClientId() != null && ObjUtil.notEqual(notice.getClientId(), reqVO.getClientId())) {
                throw exception(WM_SALES_NOTICE_CLIENT_MISMATCH);
            }
        }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java
@@ -273,7 +273,10 @@
     */
    private void validateSaveData(MesWmReturnSalesSaveReqVO reqVO) {
        validateCodeUnique(reqVO.getId(), reqVO.getCode());
        customerApi.validateCustomer(reqVO.getClientId());
        // 校验客户存在(仅关联客户档案时;手工填写客户名称不校验)
        if (reqVO.getClientId() != null) {
            customerApi.validateCustomer(reqVO.getClientId());
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
@@ -265,8 +265,10 @@
        if (reqVO.getId() != null) {
            oldReturnVendor = validateReturnVendorExistsAndPrepare(reqVO.getId());
        }
        // 校验供应商存在
        srmSupplierApi.getSupplier(reqVO.getVendorId());
        // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验)
        if (reqVO.getVendorId() != null) {
            srmSupplierApi.getSupplier(reqVO.getVendorId());
        }
        // 校验编码唯一
        validateCodeUnique(reqVO.getId(), reqVO.getCode());
        return oldReturnVendor;