/** * 附属品选择の設定 * AccessorySelectControllerTest * RentalFixtureManage1Test * RentalFixtureManage2Test */ public with sharing class AccessorySelectController 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 Rental_Apply_Equipment_Set_Detail__c'; selectedDataSql += ' where Rental_Apply_Equipment_Set__c = \'' + String.escapeSingleQuotes(parentId) + '\''; selectedDataSql += ' and Is_Body__c = false'; selectedDataSql += ' and Cancel_Select__c = False'; selectedDataSql += ' and (ApplyPersonAppended_F__c = false OR ('; selectedDataSql += ' ApplyPersonAppended_F__c = true AND (Add_Request_approval_time__c != null OR Select_Time__c != null)))'; selectedDataSql += ' order by Name ASC nulls last'; // order by Fixture_Set_Detail__r.SortInt__c 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 = 'Rental_Apply_Equipment_Set_Detail__c'; return objName; } public override String getColumnLeftFieldSetName() { // 左の項目セット columnLeftFieldSetName = ''; return columnLeftFieldSetName; } public override String getColumnRightFieldSetName() { // 右の項目セット columnRightFieldSetName = 'AccessorySelect_RightFieldSet'; return columnRightFieldSetName; } public override List getColumnFieldList() { // strColumus 里加 field // FixtureUtil#raesdGroupBy()の項目も必要 return new List{ 'Id', 'Rental_Apply_Equipment_Set__c', 'FSD_Id__c', 'Select_Time__c', 'Fixture_Model_No_F__c', 'IndexFromUniqueKey__c', 'FSD_Fixture_Model_No__c', 'Is_Body_F__c', 'SalesProvince__c', 'OneToOne_Flag__c', 'Rental_Apply__c', 'Rental_Apply__r.Salesdepartment__c', 'DeliverySlip__c', 'Is_Body__c', 'Rental_Apply__r.Equipment_Type_F__c', 'Rental_Apply__r.Internal_asset_location_F__c', 'Rental_Apply__r.Salesdept__c', 'Rental_Apply__r.Product_category__c', 'Rental_Apply__r.demo_purpose2__c', 'Rental_Apply__r.Follow_UP_Opp__r.Shipping_Finished_Day_Func__c', 'Rental_Apply__r.next_action__c', 'Rental_Apply__r.QIS_number__r.ReplaceDeliveryDate__c' }; } // 画面里直接可以输入的項目 List public override List getWritableColumnFieldList() { return new List{ 'Cancel_Reason__c', 'Loaner_cancel_reason__c', 'Loaner_cancel_Remarks__c' }; // 20210818 ljh SFDC-C448KZ add } // getObjName 连 getOriginObjName 的 FK public override String getFKColumnField() { return 'Asset__c'; } public override String getRecordTypeId() { //ページレイアウトを収得するのレコードタイプ recordTypeId = ''; return recordTypeId; } // ページコントローラに検索処理は、WhereSoql作成のみ、パラメータとして、コンポーネントに渡される public override String getSqlWhereStr() { sqlWhereStr = ''; return sqlWhereStr; } public override Boolean getIsNeedRunSearch() { return false; } // ClickEvent用URL public String goAccessoryAdd { get; set; } /*****************検索用******************/ /*****************ソート時再検索条件(画面からの入力条件を無視するため)******************/ public String saveType { get; set; } public Rental_Apply_Equipment_Set__c parentObj { get; set; } public Rental_Apply_Equipment_Set_Detail__c sonObj { get; set; } // 20210817 ljh SFDC-C448KZ add public Boolean bieField { get; set; } // 别省、别本部别存放地 List showButtonList = new List(); public String bieCunFangDi { get; set; } //别存放地, 肯定有值 不为null // #OLY_OCM-654 因为MA本部和产品培训本部还是需要检索条件,所以需要别本部的检索条件 Start public String bieBenBu { get; set; } //别本部 public Set benbuSet; // #OLY_OCM-654 因为MA本部和产品培训本部还是需要检索条件,所以需要别本部的检索条件 End // #OLY_OCM-654 Start // public String bieChanPinFenLei { get; set; } //产品分类 // public String bieBiePinFenLei { get; set; } //别备品分类 // #OLY_OCM-654 End public Rental_Apply_Equipment_Set_Detail__c pageRaesd { get; set; } public AccessorySelectController() { Integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; parentId = ApexPages.currentPage().getParameters().get('pt_recid'); pageRaesd = new Rental_Apply_Equipment_Set_Detail__c(); this.bieField = true; benbuSet = new Set(); //借出备品一览の情報を取得 if (!String.isBlank(this.parentId)) { List parentObjs = [ SELECT Id, Rental_Apply__r.Name, Rental_Apply__r.Owner.Name, Rental_Apply__r.Salesdept__c, Rental_Apply__r.WorkPlace__c, Rental_Apply__r.Request_shipping_day__c, Fu_Shu_Pin_Fen_Pei_Jia__c, Rental_Apply__r.Demo_purpose1__c, Rental_Apply__r.demo_purpose2__c, Fixture_Set__r.Product_Category_GI_SP__c, Rental_Apply__r.Product_category__c, Fixture_Set__r.Equipment_Type__c, Rental_Apply__r.Equipment_Type_F__c, Rental_Apply__r.Internal_asset_location_F__c, Rental_Apply__r.Request_return_day__c, Fixture_Set__r.Fixture_Set_Body_Model_No__c, Rental_Apply__r.Salesdepartment__c, SerialNumber_F__c, Rental_Start_Date__c, Rental_End_Date__c, Irreplaceable_flag__c, RequestNoJoinStr2__c, First_RAESD__c, First_RAESD__r.Is_Body__c FROM Rental_Apply_Equipment_Set__c WHERE Id = :parentId ]; if (parentObjs.size() > 0) { parentObj = parentObjs.get(0); String rsdid = System.label.Rental_Apply_id; List raesdObjs = [ SELECT Id, Rental_Apply_Equipment_Set__c, Cancel_Reason__c, // 20210817 ljh SFDC-C448KZ add Loaner_cancel_reason__c, // 20210817 ljh SFDC-C448KZ add Loaner_cancel_Remarks__c // 20210817 ljh SFDC-C448KZ add FROM Rental_Apply_Equipment_Set_Detail__c WHERE Rental_Apply__c = :rsdid LIMIT 1 ]; if (!raesdObjs.isEmpty()) { sonObj = raesdObjs[0]; } // 主体 or 第一条 List bodyObjs = [ SELECT Id, Internal_asset_location_before__c, Salesdepartment_before__c, Product_category_text__c, Equipment_Type_text__c, Select_Time__c FROM Rental_Apply_Equipment_Set_Detail__c WHERE Rental_Apply_Equipment_Set__c = :parentId AND Id = :parentObj.First_RAESD__c AND Cancel_Select__c = FALSE ]; if (!bodyObjs.isEmpty()) { if (bodyObjs[0].Select_Time__c != null) { bieCunFangDi = bodyObjs[0].Internal_asset_location_before__c; bieBenBu = bodyObjs[0].Salesdepartment_before__c; // #OLY_OCM-654 MA和产品检测本部是需要检索的,所以不注释 // #OLY_OCM-654 Start // bieChanPinFenLei = bodyObjs[0].Product_category_text__c; // bieBiePinFenLei = bodyObjs[0].Equipment_Type_text__c; // #OLY_OCM-654 End } } else { throw new ControllerUtil.myException('不能明确第一条明细, 请确认数据。'); } if (String.isBlank(bieCunFangDi)) { bieCunFangDi = parentObj.Rental_Apply__r.Internal_asset_location_F__c; bieBenBu = parentObj.Rental_Apply__r.Salesdepartment__c; // #OLY_OCM-654 MA和产品检测本部是需要检索的,所以不注释 // #OLY_OCM-654 Start // bieChanPinFenLei = parentObj.Rental_Apply__r.Product_category__c; // bieBiePinFenLei = parentObj.Rental_Apply__r.Equipment_Type_F__c; // #OLY_OCM-654 End } if (String.isBlank(bieCunFangDi)) { throw new ControllerUtil.myException('不能明确存放地, 请确认数据。'); } } } // 20210817 ljh SFDC-C448KZ update end } public void init() { isNeedCheckEvent = true; searchOppSetParam(); getSqlWhereStr(); // #OLY_OCM-654 保有设备合并后,取出的第一条一览明细的本部可能为空,所以biebenbu为空时,也要添加检索条件 Start List opList = FixtureUtil.bieBenBuOpsMap.get(bieCunFangDi); Set needSalesdepartment = FixtureUtil.needSalesdepartment; for (SelectOption op : opList) { if (needSalesdepartment.contains(op.getValue())) { benbuSet.add(op.getValue()); // Where文用Set,因为OLY_OCM-654数据合并后合并的本部都为空,所以这里也是需要空的 } } // 如果本部不在可选本部内的话检索营业本部的保有设备,附属品营业本部因为合并所以本部为空 if (benbuSet.contains(bieBenBu) == false) { bieBenBu = ''; } // #OLY_OCM-654 保有设备合并后,取出的第一条一览明细的本部可能为空,所以biebenbu为空时,也要添加检索条件 End } //别存放地 SelectOption public List getbieCunFangDiOps() { return new List{ new SelectOption(bieCunFangDi, bieCunFangDi) }; } // #OLY_OCM-654 别本部 页面没有检索所以不改 SelectOption public List getbieBenBuOps() { return new List{ new SelectOption(bieBenBu, bieBenBu) }; // return FixtureUtil.bieBenBuOpsMap.get('本部'); } private void searchOppSetParam() { } public PageReference searchOpp() { searchOppSetParam(); // 選択済みの製品を取得 myComponentController.getSelectedDataInfo(); getSqlWhereStr(); // コンポーネントにSoqlを発行して、ページングする myComponentController.searchAndPaging(); return null; } //ToDo返回到哪个界面 // 如果配套有主体则返回主题分配画面 没有则返回标准画面 public PageReference turnback() { String url; PageReference pg; if (parentObj.First_RAESD__r.Is_Body__c) { pg = new PageReference('/apex/MainFixtureSelect'); pg.getParameters().put('pt_recid', parentId); pg.setRedirect(true); } else { pg = new PageReference('/' + parentId); } return pg; } public PageReference save() { List delIds = new List(); Savepoint sp = Database.setSavepoint(); Set clearUniqueKeySet = new Set(); try { List assetIdList = new List(); for (WrapperInfo wprInfo : viewList) { Rental_Apply_Equipment_Set_Detail__c robj = (Rental_Apply_Equipment_Set_Detail__c) wprInfo.sobj; // 状态只有是可以分配时才会保存 if ( FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Ke_Yi_Fen_Pei.ordinal()) == robj.Fu_Shu_Pin_Fen_Pei_Jia__c ) { if (!String.isBlank(robj.Asset__c)) { assetIdList.add(robj.Asset__c); } } } System.debug('assetIdList' + assetIdList); // lock Asset if (assetIdList.size() > 0) { //20170906 upsert by UniqueKey__c List mfUpsert = new List(); Map aSetMap = new Map( [ SELECT Id, Quantity, Out_of_wh__c, Manage_type__c, Ji_Zhong_Guan_Li_Ku_Cun__c, // 20220118 ljh SFDC-C9V84U start Last_Reserve_RAES_Detail__c FROM Asset WHERE Id = :assetIdList FOR UPDATE ] ); Map assetUpdateMap = new Map(); // 状态只有是可以分配时才会保存 for (Integer indexNum = 0; indexNum < viewList.size(); indexNum++) { WrapperInfo wprInfo = viewList[indexNum]; if (wprInfo.check == false) { continue; } Rental_Apply_Equipment_Set_Detail__c robj = (Rental_Apply_Equipment_Set_Detail__c) wprInfo.sobj; //1822 yc 20211021 已购待货目的,新品已有发货日不能出库 start if ( robj.Rental_Apply__r.demo_purpose2__c == '已购待货' && robj.Rental_Apply__r.Follow_UP_Opp__r.Shipping_Finished_Day_Func__c != null ) { throw new ControllerUtil.myException('已购待货目的,新品已有发货日,不能继续了'); } if ( robj.Rental_Apply__r.demo_purpose2__c == '索赔QIS' && robj.Rental_Apply__r.next_action__c == '无偿更换' && robj.Rental_Apply__r.QIS_number__r.ReplaceDeliveryDate__c != null ) { throw new ControllerUtil.myException('索赔QIS目的,QIS已有新品发货日,不能继续了'); } //1822 yc 20211021 已购待货目的,新品已有发货日不能出库 end // 可以分配の場合 (Asset__c 从 null 到 有值) if ( FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Ke_Yi_Fen_Pei.ordinal()) == robj.Fu_Shu_Pin_Fen_Pei_Jia__c ) { Asset aSet = aSetMap.get(robj.Asset__c); // 不能lock到数据的时候 if (aSet == null) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,不是有效的附属品,请刷新画面后重新操作'); } // 分配时间 (Asset__c 从 null 到 有值) if (robj.Select_Time__c == null) { robj.Select_Time__c = System.now(); // 分配時 更新 Out_of_wh__c if (aSet.Out_of_wh__c == null || aSet.Out_of_wh__c == 0) { aSet.Out_of_wh__c = 0; } // 备品有效库存 = 备品数量(Quantity) - 借出数(Out_of_wh__c) Integer num = Integer.valueof(aSet.Quantity - aSet.Out_of_wh__c); // 备品有效库存没有时,程序返回并提示错误信息 if (num < 1) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,没有足够有效库存,请刷新画面后重新操作'); } // 20220118 ljh SFDC-C9V84U start if (aSet.Ji_Zhong_Guan_Li_Ku_Cun__c <= 0) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,集中库库存不足,请刷新画面后重新操作'); } // 20220118 ljh SFDC-C9V84U end //aSet.Out_of_wh__c = aSet.Out_of_wh__c + 1; //assetUpdateMap.put(aSet.Id, aSet); } String uniqueKeyStr = parentObj.RequestNoJoinStr2__c + ':' + robj.Rental_Apply_Equipment_Set__c + ':' + robj.FSD_Id__c + ':' + robj.IndexFromUniqueKey__c; robj.UniqueKey__c = uniqueKeyStr; // 附属品为个体管理的情况下更新 // if (FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li) == aSet.Manage_type__c) { // if (aSet.Last_Reserve_RAES_Detail__c != robj.Id) { // aSet.Last_Reserve_RAES_Detail__c = robj.Id; // assetUpdateMap.put(aSet.Id, aSet); // } // } mfUpsert.add(robj); } } //update assetUpdateMap.values(); // Upsert FixtureUtil.withoutUpsertRaesd(mfUpsert); } } catch (Exception ex) { ApexPages.addMessages(ex); Database.rollback(sp); return null; } if (saveType == '1') { searchOpp(); saveType = ''; return null; } else if (saveType == '2') { // ソート時の変更ある myComponentController.sortTable(); saveType = ''; return null; } else { PageReference ret = null; if (!String.isBlank(this.parentId)) { ret = new PageReference('/' + this.parentId); } return ret; // return cancel(); } } /** *#OLY_OCM-668 取消附属品分配 *@return PageReference 刷新附属品选择页面 */ public PageReference unassign() { Savepoint sp = Database.setSavepoint(); try { List assetIdList = new List(); List raesdIdList = new List(); // 筛出可以取消分配的附属品 for (WrapperInfo wprInfo : viewList) { Rental_Apply_Equipment_Set_Detail__c robj = (Rental_Apply_Equipment_Set_Detail__c) wprInfo.sobj; if (!String.isBlank(robj.Asset__c)) { assetIdList.add(robj.Asset__c); raesdIdList.add(robj.Id); } } // 加lock Map raesdMap = new Map( [ SELECT Id, Asset__c, Select_Time__c, StockDown_time__c, Cancel_Date__c, Fixture_OneToOne_Link_Id__c FROM Rental_Apply_Equipment_Set_Detail__c WHERE Id IN :raesdIdList FOR UPDATE ] ); if (raesdMap.size() > 0) { Map mfUpsert = new Map(); // 读取已分配的所有附属品 Map aSetMap = new Map( [ SELECT Id, Quantity, Out_of_wh__c, Manage_type__c, Last_Reserve_RAES_Detail__c FROM Asset WHERE Id = :assetIdList FOR UPDATE ] ); for (Integer indexNum = 0; indexNum < viewList.size(); indexNum++) { // 对打勾的附属品取消分配 WrapperInfo wprInfo = viewList[indexNum]; Rental_Apply_Equipment_Set_Detail__c robj = (Rental_Apply_Equipment_Set_Detail__c) wprInfo.sobj; Rental_Apply_Equipment_Set_Detail__c robjOnline = raesdMap.get(robj.Id); if (!wprInfo.check) { continue; } if (robjOnline.Cancel_Date__c != null) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,已经取消申请了,不能取消分配'); } if (robjOnline.StockDown_time__c != null) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,已下架,不可以取消分配'); } if (robjOnline.Select_Time__c == null) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,还没有被分配,不可以取消分配'); } // OLY_OCM-668 一对一附属品不能取消分配:系统逻辑保持不变 if (String.isNotBlank(robjOnline.Fixture_OneToOne_Link_Id__c)) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,一对一分配的附属品,不能取消分配'); } Asset aSet = aSetMap.get(robj.Asset__c); // 不能lock到数据的时候 if (aSet == null) { throw new ControllerUtil.myException('第' + (indexNum + 1) + '行,不是有效的附属品,请刷新画面后重新操作'); } // 相关字段置为 null robj.Asset__c = null; robj.Select_Time__c = null; robj.Shipment_request_time2__c = null; robj.Shipment_request__c = false; // 备品配套明细型号(借出时) robj.Fixture_Model_No_text__c = robj.FSD_Fixture_Model_No__c; // 机身编号(借出时) robj.SerialNumber_text__c = null; // 所在地区(省) 借出时 robj.SalesProvince_before__c = null; // 所在地区(本部) 借出时 robj.Salesdepartment_before__c = null; // 产品分类(GI/SP)(借出时) robj.Product_category_text__c = null; // 备品分类(借出时) robj.Equipment_Type_text__c = null; // 备品成本(借出时) robj.Asset_cost_del_before__c = null; // 备品存放地(借出时) robj.Internal_asset_location_before__c = null; //备品名称(借出时) robj.Fixture_Name_text__c = robj.FSD_Name_CHN__c; // 备品管理编码(借出时) robj.EquipmentSet_Managment_Code_text__c = null; String uniqueKeyStr = parentObj.RequestNoJoinStr2__c + ':' + robj.Rental_Apply_Equipment_Set__c + ':' + robj.FSD_Id__c + ':' + robj.IndexFromUniqueKey__c; robj.UniqueKey__c = uniqueKeyStr; mfUpsert.put(robj.UniqueKey__c, robj); } if (!mfUpsert.isEmpty()) { FixtureUtil.withoutUpsertRaesd(mfUpsert.values()); } } else { throw new ControllerUtil.myException('没有下架前已分配的附属品'); } } catch (Exception ex) { ApexPages.addMessages(ex); Database.rollback(sp); return null; } // 刷新画面 PageReference pg = new PageReference('/apex/AccessorySelect'); pg.getParameters().put('pt_recid', parentId); pg.setRedirect(true); return pg; } // https://sohobb.backlog.jp/view/OLY_OCM-152#comment-20041467 // 一对一的附属品 不能 单独 取消 public PageReference cancel() { Savepoint sp = Database.setSavepoint(); try { List raesds = new List(); List delIds = new List(); for (WrapperInfo wprInfo : viewList) { Rental_Apply_Equipment_Set_Detail__c robj = (Rental_Apply_Equipment_Set_Detail__c) wprInfo.sobj; //出库后不能取消 //关联主体分配画面,一览Handler //附属品分配画面 if (wprInfo.check) { if (robj.OneToOne_Flag__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '一对一分配的附属品不能单独取消')); return null; } else if (robj.DeliverySlip__c != null) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '已经发货的明细不能取消')); return null; } else { // 状态为待分配,备品中心created的明细,可以delete;其余的不可以删除 if (robj.CreatedBy.ProfileId == System.Label.ProfileId_EquipmentCenter && robj.Select_Time__c == null) { // 删除明细Id delIds.add(robj.Id); } else { if (String.isBlank(robj.Cancel_Reason__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '请输入取消理由')); return null; } //20210818 SFDC-C448KZ ljh start if (String.isBlank(robj.Loaner_cancel_reason__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '请输入明细取消理由')); return null; } if (robj.Loaner_cancel_reason__c == '其他' && String.isBlank(robj.Loaner_cancel_Remarks__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '请输入取消理由备注')); return null; } // if (String.isBlank(robj.Loaner_cancel_Remarks__c)) { // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '请输入备品申请取消理由备注')); // return null; // } //20210818 SFDC-C448KZ ljh end wprInfo.check = false; // 取消分配 robj.Cancel_Select__c = true; // 备品申请取消时间 robj.Cancel_Date__c = Date.today(); robj.Cancel_Time__c = MainFixtureSelectController.getCurrentTime(); // 取消者 robj.Cancel_Mem__c = UserInfo.getUserId(); // 取消理由备注 //robj.Loaner_cancel_Remarks__c robj.Loaner_cancel_Remarks__c = robj.Loaner_cancel_Remarks__c == null ? robj.Loaner_cancel_reason__c : robj.Loaner_cancel_Remarks__c; //20210818 SFDC-C448KZ ljh end //※已经分配的場合 トリがでやります //if(!String.isBlank(robj.Asset__c) && robj.Select_Time__c != null) { //借出备品Set一览明细 trigger 里 clear Asset__c //借出备品Set一览明细.分配时间 // if (robj.Select_Time__c != null) { // robj.Select_Time__c = null; // } //} raesds.add(robj); } } } } if (delIds.size() > 0) { // 削除 FixtureUtil.delRAESDByIds(parentObj, delIds); } if (raesds.size() > 0) { FixtureUtil.withoutUpdate(raesds); // 取消操作,只是取消已选择的分配,画面刷新 PageReference pg = new PageReference('/apex/AccessorySelect'); pg.getParameters().put('pt_recid', parentId); pg.setRedirect(true); return pg; } } catch (Exception e) { ApexPages.addMessages(e); Database.rollback(sp); return null; } return null; } public override void setViewList(List queryList) { viewList = new List(); if (selectedData.size() == 0) { throw new ControllerUtil.myException('配套没有对应的附属品数据。'); } String bieWhere = ' and Internal_asset_location__c = \'' + String.escapeSingleQuotes(bieCunFangDi) + '\''; // #OLY_OCM-654 保有设备合并后,取出的第一条一览明细的本部可能为空,本部为空的时候作为营业本部检索本部为空的保有设备。所以不需要isNotBlank的Check了 Start if (FixtureUtil.needSalesdepartment.contains(bieBenBu)) { bieWhere += ' and Salesdepartment__c = \'' + String.escapeSingleQuotes(bieBenBu) + '\''; } else { bieWhere += ' and Salesdepartment__c IN ' + FixtureUtil.otherBenbus; } // #OLY_OCM-654 保有设备合并后,取出的第一条一览明细的本部可能为空,本部为空的时候作为营业本部检索本部为空的保有设备。所以不需要isNotBlank的Check了 End // //产品分类 // if (String.isNotBlank(bieChanPinFenLei)) { // bieWhere += 'and Product_category__c = \'' + String.escapeSingleQuotes(bieChanPinFenLei) + '\''; // } // //别备品分类 // if (String.isNotBlank(bieBiePinFenLei)) { // bieWhere += 'and Equipment_Type__c = \'' + String.escapeSingleQuotes(bieBiePinFenLei) + '\''; // } if (String.isBlank(pageRaesd.Id)) { pageRaesd.Id = selectedData[0].Id; } // 保证分配顺序 Map> autoSelectMap = new Map>(); // 自动分配对象 Map> autoRsdMap = new Map>(); Map> rsdMap = FixtureUtil.raesdGroupBy( selectedData, myComponentController.columus, bieWhere ); // 選択済みの明细 if (selectedData.size() > 0) { for (Integer i = 0; i < selectedData.size(); i++) { /* not include the selected data num */ // 501を超えた場合前500のみを出す //if (i == getSearchNumMax()) continue; Rental_Apply_Equipment_Set_Detail__c rsdObj = (Rental_Apply_Equipment_Set_Detail__c) selectedData[i]; Map rsdGroupInfo = rsdMap.get(rsdObj); for (String apikey : rsdGroupInfo.keySet()) { // これを動態にする必要がある // 附属品分配 if (apikey.indexOf('_Jia__c') >= 0) { if (apikey == 'Fu_Shu_Pin_Fen_Pei_Jia__c') { Integer index = rsdGroupInfo.get(apikey).gnum; if (!String.isBlank(rsdObj.Asset__c) && rsdObj.Select_Time__c != null) { rsdObj.put( apikey, FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.assetFixtureStatus.Yi_Fen_Pei.ordinal()) ); } else { rsdObj.put(apikey, FixtureUtil.assetFixtureStatusMap.get(index)); } } // liucheng 20171112 else { rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); } } //if (apikey.indexOf('_Jia__c') >= 0 && apikey != 'Fu_Shu_Pin_Fen_Pei_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 有效库存 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'You_Xiao_Kun_Cun_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 已借出 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'Yi_Jie_Chu_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 待修理 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'Dai_Xiu_Li_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 别存放地库存 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'Bie_Cun_Fang_Di_Ku_Cun_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 别本部库存 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'Bie_Ben_Bu_Ku_Cun_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} //// 别用途库存 //if (apikey.indexOf('_Jia__c') >= 0 && apikey == 'Bie_Yong_Tu_Ku_Cun_Jia__c') { // rsdObj.put(apikey, rsdGroupInfo.get(apikey).gnum); //} } // 一对一不能单独分配 TODO 能单独分配 if (rsdObj.OneToOne_Flag__c) { showButtonList.add(true); } else { showButtonList.add(false); // 可以分配の場合 if ( FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.assetFixtureStatus.Ke_Yi_Fen_Pei.ordinal()) == rsdObj.Fu_Shu_Pin_Fen_Pei_Jia__c ) { if (!autoRsdMap.containsKey(rsdObj.FSD_Fixture_Model_No__c)) { autoRsdMap.put(rsdObj.FSD_Fixture_Model_No__c, new List()); autoSelectMap.put(rsdObj.FSD_Fixture_Model_No__c, new List()); } List autoRsdList = autoRsdMap.get(rsdObj.FSD_Fixture_Model_No__c); autoRsdList.add(rsdObj); } } viewList.add(new WrapperInfo(rsdObj, myComponentController)); viewList[viewList.size() - 1].lineNo = viewList.size() - 1; viewList[viewList.size() - 1].check = true; viewList[viewList.size() - 1].oldCheck = true; } if (!autoRsdMap.isEmpty()) { // Fixture_Model_No_F__c => {Asset.Id => 集中管理库存数} Map> autoKuCunMapMap = new Map>(); // 累计借出数が少ないものを優先的に表示 // OLY_OCM-134#comment-20049943 Set moset = autoRsdMap.keySet(); System.debug('moset ===' + moset); // 検索条件 String dateToday = String.valueOf(Date.today()); String soql = 'SELECT Id, Fixture_Model_No_F__c, Pre_Arrival_wh_time__c, Ji_Zhong_Guan_Li_Ku_Cun__c,' + ' SerialNumber, Salesdepartment__c, Internal_asset_location__c,' + ' You_Xiao_Ku_Cun__c, Out_of_wh__c, Repairing_Count__c' + ' FROM Asset' + ' WHERE Asset_Owner__c = \'Olympus\' AND ' + FixtureUtil.getAssetSoqlBase() + ' and Asset_loaner_category__c != \'耗材\'' + ' and RecordTypeId = \'01210000000kOPR\'' + ' and Loaner_accsessary__c = true' + ' and Equipment_Type__c != \'检测用备品\'' + ' and Delete_Flag__c = False' + ' and Freeze_sign_Abandoned_Flag__c = False' + ' and (Consumable_Guaranteen_end__c = null or Consumable_Guaranteen_end__c >=' + dateToday + ')' + ' and Fixture_OneToOne_Link__c = null' + // 附属品一对一的个体管理不能检索出来 ' and Internal_asset_location__c != null' + ' and Product2.Fixture_Model_No_T__c IN :moset' + bieWhere + +' and Ji_Zhong_Guan_Li_Ku_Cun__c > 0'; // 有集中管理库存的 soql += ' ORDER BY Product2.Fixture_Model_No_T__c, Consumable_Guaranteen_end__c ASC NULLS LAST, Ji_Zhong_Guan_Li_Ku_Cun__c DESC, Pre_Arrival_wh_time__c ASC NULLS FIRST, Id DESC'; System.debug('bieWhere' + bieWhere); List assignList = Database.query(soql); for (Asset aSet : assignList) { List autoSelectList = autoSelectMap.get(aSet.Fixture_Model_No_F__c); autoSelectList.add(aSet); autoSelectMap.put(aSet.Fixture_Model_No_F__c, autoSelectList); if (!autoKuCunMapMap.containsKey(aSet.Fixture_Model_No_F__c)) { autoKuCunMapMap.put(aSet.Fixture_Model_No_F__c, new Map()); } Map autoKuCunMap = autoKuCunMapMap.get(aSet.Fixture_Model_No_F__c); //修理中的数量减去 autoKuCunMap.put(aSet.Id, aSet.Ji_Zhong_Guan_Li_Ku_Cun__c.intValue() - aSet.Repairing_Count__c.intValue()); } // 自动分配 // Fixture_Model_No_F__c 的 Loop (会有 Fixture_Model_No_F__c 一样的借出明细) for (String modelNo : autoKuCunMapMap.keySet()) { List autoSelectList = autoSelectMap.get(modelNo); Map autoKuCunMap = autoKuCunMapMap.get(modelNo); List autoRsdList = autoRsdMap.get(modelNo); // Rental_Apply_Equipment_Set_Detail__c 的 Loop for (Integer autoIdx = 0; autoIdx < autoRsdList.size(); autoIdx++) { Rental_Apply_Equipment_Set_Detail__c rsdObj = autoRsdList[autoIdx]; // Asset 的 Loop // autoSelectList より 自动分配 最初有集中有效在库的Asset for (Asset aSet : autoSelectList) { Integer autoKuCun = autoKuCunMap.get(aSet.Id); if (autoKuCun > 0) { rsdObj.Asset__c = aSet.Id; rsdObj.Asset__r = aSet; // TODO Select Asset より 表示Fieldの設定 myComponentController.strColumus autoKuCun--; autoKuCunMap.put(aSet.Id, autoKuCun); break; // 下一条借出明细 } } if (String.isBlank(rsdObj.Asset__c)) { rsdObj.put( 'Fu_Shu_Pin_Fen_Pei_Jia__c', FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Mei_You_Ku_Cun.ordinal()) ); } } } } } if (queryList.size() == 0) { return; } system.debug('●●●●● setViewList END '); } public override void checkEvent() { Rental_Apply_Equipment_Set_Detail__c lineInfo = (Rental_Apply_Equipment_Set_Detail__c) viewList[clickLineNo].sobj; // 一对一不能单独分配 if (lineInfo.OneToOne_Flag__c) { goAccessoryAdd = null; ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '一对一不能单独分配')); } else { //回QueuePageByAssetId的URL goAccessoryAdd = '/apex/AccessoryAdd?recid=' + String.escapeSingleQuotes(lineInfo.Id); } } // 一对一并且状态是已分配时,button灰调 public String getBodyModelNoJson() { return JSON.serialize(showButtonList); } }