buli
2023-05-23 07390e2fcb4adf27c928335bf27ae7939c5a80ad
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
/*
**20220507 LJH 提交申请到备品出库时长 历史数据处理
**SFDC-CC6CLJ phase5上线课题131 提交申请到备品出库时长
** ApplyToShipmentWorkTimeHDBatchTest
*/
global class rentalApplyToShipmentWorkTimeHDBatch implements Database.Batchable<sObject> {
    public String query;
    public String sId;
    global rentalApplyToShipmentWorkTimeHDBatch() {
        this.query = query;
    }
    global rentalApplyToShipmentWorkTimeHDBatch(String sId) {
        this.query = query;
        this.sId = sId;
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
 
        HistoryData__mdt hData = [SELECT DatetimeStart__c,DatetimeEnd__c  FROM HistoryData__mdt  limit 1];        
        Datetime startT = hData.DatetimeStart__c;
        Datetime endT = hData.DatetimeEnd__c;
        query = 'select id,name,Rental_Apply__c';
        query += ' , Rental_Apply__r.Request_approval_time__c ,Shippment_loaner_time__c,Add_Request_approval_time__c ';
        query += ' from Rental_Apply_Equipment_Set_Detail__c ';
        query += ' where ApplyToShipmentWorkTime__c = NULL ';
        query += ' AND Shippment_loaner_time__c != NULL';
        if(startT != null){
            query += ' AND Rental_Apply__r.Request_approval_time__c >= :startT ';
        }
        if(endT != null){
            query += ' AND Rental_Apply__r.Request_approval_time__c < :endT ';
        }
        
        if(String.isNotBlank(sId)){
           query += ' AND Id = :sId '; 
        }
        query += 'order by Rental_Apply__c';
        System.debug('query'+query);
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<Rental_Apply_Equipment_Set_Detail__c> eList) {
        system.debug('进来了');
        Map<String, List<Rental_Apply_Equipment_Set_Detail__c>> approvalMap = new Map<String, List<Rental_Apply_Equipment_Set_Detail__c>>();// 20220315 ljh SFDC-CC6CLJ phase5上线课题131 提交申请到备品出库时长
        //循环获取1.最大和最小时间 2.MAP<开始和结束时间,明细list>
        Datetime minStartDt;
        Datetime maxEndDt;
        for (Rental_Apply_Equipment_Set_Detail__c esd : eList) {
            Datetime keyStartDt = esd.Add_Request_approval_time__c != null?esd.Add_Request_approval_time__c:esd.Rental_Apply__r.Request_approval_time__c;
            Datetime keyEndDt = esd.Shippment_loaner_time__c;
            if(minStartDt != null){
                if(minStartDt > keyStartDt){
                    minStartDt = keyStartDt;
                }
            }else{
                minStartDt = keyStartDt;
            }
            if(maxEndDt != null){
                if(keyEndDt > maxEndDt){
                    maxEndDt = keyEndDt;
                }
            }else{
                maxEndDt = keyEndDt;
            }
            List<Rental_Apply_Equipment_Set_Detail__c> tempRaesdL;
            String key = keyStartDt.getTime()+';'+keyEndDt.getTime();
            if(approvalMap.containsKey(key)){
                tempRaesdL = approvalMap.get(key);
            }else{
                tempRaesdL = new List<Rental_Apply_Equipment_Set_Detail__c>();
            }
            tempRaesdL.add(esd);                        
            approvalMap.put(key,tempRaesdL);
        }
        map<String,Decimal> ApplyToShipmentMap = new map<String,Decimal>();
        if(approvalMap.size() > 0 ){
            List<String> dtList = new List<String>(approvalMap.keySet());
            List<OlympusCalendar__c> ocList = [SELECT Id, Date__c,IsWorkDay__c 
                             FROM OlympusCalendar__c
                            WHERE Date__c >= :minStartDt.date()
                              AND Date__c <= :maxEndDt.date()
                            ORDER BY Date__c ASC];
            Map<Date,String> ocMap = new Map<Date,String>();
            for(OlympusCalendar__c oc:ocList){
                String IsWorkDay = oc.IsWorkDay__c.format();
                ocMap.put(oc.Date__c,IsWorkDay);
            }              
            for(String dt:dtList){
                Boolean startFlag = false;
                Boolean endFlag = false;
                Long startDateL =  Long.valueOf(dt.split(';')[0]);
                Long endTimeL = Long.valueOf(dt.split(';')[1]);
                Datetime startTime = DateTime.newInstance(startDateL);
                Date startDate = Date.newInstance(startTime.year(),startTime.month(),startTime.day());
                Datetime endTime = DateTime.newInstance(endTimeL);
                Date endDate = Date.newInstance(endTime.year(),endTime.month(),endTime.day());
                // 审批时间是非奥林巴斯工作日  
                if(ocMap.get(startDate) == '0'){
                    for(OlympusCalendar__c oc:ocList){
                        if( startDate < oc.Date__c && oc.IsWorkDay__c == 1){
                            startTime = Datetime.newInstance(oc.Date__c.year(),oc.Date__c.month(),oc.Date__c.day(),0,0,0);
                            startDate = oc.Date__c;
                            startFlag = true;
                            break;
                        }
                    }
                }
                // 发货时间是非奥林巴斯工作日
                if(ocMap.get(endDate) == '0'){
                    for(Integer i = ocList.size() - 1; i >= 0;i--){
                        if(endDate > ocList[i].Date__c && ocList[i].IsWorkDay__c == 1){
                            endTime = Datetime.newInstance(ocList[i].Date__c.addDays(1).year(),ocList[i].Date__c.addDays(1).month(),ocList[i].Date__c.addDays(1).day(),0,0,0);
                            endDate = ocList[i].Date__c.addDays(1);
                            endFlag = true;
                            break;
                        }
                    }
                }
                Decimal timeDifLast;
                if(ocList[0].IsWorkDay__c == 0 && ocList[ocList.size() - 1].IsWorkDay__c == 0 && !startFlag && !endFlag){
                    timeDifLast = 0;
                }else{
                    Long startL = startTime.getTime();
                    Long tendL = endTime.getTime();
                    Long timeDif = tendL - startL;                            
                    Decimal time11 = timeDif*1.00;
                    Decimal time12 = 24*3600*1000*1.00;
                    timeDifLast = time11/time12;                            
                    Integer tempWeek = 0;
                    for(OlympusCalendar__c oc:ocList){
                        if(oc.IsWorkDay__c == 0 && startDate < oc.Date__c && oc.Date__c < endDate){
                            tempWeek++;
                        }
                    }
                    timeDifLast = timeDifLast - tempWeek;
                }
                // dtestLast 四舍五入 保留1位小数
                for(Rental_Apply_Equipment_Set_Detail__c raesd00:approvalMap.get(dt)){
                    ApplyToShipmentMap.put(raesd00.Id,timeDifLast.setScale(1));
                }
            }
        }
        List<Rental_Apply_Equipment_Set_Detail__c> upeList = new List<Rental_Apply_Equipment_Set_Detail__c>();
        for (Rental_Apply_Equipment_Set_Detail__c esd : eList) {
            if(ApplyToShipmentMap.containsKey(esd.Id)){
                Rental_Apply_Equipment_Set_Detail__c temp  = new Rental_Apply_Equipment_Set_Detail__c(); 
                temp.id = esd.Id;
                temp.ApplyToShipmentWorkTime__c = ApplyToShipmentMap.get(esd.Id);
                upeList.add(temp);
            }
        }
        update upeList;
    }
 
    global void finish(Database.BatchableContext BC) {
 
    }
    public static void justForTest() {
        Integer i = 0;
       
    }
}