/************************************************************************************************** @Author: Denny陈帮才 @Name: EquipmentRepairBatch @CreateDate: 22/08/2022 @Description: 过去三年维修实绩 @Version 1.0 *****************************************************************************************************/ global class EquipmentRepairBatch implements Database.Batchable,Database.Stateful { public String query; public List < String > accountIdList; private BatchIF_Log__c iflog; public Date td = Date.today(); //如2022.10.15 public String OCSM_Period_half; public String OCSM_Period; public Date eTime=td.toStartOfMonth(); //如 2022.10.1 public Date sTime=eTime.addYears(-3); // 2019.10.1 public Date egdTime = Date.newInstance(td.year()+1,3,31); global EquipmentRepairBatch() { this.query = query; // OCSM_Period = 'FY'+(td.year()+1); } global EquipmentRepairBatch(List accountIdList) { this.query = query; this.accountIdList = accountIdList; // OCSM_Period = 'FY'+(td.year()+1); } global Database.QueryLocator start(Database.BatchableContext bc) { system.debug('执行start'); iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'EquipmentRepairBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; if (td.month() >= 4 && td.month() <= 9) { OCSM_Period_half = '1H'; }else{ OCSM_Period_half = '2H'; } if(td.month() >= 1 && td.month() <= 3){ OCSM_Period = 'FY'+(td.year()); }else{ OCSM_Period = 'FY'+(td.year()+1); } //2022/12/28 修改筛选条件 同步kpi设备 query ='SELECT Maintenance_Contract__c,Asset__c,Maintenance_Contract__r.Hospital__c FROM Maintenance_Contract_Asset__c WHERE Maintenance_Contract__r.RecordType.Name =\'多年保修合同\' '; System.debug(LoggingLevel.INFO, '*** query: ' + query); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list resultList) { system.debug('*** 执行execute'); System.debug(LoggingLevel.INFO, '*** 查询IF_Coverage_Target_Asset_F__c=1的保有设备Id JSON resultList: ' + JSON.Serialize(resultList)); //查询是否有维修合同 类型 分别统计维修金额 //保有设备 1.有无维修合同(字段)2. // List mids = new List(); Set mids = new Set(); //医院Id List assetHos = new List(); List AssetUpdate = new List(); Map assetMcaIdall = new Map(); Map assetMcaId = new Map(); //查询维修合同记录类型是服务合同以及服务类型的 维修合同Id 更新字段(是否有签约历史) for (Maintenance_Contract_Asset__c mcas : resultList) { assetMcaId.put(mcas.Asset__c, mcas.Maintenance_Contract__c); if (!mids.contains(mcas.Asset__c)) { AssetUpdate.add(new Asset(Id=mcas.Asset__c)); } mids.add(mcas.Asset__c); assetHos.add(mcas.Maintenance_Contract__r.Hospital__c); } //查询服务目标客户 Map targetMap = new Map(); for(Account_Service_Of_Target__c asotList:[SELECT Id ,Account_HP__c,OCSM_Period_half__c,Three_Years_Repair_Cost_Soft_Mirror__c,Three_Years_Repair_Cost_Text__c,Three_Years_Repair_Cost_Surrounding_Area__c,Three_Years_Repair_Cost_Hard_Mirror__c FROM Account_Service_Of_Target__c WHERE OCSM_Period_half__c = :OCSM_Period_half AND OCSM_Period__c = :OCSM_Period AND Account_HP__c IN:assetHos]){ targetMap.put(asotList.Account_HP__c,asotList); } //存客户服务目标对象 医院Id 后续判断 有则给Id赋值。 // Map hospMap = new Map(); // for (Account_Service_Of_Target__c ast : asotList) { // hospMap.put(ast.Account_HP__c,ast); // } //最后upsert客户服务目标对象 list目标 List asslist = new List(); //保有设备为单位 过去三年维修实绩 Map ThreeYearPriceSumMap = new Map(); //过去三年维修实际 2022/10/13 修改 为当前时间的上一个月最后一天 往前推三年 for(Repair__c rp :[SELECT Hospital__c,PurchaseOrInstallationDate__c,Repair_List_Price_formula__c,Delivered_Product__c FROM Repair__c WHERE Delivered_Product__c in:mids AND Repair_List_Price_formula__c !=null AND Repair_List_Price_formula__c!=0 AND Status1__c!='0.删除' AND Status1__c!='0.取消' AND Status2__c!='00.删除' AND Status2__c!='00.取消' AND Agreed_Date__c >=:sTime AND Agreed_Date__c <:eTime ]){ Date purDate = rp.PurchaseOrInstallationDate__c; if(purDate!=null){ Decimal bDay = purDate.daysBetween(eTime); Decimal hmoney = 0; if(bDay < 0){ bDay *=-1; } //设备年龄不足三年的 按平均每天计算 再乘 365 再乘 3 if((bDay < 365*3) && bDay>0){ hmoney = (rp.Repair_List_Price_formula__c / bDay) *365*3; }else{ hmoney = rp.Repair_List_Price_formula__c / 3; } if(ThreeYearPriceSumMap.containsKey(rp.Delivered_Product__c)){ ThreeYearPriceSumMap.put(rp.Delivered_Product__c, ThreeYearPriceSumMap.get(rp.Delivered_Product__c)+hmoney); }else{ ThreeYearPriceSumMap.put(rp.Delivered_Product__c, hmoney); } } } //以医院为对象存储医院所有保有设备List // Map> aMapLists = new Map>(); // for (Asset assertItem : resultList) { for (Asset assertItem : AssetUpdate) { //更新字段:执行中的合同 // if(assetMcaIdall.containsKey(assertItem.Id)){ // assertItem.Maintenance_Contract__c = assetMcaId.get(assertItem.Id); // } //更新字段:是否有签约历史 if(assetMcaId.containsKey(assertItem.Id)){ assertItem.Is_Has_Contract_History__c = '1'; }else{ assertItem.Is_Has_Contract_History__c = '0'; } if(ThreeYearPriceSumMap.containsKey(assertItem.Id)){ assertItem.Three_Years_Repair_Cost_Text__c = ThreeYearPriceSumMap.get(assertItem.Id); assertItem.IF_Maintenance_Equipment__c = 'Y'; } } update AssetUpdate; System.debug(LoggingLevel.INFO, '*** updated AssetUpdate: ' + AssetUpdate); } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\nEquipmentRepairBatch end'; String tmp = iflog.ErrorLog__c; if (tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } update iflog; } }