global class UpdateTenderInformationBatch2 implements Database.Batchable<sObject>, Database.Stateful{
    //历史数据处理时设置成false
    Boolean IsNeedExecute = true;
    //邮件信息
    List<String> emailMessages = new List<String>();

    //招投标: 报错的招投标Id
    String TenderlogStr = '招标项目 : ';

    //招投标: 报错信息
    String TendererrorStr = '';

    //招投标: 总件数
    Integer TendertotalCount = 0;

    //招投标: 失败件数
    Integer TenderfailedCount = 0; 

    //传过来的招标项目id集合
    List<String> TenderIdList2 = new List<String>();

    //从反应询价状态进来的时候设为true
    Boolean IsNeedfalg = false;

    public UpdateTenderInformationBatch2() {
    }
    public UpdateTenderInformationBatch2(Boolean falg) {
        this.IsNeedExecute=falg;
    }
    public UpdateTenderInformationBatch2(List<String> TenderIdList) {
        this.TenderIdList2=TenderIdList;
        this.IsNeedExecute=false;
        this.IsNeedfalg=true;
    }
    global Database.QueryLocator start(Database.BatchableContext bc) {
        Date today = Date.today();
        Date yesterday = Date.today().addDays(-1);
        Datetime firstDatetime=Datetime.newInstance(yesterday.year(),yesterday.month(),yesterday.day(),0,0,0);
        Datetime lasttDatetime=Datetime.newInstance(today.year(),today.month(),today.day(),23,59,59);
        String query = 'select Id,Tender_information__c,Opportunity__c ';
               query += 'FROM Tender_Opportunity_Link__c ';
        if(this.IsNeedExecute){
            query += 'WHERE Opportunity__r.LastModifiedDate >=:firstDatetime and Opportunity__r.LastModifiedDate <=:lasttDatetime';
        }
        if(this.IsNeedfalg){
            query += 'WHERE Tender_information__c =:TenderIdList2';
        }
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, list<Tender_Opportunity_Link__c> TenderList) {
        Set<Id> enderOpportunityId = new Set<Id>();
        if(TenderList.size()>0){
            for (Tender_Opportunity_Link__c TenderOpportunity : TenderList) {
                enderOpportunityId.add(TenderOpportunity.Tender_information__c);
            }
        }
        system.debug('TenderList+++'+TenderList);
        //20240223 lt DB202402167647 【重要优先】定时刷新任务：询价/招标页面主机统计字段 add
        //lt add sql ,Opportunity__r.ConfirmationofAward__c,Opportunity__r.RivalHostsNumber__c,Opportunity__r.OlyNumberHosts__c,Opportunity__r.InquireNumberHosts__c
        List<Tender_Opportunity_Link__c> TenderOpportunityLinkList2 = [select Id,Tender_information__c,Opportunity__r.NumberOfBids__c,Opportunity__r.BidWinningNumber__c,Opportunity__r.Tender_Number_Flag__c,Opportunity__r.ConfirmationofAward__c,Opportunity__r.RivalHostsNumber__c,Opportunity__r.OlyNumberHosts__c,Opportunity__r.InquireNumberHosts__c from Tender_Opportunity_Link__c where Tender_information__c in:enderOpportunityId];
        Map<String,Tender_information__c> TenderinformationMap = new Map<String,Tender_information__c>();
        system.debug('TenderOpportunityLinkList2+++'+TenderOpportunityLinkList2);
        if(TenderOpportunityLinkList2.size()>0){
            for(Tender_Opportunity_Link__c TenderOpportunity2 :TenderOpportunityLinkList2){
                    if(TenderinformationMap.containsKey(TenderOpportunity2.Tender_information__c)){
                        Tender_information__c Tender_informationvalue = new Tender_information__c();
                        Tender_informationvalue = TenderinformationMap.get(TenderOpportunity2.Tender_information__c);
                        if(TenderOpportunity2.Opportunity__r.NumberOfBids__c==1&&Tender_informationvalue.NumberOfBids__c==0){
                            Tender_informationvalue.NumberOfBids__c=1;
                        }
                        if(Tender_informationvalue.BidWinningNumber__c==1&&TenderOpportunity2.Opportunity__r.BidWinningNumber__c==0){
                            Tender_informationvalue.BidWinningNumber__c=1;
                        }
                        if(TenderOpportunity2.Opportunity__r.Tender_Number_Flag__c==1&&Tender_informationvalue.Tender_Number__c==0){
                            Tender_informationvalue.Tender_Number__c=1;
                        }
                        //20240223 lt DB202402167647 【重要优先】定时刷新任务：询价/招标页面主机统计字段 start
                        // if(!String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.InquireNumberHosts__c))){
                        //     Tender_informationvalue.TotalNumberHosts__c += TenderOpportunity2.Opportunity__r.InquireNumberHosts__c;  //询价主机台数
                        // }
                        // if(!String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.OlyNumberHosts__c))){
                        //     Tender_informationvalue.OlyNumberHosts__c += TenderOpportunity2.Opportunity__r.OlyNumberHosts__c;  //询价主机台数
                        // }
                        // if(!String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.RivalHostsNumber__c))){
                        //     Tender_informationvalue.RivalHostsNumber__c += TenderOpportunity2.Opportunity__r.RivalHostsNumber__c;  //询价主机台数
                        // }
                        //20240223 lt DB202402167647 【重要优先】定时刷新任务：询价/招标页面主机统计字段 end
                        TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
                    }else{
                        Tender_information__c Tender_informationvalue = new Tender_information__c();
                        Tender_informationvalue.Id=TenderOpportunity2.Tender_information__c;
                        Tender_informationvalue.NumberOfBids__c=TenderOpportunity2.Opportunity__r.NumberOfBids__c;
                        Tender_informationvalue.BidWinningNumber__c=TenderOpportunity2.Opportunity__r.BidWinningNumber__c;
                        Tender_informationvalue.Tender_Number__c=TenderOpportunity2.Opportunity__r.Tender_Number_Flag__c;
                        //20240223 lt DB202402167647 【重要优先】定时刷新任务：询价/招标页面主机统计字段 start
                        // Tender_informationvalue.TotalNumberHosts__c = String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.InquireNumberHosts__c)) ? 0 : TenderOpportunity2.Opportunity__r.InquireNumberHosts__c;  //询价主机台数
                        // Tender_informationvalue.OlyNumberHosts__c = String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.OlyNumberHosts__c)) ? 0 : TenderOpportunity2.Opportunity__r.OlyNumberHosts__c;        //oly主机台数
                        // Tender_informationvalue.RivalHostsNumber__c = String.isBlank(String.ValueOf(TenderOpportunity2.Opportunity__r.RivalHostsNumber__c)) ? 0 : TenderOpportunity2.Opportunity__r.RivalHostsNumber__c;    //对手主机台数
                        //20240223 lt DB202402167647 【重要优先】定时刷新任务：询价/招标页面主机统计字段 end
                        TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
                    }
            }
        }
        List<Tender_information__c> Tender_informationList = new List<Tender_information__c>();
        for (Tender_information__c value : TenderinformationMap.values()) {
            Tender_informationList.add(value);
        }
        system.debug('Tender_informationList+++'+Tender_informationList);
        if(Tender_informationList.size()>0){
            //一个招投标项目更新失败
            List<String> failedTenderList = new List<String>();
            Database.SaveResult[] saveTenderResults = Database.update(Tender_informationList,false);
            //招投标项目的总数
            TendertotalCount += saveTenderResults.size();

            for(Integer i = 0;i<saveTenderResults.size();i++) {
                if(!saveTenderResults.get(i).isSuccess() ){                   
                    TenderlogStr += Tender_informationList.get(i).id +' ,';
                    TendererrorStr += '失败招标项目 :'+Tender_informationList.get(i).id+'  失败原因:'+ String.ValueOf(saveTenderResults.get(i).getErrors()[0]).split(';')[2].split('=')[1] 
                    +' : '+String.ValueOf(saveTenderResults.get(i).getErrors()[0]).split(';')[1].split('=')[1] + '\r\n';
                    TenderfailedCount++ ;
                }
            }
        }

    }
    global void finish(Database.BatchableContext BC) {
        BatchIF_Log__c TenderIfLog = new BatchIF_Log__c();
        TenderIfLog.Type__c = 'UpdateTenderInformationBatch2ByTenderErrorLog';

        if (TenderlogStr.length() > 60000) {
            TenderlogStr = TenderlogStr.substring(0, 60000);
        }
        TenderIfLog.Log__c = TenderlogStr;
        TenderIfLog.Log__c += '\n end';
        if (TendererrorStr.length() > 60000) {
            TenderIfLog.ErrorLog__c = TendererrorStr.substring(0, 60000);
        } else {
            TenderIfLog.ErrorLog__c = TendererrorStr.substring(0, TendererrorStr.length());
        }

        insert TenderIfLog;

        emailMessages.add('失败日志ID为：' + TenderIfLog.Id + '\r\n失败信息:\r\n'+TendererrorStr);

        //发送邮件
        sendFieldEmail();
    }
    // 发送提醒邮件
    private void sendFieldEmail() {
        PretechBatchEmailUtil be = new PretechBatchEmailUtil();
        String[] toList = new String[] {UserInfo.getUserEmail()};
        String title = '招标项目招标数，中标数或者应标数更新失败';
        String[] ccList = new String[] {'fuyu@prec-tech.com'};
        if (System.Test.isRunningTest()) {
            be.successMail('', 1);
        }
        if (emailMessages.size() > 0 && TenderfailedCount > 0) {
            be.failedMail(toList, ccList, title, this.emailMessages.get(0)+'\n',
                            TendertotalCount, TendertotalCount - TenderfailedCount, TenderfailedCount,'',true);
            if(!Test.isRunningTest()){
                be.send();
            }
        }       
    }
}