feat(mes): 仓储物流单据跨模块关联字段支持手工填写
北方科技不使用生产/采购/销售模块,仓储物流各单据的跨模块关联字段改为可手工输入,
不填写关联 ID 时只保存文本,不再强制校验关联档案是否存在。
- 到货通知/采购退货:采购订单号、供应商名称
- 发货通知/产品发货/销售退货:销售订单号、客户名称、发货通知单号
- 装箱单:销售订单编号、客户名称、装箱行生产订单号
- 产品入库:生产订单号
- 生产退料:生产订单号、工作站名称
- 委外发料/委外入库:外协订单号、供应商名称
- 对应 DO/SaveReqVO/PageReqVO/Mapper 增加文本列与模糊搜索,关联校验改为 ID 非空才执行
- 客户权限过滤允许 client_id 为空的单据可见
- 委外入库按工单号搜索找不到工单时回退为文本模糊匹配
Co-Authored-By: Claude Code <noreply@anthropic.com>
| | |
| | | @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; |
| | |
| | | @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; |
| | |
| | | @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; |
| | |
| | | @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; |
| | | |
| | |
| | | @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; |
| | |
| | | @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; |
| | |
| | | @Schema(description = "客户 ID", example = "1") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "客户名称", example = "某某客户") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "父箱 ID", example = "1024") |
| | | private Long parentId; |
| | | |
| | |
| | | @Schema(description = "客户 ID", example = "1") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "客户名称(手工填写)", example = "某某客户") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "箱长度", example = "60.00") |
| | | private BigDecimal length; |
| | | |
| | |
| | | @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; |
| | | |
| | |
| | | @Schema(description = "生产工单编号", example = "1") |
| | | private Long workOrderId; |
| | | |
| | | @Schema(description = "生产工单号", example = "WO202603010001") |
| | | private String workOrderCode; |
| | | |
| | | @Schema(description = "产品物料编号", example = "1") |
| | | private Long itemId; |
| | | |
| | |
| | | @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; |
| | |
| | | @Schema(description = "客户编号", example = "1") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "客户名称", example = "某某客户") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "状态", example = "0") |
| | | private Integer status; |
| | | |
| | |
| | | @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; |
| | |
| | | @Schema(description = "发货通知单ID", example = "1") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "发货通知单号(手工填写)", example = "SN2026030001") |
| | | private String noticeCode; |
| | | |
| | | @Schema(description = "收货人", example = "张三") |
| | | private String contactName; |
| | | |
| | |
| | | @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; |
| | | |
| | |
| | | @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; |
| | |
| | | @Schema(description = "客户 ID", example = "1") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "客户名称", example = "某某客户") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "状态", example = "0") |
| | | private Integer status; |
| | | |
| | |
| | | @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; |
| | |
| | | @Schema(description = "供应商 ID", example = "1") |
| | | private Long vendorId; |
| | | |
| | | @Schema(description = "供应商名称") |
| | | private String vendorName; |
| | | |
| | | } |
| | |
| | | @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; |
| | |
| | | @Schema(description = "客户编号", example = "1") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "客户名称", example = "某某客户") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "状态", example = "3") |
| | | private Integer status; |
| | | |
| | |
| | | @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; |
| | | |
| | |
| | | */ |
| | | private Long vendorId; |
| | | /** |
| | | * 供应商名称 |
| | | * |
| | | * 手工填写时使用,不关联供应商档案 |
| | | */ |
| | | private String vendorName; |
| | | /** |
| | | * 到货日期 |
| | | */ |
| | | private LocalDateTime arrivalDate; |
| | |
| | | */ |
| | | private Long vendorId; |
| | | /** |
| | | * 供应商名称 |
| | | * |
| | | * 手工填写时使用,不关联供应商档案 |
| | | */ |
| | | private String vendorName; |
| | | /** |
| | | * 生产工单ID |
| | | * |
| | | * 关联 {@link MesProWorkOrderDO#getId()} |
| | | */ |
| | | private Long workOrderId; |
| | | /** |
| | | * 生产工单号 |
| | | * |
| | | * 手工填写时使用,不关联生产工单 |
| | | */ |
| | | private String workOrderCode; |
| | | /** |
| | | * 发料日期 |
| | | */ |
| | | private LocalDateTime issueDate; |
| | |
| | | */ |
| | | 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; |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * 客户名称 |
| | | * |
| | | * 手工填写时使用,不关联 CRM 客户档案 |
| | | */ |
| | | private String clientName; |
| | | /** |
| | | * 箱长度 |
| | | */ |
| | | private BigDecimal length; |
| | |
| | | */ |
| | | private Long workOrderId; |
| | | /** |
| | | * 生产工单号 |
| | | * |
| | | * 手工填写时使用,不关联生产工单 |
| | | */ |
| | | private String workOrderCode; |
| | | /** |
| | | * 有效期 |
| | | */ |
| | | private LocalDateTime expireDate; |
| | |
| | | */ |
| | | private Long workOrderId; |
| | | /** |
| | | * 生产工单号 |
| | | * |
| | | * 手工填写时使用,不关联生产工单 |
| | | */ |
| | | private String workOrderCode; |
| | | /** |
| | | * 产品物料编号 |
| | | * |
| | | * 关联 {@link MesMdItemDO#getId()} |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * 客户名称 |
| | | * |
| | | * 手工填写时使用,不关联 CRM 客户档案 |
| | | */ |
| | | private String clientName; |
| | | /** |
| | | * 销售订单ID |
| | | */ |
| | | private Long saleOrderId; |
| | |
| | | */ |
| | | private Long noticeId; |
| | | /** |
| | | * 发货通知单号 |
| | | * |
| | | * 手工填写时使用,不关联发货通知单 |
| | | */ |
| | | private String noticeCode; |
| | | /** |
| | | * 出库日期 |
| | | */ |
| | | private LocalDateTime salesDate; |
| | |
| | | */ |
| | | private Long workOrderId; |
| | | /** |
| | | * 生产工单号 |
| | | * |
| | | * 手工填写时使用,不关联生产工单 |
| | | */ |
| | | private String workOrderCode; |
| | | /** |
| | | * 生产任务 ID |
| | | * |
| | | * 关联 {@link MesProTaskDO#getId()} |
| | |
| | | */ |
| | | private Long workstationId; |
| | | /** |
| | | * 工作站名称 |
| | | * |
| | | * 手工填写时使用,不关联工作站档案 |
| | | */ |
| | | private String workstationName; |
| | | /** |
| | | * 退料类型 |
| | | * |
| | | * 字典 {@link DictTypeConstants#MES_WM_RETURN_ISSUE_TYPE} |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * 客户名称 |
| | | * |
| | | * 手工填写时使用,不关联 CRM 客户档案 |
| | | */ |
| | | private String clientName; |
| | | /** |
| | | * 退货日期 |
| | | */ |
| | | private LocalDate returnDate; |
| | |
| | | */ |
| | | private Long vendorId; |
| | | /** |
| | | * 供应商名称 |
| | | * |
| | | * 手工填写时使用,不关联 SRM 供应商档案 |
| | | */ |
| | | private String vendorName; |
| | | /** |
| | | * 退货日期 |
| | | */ |
| | | private LocalDateTime returnDate; |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * 客户名称 |
| | | * |
| | | * 手工填写时使用,不关联 CRM 客户档案 |
| | | */ |
| | | private String clientName; |
| | | /** |
| | | * 销售订单ID |
| | | */ |
| | | private Long saleOrderId; |
| | |
| | | .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)); |
| | |
| | | .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)); |
| | | } |
| | |
| | | .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)); |
| | | } |
| | |
| | | .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()) |
| | |
| | | .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.and(w -> { |
| | | w.isNull(MesWmPackageDO::getClientId); |
| | | if (CollUtil.isNotEmpty(permittedClientIds)) { |
| | | w.or().in(MesWmPackageDO::getClientId, permittedClientIds); |
| | | } |
| | | wrapper.in(MesWmPackageDO::getClientId, permittedClientIds); |
| | | }); |
| | | } |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | |
| | | .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)); |
| | | } |
| | |
| | | .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)); |
| | |
| | | .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.and(w -> { |
| | | w.isNull(MesWmProductSalesDO::getClientId); |
| | | if (CollUtil.isNotEmpty(permittedClientIds)) { |
| | | w.or().in(MesWmProductSalesDO::getClientId, permittedClientIds); |
| | | } |
| | | wrapper.in(MesWmProductSalesDO::getClientId, permittedClientIds); |
| | | }); |
| | | } |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | |
| | | .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)); |
| | |
| | | .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)); |
| | |
| | | .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.and(w -> { |
| | | w.isNull(MesWmReturnSalesDO::getClientId); |
| | | if (CollUtil.isNotEmpty(permittedClientIds)) { |
| | | w.or().in(MesWmReturnSalesDO::getClientId, permittedClientIds); |
| | | } |
| | | wrapper.in(MesWmReturnSalesDO::getClientId, permittedClientIds); |
| | | }); |
| | | } |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | |
| | | .likeIfPresent(MesWmReturnVendorDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmReturnVendorDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode()) |
| | | .eqIfPresent(MesWmReturnVendorDO::getVendorId, reqVO.getVendorId()) |
| | | .likeIfPresent(MesWmReturnVendorDO::getVendorName, reqVO.getVendorName()) |
| | | .orderByDesc(MesWmReturnVendorDO::getId)); |
| | | } |
| | | |
| | |
| | | .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)); |
| | | } |
| | |
| | | .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.and(w -> { |
| | | w.isNull(MesWmSalesNoticeDO::getClientId); |
| | | if (CollUtil.isNotEmpty(permittedClientIds)) { |
| | | w.or().in(MesWmSalesNoticeDO::getClientId, permittedClientIds); |
| | | } |
| | | wrapper.in(MesWmSalesNoticeDO::getClientId, permittedClientIds); |
| | | }); |
| | | } |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | |
| | | private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) { |
| | | // 校验编码唯一 |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // 校验供应商存在(ERP 采购供应商) |
| | | // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验) |
| | | if (reqVO.getVendorId() != null) { |
| | | srmSupplierApi.getSupplier(reqVO.getVendorId()); |
| | | } |
| | | // 校验采购订单存在 |
| | | if (reqVO.getPurchaseOrderId() != null) { |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData(); |
| | |
| | | if (saveReqVO.getVendorId() != null) { |
| | | srmSupplierApi.getSupplier(saveReqVO.getVendorId()); |
| | | } |
| | | // 校验工单存在且类型为外协(代工) |
| | | // 校验工单存在且类型为外协(代工);仅关联生产工单时校验,手工填写工单号不校验 |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 校验编码唯一性 |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | return outsourceReceiptMapper.selectPage(pageReqVO, workOrderIds); |
| | | } |
| | |
| | | private void validateOutsourceReceiptSaveData(Long id, MesWmOutsourceReceiptSaveReqVO reqVO) { |
| | | // 校验编码唯一 |
| | | validateCodeUnique(id, reqVO.getCode()); |
| | | // 校验供应商存在 |
| | | // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验) |
| | | if (reqVO.getVendorId() != null) { |
| | | srmSupplierApi.getSupplier(reqVO.getVendorId()); |
| | | } |
| | | // 校验外协工单存在 |
| | | if (reqVO.getWorkOrderId() != null) { |
| | | workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | |
| | | packageService.validatePackageStatusDraft(reqVO.getPackageId()); |
| | | // 校验产品物料存在 |
| | | mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | // 校验工单已确认 |
| | | // 校验工单已确认(仅关联生产工单时;手工填写工单号不校验) |
| | | if (reqVO.getWorkOrderId() != null) { |
| | | workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | | } |
| | | } |
| | | |
| | | private MesWmPackageLineDO validatePackageLineExists(Long id) { |
| | | MesWmPackageLineDO line = packageLineMapper.selectById(id); |
| | |
| | | private void validateProductSalesSaveData(Long id, MesWmProductSalesSaveReqVO reqVO) { |
| | | // 校验编码唯一 |
| | | validateCodeUnique(id, reqVO.getCode()); |
| | | // 校验客户存在 |
| | | // 校验客户存在(仅关联客户档案时;手工填写客户名称不校验) |
| | | 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); |
| | | } |
| | | } |
| | |
| | | */ |
| | | private void validateSaveData(MesWmReturnSalesSaveReqVO reqVO) { |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // 校验客户存在(仅关联客户档案时;手工填写客户名称不校验) |
| | | if (reqVO.getClientId() != null) { |
| | | customerApi.validateCustomer(reqVO.getClientId()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | if (reqVO.getId() != null) { |
| | | oldReturnVendor = validateReturnVendorExistsAndPrepare(reqVO.getId()); |
| | | } |
| | | // 校验供应商存在 |
| | | // 校验供应商存在(仅关联供应商档案时;手工填写供应商名称不校验) |
| | | if (reqVO.getVendorId() != null) { |
| | | srmSupplierApi.getSupplier(reqVO.getVendorId()); |
| | | } |
| | | // 校验编码唯一 |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | return oldReturnVendor; |