public without sharing class TransferApplyDetailHandler extends Oly_TriggerHandler { private Map newMap; private Map oldMap; private List newList; private List oldList; private static Map assMap = new Map(); // new Only private static Map assUpdMap = new Map(); // new と old,用于更新明细连着的Asset private static Map newAssetMap = new Map(); // ukey->Asset,明细没有连着的,调拨后需要更新或新建的Asset private static Map> uKeyMap = new Map>(); // ukeyMap private static String userid = UserInfo.getUserId(); private static DateTime now = System.now(); public TransferApplyDetailHandler() { this.newMap = (Map) Trigger.newMap; this.oldMap = (Map) Trigger.oldMap; if(this.oldMap == null) { this.oldMap = new Map(); } this.newList = (List) Trigger.new; this.oldList = (List) Trigger.old; if(this.oldList == null) { this.oldList = new List(); } } protected override void beforeInsert() { beforeSetValue(); } protected override void beforeUpdate() { beforeSetValue(); } protected override void afterInsert() { setFirstDetail(); Set assIds = new Set(); for (TransferApplyDetail__c raesd : newList) { if (String.isNotBlank(raesd.Asset__c)) { assIds.add(raesd.Asset__c); } } if (Trigger.isInsert && !assIds.isEmpty()) { assMap = getAsset(assIds); } changeAsset(); changeAssetLast(); if (!assUpdMap.isEmpty()) { update assUpdMap.values(); } // 修改link里的调拨冻结数 changeOneToOneLinkFronze(); formulaToTextCheck(); } protected override void afterUpdate() { setFirstDetail(); Set assIds = new Set(); for (TransferApplyDetail__c raesd : oldList) { if (String.isNotBlank(raesd.Asset__c)) { assIds.add(raesd.Asset__c); } } for (TransferApplyDetail__c raesd : newList) { if (String.isNotBlank(raesd.Asset__c)) { assIds.add(raesd.Asset__c); } } if (Trigger.isUpdate && !assIds.isEmpty()) { assMap = getAsset(assIds); } changeAsset(); changeAssetLocation(); clearLastReserveTAESD(); Oly_TriggerHandler.bypass(AssetHandlerCheck.class.getName()); if (!assUpdMap.isEmpty()) { update assUpdMap.values(); } if(!newAssetMap.isEmpty()) { upsert newAssetMap.values(); } Oly_TriggerHandler.clearBypass(AssetHandlerCheck.class.getName()); // 修改link里的调拨冻结数 changeOneToOneLinkFronze(); // 下架时删link deleteOneToOneLink(); // 上架时建link createOneToOneLink(); oneToOne4XX(); formulaToTextCheck(); receivedConfirmNGSetReturnDeliverySlipText(); setToTa_BeforeOrReturnOrCancle_Text();//20201104 ljh add OCSM_BP5-35 if(!newAssetMap.isEmpty()) { List tdList = new List(); for (String ukey : uKeyMap.keySet()) { Id assetId = newAssetMap.get(ukey).Id; for (Id noId : uKeyMap.get(ukey)) { tdList.add(new TransferApplyDetail__c(Id = noId, Asset_After__c = assetId)); } } newAssetMap.clear(); if (tdList.size() > 0) { update tdList; } } } protected override void afterDelete() { deleteReFirst(); } private Map getAsset(Set assIds) { return new Map([ Select Id , RecordTypeId , Name //, AccountId , Quantity , Status , Manage_type__c , Abandoned_Inventory__c , Abandoned_RealThing__c , CountForRepair__c , Confirm_Lost_Count__c , Consumable_Guaranteen_end__c , Fixture_Model_No_F__c , SerialNumber , Asset_loaner_category__c , Product2Id , unknow_serial_NO_product__c , Product_Serial_No__c , AssetMark__c , Internal_asset_location__c , Salesdepartment__c , SalesProvince__c , Equipment_Type__c , EquipmentSet_Managment_Code__c , WH_location__c , TransferFrozenQuantity__c , TransferFrozenAbandon__c , TransferFrozenRepair__c , TransferFrozenLost__c , Barcode__c , Hospital__c , Asset_Cutoff_Date__c , Asset_Cutoff_FinalDate__c , Assign_Agency_FirstDate__c , Assign_Agency_FinalDate__c , Internal_Asset_number_key__c From Asset Where Id =: assIds and Asset_loaner_category__c != '耗材' and RecordTypeId = '01210000000kOPR' FOR UPDATE]); } private void setFirstDetail() { Map tasMap = new Map(); for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = null; if(oldMap.containsKey(nObj.Id)) { oObj = oldMap.get(nObj.Id); } if ((oObj == null && nObj.First_TAD_Id_F__c == null) || (oObj != null && oObj.Is_First_TAD_F__c && !oObj.Cancel_Select__c && nObj.Cancel_Select__c)) // 第一条明细被取消 { TransferApplySummary__c tas = new TransferApplySummary__c( Id = nObj.TransferApplySummary__c); tasMap.put(nObj.TransferApplySummary__c, tas); } } if (tasMap.isEmpty()) { return; } List tadList = [Select Id, TransferApplySummary__c, Cancel_Select__c From TransferApplyDetail__c Where TransferApplySummary__c = :tasMap.keySet() ORDER BY TransferApplySummary__c, Main_OneToOne__c DESC, Cancel_Select__c, Name ASC nulls last ]; Id raesId = null; for (TransferApplyDetail__c tad : tadList) { if (raesId != tad.TransferApplySummary__c) { TransferApplySummary__c tas = tasMap.get(tad.TransferApplySummary__c); if(tad.Cancel_Select__c) { tas.Cancel_Select__c = true; tas.Cancel_Reason__c = '主动取消'; } else { tas.First_TAD__c = tad.Id; } raesId = tad.TransferApplySummary__c; } } update tasMap.values(); } private void formulaToTextCheck() { List raesds = new List(); for (TransferApplyDetail__c nObj : newList) { //明细状态没有修理完毕所以修理完毕的时候不拷贝状态到Text字段 if ((nObj.Repair_Status_Text__c != nObj.Repair_Status_F__c && nObj.Repair_Status_F__c != '修理完毕') || nObj.Return_Status_Text__c != nObj.Return_Status_F__c || nObj.Shipment_Status_Text__c != nObj.Shipment_Status_F__c || (nObj.ApplyPersonAppended__c != nObj.ApplyPersonAppended_F__c && Trigger.isInsert) ) { TransferApplyDetail__c raesd = new TransferApplyDetail__c(Id = nObj.Id); //明细状态没有修理完毕所以修理完毕的时候不拷贝状态到Text字段 if (nObj.Repair_Status_F__c != '修理完毕') { raesd.Repair_Status_Text__c = nObj.Repair_Status_F__c; } raesd.Return_Status_Text__c = nObj.Return_Status_F__c; raesd.Shipment_Status_Text__c = nObj.Shipment_Status_F__c; if (Trigger.isInsert) { raesd.ApplyPersonAppended__c = nObj.ApplyPersonAppended_F__c; } raesds.add(raesd); } } if (!raesds.isEmpty()) { update raesds; } } private void beforeSetValue() { //20201109 ljh add start Set tasSet = new Set(); for (TransferApplyDetail__c nObj : newList) { tasSet.add(nObj.TransferApplySummary__c); } Map tasMap = new Map([Select Id, Name,Name_F__c,First_TAD_Model_No_F__c,IndexFromUniqueKey__c From TransferApplySummary__c Where Id =: tasSet]); //20201109 ljh add end for (TransferApplyDetail__c nObj : newList) { //因为是Insert时候设值 情况1,申请新建会设值 情况2,NG拷贝出来的时候会设值 if (Trigger.isInsert) { // 272チケット // Create_State__c为空并且申请书的标准批准时间不为空的时候设置为1 // 1 --- 追加附属品 // 0 --- Cancel拷贝 // null --- 普通新规 if (nObj.Create_State__c == null && nObj.Transfer_Apply_Request_approval_time_F__c != null) { nObj.Create_State__c = 1; } nObj.TransferCount__c = 1; nObj.Loaner_accsessary__c = nObj.Loaner_accsessary_F__c; } if (nObj.DeliverySlip__c != null && nObj.Shippment_loaner_time__c == null) { nObj.Shippment_loaner_time__c = nObj.Shippment_loaner_time_F__c; } nObj.RecordTypeDeNameText__c = nObj.RecordType_F__c; //nObj.DeliverySlip_Text__c = nObj.DeliverySlip__c; nObj.Return_DeliverySlip_Text__c = nObj.Return_DeliverySlip__c; //nObj.Received_Confirm_Text__c = nObj.Received_Confirm_F__c; nObj.Transfer_Apply_Request_approval_time__c = nObj.ApplyPersonAppended_F__c?nObj.Add_Request_approval_time__c:nObj.Transfer_Apply_Request_approval_time_F__c;// 20210723 ljh add SFDC-C56D3K 处理历史数据 TransferApplyDetail__c oObj = null; if (Trigger.isUpdate) { oObj = oldMap.get(nObj.Id); if (oObj.ArrivalResult__c != nObj.ArrivalResult__c) { //nObj.Lost_item_check_staff__c = null; //nObj.Lost_item_check_time__c = null; //nObj.Check_lost_Item__c = null; nObj.ArrivalResult_User__c = userid; nObj.ArrivalResult_DateTime__c = now; nObj.Inspection_result_after_ng__c = null; nObj.Inspection_staff_After__c = null; nObj.Inspection_result_after__c = null; nObj.After_Inspection_time__c = null; //20210108 ljh update start if(String.isNotBlank(oObj.Check_lost_Item__c) && oObj.Check_lost_Item__c == '欠品'){ if (nObj.ArrivalResult__c == '欠品') { nObj.Check_lost_Item_Final__c = '欠品'; } else if (nObj.ArrivalResult__c == 'OK') { nObj.Check_lost_Item_Final__c = 'OK'; } else if (nObj.ArrivalResult__c == 'NG') { nObj.Check_lost_Item_Final__c = 'OK'; if(String.isNotBlank(nObj.Return_DeliverySlip__c)){ nObj.Inspection_result_after_Final__c = 'NG'; } } }else{ if (nObj.ArrivalResult__c == '欠品') { nObj.Check_lost_Item__c = '欠品'; } else if (nObj.ArrivalResult__c == 'OK') { nObj.Check_lost_Item__c = 'OK'; } else if (nObj.ArrivalResult__c == 'NG') { nObj.Check_lost_Item__c = 'OK'; if(String.isNotBlank(nObj.Return_DeliverySlip__c)){ nObj.Inspection_result_after_Final__c = 'NG'; } } } /*if (oObj.ArrivalResult__c != '欠品') { if (nObj.ArrivalResult__c == '欠品') { nObj.Check_lost_Item__c = '欠品'; } else if (nObj.ArrivalResult__c == 'OK') { nObj.Check_lost_Item__c = 'OK'; } else if (nObj.ArrivalResult__c == 'NG') { nObj.Check_lost_Item__c = 'OK'; // nObj.Inspection_result_after__c = 'NG'; } } else { if (nObj.ArrivalResult__c == '欠品') { nObj.Check_lost_Item_Final__c = '欠品'; } else if (nObj.ArrivalResult__c == 'OK') { nObj.Check_lost_Item_Final__c = 'OK'; } else if (nObj.ArrivalResult__c == 'NG') { nObj.Check_lost_Item_Final__c = 'OK'; nObj.Inspection_result_after_Final__c = 'NG'; } }*/ //20210108 ljh update end } //出库前检查NGの場合キャンセルします if(oObj.Inspection_result__c != 'NG' && nObj.Inspection_result__c == 'NG') { nObj.Cancel_Select__c = true; nObj.Cancel_Mem__c = userid; nObj.Cancel_Time__c = now; nObj.Cancel_Reason__c = '出库前检查NG'; //nObj.Asset__c = null; } if (oObj.Inspection_result__c != nObj.Inspection_result__c && String.isNotBlank(nObj.Inspection_result__c)) { nObj.Pre_inspection_time__c = now; nObj.Inspection_staff__c = userid; } if (oObj.Asset_return_time__c == nObj.Asset_return_time__c) { if (oObj.Check_lost_Item_Final__c != nObj.Check_lost_Item_Final__c && String.isNotBlank(nObj.Check_lost_Item_Final__c)) { nObj.Lost_item_check_time_Final__c = now; nObj.Lost_item_check_staff_Final__c = userid; //nObj.Return_DeliverySlip__c = null; } if (oObj.Check_lost_Item__c != nObj.Check_lost_Item__c && String.isNotBlank(nObj.Check_lost_Item__c)) { nObj.Lost_item_check_time__c = now; nObj.Lost_item_check_staff__c = userid; } if (oObj.CDS_complete__c != nObj.CDS_complete__c && nObj.CDS_complete__c) { nObj.CDS_complete_time__c = now; nObj.CDS_staff__c = userid; } if (oObj.Inspection_result_after_Final__c != nObj.Inspection_result_after_Final__c && String.isNotBlank(nObj.Inspection_result_after_Final__c)) { nObj.After_Inspection_time_Final__c = now; nObj.Inspection_staff_After_Final__c = userid; } if (oObj.Inspection_result_after__c != nObj.Inspection_result_after__c && String.isNotBlank(nObj.Inspection_result_after__c)) { nObj.After_Inspection_time__c = now; nObj.Inspection_staff_After__c = userid; } } if (nObj.Cancel_Select__c) { if (nObj.StockDown__c && nObj.Inspection_result__c != 'NG' && String.isBlank(nObj.DeliverySlip__c)) { nObj.OnStock_By_Cancel__c = true; } } if (Trigger.isInsert || oObj.Cancel_Select__c != nObj.Cancel_Select__c) { if (nObj.Cancel_Select__c) { nObj.Cancel_Time__c = now; nObj.Cancel_Mem__c = userid; // 未下架和办事处下架要清,其它下架后取消不清 if(!nObj.StockDown__c || nObj.RecordType_F__c == 'AgencyToCenter') { nObj.Asset__c = null; nObj.StockDown__c = false; nObj.StockDown_time__c = null; nObj.StockDown_staff__c = null; nObj.Shipment_request_time2__c = null; } nObj.Shipment_request_time2__c = null; } else { nObj.Cancel_Time__c = null; nObj.Cancel_Mem__c = null; nObj.Cancel_Reason__c = null; } } // 归还后CDS if (Trigger.isInsert || oObj.CDS_complete__c != nObj.CDS_complete__c) { if (nObj.CDS_complete__c) { nObj.CDS_complete_time__c = now; nObj.CDS_staff__c = userid; } else { nObj.CDS_complete_time__c = null; nObj.CDS_staff__c = null; } } if (Trigger.isUpdate && ((oObj.Inspection_result_after_Final__c != 'NG' && nObj.Inspection_result_after_Final__c == 'NG' && nObj.Inspection_result_after_NG_Final__c == '维修') || (oObj.Inspection_result_after__c != 'NG' && nObj.Inspection_result_after__c == 'NG' && nObj.Inspection_result_after_NG__c == '维修') ) ) { nObj.Repair__c = null; } // OLY_OCM-531 Start 搬工作流规则 if (nObj.Check_lost_Item_F__c == '欠品' && nObj.Loaner_Giveup_Time__c == null && nObj.Lost_item_giveup__c == true) { nObj.Loaner_Giveup_Time__c = Datetime.now(); } // OLY_OCM-531 End if (Trigger.isUpdate &&oObj.Confirm_Lost_Date__c != null && oObj.Check_lost_Item_F__c != nObj.Check_lost_Item_F__c && oObj.Check_lost_Item_F__c == '欠品') { nObj.Confirm_Lost_Date__c = null; } if (Trigger.isUpdate && oObj.Arrival_in_wh__c == false && nObj.Arrival_in_wh__c == true && nObj.Manage_type_F__c == '个体管理') { nObj.Asset_After__c = nObj.Asset__c; } } //20201109 ljh OCSM_BP5-44 调拨单设定对应_申请,一览,明细的命名规则 start TransferApplySummary__c tas = tasMap.get(nObj.TransferApplySummary__c); //IndexFromUniqueKey__c.format()会报错 要判不是Null if ( tas != null && tas.IndexFromUniqueKey__c != null && nObj.IndexFromUniqueKey__c != null ) { nObj.Name = tas.Name_F__c + ':'+tas.First_TAD_Model_No_F__c+':'+tas.IndexFromUniqueKey__c.format().leftpad(3, '0'); nObj.Name += ':' + nObj.FSD_SortInt__c.format().leftpad(2, '0') + ':'+ nObj.IndexFromUniqueKey__c.format().leftpad(3, '0'); //取消的时候名字加Canceled if (nObj.Cancel_Select__c) { nObj.Name += ':Canceled'; } } //20201109 ljh OCSM_BP5-44 调拨单设定对应_申请,一览,明细的命名规则 end } } private void changeAssetFrozen(TransferApplyDetail__c nObj, Asset ass, Integer cnt) { changeAssetFrozen(nObj, ass, cnt, false); } /** @description 修改保有设备里的各个调拨冻结数 @param nObj 调拨明细 @param ass 保有设备 @param cnt +1或-1 @param isFinish 是否要反映到有效库存 */ private void changeAssetFrozen(TransferApplyDetail__c nObj, Asset ass, Integer cnt, Boolean isFinish) { switch on nObj.TransferType__c { when '待废弃' { ass.TransferFrozenAbandon__c = intValueOf(ass.TransferFrozenAbandon__c) + cnt; if(isFinish) { ass.Abandoned_RealThing__c = intValueOf(ass.Abandoned_RealThing__c ) + cnt; } } when '待修理' { ass.TransferFrozenRepair__c = intValueOf(ass.TransferFrozenRepair__c) + cnt; if(isFinish) { ass.CountForRepair__c = intValueOf(ass.CountForRepair__c) + cnt; } } when '丢失找回' { ass.TransferFrozenLost__c = intValueOf(ass.TransferFrozenLost__c) + cnt; if(isFinish) { ass.Abandoned_Inventory__c = intValueOf(ass.Abandoned_Inventory__c) + cnt; } } when else { ass.TransferFrozenQuantity__c = intValueOf(ass.TransferFrozenQuantity__c) + cnt; } } } private void changeAsset() { if (Trigger.isAfter) { if (assMap.isEmpty()) { return; } for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = null; if (Trigger.isUpdate) { oObj = oldMap.get(nObj.Id); } Asset ass = null; if (assMap.containsKey(nObj.Asset__c)) { ass = assMap.get(nObj.Asset__c); } else if(oObj != null && assMap.containsKey(oObj.Asset__c)) { ass = assMap.get(oObj.Asset__c); } if(ass == null) { continue; } // Abandoned_Inventory__c null -> 0 if (ass.Abandoned_Inventory__c == null) { ass.Abandoned_Inventory__c = 0; } // Abandoned_RealThing__c null -> 0 if (ass.Abandoned_RealThing__c == null) { ass.Abandoned_RealThing__c = 0; } if (ass.Confirm_Lost_Count__c == null) { ass.Confirm_Lost_Count__c = 0; } if (ass.TransferFrozenQuantity__c == null) { ass.TransferFrozenQuantity__c = 0; } if (ass.CountForRepair__c == null) { ass.CountForRepair__c = 0; } if(oObj == null) { // 备品中心直接追加的明细 if(nObj.Approved_F__c) { if(nObj.RecordType_F__c != 'InsideCenter') { changeAssetFrozen(nObj, ass, 1); assUpdMap.put(ass.Id, ass); } } continue; } // 审批后下架前取消时,要解冻 if (nObj.Approved_F__c && !nObj.StockDown__c && !oObj.Cancel_Select__c && nObj.Cancel_Select__c) { changeAssetFrozen(nObj, ass, -1); assUpdMap.put(ass.Id, ass); } // 首次提交审批 else if(nObj.Create_State__c == null && oObj.Request_time__c != nObj.Request_time__c) { // 提交时冻结数+1 if(nObj.Request_time__c != null) { // 一对一附属品不用占调拨冻结数 if(nObj.RecordType_F__c != 'InsideCenter') { changeAssetFrozen(nObj, ass, 1); assUpdMap.put(ass.Id, ass); } } // 驳回时冻结数-1 else { if(nObj.RecordType_F__c != 'InsideCenter') { changeAssetFrozen(nObj, ass, -1); assUpdMap.put(ass.Id, ass); } } } // 提交追加审批 else if(nObj.Create_State__c == 1 && oObj.Add_Request_demo_time__c != nObj.Add_Request_demo_time__c) { // 提交时冻结数+1 if (nObj.Add_Request_demo_time__c != null) { if(nObj.RecordType_F__c != 'InsideCenter') { changeAssetFrozen(nObj, ass, 1); assUpdMap.put(ass.Id, ass); } } // 驳回时冻结数-1 else { if(nObj.RecordType_F__c != 'InsideCenter') { changeAssetFrozen(nObj, ass, -1); assUpdMap.put(ass.Id, ass); } } } if (String.isBlank(oObj.Check_lost_Item_F__c) && nObj.Check_lost_Item_F__c == 'OK') { //空->OK } else if (String.isBlank(oObj.Check_lost_Item_F__c) && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == false) { //空->欠品 } else if (String.isBlank(oObj.Check_lost_Item_F__c) && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == true) { //空->欠品 and 放弃欠品回收(丢失)时,待废弃数(丢失/盘亏)加1,调拨冻结数-1 ass.Abandoned_Inventory__c += 1; changeAssetFrozen(nObj, ass, -1, true); if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (String.isBlank(oObj.Check_lost_Item_F__c) && nObj.Check_lost_Item_F__c == '消耗') { // 空->消耗,数量-1,调拨冻结数-1 ass.Quantity -= 1; changeAssetFrozen(nObj, ass, -1, true); ass.ChangeQuantityReason__c = '消耗'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == 'OK' && String.isBlank(nObj.Check_lost_Item_F__c)) { //OKから空白に変更時何もしません } else if (oObj.Check_lost_Item_F__c == 'OK' && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == false) { //OKから欠品に変更時何もしません } else if (oObj.Check_lost_Item_F__c == 'OK' && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == true) { //OK->欠品 and 放弃欠品回收(丢失)时,待废弃数(丢失/盘亏)加1,调拨冻结数-1 ass.Abandoned_Inventory__c += 1; changeAssetFrozen(nObj, ass, -1, true); if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == 'OK' && nObj.Check_lost_Item_F__c == '消耗') { //OK->消耗,数量-1,调拨冻结数-1 ass.Quantity -= 1; changeAssetFrozen(nObj, ass, -1, true); ass.ChangeQuantityReason__c = '消耗'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && String.isBlank(nObj.Check_lost_Item_F__c) && oObj.Lost_item_giveup__c == false) { if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == 'OK' && oObj.Lost_item_giveup__c == false) { if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == '欠品' && oObj.Lost_item_giveup__c == false && nObj.Lost_item_giveup__c == true) { //欠品 且 放弃欠品回收(丢失)时,待废弃数(丢失/盘亏)+1,调拨冻结数-1 ass.Abandoned_Inventory__c += 1; changeAssetFrozen(nObj, ass, -1, true); if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == '消耗' && oObj.Lost_item_giveup__c == false) { //欠品->消耗,数量-1,调拨冻结数-1 ass.Quantity -= 1; changeAssetFrozen(nObj, ass, -1, true); ass.ChangeQuantityReason__c = '消耗'; if (oObj.Confirm_Lost_Date__c != null) { ass.Confirm_Lost_Count__c -= 1; } assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && String.isBlank(nObj.Check_lost_Item_F__c) && oObj.Lost_item_giveup__c == true) { //欠品放棄から空白に変更時 待废弃数(丢失/盘亏)减1 ass.Abandoned_Inventory__c -= 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '欠品' + '->' + ''; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == 'OK' && oObj.Lost_item_giveup__c == true) { //欠品放棄からOKに変更時 待废弃数(丢失/盘亏)减1 ass.Abandoned_Inventory__c -= 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '欠品' + '->' + 'OK'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == '欠品' && oObj.Lost_item_giveup__c == true && nObj.Lost_item_giveup__c == false) { //欠品放棄から欠品に変更時 待废弃数(丢失/盘亏)减1 ass.Abandoned_Inventory__c -= 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '欠品放弃 -> ' + '欠品'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '欠品' && nObj.Check_lost_Item_F__c == '消耗' && oObj.Lost_item_giveup__c == true) { //欠品放棄から消耗に変更時 待废弃数(丢失/盘亏)减1 Quantityを-1 ass.Abandoned_Inventory__c -= 1; ass.Quantity -= 1; } else if (oObj.Check_lost_Item_F__c == '消耗' && String.isBlank(nObj.Check_lost_Item_F__c)) { //消耗から空白に変更時Quantityを+1 ass.Quantity += 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '消耗 -> ' + ''; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '消耗' && nObj.Check_lost_Item_F__c == 'OK') { //消耗から空白に変更時Quantityを+1 ass.Quantity += 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '消耗 -> ' + 'OK'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '消耗' && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == false) { //消耗->欠品,数量+1,调拨冻结数+1 ass.Quantity += 1; changeAssetFrozen(nObj, ass, 1, true); ass.ChangeQuantityReason__c = '消耗 -> 欠品'; assUpdMap.put(ass.Id, ass); } else if (oObj.Check_lost_Item_F__c == '消耗' && nObj.Check_lost_Item_F__c == '欠品' && nObj.Lost_item_giveup__c == true) { //消耗->欠品 and 放棄, 待废弃数(丢失/盘亏)+1,数量+1 ass.Quantity += 1; ass.Abandoned_Inventory__c += 1; assUpdMap.put(ass.Id, ass); } //待废弃 if (nObj.TAESD_Status__c == FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Fei_Qi.ordinal()) && oObj.TAESD_Status__c != nObj.TAESD_Status__c && ass.Manage_type__c == '个体管理') { ass.Status = FixtureUtil.assetStatusMap.get(FixtureUtil.AssetStatus.Dai_Fei_Qi.ordinal()); assUpdMap.put(ass.Id, ass); } } } } /* * 回库确认 OFF -> ON: * 取消分配 OFF -> ON: * 放弃欠品 OFF -> ON * 已消耗 * * 清空Asset 最新备品申请借出明细 Last_Reserve_RAES_Detail__c * (nObj.Asset__c 変更しないため、changeAssetLast()でクリアできないため、ここでクリア) * * クラスの assUpdMap を更新するだけ */ private void clearLastReserveTAESD() { for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); // 主体和附属品 if (finishOrChangeAsset(Trigger.isDelete, oObj, nObj)) { Asset ass = null; if (assUpdMap.containsKey(oObj.Asset__c)) { ass = assUpdMap.get(oObj.Asset__c); } // 这里 会出现 assUpdMap 有 但是 assMap 没有的情况 if (ass == null //分配备品有变化 (下架前) && (oObj.Asset__c != null && oObj.Asset__c != nObj.Asset__c && nObj.StockDown__c == false)) { ass = new Asset(Id = oObj.Asset__c); } if (ass == null) { continue; } // 暂时放在这里 if (oObj.Manage_type_F__c == '个体管理') { ass.Last_Reserve_TAES_Detail__c = null; assUpdMap.put(ass.Id, ass); } } } } //nObj.Asset__cがある場合、変更した場合 private void changeAssetLast() { for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = null; if(Trigger.isUpdate){ oObj = oldMap.get(nObj.Id); } Asset nass = assMap.get(nObj.Asset__c); if (assUpdMap.containsKey(nObj.Asset__c)) { nass = assUpdMap.get(nObj.Asset__c); } else if (String.isNotBlank(nObj.Asset__c)) { nass = new Asset(Id = nObj.Asset__c); } if(oObj != null) { Asset oass = assMap.get(oObj.Asset__c); if (assUpdMap.containsKey(oObj.Asset__c)) { oass = assUpdMap.get(oObj.Asset__c); } else if (String.isNotBlank(oObj.Asset__c)) { oass = new Asset(Id = oObj.Asset__c); } //nObj.Asset__cがある場合、変更した場合 if (nObj.Asset__c != null && oObj.Asset__c != nObj.Asset__c && (oObj.Manage_type_F__c == '个体管理' || nObj.Manage_type_F__c == '个体管理')) { if (nObj.Manage_type_F__c == '个体管理') { nass.Last_Reserve_TAES_Detail__c = nObj.Id; assUpdMap.put(nass.Id, nass); } if (oObj.Manage_type_F__c == '个体管理') { oass.Last_Reserve_TAES_Detail__c = null; assUpdMap.put(oass.Id, oass); } } } else if (nObj.Asset__c != null && nObj.Manage_type_F__c == '个体管理') { nass.Last_Reserve_TAES_Detail__c = nObj.Id; assUpdMap.put(nass.Id, nass); } } } private void setAssetDate(Asset ass, String recordTypeName, Date today) { switch on recordTypeName { when 'AgencyToCenter', 'CenterToCenter' { if(ass.Asset_Cutoff_Date__c == null) { ass.Asset_Cutoff_Date__c = today; } else { ass.Asset_Cutoff_FinalDate__c = today; } } when 'CenterToAgency' { if(ass.Assign_Agency_FirstDate__c == null) { ass.Assign_Agency_FirstDate__c = today; } else { ass.Assign_Agency_FinalDate__c = today; } } } } // 上架存放地变更数量修改, private void changeAssetLocation() { Map newAssetCountMap = new Map(); // ukey -> 调拨后保有设备的数量 Map newAssetAbondonCountMap = new Map(); // ukey-> 调拨后保有设备的待废弃数 Map newTadMap = new Map(); // ukey -> 调拨明细,这些明细需要新建保有设备 Set ukeySet = new Set(); Account accountFJZ = [select Id, Hospital__c from Account where AgentCode_Ext__c = :System.Label.Account_Asset_FJZ]; Date today = System.today(); for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); if((oObj.Arrival_in_wh__c == false && nObj.Arrival_in_wh__c == true) || (nObj.RecordType_F__c == 'CenterToOther' && oObj.Shippment_loaner_time__c == null && nObj.Shippment_loaner_time__c != null)) { Asset ass = assMap.get(nObj.Asset__c); // 所有保有设备上架时都先在原设备上解冻 changeAssetFrozen(nObj, ass, -1, true); // 个体管理,直接改 if(ass.Manage_type__c == '个体管理') { if(String.isNotBlank(nObj.WH_location__c)) { ass.WH_location__c = nObj.WH_location__c; } // 调拨后待废弃上架 if( nObj.Arrival_wh_Abandoned_Flag_F__c) { ass.ChangeQuantityReason__c = FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Fei_Qi.ordinal()); ass.WH_location__c = '废弃区'; ass.Abandoned_RealThing__c += 1; } if(nObj.DeliverySlip__c == null || nObj.Return_DeliverySlip__c != null) { // 未发货,或发出后又寄回,上架时存放地等字段不用更新 } // 移管给本部并且已发货才要改设备信息 else if(nObj.RecordType_F__c == 'CenterToOther' && oObj.Shippment_loaner_time__c == null && nObj.Shippment_loaner_time__c != null) { ass.ChangeQuantityReason__c = '移管'; ass.AccountId = accountFJZ.Id; ass.Quantity = 0; ass.TransferToOther__c = true; // 非固定资产 if(String.isBlank(ass.Internal_Asset_number_key__c)) { ass.Status = '未使用'; } // 固定资产 else { ass.SalesProvince__c = null; ass.Equipment_Type__c = null; ass.Product_category__c = null; ass.Loaner_accsessary__c = false; ass.EquipmentSet_Managment_Code__c = null; ass.Manage_type__c = null; ass.Consumable_Guaranteen_end__c = null; ass.Asset_Cutoff_Date__c = null; ass.Asset_Cutoff_FinalDate__c = null; ass.Assign_Agency_FirstDate__c = null; ass.Assign_Agency_FinalDate__c = null; if(String.isNotBlank(nObj.Internal_asset_location_After__c)) { ass.Internal_asset_location__c = nObj.Internal_asset_location_After__c; } if(String.isNotBlank(nObj.Salesdepartment_After__c)) { ass.Salesdepartment__c = nObj.Salesdepartment_After__c; } } } else { // 如果调拨后字段为空,则不更新 if(String.isNotBlank(nObj.Internal_asset_location_After__c)) { ass.Internal_asset_location__c = nObj.Internal_asset_location_After__c; } if(String.isNotBlank(nObj.Salesdepartment_After__c)) { ass.Salesdepartment__c = nObj.Salesdepartment_After__c; } if(String.isNotBlank(nObj.SalesProvince_After__c)) { ass.SalesProvince__c = nObj.SalesProvince_After__c; } if(String.isNotBlank(nObj.Equipment_Type_After__c)) { ass.Equipment_Type__c = nObj.Equipment_Type_After__c; } if(String.isNotBlank(nObj.EquipmentSet_Managment_Code_After__c)) { ass.EquipmentSet_Managment_Code__c = nObj.EquipmentSet_Managment_Code_After__c; } ass.ChangeQuantityReason__c = '调拨'; setAssetDate(ass, nObj.RecordType_F__c, today) ; ass.Status = '使用中'; } ass.Last_Reserve_TAES_Detail__c = null; } // 数量管理要根据调拨后信息查找已有的Asset,如果有就按型号+存放地+本部做数量合并,如果没有就新建 //20211109 ljh SFDC-C873GL update // 数量管理要根据调拨后信息查找已有的Asset,如果有就按型号+存放地+本部+消耗品有效期至 做数量合并,如果没有就新建 else { String ukey = ass.Fixture_Model_No_F__c // 型号;调拨后存放地;调拨后本部 + ';' + nObj.Internal_asset_location_After__c + ';' + (String.isNotBlank(nObj.Salesdepartment_After__c) ? nObj.Salesdepartment_After__c : nObj.Salesdepartment__c); // 20211109 ljh SFDC-C873GL add start if(ass.Consumable_Guaranteen_end__c != null){ ukey += ';' + String.valueOf(ass.Consumable_Guaranteen_end__c); } // 20211109 ljh SFDC-C873GL add end if(nObj.DeliverySlip__c == null || nObj.Return_DeliverySlip__c != null) { // 未发货,或发出后又寄回,在明细所连的保有设备上做数量修改 if( nObj.Arrival_wh_Abandoned_Flag_F__c) { ass.ChangeQuantityReason__c = FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Fei_Qi.ordinal()); ass.Abandoned_RealThing__c += 1; } } else { // 发货后没有寄回,原保有设备数量减少 ass.Quantity -= 1; if(nObj.RecordType_F__c == 'CenterToOther') { ass.ChangeQuantityReason__c = '移管'; } else { ass.ChangeQuantityReason__c = '调拨'; // 准备调拨后的保有设备数量 Integer count = 0; if (newAssetCountMap.containsKey(ukey)) { count = newAssetCountMap.get(ukey); } newAssetCountMap.put(ukey, count + 1); // 同型号数量管理附属品中有的明细有货架号,有的明细没有货架号,这时尽量用有货架号的明细新建设备 if (!newTadMap.containsKey(ukey) || String.isNotBlank(nObj.WH_location__c)) { newTadMap.put(ukey, nObj); } if(nObj.Arrival_wh_Abandoned_Flag_F__c) { count = 0; if(newAssetAbondonCountMap.containsKey(ukey)) { count = newAssetAbondonCountMap.get(ukey); } newAssetAbondonCountMap.put(ukey, count + 1); } ukeySet.add(ukey); if (uKeyMap.containsKey(ukey) == false) { uKeyMap.put(ukey, new List()); } uKeyMap.get(ukey).add(nObj.Id); } } } assUpdMap.put(ass.Id, ass); } } String sqlwhere = ''; if(!ukeySet.isEmpty()) { for(String ukey: ukeySet) { // 20211109 ljh SFDC-C873GL update // 型号;存放地;本部 // 型号;存放地;本部;消耗品有效期至 List fields = ukey.split(';'); // 型号 if (String.isNotBlank(fields[0]) && fields[0] != 'null') { sqlwhere += ' (Fixture_Model_No_F__c =\'' + String.escapeSingleQuotes(fields[0]) + '\''; } else { sqlwhere += ' (Fixture_Model_No_F__c = null'; } // 备品存放地 if (String.isNotBlank(fields[1]) && fields[1] != 'null') { sqlwhere += ' AND Internal_asset_location__c =\'' + String.escapeSingleQuotes(fields[1]) + '\''; } else { sqlwhere += ' AND Internal_asset_location__c = null'; } // 本部 if (String.isNotBlank(fields[2]) && fields[2] != 'null') { sqlwhere += ' AND Salesdepartment__c =\'' + String.escapeSingleQuotes(fields[2]) + '\''; } else { sqlwhere += ' AND Salesdepartment__c = null'; } // 20211109 ljh SFDC-C873GL add start // 消耗品有效期至 if (fields.size() == 4 && fields[3] != null) { // DateTime temp = DateTime.valueOf(fields[3]); // Date cGEDate = Date.valueOf(temp); sqlwhere += ' AND Consumable_Guaranteen_end__c = ' + String.valueOf(fields[3]); }else { sqlwhere += ' AND Consumable_Guaranteen_end__c = null'; } // 20211109 ljh SFDC-C873GL add end sqlwhere += ' ) OR'; } } List upsertList = new List(); if (newTadMap.size() > 0) { sqlwhere = sqlwhere.removeEnd('OR'); sqlwhere = '(' + sqlwhere + ')'; String sqlStr = 'SELECT Id, Asset_loaner_category__c, Salesdepartment__c, Quantity, Manage_type__c, ImageAsset__c, ImageSerial__c, ' + 'Fixture_Model_No_F__c, Product_category__c, Internal_asset_location__c, Consumable_Guaranteen_end__c, ' + 'SalesProvince__c, EquipmentSet_Managment_Code__c, Abandoned_RealThing__c, ' + 'Asset_Cutoff_Date__c, Assign_Agency_FirstDate__c, ' + 'Equipment_Type__c, SerialNumber FROM Asset Where ' + sqlwhere + ' AND Delete_Flag__c = false ' + ' AND Asset_Owner__c = \'Olympus\'' + ' AND AssetManageConfirm__c = true' + ' AND Quantity >= 0' + ' AND (Freeze_sign_Abandoned_Flag__c = False OR Status =\'待报废\')' + ' AND Manage_type__c = \'数量管理\'' + ' ORDER BY Fixture_Model_No_F__c, Quantity Desc'; List matchingAsset = Database.query(sqlStr); // 如果明细里想要的保有设备已经存在,就直接把数量和待废弃数更新进去 for (Asset ast : matchingAsset) { String ukey = ast.Fixture_Model_No_F__c + ';' + ast.Internal_asset_location__c + ';' + ast.Salesdepartment__c; // 20211109 ljh SFDC-C873GL update start if (ast.Consumable_Guaranteen_end__c != null) { ukey += ';' + String.valueOf(ast.Consumable_Guaranteen_end__c); } // 20211109 ljh SFDC-C873GL update end if (newTadMap.containsKey(ukey)) { ast.Quantity = ast.Quantity + newAssetCountMap.get(ukey); ast.ChangeQuantityReason__c = '调拨'; setAssetDate(ast, newTadMap.get(ukey).RecordType_F__c, today) ; if(newAssetAbondonCountMap.containsKey(ukey)) { ast.Abandoned_RealThing__c += newAssetAbondonCountMap.get(ukey); } if(ast.Abandoned_RealThing__c == ast.Quantity) { ast.Status = '待报废'; } else { ast.Status = '使用中'; } newAssetMap.put(ukey, ast); newTadMap.remove(ukey); } } } // 剩下的明细需要新建保有设备 for (String ukey : newTadMap.keySet()) { TransferApplyDetail__c tad = newTadMap.get(ukey); Asset newAset = assMap.get(tad.Asset__c).clone(false); newAset.unknow_serial_NO_product__c = true; newAset.Assign_Agency_FirstDate__c = null; newAset.Assign_Agency_FinalDate__c = null; newAset.Asset_Cutoff_Date__c = null; newAset.Asset_Cutoff_FinalDate__c = null; newAset.Status = '使用中'; newAset.SerialNumber = null; newAset.Product_Serial_No__c = null; // workflow会重新赋值 newAset.Loaner_accsessary__c = true; newAset.AssetManageConfirm__c = true; newAset.Abandoned_RealThing__c = 0; newAset.Abandoned_Inventory__c = 0; newAset.Frozen_Quantity__c = 0; newAset.Out_of_wh__c = 0; newAset.Rental_Count__c = 0; newAset.MaintainCount_For_Processing__c = 0; newAset.CountForRepair__c = 0; newAset.Consumed_Count__c = 0; newAset.TransferFrozenQuantity__c = 0; newAset.TransferFrozenAbandon__c = 0; newAset.TransferFrozenLost__c = 0; newAset.TransferFrozenRepair__c = 0; newAset.Confirm_Lost_Count__c = 0; newAset.Inventory_Frozen_Quantity__c = 0; newAset.Appended_Inventory_Frozen_Quantity__c = 0; newAset.Inventory_Profit_Quantity__c = 0; newAset.Appended_Inventory_Profit_Quantity__c = 0; // 更新日期 setAssetDate(newAset, tad.RecordType_F__c, today) ; // 按明细更新调拨后信息 newAset.Internal_asset_location__c = tad.Internal_asset_location_After__c; if(String.isNotBlank(tad.Salesdepartment_After__c)) { newAset.Salesdepartment__c = tad.Salesdepartment_After__c; } if(String.isNotBlank(tad.SalesProvince_After__c)) { newAset.SalesProvince__c = tad.SalesProvince_After__c; } if(String.isNotBlank(tad.Equipment_Type_After__c)) { newAset.Equipment_Type__c = tad.Equipment_Type_After__c; } if(String.isNotBlank(tad.EquipmentSet_Managment_Code_After__c)) { newAset.EquipmentSet_Managment_Code__c = tad.EquipmentSet_Managment_Code_After__c; } newAset.WH_location__c = tad.WH_location__c; newAset.Quantity = newAssetCountMap.get(ukey); newAset.ChangeQuantityReason__c = '调拨'; if(newAssetAbondonCountMap.containsKey(ukey)) { newAset.Abandoned_RealThing__c = newAssetAbondonCountMap.get(ukey); } newAssetMap.put(ukey, newAset); } } private void changeOneToOneLinkFronze() { Map linkMap = new Map(); for(TransferApplyDetail__c nObj:newList) { // 只针对一对一附属品明细 if(!nObj.OneToOneAccessory__c || nObj.Fixture_OneToOne_Link__c == null) { continue; } TransferApplyDetail__c oObj = null; if( oldMap.containsKey(nObj.Id)){ oObj = oldMap.get(nObj.Id); } Boolean froze = false; // 冻结为true,解冻为false Boolean needUpdate = false; // 管理员追加的明细会自动批准 if(oObj == null && nObj.Approved_F__c) { froze = true; needUpdate = true; } // 取消明细后 else if(oObj != null && !oObj.Cancel_Select__c && nObj.Cancel_Select__c) { froze = false; needUpdate = true; } // 首次提交审批 else if(nObj.Create_State__c == null && oObj != null && oObj.Request_time__c != nObj.Request_time__c) { froze = nObj.Request_time__c != null; needUpdate = true; } // 提交追加审批 else if(nObj.Create_State__c == 1 && oObj != null && oObj.Add_Request_demo_time__c != nObj.Add_Request_demo_time__c) { froze = nObj.Add_Request_demo_time__c != null; needUpdate = true; } if(needUpdate) { Fixture_OneToOne_Link__c link = null; if(linkMap.containsKey(nObj.Fixture_OneToOne_Link__c)) { link = linkMap.get(nObj.Fixture_OneToOne_Link__c); } else { link = new Fixture_OneToOne_Link__c(Id=nObj.Fixture_OneToOne_Link__c, TransferFrozenQuantity__c = 0, CountForRepair__c = 0, Abandoned_RealThing__c = 0 ); } if(froze) { // 冻结时待废弃,待修理,都移到调拨冻结数 link.TransferFrozenQuantity__c += 1; } else { // 解冻时按明细的调拨分类恢复待废弃,待修理数 switch on nObj.TransferType__c { when '待废弃' { link.Abandoned_RealThing__c += 1; } when '待修理' { link.CountForRepair__c += 1; } } } linkMap.put(link.Id, link); } } if(!linkMap.isEmpty()) { Oly_TriggerHandler.bypass(AssetHandlerCheck.class.getName()); update linkMap.values(); Oly_TriggerHandler.clearBypass(AssetHandlerCheck.class.getName()); } } private Integer intValueOf(Decimal d) { if(d == null) { return 0; } return Integer.valueOf(d); } // 主体明细下架时删link private void deleteOneToOneLink() { Set assIdSet = new Set(); for(TransferApplyDetail__c nObj:newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); if(nObj.Main_OneToOne__c && nObj.Asset__c != null) { if(nObj.RecordType_F__c == 'AgencyToCenter') { if(oObj.Shippment_loaner_time_F__c == null && nObj.Shippment_loaner_time_F__c != null) { assIdSet.add(nObj.Asset__c); } } else if(!oObj.StockDown__c && nObj.StockDown__c) { assIdSet.add(nObj.Asset__c); } } } if (!assIdSet.isEmpty()) { FixtureUtil.delOtOLinkData(new List(assIdSet)); } } // 上架时新建link private void createOneToOneLink() { // 获取需要建link的明细 Set otoDetailIdSet = new Set(); for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); if(!oObj.Arrival_in_wh__c && nObj.Arrival_in_wh__c && nObj.OneToOneAccessory__c && !nObj.SkipLink__c) { otoDetailIdSet.add(nObj.Id); } } if(otoDetailIdSet.isEmpty()) { return; } // 因为要用__r字段,不能直接用newList List tadList = [ SELECT Id , TransferApplySummary__r.First_TAD__r.Asset__c , TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c , Manage_type_F__c , Internal_asset_location_After__c , Salesdepartment_After__c , SalesProvince_After__c , Equipment_Type_After__c , EquipmentSet_Managment_Code_After__c , Internal_asset_location__c , Salesdepartment__c , SalesProvince__c , Equipment_Type__c , EquipmentSet_Managment_Code__c , Fixture_Model_No_F__c , Asset__r.Consumable_Guaranteen_end__c , Arrival_wh_Flag_F__c FROM TransferApplyDetail__c WHERE Id IN: otoDetailIdSet ]; Map otoCntMap = new Map(); // 主Id:附Id->数量 for(TransferApplyDetail__c tad: tadList) { String otoKey = ''; //主Id:附Id if(tad.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c) { // if(tad.Manage_type_F__c == '个体管理') { // 个体管理的明细连的Asset不会变 otoKey = tad.TransferApplySummary__r.First_TAD__r.Asset__c + ':' + tad.Asset__c; } else if(tad.Manage_type_F__c == '数量管理') { // 数量管理的明细要去找新的Asset String ukey = tad.Fixture_Model_No_F__c // 型号;存放地;本部 + ';' + tad.Internal_asset_location_After__c + ';' + (String.isNotBlank(tad.Salesdepartment_After__c) ? tad.Salesdepartment_After__c : tad.Salesdepartment__c); if(newAssetMap.containsKey(ukey)) { otoKey = tad.TransferApplySummary__r.First_TAD__r.Asset__c + ':' + newAssetMap.get(ukey).Id; } else { otoKey = tad.TransferApplySummary__r.First_TAD__r.Asset__c + ':' + tad.Asset__c; } } if(String.isNotBlank(otoKey)) { Integer cnt = 1; if(otoCntMap.containsKey(otoKey)) { cnt = otoCntMap.get(otoKey) + 1; } otoCntMap.put(otoKey, cnt); } } } // 找一下现有的link if(!otoCntMap.isEmpty()) { Map linkMap = new Map(); // 主Id:附Id->link对象 String linkSql = 'SELECT Quantity__c, Main_Asset__c, Accessory_Asset__c FROM Fixture_OneToOne_Link__c WHERE '; for(String otoKey:otoCntMap.keySet()) { String mainId = otoKey.split(':')[0]; String acceId = otoKey.split(':')[1]; linkSql += '(Main_Asset__c = \'' + mainId + '\' AND Accessory_Asset__c = \''+acceId+'\') OR'; } linkSql = linkSql.removeEnd('OR'); List matchingLinks = Database.query(linkSql); for(Fixture_OneToOne_Link__c link:matchingLinks) { linkMap.put(link.Main_Asset__c + ':' + link.Accessory_Asset__c, link); } for(String otoKey:otoCntMap.keySet()) { Fixture_OneToOne_Link__c link = new Fixture_OneToOne_Link__c(); if(linkMap.containsKey(otoKey)) { link = linkMap.get(otoKey); link.Quantity__c += otoCntMap.get(otoKey); } else { link.Main_Asset__c = otoKey.split(':')[0]; link.Accessory_Asset__c = otoKey.split(':')[1]; link.Quantity__c = otoCntMap.get(otoKey); } linkMap.put(otoKey, link); } if(!linkMap.isEmpty()) { Oly_TriggerHandler.bypass(AssetHandlerCheck.class.getName()); upsert linkMap.values(); Oly_TriggerHandler.clearBypass(AssetHandlerCheck.class.getName()); } } } // 4-XX 下架后, 出库前检测的Action一对一分配的话, 和主体一起 Cancel private void oneToOne4XX() { //主体CnacelSet Set raesdBodyCnacelSet = new Set(); Set raesdBodyNGSet = new Set(); //暂时只考虑主体NG或者取消的时候 Map raesdCancel_Remarks = new Map(); //检测NG或者本来就Cancel的不需要再更新 Set raesdIdSet = new Set(); for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); //Set没有cancel的话都需要拷贝 //主体出库前检测NG 维修 if (nObj.Main_OneToOne__c == true && nObj.Inspection_result__c == 'NG' && oObj.Inspection_result__c != nObj.Inspection_result__c && nObj.Inspection_result_NG__c == '维修') { //需要重新分配一对一附属品的一览 raesdBodyNGSet.add(nObj.TransferApplySummary__c); raesdCancel_Remarks.put(nObj.TransferApplySummary__c, nObj.Cancel_Reason__c); raesdIdSet.add(nObj.Id); } //主体出库前检测NG 废弃 else if (nObj.Main_OneToOne__c == true && nObj.Inspection_result__c == 'NG' && oObj.Inspection_result__c != nObj.Inspection_result__c && nObj.Inspection_result_NG__c == '废弃') { //需要重新分配一对一附属品的一览 raesdBodyNGSet.add(nObj.TransferApplySummary__c); raesdCancel_Remarks.put(nObj.TransferApplySummary__c, nObj.Cancel_Reason__c); raesdIdSet.add(nObj.Id); } //附属品出库前检测NG 维修 并且是一对一分配 else if (nObj.Main_OneToOne__c == false && nObj.Inspection_result__c == 'NG' && oObj.Inspection_result__c != nObj.Inspection_result__c && nObj.Inspection_result_NG__c == '维修' && nObj.OneToOneAccessory__c == true) { raesdIdSet.add(nObj.Id); } //附属品出库前检测NG 废弃 并且是一对一分配 else if (nObj.Main_OneToOne__c == false && nObj.Inspection_result__c == 'NG' && oObj.Inspection_result__c != nObj.Inspection_result__c && nObj.Inspection_result_NG__c == '废弃' && nObj.OneToOneAccessory__c == true) { raesdIdSet.add(nObj.Id); } //OLY_OCM-152 下架后主体取消的话一对一附属品也要一起取消 else if (String.isBlank(nObj.DeliverySlip__c) && nObj.Main_OneToOne__c == true && nObj.StockDown__c == true && oObj.Cancel_Select__c == false && nObj.Cancel_Select__c == true) { raesdIdSet.add(nObj.Id); raesdBodyCnacelSet.add(nObj.TransferApplySummary__c); raesdCancel_Remarks.put(nObj.TransferApplySummary__c, nObj.Cancel_Reason__c); } } if (raesdBodyNGSet.isEmpty() && raesdBodyCnacelSet.isEmpty()) { return; } List raesds = [ Select Id, TransferApplySummary__c,Cancel_Reason__c From TransferApplyDetail__c //主体出库前检测NG一览的所有一对一分配的明细 Where (TransferApplySummary__c = :raesdBodyNGSet //下架后主体取消一对一附属品也要一起取消 OR TransferApplySummary__c = :raesdBodyCnacelSet) AND OneToOneAccessory__c = true //和主体一起检测NG的不再更新 AND Id !=: raesdIdSet]; List raesdList = new List(); for (TransferApplyDetail__c raesd : raesds) { raesd.OnStock_By_Cancel__c = true; raesd.Cancel_Select__c = true; if(String.isNotBlank(raesd.Cancel_Reason__c) && raesd.Cancel_Reason__c != '出库前检查NG'){ //主体出库前检查NG的话取消备注回自动设置为出库前检查NG raesd.Cancel_Reason__c = raesdCancel_Remarks.get(raesd.TransferApplySummary__c); } raesdList.add(raesd); } if (!raesdList.isEmpty()) { update raesdList; } } // afterdeleteのみ private void deleteReFirst() { Map tasMap = new Map(); for (TransferApplyDetail__c oObj : oldList) { if (oObj.Is_First_TAD_F__c == true) { TransferApplySummary__c raes = new TransferApplySummary__c( Id = oObj.TransferApplySummary__c, First_TAD__c = null); tasMap.put(oObj.TransferApplySummary__c, raes); } } //修改一览的FirstMap if (tasMap.isEmpty()) { return; } List raesList = [Select Id, TransferApplySummary__c From TransferApplyDetail__c Where TransferApplySummary__c = :tasMap.keySet() order by TransferApplySummary__c, Cancel_Select__c, IndexFromUniqueKey__c ASC nulls last]; Id raesId = null; for (TransferApplyDetail__c tad : raesList) { if (raesId != tad.TransferApplySummary__c) { tasMap.get(tad.TransferApplySummary__c).First_TAD__c = tad.Id; raesId = tad.TransferApplySummary__c; } } Map deleteTasMap = new Map(); Map updateTasMap = new Map(); for(Id tasId:tasMap.keySet()) { TransferApplySummary__c tas = tasMap.get(tasId); if(tas.First_TAD__c == null) { //如果为空,说明一览下没有明细,直接删除 deleteTasMap.put(tasId, tas); } else { updateTasMap.put(tasId, tas); } } //一览First更新 if (!updateTasMap.isEmpty()) { update updateTasMap.values(); } if(!deleteTasMap.isEmpty()) { delete deleteTasMap.values(); } } // 最終状態及びAsset変更 private Boolean finishOrChangeAsset(Boolean isDelete, TransferApplyDetail__c oObj, TransferApplyDetail__c nObj) { Boolean rtn = false; if (isDelete) { // oObj を確認する、oldで もともと finishのもの、falseを返す、 rtn = !( //回库确认 (oObj.Arrival_in_wh__c) //取消分配, (下架后, 原则需要上架, 所以不能单纯的断开) || (oObj.Cancel_Select__c == true && oObj.StockDown__c == false) //下架前, 分配备品有变化 (变成别的配套, or 变 null) || (oObj.Asset__c == null && oObj.StockDown__c == false) //取消分配, (下架后, 原则需要上架, 所以不能单纯的断开) || (oObj.Cancel_Select__c == true && nObj.StockDown__c == false) //放弃欠品 || (oObj.Lost_item_giveup__c == true) //已消耗 || (oObj.Check_lost_Item_F__c == '消耗') ); } else { rtn = ( //回库确认 (!oObj.Arrival_in_wh__c && nObj.Arrival_in_wh__c) //取消分配, (下架后, 原则需要上架, 所以不能单纯的断开) || (oObj.Cancel_Select__c == false && nObj.Cancel_Select__c == true && nObj.StockDown__c == false) //下架前, 分配备品有变化 (变成别的配套, or 变 null) || (oObj.Asset__c != null && oObj.Asset__c != nObj.Asset__c && nObj.StockDown__c == false) //放弃欠品 || (oObj.Lost_item_giveup__c == false && nObj.Lost_item_giveup__c == true && oObj.Check_lost_Item_F__c != '消耗') //已消耗 || (oObj.Check_lost_Item_F__c != '消耗' && nObj.Check_lost_Item_F__c == '消耗' && oObj.Lost_item_giveup__c == false) ); } return rtn; } //办事处收回NG后明细回寄时的邮件回寄单内容设置 //只在Afterupdate里面调用 private void receivedConfirmNGSetReturnDeliverySlipText() { //一览Id和对应的回寄发货单ID Map raesRDSMap = new Map(); Map raesDateMap = new Map(); for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); //申请者收货NG的明细 if (nObj.Received_Confirm_F__c == 'NG') { //回寄运输单赋值 if (String.isBlank(oObj.Return_DeliverySlip__c) && String.isNotBlank(nObj.Return_DeliverySlip__c)) { //因为是以为一览为单位,所以只有一条回寄单 //申请者收货NG的明细拆成两个回寄单回寄的情况暂时不考虑(应该没有这种情况) if (!raesRDSMap.containsKey(nObj.TransferApplySummary__c)) { raesRDSMap.put(nObj.TransferApplySummary__c, nObj.Return_DeliverySlip__c); raesDateMap.put(nObj.TransferApplySummary__c, nObj.Asset_return_time__c.format()); } } } } if (raesRDSMap.isEmpty()) { return; } //NG_Return_DeliverySlip__c为空的一览才做邮件发送 Map raessMap = new Map([Select Id From TransferApplySummary__c WHERE Id =: raesRDSMap.keySet() AND NG_Return_DeliverySlip__c = null]); Map fdss = new Map([Select Id, Name, Combine_Pack__c, Wh_Staff__c, DeliveryCompany__c, Shippment_loaner_time__c, Distributor_method__c, DeliveryCompany_SlipNo__c, DeliveryType__c From FixtureDeliverySlip__c Where Id =: raesRDSMap.values()]); List raess = new List(); for (Id key: raesRDSMap.keySet()) { //当NG_Return_DeliverySlip__c不为空时不发邮件 if (!raessMap.containsKey(key)) { continue; } FixtureDeliverySlip__c fds = fdss.get(raesRDSMap.get(key)); String message = '发货-发货运输单号:' + fds.Name + '
' + '发货-物流公司:' + fds.DeliveryCompany__c + '
' + '发货-运输方式:' + fds.Distributor_method__c + '
' + '物流提货时间:' + raesDateMap.get(key) + '
'; raess.add(new TransferApplySummary__c(Id = key, NG_Return_DeliverySlip_Information__c = message, NG_Return_DeliverySlip__c = fds.Id)); } if (!raess.isEmpty()) { update raess; } } //20201103 ljh 备品中心至办事处--收货NG回寄、欠品提醒 设置申请书的回寄通知文本 取消时间 OCSM_BP5-35 //只在Afterupdate里面调用 private void setToTa_BeforeOrReturnOrCancle_Text() { Set taReturnNGSet = new Set();//收货NG回寄 Set taBeforeNGSet = new Set();//出库前NG Set taLoseSet = new Set();//欠品 Map cancleTimeMap = new Map();//取消 Map waitPerfectMap = new Map();//待受理完善备品信息 Map waitStockMap = new Map();//已受理完善备品信息 Set cancleTimeId = new Set();//取消 Set waitPerfectid = new Set();//待受理完善备品信息 Set waitStockId = new Set();//已受理完善备品信息 for (TransferApplyDetail__c nObj : newList) { TransferApplyDetail__c oObj = oldMap.get(nObj.Id); //出库前NG if(oObj.Inspection_result__c != 'NG' && nObj.Inspection_result__c == 'NG') { taBeforeNGSet.add(nObj.Id); } //欠品 if(oObj.Check_lost_Item_F__c != '欠品' && nObj.Check_lost_Item_F__c == '欠品') { taLoseSet.add(nObj.Id); } //收货NG回寄 if (String.isBlank(oObj.Return_DeliverySlip__c) && String.isNotBlank(nObj.Return_DeliverySlip__c) && nObj.ArrivalResult__c == 'NG') { taReturnNGSet.add(nObj.Id); } //取消 Cancel_Select__c if(nObj.Cancel_Select__c == true && oObj.Cancel_Select__c == false && nObj.Inspection_result__c != 'NG'){ if(!cancleTimeMap.containsKey(nObj.TransferApply__c)){ cancleTimeMap.put(nObj.TransferApply__c,nObj.Cancel_Time__c); }else{ if(cancleTimeMap.get(nObj.TransferApply__c) != nObj.Cancel_Time__c ){ cancleTimeMap.put(nObj.TransferApply__c,nObj.Cancel_Time__c); } } cancleTimeId.add(nObj.Id); } //待受理完善备品信息 if(nObj.Inspection_result_after_F__c != null && nObj.Inspection_result_after_F__c == 'OK' && oObj.Inspection_result_after_F__c != 'OK'){ if(!waitPerfectMap.containsKey(nObj.TransferApply__c)){ waitPerfectMap.put(nObj.TransferApply__c,nObj.After_Inspection_time_F__c); }else{ if(waitPerfectMap.get(nObj.TransferApply__c) != nObj.After_Inspection_time_F__c ){ waitPerfectMap.put(nObj.TransferApply__c,nObj.After_Inspection_time_F__c); } } waitPerfectid.add(nObj.Id); } //已受理完善备品信息 待上架 if(nObj.IsPerfect__c == true && oObj.IsPerfect__c == false){ if(!waitStockMap.containsKey(nObj.TransferApply__c)){ waitStockMap.put(nObj.TransferApply__c,nObj.IsPerfect__c); } waitStockId.add(nObj.Id); } } //出库前NG 欠品 收货NG回寄 Set IdSet = new Set(); IdSet.addAll(taBeforeNGSet); IdSet.addAll(taLoseSet); IdSet.addAll(taReturnNGSet); IdSet.addAll(cancleTimeId); IdSet.addAll(waitPerfectId); IdSet.addAll(waitStockId); Map> tadMap = new Map>(); List tadList =[ SELECT Id,TransferApply__c,Return_DeliverySlip__c,TransferApplySummary__c,Fixture_Model_No__c,NoItemReturn__c, TransferApply__r.Name,TransferApply__r.Id, Fixture_Set_Detail__r.Fixture_Set__c,Fixture_Set_Detail__c,Fixture_Model_No_F__c, Return_DeliverySlip__r.Id,Return_DeliverySlip__r.Name,Return_DeliverySlip__r.DeliveryCompany__c,Return_DeliverySlip__r.Distributor_method__c,Return_DeliverySlip__r.Shippment_loaner_time__c FROM TransferApplyDetail__c WHERE Id = :IdSet ORDER BY TransferApply__c, TransferApplySummary__c, Name ]; Map return_DeliverySlipMap = new Map(); for (TransferApplyDetail__c tad:tadList) { if(!tadMap.containsKey(tad.TransferApply__c)) { List tempL = new List(); tempL.add(tad); tadMap.put(tad.TransferApply__c,tempL); }else{ List oldL = tadMap.get(tad.TransferApply__c); oldL.add(tad); tadMap.put(tad.TransferApply__c,oldL); } /* --------- 设置运输单Map Start --------- */ if (return_DeliverySlipMap.containsKey(tad.TransferApply__c) == false) { FixtureDeliverySlip__c fds = tad.Return_DeliverySlip__r; return_DeliverySlipMap.put(tad.TransferApply__c, fds); } /* --------- 设置运输单Map End --------- */ } //出库前NG Before_NG_Detail_ForEmail__c 欠品Lose_Detail_ForEmail__c 收货NG回寄 Asset_return_Text__c if(taLoseSet.size()>0 || taBeforeNGSet.size()>0 || taReturnNGSet.size()>0 || cancleTimeMap.size()>0 || waitPerfectMap.size()>0|| waitStockMap.size()>0){ List raList = new List(); List raList2 = new List(); Map mapBeforeNGMx = new Map(); Map mapLoseMx = new Map(); Map mapReturnNGMx = new Map(); List tadBeforeNGList = new List(); List tadLoseList = new List(); List tadReturnNGList = new List(); for (Id raId: tadMap.keySet()) { for (TransferApplyDetail__c tad : tadMap.get(raId)) { //需要判断属于类型 //出库前NG if(taBeforeNGSet.contains(tad.Id)){ tadBeforeNGList.add(tad); } //欠品 if(taLoseSet.contains(tad.Id)){ tadLoseList.add(tad); } //收货NG回寄 if(taReturnNGSet.contains(tad.Id)){ tadReturnNGList.add(tad); } } String message1 = '' ; if(tadBeforeNGList.size()>0){ for(TransferApplyDetail__c tadBNg : tadBeforeNGList){ if(!mapBeforeNGMx.containsKey(tadBNg.Fixture_Model_No_F__c)){ mapBeforeNGMx.put(tadBNg.Fixture_Model_No_F__c,1); }else{ Integer num = mapBeforeNGMx.get(tadBNg.Fixture_Model_No_F__c); num++; mapBeforeNGMx.put(tadBNg.Fixture_Model_No_F__c,num); } } for(String key : mapBeforeNGMx.keySet()){ message1 += key+' *'+mapBeforeNGMx.get(key); message1 += '
'; } } String message2 = '' ; if(tadLoseList.size()>0){ for(TransferApplyDetail__c tadlose : tadLoseList){ if(!mapLoseMx.containsKey(tadLose.Fixture_Model_No_F__c)){ mapLoseMx.put(tadLose.Fixture_Model_No_F__c,1); }else{ Integer num = mapLoseMx.get(tadLose.Fixture_Model_No_F__c); num++; mapLoseMx.put(tadLose.Fixture_Model_No_F__c,num); } } for(String key : mapLoseMx.keySet()){ message2 += key+' *'+mapLoseMx.get(key); message2 += '
'; } } String message3 = '' ; if(tadReturnNGList.size()>0){ for(TransferApplyDetail__c tadRNG : tadReturnNGList){ if(!mapReturnNGMx.containsKey(tadRNG.Fixture_Model_No_F__c)){ mapReturnNGMx.put(tadRNG.Fixture_Model_No_F__c,1); }else{ Integer num = mapReturnNGMx.get(tadRNG.Fixture_Model_No_F__c); num++; mapReturnNGMx.put(tadRNG.Fixture_Model_No_F__c,num); } } for(String key : mapReturnNGMx.keySet()){ message3 += key+' *'+mapReturnNGMx.get(key); message3 += '
'; } message3 += '
'; FixtureDeliverySlip__c fds = new FixtureDeliverySlip__c(); if (return_DeliverySlipMap.containsKey(raId)) { fds = return_DeliverySlipMap.get(raId); } message3 += '回寄-发货运输单号:' + (String.isBlank(fds.Name)? '' : fds.Name) + '
'; message3 += '回寄-物流公司:' + (String.isBlank(fds.DeliveryCompany__c)? '' : fds.DeliveryCompany__c) + '
'; message3 += '回寄-运输方式:' + (String.isBlank(fds.Distributor_method__c)? '' : fds.Distributor_method__c) + '
'; String sdate = fds.Shippment_loaner_time__c == null ? '' : fds.Shippment_loaner_time__c.format(); message3 += '物流提货时间:' + sdate + '
'; } if (String.isNotBlank(message1) || String.isNotBlank(message2) || String.isNotBlank(message3) || cancleTimeMap.size()>0 || waitPerfectMap.size()>0|| waitStockMap.size()>0 ) { TransferApply__c tempTa = new TransferApply__c(); TransferApply__c tempTa2 = new TransferApply__c(); tempTa.Id = raId; tempTa2.Id = raId; //出库前NG Before_NG_Detail_ForEmail__c if(taBeforeNGSet.size()>0){ tempTa.Before_NG_Detail_ForEmail__c = message1; tempTa2.Before_NG_Detail_ForEmail__c = null; } //欠品Lose_Detail_ForEmail__c if(taLoseSet.size()>0){ tempTa.Lose_Detail_ForEmail__c = message2; tempTa2.Lose_Detail_ForEmail__c = null; } //收货NG回寄 Asset_return_Text__c if(taReturnNGSet.size()>0){ tempTa.Asset_return_Text__c = message3; tempTa2.Asset_return_Text__c = null; } //取消 Cancel_Time_ForEmail__c if(cancleTimeMap.size()>0){ if(cancleTimeMap.containsKey(raId)){ tempTa.Cancel_Time_ForEmail__c = cancleTimeMap.get(raId); tempTa2.Cancel_Time_ForEmail__c = null; } } //待受理完善备品信息 waitPerfectTime_ForEmail if(waitPerfectMap.size()>0){ if(waitPerfectMap.containsKey(raId)){ tempTa.waitPerfectTime_ForEmail__c = waitPerfectMap.get(raId); tempTa2.waitPerfectTime_ForEmail__c = null; } } //已受理完善备品信息 待上架 if(waitStockMap.size()>0){ if(waitStockMap.containsKey(raId)){ tempTa.PerfectWaitStock__c = waitStockMap.get(raId); tempTa2.PerfectWaitStock__c = false; } } raList.add(tempTa); raList2.add(tempTa2); } } if (raList.size() > 0) { FixtureUtil.withoutUpdate(raList2); FixtureUtil.withoutUpdate(raList); } } } //ljh OCSM_BP5-35 end }