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
/**************************************************************************************************
@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;
    public Date geTIme;
    global EquipmentCoverageTargetBatch() {
        this.query = query;
        // OCSM_Period = 'FY'+(toDayTime.year()+1);
    }
 
    global EquipmentCoverageTargetBatch(List < String > accountIdList) {
        this.query = query;
        // OCSM_Period = 'FY'+(toDayTime.year()+1);
        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';
        }
        if(toDayTime.month() >= 1 && toDayTime.month() <= 3){
            OCSM_Period = 'FY'+(toDayTime.year());
        }else{
            OCSM_Period = 'FY'+(toDayTime.year()+1);
        }
        // 5条以上软性镜医院&&医院有效
        egdTime = Date.newInstance(toDayTime.year()+1,3,31);
        geTIme = Date.newInstance(3999,12,31);
        String query = 'SELECT Id,Hospital__c,Hospital__r.name,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,OwnershipMachine_No__c,SerialNumber '
                                            +' FROM Asset '
                                            +' WHERE Product2.ServiceCategory__c != null '
                                            +' AND OwnershipMachine_No__c!=\'A22004A\' AND OwnershipMachine_No__c!=\'A37026A\' AND OwnershipMachine_No__c!=\'A4676A\' AND OwnershipMachine_No__c!=\'WA02946A\''
                                            +' AND Hospital__r.IF_Coverage_Target_HP__c = \'1\''
                                            +' AND (Product2.Maintenance_Price_Year__c != 0  and Product2.Maintenance_Price_Year__c != null)'
                                            +' AND (Status = \'使用中\' or Status = \'未使用\' or Status = \'不明\')';
        if (accountIdList != null && accountIdList.size() > 0) {
            query += ' AND hospital__c IN :accountIdList ';
        }                                  
             query += ' AND (IF_StopParts_production__c != \'1\' or Product2.PartSupplyFinishDate__c = null)'
                      +' AND (SerMarGuranteeType__c = null' 
                      +' OR (SerMarGuranteeType__c!=null AND Guarantee_period_for_products__c < :egdTime))'
                      +' ORDER BY Hospital__c';
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Asset> assList) {
        system.debug('执行execute');
        List<String> accIds = new List<String>();
        Set<String> OlympusList = new Set<String>();
        Integer i = 0;
        for(Asset ass1:assList){
            if (ass1.Hospital__r.name.contains('Olympus社内')) {
              OlympusList.add(ass1.OwnershipMachine_No__c+ass1.SerialNumber);
            }
            accIds.add(ass1.Hospital__c);
        }  
        List<Asset> assetList = new List<Asset>();
        Set<String> accIdSet = new Set<String>();
        List<Account_Service_Of_Target__c> targetObjs = new List<Account_Service_Of_Target__c>(); 
        Map<String,Account_Service_Of_Target__c> targetMap = new Map<String,Account_Service_Of_Target__c>();
        for(Account_Service_Of_Target__c target:[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_Service_Of_Target__c 
                                                WHERE OCSM_Period_half__c = :OCSM_Period_half 
                                                AND OCSM_Period__c = :OCSM_Period
                                                AND Account_HP__c IN:accIds]){
            targetMap.put(target.Account_HP__c,target);
        }
 
        
        // for(asset assOlympus:[select id,name,OwnershipMachine_No__c,SerialNumber 
        //                         from asset 
        //                         where Hospital__r.name like  '%Olympus社内%']){
        //     // 把医院名为Olympus社内的型号和机身编码放入set后续做存在判断
            
        // }
        // Account_Service_Of_Target__c asot = null;
        for(Asset ass:assList){
            
            if(!accIdSet.contains(ass.Hospital__c)){
                if(!targetMap.containskey(ass.Hospital__c)){
                    // Account_Service_Of_Target__c asot = targetMap.get(ass.Hospital__c);
                    // asot.Target_Rigid_Mirror_2__c = 0;
                    // asot.Target_Soft_Mirror_2__c = 0;
                    // asot.Target_Correlation_Lightsource__c = 0;
 
                // }else{
                    Account_Service_Of_Target__c asot = new Account_Service_Of_Target__c();
                    asot.Account_HP__c = ass.Hospital__c;
                    asot.Coverage_Target_Account__c = true;
                    asot.Target_Rigid_Mirror_2__c = 0;
                    asot.Target_Soft_Mirror_2__c = 0;
                    asot.Target_Correlation_Lightsource__c = 0;
                    asot.OCSM_Period__c = OCSM_Period; 
                    asot.OCSM_Period_half__c = OCSM_Period_half;
                    targetMap.put(ass.Hospital__c,asot);
                }
                accIdSet.add(ass.Hospital__c);
            }
            ass.IF_Coverage_Target_Asset__c = '1';
            // 型号+机身编码
            String assTarget = ass.OwnershipMachine_No__c+ass.SerialNumber;
            if(OlympusList.contains(assTarget)){
                ass.IF_Coverage_Target_Asset__c = '0';
            }
            assetList.add(ass);
            if (!OlympusList.contains(assTarget)){
                if (ass.Product2.ServiceCategory__c == '硬性镜') {
                    targetMap.get(ass.Hospital__c).Target_Rigid_Mirror_2__c ++;
                }
                if(ass.Product2.ServiceCategory__c =='软性镜'){
                    targetMap.get(ass.Hospital__c).Target_Soft_Mirror_2__c ++;
                }
                if (ass.Product2.ServiceCategory__c == '周边') {
                    targetMap.get(ass.Hospital__c).Target_Correlation_Lightsource__c ++;
                }
            }
            i++;
        }
        system.debug('一共有'+i+'个设备');
 
        Oly_TriggerHandler.bypass('AssetTrigger');
        Oly_TriggerHandler.bypass('AssetHandlerCheck');
        system.debug('执行update AssetsTarget前');
        update assetList;  
        system.debug('执行update accList前'); 
        Oly_TriggerHandler.bypass('NFM701ControllerHandler');
        Oly_TriggerHandler.bypass('UpdateContractAimAmountHandler');
        UpSert targetMap.values();
    }
 
    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;
    }
}