global class SBG004WebService { public class SBG004WebServiceException extends Exception {} private final Id rowData_Id; global class GeDatas { webservice NFMUtil.Monitoring Monitoring; webservice SBG004WebService.GeData[] GeData; } global class GeData { webservice String ProductCode; webservice String Currency_x; webservice String ProductSegment; webservice String TradeType; webservice String MachineParts; webservice String SalesChannel; webservice Decimal CostPrice; webservice String EffectiveDateFrom; webservice String EffectiveDateTo; webservice String PurposeOfAdvice; webservice String Other1; webservice String Other2; webservice String Other3; } webservice static void SBG004(GeDatas geDatas) { if (geDatas == null) { return; } NFMUtil.Monitoring Monitoring = GeDatas.Monitoring; if (Monitoring == null) { return; } BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'SBG004', GeDatas.GeData); if (GeDatas.GeData == null || GeDatas.GeData.size() == 0) { return; } rowData.retry_cnt__c = 1; update rowData; //SBG004WebService u = new SBG004WebService(rowData.Id, 0, GeDatas.GeData.size()); //Database.executeBatch(u, 1); if (Test.isRunningTest()) { Id execBTId = Database.executeBatch(new LogAutoSendBatchProduct(), 4); }else{ LogAutoSendScheduleProduct.assignOneMinute(); } } global static void execute(Database.BatchableContext BC, List scope) { 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'; 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(); 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'; 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'; 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 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 SBG004WebServiceException(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; } }