/**
 * 前提、当日の 0時移行バッチを実行
 */
global class UpdateAssetToCurrentMCBatch implements Database.Batchable<sObject>{

    global final String query;
    global String targetAssetId;
    global Asset lastAsset;
    
     /**
     * コンスタント
     */
    
    global UpdateAssetToCurrentMCBatch() {}
      
     /**
     * コンスタント
     */
    
    global UpdateAssetToCurrentMCBatch(String targetAssetId) {
         this.targetAssetId = targetAssetId;
    }
 
    global Database.Querylocator start(Database.BatchableContext BC) {
        system.debug('start方法开始执行');
        // 找出截止日期为当前日期前一天或者开始日期为当前日期的维修合同
        // 返回保有设备的有效有否标志和当前合同
        Date TDAY = Date.today();
//        Date YESDAY = Date.today().addDays(-10);
        
        if (String.isBlank(this.targetAssetId)){
            
            return Database.getQuerylocator(
            [select Id, Asset__c, Maintenance_Contract__c,
                    Estimate_List_Price_All__c,
                    Maintenance_Contract__r.Status__c,
                    Maintenance_Contract__r.Name,
                    Maintenance_Contract__r.Contract_End_Date__c,
                    Maintenance_Contract__r.Contract_Start_Date__c,
                    Asset__r.Service_Agreement__c, Asset__r.CurrentContract__c,
                    Asset__r.CurrentContract_Start_Date__c, Asset__r.CurrentContract_End_Date__c,
                    Asset__r.The_last_update_date__c,
                    // 20191021 HWAG-BGB5SE Gzw 追加 新合同备品保证提供
                    // EquipmentGuaranteeFlgTxt__c,
                    EquipmentGuaranteeFlgE__c,
                    Maintenance_Contract__r.RecordType_DeveloperName__c
               from Maintenance_Contract_Asset__c
//              where ((Maintenance_Contract__r.Contract_End_Date__c >=: YESDAY
//                        and Maintenance_Contract__r.Contract_Start_Date__c <=: TDAY
//                     )
//                    or (Asset__r.CurrentContract_End_Date__c >=: YESDAY
//                        and Asset__r.CurrentContract_Start_Date__c <=: TDAY
//                    )
//                )
              where (Maintenance_Contract__r.Contract_Start_Date__c <=: TDAY
                    or Asset__r.CurrentContract_Start_Date__c <=: TDAY
                )
              // gzw 20230201 batch优化
              and Maintenance_Contract__r.Status__c = '契約'

              order by Maintenance_Contract__r.Effective__c, Maintenance_Contract__r.Service_Number_Auto__c desc
            ]
            );
        } else {
            return Database.getQuerylocator(
            [select Id, Asset__c, Maintenance_Contract__c,
                    Estimate_List_Price_All__c,
                    Maintenance_Contract__r.Status__c,
                    Maintenance_Contract__r.Name,
                    Maintenance_Contract__r.Contract_End_Date__c,
                    Maintenance_Contract__r.Contract_Start_Date__c,
                    Asset__r.Service_Agreement__c, Asset__r.CurrentContract__c,
                    Asset__r.CurrentContract_Start_Date__c, Asset__r.CurrentContract_End_Date__c,
                    Asset__r.The_last_update_date__c,
                    // 20191021 HWAG-BGB5SE Gzw 追加 新合同备品保证提供
                    //EquipmentGuaranteeFlgTxt__c,
                    EquipmentGuaranteeFlgE__c,
                    Maintenance_Contract__r.RecordType_DeveloperName__c
               from Maintenance_Contract_Asset__c
             where Asset__c = :this.targetAssetId

             and (Maintenance_Contract__r.Contract_Start_Date__c <=: TDAY
                    or Asset__r.CurrentContract_Start_Date__c <=: TDAY
                )
            // gzw 20230201 batch优化
            and Maintenance_Contract__r.Status__c = '契約'
              order by Maintenance_Contract__r.Effective__c, Maintenance_Contract__r.Service_Number_Auto__c desc
             ]);
        }
    }

    global void execute(Database.BatchableContext BC, List<Maintenance_Contract_Asset__c> scope) {
        try {
            Date TDAY = Date.today();
            Map<Id, Asset> uptAssets = new Map<Id, Asset>();
            // gzw 20230201 batch优化
            Map<Id, Asset> uptAssetsMap = new Map<Id, Asset>();


            if(null != lastAsset) {
                uptAssets.put(lastAsset.Id, lastAsset);
            }
         

            for(Maintenance_Contract_Asset__c mca : scope) {
                if (uptAssets.containsKey(mca.Asset__c) == false) {
                    // 対象を初期化
                    Asset a = new Asset(id = mca.Asset__c);
                    a.Service_Agreement__c = '無';
                    uptAssets.put(mca.Asset__c, a);
                    //lastAsset = a;
                }
            }
            
            List<Asset> alist = [ select id,Service_Agreement__c,CurrentContract__c,
                                             CurrentContract_Start_Date__c,CurrentContract_End_Date__c,
                                             The_last_update_date__c
                                             from Asset
                                             where id in: uptAssets.keySet()];

            for(Asset ase : alist){  
                system.debug('更新时间'+ase.The_last_update_date__c);
                if(ase.Service_Agreement__c =='有' && ase.The_last_update_date__c == Date.today()){
                    uptAssets.remove(ase.id);
                }
            }

          
 

            for (Maintenance_Contract_Asset__c mca : scope) {
                system.debug('状态：'+mca.Maintenance_Contract__r.Status__c);
                // AssetのService_Agreement__c を有に更新
                if ((mca.Maintenance_Contract__r.Status__c == '契約'
                        && mca.Maintenance_Contract__r.Contract_Start_Date__c <= TDAY
                        && mca.Maintenance_Contract__r.Contract_End_Date__c > TDAY
                )) {
                    Asset a = uptAssets.get(mca.Asset__c);
                   // system.debug(mca.Maintenance_Contract__r.Contract_Start_Date__c+'++++++++++++++++++++++++++++++++++++++'+a.CurrentContract_Start_Date__c);
                    if (a != null && (a.CurrentContract__c == null 
                            || mca.Maintenance_Contract__r.Contract_Start_Date__c > a.CurrentContract_Start_Date__c)){
                        a.Service_Agreement__c = '有';
                        a.The_last_update_date__c = TDAY;
                        a.CurrentContract__c = mca.Maintenance_Contract__c;
                        a.CurrentContract_Start_Date__c = mca.Maintenance_Contract__r.Contract_Start_Date__c;
                        a.CurrentContract_End_Date__c = mca.Maintenance_Contract__r.Contract_End_Date__c;
                        // LHJ 新维修合同 Start
                        a.CurrentContract_Asset_Price__c = mca.Estimate_List_Price_All__c;
                        // LHJ 新维修合同 End
                        // 20191021 HWAG-BGB5SE Gzw 追加 新合同备品保证提供 服务合同
                        if (mca.Maintenance_Contract__r.RecordType_DeveloperName__c == 'NewMaintenance_Contract') {
                            //a.EGFlg_fromContract_asset__c = mca.EquipmentGuaranteeFlgTxt__c;
                            a.EGFlg_fromContract_asset__c = mca.EquipmentGuaranteeFlgE__c;
                            a.CurrentContract_asset__c    = mca.Id;
                        }
                        // gzw 20230201 batch优化
                        uptAssetsMap.put(a.Id, a);
                        system.debug('有无维修合同：'+a.Service_Agreement__c);
                    } else {
                        // 初期化があるので、ここはロジックなし
                    }
                 
                }
            }
            
            /*for(Maintenance_Contract_Asset__c mca : scope) {
                Asset a = uptAssets.get(mca.Asset__c);
                system.debug('a的值为：'+a);
                if (a != null
                        && a.Service_Agreement__c == mca.Asset__r.Service_Agreement__c
                        && a.CurrentContract__c == mca.Asset__r.CurrentContract__c
                        && a.CurrentContract_Start_Date__c == mca.Asset__r.CurrentContract_Start_Date__c
                        && a.CurrentContract_End_Date__c == mca.Asset__r.CurrentContract_End_Date__c
                ) {
                    // 変化なしのAsset、uptAssetsから削除
                    
                    uptAssets.remove(mca.Asset__c);
                }
            }*/
             
                
              
            //  for(Asset ase : alist) {
            //    Asset a = uptAssets.get(ase.id);
            //    if (a != null
            //            && a.Service_Agreement__c == ase.Service_Agreement__c
            //            && a.CurrentContract__c == ase.CurrentContract__c
            //            && a.CurrentContract_Start_Date__c == ase.CurrentContract_Start_Date__c
            //            && a.CurrentContract_End_Date__c == ase.CurrentContract_End_Date__c

            //    ) {
            //        // 変化なしのAsset、uptAssetsから削除
                    
            //        uptAssets.remove(ase.id);
            //    }

            //}
            
            system.debug('最终数据'+uptAssets.values());
            if(uptAssetsMap.values() != null){
                update uptAssetsMap.values();
            }
            

    //        Database.SaveResult[] lsr = Database.update(uptAssets.values(), false);
    //        String errorMsg = '';
    //        for (Integer sIdx = 0; sIdx < lsr.size(); sIdx++) {
    //            Database.SaveResult sr = lsr[sIdx];
    //            if (!sr.isSuccess()) {
    //                Database.Error emsg = sr.getErrors()[0];
    //                errorMsg += emsg + '\n';
    //            }
    //        }
    //        if (String.isBlank(errorMsg) == false) {
    //            BatchIF_Log__c iflog = new BatchIF_Log__c();
    //            iflog.Type__c = 'PushNotification';
    //            iflog.ErrorLog__c  = 'errorMsg';
    //            if (iflog.ErrorLog__c.length() > 32768) {
    //                iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...';
    //            }
    //            insert iflog;
    //        }
        } catch (Exception ex) {
            BatchIF_Log__c iflog = new BatchIF_Log__c();
            iflog.Type__c = 'PushNotification';
            iflog.Log__c = ex.getMessage() + '\n';
            iflog.ErrorLog__c = ex.getStackTraceString();
            insert iflog;
        }
    }
    
    
    global void finish(Database.BatchableContext BC){
        //Date tod = Date.today();
        //Asset ass = new Asset();
        //List<Asset> assList = new List<Asset>();
        //if(targetAssetId != null){
        //    ass = [select id,The_last_update_date__c from Asset where id = :targetAssetId];
        //    ass.The_last_update_date__c = null;
        //}
        //}else{
        //    assList = [select id,The_last_update_date__c from Asset where CurrentContract_Start_Date__c <=: tod];
        //    for(Asset aet : assList){
        //        aet.The_last_update_date__c = null;
        //    }
        //}
        //update ass;
        //update assList;

    }

    public  void testmock(){
        integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}