public with sharing class ConsumAssignCancelController extends CreateRelationListPagingCtrlBase { public override Integer getSearchNumMax() { //各ページに制御あれば、最大件数を指定する searchNumMax = Integer.valueOf(Label.Product_Select_Limit); searchNumMax = 20; return searchNumMax; } /* 選択されたデータ取得用Soql Fromから*/ public override String getSelectedDataSql() { // オブジェクトAPI名 selectedDataSql = ' From Consum_Apply_Equipment_Set__c'; selectedDataSql += ' where Consum_Apply__c = \'' + String.escapeSingleQuotes(parentId) + '\''; selectedDataSql += ' AND RetalFSetDetail_Cnt__c > 0 '; selectedDataSql += ' AND Cancel_Select__c = false '; selectedDataSql += ' order by Name ASC nulls last'; // order by Fixture_Set_Detail__r.SortInt__c myComponentController.columnRightRW.put('Model_No__c', 'r'); return selectedDataSql; } public override String getOriginObjName() { // オブジェクトAPI名 originObjName = 'Asset'; return originObjName; } public override String getOriginObjColumns() { // 項目セット originObjColumns = 'Id'; return originObjColumns; } public override String getObjName() { // オブジェクトAPI名 objName = 'Consum_Apply_Equipment_Set__c'; return objName; } public override String getColumnLeftFieldSetName() { // 左の項目セット columnLeftFieldSetName = ''; return columnLeftFieldSetName; } public override String getColumnRightFieldSetName() { // 右の項目セット columnRightFieldSetName = 'ConsumAssignCancel_List'; return columnRightFieldSetName; } public override List getColumnFieldList() { // strColumus 里加 field // FixtureUtil#raesdGroupBy()の項目も必要 return new List{'Cancel_Reason__c', 'VF_Cancel_Detail_Count__c'}; } // 画面里直接可以输入的項目 List public override List getWritableColumnFieldList() { return new List{'Cancel_Reason__c', 'VF_Cancel_Detail_Count__c'}; } // getObjName 连 getOriginObjName 的 FK public override String getFKColumnField() { return ''; } public override String getRecordTypeId() { //ページレイアウトを収得するのレコードタイプ recordTypeId = ''; return recordTypeId; } // ページコントローラに検索処理は、WhereSoql作成のみ、パラメータとして、コンポーネントに渡される public override String getSqlWhereStr() { sqlWhereStr = ''; return sqlWhereStr; } public override Boolean getIsNeedRunSearch() { return false; } public Consum_Apply__c parentObj { get; set; } public Consum_Apply_Equipment_Set__c pageCaes {get; set;} private String savetype; public ConsumAssignCancelController() { parentId = ApexPages.currentPage().getParameters().get('pt_recid'); savetype = ApexPages.currentPage().getParameters().get('savetype'); pageCaes = new Consum_Apply_Equipment_Set__c(); if (!String.isBlank(this.parentId)) { List parentObjs = [ SELECT Id , Name , Person_In_Charge__c , Salesdept__c , WorkPlace__c , Internal_asset_location_F__c , demo_purpose2__c , Request_shipping_day__c , Asset_loaner_start_date__c , Request_demo_day__c FROM Consum_Apply__c WHERE Id = :parentId ]; if(parentObjs.size()>0){ parentObj = parentObjs.get(0); } } } public void init() { isNeedCheckEvent = true; searchOppSetParam(); getSqlWhereStr(); } private void searchOppSetParam() { } public PageReference searchOpp() { searchOppSetParam(); // 選択済みの製品を取得 myComponentController.getSelectedDataInfo(); getSqlWhereStr(); // コンポーネントにSoqlを発行して、ページングする myComponentController.searchAndPaging(); return null; } public PageReference save() { Map caesMap = new Map(); Savepoint sp = Database.setSavepoint(); try{ for(WrapperInfo info : viewList){ Consum_Apply_Equipment_Set__c caes = (Consum_Apply_Equipment_Set__c) info.sobj; Boolean isChanged = info.check || caes.VF_Cancel_Detail_Count__c != null || String.isNotBlank(caes.Cancel_Reason__c); if(info.check){ if(caes.VF_Cancel_Detail_Count__c == null || caes.VF_Cancel_Detail_Count__c == 0) { String msgStr = '第' + (info.lineNo+1) + '行 【取消明细申请件数】 不可为空!'; throw new ControllerUtil.myException(msgStr); } else if(caes.VF_Cancel_Detail_Count__c > caes.RetalFSetDetail_Cnt__c){ String msgStr = '第' + (info.lineNo+1) + '行 【取消明细申请件数】 不可超过 【申请件数】!'; throw new ControllerUtil.myException(msgStr); } if(String.isBlank(caes.Cancel_Reason__c)){ String msgStr = '第' + (info.lineNo+1) + '行 【取消理由】 不可为空'; throw new ControllerUtil.myException(msgStr); } if(String.isBlank(caes.Loaner_cancel_Remarks__c)){ String msgStr = '第' + (info.lineNo+1) + '行 【取消理由备注】 不可为空'; throw new ControllerUtil.myException(msgStr); } caesMap.put(caes.Id, caes); } } if(caesMap.isEmpty()){ String msgStr = '没有需要取消的明细'; throw new ControllerUtil.myException(msgStr); } List parentObjs = [ SELECT Id , Name , Person_In_Charge__c , Salesdept__c , WorkPlace__c , Internal_asset_location_F__c , demo_purpose2__c , Request_shipping_day__c , Asset_loaner_start_date__c , Request_demo_time__c FROM Consum_Apply__c WHERE Id = :parentId FOR UPDATE ]; if(parentObjs.size()>0){ parentObj = parentObjs.get(0); } List csaesdList = [ SELECT Id , Consum_Apply_Equipment_Set__c , Asset__c , Cancel_Select__c , Cancel_Date__c , Cancel_Time__c , Cancel_Reason__c , Select_Time__c , Shipment_request__c , Shipment_request_time2__c FROM Consum_Apply_Equipment_Set_Detail__c WHERE Consum_Apply_Equipment_Set__c IN :caesMap.keySet() AND Cancel_Select__c = false ORDER BY Consum_Apply_Equipment_Set__c, Degree_Of_Importance__c DESC, Asset__c NULLS FIRST ]; if(csaesdList.isEmpty()){ String msgStr = '没有可以取消的明细'; throw new ControllerUtil.myException(msgStr); } Map csaesdUpdateMap = new Map(); Set assetIdSet = new Set(); for(Consum_Apply_Equipment_Set_Detail__c csaesd : csaesdList){ // 当caesMap为空时表示所有取消操作已完成,不需要再遍历 if(caesMap.isEmpty()){ break; } Id csaesId = csaesd.Consum_Apply_Equipment_Set__c; // caesMap不含csaesId时,表示csaesId一览下的明细已完成取消,跳过 if(!caesMap.containsKey(csaesId)) { continue; } Consum_Apply_Equipment_Set__c csaes = caesMap.get(csaesId); if(csaes.VF_Cancel_Detail_Count__c > 0){ assetIdSet.add(csaesd.Asset__c); // 取消 csaesd.Cancel_Select__c = true; // 取消理由 csaesd.Cancel_Reason__c = csaes.Cancel_Reason__c; // 取消理由备注 csaesd.Loaner_cancel_Remarks__c = csaes.Loaner_cancel_Remarks__c; // 以下字段在trigger里清 //// 取消日期 //csaesd.Cancel_Date__c = Datetime.now().date(); //// 取消日期 //csaesd.Cancel_Time__c = Datetime.now().time(); //// 保有设备link //csaesd.Asset__c = null; //// TODO 暂定分配时间 //// 分配时间 //csaesd.Select_Time__c = null; //// 已做出库指示 //csaesd.Shipment_request__c = false; //// 出库指示时间 //csaesd.Shipment_request_time2__c = null; csaesdUpdateMap.put(csaesd.Id, csaesd); // 取消的明细达到数量时,将一览从caesMap移除 if (csaes.VF_Cancel_Detail_Count__c - 1 == 0){ caesMap.remove(csaesId); } else{ csaes.VF_Cancel_Detail_Count__c -= 1; caesMap.put(csaesId, csaes); } } } if (csaesdUpdateMap.size() > 0) { List lockAssetList = [ SELECT Id FROM Asset WHERE Id IN : assetIdSet FOR UPDATE ]; List lockCaesdList = [ SELECT Id FROM Consum_Apply_Equipment_Set_Detail__c WHERE Id IN : csaesdUpdateMap.keySet() FOR UPDATE ]; if (parentObj.Request_demo_time__c != null) { FixtureUtil.withoutUpdate(csaesdUpdateMap.values()); } else { FixtureUtil.withoutDelete(csaesdUpdateMap.values()); } PageReference page = new PageReference('/apex/ConsumAssignCancel?pt_recid=' + parentId + '&savetype=1'); page.setRedirect(true); return page; } } catch (Exception e){ ApexPages.addMessages(e); Database.rollback(sp); return null; } return null; } public override void setViewList(List queryList) { viewList = new List(); if (savetype == '1') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.CONFIRM , '取消成功')); } if (selectedData.size() == 0) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING , '没有可以取消申请的一览明细')); return ; } if (String.isBlank(pageCaes.Id)) { pageCaes.Id = selectedData[0].Id; } if (selectedData.size() > 0) { for (Integer i = 0; i < selectedData.size(); i++) { Consum_Apply_Equipment_Set__c caes = (Consum_Apply_Equipment_Set__c) selectedData[i]; WrapperInfo newWrapperInfo = new WrapperInfo(caes, myComponentController); newWrapperInfo.lineNo = i; newWrapperInfo.check = false; newWrapperInfo.oldCheck = false; viewList.add(newWrapperInfo); } } } }