高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
// todo 可用 report api实现
// <runtest>FixtureRemindControllerTest</runtest>
// <runtest>FixtureRemindBatchTest</runtest>
public without sharing class FixtureRemindUtil {
    public Map<String, Integer> eastMap {set;get;} // 华东
    public Map<String, Integer> eastConsumMap {set;get;} // 华东耗材
    public Map<String, Integer> southMap {set;get;} // 南方
    public Map<String, Integer> northMap {set;get;} // 北方
    public Map<String, Integer> totalMap {set;get;} // 合计
    public final static List<String> STATUS_LIST {set;get;}
    public final static List<String> CONSUM_STATUS_LIST {set;get;}
    private static Map<String, String> RENTAL_DETAIL_WHERE_MAP;
    private static Map<String, String> CONSUM_DETAIL_WHERE_MAP;
    private static Map<String, String> RENTAL_APPLY_WHERE_MAP;
    private static Map<String, String> CONSUM_APPLY_WHERE_MAP;
    private static Map<String, String> STATUS_NAME_MAP;
    private static Map<String, String> CONSUM_STATUS_NAME_MAP;
    private static Map<String, String> LABEL_API_MAP;
    private OlympusCalendar__c today;
    private String nowTimeOption; 
    public FixtureRemindUtil(){
        northMap = new Map<String, Integer>();
        southMap = new Map<String, Integer>();
        eastMap = new Map<String, Integer>();
        eastConsumMap = new Map<String, Integer>();
        totalMap = new Map<String, Integer>();
        try{
            today = [SELECT Before_1_WorkDay__c FROM OlympusCalendar__c WHERE Date__c=:System.today()];
        }
        catch(Exception e){
            today = new OlympusCalendar__c(Date__c=System.today(), Before_1_WorkDay__c = System.today().addDays(-1));
        }
        nowTimeOption = nowTimeToOption();
    }
    public void init() {
 
        resetAllMaps();
        List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [
            SELECT RAESD_Status_Text__c
                 , Rental_Apply__r.Loaner_centre_mail_address__c
                 , Lost_item_check_time_Final__c
                 , Repair_Status_F__c
                 , Return_DeliverySlip__c
                 , EquipmentSet_Detail_Status_Status__c
              FROM Rental_Apply_Equipment_Set_Detail__c
             WHERE ((Is_Body_F__c = true 
                       AND (RAESD_Status_Text__c IN:STATUS_NAME_MAP.keySet()
                            // or 待欠品确认件数
                            OR (RAESD_Status_Text__c = '欠品中' AND Return_DeliverySlip__c != null)
                            // or 待回收后检测件数
                            OR (RAESD_Status_Text__c = '修理中' AND Repair_Status_F__c = '修理完毕')
                        )
                    )
                // or 欠品中件数
                //OR (RAESD_Status_Text__c = '欠品中' AND Lost_item_check_time_Final__c >= :today.Before_1_WorkDay__c)
                //update lxy 2021/10/13 去掉欠品确认时间(最终)≥上一个工作日条件
                //update by rentx 2021-10-18 start 
                 OR (RAESD_Status_Text__c = '欠品中')
                // or 待修理
                OR (RAESD_Status_Text__c = '待修理' AND Is_Body_F__c = false))
                //SFDC-BZT44W add by rentx 2021-04-07 start 
                AND Rental_Apply__r.RecordType.DeveloperName != 'AgencyRequest'
                //SFDC-BZT44W add by rentx 2021-04-07 end
        ];
 
        for(Rental_Apply_Equipment_Set_Detail__c  raesd : raesdList) {
            String show_status = '';
            if(STATUS_NAME_MAP.containsKey(raesd.RAESD_Status_Text__c)) {
                show_status = STATUS_NAME_MAP.get(raesd.RAESD_Status_Text__c);
            }
            else if (raesd.RAESD_Status_Text__c == '欠品中' && raesd.Return_DeliverySlip__c != null) {
                show_status = '待欠品确认件数';
            }
            //else if(raesd.RAESD_Status_Text__c == '欠品中' && raesd.Lost_item_check_time_Final__c >= today.Before_1_WorkDay__c){
            //update lxy 2021/10/13 去掉欠品确认时间(最终)≥上一个工作日条件
            // else if(raesd.RAESD_Status_Text__c == '欠品中'){
            //     show_status = '欠品中件数';
            // }
            //update by rentx 欠品未回寄并且是主体或者是附属品的  状态不是 确认遗失 start
            else if(raesd.RAESD_Status_Text__c == '欠品中' && raesd.EquipmentSet_Detail_Status_Status__c != '确认遗失' ){
                show_status = '欠品中件数';
            }
            //update by rentx 欠品未回寄并且是主体或者是附属品的  状态不是 确认遗失 end
            else if(raesd.RAESD_Status_Text__c == '修理中' && raesd.Repair_Status_F__c == '修理完毕'){
                show_status = '待回收后检测件数';
            }
            else {
                continue;
            }
            if(String.isNotBlank(raesd.Rental_Apply__r.Loaner_centre_mail_address__c)){
                switch on raesd.Rental_Apply__r.Loaner_centre_mail_address__c.toLowerCase() {
                    when 'ocm_asset@olympus.com.cn'{
                        northMap.put(show_status, northMap.get(show_status) + 1);
                    }
                    when 'ocm_assetgz@olympus.com.cn'{
                        southMap.put(show_status, southMap.get(show_status) + 1);
                    }
                    when 'ocm_assetsh@olympus.com.cn'{
                        eastMap.put(show_status, eastMap.get(show_status) + 1);
                    }
                }
            }
        }
        // 待确认签收数
        List<Rental_Apply__c> raList = [
                SELECT Id
                     , Loaner_centre_mail_address__c
                FROM Rental_Apply__c
                WHERE Bollow_Date__c != null
                AND HP_received_sign_day__c != null
                AND AssetManageConfirm__c = false
                AND HP_received_sign_NG__c = false
                AND RA_Status__c != '完了'
                // SFDC-BZT44W add by rentx 2021-04-07 start
                AND RecordType.DeveloperName != 'AgencyRequest'
                //SFDC-BZT44W add by rentx 2021-04-07 end
        ];
        for(Rental_Apply__c ra:raList){
            if(String.isNotBlank(ra.Loaner_centre_mail_address__c)){
                switch on ra.Loaner_centre_mail_address__c.toLowerCase() {
                    when 'ocm_asset@olympus.com.cn'{
                        northMap.put('待确认签收单数', northMap.get('待确认签收单数') + 1);
                    }
                    when 'ocm_assetgz@olympus.com.cn'{
                        southMap.put('待确认签收单数', southMap.get('待确认签收单数') + 1);
                    }
                    when 'ocm_assetsh@olympus.com.cn'{
                        eastMap.put('待确认签收单数', eastMap.get('待确认签收单数') + 1);
                    }
                }
            }
        }
        for(String show_status:totalMap.keySet()){
            totalMap.put(show_status, eastMap.get(show_status) + southMap.get(show_status) + northMap.get(show_status));
        }
        // 耗材部分
        List<Consum_Apply_Equipment_Set_Detail__c > caesdList = [
                SELECT RAESD_Status__c
                     , Asset_Center_Confirm_Time__c
                     , Consum_Apply__r.AssetManageConfirm__c
                  FROM Consum_Apply_Equipment_Set_Detail__c
                 WHERE RAESD_Status__c IN:CONSUM_STATUS_NAME_MAP.keySet()
                    OR (RAESD_Status__c='申请者收货NG' AND Asset_Center_Confirm_Time__c = null)
                    OR (RAESD_Status__c='已回寄' AND Consum_Apply__r.AssetManageConfirm__c = true)
        ];
        Set<Id> caIdSet = new Set<Id>();
        for(Consum_Apply_Equipment_Set_Detail__c   caesd : caesdList){
            String show_status = '';
            if(CONSUM_STATUS_NAME_MAP.containsKey(caesd.RAESD_Status__c)) {
                show_status = CONSUM_STATUS_NAME_MAP.get(caesd.RAESD_Status__c);
            }
            else if (caesd.RAESD_Status__c == '申请者收货NG'
                && caesd.Asset_Center_Confirm_Time__c == null){
                show_status = '到货NG待确认数量';
            }
            else if(caesd.RAESD_Status__c == '已回寄'
                && caesd.Consum_Apply__r.AssetManageConfirm__c){
                show_status = '待收货件数';
            }
            else {
                continue;
            }
            eastConsumMap.put(show_status, eastConsumMap.get(show_status) + 1);
        }
        List<Consum_Apply__c> caList = [
                SELECT Id
                FROM Consum_Apply__c
                WHERE Bollow_Date__c != null
                  AND Consum_Trial_Update_Time__c != null
                  AND AssetManageConfirm__c = false
                  AND HP_received_sign_NG__c = false
                  AND RA_Status__c != '完了'
                  AND RA_Status__c != '取消'
        ];
        eastConsumMap.put('待确认试用表数量', caList.size());
    }
    // 按给定状态列表初始化map
    private void initStatusMap(Map<String, Integer> tempMap, List<String> show_status_list) {
        for(String show_status : show_status_list){
            tempMap.put(show_status, 0);
        }
    }
    public void resetAllMaps() {
        initStatusMap(northMap, STATUS_LIST);
        initStatusMap(southMap, STATUS_LIST);
        initStatusMap(eastMap, STATUS_LIST);
        initStatusMap(totalMap, STATUS_LIST);
        initStatusMap(eastConsumMap, CONSUM_STATUS_LIST);
    }
    static {
        STATUS_LIST = new List<String> {
            '待分配件数',
            '暂定分配件数',
            '排队中件数',
            '待出库指示件数',
            '待下架件数',
            '待出库前检测件数',
            '待发货件数',
            '待确认签收单数',
            '待欠品确认件数',
            '待CDS件数',
            '待回收后检测件数',
            '待上架件数',
            '欠品中件数',
            '待报修件数'
        };
        CONSUM_STATUS_LIST = new List<String> {
            '待分配件数',
            '待出库指示件数',
            '待发货件数',
            '到货NG待确认数量',
            '待确认试用表数量',
            '待收货件数'
        };
        // 借出明细状态名 => 显示状态名
        STATUS_NAME_MAP = new Map<String, String> {
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Fen_Pei.ordinal())       => '待分配件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Zan_Ding_Fen_Pei.ordinal())  => '暂定分配件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Pai_Dui_Zhong.ordinal())          => '排队中件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Fen_Pei.ordinal())       => '待出库指示件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Chu_Ku_Zhi_Shi.ordinal())       => '待下架件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Xia_Jia.ordinal())          => '待出库前检测件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Chu_Ku_Qian_Yi_Jian_Ce.ordinal())     => '待发货件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Hui_Ji.ordinal())     => '待欠品确认件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Hui_Shou.ordinal())             => '待CDS件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Hui_Shou_Hou_Yi_CDS.ordinal()) => '待回收后检测件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Shang_Jia.ordinal()) => '待上架件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Zhi_Bao_Fei_Qu.ordinal()) => '待上架件数',
            FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Xiu_Li.ordinal()) => '待报修件数'
        };
        // 耗材明细状态名 => 显示状态名
        CONSUM_STATUS_NAME_MAP = new Map<String, String> {
            '待分配'      => '待分配件数',
            '暂定分配'    => '待分配件数',
            '已分配'      => '待出库指示件数',
            '已出库指示'  => '待发货件数'
        };
        //
        LABEL_API_MAP = createLabelApiMap();
    }
    // 创建快照记录
    public FixtureRemindSnapshot__c createSnapshotRecord(String region) {
        FixtureRemindSnapshot__c frs = new FixtureRemindSnapshot__c();
        Map<String, Integer> snapMap = null;
        switch on region {
            when '华东'{
                for(String label : this.eastConsumMap.keySet()){
                    String objlabel = label + '(耗材)';
                    String api = LABEL_API_MAP.get(objlabel);
                    frs.put(api, this.eastConsumMap.get(label));
                }
                snapMap = this.eastMap;
            }
            when '北方'{
                snapMap = this.northMap;
            }
            when '南方'{
                snapMap = this.southMap;
            }
        }
        for(String label : snapMap.keySet()){
            String api = LABEL_API_MAP.get(label);
            frs.put(api, snapMap.get(label));
        }
 
        frs.Date__c = System.today();
        frs.Time__c = nowTimeOption;
        frs.Region__c = region;
        return frs;
    }
    // 时间=> 字段列表中选项
    @TestVisible private String nowTimeToOption() {
        DateTime now = System.now();
 
        if(now.time() < Time.newInstance(11,30,0,0)) {
            return '09:00';
        } 
        else if(now.time() < Time.newInstance(13,0,0,0)) {
            return '11:30';
        }
        else if(now.time() < Time.newInstance(14,0,0,0)){
            return '13:00';
        }
        else if(now.time() < Time.newInstance(15,0,0,0)){
            return '14:00';
        }
        else if(now.time() < Time.newInstance(17,30,0,0)){
            return '15:00';
        }
        else{
            return '17:30';
        }
    }
    // label=>api
    @TestVisible private static Map<String, String> createLabelApiMap(){
        Map<String,String> apiMap = new Map<String,String>();
        SObjectType sotype = Schema.getGlobalDescribe().get('FixtureRemindSnapshot__c');
        Map<String,Schema.SObjectField> mfields = sotype.getDescribe().fields.getMap();
        for(String strField:mfields.keySet()) {
            SObjectField fl = mfields.get(strField);
            apiMap.put(fl.getDescribe().getlabel(), strField);
        }
        return apiMap;
    }
 
}