高章伟
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
global class EquipmentRenewBatch 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;
    private BatchIF_Log__c iflog;
 
     
    global EquipmentRenewBatch() {
        this.query = '';
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'EquipmentRenewBatch 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,CurrentContract__r.New_Contract_TypeF_Text__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c' 
                + ' from Asset_Hospital__r where 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> asotList = new List<Account_Service_Of_Target__c>();
       
        
        for (Account acc : Accounts) {
            Account_Service_Of_Target__c asot = new Account_Service_Of_Target__c();
            List<Asset> AssetsTarget = new List<Asset>();
            List<Asset> AssetsReal = new List<Asset>();
            // 实际续签数:设备数
            Integer mirror_1 = 0;
            // 续签目标:设备数
            Integer mirror_2 = 0;
            for (Asset ass : acc.Asset_Hospital__r) {
                // 分子
                    //1. 设备关联的合同类型是“续签合同” 2. 在2023年3月31日前系统生效完毕
                    if (ass.CurrentContract__r.Contract_End_Date__c <= Date.newInstance(toDayTime.year()+1,3,31) && ass.CurrentContract__r.New_Contract_TypeF_Text__c == '续签合同') {
                            // 标记为是否续签实际设备
                            ass.IF_Renewalrate_Real_Asset__c = '1';
                            AssetsReal.add(ass);
                            mirror_1++;
                    }
                    // 分母
                    /*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;
                                mirror_2++;
                            }
                            if (result) {
                                if (ass.CurrentContract__r.Contract_Start_Date__c <= deadlineTime) {
                                ass.IF_Renewalrate_Target_Asset__c = '1';
                                AssetsTarget.add(ass);
                                mirror_2++;
                                }
                            } 
                        }
                        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);
                            mirror_2++;
                        }
                    }    
                if (AssetsReal!=null) {
                    try {
                        update AssetsReal;
                    }
                    catch (Exception e) {
                        iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsReal:'+']'+e.getMessage()+'\n';
                     }
                }
                 if (AssetsTarget!=null) {
                    try {
                        update AssetsTarget;
                    }
                    catch (Exception e) {
                        iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsTarget:'+']'+e.getMessage()+'\n';
                     }
                }
            }
            asot.Account_HP__c = acc.id;
            // asot.Finish_Asset__c = mirror_1;
            // asot.AssetContinueTaget__c = mirror_2;
            // asotList.add(asot);
        }  
        // if (asotList!=null) {
        //     try {
        //         insert asotList;
        //     }
        //     catch (Exception e) {
        //         iflog.ErrorLog__c += 'ERROR'+'['+'insert asotList:'+']'+e.getMessage()+'\n';
        //     }  
        // }  
    }
 
    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nEquipmentRenewBatch 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;
    }
}