/** * wangweipeng 2021/08/04 * 打印点检计划报告书的pdf */ public without sharing class PrintInspectupReportPDFController { public String loginPerson{get;set;}//当前登录人id public String loginPersonName{get;set;}//当前登录人名字 public String parameter{get;set;}//父页面传过来的参数 public String produceText {get;set;}//生成类型 public String assetType{get;set;}//保有设备类型 public List assetList{get;set;}//保有设备具体内容 public Boolean isPaging{get;set;}//是否分页 public Boolean activeOn {get;set;}//洗消信息 public List inspectupPlanIdList {get;set;}//点检计划id public String maintenanceContractId{get;set;}//合同id public Integer pageCnt{get;set;}//如果分页,那么需要分几页 //维修合同信息 public Maintenance_Contract__c maintenanceContract{get;set;} //洗消信息 public Maintenance_Contract__c InspectionReportData{get;set;} //产品信息和产品点检信息 public List> listData{get;set;} //key public List inspectupPlanKey{get;set;} //是否展示结果 public Boolean resultFlag{get;set;} public PrintInspectupReportPDFController() { //获取当前登录人id loginPerson = (Userinfo.getUserId()).substring(0,15); //获取当前登录人中文名 loginPersonName = Userinfo.getName(); //获取参数 parameter = System.currentPageReference().getParameters().get('parameter'); maintenanceContractId = '';//合同id produceText = '';//生成类型 inspectupPlanIdList = new List();//点检信息 listData = new List>(); maintenanceContract = new Maintenance_Contract__c(); InspectionReportData = new Maintenance_Contract__c(); inspectupPlanKey = new List(); assetList = new List(); assetType = ''; activeOn = false; isPaging = false; pageCnt = 0; } public PageReference init(){ //获取参数 getParameterData(); try{ //获取合同数据 String maintenanceContractSQL = makeTextMaintenanceContractSQl(); List mcList = new List(); mcList = Database.query(maintenanceContractSQL); if (mcList.size() > 0) { maintenanceContract = mcList[0]; InspectionReportData = mcList[0]; } //首先点检计划 String inspectupPlanSQl = makeTextInspectupPlanSQl(); List inspectupPlanList = Database.query(inspectupPlanSQl); //存放点检技术的id List inspectupPlanId = new List(); if(inspectupPlanList != null && inspectupPlanList.size() > 0){ for(Integer i = 0;i< inspectupPlanList.size();i++){ inspectupPlanId.add(inspectupPlanList[i].Id); inspectupPlanKey.add(inspectupPlanList[i].Chack_Plan_NO__c+'次点检日'); } } //获取点检报告书 List inspectionReportList =new List(); List inspectionReportId = new List(); if(inspectupPlanId.size() > 0){ String inspectionReportSQl = makeTextInspectionReportSQl(inspectupPlanId); inspectionReportList = Database.query(inspectionReportSQl); //存放点检报告书id if(inspectionReportList != null && inspectionReportList.size() > 0){ for(Integer i =0;i< inspectionReportList.size();i++){ inspectionReportId.add(inspectionReportList[i].Id); } } } //获取点检报告书明细,包括设备明细 List inspectionItemList = new List(); if(inspectionReportId.size()>0){ String inspectionItemSQl = makeTestInspectionItemSQl(inspectionReportId); inspectionItemList = Database.query(inspectionItemSQl); } //获取维修合同设备信息 String maintenanceContractAssetSQl = makeTestMaintenanceContractAsset(); List maintenanceContractAssetList = new List(); maintenanceContractAssetList = Database.query(maintenanceContractAssetSQl); if(maintenanceContractAssetList != null && maintenanceContractAssetList.size() > 0){ //分组把保有设备分组 //由于客户需要有分页功能,所以要首先要进行分组,查询每页展示的是那种类型的数据 //如果客户没有选择分页,那么就把所有数据放到第一页里面 List assetNameList = new List(); //isPaging 是否分页(只有战略科室、科室和装机地点可以分页) //assetList 如果有值,那么证明需要根据里面的数据进行分页 if(isPaging && assetList.size() > 0){ //循环 维修合同/保有设备 for(Maintenance_Contract_Asset__c mcac : maintenanceContractAssetList){ String grouping = ''; //assetType 根据那种类型进行分页 if('1'.equals(assetType)){//战略科室分组 grouping = mcac.Asset__r.Acc_Department_Class_Name__c; }else if('2'.equals(assetType)){//科室分组 grouping = mcac.Asset__r.Department_Name__c; }else if('3'.equals(assetType)){//装机地点分组 grouping = mcac.Asset__r.Installation_Site__c; } if(assetNameList.size() > 0){ //用于判断在 assetNameList 分组的集合里面是否有重复的 boolean assetNameFlag = true; for(String anl : assetNameList){ if(anl == grouping){ assetNameFlag = false; } } if(assetNameFlag){ if(grouping != ''){ assetNameList.add(grouping); } } }else{ if(grouping != ''){ assetNameList.add(grouping); } } } } //不需要分页那么循环一回数据 //如果 assetNameList 有数据,那么证明是需要给保有设备分页 //如果没有数据,证明不需要分页,所以只循环一回就可以 boolean falg = true; integer indexA = 0; integer indexSize = assetNameList.size();//用于还需要循环几次 while(indexSize > 0 || falg){ falg = false; if(indexSize > 0){ indexSize--; } //存放每一页的数据 List onePageList = new List(); //首先循环设备 for(Maintenance_Contract_Asset__c mcac : maintenanceContractAssetList){ //存放一条数据 DataObject dObj = new DataObject(inspectupPlanIdList); //设备名称 String assetName = mcac.Asset__r.name; //由于pdf 页面的宽度有限,那么设备名称太长的话会把表格撑大,所以需要截取换行 //目前设定名字长度超过 14个字符时,换行 if(assetName != null && assetName != ''){ if(assetName.length() > 14){ assetName = assetName.substring(0,13)+' \n ' + assetName.substring(13,assetName.length()); } } //设备编码 String assetNumber = mcac.Asset__r.SerialNumber; dObj.deviceName = assetName; dObj.serialNumber = assetNumber; //判断是否需要分页 if(isPaging && assetList.size() > 0){ if('1'.equals(assetType)){//战略科室分组 if(assetNameList.size() <= 0 || assetNameList[indexA] != mcac.Asset__r.Acc_Department_Class_Name__c){ continue; } }else if('2'.equals(assetType)){//科室分组 if(assetNameList.size() <= 0 || assetNameList[indexA] != mcac.Asset__r.Department_Name__c){ continue; } }else if('3'.equals(assetType)){//装机地点分组 if(assetNameList.size() <= 0 || assetNameList[indexA] != mcac.Asset__r.Installation_Site__c){ continue; } } } //判断是第几个点检,我们设定最多只能显示4次点检计划 integer index = 0; //循环点检计划 for(Inspectup_Plan__c ipc : inspectupPlanList){ index++; //由于一个设备可能在一个点检计划中多次使用,所以我们只需要获取最新的一个就可以 //获取到最新的以后,其他的就不需要了 boolean facilityFalg = false; //循环点检报告书 for(Inspection_Report__c irc:inspectionReportList){ //跳出循环,我们已经获取到当前设备当前点检计划的最新的结果和检测日 if(facilityFalg){ break; } String inspectupPlan = irc.Inspectup_Plan__c; //判断是否是当前点检计划的报告书吗 if(ipc.id == inspectupPlan){ //循环点检报告书明细 for(Inspection_Item__c iic : inspectionItemList){ //判断是否是当前的报告书明细 if(irc.id == iic.Inspection_ReportId__c){ String iicAssetId = iic.AssetId__c; //设备id String assetId = mcac.Asset__c; if(iicAssetId != '' && iicAssetId != null && assetId != null && assetId != ''){ iicAssetId = iicAssetId.substring(0,15); assetId = assetId.substring(0,15); if(assetId == iicAssetId){//查看设备是否一样 facilityFalg = true; if(irc.Inspection_Date__c != null){ if(index == 1){ dObj.spotCheck1 = String.valueOf(irc.Inspection_Date__c); }else if(index == 2){ dObj.spotCheck2 = String.valueOf(irc.Inspection_Date__c); }else if(index == 3){ dObj.spotCheck3 = String.valueOf(irc.Inspection_Date__c); }else if(index == 4){ dObj.spotCheck4 = String.valueOf(irc.Inspection_Date__c); } } if(resultFlag){//判断是否需要结果值 if(iic.ItemStatus__c != '' && iic.ItemStatus__c != null){ if(index == 1){ dObj.spocCheckResult1 = iic.ItemStatus__c; }else if(index == 2){ dObj.spocCheckResult2 = iic.ItemStatus__c; }else if(index == 3){ dObj.spocCheckResult3 = iic.ItemStatus__c; }else if(index == 4){ dObj.spocCheckResult4 = iic.ItemStatus__c; } } } //跳出循环,我们已经获取到当前设备当前点检计划的最新的结果和检测日 if(facilityFalg){ break; } } } } } } } } onePageList.add(dObj); } indexA++; listData.add(onePageList); } } }catch(exception e){ //失败提示 ApexPages.addMessages(e); } return null; } //获取参数的值 //参数时一个字符串,使用 ,, 两个逗号分割 //第一个参数: 是否空白单据 //第二个参数:设备的限制,分为战略科室、科室、装机地点和机身号 //第三个参数: 如果第二个参数为战略科室、科室和装机地点,那么就需要选择是那些具体的科室或地点 //第四个参数: 如果第二个参数为战略科室、科室和装机地点 那么是可以分页的 //第五个参数:是否需要展示 洗消信息条件 //第六个参数:点检计划 //第七个参数:维修合同id public void getParameterData(){ if(parameter != null && parameter != ''){ List parameterList = parameter.split(',,'); if(parameterList != null && parameterList.size() == 7){ produceText = parameterList[0];//生成类型 //控制结果是否展示 if('1'.equals(produceText)){//空白单据 resultFlag = false; }else if('2'.equals(produceText)){//合同全部 resultFlag = true; }else{ resultFlag = false; } //类型 //设备 1、战略科室 2、装机地点 3和机身号 4 assetType = parameterList[1]; if(assetType != '' && assetType != null){ //如果为机身号,那么不需要分页和控制设备的科室不需要 if(!'4'.equals(assetType)){ //科室、战略科室和装机地点的具体内容 String assetStr = parameterList[2]; if(assetStr != '' && assetStr != null){ if(assetStr.indexOf(',') != -1){ assetList = assetStr.split(','); }else{ assetList.add(assetStr); } pageCnt = assetList.size(); } //是否分页 String isPagingStr = parameterList[3]; if(isPagingStr == 'true'){ isPaging = true; } } } //洗消信息 String falgStr = parameterList[4]; if(falgStr == 'true'){ activeOn = true; } //点检计划id String inspectupPlan = parameterList[5]; if(inspectupPlan != null && inspectupPlan != ''){ if(inspectupPlan.indexOf(',') != -1){ inspectupPlanIdList = inspectupPlan.split(','); }else{ inspectupPlanIdList.add(inspectupPlan); } } maintenanceContractId = parameterList[6];//合同id } } } //查询合同单信息 public String makeTextMaintenanceContractSQl(){ String maintenanceContractSQL = 'SELECT ID,NAME,Hospital__c,Hospital__r.Name,Department__c,Department__r.Name,Maintenance_Contract_No__c ' +' ,CleaningFluid__c,SterilizationMethod__c,Remarks__c,Disinfectant__c,UsedMachine__c,Used_ET__c,Mode__c' +' FROM Maintenance_Contract__c WHERE id = :maintenanceContractId '; return maintenanceContractSQL; } //获取点检计划 public String makeTextInspectupPlanSQl(){ String inspectupPlanSQl = 'select id,name,Chack_Plan_NO__c from Inspectup_Plan__c where Maintenance_Contract__c = :maintenanceContractId and id in :inspectupPlanIdList '; return inspectupPlanSQl; } //获取点检报告书 //根据检测日时从大到小排序,如果检测日相同,再根据申请日排序 public String makeTextInspectionReportSQl(List inspectupPlanId){ String inspectionReportSQl = 'SELECT ID,NAME,Contract__c,Inspectup_Plan__c,Others__c,Contract__r.name,Inspection_Date__c,CleaningFluid__c,Mode__c,SterilizationMethod__c,Remarks__c,Disinfectant__c,UsedMachine__c,Used_ET__c ' + ' from Inspection_Report__c where Inspectup_Plan__c in :inspectupPlanId and Status__c = \'批准\' ' + ' order by Inspection_Date__c desc,Submit_date__c desc'; return inspectionReportSQl; } //获取点检报告书明细 public String makeTestInspectionItemSQl(List inspectionReportId){ String inspectionItemSQl = 'select id,name,ItemStatus__c,AssetId__c,AssetId__r.name,SerialNumber__c,Inspection_ReportId__c from Inspection_Item__c ' + ' where Inspection_ReportId__c in :inspectionReportId '; return inspectionItemSQl; } //获取点检的设备 //Check_object__c = true and public String makeTestMaintenanceContractAsset(){ String maintenanceContractAssetSQl = 'select id,name,Asset__c,Asset__r.name,Asset__r.SerialNumber,Asset__r.Strategic_department_Class_Name__c,Asset__r.Acc_Department_Class_Name__c,Asset__r.Department_Name__c,Asset__r.Installation_Site__c ' +' from Maintenance_Contract_Asset__c ' +' where Maintenance_Contract__c = :maintenanceContractId and isdianjian__c != 0 '; //保有设备的筛选条件 if(assetType != '' && assetType != null){ //战略科室 if('1'.equals(assetType)){ if(assetList != null && assetList.size() > 0){ maintenanceContractAssetSQl += ' and Asset__r.Acc_Department_Class_Name__c in :assetList '; } }else if('2'.equals(assetType)){//科室 if(assetList != null && assetList.size() > 0){ maintenanceContractAssetSQl += ' and Asset__r.Department_Name__c in :assetList '; } }else if('3'.equals(assetType)){//装机地点 if(assetList != null && assetList.size() > 0){ maintenanceContractAssetSQl += ' and Asset__r.Installation_Site__c in :assetList '; } }else if('4'.equals(assetType)){//机身号 } //是否需要分页 if(isPaging){ if('1'.equals(assetType)){//战略科室分页 maintenanceContractAssetSQl += ' order by Asset__r.Acc_Department_Class_Name__c desc '; }else if('2'.equals(assetType)){//科室分页 maintenanceContractAssetSQl += ' order by Asset__r.Department_Name__c desc '; }else if('3'.equals(assetType)){//装机地点分页 maintenanceContractAssetSQl += ' order by Asset__r.Installation_Site__c desc '; }else{ maintenanceContractAssetSQl += ' order by Asset__r.Acc_Department_Class_Name__c desc,Asset__r.Department_Name__c desc '; } }else{ maintenanceContractAssetSQl += ' order by Asset__r.Acc_Department_Class_Name__c desc,Asset__r.Department_Name__c desc '; } }else{ maintenanceContractAssetSQl += ' order by Asset__r.Acc_Department_Class_Name__c desc,Asset__r.Department_Name__c desc '; } return maintenanceContractAssetSQl; } /** * 为了方便前段table获取值 */ class DataObject { public String deviceName{ get; private set; }//产品名 public String serialNumber{ get; private set; }//机身号 public String spotCheck1{ get; private set; }//点检1 public String spocCheckResult1{get;set;}//结果1 public String spotCheck2{ get; private set; }//点检2 public String spocCheckResult2{get;set;}//结果2 public String spotCheck3{ get; private set; }//点检3 public String spocCheckResult3{get;set;}//结果3 public String spotCheck4{ get; private set; }//点检4 public String spocCheckResult4{get;set;}//结果4 public DataObject(){ deviceName = ' '; serialNumber = ' '; } //全部初始化一下,用于占位 public DataObject(List inspectupPlanIdList) { deviceName = ' '; serialNumber = ' '; if(inspectupPlanIdList != null && inspectupPlanIdList.size() > 0){ //控制初始化几个点检计划 if(inspectupPlanIdList.size() >= 1){ spotCheck1 = ' '; spocCheckResult1 = ' '; } if(inspectupPlanIdList.size() >= 2){ spotCheck2 = ' '; spocCheckResult2 = ' '; } if(inspectupPlanIdList.size() >= 3){ spotCheck3 = ' '; spocCheckResult3 = ' '; } if(inspectupPlanIdList.size() == 4){ spotCheck4 = ' '; spocCheckResult4 = ' '; } } } } }