public without sharing class FixtureOneToOneLinkHandler extends Oly_TriggerHandler { private Map newMap; private Map oldMap; private List newList; private List oldList; private static Map assMap = new Map(); private static Map assUpdMap = new Map(); public FixtureOneToOneLinkHandler() { this.newMap = (Map) Trigger.newMap; this.oldMap = (Map) Trigger.oldMap; this.newList = (List) Trigger.new; this.oldList = (List) Trigger.old; } protected override void beforeInsert() { beforeSetValue(); } protected override void beforeUpdate() { beforeSetValue(); } protected override void afterInsert() { setAssetOntToOne(); } protected override void afterUpdate() { setAssetOntToOne(); } protected override void afterDelete() { setAssetOntToOne(); } private void beforeSetValue() { for (Fixture_OneToOne_Link__c nObj : newList) { nObj.In_wh_Fu_Shu_Pin_You_Xiao_Ku_Cun__c = nObj.In_wh_Fu_Shu_Pin_You_Xiao_Ku_Cun_F__c; if (String.isNotBlank(nObj.Accessory_Asset__c) && nObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li)) { nObj.Ge_Ti_Fu_Shu_Pin_Key__c = nObj.Accessory_Asset__c; } else { nObj.Ge_Ti_Fu_Shu_Pin_Key__c = null; } } } public void setAssetOntToOne() { Map assetMap = new Map(); // TODO 将来 Static にする Map checkMainOneToOneMap = new Map(); // 主体check用 List otoId = new List(); List fotos; if(!Trigger.isDelete) { fotos = newList; } else { fotos = oldList; } for (Fixture_OneToOne_Link__c foto : fotos) { if (Trigger.isInsert) { Fixture_OneToOne_Link__c nObj = foto; // 主体的判断 if (String.isNotBlank(nObj.Main_Asset__c)) { assetMap.put(nObj.Main_Asset__c, new Asset( Id = nObj.Main_Asset__c, Main_OneToOne__c = true)); } // 付属品的判断 if (String.isNotBlank(nObj.Accessory_Asset__c) && nObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li)) { assetMap.put(nObj.Accessory_Asset__c, new Asset( Id = nObj.Accessory_Asset__c, Fixture_OneToOne_Link__c = nObj.Id)); } } else if (Trigger.isUpdate) { Fixture_OneToOne_Link__c nObj = foto; Fixture_OneToOne_Link__c oObj = oldMap.get(nObj.Id); // 主体的判断 if (String.isNotBlank(nObj.Main_Asset__c) && (oObj.Main_Asset__c != nObj.Main_Asset__c)) { assetMap.put(nObj.Main_Asset__c, new Asset( Id = nObj.Main_Asset__c, Main_OneToOne__c = true)); checkMainOneToOneMap.put(oObj.Main_Asset__c, new Asset( Id = oObj.Main_Asset__c, Main_OneToOne__c = false)); } // 付属品的判断 if (String.isNotBlank(oObj.Accessory_Asset__c) && oObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li) && (oObj.Accessory_Asset__c != nObj.Accessory_Asset__c)) { assetMap.put(nObj.Accessory_Asset__c, new Asset( Id = nObj.Accessory_Asset__c, Fixture_OneToOne_Link__c = nObj.Id)); assetMap.put(oObj.Accessory_Asset__c, new Asset( Id = oObj.Accessory_Asset__c, Fixture_OneToOne_Link__c = null)); } } else if (Trigger.isDelete) { Fixture_OneToOne_Link__c oObj = foto; // 主体的判断 if (String.isNotBlank(oObj.Main_Asset__c)) { checkMainOneToOneMap.put(oObj.Main_Asset__c, new Asset( Id = oObj.Main_Asset__c, Main_OneToOne__c = false)); } // 付属品的判断 if (String.isNotBlank(oObj.Accessory_Asset__c) && oObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li)) { assetMap.put(oObj.Accessory_Asset__c, new Asset( Id = oObj.Accessory_Asset__c, Fixture_OneToOne_Link__c = null)); } if (String.isNotBlank(oObj.Id)) { otoId.add(oObj.Id); } } } System.debug(checkMainOneToOneMap); // 主体 checkMainOneToOneMap 再判断 if (!checkMainOneToOneMap.isEmpty()) { Set aSetId = new Set(); // 变更一对一link的主体或删除一对一link时,查找旧的主体是否还存在一对一link for (AggregateResult checkedMain : [ SELECT Main_Asset__c, count(Id) cnt FROM Fixture_OneToOne_Link__c WHERE Main_Asset__c IN :checkMainOneToOneMap.keyset() GROUP BY Main_Asset__c]) { System.debug(checkedMain); aSetId.add((Id) checkedMain.get('Main_Asset__c')); } for (Id mId : checkMainOneToOneMap.keyset()) { if (!aSetId.contains(mId)) assetMap.put(mId, checkMainOneToOneMap.get(mId)); } } if (Trigger.isDelete) { if (otoId.size() > 0) { List raesdList = [ select id, Fixture_OneToOne_Link_Id__c from Rental_Apply_Equipment_Set_Detail__c where Fixture_OneToOne_Link_Id__c in :otoId and StockDown__c = false]; if (!raesdList.isEmpty()) { for (Rental_Apply_Equipment_Set_Detail__c raesd : raesdList) { raesd.Fixture_OneToOne_Link_Id__c = null; } update raesdList; } } } if (!assetMap.isEmpty()) { update assetMap.values(); } } }