黄千龙
2022-03-29 cbab3d8795d1e0589e37261d978eac22cc904318
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
/**************************************************************************************************
@Author: 黄千龙
@Name: EquipmentCoverageTargetBatch
@CreateDate: 22/03/2022
@Description: 是否续签率目标(分母)
@Version 1.0
*****************************************************************************************************/
global class EquipmentRenewTargetBatch implements Database.Batchable<sObject>,Database.Stateful {
    public String query;
    public Date toDayTime = Date.today();
    public Date start_date1 ;
    public Date end_date1 ;
    public Date start_date2 ;
    public Date end_date2 ;
    public Date deadlineTime;
    public String OCSM_Period_half;
    public String OCSM_Period = 'FY'+toDayTime.year();
    private BatchIF_Log__c iflog;
    public List < String > accountIdList;
    global EquipmentRenewTargetBatch() {
        this.query = query;
        
    }
    global EquipmentRenewTargetBatch(List < String > accountIdList) {
        this.query = query;
        this.accountIdList = accountIdList;
    }
    global Database.QueryLocator start(Database.BatchableContext bc) {
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'EquipmentRenewTargetBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
            OCSM_Period_half = '1H';
        }else{
            OCSM_Period_half = '2H';
        }
        if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
            start_date1 = Date.newInstance(toDayTime.year()-1,4,1);
            end_date1 = Date.newInstance(toDayTime.year()-1,12,31);
            start_date2 = Date.newInstance(toDayTime.year(),1,1);
            end_date2 = Date.newInstance(toDayTime.year(),6,30);
            deadlineTime = Date.newInstance(toDayTime.year(),3,31);
        }else{
            start_date1 = Date.newInstance(toDayTime.year()-1,10,1);
            end_date1 = Date.newInstance(toDayTime.year(),6,30);
            start_date2 = Date.newInstance(toDayTime.year(),7,1);
            end_date2 = Date.newInstance(toDayTime.year(),12,31);
            deadlineTime = Date.newInstance(toDayTime.year(),9,30);
        }
        if (accountIdList != null && accountIdList.size() > 0) {
            // 保有设备不为零件停产
            query ='select Id,Hospital__c,CurrentContract_F__r.IF_Target_Renew__c,CurrentContract__c,CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Start_Date__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c,Product2.Category3__c,Product2.Category4__c' 
                    + ' from Asset where IF_Parts_production__c != \'1\' and Hospital__c in :accountIdList  and Product2.ServiceCategory__c != null'
                    // 测试不开启
                    +' and CurrentContract_F__r.IF_Target_Renew__c = \'1\''
                    + ' and ((CurrentContract__r.Contract_End_Date__c>= :start_date1 and CurrentContract__r.Contract_End_Date__c<= :end_date1) '
                    +' or (CurrentContract__r.Contract_End_Date__c>= :start_date2 and CurrentContract__r.Contract_End_Date__c<= :end_date2)) order by hospital__c';
        }else{
            // 保有设备不为零件停产
        query ='select Id,Hospital__c,CurrentContract_F__r.IF_Target_Renew__c,CurrentContract__c,CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Start_Date__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c,Product2.Category3__c,Product2.Category4__c' 
                + ' from Asset where IF_Parts_production__c != \'1\' and Product2.ServiceCategory__c != null '
                // 测试不开启
                +' and CurrentContract_F__r.IF_Target_Renew__c = \'1\''
                + ' and ((CurrentContract__r.Contract_End_Date__c>= :start_date1 and CurrentContract__r.Contract_End_Date__c<= :end_date1) '
                +' or (CurrentContract__r.Contract_End_Date__c>= :start_date2 and CurrentContract__r.Contract_End_Date__c<= :end_date2)) order by hospital__c';
        }  
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Asset> Assets) {
        List<Account_Service_Of_Target__c> asots = new List<Account_Service_Of_Target__c>();
        List<Id> accIds = new List<Id>();
        Map<String,Account_Service_Of_Target__c> asotMap = new Map<String,Account_Service_Of_Target__c>();
        for (Asset ass : Assets) {
            accIds.add(ass.Hospital__c);
        }
        List<Account_Service_Of_Target__c> asotList = [select Id,Renew_Target_Rigid_Mirror_2__c,Renew_Target_Soft_Mirror_2__c,Renew_Target_Correlation_Lightsource__c,Account_HP__c,OCSM_Period_half__c 
                                                    from Account_Service_Of_Target__c 
                                                    where Account_HP__c in :accIds and OCSM_Period_half__c = :OCSM_Period_half 
                                                    and OCSM_Period__c = :OCSM_Period];
        if (asotList != null) {
            for (Account_Service_Of_Target__c asot : asotList) {
                for (Id accid : accIds) {
                    if (asot.Account_HP__c == accid) {
                        asotMap.put(accid,asot);
                    }
                }
            }
        }
            List<Asset> AssetsTarget = new List<Asset>();
                
 
            for (Asset ass : Assets) {
                    // 分母
                    /*1H考核对象: 1)、2021.4.1-2021.12.31合同结束且截止2022.3.31未续签的设备;
                    2)、2022.1.1-2022.6.30合同结束,不论该设备是否续签
                    2H考核对象: 1)、2021.10.1-2022.6.30合同结束且截止2022.9.30未续签的设备;
                    2)、2022.7.1-2022.12.31 合同结束,不论该设备是否续签
                    */
                // 续签目标(硬)
                Integer mirror_1 = 0;
                // 续签目标(软)
                Integer mirror_2 = 0;
                //续签目标(周边)
                Integer mirror_3 = 0;
                        Boolean result = true;
                        if (ass.Product2.ServiceCategory__c != null) {
                            if ( ass.CurrentContract__r.Contract_End_Date__c != null && ass.CurrentContract__r.Contract_End_Date__c>=start_date1&&ass.CurrentContract__r.Contract_End_Date__c<=end_date1){
                                if (ass.CurrentContract__c == null || ass.CurrentContract__r.Status__c == '合同结束') {
                                    ass.IF_Renewalrate_Target_Asset__c = '1';
                                    AssetsTarget.add(ass);
                                    result = false;
                                }
                                if (result) {
                                    if (ass.CurrentContract__r.Contract_Start_Date__c != null && ass.CurrentContract__r.Contract_Start_Date__c <= deadlineTime) {
                                    ass.IF_Renewalrate_Target_Asset__c = '1';
                                    AssetsTarget.add(ass);
                                    }
                                } 
                            }
                            if (ass.CurrentContract__r.Contract_End_Date__c != null && ass.CurrentContract__r.Contract_End_Date__c>=start_date2&&ass.CurrentContract__r.Contract_End_Date__c<=end_date2) {
                                ass.IF_Renewalrate_Target_Asset__c = '1';
                                AssetsTarget.add(ass);
                            }
                        }   
                        if (ass.Product2.ServiceCategory__c == '硬性镜') {
                            mirror_1++;
                        }
                        if(ass.Product2.ServiceCategory__c =='软性镜'){
                            mirror_2++;
                        }
                        if (ass.Product2.ServiceCategory__c == '周边') {
                            mirror_3++;
                        } 
                if (asotMap.containsKey(ass.Hospital__c)) {
                    Account_Service_Of_Target__c asotOne = new Account_Service_Of_Target__c();
                        asotOne = asotMap.get(ass.Hospital__c);
                        asotOne.Renewalrate_Target_Account__c = true;
                        asotOne.Renew_Target_Rigid_Mirror_2__c += mirror_1;
                        asotOne.Renew_Target_Soft_Mirror_2__c += mirror_2;
                        asotOne.Renew_Target_Correlation_Lightsource__c += mirror_3;
                        if (!asots.contains(asotOne)) {
                            asots.add(asotOne);
                        }  
                }else{
                    Account_Service_Of_Target__c asot1 = new Account_Service_Of_Target__c();
                    asot1.Account_HP__c = ass.Hospital__c;
                    asot1.Renewalrate_Target_Account__c = true;
                    asot1.Renew_Target_Rigid_Mirror_2__c = mirror_1;
                    asot1.Renew_Target_Soft_Mirror_2__c = mirror_2;
                    asot1.Renew_Target_Correlation_Lightsource__c = mirror_3;
                    asot1.OCSM_Period__c = OCSM_Period; 
                    asot1.OCSM_Period_half__c = OCSM_Period_half;
                    asotMap.put(ass.hospital__c,asot1);
                    if (!asots.contains(asot1)) {
                        asots.add(asot1);
                    } 
                }
            }
        if (AssetsTarget!=null) {
            try {
                update AssetsTarget;
            }
            catch (Exception e) {
                iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsTarget:'+']'+e.getMessage()+'\n';
             }
        }
        if (asots!=null) {
            try {
                UpSert asots;
            }
            catch (Exception e) {
                iflog.ErrorLog__c += 'ERROR'+'['+'UpSert asots:'+']'+e.getMessage()+'\n';
            }  
        }
    }
 
    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nEquipmentRenewTargetBatch 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;
    }
}