1
1 天以前 9f43ee66e8fa2e0d02945f4bdd40d9c3a53a4bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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<String> 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<SyncOrderParams> orders) {
        if (orders == null || orders.isEmpty()) {
            throw new IllegalArgumentException("订单列表不能为空");
        }
 
        if (orders.size() > 100) {
            throw new IllegalArgumentException("批量同步单次最多支持100个订单");
        }
 
        // 检查重复订单号
        Set<String> orderNos = new HashSet<>();
        Set<Long> 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<SyncOrderParams> filterValidOrders(List<SyncOrderParams> orders) {
        if (orders == null) {
            return Collections.emptyList();
        }
 
        return orders.stream()
                .filter(order -> order != null && order.isValid())
                .collect(Collectors.toList());
    }
 
    /**
     * 计算总数量
     */
//    public double calculateTotalQuantity(List<SyncOrderParams> orders) {
//        if (orders == null || orders.isEmpty()) {
//            return 0.0;
//        }
//
//        return orders.stream()
//                .mapToDouble(order -> order.getAnfme() != null ? order.getAnfme() : 0.0)
//                .sum();
//    }
}