/** * wangweipeng 20210705 * opd计划判断所有人和战略科室所有人是否为同一人,如果不同的人,给他加一个共享 * * wangweipeng 2021/08/10 * 新增共享给科室对应的主担当人 */ global class OPDStrategyPersonShareBatch implements Database.Batchable { public String query; private String errStr; private BatchIF_Log__c iflog; private final List TEST_ID = null; global OPDStrategyPersonShareBatch() { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Is_Error__c = 0; iflog.Log__c = 'OPDStrategyPersonShareBatch start1\n'; iflog.ErrorLog__c = ''; insert iflog; } global OPDStrategyPersonShareBatch(List testId) { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Is_Error__c = 0; iflog.Log__c = 'OPDStrategyPersonShareBatch start1\n'; iflog.ErrorLog__c = ''; insert iflog; TEST_ID = testId; } //add 新建共享数据 private OPDPlan__Share makeData(String parentId,String userId){ OPDPlan__Share ras = new OPDPlan__Share(); ras.RowCause= 'AccountOwnerShare__c';//手动 ras.ParentId = parentId;//opd id ras.UserOrGroupId = userId;//共享给谁 ras.AccessLevel = 'Edit';//编辑 return ras; } //担当人共享数据 private OPDPlan__Share makeData2(String parentId,String userId){ OPDPlan__Share ras = new OPDPlan__Share(); ras.RowCause= 'ProducLeaderShare__c';//手动 ras.ParentId = parentId;//opd id ras.UserOrGroupId = userId;//共享给谁 ras.AccessLevel = 'Edit';//编辑 return ras; } /** * 战略科室所有人共享 * A是所有人 B是战略科室所有人 C共享表共享的人 * 什么都不做 0 * A = B C无值 什么都不做 1 * A = B != C有值 删除C 3 * A != B = C有值 什么都不做 2 * A != B != C有值 新增共享更新C 5 * A != B C无值 新增共享更新C 4 * *担当人共享 * * 1:等于战略科室所有人或opd计划所有人,什么都不做 * 2:否则新增共享 * */ global Database.QueryLocator start(Database.BatchableContext bc) { query = 'select id,Owner.name,Owner.id,Owner.IsActive,Department_owner__c,Status__c, Share_one_id__c , Share_one_type__c,' + ' Account_Laboratory__r.Hospital__r.GI_Product_Leader__c,Account_Laboratory__r.Hospital__r.BF_Product_Leader__c,' + ' Account_Laboratory__r.Hospital__r.ET_Product_Leader__c,Account_Laboratory__r.Hospital__r.GS_Product_Leader__c,' + ' Account_Laboratory__r.Hospital__r.URO_Produc_Leader__c,' + ' Account_Laboratory__r.Hospital__r.GYN_Product_Leader__c,Account_Laboratory__r.Hospital__r.ENT_Product_Leader__c, ' //+ ' Account_Laboratory__r.Parent.ET_Product_Leader__c' + ' Share_Produc_Leader__c,Department_Class__c ' + ' from OPDPlan__c where Status__c IN (\'完毕未报告\',\'待提交报告\') '; if (TEST_ID <> null) { query += ' and Id IN: TEST_ID'; } // iflog.Log__c += query+'\n'; // update iflog; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list scope) { if(scope != null && scope.size() > 0){ //用于删除旧的共享计划 List delStrategList = new List(); //修改 C 共享里面存的共享人id List updateShareOneId = new List(); //删除 修改C 新增 共享 List DelShareParentId = new List(); //增加 B 和C List InsShare = new List(); //收集要新建的opd id List ParentIdList = new List(); //收集担当人中文名 List productLeaderNameList = new List(); List oPDPlanProductLeaderNameList = new List(); //担当人id DelShareParentId List DelShareParentId2 = new List(); //如果共享了担当人,那么把此担当人id记录到opd计划表,方便我们下次共享时判断 List updateShareProducLeader = new List(); //新增担当人共享 List InsShareProducLeader = new List(); for(OPDPlan__c occ : scope){ //共享战略科室所有人 Integer ShareOneType = Integer.valueOf(occ.Share_one_type__c); if(ShareOneType == 3){ updateShareOneId.add(new OPDPlan__c(Id=occ.Id,Share_one_id__c='')); DelShareParentId.add(occ.id); } if(ShareOneType == 4){ updateShareOneId.add(new OPDPlan__c(Id=occ.Id,Share_one_id__c=occ.Department_owner__c)); if(occ.Department_owner__c != '' && occ.Department_owner__c != null){ OPDPlan__Share os = makeData(occ.id,occ.Department_owner__c); InsShare.add(os); } } if(ShareOneType == 5){ updateShareOneId.add(new OPDPlan__c(Id=occ.Id,Share_one_id__c=occ.Department_owner__c)); if(occ.Department_owner__c != '' && occ.Department_owner__c != null){ OPDPlan__Share os = makeData(occ.id,occ.Department_owner__c); InsShare.add(os); } DelShareParentId.add(occ.id); } if(occ.Account_Laboratory__c != null){ //获取对应的担当人中文名字 List getProductLeaderNameList = getProductLeaderName(occ); if(getProductLeaderNameList != null && getProductLeaderNameList.size() > 0){ for(String productLeaderName : getProductLeaderNameList){ if(productLeaderName != ''){ productLeaderNameList.add(productLeaderName); oPDPlanProductLeaderNameList.add(occ); } } } //有可能出现担当人修改成空,那么就需要把原来的共享人删除掉 if(getProductLeaderNameList.size() == 0){ if(occ.Share_Produc_Leader__c != null){ //把此次共享的人员id,存放到opd计划表中 updateShareProducLeader.add(new OPDPlan__c(id=occ.id,Share_Produc_Leader__c='')); //删除原来担当人的opd计划共享 DelShareParentId2.add(occ.id); } } } } //共享对应的担当人 if(productLeaderNameList != null && productLeaderNameList.size() > 0){ //获取担当人的user对象 List userList = [select id,name,Alias,Alias__c from user where IsActive = true and Alias__c in :productLeaderNameList order by CreatedDate desc]; if(userList != null && userList.size() > 0){ for(OPDPlan__c occ : scope){ //获取对应的担当人中文名字 List userNameList = getProductLeaderName(occ); //临时变量,用于收集当前opd计划下所有的担当人id String productLeaderId = ''; if(userNameList != null && userNameList.size() > 0){ for(String usrName : userNameList){ for(User u : userList){ //首先找到对应的担当人 //由于可能出现同名的担当人,所以我们需要首先收集所有的担当人,再后期处理 if(usrName == u.Alias__c){ if(productLeaderId == ''){ productLeaderId = u.id; }else{ productLeaderId += ','+u.id; } } } } } //处理担当人的数据 if(productLeaderId != ''){ //判断此担当人是否已经共享 if(!productLeaderId.equals(occ.Share_Produc_Leader__c)){ //判断担当人是否不等于 战略科室所有人或opd计划所有人,如果和其中一个相等,那么不需要加再给此人加共享了 if(!productLeaderId.equals(occ.Department_owner__c) && !productLeaderId.equals(occ.Owner.Id)){ //由于可能出现同名的担当人,那么我们需要把这些同名的人都共享 List userIdList = productLeaderId.split(','); for(String uId : userIdList){ if(uId != '' && uId != null){ InsShareProducLeader.add(makeData2(occ.id,uId)); } } //把此次共享的人员id,存放到opd计划表中 updateShareProducLeader.add(new OPDPlan__c(id=occ.id,Share_Produc_Leader__c=productLeaderId)); //删除原来担当人的opd计划共享 DelShareParentId2.add(occ.id); }else{ //判断词条opd计划的数据是否有担当人共享数据 if(String.isNotBlank(occ.Share_Produc_Leader__c)){ //修改opd计划的担当人共享字段,设置为空 updateShareProducLeader.add(new OPDPlan__c(id=occ.id,Share_Produc_Leader__c='')); //删除原来担当人的opd计划共享 DelShareParentId2.add(occ.id); } } } }else{//如果没有收集到担当人的id,那么证明此担当人不存在系统中或没启用 //判断词条opd计划的数据是否有担当人共享数据 if(String.isNotBlank(occ.Share_Produc_Leader__c)){ //修改opd计划的担当人共享字段,设置为空 updateShareProducLeader.add(new OPDPlan__c(id=occ.id,Share_Produc_Leader__c='')); //删除原来担当人的opd计划共享 DelShareParentId2.add(occ.id); } } } }else{//如果没有在user表中查找到人员,那么有可能是此用户在系统中不存在或没有启用,所有要把以前的共享担当人值置空 for(OPDPlan__c productLeaderNameId : oPDPlanProductLeaderNameList){ if(String.isNotBlank(productLeaderNameId.Share_Produc_Leader__c)){ //修改opd计划的担当人共享字段,设置为空 updateShareProducLeader.add(new OPDPlan__c(id=productLeaderNameId.id,Share_Produc_Leader__c='')); //删除原来担当人的opd计划共享 DelShareParentId2.add(productLeaderNameId.id); } } } } Savepoint sp = Database.setSavepoint(); try{ //opd计划 战略科室所有人共享 //删除原来的opd共享 if(DelShareParentId != null && DelShareParentId.size() > 0){ delStrategList = [SELECT Id,ParentId,UserOrGroupId FROM OPDPlan__Share WHERE RowCause ='AccountOwnerShare__c' AND ParentId in :DelShareParentId]; if(delStrategList != null && delStrategList.size() > 0){ delete delStrategList; } } if(InsShare != null && InsShare.size() > 0){ //新建新的共享 insert InsShare; } if(updateShareOneId != null && updateShareOneId.size() > 0){ //更新修理表中 共享表共享人id update updateShareOneId; } //以下是共享担当人 if(DelShareParentId2 != null && DelShareParentId2.size() > 0){ List delProducLeaderList = [SELECT Id,ParentId,UserOrGroupId FROM OPDPlan__Share WHERE RowCause ='ProducLeaderShare__c' AND ParentId in :DelShareParentId2]; if(delProducLeaderList != null && delProducLeaderList.size() > 0){ delete delProducLeaderList; } } if(InsShareProducLeader != null && InsShareProducLeader.size() > 0){ insert InsShareProducLeader; } if(updateShareProducLeader != null && updateShareProducLeader.size() > 0){ update updateShareProducLeader; } }catch(exception e){ System.debug('*****************'+e.getMessage()); errStr = e.getMessage()+'\n'; errStr += e.getLineNumber()+'\n'; Database.rollback(sp); } } } //获取对应的担当人中文名 public List getProductLeaderName(OPDPlan__c opc){ List productLeaderNameList = new List();//担当中文名 if(opc != null){ String productLeader = ''; String departmentType = opc.Department_Class__c;//科室分类 if(departmentType != ''){ if('消化科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.GI_Product_Leader__c;} if('呼吸科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.BF_Product_Leader__c;} if('普外科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.GS_Product_Leader__c;} if('泌尿科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.URO_Produc_Leader__c;} if('妇科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.GYN_Product_Leader__c;} if('耳鼻喉科'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.ENT_Product_Leader__c;} if('ET'.equals(departmentType)){productLeader = opc.Account_Laboratory__r.Hospital__r.ET_Product_Leader__c;} //由于担当人可能是定义个人所以需要循环一下 if(productLeader != '' && productLeader != null){ if(productLeader.indexOf(',') != -1){ productLeader = productLeader.replace(',',','); } if(productLeader.indexOf(' ') != -1){ productLeader = productLeader.replace(' ',''); } for (String usrName1 : productLeader.split(',')) { if(!(''.equals(usrName1))){ productLeaderNameList.add(usrName1); } } } } } return productLeaderNameList; } global void finish(Database.BatchableContext BC) { String tmp = ''; if (String.isNotBlank(errStr)) { tmp = errStr; } iflog.Log__c += query+'\n'; iflog.Log__c += 'OPDStrategyPersonShareBatch finish()\n'; iflog.Log__c += '\nOPDStrategyPersonShareBatch end'; tmp += iflog.ErrorLog__c; if (tmp.length() > 60000) { tmp = tmp.substring(0, 60000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } String tmp2 = iflog.Log__c; if (tmp2.length() > 60000) { tmp2 = tmp2.substring(0, 60000); tmp2 += ' ...have more lines...'; iflog.Log__c = tmp2; } if (System.Label.Log_IO_Flag == 'Keep') { update iflog; } else if (System.Label.Log_IO_Flag == 'Auto') { if (iflog.Is_Error__c > 0) { update iflog; } } } }