liuyn
2024-03-11 a87f1c3df03078814ee97ad0c8ac200a232419e9
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
//当前日期大于OPD计划实施日期 and 状态不等于取消或完毕 and (opd计划下没有任何得备品借出申请 or 或者对应备品借出状态是草案中,申请中,取消时)
//需要创建OPD计划取消延期,更新opd计划
//1.OPD计划取消延期.取消理由是取消成功,2.需要考虑opd计划所有人是否已离职,若离职,取消/延期理由为担当离职,否则为没完成备品申请
// OPD计划延期一次后,在第二个月仍没有分配备品的,OPD计划自动取消,原因为备品不足,同时备品申请自动取消。 ljh 20220929 
/*
2023/12/12 ljh 智能化逻辑重构修改为:
当前日期大于OPD计划实施日期 and 状态不等于取消或完毕 and (opd计划下没有任何得备品借出申请 or 或者对应备品借出状态是草案中,申请中,取消时)
需要创建OPD计划取消延期,更新opd计划
1.OPD计划取消延期.取消状态是取消成功,
2.需要考虑opd计划所有人是否已离职,若离职,取消/延期理由为担当离职,
如果未申请备品取消取消/延期理由是:草案无备品申请(OPD状态是草案中)
如果有申请备品取消/延期理由是:没完成备品申请(备品借出状态是草案中,申请中,取消)以及opd计划下没有任何得备品借出申请
 */
global class OPDPlanCancelPostponePlanLogicBatch implements Database.Batchable<sObject>, Database.Stateful {
    //加日志 为了更新历史数据 做一下日志查看 20201124 you start
    private final Id TEST_ID = null;
    private BatchIF_Log__c iflog;
    //加日志 为了更新历史数据 做一下日志查看 20201124 you end
    public String soql = '';
    public String opdId;
    Public Integer opdplannum=0;
 
    global OPDPlanCancelPostponePlanLogicBatch() {
        this.soql = soql;
        //加日志 为了更新历史数据 做一下日志查看 20201124 you start
        System.debug('TEST_ID=' + TEST_ID);
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushOPDPlanNotification';
        iflog.Log__c  = 'OPDPlanCancelPostponePlanLogicBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        //加日志 为了更新历史数据 做一下日志查看 20201124 you end
    }
 
    global OPDPlanCancelPostponePlanLogicBatch(String opdId) {
        this.soql = soql;
        this.opdId = opdId;
        //加日志 为了更新历史数据 做一下日志查看 20201124 you start
        TEST_ID = opdId;
        System.debug('TEST_ID=' + TEST_ID);
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushOPDPlanNotification';
        iflog.Log__c  = 'OPDPlanCancelPostponePlanLogicBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        //加日志 为了更新历史数据 做一下日志查看 20201124 you end
    }
    //获取状态不是取消 或者 完毕 且OPD计划实施日期小于当前时间的opd计划
    global Database.QueryLocator start(Database.BatchableContext BC) {
        Date dateToday = Date.today();
        system.debug('opdId' + opdId+'=iflog=='+iflog);
 
        soql  = 'select id,Status__c,name,OPDPlan_ImplementDate__c,Rental_Apply2__c, StayOrNot__c,SystemDelayMark__c ';
        soql += ' from OPDPlan__c';
        soql += ' where Status__c != \'取消\' and Status__c != \'完毕\'';
        soql += ' and (OPDPlan_ImplementDate__c < :dateToday';
        //update by rentx 2021-01-04 SWAG-BWSBW3  增加一条判断,当OPD计划来源是会议时,担当离职不取消。
        // soql += ' or StayOrNot__c = \'已离职\')';
        soql += ' or StayOrNot__c = \'已离职\')';
        //update by rentx 2021-01-04 SWAG-BWSBW3
        
        //update by yc 20210121 start
        soql += ' and OPDType__c != \'学会\'';
        //update by yc 20210121 end
        
        if (String.isNotBlank(this.opdId)) {
            soql += ' and id = \'' + this.opdId + '\'';
        }
        system.debug('soql:' + soql);
        return Database.getQueryLocator(soql);
    }
 
    global void execute(Database.BatchableContext BC, List<OPDPlan__c> OPDPlanList) {
        //最终更新用OPD计划取消延期List
        List<CancelPostponePlan__c> cppList =  new List<CancelPostponePlan__c>();
        List<OPDPlan__c> OpdRtlList = new List<OPDPlan__c>();
        List<OPDPlan__c>OpdUpList = new List<OPDPlan__c>();
        system.debug('OPDPlanList' + OPDPlanList.size());
        Set<Id> raIdSet = new Set<Id>();// 有保有设备 的一申请书  20221107 ljh update SWAG-CHM5E4
        for (OPDPlan__c op : OPDPlanList) {
            if (op.Rental_Apply2__c != null) {
                // 所有有备品的OPD计划
                OpdRtlList.add(op);
            } else {
                // 可以取消的OPD计划
                OpdUpList.add(op);
            }
        }
        //opdID与OPD计划取消延期Map
        Map<id, Rental_Apply__c> rtlMap  = new Map<id, Rental_Apply__c>();
        // 20231212 ljh 备品智能化整体重构逻辑见备注 start
        /*Set<Id> rtl3Set  = new Set<Id>();//20221108  ljh update SWAG-CHM5E4
        if (OpdRtlList.size() > 0) {
            //获取OPD计划下的取消延期数据
            //20220920  ljh update SWAG-CHM5E4  start
            List<Rental_Apply_Equipment_Set_Detail__c> raesList =
                [select Rental_Apply__c from Rental_Apply_Equipment_Set_Detail__c where Asset__c != null and Rental_Apply__r.OPDPlan__c in :OpdRtlList];
            for(Rental_Apply_Equipment_Set_Detail__c raes:raesList){
                raIdSet.add(raes.Rental_Apply__c);
            }    
            //20220920  ljh update SWAG-CHM5E4 end
            // 20221220 ljh DB202212267051 add Split_Apply_Reason__c
            List<Rental_Apply__c> rtlList =
                [select id, RA_Status__c, OPDPlan__c,Split_Apply_Reason__c from Rental_Apply__c where OPDPlan__c in :OpdRtlList];
            //取出备品借出状态不是草案中,申请中,取消的取消延期数据放入map
            for (Rental_Apply__c rtl : rtlList) {
                //20221007  ljh update SWAG-CHM5E4 start
                // if (rtl.RA_Status__c != '草案中' && rtl.RA_Status__c != '申请中' && rtl.RA_Status__c != '取消') {
                //     // OPD计划-所有备品Map
                //     rtlMap.put(rtl.OPDPlan__c, rtl);
                // }
                if (rtl.RA_Status__c == '草案中' || rtl.RA_Status__c == '申请中' || rtl.RA_Status__c == '取消') {
                    // OPD计划-所有备品Map
                    rtl3Set.add(rtl.OPDPlan__c);
                }
                // 20221220 ljh DB202212267051 start
                // 品申请上“分单理由”为“到货NG分单”和“追加附属品分单”,自动延期一次,超期不取消。
                // if(raIdSet.contains(rtl.Id)){
                if(raIdSet.contains(rtl.Id) || (String.isNotBlank(rtl.Split_Apply_Reason__c) && (rtl.Split_Apply_Reason__c == '到货NG分单' || rtl.Split_Apply_Reason__c == '追加附属品分单'))){
                // 20221220 ljh DB202212267051 start
                    rtlMap.put(rtl.OPDPlan__c, rtl);
                } 
                //20221007  ljh update SWAG-CHM5E4 end
            }
        }
        Date dateToday1 = Date.today();//20221108  ljh update SWAG-CHM5E4
        //取出可以变更的备品借出申请
        for (OPDPlan__c OpdRt : OpdRtlList) {
            //20221108  ljh update SWAG-CHM5E4 start
            // if (!rtlMap.containskey(OpdRt.Id)) {
            //     OpdUpList.add(OpdRt);
            // }
            if (!rtlMap.containskey(OpdRt.Id) && rtl3Set.contains(OpdRt.Id)) {
                OpdUpList.add(OpdRt);
            }else if(!rtlMap.containskey(OpdRt.Id) && !rtl3Set.contains(OpdRt.Id) && OpdRt.OPDPlan_ImplementDate__c < dateToday1 && OpdRt.SystemDelayMark__c){
                OpdUpList.add(OpdRt);
            }
            //20221108  ljh update SWAG-CHM5E4 end
        }
        // Date dateToday1 = Date.today();
        System.debug('OpdUpList个数:'+OpdUpList.size());
        //赋值需要考虑担当者是否在职
        for (OPDPlan__c op : OpdUpList) {
            CancelPostponePlan__c cpp = new CancelPostponePlan__c();
            cpp.CancelOPDPlan__c = op.id;
            cpp.RecordTypeId = '01210000000gQyL';
            cpp.Status__c = '取消成功';
            system.debug('计划实施日==' + op.OPDPlan_ImplementDate__c+'==是否延期=='+op.SystemDelayMark__c+'==opd计划=='+op.id);
            if (op.StayOrNot__c == '已离职') {
                cpp.cancelReasonCombobox__c = '担当离职';
                //update by yc 20210207 start SWAG-BXVDPJ
            } else if(op.OPDPlan_ImplementDate__c < dateToday1 && op.SystemDelayMark__c){
                cpp.cancelReasonCombobox__c = '备品不足';
                //update by yc 20210207 end SWAG-BXVDPJ
            // 20230704 ljh DB202306573779 start
            // }else {
            //     cpp.cancelReasonCombobox__c = '没完成备品申请';
            // }
            }else if(String.isNotBlank(op.Status__c) && op.Status__c == '草案中' ){
                cpp.cancelReasonCombobox__c = '草案无备品申请';
            }else {
                cpp.cancelReasonCombobox__c = '没完成备品申请';
            }
            // 20230704 ljh DB202306573779 end
            system.debug('cpp' + cpp);
            cppList.add(cpp);
        }*/
        //20231229 sx 备品智能化添加中间状态 申请中(OPD未通过)
        List<Rental_Apply__c> rtlList = [select id, RA_Status__c, OPDPlan__c from Rental_Apply__c where OPDPlan__c in :OpdRtlList and  RA_Status__c in ('草案中' ,'申请中(OPD未通过)','申请中','取消')];
        for(Rental_Apply__c rtl:rtlList){
            rtlMap.put(rtl.OPDPlan__c, rtl);
        }
        //取出可以变更的备品借出申请
        for (OPDPlan__c OpdRt : OpdRtlList) {
            if (rtlMap.containskey(OpdRt.Id)) {
                OpdUpList.add(OpdRt);
            }
        }
        //赋值需要考虑担当者是否在职
        for (OPDPlan__c op : OpdUpList) {
            CancelPostponePlan__c cpp = new CancelPostponePlan__c();
            cpp.CancelOPDPlan__c = op.id;
            // cpp.RecordTypeId = '01210000000gQyL';
            cpp.RecordTypeId = Schema.SObjectType.CancelPostponePlan__c.getRecordTypeInfosByDeveloperName().get('CancelType').getRecordTypeId();
            cpp.Status__c = '取消成功';
            system.debug('计划实施日==' + op.OPDPlan_ImplementDate__c+'==是否延期=='+op.SystemDelayMark__c+'==opd计划=='+op.id);
            if (op.StayOrNot__c == '已离职') {
                cpp.cancelReasonCombobox__c = '担当离职';
            }else if(String.isNotBlank(op.Status__c) && op.Status__c == '草案中' ){
                cpp.cancelReasonCombobox__c = '草案无备品申请';
            }else {
                cpp.cancelReasonCombobox__c = '没完成备品申请';
            }
            system.debug('cpp' + cpp);
            cppList.add(cpp);
        }
        // 20231212 ljh 备品智能化整体重构逻辑见备注 end    
        system.debug('条数' + cppList.size());
        //加日志 为了更新历史数据 做一下日志查看 20201124 you start
        opdplannum +=cppList.size();
        try {
            insert cppList;
        } catch (Exception e) {
            iflog.ErrorLog__c = 'ERROR [' + OpdUpList + '] => [' + rtlMap + ']' + e.getMessage() + '\n';
        }
        //加日志 为了更新历史数据 做一下日志查看 20201124 you end
        
        
    }
    global void finish(Database.BatchableContext BC) {
        //加日志 为了更新历史数据 做一下日志查看 20201124 you start
        iflog.Log__c += '更新件数: ' +  opdplannum;
        iflog.Log__c += '\nOPDPlanCancelPostponePlanLogicBatch end';
        String tmp = iflog.ErrorLog__c;
        if (tmp.length() > 65000) {
            tmp = tmp.substring(0, 65000);
            tmp += ' ...have more lines...';
            iflog.ErrorLog__c = tmp;
        }
        update iflog;
        //加日志 为了更新历史数据 做一下日志查看 20201124 you end
 
        // 20210119 youchang start   SWAG-BX7F9W   
        Date dateToday = Date.today();
        String todaystr =  String.valueOf(dateToday);
        Database.executeBatch(new BathUpdateSobject('OPDPlan__c',' Status__c=\'计划中\' and OPDType__c= \'学会\' and OPDPlan_ImplementDate__c < '+todaystr), 20);
       // 20210119 youchang end   SWAG-BX7F9W  
    }
                  
}