@RestResource(urlMapping='/SBG004/*') global with sharing class SBG004Rest { public class SBG004ResrException extends Exception {} global class GeDatasRest { public GeDatas GeDatas; } global class GeDatas { public NFMUtil.Monitoring Monitoring; public SBG004Rest.GeData[] GeData; } global class GeData { public String ProductCode; public String Currency_x; public String ProductSegment; public String TradeType; public String MachineParts; public String SalesChannel; public Decimal CostPrice; public String EffectiveDateFrom; public String EffectiveDateTo; public String PurposeOfAdvice; public String Other1; public String Other2; public String Other3; } @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, 'SBG004', 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":' + gedata + '}'; 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 = scope[0]; //String logstr = rowData.MessageGroupNumber__c + ' ' + startIndex + '/' + dataLength + ' start\n'; 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 = ''; BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'SBG004'; iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c; //iflog.Log__c = logstr; iflog.ErrorLog__c = ''; insert iflog; String rowDataStr = NFMUtil.getRowDataStr(rowData); List purchasePriceList2 = (List) JSON.deserialize(rowDataStr, List.class); if (purchasePriceList2 == null || purchasePriceList2.size() == 0) { return; } List productCodeList = new List(); List prekeys = new List(); for (Integer i = 0; i premap = new Map(); for(PricebookEntry pre : [Select Id,Name,KEY__c,EffectiveDateFrom1__c,EffectiveDateFrom2__c,UnitPrice, EffectiveDateTo1__c,EffectiveDateTo2__c,CostPrice1__c,CostPrice2__c,SalesPrice1__c,SalesPrice2__c from PricebookEntry where KEY__c in:prekeys]) { premap.put(pre.KEY__c,pre); } Map prebookmap = new Map(); for(Pricebook2 pre : [Select Id,Name,MachineParts__c,ProductSegment__c,SalesChannel__c,TradeType__c,isActive from Pricebook2 where IsStandard = false]) { prebookmap.put(pre.ProductSegment__c + '_' + pre.TradeType__c + '_' + pre.SalesChannel__c + '_' + pre.MachineParts__c,pre); } System.debug('prebookis' + prebookmap); Map prdsMap = new Map(); for (Product2 prd : [select Id, ProductCode, Product_ECCode__c, EffectiveDateTo__c, ProductModels__c, ProductStatus__c from Product2 where ProductModels__c = false and ProductCode in :productCodeList] ) { prdsMap.put(prd.ProductCode, prd); } Savepoint sp = Database.setSavepoint(); try { List pres = new List(); Set updPresSet = new Set(); Boolean retrycntFlag = false; for (Integer i = 0; i < purchasePriceList2.size(); i++) { //purchasePriceList.add(purchasePriceList2.get(i)); GeData data = purchasePriceList2.get(i); if (data.PurposeOfAdvice == '1') { data.EffectiveDateTo = NFMUtil.formatDate2Str(Date.today().addDays(-1)); } if (String.isBlank(purchasePriceList2.get(i).ProductCode) == false) { if (data.ProductCode == null || data.ProductCode == '') { iflog.ErrorLog__c += 'ProductCode is required\n'; continue; } if (data.ProductSegment == null || data.ProductSegment == '') { iflog.ErrorLog__c += '[' + data.ProductCode + ']PriceType is required\n'; continue; } if (data.Currency_x == null || data.Currency_x == '') { iflog.ErrorLog__c += '[' + data.ProductCode + ']Currency is required\n'; continue; } if (data.EffectiveDateFrom == null || data.EffectiveDateFrom == '') { iflog.ErrorLog__c += '[' + data.ProductCode + ']EffectiveDateFrom is required\n'; continue; } if (data.EffectiveDateTo == null || data.EffectiveDateTo == '') { iflog.ErrorLog__c += '[' + data.ProductCode + ']EffectiveDateTo is required\n'; continue; } if(prdsMap.get(data.ProductCode) == null) { iflog.ErrorLog__c += 'Product[' + data.ProductCode + ']NotExist\n'; retrycntFlag = true; continue; } if(data.SalesChannel == '99') { String pdedikey = data.ProductSegment + '_' + data.TradeType + '_' + 'direct' + '_' + data.MachineParts + '_' + data.ProductCode + '_' + data.Currency_x; String pbedekey = data.ProductSegment + '_' + data.TradeType + '_' + 'dealer' + '_' + data.MachineParts + '_' + data.ProductCode + '_' + data.Currency_x; String pddikey = data.ProductSegment + '_' + data.TradeType + '_' + 'direct' + '_' + data.MachineParts; String pddekey = data.ProductSegment + '_' + data.TradeType + '_' + 'dealer' + '_' + data.MachineParts; PricebookEntry pre1 = setpricebookec(data,premap,prdsMap.get(data.ProductCode).Id,prebookmap.get(pddikey),pdedikey,updPresSet); PricebookEntry pre2 = setpricebookec(data,premap,prdsMap.get(data.ProductCode).Id,prebookmap.get(pddekey),pbedekey,updPresSet); pres.add(pre1); pres.add(pre2); } else { String salesChannel = data.SalesChannel == '41' ? 'dealer' : 'direct'; String pbekey = data.ProductSegment + '_' + data.TradeType + '_' + salesChannel + '_' + data.MachineParts + '_' + data.ProductCode + '_' + data.Currency_x; String pbkey = data.ProductSegment + '_' + data.TradeType + '_' + salesChannel + '_' + data.MachineParts; System.debug(prdsMap.get(data.ProductCode)); System.debug(pbekey); System.debug(prebookmap); PricebookEntry pre1 = setpricebookec(data,premap,prdsMap.get(data.ProductCode).Id,prebookmap.get(pbkey),pbekey,updPresSet); pres.add(pre1); } } } System.debug(logstr); logstr += 'Execute Record:' + pres.size() + '\n'; if(pres.size()>0) { upsert(pres); } logstr += '\nend'; if (retrycntFlag) { LogAutoSend(rowData,batch_retry_max_cnt,iflog); } else { rowData.retry_cnt__c = 0; } } catch(Exception ex) { // エラーが発生した場合 Database.rollback(sp); System.debug(ex); System.debug(Logginglevel.ERROR, 'SBG004_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage()); System.debug(Logginglevel.ERROR, 'SBG004_' + 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++; LogAutoSendScheduleProduct.assignOneMinute(); } if (rowData.retry_cnt__c >= batch_retry_max_cnt){ rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c+'错误次数已经超过自动收信设定的最大次数,请手动收信'; } } update rowData; iflog.Log__c = logstr; if (iflog.Log__c.length() > 131072) { iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...'; } if (iflog.ErrorLog__c.length() > 32768) { iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...'; } update iflog; } global static void LogAutoSend (BatchIF_Log__c rowData,Integer batch_retry_max_cnt,BatchIF_Log__c iflog) { system.debug('LogAutoSend---Start'); if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0; if (rowData.retry_cnt__c < batch_retry_max_cnt){ rowData.retry_cnt__c++; LogAutoSendScheduleProduct.assignOneMinute(); } if (rowData.retry_cnt__c >= batch_retry_max_cnt){ rowData.ErrorLog__c = iflog.ErrorLog__c+'错误次数已经超过自动收信设定的最大次数,请手动收信'; } update rowData; } global static PricebookEntry setpricebookec(GeData data,Map premap,String productid,Pricebook2 pricebook2,String pbekey, Set updPresSet) { System.debug('setpricebookec start productid=' + productid); System.debug('setpricebookec start Pricebook2id=' + pricebook2.Id); Date dateFrom = NFMUtil.parseStr2Date(data.EffectiveDateFrom, false); Date dateTo = NFMUtil.parseStr2Date(data.EffectiveDateTo, true); System.debug('fram' + dateFrom); System.debug('to' + dateTo); String curr = data.Currency_x == 'RMB' ? 'CNY' : data.Currency_x; System.debug('Currency_x is ' + curr); if (updPresSet.contains(pbekey)) { throw new SBG004ResrException(pbekey + ' is doubled in message file.'); } PricebookEntry pre = premap.get(pbekey); if(pre != null){ System.debug('fram111' + pre.EffectiveDateFrom1__c); System.debug('to111' + pre.EffectiveDateTo1__c); } // TODO CurrencyIsoCode 等 // UnitPrice = 0 if (pre == null) { pre = new PricebookEntry(KEY__c = pbekey, CostPrice1__c = data.CostPrice, CurrencyIsoCode = curr, EffectiveDateFrom1__c = dateFrom, EffectiveDateTo1__c = dateTo, UnitPrice = 0, Product2Id = productid, Pricebook2id = pricebook2.Id, isActive = pricebook2.isActive, UseStandardPrice = false); } else if (pre.EffectiveDateFrom1__c == null || pre.EffectiveDateTo1__c < Date.today() || pre.EffectiveDateFrom1__c == dateFrom) { pre = new PricebookEntry(KEY__c = pbekey, Id = pre.Id, CostPrice1__c = data.CostPrice, CurrencyIsoCode = curr, EffectiveDateFrom1__c = dateFrom, EffectiveDateTo1__c = dateTo, UnitPrice = 0, Product2Id = productid, Pricebook2id = pricebook2.Id, isActive = pricebook2.isActive, UseStandardPrice = false); } else if(pre.EffectiveDateFrom2__c == null || pre.EffectiveDateTo2__c < Date.today() || pre.EffectiveDateFrom2__c == dateFrom) { pre = new PricebookEntry(KEY__c = pbekey, Id = pre.Id, CostPrice2__c = data.CostPrice, CurrencyIsoCode = curr, EffectiveDateFrom2__c = dateFrom, EffectiveDateTo2__c = dateTo, UnitPrice = 0, Product2Id = productid, Pricebook2id = pricebook2.Id, isActive = pricebook2.isActive, UseStandardPrice = false); } else if(pre.EffectiveDateFrom1__c < pre.EffectiveDateFrom2__c) { pre = new PricebookEntry(KEY__c = pbekey, Id = pre.Id, CostPrice1__c = data.CostPrice, CurrencyIsoCode = curr, EffectiveDateFrom1__c = dateFrom, EffectiveDateTo1__c = dateTo, UnitPrice = 0, Product2Id = productid, Pricebook2id = pricebook2.Id, isActive = pricebook2.isActive, UseStandardPrice = false); } else { pre = new PricebookEntry(KEY__c = pbekey, Id = pre.Id, CostPrice2__c = data.CostPrice, CurrencyIsoCode = curr, EffectiveDateFrom2__c = dateFrom, EffectiveDateTo2__c = dateTo, UnitPrice = 0, Product2Id = productid, Pricebook2id = pricebook2.Id, isActive = pricebook2.isActive, UseStandardPrice = false); } updPresSet.add(pbekey); return pre; } }