P15GEN2\59518
2025-10-10 9f6890646993d16260d4201d613c092132856127
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
package biz.policy.rule.action;
 
import java.util.HashMap;
import java.util.Map.Entry;
 
import biz.policy.OrderEvent;
import biz.policy.price.PackageLine;
import biz.policy.price.PackagePolicy;
import biz.policy.price.PolicyBucket;
import biz.policy.rule.CheckLevel;
import biz.policy.rule.CheckResult;
import biz.policy.rule.OrderCalculator;
import biz.policy.rule.RuleAction;
import foundation.dao.DataWriter;
import foundation.util.ContentBuilder;
import foundation.util.MapList;
 
public class PackageLineQtyCheck extends RuleAction {
 
    public static String remark = "套包倍数检查";
    
    public PackageLineQtyCheck() {
        super();
    }
 
    @Override
    public void createBoard(OrderCalculator calculator, CheckResult result) {
        String packageId;
        boolean success = true;
        ContentBuilder builder = new ContentBuilder(";\r\n");
        
        //1. 获取订单各套包数量
        HashMap<String, PackagePolicy> packageList = calculator.getPackages();
        
        //2. 套包行数量检查
        for (Entry<String, PackagePolicy>  onePackage : packageList.entrySet()) {
            packageId = onePackage.getKey();
            ContentBuilder linesBuilder = new ContentBuilder(";\r\n");
            
            // 获取套包政策,明细
            PolicyBucket policyBucket = PolicyBucket.getInstance();
            PackagePolicy packagePolicy = policyBucket.getPackagePolicy(packageId);
            MapList<String, PackageLine> lines = packagePolicy.getLines();
            
            // 获取订单套包, 明细
            PackagePolicy orderPackage = onePackage.getValue();
            int packageQty = orderPackage.getMaxQty();
            MapList<String, PackageLine> orderPackageLines = orderPackage.getLines();
            
            
            //2.1 检查行数量, 计算距离最大套包还差的数量
            for (PackageLine packageLine : lines) {
                String packageLineId = packageLine.getId();
                PackageLine orderPackageLine = orderPackageLines.get(packageLineId);
                
                int orderPackageLineQty = 0;
                
                if (orderPackageLine != null) {
                    orderPackageLineQty = orderPackageLine.getQty();
                }
                
                int diff = packageQty * packageLine.getQty() - orderPackageLineQty;
                
                if (diff > 0) {
                    success = false;
                    linesBuilder.append("【" + packageLine.getProductName() + "】数量为" + packageLine.getQty() + ", 购买数量为" + orderPackageLineQty);
                }
            }
            
            if (!linesBuilder.isEmpty()) {
                builder.append("套包【" + packagePolicy.getCode() + "】:" + linesBuilder.toString());
            }
            
        }
        
        result.setSuccess(success);
        
        if (!success) {
            result.writeOneRemark("购买套包内的产品需是单套包内产品数量的倍数:" + builder.toString());
        }
    }
 
    @Override
    public boolean check(OrderCalculator calculator, OrderEvent event, DataWriter dataWriter) {
        String packageId;
        boolean success = true;
        ContentBuilder builder = new ContentBuilder(";\r\n");
        
        //1. 获取订单各套包数量
        HashMap<String, PackagePolicy> packageList = calculator.getPackages();
        
        //2. 套包行数量检查
        for (Entry<String, PackagePolicy>  onePackage : packageList.entrySet()) {
            packageId = onePackage.getKey();
            ContentBuilder linesBuilder = new ContentBuilder(";\r\n");
            
            // 获取套包政策,明细
            PolicyBucket policyBucket = PolicyBucket.getInstance();
            PackagePolicy packagePolicy = policyBucket.getPackagePolicy(packageId);
            MapList<String, PackageLine> lines = packagePolicy.getLines();
            
            // 获取订单套包, 明细
            PackagePolicy orderPackage = onePackage.getValue();
            int packageQty = orderPackage.getPackageQty();
            MapList<String, PackageLine> orderPackageLines = orderPackage.getLines();
            
            
            //2.1 检查行数量, 计算距离最大套包还差的数量
            for (PackageLine packageLine : lines) {
                String packageLineId = packageLine.getId();
                PackageLine orderPackageLine = orderPackageLines.get(packageLineId);
                
                int orderPackageLineQty = 0;
                
                if (orderPackageLine != null) {
                    orderPackageLineQty = orderPackageLine.getQty()*packageQty;
                }
                
                int diff = packageQty * packageLine.getQty() - orderPackageLineQty;
                
                if (diff > 0) {
                    success = false;
                    linesBuilder.append("          【" + packageLine.getProductName() + "】数量为 " + packageLine.getQty() + ",购买数量为" + orderPackageLineQty);
                }
            }
            
            builder.append("     套包【" + packagePolicy.getCode() + "】共" + packageQty + "套");
            builder.append(linesBuilder.toString());
        }
        
        if (!success) {
            if(CheckLevel.Info.equals(meta.getLevel())) {
                dataWriter.reportOneAlert("PackageLineQtyCheck", "订单检查不通过:" + meta.getTitle());
                dataWriter.reportOneAlert("PackageLineQtyCheck", builder.toString());
                
                return true;
            }
            else {
                dataWriter.reportOneError("PackageLineQtyCheck", "订单检查不通过:" + meta.getTitle());
                dataWriter.reportOneError("PackageLineQtyCheck", builder.toString());
            }
        }        
        
        return success;
    }
 
}