GWY
2022-04-06 7560140a14a60e949e6130d98225297e84f0a198
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/**********************************************************************
 
*************************************************************************/
@RestResource(urlMapping = '/SBG019/*')
global with sharing class SBG019Rest {
    global class GeDatasRest {
        public GeDatas GeDatas;
    }
    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public GeData[] GeData;
    }
 
    global class GeData {
        public String TransforDate; //传输日期
        public GeDataDetails[] GeDataDetails;
 
        
    }
 
    global class GeDataDetails {
 
        public String ProductCode;//物料
        public String ProductDate;//监管产品最早生产日期
        public String StorageDate;//监管产品入库日期
    }
 
 
 
 
    @HttpPost
    global static void execute() {
        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
 
        GeDatasRest ges = (GeDatasRest) JSON.deserializeStrict(strData, GeDatasRest.class);
 
        if (ges == null ) {
            return;
        }
 
        NFMUtil.Monitoring Monitoring = ges.GeDatas.Monitoring;
        if (Monitoring == null) {
            return;
        }
 
        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'SBG019', ges.GeDatas.GeData);
        if (String.isBlank(rowData.Log__c) == false) {
            executefuture(rowData.Id);
        }
        // JSONを戻す
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"status": "Success", "Message":""}';
        res.responseBody = blob.valueOf(jsonResponse);
        return;
    }
 
    @future
    global static void executefuture(String rowData_Id) {
        main(rowData_Id);
    }
 
    global static void main(String rowData_Id) {
        Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
        BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c from BatchIF_Log__c where RowDataFlg__c = true and Id = :rowData_Id];
        String logstr = rowData.MessageGroupNumber__c + ' start\n';
        BatchIF_Log__c iflog = new BatchIF_Log__c();
        iflog.Type__c = 'SBG019';
        iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog.ErrorLog__c = '';
        insert iflog;
 
        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List<GeData> geDataList = (List<GeData>) JSON.deserialize(rowDataStr, List<GeData>.class);
        if (geDataList == null || geDataList.size() == 0) {
            return;
        }
 
 
        Savepoint sp = Database.setSavepoint();
        String result = '';
        try {
            // 符合的明细
            Map<String, GeDataDetails> satisfyGeDataDetailMap = RequiredFieldValidator(geDataList, iflog);
            if (satisfyGeDataDetailMap.size() > 0) {
               result = updateProduct(satisfyGeDataDetailMap,iflog);
            }
            logstr += result;
            logstr += '\n End';
            rowData.retry_cnt__c = 0;
            if(Test.isRunningTest()){
                Integer num = Integer.valueOf('TestError');
            }
        }catch (Exception ex) {
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, 'SBG019_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'SBG019_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            logstr += '\n' + ex.getMessage();
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
 
            if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
            if (rowData.retry_cnt__c < batch_retry_max_cnt) {
                rowData.retry_cnt__c++;
                LogAutoSendSchedule.assignOneMinute();
            }
            if (rowData.retry_cnt__c >= batch_retry_max_cnt) {
                rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c + '错误次数已经超过自动收信设定的最大次数,请手动收信';
            }
        }
        iflog.Log__c = logstr;
        upsert iflog;
        upsert rowData;
    }
    /**
     * 必填字段的验证
     * @Author   XHL
     * @DateTime 2021-07-22
     * @param    geDataList [接口传输数据]
     * @param    iflog      [BatchLog日志]
     * @return              [符合的数据]
     */
    public static Map<String, GeDataDetails> RequiredFieldValidator(List<GeData> geDataList, BatchIF_Log__c iflog) {
        Map<String, GeDataDetails> result = new Map<String, GeDataDetails>();
        for (GeData gda : geDataList) {
            // 传输日期
            if (String.isNotBlank(gda.TransforDate)) {
                
            }
 
            for (GeDataDetails  geDataDetail : gda.GeDataDetails) {
                //产品编码
                if (String.isBlank(geDataDetail.ProductCode)) {
                    iflog.ErrorLog__c += 'ProductCode is required,This data is skipped.\n';
                    continue;
                }
                //监管产品最早生产日期
                if (String.isBlank(geDataDetail.ProductDate)) {
                    iflog.ErrorLog__c += 'ProductCode[ ' + geDataDetail.ProductDate + ' ] of ProductDate is required,This data is skipped.\n';
                    continue;
                }
                String productCode = ZeroPadding(geDataDetail.ProductCode);
                result.put(productCode,geDataDetail);
            }
        }
 
        return result;
    }
 
    // 保存产品
    public static String updateProduct(Map<String, GeDataDetails> satisfyGeDataDetailMap, BatchIF_Log__c iflog) {
        String result = '';
        //根据产品Code查询产品信息
        List<Product2> getProductList = 
                    [SELECT Id, Name, ProductCode,demoteer_Sap__c,Diedatvanink__c 
                    FROM Product2 
                    WHERE ProductCode 
                    IN:satisfyGeDataDetailMap.keyset() 
                    ];
        Map<String, Product2> productMap = new Map<String, Product2>();
        for(Product2 product:getProductList){
            productMap.put(product.ProductCode, product);
        }
 
        Integer nonexisQuantity = 0;
        for (String ProductCode : satisfyGeDataDetailMap.keySet()) {
            if (productMap.containsKey(productCode)) {
                GeDataDetails geDataDetails = satisfyGeDataDetailMap.get(productCode);
                Date demoteer_Sap = NFMUtil.parseStr2Date(geDataDetails.ProductDate, false);
                Date Diedatvanink = NFMUtil.parseStr2Date(geDataDetails.StorageDate, false);
                Product2  product = productMap.get(productCode);
                product.demoteer_Sap__c = demoteer_Sap;
                product.Diedatvanink__c = Diedatvanink;
 
                productMap.put(productCode,product);
                result += 'productCode [ ' + productCode + ' ]\n';  
            } else {
                nonexisQuantity +=1;
                iflog.ErrorLog__c += 'productCode [ ' + productCode + ' ] is Nonexistent,This data is skipped.\n';
                continue;
            }    
        }
        Integer repeatTheNumber = satisfyGeDataDetailMap.size() - productMap.size() -nonexisQuantity;
        result += '共传输 ' + satisfyGeDataDetailMap.size() +'条数据\n';
        if (productMap.size() > 0) {
            update productMap.values();
            result += '更新成功 ' + productMap.size() +'条数据\n';
        }
        if (repeatTheNumber > 0) {
            result += '重复 ' + repeatTheNumber +'条数据\n';
        }
        if (nonexisQuantity >0) {
            result += '产品不存在 ' + nonexisQuantity +'条数据\n';
        }
 
 
        
 
        return result;
    }
 
    // 纯数字产品编码进行补零
    public static String ZeroPadding(String productCode) {
        Pattern pattern = Pattern.compile('^[0-9]*$');
        Matcher isNum = pattern.matcher(productCode);
        if (isNum.matches()) {
            productCode = productCode.leftPad(18, '0');
        }
 
        return productCode;
    }
}