111
沙世明
2022-11-22 928399eceec50e3d37ea08669a12789a9410a9d2
force-app/main/default/classes/AssetWhereabouts.cls
@@ -1,64 +1,114 @@
global class AssetWhereabouts implements Database.Batchable<sObject>,Database.Stateful {
    public String query;
    public BatchIF_Log__c iflog ;
    public Date toDay = Date.today().addYears(-1);
    public Date toDay = Date.today();
    public List < String > assetIdList;
    global AssetWhereabouts() {
        this.query = query;
    }
    global AssetWhereabouts(List < String > assetIdList) {
        this.query = query;
        this.assetIdList = assetIdList;
    }
    global Database.QueryLocator start(Database.BatchableContext bc) {
        iflog  = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'AssetWhereabouts start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        query = 'select id,Asset__c,Maintenance_Contract__c,Asset__r.CurrentContract__r.RecordType_Name__c,Asset__r.CurrentContract__r.Status__c'
                +' from Maintenance_Contract_Asset__c where Asset__r.AssetWhereabouts__c = null ';
        query = 'select id,Asset__r.AssetWhereabouts__c,Maintenance_Contract__r.status__c ,Asset__r.id,Maintenance_Contract__r.id,endDateGurantee_Text__c  '
                +' from Maintenance_Contract_Asset__c where Maintenance_Contract__r.RecordType_Name__c =\'多年保修合同\' and endDateGurantee_Text__c < :toDay and Asset__r.AssetWhereabouts__c!=\'服务合同\'';
        if (assetIdList != null && assetIdList.size() > 0) {
            query += ' and Asset__c in :assetIdList ';
        }
        query += '  order by CreatedDate ';
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, list<Maintenance_Contract_Asset__c> mcaList) {
        List<Asset> Asslist = new List<Asset>();
        List<String> mcList = new List<String>();
        List<Repair__c> reList  = [select id,Maintenance_Contract__c,Status1__c,DateReceiptQuestions__c
                                    from Repair__c
                                    where DateReceiptQuestions__c >= :toDay and Status1__c != '0.取消' and Status1__c != '0.删除' and Maintenance_Contract__c != null];
        System.debug('reList=='+reList);
        for (Repair__c re: reList) {
            mcList.add(re.Maintenance_Contract__c);
        Map<String,Asset> assMap = new Map<String,Asset>();
        // 用作查询合同中的服务合同
        Set<String> assSet = new Set<String>();
        Set<String> fuwuSet = new Set<String>();
        // 用作查询一般维修
        Set<String> weixiuSet = new Set<String>();
        Map<String,Repair__c> mcMap = new Map<String,Repair__c>();
         for (Maintenance_Contract_Asset__c  mca: mcaList) {
            assSet.add(mca.Asset__r.id);
            weixiuSet.add(mca.Asset__r.id);
        }
        System.debug('mcaList=='+mcaList );
        // 查询符合条件的修理
        List<Repair__c> reList  = [select id,Maintenance_Contract__r.id,Status1__c,Failure_Occurrence_Date__c,CreatedDate,Delivered_Product__c
                                    from Repair__c
                                    where Status1__c != '0.取消' and Status1__c != '0.删除' and Status2__c != '00.删除' and Status2__c != '00.取消'
                                   and Maintenance_Contract__c = null  and Delivered_Product__c in :weixiuSet order by CreatedDate ];
        for (Repair__c re: reList) {
             if ( mcMap.get(re.Delivered_Product__c)==null) {
                 mcMap.put(re.Delivered_Product__c,re);
            }
            // 取最近一期的修理记录
            if( mcMap.get(re.Delivered_Product__c)!=null && re.CreatedDate>mcMap.get(re.Delivered_Product__c).CreatedDate){
                mcMap.remove(re.Delivered_Product__c);
                mcMap.put(re.Delivered_Product__c,re);
            }
        }
       // 查询是否有合同中的服务合同
        list<Maintenance_Contract_Asset__c>   mcaList2 = [select Id,Asset__r.id from Maintenance_Contract_Asset__c
                                                          where Maintenance_Contract__r.RecordType_Name__c ='服务合同'
                                                          and Maintenance_Contract__r.status__c ='契約' and Asset__c in :assSet];
        for (Maintenance_Contract_Asset__c mca: mcaList2) {
                fuwuSet.add(mca.Asset__r.id);
        }
        for (Maintenance_Contract_Asset__c  mca: mcaList) {
                Asset ass =  new Asset();
                // System.debug('mca.Maintenance_Contract__r.RecordType_Name__c=='+mca.Maintenance_Contract__r.RecordType_Name__c);
                // System.debug('mca.Maintenance_Contract__r.Status__c=='+mca.Maintenance_Contract__r.Status__c);
            if (mca.Asset__r.CurrentContract__r.RecordType_Name__c == '服务合同' && mca.Asset__r.CurrentContract__r.Status__c == '契約') {
                ass.id = mca.Asset__c;
                Date PassDay = mca.endDateGurantee_Text__c.addyears(1);
                Boolean isXiuli = false;
                // 判断修理是否是未来1年内
                if (mcMap.get(mca.Asset__r.id)!=null &&mcMap.get(mca.Asset__r.id).Failure_Occurrence_Date__c>mca.endDateGurantee_Text__c && mcMap.get(mca.Asset__r.id).Failure_Occurrence_Date__c < PassDay) {
                    isXiuli = true;
                }
                // 去向:服务合同   关联的执行中合同记录为【服务合同】状态为契约
            if (fuwuSet.contains(mca.Asset__r.id)) {
                ass.id = mca.Asset__r.id;
                ass.AssetWhereabouts__c = '服务合同';
                if (!Asslist.contains(ass)) {
                         Asslist.add(ass);
                if (assMap.containsKey(ass.id)&&assMap.get(ass.id).AssetWhereabouts__c =='其他') {
                    assMap.remove(ass.id);
                    assMap.put(ass.id,ass);
                }else{
                    assMap.put(ass.id,ass);
                }
            }
             else if(mca.Asset__r.CurrentContract__r.Status__c != '契約' && mcList.contains(mca.Maintenance_Contract__c)){
            // 去向:一般维修
             else if(mca.Maintenance_Contract__r.status__c  != '契約' && isXiuli){
                    ass.id = mca.Asset__c;
                    ass.AssetWhereabouts__c = '一般维修';
                    if (!Asslist.contains(ass)) {
                         Asslist.add(ass);
                    }
            } else{
                    if (assMap.containsKey(ass.id)&&assMap.get(ass.id).AssetWhereabouts__c =='其他') {
                        assMap.remove(ass.id);
                        assMap.put(ass.id,ass);
                     }else{
                        assMap.put(ass.id,ass);
                     }
            } else {
                // 去向:其他
                    ass.id = mca.Asset__c;
                    ass.AssetWhereabouts__c = '其他';
                    if (!Asslist.contains(ass)) {
                         Asslist.add(ass);
                    if (!assMap.containsKey(ass.id)) {
                        assMap.put(ass.id,ass);
                    }
            }
        } 
        if (Asslist!=null && Asslist.size()!= 0) {
            update Asslist;
        system.debug('更新数据='+assMap.values());
        if (assMap.values()!=null && assMap.values().size()!= 0) {
            update assMap.values();
        }  
    }
    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nAssetWhereabouts end';
        String tmp = iflog.ErrorLog__c;
        integer i=0;
@@ -70,6 +120,19 @@
        }
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        update iflog;
    }
}