黄千龙
2022-04-08 fe7d1b90f57b14ca09852c0e80f58a412b50478d
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
/**************************************************************************************************
@Author: 黄千龙
@Name: EquipmentCoverageTargetBatch
@CreateDate: 22/03/2022
@Description: 是否覆盖率目标(分母)
@Version 1.0
*****************************************************************************************************/
global class EquipmentCoverageTargetBatch implements Database.Batchable<sObject>,Database.Stateful {
    public String query;
    public Date start_dateH1 ;
    public Date end_dateH1 ;
    public List<Id> hospIds = new List<Id>();
    public Date toDayTime = Date.today();
    public String OCSM_Period_half;
    public String OCSM_Period;
    private BatchIF_Log__c iflog;
    public List < String > accountIdList;
    public Date egdTime;
    global EquipmentCoverageTargetBatch() {
        this.query = query;
        OCSM_Period = 'FY'+toDayTime.year();
    }
 
    global EquipmentCoverageTargetBatch(List < String > accountIdList) {
        this.query = query;
        this.accountIdList = accountIdList;
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
        
        system.debug('执行start');
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'EquipmentRealCoverageBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        if (toDayTime.month() >= 4 && toDayTime.month() <= 9) {
            OCSM_Period_half = '1H';
        }else{
            OCSM_Period_half = '2H';
        }
        // 5条以上软性镜医院&&医院有效
        egdTime = Date.newInstance(toDayTime.year()+1,3,1);
        List<AggregateResult> results = new List<AggregateResult>();
        
        String groupQuery = 'SELECT count(Id),Hospital__c' 
                            + ' FROM Asset' 
                            + ' WHERE Product2.ServiceCategory__c =\'软性镜\' AND Is_Active__c =\'有効\' AND RecordType.DeveloperName  =\'HP\' ';
        if (accountIdList != null && accountIdList.size() > 0) {
            groupQuery += ' AND Hospital__c IN :accountIdList';
        }
        groupQuery += ' Group by Hospital__c having count(Id)>=5';
 
        System.debug(LoggingLevel.INFO, '*** groupQuery: ' + groupQuery);
        results = Database.query(groupQuery);
        if(results!=null && results.size() > 0){
           for (AggregateResult a1 : results) {
               hospIds.add(String.valueOf(a1.get('Hospital__c')));
           }
        }
        return Database.getQueryLocator([SELECT Id,IF_Coverage_Target_HP__c,
                                            (SELECT Id,Hospital__c,Hospital__r.IF_Coverage_Target_HP__c,IF_Coverage_Target_Asset__c,IF_Coverage_Real_Asset__c,
                                            CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Conclusion_Date__c,Product2.Category4__c,
                                            Product2.ServiceCategory__c,Product2.Category3__c 
                                            FROM Asset_Hospital__r 
                                            WHERE Product2.ServiceCategory__c != null 
                                            AND Product2.Maintenance_Price_Year__c != 0
                                            AND Status != '廃棄'
                                            AND Status != '待报废'
                                            AND IF_StopParts_production__c != '1'
                                            AND ((SerMarGuranteeType__c = null AND Extend_Gurantee_DateTo__c = null) 
                                            OR (SerMarGuranteeType__c!=null AND Extend_Gurantee_DateTo__c < :egdTime) 
                                            OR CurrentContract__c = null) ) ,
                                            (SELECT Id ,Target_Rigid_Mirror_2__c,Target_Soft_Mirror_2__c,Target_Correlation_Lightsource__c,Account_HP__c,OCSM_Period_half__c 
                                                FROM Account_Servicetarget__r 
                                                WHERE OCSM_Period_half__c = :OCSM_Period_half 
                                                AND OCSM_Period__c = :OCSM_Period)
                                        FROM Account WHERE Id IN:hospIds]);
    }
 
    global void execute(Database.BatchableContext BC, list<Account> accList) {
        system.debug('执行execute');
 
        List<Asset> assetList = new List<Asset>();
        List<Account_Service_Of_Target__c> targetObjs = new List<Account_Service_Of_Target__c>(); 
        for(Account acc:accList){
            acc.IF_Coverage_Target_HP__c = '1';
            // 覆盖目标(硬)
            Integer mirror_1 = 0;
            // 覆盖目标(软)
            Integer mirror_2 = 0;
            //覆盖目标(周边)
            Integer mirror_3 = 0;
            for(Asset ass: acc.Asset_Hospital__r){
                ass.IF_Coverage_Target_Asset__c = '1';
                assetList.add(ass);
                if (ass.Product2.ServiceCategory__c == '硬性镜') {
                    mirror_1++;
                }
                if(ass.Product2.ServiceCategory__c =='软性镜'){
                    mirror_2++;
                }
                if (ass.Product2.ServiceCategory__c == '周边') {
                    mirror_3++;
                }   
            }
            System.debug(LoggingLevel.INFO, '*** mirror_1: ' + mirror_1);
            System.debug(LoggingLevel.INFO, '*** mirror_2: ' + mirror_2);
            System.debug(LoggingLevel.INFO, '*** mirror_3: ' + mirror_3);
            if(acc.Account_Servicetarget__r.size() > 0){
 
                for(Account_Service_Of_Target__c asotOne: acc.Account_Servicetarget__r){
                    asotOne.Coverage_Target_Account__c = true;
                    asotOne.Target_Rigid_Mirror_2__c += mirror_1;
                    asotOne.Target_Soft_Mirror_2__c += mirror_2;
                    asotOne.Target_Correlation_Lightsource__c += mirror_3;
                    targetObjs.add(asotOne);
                }
            }else{
                Account_Service_Of_Target__c asot1 = new Account_Service_Of_Target__c();
                asot1.Account_HP__c = acc.Id;
                asot1.Coverage_Target_Account__c = true;
                asot1.Target_Rigid_Mirror_2__c = mirror_1;
                asot1.Target_Soft_Mirror_2__c = mirror_2;
                asot1.Target_Correlation_Lightsource__c = mirror_3;
                asot1.OCSM_Period__c = OCSM_Period; 
                asot1.OCSM_Period_half__c = OCSM_Period_half;
                targetObjs.add(asot1);
            }
 
        }
 
        Oly_TriggerHandler.bypass('AssetTrigger');
        system.debug('执行update AssetsTarget前');
        update assetList;  
        system.debug('执行update accList前'); 
        Oly_TriggerHandler.bypass('AccountTrigger');
        update accList;  
        UpSert targetObjs;
    }
 
    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nEquipmentRealCoverageBatch 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;
    }
}