global class OrderWebService { WebService static String checkproduct(String oppid){ List qliList= [select id,Product2.NMPAStatus__c,Product2.ProductCode,OppliOrderIsChange__c,oppLiVerifyProductValid__c from OpportunityLineItem where opportunityId = :oppId]; String str = ''; Boolean isok = true; for(OpportunityLineItem qli : qliList){ // WLIG-BTA8C2 XHL 20200925 -Start // 合同变更 并且 询价产品的 验证产品有效性 为 false 时跳过验证 if (qli.OppliOrderIsChange__c && qli.oppLiVerifyProductValid__c == false){ // WLIG-BTA8C2 XHL 20200925 -End } else { if(qli.Product2.NMPAStatus__c == '首营状态变更' ||qli.Product2.NMPAStatus__c == '首营不通过'){ str += (' '+qli.Product2.ProductCode); isok = false; } } } System.debug(str); if(isok == true){ return '1'; }else{ return str; } } WebService static String checkLicense(String oppid,String ordId){ String str = '1'; Date endDate = Date.valueOf('2019-12-28'); Order ord = [select id,date_P__c from Order where id =:ordId]; System.debug('endDate:'+endDate+' date_P__c:'+ord.date_P__c); Opportunity oppor = [select id,AccountId,Dealer__r.DummyDealer__c,Dealer__r.ParentID,Account.MarketVerticals__c,Trade_Type_D__c from Opportunity where id = :oppid]; if(oppor.Account.MarketVerticals__c == 'Clinical'&&oppor.Trade_Type_D__c == 'Taxation' && (ord.date_P__c > endDate || ord.date_P__c == null) ){ if(oppor.Dealer__r.DummyDealer__c == true){ str = LicenseCheckUtil.LicenseCheck(oppor.AccountId); }else{ str = LicenseCheckUtil.LicenseCheck(oppor.Dealer__r.ParentID); } }else{ System.debug('endDate:'+endDate+' date_P__c:'+ord.date_P__c); } return str; } WebService static String checkaddress(String oppid,String address,String ordId){ String str = '1'; Date endDate = Date.valueOf('2019-12-28'); Opportunity oppor = [select id,AccountId,Dealer__r.DummyDealer__c,Dealer__r.ParentID,Account.MarketVerticals__c,Trade_Type_D__c from Opportunity where id = :oppId]; Order ord = [select id,date_P__c,Level_Category__c from Order where id =:ordId]; List LcList = new List(); LcList.add(ordId); String LevelCategory = OrderTriggerHandler.levelCheck(LcList).get(ordId); if(oppor.Account.MarketVerticals__c == 'Clinical'&&oppor.Trade_Type_D__c == 'Taxation' && (ord.date_P__c > endDate || ord.date_P__c == null) && LevelCategory =='二类'){ if(oppor.Dealer__r.DummyDealer__c == true){ str = LicenseCheckUtil.AddressCheck(oppor.AccountId,address) == true ? '1' : '0'; }else{ str = LicenseCheckUtil.AddressCheck(oppor.Dealer__r.ParentID,address) == true ? '1' : '0'; } }else{ System.debug('endDate:'+endDate+' date_P__c:'+ord.date_P__c); } return str; } WebService static String checkLicense1(String oppid){ String str = '1'; List oliList = [select id,Product2.If_Exempt_Product__c,Product2.If_Radiation_Product__c,Opportunity.DealerId__c from OpportunityLineItem where opportunityId = :oppId]; Boolean hasA = false; for(OpportunityLineItem oli : oliList){ if(oli.Product2.If_Exempt_Product__c == false && oli.Product2.If_Radiation_Product__c == true){ hasA = true; } } if(hasA == true){ str = LicenseCheckUtil.LicenseCheck1(oliList[0].Opportunity.DealerId__c); } return str; } /** * 检查合同提交审批时,所购买的辐射产品数量,是否超过"奥林巴斯代理商与合同代理商"的可售限制 * 目前用在-合同:提交审批按钮 * @Author XHL * @DateTime 2020-02-11 * @param orderId [合同Id] * @param dealerId [合同对应的代理商Id] * @return [异常信息] */ WebService static String checkUpperLimitOfSales(String orderId,String dealerId){ String result = ''; String olympusAccountId = System.label.Olympus_Id; Map getModelQuantityMap = RadiationUtil.GetModelQuantityMap(orderId); String errorStr = RadiationUtil.GetCertificationDetail(dealerId,getModelQuantityMap); if(errorStr != ''){ return '-1'; } String accountDealerErrorMessage = RadiationUtil.updateCertificationDetails(dealerId, null, getModelQuantityMap, false); //String olympusDealerErrorMessage = RadiationUtil.updateCertificationDetails(olympusAccountId, null, getModelQuantityMap, false); result = accountDealerErrorMessage; Boolean temp = result.startsWith('你不能'); if(temp){ return '-1'; }else{ return result; } return result; } WebService static String checkUpperLimitOfSalesOly(String orderId,String dealerId){ String result = ''; String olympusAccountId = System.label.Olympus_Id; Map getModelQuantityMap = RadiationUtil.GetModelQuantityMap(orderId); /*String errorStr = RadiationUtil.GetCertificationDetail(dealerId,getModelQuantityMap); if(errorStr != ''){ return '-1'; } String accountDealerErrorMessage = RadiationUtil.updateCertificationDetails(dealerId, null, getModelQuantityMap, false);*/ String olympusDealerErrorMessage = RadiationUtil.updateCertificationDetails(olympusAccountId, null, getModelQuantityMap, false); result = olympusDealerErrorMessage == '' ? '' : '奥林巴斯可销售数量不足' ; Boolean temp = result.startsWith('你不能'); if(temp){ return '-1'; }else{ return result; } return result; } WebService static String updItems(String oppId, String orderId) { String rs = ''; List odrList = [select Id, OpportunityId, Opportunity.Model_product_cnt__c, QuoteId from Order where Id = :orderId]; Order odr = odrList.size() > 0 ? odrList[0] : null; /*if (odr.Opportunity.Model_product_cnt__c > 0) { return '询价产品中有产品型号,不能同步。'; }*/ List oiList = [select Id from OrderItem where OrderId = :orderId]; List oppList = [select Id, SyncedQuoteId, Quote_Discount__c, Quote_Subtotal__c, Quote_TotalPrice__c, Quote_Warranty__c, Quote_PaymentTerms_Text__c, Quote_ShipmentTerm__c, Quote_ShipmentTerm2__c, Quote_CustomPrice__c from Opportunity where Id = :oppId]; Opportunity opp = oppList.size() > 0 ? oppList[0] : null; List oliList = [select Id, OpportunityId, Description, Quantity, PricebookEntryId, UnitPrice from OpportunityLineItem where OpportunityId = :oppId order by id]; Quote quo = null; List qliList = null; List dqpsList = new List(); if (opp != null && opp.SyncedQuoteId != null) { List quoList = [select Id from Quote where Id = :opp.SyncedQuoteId]; quo = quoList.size() > 0 ? quoList[0] : null; qliList = [select Id, QuoteId, Description, Quantity, PricebookEntryId, UnitPrice from QuoteLineItem where QuoteId = :opp.SyncedQuoteId]; dqpsList = [select id from DecideQuoteProductSet__c where DecideQuote__c =: opp.SyncedQuoteId]; System.debug(dqpsList); for(DecideQuoteProductSet__c dqps : dqpsList){ dqps.DecideOrder__c = orderId; } } boolean needupd = false; // if (odr.QuoteId != opp.SyncedQuoteId) { odr.QuoteId = opp.SyncedQuoteId; Decimal quoteDiscount = opp.Quote_Discount__c; //odr.Discount__c = opp.Quote_Discount__c; odr.Discount_D__c = quoteDiscount.setScale(4, System.RoundingMode.HALF_UP); Decimal quoteSubtotal = opp.Quote_Subtotal__c; //odr.Olympus_Price_BeforeDiscount__c = opp.Quote_Subtotal__c; odr.Olympus_Price_BeforeDiscount_D__c = quoteSubtotal.setScale(2, System.RoundingMode.HALF_UP); Decimal quoteTotalPrice = opp.Quote_TotalPrice__c; //odr.OlympusContractPrices__c = opp.Quote_TotalPrice__c; odr.OlympusContractPricesD__c = quoteTotalPrice.setScale(0, System.RoundingMode.HALF_UP); //odr.SpecialWarranty__c = opp.Quote_Warranty__c; odr.SpecialWarranty_D__c = String.valueOf(opp.Quote_Warranty__c); //odr.PaymentCondition__c = opp.Quote_PaymentTerms_Text__c; odr.PaymentCondition_D__c = opp.Quote_PaymentTerms_Text__c; //odr.Shipment_Term__c = opp.Quote_ShipmentTerm__c; odr.Shipment_Term_D__c = opp.Quote_ShipmentTerm__c; //odr.Shipment_Term2__c = opp.Quote_ShipmentTerm2__c; odr.Shipment_Term2_D__c = opp.Quote_ShipmentTerm2__c; Decimal quoteCustomPrice = opp.Quote_CustomPrice__c; //odr.CustomerContractPrice__c = opp.Quote_CustomPrice__c; odr.CustomerContractPriceD__c = quoteCustomPrice.setScale(2, System.RoundingMode.HALF_UP); odr.product_approval__c = false; needupd = true; // } List insList = new List(); if (opp.SyncedQuoteId != null) { for (QuoteLineItem qli : qliList) { OrderItem oi = new OrderItem(); oi.Description = qli.Description; oi.Quantity = qli.Quantity; oi.PricebookEntryId = qli.PricebookEntryId; oi.UnitPrice = qli.UnitPrice; oi.OrderId = orderId; oi.QuoteLineItemId = qli.Id; insList.add(oi); } } else { for (OpportunityLineItem oli : oliList) { OrderItem oi = new OrderItem(); oi.Description = oli.Description; oi.Quantity = oli.Quantity; oi.PricebookEntryId = oli.PricebookEntryId; oi.UnitPrice = oli.UnitPrice; oi.OrderId = orderId; insList.add(oi); } } try { if (needupd == true){ update odr; update dqpsList; } if (oiList.size() > 0) delete oiList; if (insList.size() > 0) insert insList; rs = '1'; } catch (Exception e) { rs = e.getMessage(); } return rs; } WebService static String copyOrder(String orderId) { String rs = ''; // 取得合同、合同产品 Order old_odr = null; List old_oi = new List(); Schema.DescribeSobjectResult d_odr = Order.sObjectType.getDescribe(); Map d_odr_map = d_odr.fields.getMap(); String soql_odr = 'select '; String fields_odr = ''; for (String field : d_odr_map.keySet()) { if (fields_odr.length() > 0) { fields_odr += ', '; } fields_odr += field; } soql_odr += fields_odr; soql_odr += ' from Order where Id = \'' + orderId + '\''; //List odrList = [select Id, OpportunityId, QuoteId from Order where Id = :orderId]; List odrList = Database.query(soql_odr); if (odrList.size() > 0) { old_odr = odrList[0]; } // 合同存在check if (old_odr == null) { rs = 'SSBD合同不存在。'; return rs; } Schema.DescribeSobjectResult d_oi = OrderItem.sObjectType.getDescribe(); Map d_oi_map = d_oi.fields.getMap(); String soql_oi = 'select '; String fields_oi = ''; for (String field : d_oi_map.keySet()) { if (fields_oi.length() > 0) { fields_oi += ', '; } fields_oi += field; } soql_oi += fields_oi; soql_oi += ' from OrderItem where OrderId = \'' + orderId + '\''; //List old_oi = [select Id from OrderItem where OrderId = :orderId]; old_oi = Database.query(soql_oi); // 询价存在check if (old_odr.OpportunityId == null) { rs = 'SSBD合同数据不正确,询价为空。'; return rs; } // 取得询价、询价产品 Opportunity old_opp = null; List oppList = [select Id, SyncedQuoteId from Opportunity where Id = :old_odr.OpportunityId]; //List old_oli = [select Id from OpportunityLineItem where OpportunityId = :old_odr.OpportunityId]; if (oppList.size() > 0) { old_opp = oppList[0]; } // 同步中报价一致check if (old_opp.SyncedQuoteId != old_odr.QuoteId) { rs = 'SSBD合同数据不正确,同步中报价错误。'; return rs; } // 同步中报价、取得同步中报价、报价产品 Quote old_quo = null; List old_qli = new List(); List oldDqps = new List(); if (old_odr.QuoteId == null) { } else { Schema.DescribeSobjectResult d_quo = Quote.sObjectType.getDescribe(); Map d_quo_map = d_quo.fields.getMap(); String soql_quo = 'select '; String fields_quo = ''; for (String field : d_quo_map.keySet()) { if (fields_quo.length() > 0) { fields_quo += ', '; } fields_quo += field; } soql_quo += fields_quo; soql_quo += ' from Quote where Id = \'' + old_odr.QuoteId + '\''; //List quoList = [select Id from Quote where Id = :old_odr.QuoteId]; List quoList = Database.query(soql_quo); if (quoList.size() > 0) { old_quo = quoList[0]; oldDqps = [select id,DecideProductSet__c,DecideProductSetCount__c,DecideProductSetCode__c,DecideProductSetName__c from DecideQuoteProductSet__c where DecideQuote__c =:old_quo.id]; //delete oldDqps; } Schema.DescribeSobjectResult d_qli = QuoteLineItem.sObjectType.getDescribe(); Map d_qli_map = d_qli.fields.getMap(); String soql_qli = 'select '; String fields_qli = ''; for (String field : d_qli_map.keySet()) { if (fields_qli.length() > 0) { fields_qli += ', '; } fields_qli += field; } soql_qli += fields_qli; soql_qli += ' from QuoteLineItem where QuoteId = \'' + old_odr.QuoteId + '\''; //old_qli = [select Id from QuoteLineItem where QuoteId = :old_odr.QuoteId]; old_qli = Database.query(soql_qli); } Savepoint sp = Database.setSavepoint(); try { Quote new_quo = null; if (old_quo != null) { new_quo = old_quo.clone(); new_quo.Id = null; new_quo.Is_Decided__c = false; new_quo.Is_upload__c = false; new_quo.OrderIsChange__c = true; insert new_quo; List new_qli = new List(); for (QuoteLineItem qli : old_qli) { QuoteLineItem new_i = qli.clone(); new_i.Id = null; new_i.QuoteId = new_quo.Id; new_qli.add(new_i); } insert new_qli; old_quo.Is_Decided__c = false; //old_quo.Is_upload__c = fasle; update old_quo; //old_opp.SyncedQuoteId = new_quo.Id; old_opp.Is_Decided__c = false; //old_opp.SAP_Upload__c = false; //old_opp.The_Upload_of_quotation_number__c = null; // WLIG-BTA8C2 XHL 20200925 -Start old_opp.OrderIsChange__c = true; // WLIG-BTA8C2 XHL 20200925 -End update old_opp; } else { // WLIG-BTA8C2 XHL 20200925 -Start old_opp.OrderIsChange__c = true; update old_opp; // WLIG-BTA8C2 XHL 20200925 -End } Order new_odr = old_odr.clone(); new_odr.Id = null; new_odr.Status__c = 'Active'; new_odr.ContractCode__c = null; new_odr.IsNew__c = true; new_odr.IsSpPassed__c = false; //new_odr.product_approval__c = false; new_odr.IsOrderPassed__c = false; new_odr.IsCopy__c = true; new_odr.IsUpload__c = false; new_odr.Is_Already_Splited__c = false; new_odr.CopyStatus__c = new_odr.ApproveStatus__c; new_odr.original_order__c = old_odr.Id; // if (new_quo != null) { // new_odr.QuoteId = new_quo.Id; // } // WLIG-BTA8C2 XHL 20200925 -Start new_odr.OrderIsChange__c = true; // WLIG-BTA8C2 XHL 20200925 -End old_odr.Status__c = 'Inactive'; List updateList = new List(); updateList.add(old_odr); update old_odr; insert new_odr; if(old_odr.Association_Order__c != null){ Order o = new Order(); o.Id = old_odr.Association_Order__c; o.Association_Order__c = new_odr.Id; update o; } // List new_oi = new List(); // for (OrderItem oi : old_oi) { // OrderItem new_i = oi.clone(); // new_i.Id = null; // new_i.OrderId = new_odr.Id; // new_oi.add(new_i); // } // insert new_oi; if(oldDqps.size() > 0){ for(DecideQuoteProductSet__c dqps : oldDqps){ dqps.DecideQuote__c = new_quo.Id; dqps.DecideOrder__c = new_odr.Id; } update oldDqps; } //王鹏伟 开始 合同变更(复制源合同(变更))同步复制贸易管理客户申请表 if(new_odr!=null && new_odr.Id !=null){ Schema.DescribeSobjectResult tradeFields = TradeCustomerManager__c.sObjectType.getDescribe(); Map tradeFields_map = tradeFields.fields.getMap(); String tradeList_sql = 'select '; String fields_trade = ''; for (String field : tradeFields_map.keySet()) { if (fields_trade.length() > 0) { fields_trade += ', '; } fields_trade += field; } tradeList_sql += fields_trade; tradeList_sql += ' from TradeCustomerManager__c where order__c = \'' + old_odr.Id + '\''; List tradeList = Database.query(tradeList_sql); if(tradeList!=null && tradeList.size()!=0){ TradeCustomerManager__c newTrade = tradeList[0].clone(); newTrade.Id = null; newTrade.OrderIdSave__c = new_odr.Id; newTrade.order__c = new_odr.Id; insert newTrade; } } //王鹏伟 结束 rs = new_odr.Id; } catch (Exception ex) { Database.rollback(sp); rs = ex.getMessage() + '=====' + ex.getStackTraceString(); } return rs; } WebService static String selectOrder(String orderId) { String rs = ''; // 取得目标合同、合同产品 List odrList = [select Id, OpportunityId, QuoteId, Quote.Is_Decided__c, Quote.Is_upload__c, Quote.QuoteNumber from Order where Id = :orderId]; Order odr = null; if (odrList.size() > 0) { odr = odrList[0]; } // 合同存在check if (odr == null) { rs = 'SSBD合同不存在。'; return rs; } List odr_oi = new List(); if (odr.QuoteId == null) { odr_oi = [select Id, Description, Quantity, UnitPrice, PricebookEntryId, PricebookEntry.Product2Id from OrderItem where OrderId = :orderId]; } // 取得询价 List oppList = [select Id from Opportunity where Id = :odr.OpportunityId]; Opportunity opp = null; if (oppList.size() > 0) { opp = oppList[0]; } List oliList = [select Id from OpportunityLineItem where OpportunityId = :odr.OpportunityId]; // 取得其他有效合同 List odrList2 = [select Id from Order where OpportunityId = :opp.Id and Status__c = 'Active' and Id <> :orderId]; Savepoint sp = Database.setSavepoint(); try { if (odr.QuoteId != null) { opp.SyncedQuoteId = odr.QuoteId; opp.Is_Decided__c = odr.Quote.Is_Decided__c; opp.SAP_Upload__c = odr.Quote.Is_upload__c; opp.The_Upload_of_quotation_number__c = odr.Quote.Is_upload__c == true ? odr.Quote.QuoteNumber : null; } else { opp.SyncedQuoteId = null; opp.Is_Decided__c = false; opp.SAP_Upload__c = false; opp.The_Upload_of_quotation_number__c = null; List prdList = new List(); for (OrderItem oi : odr_oi) { prdList.add(oi.PricebookEntry.Product2Id); } Map prdMap = new Map(); if (prdList.size() > 0) { List psList = [select Id,Product__c from Product_Search__c where Product__c = :prdList]; for (Product_Search__c ps : psList) { prdMap.put(ps.Product__c, ps.Id); } } List ins_oli = new List(); for (OrderItem oi : odr_oi) { OpportunityLineItem oli = new OpportunityLineItem(); oli.OpportunityId = opp.Id; oli.Description = oi.Description; oli.DescriptionD__c = oi.Description; oli.Quantity = oi.Quantity; oli.QuantityD__c = oi.Quantity; oli.UnitPrice = oi.UnitPrice; oli.UnitPriceD__c = oi.UnitPrice; oli.PricebookEntryId = oi.PricebookEntryId; oli.Product_Search__c = prdMap.get(oi.PricebookEntry.Product2Id); ins_oli.add(oli); } if (oliList.size() > 0) { delete oliList; } insert ins_oli; } update opp; odr.Status__c = 'Active'; update odr; if (odrList2.size() > 0) { for (Order o : odrList2) { o.Status__c = 'Inactive'; } update odrList2; } rs = '1'; } catch (Exception ex) { Database.rollback(sp); rs = ex.getMessage() + '=====' + ex.getStackTraceString(); } return rs; } WebService static String checkOly() { return LicenseCheckUtil.LicenseCheckOly(); } WebService static Boolean IfspecialDealer(String oppDealerId) { if (String.isBlank(oppDealerId)) { return false; } return StaticParameter.specialDealerMap1.containsKey(oppDealerId.substring(0, 15)); } WebService static Boolean checkSpecialDeliveryContact(String contactId) { if (String.isBlank(contactId)){ return false; } List contactList = [select Id from Contact where Id = :contactId AND ContactStatus__c = 'Cancel']; if (contactList.size() > 0){ return true; } else { return false; } } //王鹏伟新建方法 【委托】上传合同时增加对客户/联系人审批状态的检查 WLIG-BVE68E WebService static String checkAccountContact(String orderId){ String str = ''; List orderList = [select Id,AccountId,SpecialDeliveryAccount_D__c,ForeignTradeCompany_D__c,EndUserD__c,SpecialDeliveryContact2_D__c,SpecialDeliveryContact2__c from Order where Id=:orderId]; if(orderList!=null && orderList.size()!=0){ List accountId = new List(); accountId.add(orderList[0].AccountId); accountId.add(orderList[0].SpecialDeliveryAccount_D__c); accountId.add(orderList[0].ForeignTradeCompany_D__c); List accountList = [select Id,Name,stautesD__c from Account where id=:accountId]; if(accountList!=null && accountList.size()!=0){ for(Account acc:accountList){ if(String.isNotBlank(orderList[0].AccountId) && acc.Id == orderList[0].AccountId && acc.stautesD__c != 'Pass'){ str += '客户审批未通过;\r'; } if(String.isNotBlank(orderList[0].SpecialDeliveryAccount_D__c) && acc.Id == orderList[0].SpecialDeliveryAccount_D__c && acc.stautesD__c != 'Pass'){ str += '送达方审批未通过;\r'; } if(String.isNotBlank(orderList[0].ForeignTradeCompany_D__c) && acc.Id == orderList[0].ForeignTradeCompany_D__c && acc.stautesD__c != 'Pass'){ str += '外贸公司审批未通过;\r'; } } } List contactId = new List(); contactId.add(orderList[0].EndUserD__c); contactId.add(orderList[0].SpecialDeliveryContact2__c); contactId.add(orderList[0].SpecialDeliveryContact2_D__c); if(contactId.size()!=0){ List contactList = [select Id,StatusD__c from Contact where Id=:contactId]; if(contactList!=null && contactList.size()!=0){ for(Contact con:contactList){ if(String.isNotBlank(orderList[0].EndUserD__c) && con.Id == orderList[0].EndUserD__c && con.StatusD__c != 'Pass'){ str += '最终用户审批未通过;\r'; } if(String.isNotBlank(orderList[0].SpecialDeliveryContact2_D__c) && con.Id == orderList[0].SpecialDeliveryContact2_D__c && con.StatusD__c != 'Pass'){ str += '送达方联系人审批未通过;\r'; } if((orderList[0].SpecialDeliveryContact2__c!=orderList[0].SpecialDeliveryContact2_D__c)&&(String.isNotBlank(orderList[0].SpecialDeliveryContact2__c) && con.Id == orderList[0].SpecialDeliveryContact2__c && con.StatusD__c != 'Pass')){ str += '送达方(外贸公司)联系人审批未通过;\r'; } } } } } if(str == ''){ return '1'; } return str; } //产品首营状态Z5 XHL 2021/02/07 Start // 报价库存检查 WebService static String OrderInventoryCheck(String orderId) { String result = '1'; if (String.isNotBlank(orderId)) { String FGSPStr = ''; // 获取合同的 整机/零件(询价上的) List orderList = [SELECT Id, Name, Opportunity.Machine_Parts__c FROM Order WHERE Id = :orderId limit 1]; if(orderList.size() > 0) { String machine_Parts = orderList[0].Opportunity.Machine_Parts__c; if (String.isNotBlank(machine_Parts) && 'Machine'.equals(machine_Parts)) { FGSPStr = 'FG'; } else if (String.isNotBlank(machine_Parts) && 'Parts'.equals(machine_Parts)){ FGSPStr = 'SP'; } } // 获取产品的首营状态与数量 List ordLiList = [SELECT Id, Quantity, PricebookEntry.ProductCode, Order.ProductSegment__c, PricebookEntry.Product2.NMPAStatus__c FROM OrderItem WHERE OrderId = :orderId ]; Map productQuantityMap = new Map(); for (OrderItem orderItem : ordLiList) { if ('停产'.equals(orderItem.PricebookEntry.Product2.NMPAStatus__c)) { String productSegment = orderItem.Order.ProductSegment__c == 'BS' ? 'LS':orderItem.Order.ProductSegment__c; String managementCode = orderItem.PricebookEntry.ProductCode + '_' + productSegment + '_' + FGSPStr; Decimal quantity = orderItem.Quantity; if (productQuantityMap.containsKey(managementCode)) { quantity += productQuantityMap.get(managementCode); } productQuantityMap.put(managementCode,quantity); } } if (productQuantityMap != null && productQuantityMap.size() > 0) { result = ProductInventoryCheck(productQuantityMap); } } else { return '0'; } return result; } // 询价库存检查 WebService static String OpportunityInventoryCheck(String opportunityId) { String result = '1'; if (String.isNotBlank(opportunityId)) { String FGSPStr = ''; List opportunityList = [SELECT Id, Name,Machine_Parts__c,ProductSegment__c FROM Opportunity WHERE Id = :opportunityId limit 1]; if(opportunityList.size() > 0) { String machine_Parts = opportunityList[0].Machine_Parts__c; if (String.isNotBlank(machine_Parts) && 'Machine'.equals(machine_Parts)) { FGSPStr = 'FG'; } else if (String.isNotBlank(machine_Parts) && 'Parts'.equals(machine_Parts)){ FGSPStr = 'SP'; } } // 获取产品的首营状态与数量 List oppLiList = [SELECT Id, Quantity, PricebookEntry.ProductCode, ProductSegment__c, PricebookEntry.Product2.NMPAStatus__c FROM OpportunityLineItem WHERE OpportunityId = :opportunityId ]; Map productQuantityMap = new Map(); for (OpportunityLineItem oppItem : oppLiList) { if ('停产'.equals(oppItem.PricebookEntry.Product2.NMPAStatus__c)) { String productSegment = oppItem.ProductSegment__c == 'BS' ? 'LS':oppItem.ProductSegment__c; String managementCode = oppItem.PricebookEntry.ProductCode + '_' + productSegment + '_' + FGSPStr; Decimal quantity = oppItem.Quantity; if (productQuantityMap.containsKey(managementCode)) { quantity += productQuantityMap.get(managementCode); } productQuantityMap.put(managementCode,quantity); } } if (productQuantityMap != null && productQuantityMap.size() > 0) { result = ProductInventoryCheck(productQuantityMap); } } else { return '0'; } return result; } // 报价库存检查 WebService static String QuoteInventoryCheck(String quoteId) { String result = '1'; if (String.isNotBlank(quoteId)) { String FGSPStr = ''; String productSegment = ''; List quoteList = [SELECT Id, Name, Opportunity.Machine_Parts__c,ProductSegment__c FROM Quote WHERE Id = :quoteId limit 1]; if(quoteList.size() > 0) { String machine_Parts = quoteList[0].Opportunity.Machine_Parts__c; productSegment = quoteList[0].ProductSegment__c == 'BS' ? 'LS':quoteList[0].ProductSegment__c; if (String.isNotBlank(machine_Parts) && 'Machine'.equals(machine_Parts)) { FGSPStr = 'FG'; } else if (String.isNotBlank(machine_Parts) && 'Parts'.equals(machine_Parts)){ FGSPStr = 'SP'; } } // 获取产品的首营状态与数量 List quoLiList = [SELECT Id, Quantity, PricebookEntry.ProductCode,PricebookEntry.Product2.NMPAStatus__c FROM QuoteLineItem WHERE QuoteId = :quoteId ]; Map productQuantityMap = new Map(); for (QuoteLineItem quoItem : quoLiList) { if ('停产'.equals(quoItem.PricebookEntry.Product2.NMPAStatus__c)) { String managementCode = quoItem.PricebookEntry.ProductCode + '_' + productSegment + '_' + FGSPStr; Decimal quantity = quoItem.Quantity; if (productQuantityMap.containsKey(managementCode)) { quantity += productQuantityMap.get(managementCode); } productQuantityMap.put(managementCode,quantity); } } if (productQuantityMap != null && productQuantityMap.size() > 0) { result = ProductInventoryCheck(productQuantityMap); } } else { return '0'; } return result; } // 产品库存检查 public static String ProductInventoryCheck(Map productQuantityMap) { String result = '1'; System.debug('productQuantityMap--->'+productQuantityMap); Date today = Date.today(); // 为了避免出现问题库存数量,验证只取当天的库存 List getProductInventoryList = [SELECT Id, Name,TransforDate__c, ProductCode__c, Plant__c, ProductSegment__c, ProductType__c, InventoryQuantity__c, ManagementCode__c,TradeType__c FROM ProductInventory__c WHERE ManagementCode__c IN :productQuantityMap.keySet() AND TransforDate__c =today AND TradeType__c = 'Taxation']; System.debug('getProductInventoryList--->'+getProductInventoryList); List errorList = new List(); if (getProductInventoryList.size() > 0) { // Map existingStockMap = new Map(); for (ProductInventory__c inventory :getProductInventoryList) { String managementCode = inventory.ManagementCode__c; Decimal inventoryQuantity = inventory.InventoryQuantity__c; if (existingStockMap.containsKey(managementCode)) { inventoryQuantity += existingStockMap.get(managementCode); } existingStockMap.put(managementCode, inventoryQuantity); } // System.debug('existingStockMap--->'+existingStockMap); for (String managementCode:productQuantityMap.keySet()) { Decimal salesQuantity = productQuantityMap.get(managementCode); String productCode = managementCode.split('_')[0]; String error = ''; if(existingStockMap.containsKey(managementCode)) { Decimal inventoryQuantity = existingStockMap.get(managementCode); if (salesQuantity > inventoryQuantity) { productCode = productCodeFormat(productCode); error = '产品 [ ' +productCode+' ] 库存不足'; errorList.add(error); } } else { // 提示产品无库存 productCode = productCodeFormat(productCode); error = '产品 [ ' +productCode+' ] 库存不足'; errorList.add(error); } } } else { // 提示产品无库存 for (String managementCode:productQuantityMap.keySet()) { String productCode = managementCode.split('_')[0]; productCode = productCodeFormat(productCode); String error = '产品 [ ' +productCode+' ] 库存不足'; errorList.add(error); } } if (errorList.size() > 0) { result = ''; for (String error:errorList){ result += error + ';'; } } System.debug('result--->'+result); return result; } // 产品库存变更 WebService static String OrderUpdateInventory(String orderId) { String result = '1'; if (String.isNotBlank(orderId)) { String FGSPStr = ''; // 获取合同的 整机/零件(询价上的) List orderList = [SELECT Id, Name, Opportunity.Machine_Parts__c FROM Order WHERE Id = :orderId limit 1]; if (orderList.size() > 0) { String machine_Parts = orderList[0].Opportunity.Machine_Parts__c; if (String.isNotBlank(machine_Parts) && 'Machine'.equals(machine_Parts)) { FGSPStr = 'FG'; } else if (String.isNotBlank(machine_Parts) && 'Parts'.equals(machine_Parts)) { FGSPStr = 'SP'; } } // 获取产品的首营状态与数量 List ordLiList = [SELECT Id, Quantity, PricebookEntry.ProductCode, Order.ProductSegment__c, PricebookEntry.Product2.NMPAStatus__c FROM OrderItem WHERE OrderId = :orderId ]; Map productQuantityMap = new Map(); for (OrderItem orderItem : ordLiList) { if ('停产'.equals(orderItem.PricebookEntry.Product2.NMPAStatus__c)) { String productSegment = orderItem.Order.ProductSegment__c == 'BS' ? 'LS' : orderItem.Order.ProductSegment__c; String managementCode = orderItem.PricebookEntry.ProductCode + '_' + productSegment + '_' + FGSPStr; Decimal quantity = orderItem.Quantity; if (productQuantityMap.containsKey(managementCode)) { quantity += productQuantityMap.get(managementCode); } productQuantityMap.put(managementCode, quantity); } } List errorList = new List(); if (productQuantityMap != null && productQuantityMap.size() > 0) { System.debug('productQuantityMap--->'+productQuantityMap); Date today = Date.today(); // 为了避免出现问题库存数量,验证只取当天的库存 List getProductInventoryList = [SELECT Id, Name,TransforDate__c, ProductCode__c, Plant__c, ProductSegment__c, ProductType__c, InventoryQuantity__c, ManagementCode__c FROM ProductInventory__c WHERE ManagementCode__c IN :productQuantityMap.keySet() AND TransforDate__c = today AND TradeType__c = 'Taxation']; if (getProductInventoryList.size() > 0) { String managementCode = ''; Decimal inventoryQuantity = 0; Decimal salesQuantity = 0; for (ProductInventory__c inventory : getProductInventoryList) { managementCode = inventory.ManagementCode__c; inventoryQuantity = inventory.InventoryQuantity__c; salesQuantity = productQuantityMap.get(managementCode); if (inventoryQuantity >= salesQuantity) { inventory.InventoryQuantity__c = inventoryQuantity - salesQuantity; productQuantityMap.put(managementCode, 0); } else { inventory.InventoryQuantity__c = 0; productQuantityMap.put(managementCode,salesQuantity-inventoryQuantity); } } for (String managementCodeStr:productQuantityMap.keySet()) { salesQuantity = productQuantityMap.get(managementCodeStr); if (salesQuantity > 0) { String productCode = productCodeFormat(managementCodeStr.split('_')[0]); String error = '产品 [ '+ productCode +' ] 库存不足,无法上传合同'; errorList.add(error); } } if (errorList.size() > 0) { result = ''; for (String error : errorList) { result += error + ';'; } } else { update getProductInventoryList; } } } } return result; } //产品编码纯数字补零 public static String productCodeFormat(String productCode){ if (productCode.startsWith('00000000000')) { productCode = productCode.substring(10); } return productCode; } //产品首营状态Z5 XHL 2021/02/07 End @TestVisible public static void testI() { integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } }