public with sharing class AccountCaseTabController { private static integer SECTIONMAX = 14; private static integer FIELDMAX = 100; private Account dept; private OFSHospitalLayout__c layout; private Map layoutMap; private Map layoutFieldMap; public HistoryBean history { get; set; } public String accId { get; private set; } public Boolean refreshAll { get; private set; } public Boolean dupliErr { get; private set; } public List ocmOptions { get; private set; } // public List ocmYearOptions { get; private set; } public List ocmYearOptions { get; private set; } public Map RecordTypeMap; public AccountCaseTabController() { refreshAll = false; dupliErr = false; ocmOptions = new List(); // ocmYearOptions = new List(); ocmYearOptions = new List(); history = null; layout = new OFSHospitalLayout__c(); layoutMap = OFSHospitalLayout__c.getAll(); if (layoutMap.values().size() <= 0) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '无法获取自定义设置')); return; } Schema.DescribeSobjectResult acl = OFSHospitalLayout__c.sObjectType.getDescribe(); layoutFieldMap = acl.fields.getMap(); } public void init() { RecordTypeMap = new Map(); RecordTypeMap.put('Department_Class_GI','01210000000QmhoAAC');//戦略科室分類 消化科 RecordTypeMap.put('Department_Class_ET','01210000000QmhoAAC');//戦略科室分類ET RecordTypeMap.put('Department_Class_BF','01210000000QmhyAAC');//戦略科室分類 呼吸科 RecordTypeMap.put('Department_Class_GS','01210000000QmvDAAS');//戦略科室分類 普外科 RecordTypeMap.put('Department_Class_URO','01210000000QmutAAC');//戦略科室分類 泌尿科 RecordTypeMap.put('Department_Class_GYN','01210000000QmuyAAC');//戦略科室分類 婦人科 RecordTypeMap.put('Department_Class_ENT','01210000000Qmv3AAC');//戦略科室分類 耳鼻喉科 RecordTypeMap.put('Department_Class_OTH','01210000000Qmv8AAC');//戦略科室分類 その他 String recordId = System.currentPageReference().getParameters().get('id'); accId = System.currentPageReference().getParameters().get('accid'); dept = [select Id, ParentId, RecordType.DeveloperName from Account where Id = :accId]; for (OFSHospitalLayout__c setting : layoutMap.values()) { if ('AccountCase_' + dept.RecordType.DeveloperName == setting.recordType_devName__c) { layout = setting; } } if (layout.Id == null) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '无法获取自定义设置')); return; } // 今年±1期のみを出す Date dateToday = Date.today(); Integer year = dateToday.year(); Integer month = dateToday.month(); if (month < 4) { year -= 1; } // OCM期、画面からremoveするデータを設定 Schema.DescribeFieldResult fieldResult = Account_Number_of_case__c.OCM_Period__c.getDescribe(); List ple = fieldResult.getPicklistValues(); for(Schema.PicklistEntry f : ple) { if (f.getValue() == String.valueOf(year - 1867 - 1 + 'P') || f.getValue() == String.valueOf(year - 1867 + 'P') || f.getValue() == String.valueOf(year - 1867 + 1 + 'P')) { continue; } ocmOptions.add(f.getValue()); } // OCM年度、画面からremoveするデータを設定 Schema.DescribeFieldResult fieldResultYear = Account_Number_of_case__c.OCM_Year__c.getDescribe(); List pley = fieldResultYear.getPicklistValues(); /* for(Schema.PicklistEntry f : pley) { if (f.getValue() == String.valueOf(year - 1 + '年度') || f.getValue() == String.valueOf(year + '年度') || f.getValue() == String.valueOf(year + 1 + '年度')) { continue; } ocmYearOptions.add(f.getValue()); } */ ocmYearOptions.add(new SelectOption(String.valueOf(year - 1 + '年度'),String.valueOf(year - 1 + '年度'))); ocmYearOptions.add(new SelectOption(String.valueOf(year + '年度'),String.valueOf(year + '年度'))); ocmYearOptions.add(new SelectOption(String.valueOf(year + 1 + '年度'),String.valueOf(year + 1 + '年度'))); if (String.isBlank(recordId) == true) { List tmpList = Database.query(this.makeSoql2()); if (tmpList.size() > 0) { //history = new HistoryBean(tmpList[0].clone(false, true), layout, layoutFieldMap); history = new HistoryBean(new Account_Number_of_case__c(), layout, layoutFieldMap); //history.rec.OCM_Period__c = null; //history.rec.OCM_Year__c = null; } else { history = new HistoryBean(new Account_Number_of_case__c(), layout, layoutFieldMap); } history.rec.unique_key__c = null; } else { selectData(recordId); } } // 重複エラーが発生する時、js alertを出し、+タブを消すため、画面リフレッシュ必要 // 正常で終了する時、新規追加されたタブを出すため、画面リフレッシュ必要 // 合わせて、refreshAllフラグを設定 public void save() { Savepoint sp = Database.setSavepoint(); try { // 新規 if (history.rec.Id == null) { history.rec.OCM_Period__c = changeY2P(history.rec.OCM_Year__c); /* // 重複チェック List tmp = [select Id from Account_Number_of_case__c where Account__c = :accId and OCM_Period__c = :history.rec.OCM_Period__c]; if (tmp.size() > 0) { // recordId = tmp[0].Id; dupliErr = true; refreshAll = true; return; } */ history.rec.RecordTypeid = RecordTypeMap.get(dept.RecordType.DeveloperName); history.rec.Account__c = dept.Id; history.rec.Account_HP__c = dept.ParentId; //20211210 lt start //ESD Decimal esdup = 0; Decimal esddown = 0; Decimal esd = 0; if(history.rec.ESD_UpNumber__c != null){ esdup = history.rec.ESD_UpNumber__c; } if(history.rec.ESD_DownNumber__c != null){ esddown = history.rec.ESD_DownNumber__c; } if(history.rec.ESD_Number__c != null){ esd = history.rec.ESD_Number__c; } history.rec.ESD_AddNumber__c = esdup + esddown + esd; //EUS Decimal eusup = 0; Decimal eusdown = 0; Decimal eus = 0; if(history.rec.EUS_UpNumber__c != null){ eusup = history.rec.EUS_UpNumber__c; } if(history.rec.EUS_DownNumber__c != null){ eusdown = history.rec.EUS_DownNumber__c; } if(history.rec.EUS_Number__c != null){ eus = history.rec.EUS_Number__c; } history.rec.EUS_AddNumber__c = eusup + eusdown + eus; //ERCP Decimal ercpup = 0; Decimal ercpdown = 0; Decimal ercp = 0; if(history.rec.ERCP_UpNumber__c != null){ ercpup = history.rec.ERCP_UpNumber__c; } if(history.rec.ERCP_DownNumber__c != null){ ercpdown = history.rec.ERCP_DownNumber__c; } if(history.rec.ERCP_Number__c != null){ ercp = history.rec.ERCP_Number__c; } history.rec.ERCP_AddNumber__c = ercpup + ercpdown + ercp; //20211210 lt end insert history.rec; refreshAll = true; } // 更新 else { history.rec.OCM_Period__c = changeY2P(history.rec.OCM_Year__c); //20211210 lt start //ESD Decimal esdup = 0; Decimal esddown = 0; Decimal esd = 0; if(history.rec.ESD_UpNumber__c != null){ esdup = history.rec.ESD_UpNumber__c; } if(history.rec.ESD_DownNumber__c != null){ esddown = history.rec.ESD_DownNumber__c; } if(history.rec.ESD_Number__c != null){ esd = history.rec.ESD_Number__c; } history.rec.ESD_AddNumber__c = esdup + esddown + esd; //EUS Decimal eusup = 0; Decimal eusdown = 0; Decimal eus = 0; if(history.rec.EUS_UpNumber__c != null){ eusup = history.rec.EUS_UpNumber__c; } if(history.rec.EUS_DownNumber__c != null){ eusdown = history.rec.EUS_DownNumber__c; } if(history.rec.EUS_Number__c != null){ eus = history.rec.EUS_Number__c; } history.rec.EUS_AddNumber__c = eusup + eusdown + eus; //ERCP Decimal ercpup = 0; Decimal ercpdown = 0; Decimal ercp = 0; if(history.rec.ERCP_UpNumber__c != null){ ercpup = history.rec.ERCP_UpNumber__c; } if(history.rec.ERCP_DownNumber__c != null){ ercpdown = history.rec.ERCP_DownNumber__c; } if(history.rec.ERCP_Number__c != null){ ercp = history.rec.ERCP_Number__c; } history.rec.ERCP_AddNumber__c = ercpup + ercpdown + ercp; //20211210 lt end update history.rec; selectData(history.rec.Id); } ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '保存完了。')); } catch (Exception ex) { Database.rollback(sp); ApexPages.addMessages(ex); } } private String changeY2P(String ocmYear) { Integer y = Integer.valueOf(ocmYear.substring(0, 4)); return y - 1867 + 'P'; } private void selectData(String recordId) { List tmpList = Database.query(this.makeSoql(recordId)); if (tmpList.size() > 0) { history = new HistoryBean(tmpList[0], layout, layoutFieldMap); } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '没有数据。')); } } private String makeSoql(String recordId) { Schema.DescribeSobjectResult d = Account_Number_of_case__c.sObjectType.getDescribe(); Map fieldMap = d.fields.getMap(); String soql = 'select '; String fields = ''; for (String field : fieldMap.keySet()) { if (fields.length() > 0) { fields += ', '; } fields += field; } soql += fields; soql += ' from Account_Number_of_case__c where Id = :recordId'; return soql; } private String makeSoql2() { Schema.DescribeSobjectResult d = Account_Number_of_case__c.sObjectType.getDescribe(); Map fieldMap = d.fields.getMap(); String soql = 'select '; String fields = ''; for (String field : fieldMap.keySet()) { if (fields.length() > 0) { fields += ', '; } fields += field; } soql += fields; soql += ' from Account_Number_of_case__c where Account__c = \'' + this.accId + '\'' + ' order by OCM_Period__c desc limit 1'; return soql; } public class HistoryBean { public Account_Number_of_case__c rec { get; set; } public List dataList { get; set; } public HistoryBean(Account_Number_of_case__c record, OFSHospitalLayout__c layout, Map layoutFieldMap) { rec = record; dataList = new List(); Map sectionMap = new Map(); for (Integer i = 1; i <= SECTIONMAX; i++) { String strI = 'section' + i + '__c'; if (layoutFieldMap.containsKey(strI) == false) continue; String sectionStr = String.valueOf(layout.get(strI)); if (String.isBlank(sectionStr) == false) { SectionBean sb = new SectionBean(sectionStr); sectionMap.put(sb.id, sb); } } for (Integer i = 1; i <= FIELDMAX; i++) { String strI = 'field' + i + '__c'; if (layoutFieldMap.containsKey(strI) == false) continue; String fieldStr = String.valueOf(layout.get(strI)); if (String.isBlank(fieldStr) == false) { FieldBean fb = new FieldBean(fieldStr); if (sectionMap.containsKey(fb.sectionId)) { dataList.add(new OutputData(record, sectionMap.get(fb.sectionId), fb)); } } } // 整形、rowspan設定 String tmplvl1 = ''; String tmplvl2 = ''; Integer rowspan1 = 0; Integer rowspan2 = 0; Integer lvl1Cnt = 1; Integer lvl2Cnt = 1; for (Integer i = 0; i < dataList.size(); i++) { if (i == 0) { tmplvl1 = dataList[i].sb.title; tmplvl2 = dataList[i].fb.parentLabel; } // section変わった時、全リセット if (i != 0 && tmplvl1 != dataList[i].sb.title) { tmplvl1 = dataList[i].sb.title; tmplvl2 = dataList[i].fb.parentLabel; dataList[i - rowspan1].lvl1Rowspan = rowspan1; dataList[i - rowspan2].lvl2Rowspan = rowspan2; rowspan1 = 0; rowspan2 = 0; lvl1Cnt++; lvl2Cnt++; } // 中分類変わった時、中分類のみリセット if (i != 0 && tmplvl2 != dataList[i].fb.parentLabel) { tmplvl2 = dataList[i].fb.parentLabel; dataList[i - rowspan2].lvl2Rowspan = rowspan2; rowspan2 = 0; lvl2Cnt++; } dataList[i].lvl1Idx = lvl1Cnt + ''; dataList[i].lvl2Idx = lvl1Cnt + '_' + lvl2Cnt; rowspan1++; rowspan2++; } if (rowspan1 > 0) { dataList[dataList.size() - rowspan1].lvl1Rowspan = rowspan1; } if (rowspan2 > 0) { dataList[dataList.size() - rowspan2].lvl2Rowspan = rowspan2; } } } class OutputData { public Account_Number_of_case__c rec { get; set; } public SectionBean sb { get; private set; } public FieldBean fb { get; private set; } public Integer lvl1Rowspan { get; private set; } public Integer lvl2Rowspan { get; private set; } public String lvl1Idx { get; set; } public String lvl2Idx { get; set; } public OutputData(Account_Number_of_case__c record, SectionBean sb, FieldBean fb) { this.rec = record; this.sb = sb; this.fb = fb; lvl1Rowspan = 0; lvl2Rowspan = 0; lvl1Idx = ''; lvl2Idx = ''; } } class SectionBean { public String title { get; private set; } public String id { get; private set; } public SectionBean(String jsonSection){ Map m = (Map) JSON.deserializeUntyped(jsonSection); id = String.valueOf(m.get('id')); title = String.valueOf(m.get('title')); } } class FieldBean { public String label { get; private set; } public String parentLabel { get; private set; } public String sectionId { get; private set; } public String apiNum { get; private set; } public String apiPrice { get; private set; } public FieldBean(String jsonField) { Map m = (Map) JSON.deserializeUntyped(jsonField); label = String.valueOf(m.get('label')); parentLabel = String.valueOf(m.get('parentLabel')); sectionId = String.valueOf(m.get('sectionId')); apiNum = String.valueOf(m.get('apiNum')); apiPrice = String.valueOf(m.get('apiPrice')); if (String.isBlank(apiPrice)) { apiPrice = 'false'; } } } }