global without sharing class Batch_FixAttachmentToFilesBP implements Database.Batchable<sObject>{
|
// Id batchJobId = Database.executeBatch(new Batch_FixAttachmentToFilesBP('Consumable_order__c',Datetime.newInstance(2023, 1, 1, 8, 0, 0),Datetime.newInstance(2024, 1, 1, 8, 0, 0)),2000);
|
private Datetime creStartDate = null;
|
private Datetime creEndDate = null;
|
private String objectApiName = null;
|
private String whereS = null; // 20231110 ljh add
|
private Set<String> parentIds = new Set<String>();//Add by Li Jun 20230703
|
public Batch_FixAttachmentToFilesBP(String objectType, Datetime startTime, Datetime endTime) {
|
creStartDate = startTime;
|
creEndDate = endTime;
|
objectApiName = objectType;
|
}
|
// 20231110 ljh add start
|
public Batch_FixAttachmentToFilesBP(String objectType,Datetime startTime, Datetime endTime,String myWhere) {
|
objectApiName = objectType;
|
creStartDate = startTime;
|
creEndDate = endTime;
|
whereS = myWhere;
|
}
|
// 20231110 ljh add end
|
//Add by Li Jun 20230703 Start
|
public Batch_FixAttachmentToFilesBP(Set<String> parentIds) {
|
this.parentIds = parentIds;
|
}
|
//Add by Li Jun 20230703 End
|
global Database.QueryLocator start(Database.BatchableContext BC) {
|
String query ='select id,QrId__c,BRId__c FROM ';
|
query += objectApiName;
|
query +=' WHERE CreatedDate >=:creStartDate AND CreatedDate <:creEndDate ';
|
if(String.isNotBlank(whereS)){
|
query += whereS;
|
}
|
query += ' Order by CreatedDate desc';
|
// System.debug('zheli:'+query);
|
return Database.getQueryLocator(query);
|
}
|
|
global void execute(Database.BatchableContext BC, list<Sobject> scope) {
|
Set<Id> SetId = new Set<Id>();
|
for(Sobject sc:scope){
|
SetId.add(sc.id);
|
}
|
// System.debug('zheli:'+SetId);
|
// String queryObject ='SELECT Id, Name, OwnerId, ParentId, Parent.Name, Parent.Type, Body, CreatedDate, CreatedById FROM Attachment WHERE Parent.Type =:objectApiName AND CreatedDate >=:creStartDate AND CreatedDate <:creEndDate ';
|
// queryObject += 'AND ParentId IN :SetId';
|
String queryObject ='SELECT Id, Name, OwnerId, ParentId, Parent.Name, Parent.Type, Body, CreatedDate, CreatedById FROM Attachment WHERE Parent.Type =:objectApiName ';
|
queryObject += ' AND ParentId IN :SetId';
|
queryObject += ' AND (Name like \'QRCode%\' or Name like \'BRCode%\')';
|
queryObject += ' Order by CreatedDate ASC';
|
// System.debug('zheli:'+SetId+objectApiName);
|
List<Attachment> AttachmentList = Database.query(queryObject);
|
// System.debug('zheli00:'+AttachmentList);
|
List<ContentVersion> insertContents = new List<ContentVersion>();
|
Map<string,id> nameParentMaps = new Map<string,id>();
|
Set<String> attachmentIds = new Set<String>();
|
for (Attachment att : AttachmentList) {
|
nameParentMaps.put(att.Id, att.ParentId);
|
attachmentIds.add(att.Id);
|
ContentVersion cVersion = new ContentVersion();
|
cVersion.ContentLocation = 'S'; //S-Document is in Salesforce. E-Document is outside of Salesforce. L-Document is on a Social Netork.
|
cVersion.PathOnClient = att.Id; //File name with extention
|
cVersion.Origin = 'C'; //C-Content Origin. H-Chatter Origin.
|
cVersion.Title = att.Name; //Name of the file
|
cVersion.VersionData = att.Body; //File content
|
// cVersion.ownerid = att.OwnerId;
|
insertContents.add(cVersion);
|
}
|
// System.debug('zheli03:'+insertContents.size());
|
if(insertContents.isEmpty()){
|
return;
|
}
|
//Insert insertContents;
|
List<Database.SaveResult> saveResultsContents = Database.insert(insertContents, false);
|
insertLog(saveResultsContents,attachmentIds);
|
set<Id> contentIds = new set<Id>();
|
for(ContentVersion cv : insertContents){
|
contentIds.add(cv.id);
|
}
|
List<ContentVersion> conDocuments = [SELECT ContentDocumentId, Title,PathOnClient FROM ContentVersion WHERE Id in: contentIds];
|
List<ContentDocumentLink> insertDocLinks = new List<ContentDocumentLink>();
|
for(ContentVersion cv : conDocuments){
|
ContentDocumentLink cDocLink = new ContentDocumentLink();
|
cDocLink.ContentDocumentId = cv.ContentDocumentId; //Add ContentDocumentId
|
cDocLink.LinkedEntityId = nameParentMaps.get(cv.PathOnClient); //Add attachment parentId
|
cDocLink.ShareType = 'V'; //V - Viewer permission. C - Collaborator permission. I - Inferred permission.
|
cDocLink.Visibility = 'AllUsers';
|
insertDocLinks.add(cDocLink);
|
}
|
//Insert insertDocLinks;
|
List<Database.SaveResult> saveResultsLinks = Database.insert(insertDocLinks, false);
|
insertLog(saveResultsLinks,attachmentIds);
|
}
|
|
global void insertLog(List<Database.SaveResult> saveResults,Set<String> attachmentIds) {
|
Transaction_Log__c traLog = new Transaction_Log__c();
|
List<Map<String,String>> logMapList = new List<Map<String,String>>();
|
for (Database.SaveResult result : saveResults) {
|
String recordId = result.getId();
|
if (!result.isSuccess()) {
|
for (Database.Error error : result.getErrors()) {
|
Map<String,String> logMap = new Map<String,String>();
|
String errorMsg = error.getMessage();
|
logMap.put('recordId',recordId);
|
logMap.put('errorMsg',errorMsg);
|
logMapList.add(logMap);
|
}
|
}
|
}
|
if(logMapList.size() > 0){
|
Map<String,String> attachmentIdMap = new Map<String,String>();
|
attachmentIdMap.put('attachmentIds',JSON.serialize(attachmentIds));
|
logMapList.add(attachmentIdMap);
|
traLog.Response__c = JSON.serialize(logMapList);
|
traLog.Module__c = 'Attachment COnvert Transaction ';
|
Insert traLog;
|
}
|
}
|
global void finish(Database.BatchableContext BC) {
|
|
}
|
}
|