/** * 备品配套の設定 */ public with sharing class FixtureSetManageController extends CreateRelationListPagingCtrlBase { public override Integer getSearchNumMax() { //各ページに制御あれば、最大件数を指定する // searchNumMax = Integer.valueOf(Label.Product_Select_Limit); // searchNumMax = 100; pagesize = '100'; return searchNumMax; } /* 選択されたデータ取得用Soql Fromから*/ public override String getSelectedDataSql() { // オブジェクトAPI名 selectedDataSql = ' From Fixture_Set_Detail__c'; selectedDataSql += ' where Fixture_Set__c = \'' + String.escapeSingleQuotes(parentId) + '\''; selectedDataSql += ' order by SortInt__c ASC nulls last'; return selectedDataSql; } // 検索元対象オブジェクトAPI名 public override String getOriginObjName() { // オブジェクトAPI名 originObjName = 'Product2'; return originObjName; } // 検索元対象項目セット public override String getOriginObjColumns() { // 項目セット originObjColumns = 'Id'; return originObjColumns; } public override String getObjName() { // オブジェクトAPI名 objName = 'Fixture_Set_Detail__c'; return objName; } public override String getColumnLeftFieldSetName() { // 左の項目セット columnLeftFieldSetName = ''; return columnLeftFieldSetName; } public override String getColumnRightFieldSetName() { // 右の項目セット columnRightFieldSetName = 'DetailEdit_RightFieldSet'; return columnRightFieldSetName; } // Select 里加直接加的項目 List public override List getColumnFieldList() { // strColumus 里加 field return new List{'Id', 'Product2__r.Name', 'Fixture_Set__c', 'Product_Status_Flag__c'}; } // getObjName 连 getOriginObjName 的 FK public override String getFKColumnField() { return 'Product2__c'; } public override String getRecordTypeId() { //ページレイアウトを収得するのレコードタイプ recordTypeId = ''; return recordTypeId; } // ページコントローラに検索処理は、WhereSoql作成のみ、パラメータとして、コンポーネントに渡される public override String getSqlWhereStr() { sqlWhereStr = ''; if(getIsNeedRunSearch()){ sqlWhereStr = this.makeSoql(family, category2, category3, category4, category5, assetModelNo, multiStatus); } system.debug('=========getSqlWhereStr:'+sqlWhereStr); return sqlWhereStr; } public override Boolean getIsNeedRunSearch() { return true; //if (String.isBlank(family) && String.isBlank(category2) // && String.isBlank(category3) && String.isBlank(category4) // && String.isBlank(category5) && String.isBlank(assetModelNo) // && String.isBlank(multiStatus)) { // isNeedRunSearch = false; //}else{ // isNeedRunSearch = true; //} //return isNeedRunSearch; } /*****************検索用******************/ public String family { get; set; } public List familyOpts { get; private 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; } public String saveType { get; set; } //VFで$ObjectType.Fixture_Set_Detail__c.updateableで権限を判断する場合,画面表示途中で //プロファイルの権限を変更したら保存時のエラーが表示されません public Boolean canSave {get; private set;} /*****************ソート時再検索条件(画面からの入力条件を無視するため)******************/ 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; public Fixture_Set__c parentObj { get; private set; } public FixtureSetManageController() { parentId = ApexPages.currentPage().getParameters().get('pt_recid'); //备品配套下的所有明细 if (!String.isBlank(this.parentId)) { List parentObjs = [ select Id,Name from Fixture_Set__c where Id = :parentId]; if (parentObjs.size() > 0) { parentObj = parentObjs.get(0); } } Schema.DescribeFieldResult f = Product2.Family.getDescribe(); List pList = F.getPicklistValues(); familyOpts = new List(); familyOpts.add(new SelectOption('','--无--')); for (Schema.PicklistEntry p : pList) { if (p.isActive() == true) { familyOpts.add(new SelectOption(p.getValue(), p.getLabel())); } } this.canSave = Fixture_Set_Detail__c.sObjectType.getDescribe().isUpdateable() && Fixture_Set_Detail__c.sObjectType.getDescribe().isCreateable(); } public void init() { searchOppSetParam(); getSqlWhereStr(); //isNeedSearchFirst = true; } private void searchOppSetParam() { cate1ForSort = family; cate2ForSort = category2; cate3ForSort = category3; cate4ForSort = category4; cate5ForSort = category5; nameForSort = assetModelNo; statusForSort = multiStatus; } public PageReference searchOpp() { searchOppSetParam(); if(!getIsNeedRunSearch()){ return null; } // 選択済みの製品を取得 myComponentController.getSelectedDataInfo(); getSqlWhereStr(); // コンポーネントにSoqlを発行して、ページングする myComponentController.searchAndPaging(); return null; } public PageReference save() { if (!Fixture_Set_Detail__c.sObjectType.getDescribe().isUpdateable() || !Fixture_Set_Detail__c.sObjectType.getDescribe().isCreateable()) { ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR, '无法编辑备品配套明细')); return null; } List delIds = new List(); //20170906 upsert by UniqueKey__c List mfUpsert = new List(); // MainFixture_Cnt使用的積み上げ是非同期的,为了解决入力规则(主体只能有一个)的问题,此时更新分两次进行 Fixture_Set_Detail__c bodyMfUpsert = null; Savepoint sp = Database.setSavepoint(); Set clearUniqueKeySet = new Set(); try { viewList.sort(); List bodyWrap = new List(); List optionWrap = new List(); for (WrapperInfo wprInfo : viewList) { if(!wprInfo.check) continue; if (((Fixture_Set_Detail__c) wprInfo.sobj).Is_Body__c) { bodyWrap.add(wprInfo); } else { optionWrap.add(wprInfo); } } // Is_Body を かならず先頭にする bodyWrap.addAll(optionWrap); Integer sortInt = 1; Boolean isNeedUpdateParent = false; for (WrapperInfo wprInfo : bodyWrap) { Fixture_Set_Detail__c robj = (Fixture_Set_Detail__c) wprInfo.sobj; if (robj.Is_Body__c) { //选配 :主体の場合は、備品Set保存時に自動でFalseをセットする。 robj.Is_Optional__c = false; robj.Is_OneToOne__c = false; robj.SortInt__c = 1; robj.Name = parentObj.Name + '-' + ('' + sortInt).leftPad(2, '0'); //主体备品配套明细型号 parentObj.Fixture_Set_Body_Model_No__c = robj.Fixture_Model_No_F__c; isNeedUpdateParent = true; } else { sortInt++; robj.SortInt__c = sortInt; robj.Name = parentObj.Name + '-' + ('' + sortInt).leftPad(2, '0'); } } for (WrapperInfo wprInfo : viewList) { Fixture_Set_Detail__c robj = (Fixture_Set_Detail__c) wprInfo.sobj; //20170906 upsert by UniqueKey__c // 画面上にチェックした if (wprInfo.check) { String uniqueKeyStr = parentObj.id + ':' + robj.product2__c; robj.UniqueKey__c = uniqueKeyStr; if (robj.Is_Body__c) { bodyMfUpsert = robj; } else { mfUpsert.add(robj); } if (String.isBlank(robj.Id) && !String.isBlank(uniqueKeyStr)) { // 新規の場合、ここ単純に Id にて判断 clearUniqueKeySet.add(uniqueKeyStr); } } // 画面上にチェックなし、且つ以前がチェックされた製品 if (!wprInfo.check && wprInfo.oldCheck && selectedIdSet.contains(robj.Id)) { // 一覧から削除 if (!String.isBlank(robj.Id)) { delIds.add(robj.Id); } } } if(isNeedUpdateParent){ update parentObj; } // 削除、権限ない可能性があるので、FixtureUtilに移動 if (delIds.size() > 0) { FixtureUtil.delFixtureSetDetailByIds(parentObj, delIds); } List allFSDList = new List(); // Upsert if (mfUpsert.size() > 0) { //Test method error on upsert command //System.DmlException: Upsert failed. First exception on row 0 with id a2R0k0000000rogEAA; //first error: INVALID_FIELD_FOR_INSERT_UPDATE, cannot specify Id in an insert call: [Id] allFSDList.addAll(mfUpsert); } if (bodyMfUpsert != null) { allFSDList.add(bodyMfUpsert); } if(allFSDList.size() > 0) { // 用batch逻辑更新【产品注册证状态】 FixtureSetDetailDailyUpdateBatch.updateProductStatusFlag(allFSDList); upsert allFSDList UniqueKey__c; } } catch (Exception ex) { System.debug(ex.getStackTraceString()); ApexPages.addMessages(ex); Database.rollback(sp); // Id をクリア for (Fixture_Set_Detail__c robj : mfUpsert) { if (clearUniqueKeySet.contains(robj.UniqueKey__c)) { robj.Id = null; } } return null; } if (saveType == '1') { searchOpp(); saveType = ''; return null; } else if (saveType == '2') { // ソート時の変更ある myComponentController.getSelectedDataInfo(); getSqlWhereStr(); myComponentController.sortTable(); saveType = ''; return null; } else { return cancel(); } } public PageReference cancel() { PageReference ret = null; if (!String.isBlank(this.parentId)) { ret = new PageReference('/' + this.parentId); } return ret; } private String makeSoql(String cate1, String cate2, String cate3, String cate4, String cate5, String assMode, String status) { // from product2 String soql =''; soql += 'where IsActive = true'; // Familyはプルダウン if (!String.isBlank(cate1)) { soql += ' and Family = \'' + String.escapeSingleQuotes(cate1.replaceAll('%', '\\%')) + '\''; } if (!String.isBlank(cate2)) { soql += ' and Category2__c like \'%' + String.escapeSingleQuotes(cate2.replaceAll('%', '\\%')) + '%\''; } if (!String.isBlank(cate3)) { soql += ' and Category3__c like \'%' + String.escapeSingleQuotes(cate3.replaceAll('%', '\\%')) + '%\''; } if (!String.isBlank(cate4)) { soql += ' and Category4__c like \'%' + String.escapeSingleQuotes(cate4.replaceAll('%', '\\%')) + '%\''; } if (!String.isBlank(cate5)) { soql += ' and Category5__c like \'%' + String.escapeSingleQuotes(cate5.replaceAll('%', '\\%')) + '%\''; } if (!String.isBlank(assMode)) { //soql += ' and Asset_Model_No__c like \'%' + String.escapeSingleQuotes(assMode) + '%\''; soql += ' and ( '; soql += ' Fixture_Model_No_F__c like \'%' + String.escapeSingleQuotes(assMode.replaceAll('%', '\\%')) + '%\''; soql += ' OR Name like \'%' + String.escapeSingleQuotes(assMode.replaceAll('%', '\\%')) + '%\''; soql += ' OR OT_CODE_no_link__c like \'%' + String.escapeSingleQuotes(assMode.replaceAll('%', '\\%')) + '%\''; soql += ' OR MDM_Model_No__c like \'%' + String.escapeSingleQuotes(assMode.replaceAll('%', '\\%')) + '%\''; soql += ' ) '; //产品名称(文本) Name_No_link__c → Name , OT CODE OT_CODE_no_link__c, MDM製品型番 MDM_Model_No__c } 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 = \'' + String.escapeSingleQuotes(vals[i]) + '\')'; } else { soql += ' SFDA_Status__c = \'' + String.escapeSingleQuotes(vals[i]) + '\' or'; } } } system.debug(soql); return soql; } // List public override void setViewList(List queryList) { viewList = new List(); // 選択済みの明细 if (selectedData.size() > 0) { for (Integer i = 0; i < selectedData.size(); i++) { /* not include the selected data num */ // 501を超えた場合前500のみを出す //if (i == getSearchNumMax()) continue; WrapperInfo w = new WrapperInfo(selectedData[i], myComponentController); w.lineNo = i; w.orderNo = i + 1; w.check = true; w.oldCheck = true; viewList.add(w); } } if (queryList.size() == 0) { return; } // queryList に 数式項目を取得 Savepoint sp = Database.setSavepoint(); // 数式項目値を取れるのために、一回Insertする List tempList = new List(); for (Integer i = 0; i < queryList.size(); i++) { // 501を超えた場合前500のみを出す if (i == getSearchNumMax()) { break; } Fixture_Set_Detail__c mf = new Fixture_Set_Detail__c(); mf.Fixture_Set__c = parentId; mf.Product2__c = queryList[i].Id; mf.Is_Body__c = false; mf.Is_OneToOne__c = false; mf.Quantity__c = 1; mf.Is_Optional__c = false; mf.DataMigration_Flag__c = true; // mf.recalculateFormulas(); tempList.add(mf); } Database.SaveResult[] results = Database.insert(tempList, false); final String soqlStr = 'Select {0} {1} '; String whereStr = ' FROM Fixture_Set_Detail__c WHERE ID in: tempList'; String soql = String.format(soqlStr, new String[] {myComponentController.strColumus, whereStr}); tempList = Database.query(soql); if (queryList.size() != tempList.size()) { //error message 検索処理正しくありません、システム管理者に連絡してください。 Database.SaveResult dmlResult = results[0]; if (!dmlResult.isSuccess()) { System.debug(System.LoggingLevel.ERROR, '第[' + (1) + ']条 insert error:' + dmlResult); ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '第[' + (1) + ']条 insert error:' + dmlResult)); // 1件目だけlogに出す } ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, System.Label.CreateRelationListSearchError)); return; } // 強制ロールバック Database.rollback(sp); Map fsDMap = new Map(); for(Fixture_Set_Detail__c fsd : tempList){ Fixture_Set_Detail__c robj = fsd.clone(false); robj.DataMigration_Flag__c = false; fsDMap.put(fsd.Product2__c, robj); } Integer addedNum = 0; for (Integer i = 0; i < queryList.size(); i++) { addedNum ++; // 501を超えた場合前500のみを出す if (addedNum == getSearchNumMax()) { break; } SObject mf = fsDMap.get(queryList[i].Id); viewList.add(new WrapperInfo(mf, myComponentController)); viewList[viewList.size() - 1].lineNo = viewList.size() - 1; } system.debug('●●●●● setViewList END ' ); } }