package com.vincent.rsf.server.api.entity.validator; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.server.api.controller.erp.params.SyncOrderParams; import com.vincent.rsf.server.api.controller.erp.params.SyncOrdersItem; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @Component @Slf4j public class SyncOrderValidator { /** * 验证同步订单参数 */ public void validateSyncOrder(SyncOrderParams order) { if (order == null) { throw new IllegalArgumentException("订单参数不能为空"); } // 基本验证 if (!order.isValid()) { throw new IllegalArgumentException("订单参数不完整"); } // 业务验证 order.validateBusiness(); // 验证明细 if (order.getOrderItems() == null || order.getOrderItems().isEmpty()) { throw new IllegalArgumentException("订单明细不能为空"); } // 检查重复行号 Set lineIds = new HashSet<>(); for (int i = 0; i < order.getOrderItems().size(); i++) { SyncOrdersItem item = order.getOrderItems().get(i); String prefix = "第" + (i + 1) + "个明细: "; if (item == null) { throw new IllegalArgumentException(prefix + "明细为空"); } // 验证行内码 if (Cools.isEmpty(item.getLineId())) { throw new IllegalArgumentException(prefix + "行内码不能为空"); } // 检查重复 if (!lineIds.add(item.getLineId())) { throw new IllegalArgumentException(prefix + "行内码重复: " + item.getLineId()); } // 业务验证 try { item.validateBusiness(order.getType()); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(prefix + e.getMessage()); } } // // 验证数量一致性 // double itemsTotal = order.calculateItemsTotal(); // if (Math.abs(itemsTotal - order.getAnfme()) > 0.001) { // log.warn("订单[{}] 主单数量({})与明细总数({})不一致", // order.getOrderNo(), order.getAnfme(), itemsTotal); // } } /** * 验证批次订单 */ public void validateBatchOrders(List orders) { if (orders == null || orders.isEmpty()) { throw new IllegalArgumentException("订单列表不能为空"); } if (orders.size() > 100) { throw new IllegalArgumentException("批量同步单次最多支持100个订单"); } // 检查重复订单号 Set orderNos = new HashSet<>(); Set orderInternalCodes = new HashSet<>(); for (int i = 0; i < orders.size(); i++) { SyncOrderParams order = orders.get(i); String prefix = "第" + (i + 1) + "个订单: "; if (order == null) { throw new IllegalArgumentException(prefix + "订单为空"); } // 验证订单号 if (Cools.isEmpty(order.getOrderNo())) { throw new IllegalArgumentException(prefix + "订单号不能为空"); } if (!orderNos.add(order.getOrderNo())) { throw new IllegalArgumentException(prefix + "订单号重复: " + order.getOrderNo()); } // 验证单据内码 if (order.getOrderInternalCode() == null) { throw new IllegalArgumentException(prefix + "单据内码不能为空"); } if (!orderInternalCodes.add(order.getOrderInternalCode())) { throw new IllegalArgumentException(prefix + "单据内码重复: " + order.getOrderInternalCode()); } // 验证单个订单 try { validateSyncOrder(order); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(prefix + e.getMessage()); } } } /** * 过滤有效订单 */ public List filterValidOrders(List orders) { if (orders == null) { return Collections.emptyList(); } return orders.stream() .filter(order -> order != null && order.isValid()) .collect(Collectors.toList()); } /** * 计算总数量 */ // public double calculateTotalQuantity(List orders) { // if (orders == null || orders.isEmpty()) { // return 0.0; // } // // return orders.stream() // .mapToDouble(order -> order.getAnfme() != null ? order.getAnfme() : 0.0) // .sum(); // } }