public class SelectProduct2Extension { /*****************親オブジェクトID******************/ public String productMaterialId { get; set; } public String productDocMiddleId { get; set; } public String productCICId { get; set; } /*****************検索用******************/ public Product2 pro { get; set; } public String family { get; set; } public String category2 { get; set; } public String category3 { get; set; } public String category4 { get; set; } public String category5 { get; set; } public String assetModelNo { get; set; } public String multiStatus { get; set; } /*****************画面表示Bean******************/ public List productRecords { get; set; } public Integer productCount { get; set; } //public String proCntText = null; //public String getProCntText() { // return (productCount > 0) ? '共有' + productCount + '件产品' : ''; //} public String saveType { get; set; } /*****************ソートキー******************/ public String sortKey { get; set; } public String preSortKey { get; set; } public Boolean sortOrderAsc { get; set; } public String[] sortOrder { get; set; } public String[] columus = new String[]{ 'Asset_Model_No__c', 'MDM_Name__c', 'OT_CODE_no_link__c', 'Family', 'SFDA_Status__c', 'Category2__c', 'Category3__c', 'Category4__c', 'Category5__c' }; private List productSelected = new List(); private List productIds = new List(); private Map selectedIdMap = new Map(); /*****************ソート時再検索条件(画面からの入力条件を無視するため)******************/ private String nameForSort = null; private String cate1ForSort = null; private String cate2ForSort = null; private String cate3ForSort = null; private String cate4ForSort = null; private String cate5ForSort = null; private String statusForSort = null; private Integer productSelectLimitDisplay = Integer.valueOf(Label.Product_Select_Limit) - 1; public SelectProduct2Extension() { productRecords = new List(); productMaterialId = ApexPages.currentPage().getParameters().get('pmid'); productDocMiddleId = ApexPages.currentPage().getParameters().get('pdmid'); productCICId = ApexPages.currentPage().getParameters().get('cicid'); pro = [select Id, Family from Product2 limit 1]; // TODO Describeで対応? //Schema.DescribeFieldResult f = Product2.Family.getDescribe(); } public void init() { // 選択済みの資料対象製品を取得 this.makeProductIds(); // 選択済みの製品を取得 productSelected = [select Id, Name, MDM_Name__c, OT_CODE_no_link__c, Family, SFDA_Status__c, Asset_Model_No__c, Intra_Trade_List_RMB__c, Foreign_Trade_List_US__c, Category2__c, Category3__c, Category4__c, Category5__c from Product2 where Id in :productIds order by Asset_Model_No__c]; for (Integer i = 0; i < productSelected.size(); i++) { // 501を超えた場合前500のみを出す if (i == productSelectLimitDisplay) continue; productRecords.add(new Product2Info(productSelected[i])); productRecords[i].check = true; productRecords[i].oldCheck = true; selectedIdMap.put(productSelected[i].Id, productSelected[i].Id); } productCount = productRecords.size(); if (productCount > productSelectLimitDisplay) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '数据超过' + productSelectLimitDisplay + '件,只显示前' + productSelectLimitDisplay + '件')); } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有' + productCount + '件产品')); } //this.sortKey = '0'; //this.preSortKey = '0'; //this.sortOrderAsc = true; //this.sortOrder = new String[9]; //this.sortOrder = new String[]{ '↑', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; } public void searchProduct() { if (String.isBlank(family) && String.isBlank(category2) && String.isBlank(category3) && String.isBlank(category4) && String.isBlank(category5) && String.isBlank(assetModelNo) && String.isBlank(multiStatus)) { return; } productRecords = new List(); String soql = this.makeSoql(family, category2, category3, category4, category5, assetModelNo, multiStatus); soql += ' order by Asset_Model_No__c limit ' + Label.Product_Select_Limit; List queryList = Database.query(soql); // 選択済みの製品を取得 productIds = new List(); this.makeProductIds(); //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, 'productIds::' + productIds.size() + '件产品')); selectedIdMap = new Map(); productSelected = [select Id, Name, MDM_Name__c, OT_CODE_no_link__c, Family, SFDA_Status__c, Asset_Model_No__c, Intra_Trade_List_RMB__c, Foreign_Trade_List_US__c, Category2__c, Category3__c, Category4__c, Category5__c from Product2 where Id in :productIds order by Asset_Model_No__c]; for (Integer i = 0; i < productSelected.size(); i++) { selectedIdMap.put(productSelected[i].Id, productSelected[i].Id); } // 選択済みのものにチェックを付ける for (Integer i = 0; i < queryList.size(); i++) { // 501を超えた場合前500のみを出す if (i == productSelectLimitDisplay) continue; productRecords.add(new Product2Info(queryList[i])); if (selectedIdMap.containsKey(queryList[i].Id)) { productRecords[i].check = true; productRecords[i].oldCheck = true; } } this.sortKey = '0'; this.preSortKey = '0'; this.sortOrderAsc = true; this.sortOrder = new String[8]; this.sortOrder = new String[]{ '↑', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}; cate1ForSort = family; cate2ForSort = category2; cate3ForSort = category3; cate4ForSort = category4; cate5ForSort = category5; nameForSort = assetModelNo; statusForSort = multiStatus; productCount = productRecords.size(); if (productCount > productSelectLimitDisplay) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '数据超过' + productSelectLimitDisplay + '件,只显示前' + productSelectLimitDisplay + '件')); } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有' + productCount + '件产品')); } } public void sortTable() { if (String.isBlank(cate1ForSort) && String.isBlank(cate2ForSort) && String.isBlank(cate3ForSort) && String.isBlank(cate4ForSort) && String.isBlank(cate5ForSort) && String.isBlank(nameForSort) && String.isBlank(statusForSort)) { return; } productRecords = new List(); if (this.sortKey == this.preSortKey) { // 方向が変わるのみ this.sortOrderAsc = !this.sortOrderAsc; this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓'); } else { this.sortOrderAsc = true; this.sortOrder[Integer.valueOf(this.preSortKey)] = ' '; this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓'); } this.preSortKey = this.sortKey; String soql = this.makeSoql(cate1ForSort, cate2ForSort, cate3ForSort, cate4ForSort, cate5ForSort, nameForSort, statusForSort); soql += ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') + ' limit ' + Label.Product_Select_Limit; List queryList = Database.query(soql); // 選択済みの製品を取得 this.makeProductIds(); selectedIdMap = new Map(); productSelected = [select Id, Name, MDM_Name__c, OT_CODE_no_link__c, Family, SFDA_Status__c, Asset_Model_No__c, Intra_Trade_List_RMB__c, Foreign_Trade_List_US__c, Category2__c, Category3__c, Category4__c, Category5__c from Product2 where Id in :productIds order by Asset_Model_No__c]; for (Integer i = 0; i < productSelected.size(); i++) { selectedIdMap.put(productSelected[i].Id, productSelected[i].Id); } // 選択済みのものにチェックを付ける for (Integer i = 0; i < queryList.size(); i++) { // 501を超えた場合前500のみを出す if (i == productSelectLimitDisplay) continue; productRecords.add(new Product2Info(queryList[i])); if (selectedIdMap.containsKey(queryList[i].Id)) { productRecords[i].check = true; productRecords[i].oldCheck = true; } } productCount = productRecords.size(); if (productCount > productSelectLimitDisplay) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '数据超过' + productSelectLimitDisplay + '件,只显示前' + productSelectLimitDisplay + '件')); } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有' + productCount + '件产品')); } } public PageReference save() { List mfProIds = new List(); List mfIns = new List(); List mfDel = new List(); List pdmtProIds = new List(); List pdmtIns = new List(); List pdmtDel = new List(); List cpmtProIds = new List(); List cpmtIns = new List(); List cpmtDel = new List(); Savepoint sp = Database.setSavepoint(); try { for (Product2Info prInfo : productRecords) { // 画面上にチェックした、且つ未登録の製品 if (prInfo.check && !selectedIdMap.containsKey(prInfo.rec.Id)) { // SFDA証書から if (!String.isBlank(productMaterialId)) { Material_For__c mf = new Material_For__c( Material__c = productMaterialId, Product__c = prInfo.rec.Id ); mfIns.add(mf); // 製品資料から } else if (!String.isBlank(productDocMiddleId)) { Product_and_document_middle_table__c pdmt = new Product_and_document_middle_table__c( Product_document__c = productDocMiddleId, Product_name__c = prInfo.rec.Id ); pdmtIns.add(pdmt); // CICから } else if (!String.isBlank(productCICId)) { CIC_case_and_product_middle_table__c cmpt = new CIC_case_and_product_middle_table__c( CIC__c = productCICId, Product__c = prInfo.rec.Id ); cpmtIns.add(cmpt); } else {} } // 画面上にチェックなし、且つ以前がチェックされた製品 if (!prInfo.check && prInfo.oldCheck) { // SFDA証書から if (!String.isBlank(productMaterialId)) { mfProIds.add(prInfo.rec.Id); // 製品資料から } else if (!String.isBlank(productDocMiddleId)) { pdmtProIds.add(prInfo.rec.Id); // CICから } else if (!String.isBlank(productCICId)) { cpmtProIds.add(prInfo.rec.Id); } else {} } } // 削除 if (mfProIds.size() > 0) ControllerUtil.delMaterialFor(productMaterialId, mfProIds); if (pdmtProIds.size() > 0) ControllerUtil.delProDocMidTbl(productDocMiddleId, pdmtProIds); if (cpmtProIds.size() > 0) ControllerUtil.delCicProMidTbl(productCICId, cpmtProIds); // 新規 ControllerUtil.insMaterialFor(mfIns); ControllerUtil.insProDocMidTbl(pdmtIns); ControllerUtil.insCicProMidTbl(cpmtIns); } catch (Exception ex) { ApexPages.addMessages(ex); Database.rollback(sp); return null; } if (saveType == '1') { searchProduct(); saveType = ''; return null; } else if (saveType == '2') { sortTable(); saveType = ''; return null; } else { return cancel(); } } public PageReference cancel() { System.debug('cancel start productCICId=' + this.productCICId); PageReference ret = null; if (!String.isBlank(this.productMaterialId)) { ret = new PageReference('/' + this.productMaterialId); } if (!String.isBlank(this.productDocMiddleId)) { ret = new PageReference('/' + this.productDocMiddleId); } if (!String.isBlank(this.productCICId)) { ret = new PageReference('/' + this.productCICId); } return ret; } private String makeSoql(String cate1, String cate2, String cate3, String cate4, String cate5, String assMode, String status) { String soql = 'select Id, Name, MDM_Name__c, OT_CODE_no_link__c, Family, SFDA_Status__c, Asset_Model_No__c,' + ' Intra_Trade_List_RMB__c, Foreign_Trade_List_US__c, Category2__c, Category3__c, Category4__c, Category5__c' + ' from Product2 where IsActive = true'; // 製品資料とCICの場合、SFDA状態を見る if (!String.isBlank(productDocMiddleId) || !String.isBlank(productCICId)) { soql += ' and SFDA_Status__c <> \'準備中\' and SFDA_Status__c <> \'新製品申請中\''; } // Familyはプルダウン if (!String.isBlank(cate1)) { soql += ' and Family = \'' + cate1 + '\''; } if (!String.isBlank(cate2)) { soql += ' and Category2__c like \'%' + cate2 + '%\''; } if (!String.isBlank(cate3)) { soql += ' and Category3__c like \'%' + cate3 + '%\''; } if (!String.isBlank(cate4)) { soql += ' and Category4__c like \'%' + cate4 + '%\''; } if (!String.isBlank(cate5)) { soql += ' and Category5__c like \'%' + cate5 + '%\''; } if (!String.isBlank(assMode)) { soql += ' and Asset_Model_No__c like \'%' + assMode + '%\''; } if (!String.isBlank(status)) { soql += ' and ('; List vals = status.split('_', -1); for (Integer i = 0; i < vals.size(); i++) { if (i == vals.size() - 1) { soql += ' SFDA_Status__c = \'' + vals[i] + '\')'; } else { soql += ' SFDA_Status__c = \'' + vals[i] + '\' or'; } } } return soql; } private void makeProductIds() { productIds = new List(); if (!String.isBlank(productMaterialId)) { List mfList = [select Product__c from Material_For__c where Material__c = :productMaterialId]; for (Material_For__c mf : mfList) { productIds.add(mf.Product__c); } } if (!String.isBlank(productDocMiddleId)) { List pdmtList = [select Product_name__c from Product_and_document_middle_table__c where Product_document__c = :productDocMiddleId]; for (Product_and_document_middle_table__c pdmt : pdmtList) { productIds.add(pdmt.Product_name__c); } } if (!String.isBlank(productCICId)) { List cpmtList = [select Product__c from CIC_case_and_product_middle_table__c where CIC__c = :productCICId]; for (CIC_case_and_product_middle_table__c cpmt : cpmtList) { productIds.add(cpmt.Product__c); } } } class Product2Info { public Product2 rec { get; set; } public Boolean check { get; set; } public Boolean oldCheck { get; set; } public Product2Info(Product2 record) { rec = record; check = false; oldCheck = false; } } }