高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
/*2021-04-29  mzy  sla报告书任务
   查询当前季度实际发放次数为0的服务合同报告书任务
   当前季度是否有sla主动任务,
   没有的话则在 季度开始日 + 30日  生成被动任务
*/
global class CreateSLAReportTaskBatch implements Database.Batchable<sObject> {
    public String tempMainId;
    //public Date today = Date.newInstance(2021,04,31);
    //public Date today = Date.today();
    Boolean IsNeedExecute = false;
 
    BatchIF_log__c log1 = new BatchIF_Log__c();
 
    public CreateSLAReportTaskBatch() {
    }
    public CreateSLAReportTaskBatch(String tempMainId) {
        this.tempMainId = tempMainId;
    }
    public CreateSLAReportTaskBatch(Boolean NeedExecute) {
        this.IsNeedExecute = NeedExecute;
    }
    public CreateSLAReportTaskBatch(String id ,Boolean NeedExecute){
        this.tempMainId = id;
        this.IsNeedExecute = NeedExecute;
    }
    
    global Database.QueryLocator start(Database.BatchableContext bc) {
        Date today30ago = Date.today().addDays(-30);
        String query = 'SELECT Id ,Distribution_Start_Date__c,Distribution_End_Date__c,NewMaintenance_Contract__c , '
                     + ' NewMaintenance_Contract__r.Service_Contract_Staff__c, NewMaintenance_Contract__r.Department__c , '
                     + ' NewMaintenance_Contract__r.Department__r.Name,NewMaintenance_Contract__r.Service_Contract_Staff__r.IsActive  '
                     + 'FROM NewMaintenanceReport_Task__c  '
                     + 'WHERE Distribution_Start_Date__c = :today30ago AND (ActualDistributionTimes_Quarter__c=0 or ActualDistributionTimes_Quarter__c = null)';
            if (String.isNotBlank(this.tempMainId)) {
               query  += 'AND Id = :tempMainId';
            }
            
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<NewMaintenanceReport_Task__c> NMCReportT) {
 
        log1.Type__c='SLAReport_Task';
        log1.Log__c = 'Batch  execute  start';
        log1.Log__c += '\r\n 查询结果 :'+NMCReportT;
 
        //定义变量 ---- start
        //定义变量保存今天时间
        Date today = Date.today();
        //定义变量保存记录类型
        Id SLAReport_TaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('SLAReport_Task').getRecordTypeId();
        //定义变量保存这一季度合同的Id
        List<String> NMCId = new List<String>();
        //定义变量保存需要更新的报告书
        List<NewMaintenanceReport_Task__c> NeedUpdateReport = new List<NewMaintenanceReport_Task__c>();
        //定义变量保存需要生成的任务
        List<Task__c> NeedInsertTask = new List<Task__c>();        
        //定义Map保存服务合同报告书   k:合同Id v:报告书
        Map<String,NewMaintenanceReport_Task__c> NMCReportMap = new Map<String,NewMaintenanceReport_Task__c>();
        //定义变量 ---- end
        
        for(NewMaintenanceReport_Task__c tempMCT :NMCReportT){
            NMCId.add(tempMCT.NewMaintenance_Contract__c);
            NMCReportMap.put(tempMCT.NewMaintenance_Contract__c , tempMCT);
        }   
 
        //查询这一季度合同的所有任务
        List<Task__c> taskList = [SELECT Id,Maintenance_Contract__c,Activity_Date__c,taskStatus__c FROM task__c 
                                    WHERE taskDifferent__c = '主动任务' 
                                    AND RecordType.DeveloperName  = 'SLAReport_Task'
                                    AND Maintenance_Contract__c in :NMCId 
                                    ORDER BY Activity_Date__c DESC];
 
        //筛选这一季度 没有SLA主动任务的服务合同报告书
        log1.Log__c += '\r\n 任务集合 start:'+taskList +'\r\n' ;
        if(taskList.size()>0){
            for(task__c t : taskList){
                String mcid = t.Maintenance_Contract__c;
                NewMaintenanceReport_Task__c NMRt = NMCReportMap.get(mcid) == null ? new NewMaintenanceReport_Task__c() : NMCReportMap.get(mcid);
                if(NMRt.Distribution_Start_Date__c <= t.Activity_Date__c 
                    && t.Activity_Date__c <= NMRt.Distribution_End_Date__c){
                    //拜访日期是今天之前
                    if(t.Activity_Date__c <today){
                        //如果状态不是 延期 取消 未执行 则不需要发送被动任务
                        if(t.taskStatus__c != '05 延期' && t.taskStatus__c != '04 取消' && t.taskStatus__c != '07 未执行'){               
                            //不需要生成被动任务
                            NMCReportMap.remove(mcid);
                        }
                    }else if(today <t.Activity_Date__c){                        
                    //今天之后,本季度结束日期
                        //如果状态是 接受,则不需要发送被动任务
                        if(t.taskStatus__c == '02 接受'){
                            //不需要生成被动任务
                            NMCReportMap.remove(mcid);
                        } 
                    }
                }
            }
        }
 
        //季度开始日期 + 30
        /* for(NewMaintenanceReport_Task__c tempMCT : NMCReportMap.values()){
            if(tempMCT.Distribution_Start_Date__c.addDays(30) != today){
                //今天不需要生成被动任务
                NMCReportMap.remove(tempMCT.NewMaintenance_Contract__c);
            }
        }
        */
        log1.Log__c += '\r\n NMCReportMap :'+NMCReportMap ;
        //遍历报告书map
        for(NewMaintenanceReport_Task__c tempMCT : NMCReportMap.values()){
            //生成任务
            if(tempMCT.NewMaintenance_Contract__r.Service_Contract_Staff__r.IsActive){//2021-08-30 yjk 增加逻辑:任务的用户必须为Active
                Task__c tempTask = new Task__c();
                tempTask.RecordTypeId = SLAReport_TaskId;
                tempTask.taskDifferent__c = '被动任务';
                tempTask.taskStatus__c = '01 分配';
                tempTask.Maintenance_Contract__c = tempMCT.NewMaintenance_Contract__c;
                tempTask.assignee__c = tempMCT.NewMaintenance_Contract__r.Service_Contract_Staff__c;
                tempTask.account__c = tempMCT.NewMaintenance_Contract__r.Department__c;
                tempTask.Name = '服务合同发放报告书任务(' + tempMCT.NewMaintenance_Contract__r.Department__r.Name + ')';
                tempTask.OwnerId = tempMCT.NewMaintenance_Contract__r.Service_Contract_Staff__c;
                tempTask.NewMaintenanceReport_Task__c = tempMCT.Id;
                NeedInsertTask.add(tempTask);
            }
        }
 
 
        if(NeedInsertTask.size()>0){
            insert NeedInsertTask;
            log1.Log__c += '\r\n 任务 :'+NeedInsertTask ;
           //更新报告书 
            for(NewMaintenanceReport_Task__c tempMCT : NMCReportMap.values()){
               tempMCT.Is_Generate_Task__c = true;
 
               NeedUpdateReport.add(tempMCT);
           }
 
           update NeedUpdateReport;
            
           log1.Log__c += '\r\n 报告书 :'+NeedUpdateReport ;
        }
 
       // insert log1;
    }
 
    global void finish(Database.BatchableContext BC) {
 
        //2021-07-12  mzy update start  SLA定期任务开发
        //更新 已过或当前季度标识
        if(!System.Test.isRunningTest() && IsNeedExecute == true){
            Database.executebatch(new UpdateNewMaintenanceTaskBatch(true));
        }
        //2021-07-12  mzy  update end  SLA定期任务开发
 
    }
}