public with sharing class IDInformationAnalyseAssetController { /*****************検索用******************/ //设备型号 public String AssetModel { get; set; } //医院名称 public String HospitalName { get; set; } //医院管理编码 public String SerialNumber { get; set; } //时间 public String YearRange { get; set; } public List < ChoiceAssetDetailedInfo > choiceAssetDetailedview { get; set; } public IDInformationAnalyseAssetController(ApexPages.StandardController controller) { } public IDInformationAnalyseAssetController() { choiceAssetDetailedview = new List < ChoiceAssetDetailedInfo > (); } // 画面初始化 public void init() { choiceAssetDetailedview.clear(); } class ChoiceAssetDetailedInfo { public String HPid { get; set; } //医院ID public String HPName { get; set; } //医院名字 public String AstModel { get; set; } //设备型号 public Decimal Endoscope { get; set; } //内镜件数 public Decimal Overhaul { get; set; } //大修次数 public Decimal OverhaulPrice { get; set; } //大修报价 public Decimal OverhaulvagPrice { get; set; } //大修均价 public Integer Users { get; set; } //通电次数 public Integer CBF { get; set; } //2次修理之间内镜的使用次数 // public Integer YearVagCBF { get; set; } //年均使用例数 public Decimal YearVagCBF { get; set; } //年均使用例数 WYL add public Decimal MinuteVagCBF { get; set; } //例均分钟数 public Decimal UsersVagPrice { get; set; } //例均维修价格 } public void hospitalCount(){ choiceAssetDetailedview.clear(); List hospitalNameList = new List();//医院名称List System.debug('医院名称1:'+HospitalName); if (String.isNotBlank(HospitalName)){ for(String hospitalName :HospitalName.trim().split('[,\\,]')){ if (!hospitalNameList.contains(hospitalName)) { hospitalNameList.add(hospitalName); } } }else{ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '医院名称必须填写')); return; } system.debug('1111111111111111111111111111111医院名称'+hospitalNameList); List hospitalIDList = new List();//医院IDList if (hospitalNameList.size()>0) { List accList = [select id,name from Account where name IN : hospitalNameList]; Map accMap = new Map(); if (accList.size()>0) { for(Account acc : accList){ accMap.put(acc.Name, acc.Id); if (!hospitalIDList.contains(acc.Id)) { hospitalIDList.add(acc.Id); } } } for(String st: hospitalNameList){ if (String.isBlank(accMap.get(st))) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '医院名称:'+st+'不存在,请确认')); } } }else{ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '医院名称不存在,请确认')); } List serialNumberList = new List(); if (String.isNotBlank(SerialNumber)){ for(String SerialNumber :SerialNumber.trim().split('[,\\,]')){ if (!serialNumberList.contains(SerialNumber)) { serialNumberList.add(SerialNumber); } } } system.debug('1111111111111111111111111111111机身编码'+serialNumberList); List assetModelList = new List(); if (String.isNotBlank(AssetModel)){ for(String assetModel :AssetModel.trim().split('[,\\,]')){ if (!assetModelList.contains(assetModel)) { assetModelList.add(assetModel); } } } system.debug('1111111111111111111111111111111保有设备型号'+assetModelList); Integer yearCount = 0 ; if (String.isNotBlank(YearRange)){ yearCount = Integer.valueOf(YearRange); }else{ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '搜索年限必须填写')); } Date dateToday = Date.today(); Integer year = dateToday.year() - yearCount; Date mon1stDate = Date.newInstance(year, dateToday.month(), dateToday.day()); // 2023-10-21 WYL id信息逻辑分析 update start System.debug('搜索年限:'+mon1stDate); String soql = 'select id,name,Repair_Severity_Rank__c,Repair_List_Price_formula__c,Hospital__c,Hospital__r.Name,Cumulative_Uses__c,Cumulative_Times__c,Cycle_between_failure__c,Delivered_Product__r.Product2.Asset_Model_No__c,Product_Unique_Value__c,Average_Usage_Time__c,Difference_in_repair_intervals__c'; // soql += ' from Repair__c where Repair_Severity_Rank__c =\'大修理\' AND (Status1__c !=\'0.删除\' OR Status1__c !=\'0.取消\')'; soql += ' from Repair__c where Repair_Severity_Rank__c =\'大修理\' AND Status1__c !=\'0.删除\' And Status1__c !=\'0.取消\''; // 2023-10-21 WYL id信息逻辑分析 update end soql += 'AND createddate >= :mon1stDate '; if (assetModelList.size()>0){ soql += 'AND Delivered_Product__r.Product2.Asset_Model_No__c IN : assetModelList '; } if(hospitalIDList.size()>0){ soql += 'AND Hospital__c IN :hospitalIDList '; } if(serialNumberList.size()>0){ soql += 'AND SerialNumber__c IN :serialNumberList '; } system.debug('111111111111111111111111111SQl语句'+soql); List repairList = Database.query(soql); system.debug('111111111111111111111111111修理数量'+repairList.size()); // 2023-10-15 WYL 新增 start // 1、将查询回来的数据通过Product_Unique_Value__c进行去重 Map repairMap = new Map(); for (Repair__c r : repairList) { if(!repairMap.containsKey(r.Product_Unique_Value__c+r.Hospital__c)) { // WYL 2024-02-20 update 修复多条数据显示为空问题 start repairMap.put(r.Product_Unique_Value__c+r.Hospital__c, r.Product_Unique_Value__c); } } // 2、通过去重后的组合去修理中查询出所有的 修理 List rList = new List(repairMap.values()); List rLists = [select id, name, Cumulative_Uses__c, Cumulative_Times__c, Repair_Ordered_Date__c, Cycle_between_failure__c, Delivered_Product__c, Product_Unique_Value__c, Hospital__c // WYL 2024-02-20 update 修复多条数据显示为空问题 start from Repair__c where Cumulative_Uses__c != null and Cumulative_Times__c != null and Product_Unique_Value__c in: rList ORDER BY Repair_Ordered_Date__c Asc]; System.debug('所有数据:'+rLists); Map repairMap2 = new Map(); for (Repair__c r : rLists) { if(!repairMap2.containsKey(r.Product_Unique_Value__c+r.Hospital__c)) { // WYL 2024-02-20 update 修复多条数据显示为空问题 start repairMap2.put(r.Product_Unique_Value__c+r.Hospital__c, r.id); } } System.debug('每组第一条数据:'+repairMap2.values()); System.debug('第一条数据共有'+repairMap2.size()); // 2023-10-15 WYL 新增 end List repairIDList = new List(); //修理IDList Map repair2Map = new Map (); //存储修理ID和修理对象 List accountIDList = new List(); //医院List Map accountMap = new Map (); //存储修理ID和修理对象 if (repairList.size()>0) { for (Repair__c re : repairList){ if (!repairIDList.contains(re.Id)) { repairIDList.add(re.Id); } if (!accountIDList.contains(re.Hospital__c)) { accountIDList.add(re.Hospital__c); accountMap.put(re.Hospital__c, re.Hospital__r.Name); } repair2Map.put(re.Id, re); } } AggregateResult[] assetList = [select count(Id) ids,Delivered_Product__r.Product2.Asset_Model_No__c ass,Hospital__c from Repair__c where Id in : repairIDList group by Delivered_Product__r.Product2.Asset_Model_No__c,Hospital__c ];//统计大修修理找出保有设备型号数量 system.debug('111111111111111111111111111设备型号数量'+assetList); Map assetMap = new Map ();//设备型号和数量 List assetModelAllList = new List(); //设备型号List List hpAllList = new List(); //医院List for (AggregateResult ast : assetList){ if (!assetModelAllList.contains(String.valueOf(ast.get('Hospital__c')) +String.valueOf(ast.get('ass')))) { assetModelAllList.add(String.valueOf(ast.get('Hospital__c')) +String.valueOf(ast.get('ass'))); } if (!hpAllList.contains(String.valueOf(ast.get('Hospital__c')))) { hpAllList.add(String.valueOf(ast.get('Hospital__c'))); assetMap.put(String.valueOf(ast.get('Hospital__c')) +String.valueOf(ast.get('ass')),Integer.valueOf(ast.get('ids'))); } } system.debug('11111111111111111大修设备型号'+assetModelAllList.size()+assetModelAllList); system.debug('11111111111111111大修设备型号个数'+assetMap.size()+assetMap); Map repairCNMap = new Map ();//存储医院ID和大修次数 Map repairPRMap = new Map ();//存储医院ID和大修金额 Map repairUsesMap = new Map ();//存储医院ID和通电次数 Map repairCBFMap = new Map ();//存储医院ID和CBF Map repairCTimesMap = new Map ();//存储医院ID和通电时间 Map NumberofcasesMap = new Map ();//新增 年均使用例数 两次维修间隔的使用例数➗间隔的检查日期(之差)*365 WYL 2023-11-20 if (assetModelAllList.size()>0) { for(String ast : assetModelAllList){ Integer overhaul = 0; Decimal overhaulPrice = 0; Integer users = 0; Integer cbf = 0; Integer cumulativeTimes= 0; Integer cbfNum = 0; // 记录repairList有多少条数据为第一条数据 Integer cbfSum = 0; // 记录第一条数据的和 这部分数据不进行计算 Decimal Numberofcases = 0;// 新增 年均使用例数 两次维修间隔的使用例数➗间隔的检查日期(之差)*365 WYL 2023-11-20 Integer NumberofcasesNum = 0; if (repairList.size()>0) { for(Repair__c re : repairList){ // WYL 2024-02-20 update 修复多条数据显示为空问题 start // if (repairMap2.get(re.Product_Unique_Value__c+re.Hospital__c) == re.Id ) { // System.debug('第一条数据的打印:'+ re); // cbfSum += repair2Map.get(re.Id).Cycle_between_failure__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Cycle_between_failure__c); // cbfNum ++; // } // if (ast == repair2Map.get(re.Id).Delivered_Product__r.Product2.Asset_Model_No__c && hpAllList.contains(repair2Map.get(re.Id).Hospital__c)) { if (ast == (repair2Map.get(re.Id).Hospital__c+repair2Map.get(re.Id).Delivered_Product__r.Product2.Asset_Model_No__c )){ if (repairMap2.get(re.Product_Unique_Value__c+re.Hospital__c) == re.Id ) { System.debug('第一条数据的打印:'+ re); cbfSum += repair2Map.get(re.Id).Cycle_between_failure__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Cycle_between_failure__c); cbfNum ++; } overhaul ++ ; overhaulPrice += repair2Map.get(re.Id).Repair_List_Price_formula__c; users += repair2Map.get(re.Id).Cumulative_Uses__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Cumulative_Uses__c); cbf += repair2Map.get(re.Id).Cycle_between_failure__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Cycle_between_failure__c); // cumulativeTimes += repair2Map.get(re.Id).Cumulative_Times__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Cumulative_Times__c/60); cumulativeTimes += repair2Map.get(re.Id).Average_Usage_Time__c == null ? 0 :Integer.valueOf(repair2Map.get(re.Id).Average_Usage_Time__c); // WYL 2023-11-20 update // 新增 年均使用例数 两次维修间隔的使用例数➗间隔的检查日期(之差)*365 WYL 2023-11-20 start if (repair2Map.get(re.Id).Difference_in_repair_intervals__c != null && repair2Map.get(re.Id).Difference_in_repair_intervals__c != 0 ) { Numberofcases += repair2Map.get(re.Id).Cycle_between_failure__c == null ? 0 : repair2Map.get(re.Id).Cycle_between_failure__c/repair2Map.get(re.Id).Difference_in_repair_intervals__c * 365; NumberofcasesNum++; } // 新增 年均使用例数 两次维修间隔的使用例数➗间隔的检查日期(之差)*365 WYL 2023-11-20 end } } System.debug('共有:'+overhaul+'条数据,其中有'+cbfNum+'条数据为第一条;第一条数据的总和:'+cbfSum); repairCNMap.put(ast,overhaul); // repairPRMap.put(ast,overhaulPrice); repairPRMap.put(ast,overhaulPrice); // repairUsesMap.put(ast,users); // repairUsesMap.put(ast,cbf-cbfSum);// WYL 2024/1/10 update // if (cbf-cbfSum > 0 ) { // repairCBFMap.put(ast,(cbf-cbfSum)/(repairList.size()-cbfNum)); // repairUsesMap.put(ast,cbf-cbfSum);// WYL 2024/1/10 update // }else { // repairCBFMap.put(ast,0); // repairUsesMap.put(ast,0);// WYL 2024/1/10 update // } repairCBFMap.put(ast,(cbf-cbfSum)<=0 ? 0 : (cbf-cbfSum)/(overhaul-cbfNum)); repairUsesMap.put(ast,(cbf-cbfSum)<=0 ? 0 : cbf-cbfSum); // if (cumulativeTimes >0) { // repairCTimesMap.put(ast,cumulativeTimes/repairList.size()); // }else { // repairCTimesMap.put(ast,0); // } repairCTimesMap.put(ast,cumulativeTimes <=0 ? 0:cumulativeTimes/overhaul); // if (Numberofcases != 0 && NumberofcasesNum != 0) { // NumberofcasesMap.put(ast, Numberofcases/NumberofcasesNum); // }else { // NumberofcasesMap.put(ast, 0); // } NumberofcasesMap.put(ast, Numberofcases== 0 ? 0 : Numberofcases/NumberofcasesNum); // WYL 2024-02-20 update 修复多条数据显示为空问题 start } } } system.debug('存储医院ID和大修次数'+repairCNMap); system.debug('存储医院ID和大修金额'+repairPRMap); system.debug('存储医院ID和通电次数'+repairUsesMap); system.debug('存储医院ID和CBF'+repairCBFMap); system.debug('存储医院ID和通电时间'+repairCTimesMap); String hpAssetSring = null; Map assetCountMap = new Map ();//保有设备型号和设备数量 if (assetModelAllList.size()>0) { AggregateResult[] assetAllList = [select count(Id) ids,Product2.Asset_Model_No__c ass,Hospital__c from Asset where Id != null AND Hospital__c in : accountIDList AND Status in ('使用中','未使用','不明') group by Product2.Asset_Model_No__c,Hospital__c ];//通过医院和保有设备型号找出医院下所有的设备数量 for (AggregateResult ast : assetAllList){ hpAssetSring = String.valueOf(ast.get('Hospital__c')) + String.valueOf(ast.get('ass')); assetCountMap.put(hpAssetSring,Integer.valueOf(ast.get('ids'))); system.debug('医院11111'+hpAssetSring); system.debug('保有设备1111'+assetCountMap); } } if (accountIDList.size()>0) { for (ID acc3 : accountIDList){ if (assetModelAllList.size()>0){ for(String ast : assetModelAllList){ if (acc3 == ast.substring(0,18)){ ChoiceAssetDetailedInfo cdinfo = new ChoiceAssetDetailedInfo(); cdinfo.HPid = acc3; cdinfo.HPName = accountMap.get(acc3); cdinfo.AstModel = ast.substring(18,ast.length()); // cdinfo.Endoscope = assetCountMap.get(acc3+ast); //内镜件数 // cdinfo.Overhaul = assetMap.get(acc3+ast); //大修件数 cdinfo.Endoscope = assetCountMap.get(ast); //内镜件数 cdinfo.Overhaul = assetMap.get(ast); //大修件数 cdinfo.OverhaulPrice = repairPRMap.get(ast); //大修报价 cdinfo.OverhaulvagPrice = repairCNMap.get(ast) == 0 ? 0 : Math.ceil(repairPRMap.get(ast)/repairCNMap.get(ast)); cdinfo.Users = repairUsesMap.get(ast); cdinfo.CBF = repairCBFMap.get(ast); // cdinfo.YearVagCBF = Integer.valueOf(repairUsesMap.get(ast)/yearCount); cdinfo.YearVagCBF = Math.ceil(NumberofcasesMap.get(ast)); // WYL ID信息分析逻辑 add // cdinfo.MinuteVagCBF = repairUsesMap.get(ast) == 0 ? 0 : Integer.valueOf(repairCTimesMap.get(ast)/repairUsesMap.get(ast)); cdinfo.MinuteVagCBF = repairUsesMap.get(ast) == 0 ? 0 : Math.ceil(Decimal.valueOf(repairCTimesMap.get(ast))); cdinfo.UsersVagPrice = repairUsesMap.get(ast) == 0 ? 0 : Math.ceil(repairPRMap.get(ast)/repairUsesMap.get(ast)); if (!choiceAssetDetailedview.contains(cdinfo)) { choiceAssetDetailedview.add(cdinfo); } } } } system.debug('11111111111111111111111页面数量'+choiceAssetDetailedview.size()); } } } }