/** * 103,104,105,Te2am,系统管理员 に実行権限があります。 */ global without sharing class SoakupHPDeptTeam { static Integer dmlcount = 0; static BatchIF_Log__c iflog = null; /** * soakupFromDeptTeam()を呼び出す * soakupToHPTeam()を呼び出す */ WebService static String execute(String deptClassId) { List dcList = [select Id, ParentId, OwnerId from Account where Parent.Is_Active__c <> '無効' and Parent.owner.IsActive = true and Parent.RecordType.DeveloperName = 'HP' and Id = :deptClassId]; if (dcList.size() == 0) { return System.Label.NotExist_DeptClass; } String[] recTypes = new String[] {'診療科 呼吸科', '診療科 婦人科', '診療科 普外科', '診療科 泌尿科', '診療科 消化科', '診療科 耳鼻喉科'}; List rects = [select Id, Name from RecordType where IsActive = true and SobjectType = 'Account' and Name IN :recTypes]; List deptRectIds = new List(); for (RecordType rect : rects) { deptRectIds.add(rect.Id); } soakupFromDeptTeam(dcList, deptRectIds); soakupToHPTeam(new String[] {dcList[0].ParentId}); return 'OK'; } /** * 戦略課室のIDから配下の診療科にチームをセット * dcListにその他のdcIdが来る場合、無視 * * @param dcList 戦略課室の配列 * @param deptRectIds 対象診療科のレコードタイプの配列 */ public static void soakupFromDeptTeam(List dcList, List deptRectIds) { // 戦略科室配下の診療科のチームを検索 List childList = [select Id, RecordType.Name, ParentId, OwnerId, Owner.Name from Account where Parent.Parent.Is_Active__c <> '無効' and Is_Active__c <> '無効' and Parent.Parent.owner.IsActive = true and RecordTypeId in :deptRectIds and ParentId in :dcList]; //if (childList.size() == 0) return; soakupFromDeptTeam(childList, dcList); } public static void soakupFromDeptTeam(List dptList, List oyaList) { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'soakupFromDeptTeam start\n'; dmlcount = 0; // ------------病院のFSE主担当を戦略科室にセット、戦略科室のチームを作成------------ List dcFseSpList = [select Id, FSE_Main__c, Parent.FSE_Main__c, SP_Main__c, Parent.SP_Main__c from Account where Id in :oyaList]; List updDcList = new List(); Map dcFseSpMap = new Map(); for (Account acc : dcFseSpList) { if (acc.FSE_Main__c != acc.Parent.FSE_Main__c || acc.SP_Main__c != acc.Parent.SP_Main__c) { updDcList.add(acc); acc.FSE_Main__c = acc.Parent.FSE_Main__c; acc.SP_Main__c = acc.Parent.SP_Main__c; } dcFseSpMap.put(acc.Id, acc); } if (updDcList.size() > 0) Database.update(updDcList, false); // 戦略科室のチームを検索 List dcFseSpTeamList = [select AccountId, UserId, TeamMemberRole from AccountTeamMember where AccountId in :oyaList]; // 戦略科室のチームのFSE主担当を削除 List deleteFseSpTeamList = new List(); for (AccountTeamMember atm : dcFseSpTeamList) { // 戦略科室のチームにすでにFSE主担当が存在すれば、チームのFSE主担当を削除 if (dcFseSpMap.containsKey(atm.AccountId)) { // TeamMemberRoleを判断 if (atm.TeamMemberRole == 'FSE主担当' || atm.TeamMemberRole == 'SP主担当') { deleteFseSpTeamList.add(atm); } } } if (deleteFseSpTeamList.size() > 0) { dmlcount = dmlcount + deleteFseSpTeamList.size(); iflog.Log__c += 'soakupFromDeptTeam deleteFseSpTeamList ' + dmlcount + '\n'; Database.delete(deleteFseSpTeamList, false); } // 戦略科室のチームのFSE主担当を作成 List insertFseSpTeamList = new List(); for (Account acc : dcFseSpList) { if (acc.Parent.FSE_Main__c != null) { AccountTeamMember newAtm = new AccountTeamMember( UserId = acc.Parent.FSE_Main__c, TeamMemberRole = 'FSE主担当', AccountId = acc.Id ); insertFseSpTeamList.add(newAtm); } if (acc.Parent.SP_Main__c != null) { AccountTeamMember newAtm = new AccountTeamMember( UserId = acc.Parent.SP_Main__c, TeamMemberRole = 'SP主担当', AccountId = acc.Id ); insertFseSpTeamList.add(newAtm); } } if (insertFseSpTeamList.size() > 0) { dmlcount = dmlcount + insertFseSpTeamList.size(); iflog.Log__c += 'soakupFromDeptTeam insertFseSpTeamList ' + dmlcount + '\n'; Database.SaveResult[] lsr = Database.insert(insertFseSpTeamList, false); List newShare = new List(); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT TEAM MEMBER:' + emsg); } else { newShare.add(new AccountShare( // Edit に固定 by xud 20131203 UserOrGroupId = insertFseSpTeamList[tIdx].UserId, AccountId = insertFseSpTeamList[tIdx].AccountId, AccountAccessLevel = 'Edit', OpportunityAccessLevel = 'None' )); } } if (newShare.size() > 0) { dmlcount = dmlcount + newShare.size(); iflog.Log__c += 'soakupFromDeptTeam newShare ' + dmlcount + '\n'; lsr = Database.insert(newShare, false); //insert the new shares for (Integer sIdx = 0; sIdx < lsr.size(); sIdx++) { Database.SaveResult sr = lsr[sIdx]; if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT SHARING:' + emsg); } } } } // 診療科がなければ終了 if (dptList.size() == 0) return; List childList = new List(); // 'その他' を除いた診療科 Map c_o_Map = new Map(); for (Account child : dptList) { if (child.RecordType.Name != '診療科 その他') { childList.add(child); c_o_Map.put(child.Id, child.ParentId); } } if (childList.size() == 0) return; Map oOwnerMap = new Map(); for (Account oya : oyaList) { oOwnerMap.put(oya.Id, oya.OwnerId); } // 戦略科室のチームを検索 List dcListTeamList = [select Id, UserId, TeamMemberRole, AccountId, AccountAccessLevel from AccountTeamMember where AccountId in :oyaList]; Map> dcTeamMap = new Map>(); for (AccountTeamMember dcTeam : dcListTeamList) { if (dcTeamMap.get(dcTeam.AccountId) == null) { dcTeamMap.put(dcTeam.AccountId, new List()); } system.debug('dcTeam.AccountId:' + dcTeam.AccountId + ', dcTeam.UserId:' + dcTeam.UserId + ', Access:' + dcTeam.AccountAccessLevel); List dcTeamList = dcTeamMap.get(dcTeam.AccountId); dcTeamList.add(dcTeam); } // 診療科のチーム削除 List deleteTeamList = [select Id, UserId, TeamMemberRole, AccountId, AccountAccessLevel from AccountTeamMember where AccountId in :dptList]; // 削除の場合 その他も削除するため dmlcount = dmlcount + deleteTeamList.size(); iflog.Log__c += 'soakupFromDeptTeam deleteTeamList ' + dmlcount + '\n'; Database.delete(deleteTeamList, false); // 診療科のチームを作成 List updChildList = new List(); List dTeamList = new List(); // Edit に固定 by katsu 20130605 // List dTeamAccessLevelList = new List(); List newShare = new List(); //list of new shares to add for (Account child : childList) { if (child.OwnerId != oOwnerMap.get(c_o_Map.get(child.Id))) { child.OwnerId = oOwnerMap.get(c_o_Map.get(child.Id)); updChildList.add(child); } List dcTeamList = dcTeamMap.get(child.ParentId); if (dcTeamList != null) { for (AccountTeamMember dcTeam : dcTeamList) { AccountTeamMember dTeam = dcTeam.clone(); dTeam.AccountId = child.Id; dTeamList.add(dTeam); // Edit に固定 by katsu 20130605 // dTeamAccessLevelList.add(dcTeam.AccountAccessLevel); } } } if (updChildList.size() > 0) { dmlcount = dmlcount + updChildList.size(); iflog.Log__c += 'soakupFromDeptTeam updChildList ' + dmlcount + '\n'; Database.SaveResult[] lsr = Database.update(updChildList, false); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; if (!sr.isSuccess()) { System.debug(Logginglevel.ERROR, 'soakupFromDeptTeam update department owner AccountId = ' + sr.getId() + ' error:' + sr.getErrors()[0]); } } } if (dTeamList.size() > 0) { dmlcount = dmlcount + dTeamList.size(); iflog.Log__c += 'soakupFromDeptTeam dTeamList ' + dmlcount + '\n'; Database.SaveResult[] lsr = Database.insert(dTeamList, false); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT TEAM MEMBER:' + emsg); } else { newShare.add(new AccountShare( // Edit に固定 by katsu 20130605 // UserOrGroupId = dTeamList[tIdx].UserId, AccountId = dTeamList[tIdx].AccountId, AccountAccessLevel = dTeamAccessLevelList[tIdx], OpportunityAccessLevel = 'None' UserOrGroupId = dTeamList[tIdx].UserId, AccountId = dTeamList[tIdx].AccountId, AccountAccessLevel = 'Edit', OpportunityAccessLevel = 'None' )); } } if (newShare.size() > 0) { dmlcount = dmlcount + newShare.size(); iflog.Log__c += 'soakupFromDeptTeam newShare ' + dmlcount + '\n'; lsr = Database.insert(newShare, false); //insert the new shares for (Integer sIdx = 0; sIdx < lsr.size(); sIdx++) { Database.SaveResult sr = lsr[sIdx]; if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT SHARING:' + emsg); } } } } } /** * 病院のIDからチームを病院に上げる * 同時に戦略課室分類分類がその他 の チームも生成 * * @param hpIds 病院Idの配列 * @param batchUserId バッチユーザーのId */ public static void soakupToHPTeam(List hpIds) { // 病院配下の戦略科室のチームを検索 // 增加判断ownerid是否为启用状态 List dcList = [select Id, Management_Code__c, RecordType.Name, ParentId,Parent.ParentId, OwnerId, Owner.Name, FSE_Main__c, SP_Main__c from Account where Parent.Is_Active__c <> '無効' and Parent.RecordType.DeveloperName = 'HP' and Parent.owner.IsActive = true and ParentId in :hpIds]; if (dcList.size() == 0) return; List oyaList = [select Id, OwnerId, RecordType.Name from Account where Is_Active__c <> '無効' and Id in :hpIds and owner.IsActive = true ]; // その他診療科 List othDptList = [select Id, Management_Code__c, RecordType.Name, Parent.ParentId, OwnerId, Owner.Name from Account where Parent.Parent.Is_Active__c <> '無効' and Is_Active__c <> '無効' and RecordType.Name = '診療科 その他' and Parent.Parent.owner.IsActive = true and Parent.ParentId in :hpIds]; soakupToHPTeam(dcList, oyaList, othDptList); } public static void soakupToHPTeam(List dcList, List oyaList, List othDptList) { if (iflog == null) { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; } iflog.Log__c += 'soakupToHPTeam start\n'; for (Account hp : oyaList) { iflog.Log__c += 'hp[' + hp.Id + ']\n'; } Map oyaOwnerMap = New Map(); // '戦略科室分類 消化科'のId.ParentId => '戦略科室分類 消化科'のownerId List childList = new List(); // 'その他' を除いた戦略課室 List updOyaList = new List(); Map> hp2otherList = new Map>(); // 病院からその配下の '診療科 その他' のIdのListのMap Map c_o_Map = new Map(); //Map oyaFSEMap = New Map(); // '戦略科室分類 消化科'のId.ParentId => '戦略科室分類 消化科'のFSE主担当 System.debug('dcList===============' + dcList + ')'); for (Account child : dcList) { System.debug('child.RecordType.Name===============' + child.RecordType.Name + ')'); String OwnerIdString = ''; //if(child.RecordType.Name != '戦略科室分類 その他'){ // OwnerIdString //} if (child.RecordType.Name != '戦略科室分類 その他') { c_o_Map.put(child.Id, child.ParentId); childList.add(child); } else { if (hp2otherList.containsKey(child.ParentId) == false) { hp2otherList.put(child.ParentId, new List()); } List otherIdList = hp2otherList.get(child.ParentId); otherIdList.add(child.Id); oyaList.add(child); // '戦略科室分類 その他' もbatchに設定する対象 System.debug('otherIdList.add dc(' + child.Management_Code__c + ')'); } if (child.RecordType.Name == '戦略科室分類 消化科' ) { System.debug('戦略科室分類 消化科 ownerId:::::' + child.ownerId); oyaOwnerMap.put(child.ParentId, child.ownerId); System.debug('戦略科室分類 消化科 child.ParentId:::::' + child.ParentId); } if (child.RecordType.Name == '戦略科室分類 普外科') { System.debug('戦略科室分類 普外科 ownerId:::::' + child.ownerId); oyaOwnerMap.put('NormalOut'+child.ParentId, child.ownerId); System.debug('戦略科室分類 普外科 NormalOut===child.ownerId:::::' + child.ownerId); } /************************************Update SWAG-AMDCQH START****************************************/ //业务要求战略科室负责人就是具体科室的负责人 /************************************Update SWAG-AMDCQH START****************************************/ if(child.RecordType.Name == '戦略科室分類 その他'){ system.debug('診療科 その他计入'); system.debug('診療科 その他计入'+child.ownerid); system.debug('診療科 その他计入'+child.ownerId); oyaOwnerMap.put('others'+child.ParentId, child.ownerId); } /************************************Update SWAG-AMDCQH END******************************************/ //业务要求战略科室负责人就是具体科室的负责人 /************************************Update SWAG-AMDCQH END******************************************/ } for (Account othDpt : othDptList) { List otherIdList = hp2otherList.get(othDpt.Parent.ParentId); otherIdList.add(othDpt.Id); oyaList.add(othDpt); // '診療科 その他' もbatchに設定する対象 System.debug('otherIdList.add dpt(' + othDpt.Management_Code__c + ')'); } system.debug('是否计入添加=========###'+oyaList); for (Account oya : oyaList) { String oyaId = null; system.debug('是否计入添加=========记录类型'+oya.RecordType.Name); if (oya.RecordType.Name == '病院') { oyaId = oya.Id; } else if (oya.RecordType.Name == '戦略科室分類 その他') { oyaId = 'NormalOut'+oya.ParentId; } else if (oya.RecordType.Name == '診療科 その他') { /************************************Update SWAG-AMDCQH START****************************************/ //业务要求战略科室负责人就是具体科室的负责人 /************************************Update SWAG-AMDCQH START****************************************/ //oyaId = oya.Parent.ParentId; oyaId = 'others'+oya.Parent.ParentId; /************************************Update SWAG-AMDCQH END******************************************/ //业务要求战略科室负责人就是具体科室的负责人 /************************************Update SWAG-AMDCQH END******************************************/ } else { iflog.Log__c += oya.RecordType.Name + ' ownerIdの更新対象外:::::' + oya.Id + '\n'; System.debug(Logginglevel.ERROR, oya.RecordType.Name + ' ownerIdの更新対象外:::::' + oya.Id); } system.debug('是否计入添加========='+(oyaOwnerMap.get(oyaId))); system.debug('是否计入添加========='+(oyaId != null )); system.debug('是否计入添加========='+(oya)); system.debug('是否计入添加========='+(oyaId != null && oya.OwnerId != oyaOwnerMap.get(oyaId))); system.debug('是否计入添加========='+(oyaOwnerMap)); if (oyaId != null && oya.OwnerId != oyaOwnerMap.get(oyaId)) { oya.OwnerId = oyaOwnerMap.get(oyaId); updOyaList.add(oya); } } if (updOyaList.size() > 0) { dmlcount = dmlcount + updOyaList.size(); iflog.Log__c += 'soakupToHPTeam updOyaList ' + dmlcount + '\n'; system.debug('updOyaList最终结果========='+updOyaList); Database.update(updOyaList, false); } List childListTeamList = [select Id, UserId, User.Name, TeamMemberRole, AccountId, AccountAccessLevel from AccountTeamMember where AccountId in :childList order by LastModifiedDate desc]; Map> childTeamMap = new Map>(); // key が病院 for (AccountTeamMember childTeam : childListTeamList) { if (childTeamMap.get(c_o_Map.get(childTeam.AccountId)) == null) { childTeamMap.put(c_o_Map.get(childTeam.AccountId), new List()); } system.debug('dcTeam AccountId:' + childTeam.AccountId + ', User:' + childTeam.User.Name + ', Access:' + childTeam.AccountAccessLevel); List childTeamList = childTeamMap.get(c_o_Map.get(childTeam.AccountId)); childTeamList.add(childTeam); } for (Account child : childList) { if (child.OwnerId != oyaOwnerMap.get(child.ParentId)) { AccountTeamMember owner2Team = new AccountTeamMember(AccountId = child.Id, UserId = child.OwnerId, TeamMemberRole = '営業担当'); system.debug('childList AccountId:' + owner2Team.AccountId + ', UserId:' + child.Owner.Name + ', Access:' + owner2Team.AccountAccessLevel); if (childTeamMap.get(c_o_Map.get(child.Id)) == null) { childTeamMap.put(c_o_Map.get(child.Id), new List()); } List childTeamList = childTeamMap.get(c_o_Map.get(child.Id)); childTeamList.add(owner2Team); } } // 病院(と 診療科 その他)のチーム削除 List deleteTeamList = [select Id, UserId, TeamMemberRole, AccountId, AccountAccessLevel from AccountTeamMember where AccountId in :oyaList]; System.debug(deleteTeamList+'病院(と 診療科 その他)のチーム削除'); dmlcount = dmlcount + deleteTeamList.size(); iflog.Log__c += 'soakupToHPTeam deleteTeamList ' + dmlcount + '\n'; Database.delete(deleteTeamList, false); // 病院(と 診療科 その他)のチームを作成 Set teamKeySet = new Set(); List oyaTeamEList = new List(); // Edit に固定 by katsu 20130605 // List oyaTeamAccessLevelEList = new List(); List oyaTeamList = new List(); // Edit に固定 by katsu 20130605 // List oyaTeamAccessLevelList = new List(); for (String oyaId : childTeamMap.keySet()) { system.debug('oyaId:' + oyaId); List childTeamList = childTeamMap.get(oyaId); // 病院配下の全て戦略課室のチーム if (childTeamList != null) { for (AccountTeamMember childTeam : childTeamList) { AccountTeamMember oyaTeam = childTeam.clone(); oyaTeam.AccountId = oyaId; String accessLevel = childTeam.AccountAccessLevel != null ? childTeam.AccountAccessLevel : 'Edit'; if (teamKeySet.contains(accessLevel + oyaId + oyaTeam.UserId)) { continue; } System.debug('teamKeySet.add(' + accessLevel + oyaId + oyaTeam.UserId + ')'); teamKeySet.add(accessLevel + oyaId + oyaTeam.UserId); if (accessLevel == 'Edit') { oyaTeamEList.add(oyaTeam); // Edit に固定 by katsu 20130605 // oyaTeamAccessLevelEList.add(accessLevel); } else { oyaTeamList.add(oyaTeam); // Edit に固定 by katsu 20130605 // oyaTeamAccessLevelList.add(accessLevel); } List otherIdList = hp2otherList.get(oyaId); // 1行にするため、チームを その他 に移す if (otherIdList != null ) for (String otherId : otherIdList) { AccountTeamMember othTeam = oyaTeam.clone(); othTeam.AccountId = otherId; if (accessLevel == 'Edit') { oyaTeamEList.add(othTeam); // Edit に固定 by katsu 20130605 // oyaTeamAccessLevelEList.add(accessLevel); } else { oyaTeamList.add(othTeam); // Edit に固定 by katsu 20130605 // oyaTeamAccessLevelList.add(accessLevel); } } } } } List newShare = new List(); //list of new shares to add if (oyaTeamList.size() > 0) { dmlcount = dmlcount + oyaTeamList.size(); iflog.Log__c += 'soakupToHPTeam oyaTeamList ' + dmlcount + '\n'; if (dmlcount >= 10000) { iflog.ErrorLog__c = 'soakupToHPTeam oyaTeamList ' + dmlcount + '\n'; insert iflog; return; } Database.SaveResult[] lsr = Database.insert(oyaTeamList, false); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; system.debug(sr.isSuccess()+'sr.isSuccess()++++++++=======++++++111'); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT TEAM MEMBER:' + emsg); } else { newShare.add(new AccountShare( // Edit に固定 by katsu 20130605 // UserOrGroupId = oyaTeamList[tIdx].UserId, AccountId = oyaTeamList[tIdx].AccountId, AccountAccessLevel = oyaTeamAccessLevelList[tIdx], OpportunityAccessLevel = 'None' UserOrGroupId = oyaTeamList[tIdx].UserId, AccountId = oyaTeamList[tIdx].AccountId, AccountAccessLevel = 'Edit', OpportunityAccessLevel = 'None' )); } } } if (oyaTeamEList.size() > 0) { // Editは優先的にするため、あとにinsertする dmlcount = dmlcount + oyaTeamEList.size(); iflog.Log__c += 'soakupToHPTeam oyaTeamEList ' + dmlcount + '\n'; if (dmlcount >= 10000) { iflog.ErrorLog__c = 'soakupToHPTeam oyaTeamEList ' + dmlcount + '\n'; insert iflog; return; } Database.SaveResult[] lsr = Database.insert(oyaTeamEList, false); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; system.debug(sr.isSuccess()+'sr.isSuccess()++++++++=======++++++222'); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT TEAM MEMBER:' + emsg); } else { newShare.add(new AccountShare( // Edit に固定 by katsu 20130605 // UserOrGroupId = oyaTeamEList[tIdx].UserId, AccountId = oyaTeamEList[tIdx].AccountId, AccountAccessLevel = oyaTeamAccessLevelEList[tIdx], OpportunityAccessLevel = 'None' UserOrGroupId = oyaTeamEList[tIdx].UserId, AccountId = oyaTeamEList[tIdx].AccountId, AccountAccessLevel = 'Edit', OpportunityAccessLevel = 'None' )); } } } if (newShare.size() > 0) { dmlcount = dmlcount + newShare.size(); iflog.Log__c += 'soakupToHPTeam newShare ' + dmlcount + '\n'; if (dmlcount >= 10000) { iflog.ErrorLog__c = 'soakupToHPTeam newShare ' + dmlcount + '\n'; insert iflog; return; } Database.SaveResult[] lsr = Database.insert(newShare, false); //insert the new shares for (Integer sIdx = 0; sIdx < lsr.size(); sIdx++) { Database.SaveResult sr = lsr[sIdx]; system.debug(sr.isSuccess()+'sr.isSuccess()++++++++=======++++++333'); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; system.debug('\nERROR ADDING ACCOUNT SHARING:' + emsg); } } } } }