高章伟
2023-03-03 d8dc84a3d56df839895f1c417a4d9cbee763d262
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/**
 * 2022-06-15 sx 询价跟进任务
 */
 
global class TenderResultConfirmTaskBatch implements Database.Batchable<sObject> {
    
    Integer opporTotal = 0;
    Integer taskTotal = 0;
    
    BatchIF_Log__c log = new BatchIF_Log__c();
    
    public TenderResultConfirmTaskBatch() {
    }
    //20220715 you 招标任务 start
    List<String> TenderIds = new List<String>();
    global TenderResultConfirmTaskBatch(List<String> tenIds){
        this.TenderIds = tenIds;
    }
    //20220715 you 招标任务 end
    global Database.QueryLocator start(Database.BatchableContext bc){
        String query = 'Select Id, Opportunity__c, Tender_information__c, '
                     + 'Tender_information__r.status__c, Tender_information__r.TenderManageCode__c,Tender_information__r.RecordTypeId, Tender_information__r.CreatedDate,'
                     + 'Opportunity__r.OwnerId, Opportunity__r.AccountId, Opportunity__r.StageName__c, '
                     + 'Opportunity__r.Assistant_Applied_Date__c, Opportunity__r.Cnt_Lost_cancel_Draft__c, Opportunity__r.Cnt_Lost_cancel_report__c, Opportunity__r.DirectLossFLG__c, Opportunity__r.ConfirmationofAward__c, '
                     + 'Opportunity__r.Contract_DB_complite_day__c, Opportunity__r.Contract_Authorize_Lock__c, Opportunity__r.LeakageNumber__c, '
                     + 'Opportunity__r.ConfirmationofAward_createTime__c ' 
                     + 'FROM Tender_Opportunity_Link__c '
                     + 'WHERE Tender_information__r.InfoType__c = \'3:结果\' ' 
                     + 'AND (Tender_information__r.subInfoType__c = \'3-5:中标通知\' OR Tender_information__r.subInfoType__c = \'3-6:合同公告\') ';
                     //+ 'AND Tender_information__r.RecordTypeId = \'01210000000VLUI\' ';
                     
        //20220715 you 招标任务 start
        if(TenderIds !=null && TenderIds.size() > 0){
              query += 'AND Opportunity__c in :TenderIds';
            //query += 'AND Tender_information__c in :TenderIds ';
        }else{
             query += 'AND Tender_information__r.LastModifiedDate = LAST_N_DAYS:2';
        }
        query += ' ORDER BY Opportunity__c, Tender_information__r.CreatedDate';
        //20220715 you 招标任务 end
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Tender_Opportunity_Link__c> toppLinkList){
        log.Type__c='TenderResultConfirm_Task';
        String logstr = 'Batch execute start' + '\r\n 查询结果 :' + toppLinkList;
 
        Set<Id> oppIds = new Set<Id>();
        for (Tender_Opportunity_Link__c tol : toppLinkList) {
            oppIds.add(tol.Opportunity__c);
        }
        
        //20220718  筛选一下有无任务的询价,取消也需要新建
        List<Task__c> taskList = [
                SELECT Id,OpportunityId__c,taskStatus__c 
                FROM task__c 
                WHERE OpportunityId__c in :oppIds 
                AND (RecordType.Name = '中标结果确认' OR RecordType.Name = '失单报告任务')
                AND (taskStatus__c = '02 接受' OR taskStatus__c = '03 完成')];
        system.debug('test1-----'+taskList);
        Map<String,Task__c> mapTask = new Map<String,Task__c>();
        for(Task__c t: taskList){
            mapTask.put(t.OpportunityId__c, t);
        }
 
        // 记录类型:中标结果确认
        Id winBiddingTask_TaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('winBiddingTask').getRecordTypeId();
        
        Map<Id, Opportunity> oppMap = new Map<Id, Opportunity>();
        Map<Id, Task__c> taskMap = new Map<Id, Task__c>();
 
        for(Tender_Opportunity_Link__c topp : toppLinkList){
            system.debug('test3'+topp.Opportunity__c);
            logstr += 'Batch execute ' + '\r\n 询价进入for----- :'+ topp;
            // 已存在有效状态任务的询价,不用再次产生任务
            if ((mapTask.isEmpty() 
                || (!mapTask.isEmpty() && !mapTask.containsKey(topp.Opportunity__c))) && !(topp.Opportunity__r.DirectLossFLG__c || topp.Opportunity__r.StageName__c == '失单' || topp.Opportunity__r.Cnt_Lost_cancel_report__c > 0) && !(topp.Opportunity__r.Contract_DB_complite_day__c != null && topp.Opportunity__r.Contract_Authorize_Lock__c)){
 
                //1.内部确认状态为05.询价中且关联询价的状态1为询价 且 价格申请 不等于 真 -- > 创建并派发任务
                if (topp.Tender_information__r.status__c == '05.询价中' && topp.Opportunity__r.StageName__c == '询价' && topp.Opportunity__r.Assistant_Applied_Date__c == null && !topp.Opportunity__r.DirectLossFLG__c){
                    logstr += 'Batch execute ' + '\r\n 询价进入第一个判断条件----- :'+ topp.Opportunity__c ;
                    Task__c tempTask = new Task__c();
                    tempTask.RecordTypeId = winBiddingTask_TaskId;
                    tempTask.taskDifferent__c = '被动任务';
                    tempTask.taskStatus__c = '02 接受';       //任务状态2
                    tempTask.assignee__c = topp.Opportunity__r.OwnerId;    //被分配者
                    tempTask.account__c = topp.Opportunity__r.AccountId;
                    tempTask.Name = '中标结果确认:' + topp.Tender_information__r.TenderManageCode__c;  //招标项目.SFDC编码
                    tempTask.OwnerId = topp.Opportunity__r.OwnerId;   //所有人
                    tempTask.OpportunityId__c = topp.Opportunity__c;
                    tempTask.Tender_information_Task__c = topp.Tender_information__c;       //招标项目
                    tempTask.ConfirmDate__c = Date.today();
                    
                    if (taskMap.isEmpty() || !taskMap.containsKey(topp.Opportunity__c)) {
                       taskMap.put(topp.Opportunity__c, tempTask);                 
                    }
                    
                    //更新询价  Task_createTime__c  
                    if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
                        Opportunity tempOpp  = new Opportunity();
                        tempOpp.Id = topp.Opportunity__c;
                        tempOpp.Task_createTime__c = Date.today();
                        oppMap.put(topp.Opportunity__c, tempOpp);
                    }
                }
            }
 
            //2. 存在已提交的失单报告或者询价状态1=失单 -- >中标确认:竞争对手中标
            // 招标项目中的中标确认更改在Batch中更新
            if (topp.Opportunity__r.DirectLossFLG__c  || topp.Opportunity__r.StageName__c == '失单'){
                logstr += 'Batch execute ' + '\r\n 询价进入第二个判断条件----- :'+ topp.Opportunity__c ;
                //中标确认字段赋值竞争对手中标
                if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
                    Opportunity tempOpp  = new Opportunity();
                    tempOpp.Id = topp.Opportunity__c;
                    tempOpp.ConfirmationofAward__c = '竞争对手中标';
                    oppMap.put(topp.Opportunity__c, tempOpp);
                }
            }
 
            //3.已完成合同申请 --> 中标确认:OLY中标
            // 招标项目中的中标确认更改在Batch中更新
            if (topp.Opportunity__r.Contract_DB_complite_day__c != null && topp.Opportunity__r.Contract_Authorize_Lock__c){
                logstr += 'Batch execute ' + '\r\n 询价进入第三个判断条件----- :'+ topp.Opportunity__c ;
                //中标确认字段赋值竞争对手中标
                if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
                    Opportunity tempOpp  = new Opportunity();
                    tempOpp.Id = topp.Opportunity__c;
                    tempOpp.ConfirmationofAward__c = 'OLY中标';
                    oppMap.put(topp.Opportunity__c, tempOpp);
                }
            }
        }
 
        try {
            if (!taskMap.isEmpty()) {
                insert taskMap.values();
                logstr += 'Batch execute ' + '\r\n 任务数据 :'+ taskMap.size() + taskMap.values() ;
            }
 
            if (!oppMap.isEmpty()) {
                update oppMap.values();
                logstr += 'Batch execute ' + '\r\n 询价数据 :'+ oppMap.size() + oppMap.values() ;
            }
           
            
            logstr += '\nend';
        } catch(Exception ex) {
            //发生错误的情况
            System.debug(Logginglevel.ERROR, 'NFM112_' + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'NFM112_' + ':' + ex.getStackTraceString());
            logstr += ex.getMessage();
            log.ErrorLog__c += ex.getMessage() + '\n';
            log.ErrorLog__c += ex.getStackTraceString() + '\n';
        }
 
        log.Log__c = logstr;
        insert log;
    }
 
    global void finish(Database.BatchableContext BC) {
        system.debug('opporTotal======'+opporTotal);
        system.debug('taskTotal======'+taskTotal);        
    }
}