高章伟
2022-03-10 1312ba82d4c880bdb5357d28e0d4af5b285f610f
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
/* 2021-03-31  mzy  sla报告书任务开发
  创建服务合同报告书任务
*/
global class CreateNewMaintenanceTaskBatch implements Database.Batchable<sObject> {
    String tempMainId = '';//a0H1s000003ziv9
    Boolean IsNeedExecute = false;
    List<String> idList = new List<String>();
    BatchIF_log__c log1 = new BatchIF_Log__c();
 
    
    public CreateNewMaintenanceTaskBatch() {
    }
 
    public CreateNewMaintenanceTaskBatch(String id){
        this.tempMainId = id;
    }
 
    public CreateNewMaintenanceTaskBatch(Boolean NeedExecute){
        this.IsNeedExecute = NeedExecute;
    }
 
    public CreateNewMaintenanceTaskBatch(List<String> idList,Boolean NeedExecute){
        this.IsNeedExecute = NeedExecute;
    }
 
    public CreateNewMaintenanceTaskBatch(String id ,Boolean NeedExecute){
        this.tempMainId = id;
        this.IsNeedExecute = NeedExecute;
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
        System.debug('Start方法进来没?');
        String query = 'SELECT Id,Status__c,Contract_Start_Date__c,Contract_print_completed__c,Contract_End_Date__c,Contract_Conclusion_Date__c,RecordType.DeveloperName '
                     +'FROM Maintenance_Contract__c '
                     +'WHERE RecordType.DeveloperName = \'NewMaintenance_Contract\' AND Contract_Start_Date__c != NULL AND Contract_End_Date__c != NULL '
                     +'AND Status__c = \'契約\' AND Contract_Conclusion_Date__c != NULL ';
        if (String.isNotBlank(this.tempMainId)) {
               query  += 'AND Id = :tempMainId';
        }
        if (idList.size()>0) {
               query  += 'AND Id in :idList';
        }
        system.debug('Start:'+query);
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Maintenance_Contract__c> newMainContract) {
        log1.Type__c='SLA_Report';
        log1.Log__c = 'Batch  execute  start\r\n';
        log1.Log__c += 'List :'+newMainContract.size() +'\r\n';
        log1.Log__c += 'List 内容:'+newMainContract +'\r\n';
 
        //定义变量-----start
        //定义list 存放需要生成服务合同报告书的合同
        List<Maintenance_Contract__c> NeedCreateNMC = new List<Maintenance_Contract__c>();
        //定义list 存放需要生成服务合同报告书的合同Id
        List<String> NeedCreateNMCId = new List<String>();
        //定义list 存放生成的服务合同报告书
        List<NewMaintenanceReport_Task__c>  NMCReportTList= new List<NewMaintenanceReport_Task__c>();
        //定义map  存放季度数  k:合同Id v:季度数
        Map<String,Integer> QuarterNumMap = new Map<String,Integer>();
        //定义map  存放是否需要合并日期
        //Map<String,Boolean> NeedMergeDateMap = new Map<String,Boolean>();
        //定义变量-----end
 
        //0.获取今天的日期
        Date today = Date.today();
        //1.获取需要生成服务合同报告书的合同
        for(Maintenance_Contract__c tempNMC : newMainContract){
            //判断是否生成服务合同报告书
           // if(tempNMC.Contract_Conclusion_Date__c.addDays(1) == today){
 
                //计算合同一共有几个季度
                //实际季度
                Decimal resultDecimal = 0;
                resultDecimal = Decimal.valueOf(tempNMC.Contract_Start_Date__c.monthsBetween(tempNMC.Contract_End_Date__c.addDays(1))) / 3;
                log1.Log__c +='正常:'+resultDecimal+'\r\n';
                //UP
                //Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); 
                //DOWN
                Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.DOWN)); 
 
                log1.Log__c += '日期 :实际季度: '+resultDecimal +' 向下取整:'+resultUp+' 是否合并日期:'+(resultDecimal >resultUp?true:false);
 
                //默认都是不需要合并日期
                //NeedMergeDateMap.put(tempNMC.Id , false);
                //实际大于向下取整
                //if(resultDecimal >resultUp){
                    //说明需要合并日期
                //    NeedMergeDateMap.put(tempNMC.Id , true);
                //}
 
                if(tempNMC.Contract_Start_Date__c.monthsBetween(tempNMC.Contract_End_Date__c.addDays(1)) > 0&& !QuarterNumMap.containsKey(tempNMC.Id)){
                    QuarterNumMap.put(tempNMC.Id , resultUp);
                    NeedCreateNMC.add(tempNMC);
                    NeedCreateNMCId.add(tempNMC.Id);
                }
           // }
        }
        //4.已经生成报告书的合同将不再去生成  
        List<NewMaintenanceReport_Task__c> existNMCReprot = [select Id,Name,NewMaintenance_Contract__c  from NewMaintenanceReport_Task__c where NewMaintenance_Contract__c IN :NeedCreateNMCId ];
        log1.Log__c += '\r\n已经创建的长度 :'+existNMCReprot.size();
        Map<String,NewMaintenanceReport_Task__c> existNMCReportMap = new Map<String,NewMaintenanceReport_Task__c>();
        if(existNMCReprot.size()>0){
            for(NewMaintenanceReport_Task__c NMrt :existNMCReprot){
                existNMCReportMap.put(NMrt.NewMaintenance_Contract__c , NMrt);
            }
        }
        if(NeedCreateNMC.size()>0){
            for(Integer i = 0; i<NeedCreateNMC.size();i++){
                Maintenance_Contract__c tempNMC = NeedCreateNMC.get(i);
                if(existNMCReportMap.get(tempNMC.Id) != null){
                    NeedCreateNMC.remove(i);
                    i--;
                }
            }
        }
 
        log1.Log__c += '\r\n需要创建的长度 :'+NeedCreateNMC.size();
 
        //3.生成报告书
        if(NeedCreateNMC.size()>0){
            //遍历需要创建报告书的合同
            for(Maintenance_Contract__c tempNMC : NeedCreateNMC){
                // //定义变量,判断是否需要顺延
                Boolean isDelay = false;
                // //第一版:当合同生效日晚于【合同开始日+3个月】,第一次发放计划顺延为4/1~6/30 (下一季度)。
                // //第二版:合同盖章完毕日晚于【合同开始日+3个月】,不生成第一个区间(即 顺延为下一季度)。
                // //第三版:盖章完毕日晚于合同开始日1个月以上,自动从第二季度开始
                 if(tempNMC.Contract_print_completed__c > tempNMC.Contract_Start_Date__c.addMonths(1)){
                     isDelay = true;
                 }
 
                //获取当前遍历的合同的季度数 并遍历 生成报告书
                for(Integer qnum = 1;qnum <= QuarterNumMap.get(tempNMC.Id);qnum++){
                    // //如果 当合同生效日晚于【合同开始日+3个月】, 顺延为第二季度
                    if(isDelay){
                         isDelay = false;
                         continue;
                    }
 
                    //2022-03-01  mzy SLA报告书上线后问题  start
                    //合同日
                    Date ContractConclusionDate = tempNMC.Contract_Conclusion_Date__c;
                    //2022-03-01  mzy SLA报告书上线后问题  end
 
                    //计算开始日期
                    Date DistributionStartDate= tempNMC.Contract_Start_Date__c.addMonths((qnum-1) * 3);
                    //计算结束日期
                    Date DistributionEndDate = tempNMC.Contract_Start_Date__c.addMonths((qnum) * 3).addDays(-1);
                    
                    //2022-03-01  mzy  SLA报告书上线后问题  start
                    //合同日到满一个季度的期间大于2个月则需要生成发放计划,小于2个月则不需要生成计划
                    //为了防止出现 55485 的那种情况(合同日所在区间之前的季度不再生成)
                    if ((ContractConclusionDate.addMonths(2)>DistributionEndDate) || (ContractConclusionDate > DistributionEndDate)) {
                        continue;
                    }
                    //2022-03-01  mzy  SLA报告书上线后问题  end
 
                    //开始生成服务合同报告书
                    NewMaintenanceReport_Task__c tempNMCT = new NewMaintenanceReport_Task__c();
                    //报告书名字
                    if(qnum<10){
                        tempNMCT.Name = 'FWreport-0'+qnum;
                    }else {
                        tempNMCT.Name = 'FWreport-'+qnum;
                    }
                    //季度数
                    tempNMCT.QuartersNum__c = qnum;
                    //发放季度
                    tempNMCT.Distribution_Quarter__c = '第'+qnum+'季度';
                    //发放期间开始日期
                    tempNMCT.Distribution_Start_Date__c = DistributionStartDate;
 
                    /*
                    //如果为最后一个季度,则判断是否需要合并日期
                    if(qnum == QuarterNumMap.get(tempNMC.Id)){
                    //如果需要合并日期,则结束日期赋值为  合同结束日期+1个月                       
                    //发放期间结束日期 + 1个月
                    tempNMCT.Distribution_End_Date__c = DistributionEndDate;
                    //发放期限
                    tempNMCT.CorrespondingPeriod__c =  Date.valueOf(tempNMC.Contract_End_Date__c ).addMonths(2).toStartOfMonth().addDays(-1);
                    //及时率的统计区间范围  start
                    //及时率开始统计日
                    tempNMCT.TimelyRateStartDate__c = DistributionStartDate.addMonths(2);
                    //及时率结束统计日
                    tempNMCT.TimelyRateEndDate__c =  Date.valueOf(tempNMC.Contract_End_Date__c ).addMonths(2).toStartOfMonth().addDays(-1);
                    //及时率的统计区间范围  end
                    
                    }else {
                    //如果不用合并日期,这正常赋值                                             
                    //发放期间结束日期
                    tempNMCT.Distribution_End_Date__c = DistributionEndDate;
                    //发放期限
                    tempNMCT.CorrespondingPeriod__c =  DistributionEndDate.addMonths(1);
 
                    //及时率的统计区间范围  start
                    //及时率开始统计日
                    tempNMCT.TimelyRateStartDate__c = DistributionStartDate.addMonths(2);
                    //及时率结束统计日
                    tempNMCT.TimelyRateEndDate__c =  DistributionEndDate.addMonths(1);
                    //及时率的统计区间范围  end
                    }    
 
                    */
 
                    /*//如果为最后一个季度,则判断是否需要合并日期
                    if(NeedMergeDateMap.get(tempNMC.id)&&qnum == QuarterNumMap.get(tempNMC.Id)){
                    //如果需要合并日期,则结束日期赋值为  合同结束日期                       
                    //发放期间结束日期
                    tempNMCT.Distribution_End_Date__c = tempNMC.Contract_End_Date__c;
                    //对应期限
                    tempNMCT.CorrespondingPeriod__c =  tempNMC.Contract_End_Date__c;
                    }else {
                    //如果不用合并日期,这正常赋值 
                    } */                        
 
                    //发放期间结束日期
                    tempNMCT.Distribution_End_Date__c = DistributionEndDate;
                    //发放期限
                    tempNMCT.CorrespondingPeriod__c =  DistributionEndDate;    
 
                    //发放人
                    tempNMCT.Distribution_Person__c =  '';
                    //服务合同
                    tempNMCT.NewMaintenance_Contract__c = tempNMC.Id;
 
                    //2021-07-27  mzy  update   start
                    //如果季度的计划开始日 是 8月1日之前的,则需要将实际发放次数 = 1
                    Date riqi = Date.newInstance(2021,08,01);
                    if(DistributionStartDate <riqi){
                        tempNMCT.ActualDistributionTimes_Quarter__c = 1;
                    }
                    //2021-07-27  mzy  update    end
 
 
                    NMCReportTList.add(tempNMCT);
                }
 
            }
 
 
        }
 
        if(NMCReportTList.size()>0){
            insert NMCReportTList;
 
            /*Set<String> nmcid = new Set<String>();
            for(NewMaintenanceReport_Task__c m : NMCReportTList){
                nmcid.add(m.NewMaintenance_Contract__c);
            }
 
            List<Task__c> taskList = [SELECT Id , Activity_Date__c ,Maintenance_Contract__c  FROM TASK__c WHERE Maintenance_Contract__c in : nmcid 
                                    AND taskStatus__c = '03 完成' AND RecordType.DeveloperName  = 'SLAReport_Task'];
            for(NewMaintenanceReport_Task__c m :NMCReportTList){
                //及时率
                integer timelylv = 0;
                //发放次数
                integer grantCount = 0;
 
                if(taskList.size()>0){                    
                    for (Task__c t :taskList){
                        //判断本季度内有没有已经完成的任务,如果>=1,计划发放次数为1,发放及时率为100%;本季度目前没有已完成的任务,都为0
                        if(m.Distribution_Start_Date__c <= t.Activity_Date__c
                            && t.Activity_Date__c <= m.Distribution_End_Date__c
                            && t.Maintenance_Contract__c == m.NewMaintenance_Contract__c){
                            timelylv = 100;
                            grantCount = 1;
                        }
                    }
                }
 
                m.ActualDistributionTimes_Quarter__c = grantCount;
            }
 
            update NMCReportTList;*/
 
        }
        system.debug('execute 执行完了');
       /* if(!''.equals(log1.Log__c)){
            insert log1;
        }*/
 
 
    }
 
    global void finish(Database.BatchableContext BC) {
 
        //2021-07-12  mzy update start  SLA定期任务开发
        if(!System.Test.isRunningTest() && IsNeedExecute == true){
            Database.executebatch(new CreateSLAReportTaskBatch(true));
        }
        //2021-07-12  mzy  update end  SLA定期任务开发
    }
}