| | |
| | | * [SetFrameNumManageBatch 进口单证上传后查找字段batch更新] |
| | | * @Author lijinhuan |
| | | * @DateTime 2022-11-04T18:31:03+0800 |
| | | * @return [] |
| | | * 测试类:FrameNumUploadControllerTest |
| | | */ |
| | | global without sharing class SetFrameNumManageBatch implements Database.Batchable<sObject> { |
| | | global without sharing class SetFrameNumManageBatch implements Database.Batchable<sObject>, Database.Stateful{ |
| | | public String query; |
| | | public String Id; |
| | | |
| | | //邮件信息 |
| | | List<String> emailMessages = new List<String>(); |
| | | |
| | | //报错的进口单证Id |
| | | String logStr = '进口单证 : '; |
| | | //报错信息 |
| | | String errorStr = ''; |
| | | //总件数 |
| | | Integer totalCount = 0; |
| | | // 失败件数 |
| | | Integer failedCount = 0; |
| | | |
| | | global SetFrameNumManageBatch() { |
| | | this.query = query; |
| | | } |
| | | |
| | | global SetFrameNumManageBatch(String Id) { |
| | | this.query = query; |
| | | this.Id = Id; |
| | | } |
| | | |
| | | global Database.QueryLocator start(Database.BatchableContext bc) { |
| | | query = 'select Id,SerialNumberS__c,InspectionCard__c,ApplyList__c from FrameNumManage__c where '; |
| | | // query += '('; |
| | | query += ' signInForm__c = null '; |
| | | query += ' OR Statu_Achievements_DN_details__c = null '; |
| | | query += ' OR Asset__c = null '; |
| | | query += ' OR (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c !=\'不出证\')'; |
| | | query += ' OR (InspectionCard_Select__c != null AND (InspectionCard__c =\'不出证\' OR InspectionCard__c = null))';// 清空 |
| | | query += ' OR (ApplyList_Select__c = null AND ApplyList__c != null)'; |
| | | query += ' OR (ApplyList_Select__c != null AND ApplyList__c = null)';// 清空 |
| | | // query += ')'; |
| | | // query += ' AND id = \'a5D9D0000000WqF\''; |
| | | query = 'select Id,ManagementCode__c,InspectionCard__c,InspectionCard_Select__c,ApplyList__c,ApplyList_Select__c,'; |
| | | // query += 'Statu_Achievements_DN_details__c,signInForm__c,Asset__c,ManagementCode__c,IsChange__c '; |
| | | query += 'Asset__c,ScanDate__c,ScanDate_select__c,IsChange__c, DeliveryDate__c, DeliveryDate_select__c '; |
| | | // query += 'IsChange__c '; |
| | | query += ' from FrameNumManage__c where '; |
| | | if(String.isNotBlank(Id)){ |
| | | query += ' id = :Id'; |
| | | }else{ |
| | | // query += ' signInForm__c = null '; |
| | | // query += ' OR Statu_Achievements_DN_details__c = null '; |
| | | |
| | | // query += '((signInForm__c = null OR Statu_Achievements_DN_details__c = null) AND AssertRecordType__c != \'Shipment\') '; |
| | | // query += ' OR Asset__c = null '; |
| | | // |
| | | query += ' Asset__c = null '; |
| | | query += ' OR (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c !=\'不要\')'; |
| | | // query += ' (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c != \'\' AND InspectionCard__c !=\'不要\')'; |
| | | query += ' OR (InspectionCard_Select__c != null AND (InspectionCard__c =\'不要\' OR InspectionCard__c = null OR InspectionCard__c = \'\'))';// 清空 |
| | | query += ' OR (ApplyList_Select__c = null AND ApplyList__c != null AND ApplyList__c != \'\')'; |
| | | query += ' OR (ApplyList_Select__c != null AND (ApplyList__c = null OR ApplyList__c =\'\'))';// 清空 |
| | | query += ' OR (ScanDate__c != null AND ScanDate_select__c = null)'; |
| | | query += ' OR IsChange__c = true'; |
| | | } |
| | | return Database.getQueryLocator(query); |
| | | } |
| | | |
| | |
| | | Map<String,String> ApplyListMap = new Map<String,String>(); |
| | | Map<String,Id> InspectionCardIdMap = new Map<String,Id>(); |
| | | Map<String,Id> ApplyListIdMap = new Map<String,Id>(); |
| | | Set<String> SerialNumberSet = new Set<String>(); |
| | | Set<Id> clearSet = new Set<Id>(); |
| | | Set<String> TracingCodeSet = new Set<String>(); |
| | | Set<String> TracingCodeAssetSet = new Set<String>(); |
| | | Map<Id,String> clearMap = new Map<Id,String>(); |
| | | Set<Date> ScanDateSet = new Set<Date>(); |
| | | Map<Id,FrameNumManage__c> oldMap = new Map<Id,FrameNumManage__c>(); |
| | | try{ |
| | | for(FrameNumManage__c fnm:fnmList){ |
| | | // 清空 |
| | | if(String.isBlank(fnm.ApplyList__c) |
| | | || String.isBlank(fnm.InspectionCard__c) |
| | | ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '不出证')){ |
| | | clearSet.add(fnm.Id); |
| | | }else{ |
| | | //赋值 |
| | | SerialNumberSet.add(fnm.SerialNumberS__c); |
| | | InspectionCardMap.put(fnm.SerialNumberS__c,fnm.InspectionCard__c); |
| | | ApplyListMap.put(fnm.SerialNumberS__c,fnm.ApplyList__c); |
| | | // 0 all 1:ApplyList_Select__c 2:InspectionCard_Select__c |
| | | if( |
| | | ((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '不要')) &&!String.isBlank(fnm.ApplyList_Select__c)) |
| | | && ((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '不要')) &&!String.isBlank(fnm.InspectionCard_Select__c)) |
| | | ){ |
| | | clearMap.put(fnm.Id,'0'); |
| | | }else if((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '不要')) &&!String.isBlank(fnm.ApplyList_Select__c)){ |
| | | clearMap.put(fnm.Id,'1'); |
| | | }else if((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '不要')) &&!String.isBlank(fnm.InspectionCard_Select__c)){ |
| | | clearMap.put(fnm.Id,'2'); |
| | | } |
| | | //赋值 |
| | | // if(String.isBlank(fnm.signInForm__c) || String.isBlank(fnm.Statu_Achievements_DN_details__c)){ |
| | | // TracingCodeSet.add(fnm.ManagementCode__c); //签收单 发货DN明细用 |
| | | // } |
| | | // System.debug('zheli03:'+String.isBlank(fnm.Asset__c)); |
| | | if(String.isBlank(fnm.Asset__c)){ |
| | | TracingCodeAssetSet.add(fnm.ManagementCode__c);// 保有设备用 |
| | | } |
| | | |
| | | // System.debug('zheli02:'+TracingCodeAssetSet); |
| | | InspectionCardMap.put(fnm.ManagementCode__c,fnm.InspectionCard__c); |
| | | ApplyListMap.put(fnm.ManagementCode__c,fnm.ApplyList__c); |
| | | if(fnm.ScanDate__c != null){ |
| | | ScanDateSet.add(fnm.ScanDate__c); |
| | | } |
| | | oldMap.put(fnm.Id,fnm); |
| | | } |
| | | // 发货DN明细 |
| | | Map<String,Id> DNdetailMap = new Map<String,Id>(); |
| | | Map<String,String> DNMap = new Map<String,String>(); |
| | | for(Statu_Achievements_DN_details__c dn:[SELECT Id,SerialNumber__c,Statu_Achievements_DN__c,Statu_Achievements_DN__r.Name FROM Statu_Achievements_DN_details__c WHERE SerialNumber__c IN: SerialNumberSet]){ |
| | | DNdetailMap.put(dn.SerialNumber__c,dn.Id); |
| | | DNMap.put(dn.SerialNumber__c,dn.Statu_Achievements_DN__r.Name); |
| | | } |
| | | // 签收单 |
| | | Map<String,Id> eSignFormMap = new Map<String,Id>(); |
| | | for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){ |
| | | for(String key:DNMap.keySet()){ |
| | | if(DNMap.get(key) == es.DNName__c){ |
| | | eSignFormMap.put(key,es.Id); |
| | | } |
| | | } |
| | | } |
| | | // Map<String,Id> DNdetailMap = new Map<String,Id>(); |
| | | // Map<String,String> DNMap = new Map<String,String>(); |
| | | // Map<String,Id> AssetMap = new Map<String,Id>(); |
| | | // for(Statu_Achievements_DN_details__c dn:[SELECT Id,TracingCode_Raw__c,Statu_Achievements_DN__c,Statu_Achievements_DN__r.Name,asset__c FROM Statu_Achievements_DN_details__c WHERE TracingCode_Raw__c IN: TracingCodeSet]){ |
| | | // DNdetailMap.put(dn.TracingCode_Raw__c,dn.Id); |
| | | // AssetMap.put(dn.TracingCode_Raw__c,dn.asset__c); |
| | | // DNMap.put(dn.TracingCode_Raw__c,dn.Statu_Achievements_DN__r.Name); |
| | | // } |
| | | // // 签收单 |
| | | // Map<String,Id> eSignFormMap = new Map<String,Id>(); |
| | | // for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){ |
| | | // for(String key:DNMap.keySet()){ |
| | | // if(DNMap.get(key) == es.DNName__c){ |
| | | // eSignFormMap.put(key,es.Id); |
| | | // } |
| | | // } |
| | | // } |
| | | // System.debug('zheli01:'+TracingCodeAssetSet); |
| | | // 保有设备 |
| | | Map<String,Id> AssetMap = new Map<String,Id>(); |
| | | for(Asset ass:[SELECT Id,SerialNumber FROM Asset WHERE SerialNumber IN: SerialNumberSet]){ |
| | | AssetMap.put(ass.SerialNumber,ass.Id); |
| | | Map<String, Asset> AssetDatas = new Map<String, Asset>(); |
| | | // 进口单证 增加发货日设置 start |
| | | for(Asset ass:[SELECT Id,TracingCode__c,Posting_Date__c FROM Asset WHERE TracingCode__c IN: TracingCodeAssetSet]){ |
| | | if(!AssetMap.containsKey(ass.TracingCode__c)){ |
| | | AssetMap.put(ass.TracingCode__c,ass.Id); |
| | | AssetDatas.put(ass.TracingCode__c,ass); |
| | | } |
| | | if (ass.Posting_Date__c != null) { |
| | | ScanDateSet.add(ass.Posting_Date__c); |
| | | } |
| | | // AssetMap.put(ass.TracingCode__c,ass.Id); |
| | | } |
| | | // 进口单证 增加发货日设置 end |
| | | // System.debug('zheli00:'+AssetMap); |
| | | // 商检证 InspectionCard_Select__c 报关单 ApplyList_Select__c |
| | | Set<String> FilesNameSet = new Set<String>(); |
| | | FilesNameSet.addAll(InspectionCardMap.values()); |
| | | FilesNameSet.addAll(ApplyListMap.values()); |
| | | // 商检证 InspectionCard_Select__c 报关单 ApplyList_Select__c |
| | | for(FileAddress__c fa:[SELECT Id,OnlyFileName__c FROM FileAddress__c WHERE OnlyFileName__c IN: FilesNameSet]){ |
| | | for(FileAddress__c fa:[SELECT Id,OnlyFileName__c FROM FileAddress__c WHERE ParentRecordId__c = 'FrameNumManage' AND OnlyFileName__c IN: FilesNameSet]){ |
| | | for(String key:InspectionCardMap.keySet()){ |
| | | if(InspectionCardMap.get(key) == fa.OnlyFileName__c){ |
| | | InspectionCardIdMap.put(key,fa.Id); |
| | |
| | | } |
| | | } |
| | | } |
| | | // 扫描日期 |
| | | Map<Date,Id> ScanDateMap = new Map<Date,Id>(); |
| | | for(OlympusCalendar__c oc:[SELECT Id,Date__c FROM OlympusCalendar__c WHERE Date__c IN: ScanDateSet]){ |
| | | ScanDateMap.put(oc.Date__c,oc.Id); |
| | | } |
| | | // 最后整合 |
| | | List<FrameNumManage__c> upFnmList = new List<FrameNumManage__c>(); |
| | | for(FrameNumManage__c fnm:fnmList){ |
| | | FrameNumManage__c temp = new FrameNumManage__c(); |
| | | temp.Id = fnm.Id; |
| | | if(clearSet.contains(fnm.Id)){ |
| | | temp.InspectionCard_Select__c = null; |
| | | temp.ApplyList_Select__c = null; |
| | | }else{ |
| | | temp.Statu_Achievements_DN_details__c = DNdetailMap.get(fnm.SerialNumberS__c); |
| | | temp.signInForm__c = eSignFormMap.get(fnm.SerialNumberS__c); |
| | | temp.Asset__c = AssetMap.get(fnm.SerialNumberS__c); |
| | | temp.InspectionCard_Select__c = InspectionCardIdMap.get(fnm.SerialNumberS__c); |
| | | temp.ApplyList_Select__c = ApplyListIdMap.get(fnm.SerialNumberS__c); |
| | | // if(DNdetailMap.size() > 0 && DNdetailMap.containsKey(fnm.ManagementCode__c)){ |
| | | // temp.Statu_Achievements_DN_details__c = DNdetailMap.get(fnm.ManagementCode__c); |
| | | // } |
| | | // if(eSignFormMap.size() > 0 && eSignFormMap.containsKey(fnm.ManagementCode__c)){ |
| | | // temp.signInForm__c = eSignFormMap.get(fnm.ManagementCode__c); |
| | | // } |
| | | if(AssetMap.size() > 0 && AssetMap.containsKey(fnm.ManagementCode__c)){ |
| | | temp.Asset__c = AssetMap.get(fnm.ManagementCode__c); |
| | | // 进口单证 增加发货日设置 start |
| | | if(String.isNotBlank(temp.Asset__c) && AssetDatas.get(fnm.ManagementCode__c) != null && AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c != null){ |
| | | temp.DeliveryDate__c = AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c; |
| | | temp.DeliveryDate_select__c = ScanDateMap.get(AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c); |
| | | } |
| | | // 进口单证 增加发货日设置 end |
| | | } |
| | | upFnmList.add(temp); |
| | | if(ScanDateMap.size() > 0 && ScanDateMap.containsKey(fnm.ScanDate__c)){ |
| | | temp.ScanDate_Select__c = ScanDateMap.get(fnm.ScanDate__c); |
| | | } |
| | | if(clearMap.containsKey(fnm.Id)){ |
| | | if(clearMap.get(fnm.Id) == '0'){ |
| | | temp.ApplyList_Select__c = null; |
| | | temp.InspectionCard_Select__c = null; |
| | | }else if(clearMap.get(fnm.Id) == '1'){ |
| | | temp.ApplyList_Select__c = null; |
| | | }else if(clearMap.get(fnm.Id) == '2'){ |
| | | temp.InspectionCard_Select__c = null; |
| | | } |
| | | }else{ |
| | | temp.InspectionCard_Select__c = InspectionCardIdMap.get(fnm.ManagementCode__c); |
| | | temp.ApplyList_Select__c = ApplyListIdMap.get(fnm.ManagementCode__c); |
| | | } |
| | | temp.IsChange__c = false; |
| | | // 有变化才更新 |
| | | // if(!(temp.Statu_Achievements_DN_details__c == oldMap.get(temp.Id).Statu_Achievements_DN_details__c |
| | | // && temp.signInForm__c == oldMap.get(temp.Id).signInForm__c |
| | | // && temp.Asset__c == oldMap.get(temp.Id).Asset__c |
| | | // && temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c |
| | | // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c |
| | | // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c |
| | | // )){ |
| | | // if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c |
| | | // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c |
| | | // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c |
| | | // )){ |
| | | if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c |
| | | && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c |
| | | && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c |
| | | && temp.Asset__c == oldMap.get(temp.Id).Asset__c |
| | | && temp.ScanDate_Select__c == oldMap.get(temp.Id).ScanDate_Select__c |
| | | )){ |
| | | // System.debug('zheli99'); |
| | | upFnmList.add(temp); |
| | | } |
| | | } |
| | | // System.debug('zhelieupFnmList:'+upFnmList.size()); |
| | | if(upFnmList.size() > 0){ |
| | | update upFnmList; |
| | | // update upFnmList; |
| | | List<Database.SaveResult> saveResults = Database.update(upFnmList,false); |
| | | //总数 |
| | | totalCount += saveResults.size(); |
| | | for(Integer i = 0;i<saveResults.size();i++) { |
| | | if(!saveResults.get(i).isSuccess() ){ |
| | | logStr += upFnmList.get(i).id +' ,'; |
| | | errorStr += '失败进口单证 :'+upFnmList.get(i).id+' 失败原因:'+ String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[2].split('=')[1] |
| | | +' : '+String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[1].split('=')[1] + '\r\n'; |
| | | failedCount++ ; |
| | | } |
| | | } |
| | | } |
| | | |
| | | }catch(Exception ex){ |
| | | errorStr += 'Batch执行过程中出现错误: ' + ex.getStackTraceString(); |
| | | } |
| | | |
| | | } |
| | | |
| | | global void finish(Database.BatchableContext BC) { |
| | | BatchIF_Log__c IfLog = new BatchIF_Log__c(); |
| | | IfLog.Type__c = 'SetFrameNumManageBatchErrorLog'; |
| | | |
| | | if (logStr.length() > 60000) { |
| | | logStr = logStr.substring(0, 60000); |
| | | } |
| | | IfLog.Log__c = logStr; |
| | | IfLog.Log__c += '\n end'; |
| | | if (errorStr.length() > 60000) { |
| | | IfLog.ErrorLog__c = errorStr.substring(0, 60000); |
| | | } else { |
| | | IfLog.ErrorLog__c = errorStr.substring(0, errorStr.length()); |
| | | } |
| | | |
| | | insert IfLog; |
| | | |
| | | emailMessages.add('失败日志ID为:' + IfLog.Id + '\r\n失败信息:\r\n'+errorStr); |
| | | |
| | | //发送邮件 |
| | | sendFieldEmail(); |
| | | } |
| | | // 发送提醒邮件 |
| | | private void sendFieldEmail() { |
| | | PretechBatchEmailUtil be = new PretechBatchEmailUtil(); |
| | | String[] toList = new String[] {UserInfo.getUserEmail()}; |
| | | String title = '进口单证数据关联更新失败'; |
| | | String[] ccList = new String[]{}; |
| | | String ccEmail = System.Label.EmailAlert; |
| | | if(ccEmail.length() > 0){ |
| | | for(String email : ccEmail.split(',')){ |
| | | ccList.add(email); |
| | | } |
| | | } |
| | | if (System.Test.isRunningTest()) { |
| | | be.successMail('', 1); |
| | | } |
| | | if (emailMessages.size() > 0 && failedCount > 0) { |
| | | be.failedMail(toList, ccList, title, this.emailMessages.get(0)+'\n', |
| | | totalCount, totalCount - failedCount, failedCount,'',false); |
| | | if(!Test.isRunningTest()){ |
| | | be.send(); |
| | | } |
| | | } |
| | | } |
| | | } |