黄千龙
2022-03-15 eb541f0e4cb308affad2eb742f1d1858ad1d758e
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
global class EquipmentRenewTargetBatch implements Database.Batchable<sObject> {
    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;
    private BatchIF_Log__c iflog;
    global EquipmentRenewTargetBatch() {
        this.query = query;
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'EquipmentRenewTargetBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
        if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
            this.start_date1 = Date.newInstance(toDayTime.year()-1,4,1);
            this.end_date1 = Date.newInstance(toDayTime.year()-1,12,31);
            this.start_date2 = Date.newInstance(toDayTime.year(),1,1);
            this.end_date2 = Date.newInstance(toDayTime.year(),6,30);
            this.deadlineTime = Date.newInstance(toDayTime.year(),3,31);
        }else{
            this.start_date1 = Date.newInstance(toDayTime.year()-1,10,1);
            this.end_date1 = Date.newInstance(toDayTime.year(),6,30);
            this.start_date2 = Date.newInstance(toDayTime.year(),7,1);
            this.end_date2 = Date.newInstance(toDayTime.year(),12,31);
            this.deadlineTime = Date.newInstance(toDayTime.year(),9,30);
        }
        // 保有设备不为零件停产
        query+='select Id,(select Id,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_Hospital__r where IF_Parts_production__c != \'1\' and (CurrentContract__r.Contract_End_Date__c >= :start_date1 and CurrentContract__r.Contract_End_Date__c <= :end_date2))'
                + ' from Account';
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Account> Accounts) {
        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 (Account acc1 : Accounts) {
            accIds.add(acc1.id);
        }
        List<Account_Service_Of_Target__c> asotList = [select Id,Account_HP__c,OCSM_Period_half__c from Account_Service_Of_Target__c where Account_HP__c in :accIds];
        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.OCSM_Period_half__c,asot);
                    }
                }
            }
        }
        
        for (Account acc : Accounts) {
            Account_Service_Of_Target__c asot = new Account_Service_Of_Target__c();
            List<Asset> AssetsTarget = new List<Asset>();
                // 续签目标(硬):泌尿科用硬性镜
                Integer mirror_1 = 0;
                // 续签目标(软):鼻咽喉镜
                Integer mirror_2 = 0;
                //续签目标(周边):光源
                Integer mirror_3 = 0;
 
            for (Asset ass : acc.Asset_Hospital__r) {
                    // 分母
                    /*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 合同结束,不论该设备是否续签
                    */
                    Boolean result = true;
                    if (ass.Product2.ServiceCategory__c != null) {
                        if (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 <= deadlineTime) {
                                ass.IF_Renewalrate_Target_Asset__c = '1';
                                AssetsTarget.add(ass);
                                }
                            } 
                        }
                        if (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 (AssetsTarget!=null) {
                    try {
                        update AssetsTarget;
                    }
                    catch (Exception e) {
                        iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsTarget:'+']'+e.getMessage()+'\n';
                     }
                }
            }
            for (Asset ata : AssetsTarget) {
                    if (ata.Product2.Category4__c == '泌尿科用硬性镜') {
                        mirror_1++;
                    }
                    if(ata.Product2.ServiceCategory__c =='软性镜'){
                        mirror_2++;
                    }
                    if (ata.Product2.Category3__c == '光源') {
                        mirror_3++;
                    } 
            }
            if (asotMap != null) {
                Account_Service_Of_Target__c asotOne = new Account_Service_Of_Target__c();
                if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
                    asotOne = asotMap.get(acc.id+'1H');
                }else{
                    asotOne = asotMap.get(acc.id+'2H'); 
                }
                if (asotOne != null) {
                    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;
                    asots.add(asotOne);
                }  
            }
            if (asotList.isEmpty()) {
                Account_Service_Of_Target__c asot1 = new Account_Service_Of_Target__c();
                asot1.Account_HP__c = acc.id;
                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;
                if (toDayTime.year()<=2029 && toDayTime.year()>=2023) {
                    asot1.OCSM_Period__c =  'FY'+toDayTime.year();
                    if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
                        asot1.OCSM_Period_half__c =  '1H';
                    }else{
                        asot1.OCSM_Period_half__c =  '2H';
                    } 
                }
                asots.add(asot1);
            }
        }  
        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;
    }
}