Commit 5430094111ff81317f7f859abf847dfc5d2ec506

Authored by 王通
1 parent 854809d8

嘉定公司映射修改

src/main/java/com/bsth/server_ws/util/WSDataConver.java
1 -package com.bsth.server_ws.util;  
2 -  
3 -import com.bsth.entity.DutyEmployee;  
4 -import com.bsth.entity.OilInfo;  
5 -import com.bsth.entity.SchedulePlanInfo;  
6 -import com.bsth.entity.ScheduleRealInfo;  
7 -import com.bsth.server_ws.attendance.entity.Jsy_attendance;  
8 -import com.bsth.server_ws.park_station.dto.LsLcPb;  
9 -import com.bsth.server_ws.waybill.entity.*;  
10 -import com.bsth.util.Arith;  
11 -import com.bsth.util.ConvertUtil;  
12 -import com.google.common.collect.ArrayListMultimap;  
13 -import org.apache.commons.lang3.StringUtils;  
14 -import org.slf4j.Logger;  
15 -import org.slf4j.LoggerFactory;  
16 -  
17 -import java.lang.reflect.Field;  
18 -import java.text.ParseException;  
19 -import java.text.SimpleDateFormat;  
20 -import java.util.*;  
21 -  
22 -/**  
23 - * Created by panzhao on 2017/3/15.  
24 - */  
25 -public class WSDataConver {  
26 -  
27 - /**  
28 - * 格式编码和名称映射,与老系统保持一致  
29 - */  
30 - private static Map<String, String> gsMap;  
31 -  
32 - static Logger logger = LoggerFactory.getLogger(WSDataConver.class);  
33 -  
34 - static {  
35 - gsMap = new HashMap<>();  
36 - gsMap.put("55", "上南公司");  
37 - gsMap.put("55_4", "上南一分公司");  
38 - gsMap.put("55_3", "上南六分公司");  
39 - gsMap.put("55_1", "上南二分公司");  
40 - gsMap.put("55_2", "上南三分公司");  
41 - gsMap.put("22", "金高公司");  
42 - gsMap.put("22_2", "二分公司");  
43 - gsMap.put("22_1", "四分公司");  
44 - gsMap.put("22_3", "三分公司");  
45 - gsMap.put("22_5", "一分公司");  
46 - gsMap.put("05", "杨高公司");  
47 - gsMap.put("05_5", "杨高分公司");  
48 - gsMap.put("05_6", "周浦分公司");  
49 - gsMap.put("05_3", "芦潮港分公司");  
50 - gsMap.put("05_1", "川沙分公司");  
51 - gsMap.put("26", "南汇公司");  
52 - gsMap.put("26_3", "南汇三分");  
53 - gsMap.put("26_2", "南汇二分");  
54 - gsMap.put("26_1", "南汇一分");  
55 - gsMap.put("26_4", "南汇维修公司");  
56 - }  
57 -  
58 - /**  
59 - * 将班次list 转换成 getCurrentDayPlan 函数需要的格式  
60 - *  
61 - * @param list  
62 - * @return [0:日期,1:线路名称,2:路牌名称,3:车辆自编号,4:,5:,6:起点时间,7:终点时间,8:起点站名称,9:终点站名称,10:班次类型]  
63 - */  
64 - public static String[] to_getCurrentDayPlan(List<ScheduleRealInfo> list) {  
65 - if (list == null || list.size() == 0)  
66 - return new String[0];  
67 -  
68 - Map<String, String> bcTypeMap = new HashMap<>();  
69 - bcTypeMap.put("out", "出场");  
70 - bcTypeMap.put("in", "进场");  
71 -  
72 - String[] array = new String[list.size()];  
73 - StringBuilder sb;  
74 - ScheduleRealInfo sch;  
75 - int len = list.size();  
76 - for(int i = 0; i < len; i ++){  
77 - sb = new StringBuilder();  
78 - sch = list.get(i);  
79 - sb.append(sch.getScheduleDateStr() + ",");  
80 - sb.append(sch.getXlName() + ",");  
81 - sb.append(sch.getLpName() + ",");  
82 - sb.append(sch.getClZbh() + ",");  
83 - sb.append(",");  
84 - sb.append(",");  
85 - sb.append(sch.getDfsj() + ",");  
86 - sb.append(sch.getZdsj() + ",");  
87 - sb.append(sch.getQdzName() + ",");  
88 - sb.append(sch.getZdzName() + ",");  
89 - sb.append(bcTypeMap.containsKey(sch.getBcType())?bcTypeMap.get(sch.getBcType()):"");  
90 -  
91 - array[i] = sb.toString();  
92 - }  
93 - return array;  
94 - }  
95 -  
96 - /**  
97 - * 将班次list 转换成 returnCCInfo 和 returnJCInfo 函数需要的格式  
98 - *  
99 - * @param list  
100 - * @return [0: 日期, 1: 线路编码, 2: 线路名称, 3: 公司名称, 4: 分公司名称, 5: 路牌, 6: 起点站, 7: 起点计划时间,  
101 - * 8: 起点实际时间, 9: 终点站, 10: 终点计划时间, 11: 终点实际时间, 12: 计划里程, 13: 实际里程,  
102 - * 14: 驾驶员, 15: 售票员, 16: 车辆内部编码, 17: 状态(1 为出场。2为进场), 18: 驾驶员名称, 19: 进场顺序号]  
103 - */  
104 - public static String[] to_returnJCCInfo(List<ScheduleRealInfo> list) {  
105 - if(list == null)  
106 - return new String[0];  
107 -  
108 - int size = list.size();  
109 - String[] array = new String[size];  
110 -  
111 - ScheduleRealInfo sch;  
112 - StringBuffer sb;  
113 - for (int i = 0; i < size; i++) {  
114 - sb = new StringBuffer(",");  
115 -  
116 - sch = list.get(i);  
117 - sb.append(sch.getScheduleDateStr() + ",");  
118 - sb.append(sch.getXlBm() + ",");  
119 - sb.append(sch.getXlName() + ",");  
120 - sb.append(gsMap.get(sch.getGsBm()) + ",");  
121 - sb.append(gsMap.get(sch.getGsBm() + "_" + sch.getFgsBm()) + ",");  
122 - sb.append(sch.getLpName() + ",");  
123 - sb.append(sch.getQdzCode() + ",");  
124 - sb.append(sch.getDfsj() + ",");  
125 - sb.append(nvlGetVal(sch.getFcsjActual()) + ",");  
126 - sb.append(sch.getZdzCode() + ",");  
127 - sb.append(sch.getZdsj() + ",");  
128 - sb.append(nvlGetVal(sch.getZdsjActual()) + ",");  
129 - sb.append(nvlGetVal(sch.getJhlc()) + ",");  
130 - sb.append(nvlGetVal(sch.getJhlc()) + ",");  
131 - sb.append(sch.getjGh() + ",");  
132 - sb.append(nvlGetVal(sch.getsGh()) + ",");  
133 - sb.append(sch.getClZbh() + ",");  
134 - sb.append((sch.getBcType().equals("out") ? 1 : 2) + ",");  
135 - sb.append(sch.getjName() + ",");  
136 - //用ID替代老系统的出场顺序号  
137 - sb.append(sch.getId() + ",");  
138 -  
139 - array[i] = sb.substring(1).toString();  
140 - }  
141 - return array;  
142 - }  
143 -  
144 - public static String nvlGetVal(Object val) {  
145 - return val == null ? "" : val.toString();  
146 - }  
147 -  
148 - /**  
149 - * 将实际排班和油耗数据 转换成南汇路单需要的数据格式  
150 - *  
151 - * @param listMap  
152 - * @param oilInfoMap  
153 - * @return  
154 - */  
155 - public static NH_waybill[] to_waybill_NH(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {  
156 - List<String> nbbmArray = new ArrayList<>(listMap.keySet());  
157 -  
158 - NH_waybill[] rs = new NH_waybill[nbbmArray.size()];  
159 - Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");  
160 - //Field lpField = ScheduleRealInfo.class.getDeclaredField("lpName");  
161 -  
162 - List<ScheduleRealInfo> list;  
163 - ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;  
164 - ScheduleRealInfo sch;  
165 - NH_waybill nh_waybill;  
166 - NH_waybillItem nh_waybillItem;  
167 - OilInfo oilInfo;  
168 - for (int i = 0; i < nbbmArray.size(); i++) {  
169 - list = listMap.get(nbbmArray.get(i));  
170 - if (list.size() == 0)  
171 - continue;  
172 - //班次信息  
173 - nh_waybill = new NH_waybill();  
174 - sch = list.get(0);  
175 - //日期  
176 - nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());  
177 - //车辆自编号  
178 - nh_waybill.setM_strNBBM(sch.getClZbh());  
179 - //线路编码  
180 - nh_waybill.setM_strXLBM(sch.getXlBm());  
181 - nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());  
182 -  
183 - //按 驾驶员 分组班次,构造路单子项  
184 - jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);  
185 - for (String jGh : jGhListMap.keySet()) {  
186 - list = jGhListMap.get(jGh);  
187 - nh_waybillItem = new NH_waybillItem();  
188 - //计划里程  
189 - nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));  
190 - //实际计划公里  
191 - nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));  
192 - //实际出场里程  
193 - nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));  
194 - //实际进场里程  
195 - nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));  
196 - //营业公里  
197 - nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));  
198 - //空驶公里  
199 - nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));  
200 - //抽减公里  
201 - nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));  
202 - //烂班公里  
203 - nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));  
204 - //增加公里  
205 - nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));  
206 - //总公里  
207 - nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));  
208 - //烂班公里原因  
209 - nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));  
210 - //抽减公里原因  
211 - nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));  
212 - //计划班次  
213 - nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));  
214 - //实际计划班次  
215 - nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));  
216 - //实际班次 ————> 暂时和实际计划班次相同  
217 - nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));  
218 - //增加班次  
219 - nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));  
220 - //抽减班次  
221 - nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));  
222 - //烂班工时  
223 - nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));  
224 - //路牌  
225 - nh_waybillItem.setM_strLP(list.get(0).getLpName());  
226 - //驾驶员工号  
227 - nh_waybillItem.setM_strJSY(list.get(0).getjGh());  
228 - //售票员工号  
229 - nh_waybillItem.setM_strSPY(nvlGetVal(list.get(0).getsGh()));  
230 - //驾驶员考勤  
231 - nh_waybillItem.setM_strJSYKQ("");  
232 - //售票员考勤  
233 - nh_waybillItem.setM_strSPYKQ("");  
234 - //当班调度员  
235 - nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));  
236 - //营运状态  
237 - nh_waybillItem.setM_strYYZT("");  
238 - //备注  
239 - nh_waybillItem.setM_strBZ("");  
240 -  
241 - oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());  
242 - if (oilInfo != null) {  
243 - //出场存油  
244 - nh_waybillItem.setM_dblCCCY(oilInfo.getCzyl());  
245 - //进场存油  
246 - nh_waybillItem.setM_dblJCCY(oilInfo.getJzyl());  
247 - //加注量1  
248 - nh_waybillItem.setM_dblJZL1(oilInfo.getJzl());  
249 - //加注量2  
250 - nh_waybillItem.setM_dblJZL2(0.0);  
251 - //尿素  
252 - nh_waybillItem.setM_dblNS(oilInfo.getNs());  
253 - //消耗量  
254 - nh_waybillItem.setM_dblYH(oilInfo.getYh());  
255 - //加油地点1  
256 - nh_waybillItem.setM_strJYD1("");  
257 - //加油地点2  
258 - nh_waybillItem.setM_strJYD2("");  
259 - //加油工工号1  
260 - nh_waybillItem.setM_strJYG1("");  
261 - //加油工工号1  
262 - nh_waybillItem.setM_strJYG2("");  
263 - //油耗类型1  
264 - nh_waybillItem.setM_strYHLX1(oilInfo.getRylx());  
265 - //油耗类型2  
266 - nh_waybillItem.setM_strYHLX1("");  
267 - }  
268 -  
269 - nh_waybill.getM_SubInfos().add(nh_waybillItem);  
270 - }  
271 -  
272 - rs[i] = nh_waybill;  
273 - }  
274 - return rs;  
275 - }  
276 -  
277 -  
278 - /**  
279 - * 将实际排班和油耗数据 转换成上南路单需要的数据格式  
280 - *  
281 - * @param listMap  
282 - * @param oilInfoMap  
283 - * @return  
284 - */  
285 - public static SN_waybill[] to_waybill_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap) throws NoSuchFieldException {  
286 -  
287 - List<String> nbbmArray = new ArrayList<>(listMap.keySet());  
288 - SN_waybill[] rs = new SN_waybill[nbbmArray.size()];  
289 - Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");  
290 -  
291 - List<ScheduleRealInfo> list;  
292 - ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;  
293 - ScheduleRealInfo sch;  
294 - SN_waybill sn_waybill;  
295 - SN_waybillItem sn_waybillItem;  
296 -  
297 - OilComp oilComp = new OilComp();  
298 - List<OilInfo> oilArray;  
299 - for (int i = 0; i < nbbmArray.size(); i++) {  
300 - list = listMap.get(nbbmArray.get(i));  
301 - if (list.size() == 0)  
302 - continue;  
303 -  
304 - sch = list.get(0);  
305 - sn_waybill = new SN_waybill();  
306 - sn_waybill.setLine_no(sch.getXlBm());  
307 - sn_waybill.setWork_date(sch.getScheduleDateStr());  
308 - sn_waybill.setComp_id(sch.getFgsBm());  
309 - sn_waybill.setGuidecard(sch.getLpName());  
310 - sn_waybill.setCar_id(sch.getClZbh());  
311 - //实际班次  
312 - sn_waybill.setAct_num(ScheduleCalculator.countSJJHBC(list));  
313 - //晚班实际班次  
314 - sn_waybill.setL_act_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));  
315 - //营业里程  
316 - sn_waybill.setWork_way(ScheduleCalculator.calcYYLC(list));  
317 - //空驶里程  
318 - sn_waybill.setLeisure_way(ScheduleCalculator.calcKSLC(list));  
319 - //总里程  
320 - sn_waybill.setCount_way(ScheduleCalculator.calcZLC(list));  
321 - //路单类型(0普通,1包车)  
322 - sn_waybill.setLd_type("0");  
323 - //油料类型(2、柴油 3、天然气 4、汽油柴油 5、液化气 6、液化气汽油 7、液化气柴油 8、天然气汽油 9、电)  
324 - //暂时全部柴油车  
325 - sn_waybill.setOil_type("2");  
326 -  
327 - //根据车辆获取油量信息  
328 - oilArray = likeGet(oilInfoMap, sch.getClZbh() + "_");  
329 - if (oilArray.size() > 0) {  
330 - Collections.sort(oilArray, oilComp);  
331 - //出厂存油  
332 - sn_waybill.setOut_oil(oilArray.get(0).getCzyl());  
333 - //油料加注  
334 - sn_waybill.setAdd_oil(sumAddOil(oilArray));  
335 - //进场存油  
336 - sn_waybill.setEnd_oil(oilArray.get(oilArray.size() - 1).getJzyl());  
337 - //油料消耗  
338 - sn_waybill.setExpend_oil(countOilExpend(oilArray));  
339 - //非营业用油类型 非营业用油类型(1.常规车2.包车3.加开包车)  
340 - sn_waybill.setNowork_oil_type("1");  
341 - //非营业用油  
342 - sn_waybill.setNowork_oil(0);  
343 - //非营业用油油耗量(保养用油)  
344 - sn_waybill.setNowork_oil1(0);  
345 - //非营业用油油耗量(票务用油)  
346 - sn_waybill.setNowork_oil2(0);  
347 - //非营业用油油耗量(其他用油)  
348 - sn_waybill.setNowork_oil3(0);  
349 - //营业用油  
350 - sn_waybill.setWork_oil(countOilExpend(oilArray));  
351 - //其他营业用油  
352 - sn_waybill.setQt_work_oil(0);  
353 - }  
354 - sn_waybill.setDriver_detail(new ArrayList<SN_waybillItem>());  
355 -  
356 - //按 驾驶员 分组班次,构造路单子项  
357 - jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);  
358 - for (String jGh : jGhListMap.keySet()) {  
359 - list = jGhListMap.get(jGh);  
360 - sn_waybillItem = new SN_waybillItem();  
361 - sch = list.get(0);  
362 - //司机编号  
363 - sn_waybillItem.setDriver_no(sch.getjGh());  
364 - //司机名称  
365 - sn_waybillItem.setDriver_name(sch.getjName());  
366 - //售票员编号  
367 - sn_waybillItem.setBusman_no(sch.getsGh());  
368 - //售票员名称  
369 - sn_waybillItem.setBusman_name(sch.getsName());  
370 - //行驶里程  
371 - sn_waybillItem.setDriver_way(ScheduleCalculator.calcYYLC(list));  
372 - //空驶公里  
373 - sn_waybillItem.setKs_way(ScheduleCalculator.calcKSLC(list));  
374 - //柴油加注量、电加注量同一字段  
375 - sn_waybillItem.setDo_oil_2(countOilExpend(oilArray, sch.getjGh()));  
376 -  
377 - sn_waybill.getDriver_detail().add(sn_waybillItem);  
378 - }  
379 -  
380 - rs[i] = sn_waybill;  
381 - }  
382 - return rs;  
383 - }  
384 -  
385 - /**  
386 - * 将实际排班转换成上南需要损失公里数据  
387 - *  
388 - * @param listMap  
389 - * @return  
390 - */  
391 - public static SN_lossMileage[] to_lossMileage_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap) throws NoSuchFieldException {  
392 - List<String> lineArray = new ArrayList<>(listMap.keySet());  
393 - SN_lossMileage[] rs = new SN_lossMileage[lineArray.size()];  
394 -  
395 - List<ScheduleRealInfo> list;  
396 - ScheduleRealInfo sch;  
397 - for (int i = 0; i < lineArray.size(); i++) {  
398 - list = listMap.get(lineArray.get(i));  
399 -  
400 - sch = list.get(0);  
401 - SN_lossMileage lossMileage = new SN_lossMileage();  
402 - //线路编号  
403 - lossMileage.setLine_id(sch.getXlBm());  
404 - //营运日期  
405 - lossMileage.setWork_date(sch.getScheduleDateStr());  
406 - //分公司编号  
407 - lossMileage.setComp_id(sch.getFgsBm());  
408 - //少驶公里  
409 - lossMileage.setLoss_way(ScheduleCalculator.calcCJLC(list));  
410 - //实际公里  
411 - lossMileage.setAct_way(ScheduleCalculator.calcYYLC(list));  
412 - //计划公里  
413 - lossMileage.setJh_way(ScheduleCalculator.calcJHLC(list));  
414 -  
415 - //路阻损失公里  
416 - lossMileage.setLoss_lz(ScheduleCalculator.calcCJLC2(list, "路阻"));  
417 - //吊慢损失公里  
418 - lossMileage.setLoss_dm(ScheduleCalculator.calcCJLC2(list, "吊慢"));  
419 - //故障损失公里  
420 - lossMileage.setLoss_gz(ScheduleCalculator.calcCJLC2(list, "故障"));  
421 - //纠纷损失公里  
422 - lossMileage.setLoss_jf(ScheduleCalculator.calcCJLC2(list, "纠纷"));  
423 - //肇事损失公里  
424 - lossMileage.setLoss_zs(ScheduleCalculator.calcCJLC2(list, "肇事"));  
425 - //缺人损失公里  
426 - lossMileage.setLoss_qr(ScheduleCalculator.calcCJLC2(list, "缺人"));  
427 - //缺车损失公里  
428 - lossMileage.setLoss_qc(ScheduleCalculator.calcCJLC2(list, "缺车"));  
429 - //客稀损失公里  
430 - lossMileage.setLoss_kx(ScheduleCalculator.calcCJLC2(list, "客稀"));  
431 - //其他损失公里  
432 - lossMileage.setLoss_qt(ScheduleCalculator.calcCJLC2(list, "其他"));  
433 - //配车损失公里  
434 - lossMileage.setLoss_pc(ScheduleCalculator.calcCJLC2(list, "配车"));  
435 - //保养损失公里  
436 - lossMileage.setLoss_by(ScheduleCalculator.calcCJLC2(list, "保养"));  
437 - //气候损失公里  
438 - lossMileage.setLoss_qh(ScheduleCalculator.calcCJLC2(list, "气候"));  
439 - //援外损失公里  
440 - lossMileage.setLoss_yw(ScheduleCalculator.calcCJLC2(list, "援外"));  
441 - //抽减损失公里  
442 - lossMileage.setLoss_cj(ScheduleCalculator.calcCJLC2(list, "抽减"));  
443 -  
444 - //实际班次  
445 - lossMileage.setAct_num(ScheduleCalculator.countSJJHBC(list));  
446 - //早班班次  
447 - lossMileage.setEarly_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.earlyArray(list)));  
448 - //晚班班次  
449 - lossMileage.setLate_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));  
450 - //另加班次  
451 - lossMileage.setL_act_num(ScheduleCalculator.countZJBC(list));  
452 - //早班另加班次  
453 - lossMileage.setL_early_num(ScheduleCalculator.countZJBC(ScheduleCalculator.earlyArray(list)));  
454 - //晚班另加班次  
455 - lossMileage.setL_late_num(ScheduleCalculator.countZJBC(ScheduleCalculator.lastArray(list)));  
456 - //计划班次  
457 - lossMileage.setJ_act_num(ScheduleCalculator.countJHBC(list));  
458 - //早班计划班次  
459 - lossMileage.setJ_early_num(ScheduleCalculator.countJHBC(ScheduleCalculator.earlyArray(list)));  
460 - //晚班计划班次  
461 - lossMileage.setJ_late_num(ScheduleCalculator.countJHBC(ScheduleCalculator.lastArray(list)));  
462 - //放站班次  
463 - lossMileage.setF_act_bc(ScheduleCalculator.countEmpty(list));  
464 - //早班放站班次  
465 - lossMileage.setF_early_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.earlyArray(list)));  
466 - //晚班放站班次  
467 - lossMileage.setF_late_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.lastArray(list)));  
468 - //调头班次  
469 - lossMileage.setDt_act_bc(0);  
470 - //早班调头班次  
471 - lossMileage.setDt_early_bc(0);  
472 - //晚班调头班次  
473 - lossMileage.setDt_late_bc(0);  
474 - //大间隔班次  
475 - lossMileage.setD_act_num(ScheduleCalculator.countSpaceLg(list));  
476 - //早班大间隔班次  
477 - lossMileage.setD_early_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.earlyArray(list)));  
478 - //晚班大间隔班次  
479 - lossMileage.setD_late_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.lastArray(list)));  
480 - //最大间隔时间  
481 - lossMileage.setD_act_max(ScheduleCalculator.calcMaxSpace(list));  
482 - //故障分  
483 - lossMileage.setLoss_gzf(0);  
484 - //故障次数  
485 - lossMileage.setLoss_gzcs(0);  
486 -  
487 -  
488 - rs[i] = lossMileage;  
489 - }  
490 - return rs;  
491 - }  
492 -  
493 - private static double countOilExpend(List<OilInfo> oilArray) {  
494 - double sum = 0;  
495 - for (OilInfo oilInfo : oilArray) {  
496 - sum = Arith.add(sum, oilInfo.getYh());  
497 - }  
498 - return sum;  
499 - }  
500 -  
501 - private static double sumAddOil(List<OilInfo> oilArray) {  
502 - double sum = 0;  
503 - for (OilInfo oilInfo : oilArray) {  
504 - sum = Arith.add(sum, oilInfo.getJzl());  
505 - }  
506 - return sum;  
507 - }  
508 -  
509 - private static double countOilExpend(List<OilInfo> oilArray, String jGh) {  
510 - double sum = 0;  
511 - for (OilInfo oilInfo : oilArray) {  
512 - if (oilInfo.getJsy().equals(jGh))  
513 - sum = Arith.add(sum, oilInfo.getYh());  
514 - }  
515 - return sum;  
516 - }  
517 -  
518 - public static <T> List<T> likeGet(Map<String, T> map, String key) {  
519 - Set<String> ks = map.keySet();  
520 - List<T> list = new ArrayList<>();  
521 -  
522 - if (StringUtils.isEmpty(key))  
523 - return list;  
524 -  
525 - for (String k : ks) {  
526 - if (k.indexOf(key) != -1) {  
527 - list.add(map.get(k));  
528 - }  
529 - }  
530 - return list;  
531 - }  
532 -  
533 - /**  
534 - * 将数据转换成南汇工资系统需要的驾驶员考勤数据  
535 - *  
536 - * @param plans  
537 - * @param reals  
538 - * @param types  
539 - * @return  
540 - */  
541 - public static Jsy_attendance[] to_jsyAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsySet, Map<String, String> types, String rq) {  
542 - //List<String> ghArray = new ArrayList<>(types.keySet());  
543 - Jsy_attendance[] rs = new Jsy_attendance[jsySet.size()];  
544 -  
545 - Jsy_attendance attendance;  
546 - SchedulePlanInfo plan;  
547 - ScheduleRealInfo real;  
548 - //String jGh;  
549 -  
550 - int i = 0;  
551 - for(String jGh : jsySet){  
552 - attendance = new Jsy_attendance();  
553 - attendance.setRq(rq);  
554 - //计划  
555 - plan = searchByJsy(plans, jGh);  
556 - //实际  
557 - real = searchRealByJsy(reals, jGh);  
558 - //考勤  
559 - attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));  
560 - //班型  
561 - attendance.setPlanType(types.get(jGh)==null?"1":types.get(jGh));  
562 - //驾驶员工号  
563 - attendance.setjGh(jGh);  
564 - //早晚班类型  
565 - attendance.calcZybType(reals);  
566 -  
567 - //实际计划  
568 - if(real != null){  
569 - attendance.setXlBm(real.getXlBm());  
570 - attendance.setXlName(real.getXlName());  
571 - attendance.setjName(real.getjName());  
572 - attendance.setsGh(real.getsGh());  
573 - attendance.setsName(real.getsName());  
574 - attendance.setCompany(real.getGsBm());  
575 - attendance.setFgsCompany(real.getFgsBm());  
576 - attendance.addLpName(real.getLpName());  
577 - attendance.addCl(real.getClZbh());  
578 - }  
579 - //计划  
580 - else if(plan != null){  
581 - attendance.setXlBm(plan.getXlBm());  
582 - attendance.setXlName(plan.getXlName());  
583 - attendance.setjName(plan.getjName());  
584 - attendance.setsGh(plan.getsGh());  
585 - attendance.setsName(plan.getsName());  
586 - attendance.setCompany(plan.getGsBm());  
587 - attendance.setFgsCompany(plan.getFgsBm());  
588 - attendance.addLpName(plan.getLpName());  
589 - attendance.addCl(plan.getClZbh());  
590 - }  
591 -  
592 - rs[i] = attendance;  
593 - i++;  
594 - }  
595 - return rs;  
596 - }  
597 -  
598 - public static SchedulePlanInfo searchByJsy(List<SchedulePlanInfo> plans, String jGh){  
599 -  
600 - for(SchedulePlanInfo plan : plans){  
601 - if(plan.getjGh().equals(jGh))  
602 - return plan;  
603 - }  
604 - return null;  
605 - }  
606 -  
607 - public static ScheduleRealInfo searchRealByJsy(List<ScheduleRealInfo> reals, String jGh){  
608 -  
609 - for(ScheduleRealInfo sch : reals){  
610 - if(sch.getjGh().equals(jGh))  
611 - return sch;  
612 - }  
613 - return null;  
614 - }  
615 -  
616 - /**  
617 - * 将排班和油耗转换成综合查询需要的数据  
618 - * @param schList  
619 - * @param oilList  
620 - * @return  
621 - */  
622 - public static String[] to_getLSLC_PB(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {  
623 - String[] array = new String[0];  
624 - try {  
625 - //按日期分组数据  
626 - ArrayListMultimap<String, ScheduleRealInfo> schMultimap =  
627 - new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));  
628 -  
629 - ArrayListMultimap<String, OilInfo> oilMultimap =  
630 - new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));  
631 -  
632 - ArrayListMultimap<String, SchedulePlanInfo> planMultimap =  
633 - new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));  
634 -  
635 -  
636 - //月份有多少天  
637 - int year = Integer.parseInt(fdate.substring(0, 4));  
638 - int month = Integer.parseInt(fdate.substring(5, 7));  
639 - Calendar cal = Calendar.getInstance();  
640 - cal.set(Calendar.YEAR,year);  
641 - cal.set(Calendar.MONTH,month - 1);//从0开始  
642 - int maxDate = cal.getActualMaximum(Calendar.DATE);  
643 -  
644 - List<LsLcPb> rs = new ArrayList<>();  
645 - LsLcPb lcPb;  
646 - List<ScheduleRealInfo> pbList;  
647 - List<SchedulePlanInfo> jhList;  
648 - List<OilInfo> yhList;  
649 - String rq,rq2;  
650 - SchedulePlanInfo outPlan;  
651 - int currentDay = cal.get(Calendar.DAY_OF_MONTH);  
652 - for(int i = 1; i <= maxDate; i++){  
653 - lcPb = new LsLcPb();  
654 - lcPb.setDay(i);  
655 -  
656 - rq = fdate + "-" + (i < 10?"0":"") + i;  
657 - rq2 = rq.replaceAll("-", "");  
658 -  
659 - pbList = schMultimap.get(rq);  
660 - yhList = oilMultimap.get(rq2);  
661 - jhList = planMultimap.get(rq2);  
662 -  
663 - if(i < currentDay){  
664 - if(pbList == null || pbList.size() == 0)  
665 - lcPb.setType(4);//休息  
666 - else{  
667 - lcPb.setType(1);  
668 - lcPb.setLckq("");  
669 - if(yhList != null && yhList.size() > 0){  
670 - lcPb.setLcyh(yhList.get(0).getYh());  
671 - }  
672 - lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));  
673 - lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));  
674 - }  
675 - }  
676 - else if (i == currentDay)  
677 - lcPb.setType(3);//今天  
678 - else {  
679 - if(jhList == null || jhList.size() == 0)  
680 - lcPb.setType(4);//休息  
681 - else{  
682 - lcPb.setType(2);  
683 - outPlan = getOutSch(jhList);  
684 - if(null != outPlan){  
685 - lcPb.setPbxl(outPlan.getXlName());  
686 - lcPb.setPblp(outPlan.getLpName());  
687 - lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));  
688 - lcPb.setPbyc(outPlan.getClZbh());  
689 - }  
690 - else  
691 - lcPb.setType(4);//休息  
692 - }  
693 - }  
694 -  
695 - rs.add(lcPb);  
696 - }  
697 -  
698 - //拼接成字符串数组  
699 - array = new String[rs.size()];  
700 - StringBuilder sb;  
701 - for(int i = 0,len=rs.size(); i < len; i++){  
702 - lcPb = rs.get(i);  
703 - sb = new StringBuilder();  
704 -  
705 - sb.append(lcPb.getType());  
706 -  
707 - switch (lcPb.getType()){  
708 - case 1:  
709 - sb.append("," + lcPb.getLckq());  
710 - sb.append("," + lcPb.getLcyh());  
711 - sb.append("," + lcPb.getLcyylc());  
712 - sb.append("," + lcPb.getLcfyylc());  
713 - break;  
714 - case 2:  
715 - sb.append("," + lcPb.getPbxl());  
716 - sb.append("," + lcPb.getPblp());  
717 - sb.append("," + lcPb.getPbbd());  
718 - sb.append("," + lcPb.getPbyc());  
719 - break;  
720 - }  
721 - sb.append("," + lcPb.getDay());  
722 - array[i] = sb.toString();  
723 - }  
724 - } catch (NoSuchFieldException e) {  
725 - logger.error("", e);  
726 - }  
727 - return array;  
728 - }  
729 -  
730 - /**  
731 - * 将排班和油耗转换成综合查询需要的数据  
732 - * @param schList  
733 - * @param oilList  
734 - * @return  
735 - */  
736 - public static List<LsLcPb> to_getLSLC_PB_list(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {  
737 - List<LsLcPb> rs = new ArrayList<>();  
738 - try {  
739 - //按日期分组数据  
740 - ArrayListMultimap<String, ScheduleRealInfo> schMultimap =  
741 - new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));  
742 -  
743 - ArrayListMultimap<String, OilInfo> oilMultimap =  
744 - new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));  
745 -  
746 - ArrayListMultimap<String, SchedulePlanInfo> planMultimap =  
747 - new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));  
748 -  
749 -  
750 - //月份有多少天  
751 - int year = Integer.parseInt(fdate.substring(0, 4));  
752 - int month = Integer.parseInt(fdate.substring(5, 7));  
753 - Calendar cal = Calendar.getInstance();  
754 - cal.set(Calendar.YEAR,year);  
755 - cal.set(Calendar.MONTH,month - 1);//从0开始  
756 - int maxDate = cal.getActualMaximum(Calendar.DATE);  
757 -  
758 - LsLcPb lcPb;  
759 - List<ScheduleRealInfo> pbList;  
760 - List<SchedulePlanInfo> jhList;  
761 - List<OilInfo> yhList;  
762 - String rq,rq2;  
763 - SchedulePlanInfo outPlan;  
764 - int currentDay = cal.get(Calendar.DAY_OF_MONTH);  
765 - for(int i = 1; i <= maxDate; i++){  
766 - lcPb = new LsLcPb();  
767 - lcPb.setDay(i);  
768 -  
769 - rq = fdate + "-" + (i < 10?"0":"") + i;  
770 - rq2 = rq.replaceAll("-", "");  
771 -  
772 - pbList = schMultimap.get(rq);  
773 - yhList = oilMultimap.get(rq2);  
774 - jhList = planMultimap.get(rq2);  
775 -  
776 - if(i < currentDay){  
777 - if(pbList == null || pbList.size() == 0)  
778 - lcPb.setType(4);//休息  
779 - else{  
780 - lcPb.setType(1);  
781 - lcPb.setLckq("");  
782 - if(yhList != null && yhList.size() > 0){  
783 - lcPb.setLcyh(yhList.get(0).getYh());  
784 - }  
785 - lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));  
786 - lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));  
787 - }  
788 - }  
789 - else if (i == currentDay)  
790 - lcPb.setType(3);//今天  
791 - else {  
792 - if(jhList == null || jhList.size() == 0)  
793 - lcPb.setType(4);//休息  
794 - else{  
795 - lcPb.setType(2);  
796 - outPlan = getOutSch(jhList);  
797 - if(null != outPlan){  
798 - lcPb.setPbxl(outPlan.getXlName());  
799 - lcPb.setPblp(outPlan.getLpName());  
800 - lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));  
801 - lcPb.setPbyc(outPlan.getClZbh());  
802 - }  
803 - else  
804 - lcPb.setType(4);//休息  
805 - }  
806 - }  
807 -  
808 - rs.add(lcPb);  
809 - }  
810 - } catch (NoSuchFieldException e) {  
811 - logger.error("", e);  
812 - }  
813 - return rs;  
814 - }  
815 -  
816 - /**  
817 - * HH:mm 格式时间减分钟  
818 - * @param dfsj  
819 - * @param i  
820 - * @return  
821 - */  
822 - private static String minusMinute(String hhmm, int i) {  
823 - try {  
824 - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");  
825 - long t = sdf.parse(hhmm).getTime();  
826 -  
827 - return sdf.format(new Date(t - (i * 60 * 1000)));  
828 - } catch (ParseException e) {  
829 - logger.error("", e);  
830 - }  
831 - return null;  
832 - }  
833 -  
834 - private static SchedulePlanInfo getOutSch(List<SchedulePlanInfo> pbList) {  
835 -  
836 - for(SchedulePlanInfo sch : pbList){  
837 - if(sch.getBcType().equals("out"))  
838 - return sch;  
839 - }  
840 - return null;  
841 - }  
842 -  
843 - public static class OilComp implements Comparator<OilInfo> {  
844 -  
845 - @Override  
846 - public int compare(OilInfo o1, OilInfo o2) {  
847 - return o1.getJcsx() - o2.getJcsx();  
848 - }  
849 - }  
850 -  
851 -  
852 -} 1 +package com.bsth.server_ws.util;
  2 +
  3 +import com.bsth.entity.DutyEmployee;
  4 +import com.bsth.entity.OilInfo;
  5 +import com.bsth.entity.SchedulePlanInfo;
  6 +import com.bsth.entity.ScheduleRealInfo;
  7 +import com.bsth.server_ws.attendance.entity.Jsy_attendance;
  8 +import com.bsth.server_ws.park_station.dto.LsLcPb;
  9 +import com.bsth.server_ws.waybill.entity.*;
  10 +import com.bsth.util.Arith;
  11 +import com.bsth.util.ConvertUtil;
  12 +import com.google.common.collect.ArrayListMultimap;
  13 +import org.apache.commons.lang3.StringUtils;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +
  17 +import java.lang.reflect.Field;
  18 +import java.text.ParseException;
  19 +import java.text.SimpleDateFormat;
  20 +import java.util.*;
  21 +
  22 +/**
  23 + * Created by panzhao on 2017/3/15.
  24 + */
  25 +public class WSDataConver {
  26 +
  27 + /**
  28 + * 格式编码和名称映射,与老系统保持一致
  29 + */
  30 + private static Map<String, String> gsMap;
  31 +
  32 + static Logger logger = LoggerFactory.getLogger(WSDataConver.class);
  33 +
  34 + static {
  35 + gsMap = new HashMap<>();
  36 + gsMap.put("24", "嘉定公交");
  37 + gsMap.put("24_1", "一车队");
  38 + gsMap.put("24_2", "二车队");
  39 + gsMap.put("24_3", "三车队");
  40 + }
  41 +
  42 + /**
  43 + * 将班次list 转换成 getCurrentDayPlan 函数需要的格式
  44 + *
  45 + * @param list
  46 + * @return [0:日期,1:线路名称,2:路牌名称,3:车辆自编号,4:,5:,6:起点时间,7:终点时间,8:起点站名称,9:终点站名称,10:班次类型]
  47 + */
  48 + public static String[] to_getCurrentDayPlan(List<ScheduleRealInfo> list) {
  49 + if (list == null || list.size() == 0)
  50 + return new String[0];
  51 +
  52 + Map<String, String> bcTypeMap = new HashMap<>();
  53 + bcTypeMap.put("out", "出场");
  54 + bcTypeMap.put("in", "进场");
  55 +
  56 + String[] array = new String[list.size()];
  57 + StringBuilder sb;
  58 + ScheduleRealInfo sch;
  59 + int len = list.size();
  60 + for(int i = 0; i < len; i ++){
  61 + sb = new StringBuilder();
  62 + sch = list.get(i);
  63 + sb.append(sch.getScheduleDateStr() + ",");
  64 + sb.append(sch.getXlName() + ",");
  65 + sb.append(sch.getLpName() + ",");
  66 + sb.append(sch.getClZbh() + ",");
  67 + sb.append(",");
  68 + sb.append(",");
  69 + sb.append(sch.getDfsj() + ",");
  70 + sb.append(sch.getZdsj() + ",");
  71 + sb.append(sch.getQdzName() + ",");
  72 + sb.append(sch.getZdzName() + ",");
  73 + sb.append(bcTypeMap.containsKey(sch.getBcType())?bcTypeMap.get(sch.getBcType()):"");
  74 +
  75 + array[i] = sb.toString();
  76 + }
  77 + return array;
  78 + }
  79 +
  80 + /**
  81 + * 将班次list 转换成 returnCCInfo 和 returnJCInfo 函数需要的格式
  82 + *
  83 + * @param list
  84 + * @return [0: 日期, 1: 线路编码, 2: 线路名称, 3: 公司名称, 4: 分公司名称, 5: 路牌, 6: 起点站, 7: 起点计划时间,
  85 + * 8: 起点实际时间, 9: 终点站, 10: 终点计划时间, 11: 终点实际时间, 12: 计划里程, 13: 实际里程,
  86 + * 14: 驾驶员, 15: 售票员, 16: 车辆内部编码, 17: 状态(1 为出场。2为进场), 18: 驾驶员名称, 19: 进场顺序号]
  87 + */
  88 + public static String[] to_returnJCCInfo(List<ScheduleRealInfo> list) {
  89 + if(list == null)
  90 + return new String[0];
  91 +
  92 + int size = list.size();
  93 + String[] array = new String[size];
  94 +
  95 + ScheduleRealInfo sch;
  96 + StringBuffer sb;
  97 + for (int i = 0; i < size; i++) {
  98 + sb = new StringBuffer(",");
  99 +
  100 + sch = list.get(i);
  101 + sb.append(sch.getScheduleDateStr() + ",");
  102 + sb.append(sch.getXlBm() + ",");
  103 + sb.append(sch.getXlName() + ",");
  104 + sb.append(gsMap.get(sch.getGsBm()) + ",");
  105 + sb.append(gsMap.get(sch.getGsBm() + "_" + sch.getFgsBm()) + ",");
  106 + sb.append(sch.getLpName() + ",");
  107 + sb.append(sch.getQdzCode() + ",");
  108 + sb.append(sch.getDfsj() + ",");
  109 + sb.append(nvlGetVal(sch.getFcsjActual()) + ",");
  110 + sb.append(sch.getZdzCode() + ",");
  111 + sb.append(sch.getZdsj() + ",");
  112 + sb.append(nvlGetVal(sch.getZdsjActual()) + ",");
  113 + sb.append(nvlGetVal(sch.getJhlc()) + ",");
  114 + sb.append(nvlGetVal(sch.getJhlc()) + ",");
  115 + sb.append(sch.getjGh() + ",");
  116 + sb.append(nvlGetVal(sch.getsGh()) + ",");
  117 + sb.append(sch.getClZbh() + ",");
  118 + sb.append((sch.getBcType().equals("out") ? 1 : 2) + ",");
  119 + sb.append(sch.getjName() + ",");
  120 + //用ID替代老系统的出场顺序号
  121 + sb.append(sch.getId() + ",");
  122 +
  123 + array[i] = sb.substring(1).toString();
  124 + }
  125 + return array;
  126 + }
  127 +
  128 + public static String nvlGetVal(Object val) {
  129 + return val == null ? "" : val.toString();
  130 + }
  131 +
  132 + /**
  133 + * 将实际排班和油耗数据 转换成南汇路单需要的数据格式
  134 + *
  135 + * @param listMap
  136 + * @param oilInfoMap
  137 + * @return
  138 + */
  139 + public static NH_waybill[] to_waybill_NH(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {
  140 + List<String> nbbmArray = new ArrayList<>(listMap.keySet());
  141 +
  142 + NH_waybill[] rs = new NH_waybill[nbbmArray.size()];
  143 + Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");
  144 + //Field lpField = ScheduleRealInfo.class.getDeclaredField("lpName");
  145 +
  146 + List<ScheduleRealInfo> list;
  147 + ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;
  148 + ScheduleRealInfo sch;
  149 + NH_waybill nh_waybill;
  150 + NH_waybillItem nh_waybillItem;
  151 + OilInfo oilInfo;
  152 + for (int i = 0; i < nbbmArray.size(); i++) {
  153 + list = listMap.get(nbbmArray.get(i));
  154 + if (list.size() == 0)
  155 + continue;
  156 + //班次信息
  157 + nh_waybill = new NH_waybill();
  158 + sch = list.get(0);
  159 + //日期
  160 + nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());
  161 + //车辆自编号
  162 + nh_waybill.setM_strNBBM(sch.getClZbh());
  163 + //线路编码
  164 + nh_waybill.setM_strXLBM(sch.getXlBm());
  165 + nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());
  166 +
  167 + //按 驾驶员 分组班次,构造路单子项
  168 + jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);
  169 + for (String jGh : jGhListMap.keySet()) {
  170 + list = jGhListMap.get(jGh);
  171 + nh_waybillItem = new NH_waybillItem();
  172 + //计划里程
  173 + nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));
  174 + //实际计划公里
  175 + nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));
  176 + //实际出场里程
  177 + nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));
  178 + //实际进场里程
  179 + nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));
  180 + //营业公里
  181 + nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));
  182 + //空驶公里
  183 + nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));
  184 + //抽减公里
  185 + nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));
  186 + //烂班公里
  187 + nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));
  188 + //增加公里
  189 + nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));
  190 + //总公里
  191 + nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));
  192 + //烂班公里原因
  193 + nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));
  194 + //抽减公里原因
  195 + nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));
  196 + //计划班次
  197 + nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));
  198 + //实际计划班次
  199 + nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));
  200 + //实际班次 ————> 暂时和实际计划班次相同
  201 + nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));
  202 + //增加班次
  203 + nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));
  204 + //抽减班次
  205 + nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));
  206 + //烂班工时
  207 + nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));
  208 + //路牌
  209 + nh_waybillItem.setM_strLP(list.get(0).getLpName());
  210 + //驾驶员工号
  211 + nh_waybillItem.setM_strJSY(list.get(0).getjGh());
  212 + //售票员工号
  213 + nh_waybillItem.setM_strSPY(nvlGetVal(list.get(0).getsGh()));
  214 + //驾驶员考勤
  215 + nh_waybillItem.setM_strJSYKQ("");
  216 + //售票员考勤
  217 + nh_waybillItem.setM_strSPYKQ("");
  218 + //当班调度员
  219 + nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));
  220 + //营运状态
  221 + nh_waybillItem.setM_strYYZT("");
  222 + //备注
  223 + nh_waybillItem.setM_strBZ("");
  224 +
  225 + oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  226 + if (oilInfo != null) {
  227 + //出场存油
  228 + nh_waybillItem.setM_dblCCCY(oilInfo.getCzyl());
  229 + //进场存油
  230 + nh_waybillItem.setM_dblJCCY(oilInfo.getJzyl());
  231 + //加注量1
  232 + nh_waybillItem.setM_dblJZL1(oilInfo.getJzl());
  233 + //加注量2
  234 + nh_waybillItem.setM_dblJZL2(0.0);
  235 + //尿素
  236 + nh_waybillItem.setM_dblNS(oilInfo.getNs());
  237 + //消耗量
  238 + nh_waybillItem.setM_dblYH(oilInfo.getYh());
  239 + //加油地点1
  240 + nh_waybillItem.setM_strJYD1("");
  241 + //加油地点2
  242 + nh_waybillItem.setM_strJYD2("");
  243 + //加油工工号1
  244 + nh_waybillItem.setM_strJYG1("");
  245 + //加油工工号1
  246 + nh_waybillItem.setM_strJYG2("");
  247 + //油耗类型1
  248 + nh_waybillItem.setM_strYHLX1(oilInfo.getRylx());
  249 + //油耗类型2
  250 + nh_waybillItem.setM_strYHLX1("");
  251 + }
  252 +
  253 + nh_waybill.getM_SubInfos().add(nh_waybillItem);
  254 + }
  255 +
  256 + rs[i] = nh_waybill;
  257 + }
  258 + return rs;
  259 + }
  260 +
  261 +
  262 + /**
  263 + * 将实际排班和油耗数据 转换成上南路单需要的数据格式
  264 + *
  265 + * @param listMap
  266 + * @param oilInfoMap
  267 + * @return
  268 + */
  269 + public static SN_waybill[] to_waybill_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap) throws NoSuchFieldException {
  270 +
  271 + List<String> nbbmArray = new ArrayList<>(listMap.keySet());
  272 + SN_waybill[] rs = new SN_waybill[nbbmArray.size()];
  273 + Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");
  274 +
  275 + List<ScheduleRealInfo> list;
  276 + ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;
  277 + ScheduleRealInfo sch;
  278 + SN_waybill sn_waybill;
  279 + SN_waybillItem sn_waybillItem;
  280 +
  281 + OilComp oilComp = new OilComp();
  282 + List<OilInfo> oilArray;
  283 + for (int i = 0; i < nbbmArray.size(); i++) {
  284 + list = listMap.get(nbbmArray.get(i));
  285 + if (list.size() == 0)
  286 + continue;
  287 +
  288 + sch = list.get(0);
  289 + sn_waybill = new SN_waybill();
  290 + sn_waybill.setLine_no(sch.getXlBm());
  291 + sn_waybill.setWork_date(sch.getScheduleDateStr());
  292 + sn_waybill.setComp_id(sch.getFgsBm());
  293 + sn_waybill.setGuidecard(sch.getLpName());
  294 + sn_waybill.setCar_id(sch.getClZbh());
  295 + //实际班次
  296 + sn_waybill.setAct_num(ScheduleCalculator.countSJJHBC(list));
  297 + //晚班实际班次
  298 + sn_waybill.setL_act_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));
  299 + //营业里程
  300 + sn_waybill.setWork_way(ScheduleCalculator.calcYYLC(list));
  301 + //空驶里程
  302 + sn_waybill.setLeisure_way(ScheduleCalculator.calcKSLC(list));
  303 + //总里程
  304 + sn_waybill.setCount_way(ScheduleCalculator.calcZLC(list));
  305 + //路单类型(0普通,1包车)
  306 + sn_waybill.setLd_type("0");
  307 + //油料类型(2、柴油 3、天然气 4、汽油柴油 5、液化气 6、液化气汽油 7、液化气柴油 8、天然气汽油 9、电)
  308 + //暂时全部柴油车
  309 + sn_waybill.setOil_type("2");
  310 +
  311 + //根据车辆获取油量信息
  312 + oilArray = likeGet(oilInfoMap, sch.getClZbh() + "_");
  313 + if (oilArray.size() > 0) {
  314 + Collections.sort(oilArray, oilComp);
  315 + //出厂存油
  316 + sn_waybill.setOut_oil(oilArray.get(0).getCzyl());
  317 + //油料加注
  318 + sn_waybill.setAdd_oil(sumAddOil(oilArray));
  319 + //进场存油
  320 + sn_waybill.setEnd_oil(oilArray.get(oilArray.size() - 1).getJzyl());
  321 + //油料消耗
  322 + sn_waybill.setExpend_oil(countOilExpend(oilArray));
  323 + //非营业用油类型 非营业用油类型(1.常规车2.包车3.加开包车)
  324 + sn_waybill.setNowork_oil_type("1");
  325 + //非营业用油
  326 + sn_waybill.setNowork_oil(0);
  327 + //非营业用油油耗量(保养用油)
  328 + sn_waybill.setNowork_oil1(0);
  329 + //非营业用油油耗量(票务用油)
  330 + sn_waybill.setNowork_oil2(0);
  331 + //非营业用油油耗量(其他用油)
  332 + sn_waybill.setNowork_oil3(0);
  333 + //营业用油
  334 + sn_waybill.setWork_oil(countOilExpend(oilArray));
  335 + //其他营业用油
  336 + sn_waybill.setQt_work_oil(0);
  337 + }
  338 + sn_waybill.setDriver_detail(new ArrayList<SN_waybillItem>());
  339 +
  340 + //按 驾驶员 分组班次,构造路单子项
  341 + jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);
  342 + for (String jGh : jGhListMap.keySet()) {
  343 + list = jGhListMap.get(jGh);
  344 + sn_waybillItem = new SN_waybillItem();
  345 + sch = list.get(0);
  346 + //司机编号
  347 + sn_waybillItem.setDriver_no(sch.getjGh());
  348 + //司机名称
  349 + sn_waybillItem.setDriver_name(sch.getjName());
  350 + //售票员编号
  351 + sn_waybillItem.setBusman_no(sch.getsGh());
  352 + //售票员名称
  353 + sn_waybillItem.setBusman_name(sch.getsName());
  354 + //行驶里程
  355 + sn_waybillItem.setDriver_way(ScheduleCalculator.calcYYLC(list));
  356 + //空驶公里
  357 + sn_waybillItem.setKs_way(ScheduleCalculator.calcKSLC(list));
  358 + //柴油加注量、电加注量同一字段
  359 + sn_waybillItem.setDo_oil_2(countOilExpend(oilArray, sch.getjGh()));
  360 +
  361 + sn_waybill.getDriver_detail().add(sn_waybillItem);
  362 + }
  363 +
  364 + rs[i] = sn_waybill;
  365 + }
  366 + return rs;
  367 + }
  368 +
  369 + /**
  370 + * 将实际排班转换成上南需要损失公里数据
  371 + *
  372 + * @param listMap
  373 + * @return
  374 + */
  375 + public static SN_lossMileage[] to_lossMileage_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap) throws NoSuchFieldException {
  376 + List<String> lineArray = new ArrayList<>(listMap.keySet());
  377 + SN_lossMileage[] rs = new SN_lossMileage[lineArray.size()];
  378 +
  379 + List<ScheduleRealInfo> list;
  380 + ScheduleRealInfo sch;
  381 + for (int i = 0; i < lineArray.size(); i++) {
  382 + list = listMap.get(lineArray.get(i));
  383 +
  384 + sch = list.get(0);
  385 + SN_lossMileage lossMileage = new SN_lossMileage();
  386 + //线路编号
  387 + lossMileage.setLine_id(sch.getXlBm());
  388 + //营运日期
  389 + lossMileage.setWork_date(sch.getScheduleDateStr());
  390 + //分公司编号
  391 + lossMileage.setComp_id(sch.getFgsBm());
  392 + //少驶公里
  393 + lossMileage.setLoss_way(ScheduleCalculator.calcCJLC(list));
  394 + //实际公里
  395 + lossMileage.setAct_way(ScheduleCalculator.calcYYLC(list));
  396 + //计划公里
  397 + lossMileage.setJh_way(ScheduleCalculator.calcJHLC(list));
  398 +
  399 + //路阻损失公里
  400 + lossMileage.setLoss_lz(ScheduleCalculator.calcCJLC2(list, "路阻"));
  401 + //吊慢损失公里
  402 + lossMileage.setLoss_dm(ScheduleCalculator.calcCJLC2(list, "吊慢"));
  403 + //故障损失公里
  404 + lossMileage.setLoss_gz(ScheduleCalculator.calcCJLC2(list, "故障"));
  405 + //纠纷损失公里
  406 + lossMileage.setLoss_jf(ScheduleCalculator.calcCJLC2(list, "纠纷"));
  407 + //肇事损失公里
  408 + lossMileage.setLoss_zs(ScheduleCalculator.calcCJLC2(list, "肇事"));
  409 + //缺人损失公里
  410 + lossMileage.setLoss_qr(ScheduleCalculator.calcCJLC2(list, "缺人"));
  411 + //缺车损失公里
  412 + lossMileage.setLoss_qc(ScheduleCalculator.calcCJLC2(list, "缺车"));
  413 + //客稀损失公里
  414 + lossMileage.setLoss_kx(ScheduleCalculator.calcCJLC2(list, "客稀"));
  415 + //其他损失公里
  416 + lossMileage.setLoss_qt(ScheduleCalculator.calcCJLC2(list, "其他"));
  417 + //配车损失公里
  418 + lossMileage.setLoss_pc(ScheduleCalculator.calcCJLC2(list, "配车"));
  419 + //保养损失公里
  420 + lossMileage.setLoss_by(ScheduleCalculator.calcCJLC2(list, "保养"));
  421 + //气候损失公里
  422 + lossMileage.setLoss_qh(ScheduleCalculator.calcCJLC2(list, "气候"));
  423 + //援外损失公里
  424 + lossMileage.setLoss_yw(ScheduleCalculator.calcCJLC2(list, "援外"));
  425 + //抽减损失公里
  426 + lossMileage.setLoss_cj(ScheduleCalculator.calcCJLC2(list, "抽减"));
  427 +
  428 + //实际班次
  429 + lossMileage.setAct_num(ScheduleCalculator.countSJJHBC(list));
  430 + //早班班次
  431 + lossMileage.setEarly_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.earlyArray(list)));
  432 + //晚班班次
  433 + lossMileage.setLate_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));
  434 + //另加班次
  435 + lossMileage.setL_act_num(ScheduleCalculator.countZJBC(list));
  436 + //早班另加班次
  437 + lossMileage.setL_early_num(ScheduleCalculator.countZJBC(ScheduleCalculator.earlyArray(list)));
  438 + //晚班另加班次
  439 + lossMileage.setL_late_num(ScheduleCalculator.countZJBC(ScheduleCalculator.lastArray(list)));
  440 + //计划班次
  441 + lossMileage.setJ_act_num(ScheduleCalculator.countJHBC(list));
  442 + //早班计划班次
  443 + lossMileage.setJ_early_num(ScheduleCalculator.countJHBC(ScheduleCalculator.earlyArray(list)));
  444 + //晚班计划班次
  445 + lossMileage.setJ_late_num(ScheduleCalculator.countJHBC(ScheduleCalculator.lastArray(list)));
  446 + //放站班次
  447 + lossMileage.setF_act_bc(ScheduleCalculator.countEmpty(list));
  448 + //早班放站班次
  449 + lossMileage.setF_early_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.earlyArray(list)));
  450 + //晚班放站班次
  451 + lossMileage.setF_late_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.lastArray(list)));
  452 + //调头班次
  453 + lossMileage.setDt_act_bc(0);
  454 + //早班调头班次
  455 + lossMileage.setDt_early_bc(0);
  456 + //晚班调头班次
  457 + lossMileage.setDt_late_bc(0);
  458 + //大间隔班次
  459 + lossMileage.setD_act_num(ScheduleCalculator.countSpaceLg(list));
  460 + //早班大间隔班次
  461 + lossMileage.setD_early_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.earlyArray(list)));
  462 + //晚班大间隔班次
  463 + lossMileage.setD_late_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.lastArray(list)));
  464 + //最大间隔时间
  465 + lossMileage.setD_act_max(ScheduleCalculator.calcMaxSpace(list));
  466 + //故障分
  467 + lossMileage.setLoss_gzf(0);
  468 + //故障次数
  469 + lossMileage.setLoss_gzcs(0);
  470 +
  471 +
  472 + rs[i] = lossMileage;
  473 + }
  474 + return rs;
  475 + }
  476 +
  477 + private static double countOilExpend(List<OilInfo> oilArray) {
  478 + double sum = 0;
  479 + for (OilInfo oilInfo : oilArray) {
  480 + sum = Arith.add(sum, oilInfo.getYh());
  481 + }
  482 + return sum;
  483 + }
  484 +
  485 + private static double sumAddOil(List<OilInfo> oilArray) {
  486 + double sum = 0;
  487 + for (OilInfo oilInfo : oilArray) {
  488 + sum = Arith.add(sum, oilInfo.getJzl());
  489 + }
  490 + return sum;
  491 + }
  492 +
  493 + private static double countOilExpend(List<OilInfo> oilArray, String jGh) {
  494 + double sum = 0;
  495 + for (OilInfo oilInfo : oilArray) {
  496 + if (oilInfo.getJsy().equals(jGh))
  497 + sum = Arith.add(sum, oilInfo.getYh());
  498 + }
  499 + return sum;
  500 + }
  501 +
  502 + public static <T> List<T> likeGet(Map<String, T> map, String key) {
  503 + Set<String> ks = map.keySet();
  504 + List<T> list = new ArrayList<>();
  505 +
  506 + if (StringUtils.isEmpty(key))
  507 + return list;
  508 +
  509 + for (String k : ks) {
  510 + if (k.indexOf(key) != -1) {
  511 + list.add(map.get(k));
  512 + }
  513 + }
  514 + return list;
  515 + }
  516 +
  517 + /**
  518 + * 将数据转换成南汇工资系统需要的驾驶员考勤数据
  519 + *
  520 + * @param plans
  521 + * @param reals
  522 + * @param types
  523 + * @return
  524 + */
  525 + public static Jsy_attendance[] to_jsyAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsySet, Map<String, String> types, String rq) {
  526 + //List<String> ghArray = new ArrayList<>(types.keySet());
  527 + Jsy_attendance[] rs = new Jsy_attendance[jsySet.size()];
  528 +
  529 + Jsy_attendance attendance;
  530 + SchedulePlanInfo plan;
  531 + ScheduleRealInfo real;
  532 + //String jGh;
  533 +
  534 + int i = 0;
  535 + for(String jGh : jsySet){
  536 + attendance = new Jsy_attendance();
  537 + attendance.setRq(rq);
  538 + //计划
  539 + plan = searchByJsy(plans, jGh);
  540 + //实际
  541 + real = searchRealByJsy(reals, jGh);
  542 + //考勤
  543 + attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));
  544 + //班型
  545 + attendance.setPlanType(types.get(jGh)==null?"1":types.get(jGh));
  546 + //驾驶员工号
  547 + attendance.setjGh(jGh);
  548 + //早晚班类型
  549 + attendance.calcZybType(reals);
  550 +
  551 + //实际计划
  552 + if(real != null){
  553 + attendance.setXlBm(real.getXlBm());
  554 + attendance.setXlName(real.getXlName());
  555 + attendance.setjName(real.getjName());
  556 + attendance.setsGh(real.getsGh());
  557 + attendance.setsName(real.getsName());
  558 + attendance.setCompany(real.getGsBm());
  559 + attendance.setFgsCompany(real.getFgsBm());
  560 + attendance.addLpName(real.getLpName());
  561 + attendance.addCl(real.getClZbh());
  562 + }
  563 + //计划
  564 + else if(plan != null){
  565 + attendance.setXlBm(plan.getXlBm());
  566 + attendance.setXlName(plan.getXlName());
  567 + attendance.setjName(plan.getjName());
  568 + attendance.setsGh(plan.getsGh());
  569 + attendance.setsName(plan.getsName());
  570 + attendance.setCompany(plan.getGsBm());
  571 + attendance.setFgsCompany(plan.getFgsBm());
  572 + attendance.addLpName(plan.getLpName());
  573 + attendance.addCl(plan.getClZbh());
  574 + }
  575 +
  576 + rs[i] = attendance;
  577 + i++;
  578 + }
  579 + return rs;
  580 + }
  581 +
  582 + public static SchedulePlanInfo searchByJsy(List<SchedulePlanInfo> plans, String jGh){
  583 +
  584 + for(SchedulePlanInfo plan : plans){
  585 + if(plan.getjGh().equals(jGh))
  586 + return plan;
  587 + }
  588 + return null;
  589 + }
  590 +
  591 + public static ScheduleRealInfo searchRealByJsy(List<ScheduleRealInfo> reals, String jGh){
  592 +
  593 + for(ScheduleRealInfo sch : reals){
  594 + if(sch.getjGh().equals(jGh))
  595 + return sch;
  596 + }
  597 + return null;
  598 + }
  599 +
  600 + /**
  601 + * 将排班和油耗转换成综合查询需要的数据
  602 + * @param schList
  603 + * @param oilList
  604 + * @return
  605 + */
  606 + public static String[] to_getLSLC_PB(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {
  607 + String[] array = new String[0];
  608 + try {
  609 + //按日期分组数据
  610 + ArrayListMultimap<String, ScheduleRealInfo> schMultimap =
  611 + new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));
  612 +
  613 + ArrayListMultimap<String, OilInfo> oilMultimap =
  614 + new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));
  615 +
  616 + ArrayListMultimap<String, SchedulePlanInfo> planMultimap =
  617 + new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));
  618 +
  619 +
  620 + //月份有多少天
  621 + int year = Integer.parseInt(fdate.substring(0, 4));
  622 + int month = Integer.parseInt(fdate.substring(5, 7));
  623 + Calendar cal = Calendar.getInstance();
  624 + cal.set(Calendar.YEAR,year);
  625 + cal.set(Calendar.MONTH,month - 1);//从0开始
  626 + int maxDate = cal.getActualMaximum(Calendar.DATE);
  627 +
  628 + List<LsLcPb> rs = new ArrayList<>();
  629 + LsLcPb lcPb;
  630 + List<ScheduleRealInfo> pbList;
  631 + List<SchedulePlanInfo> jhList;
  632 + List<OilInfo> yhList;
  633 + String rq,rq2;
  634 + SchedulePlanInfo outPlan;
  635 + int currentDay = cal.get(Calendar.DAY_OF_MONTH);
  636 + for(int i = 1; i <= maxDate; i++){
  637 + lcPb = new LsLcPb();
  638 + lcPb.setDay(i);
  639 +
  640 + rq = fdate + "-" + (i < 10?"0":"") + i;
  641 + rq2 = rq.replaceAll("-", "");
  642 +
  643 + pbList = schMultimap.get(rq);
  644 + yhList = oilMultimap.get(rq2);
  645 + jhList = planMultimap.get(rq2);
  646 +
  647 + if(i < currentDay){
  648 + if(pbList == null || pbList.size() == 0)
  649 + lcPb.setType(4);//休息
  650 + else{
  651 + lcPb.setType(1);
  652 + lcPb.setLckq("");
  653 + if(yhList != null && yhList.size() > 0){
  654 + lcPb.setLcyh(yhList.get(0).getYh());
  655 + }
  656 + lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));
  657 + lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));
  658 + }
  659 + }
  660 + else if (i == currentDay)
  661 + lcPb.setType(3);//今天
  662 + else {
  663 + if(jhList == null || jhList.size() == 0)
  664 + lcPb.setType(4);//休息
  665 + else{
  666 + lcPb.setType(2);
  667 + outPlan = getOutSch(jhList);
  668 + if(null != outPlan){
  669 + lcPb.setPbxl(outPlan.getXlName());
  670 + lcPb.setPblp(outPlan.getLpName());
  671 + lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));
  672 + lcPb.setPbyc(outPlan.getClZbh());
  673 + }
  674 + else
  675 + lcPb.setType(4);//休息
  676 + }
  677 + }
  678 +
  679 + rs.add(lcPb);
  680 + }
  681 +
  682 + //拼接成字符串数组
  683 + array = new String[rs.size()];
  684 + StringBuilder sb;
  685 + for(int i = 0,len=rs.size(); i < len; i++){
  686 + lcPb = rs.get(i);
  687 + sb = new StringBuilder();
  688 +
  689 + sb.append(lcPb.getType());
  690 +
  691 + switch (lcPb.getType()){
  692 + case 1:
  693 + sb.append("," + lcPb.getLckq());
  694 + sb.append("," + lcPb.getLcyh());
  695 + sb.append("," + lcPb.getLcyylc());
  696 + sb.append("," + lcPb.getLcfyylc());
  697 + break;
  698 + case 2:
  699 + sb.append("," + lcPb.getPbxl());
  700 + sb.append("," + lcPb.getPblp());
  701 + sb.append("," + lcPb.getPbbd());
  702 + sb.append("," + lcPb.getPbyc());
  703 + break;
  704 + }
  705 + sb.append("," + lcPb.getDay());
  706 + array[i] = sb.toString();
  707 + }
  708 + } catch (NoSuchFieldException e) {
  709 + logger.error("", e);
  710 + }
  711 + return array;
  712 + }
  713 +
  714 + /**
  715 + * 将排班和油耗转换成综合查询需要的数据
  716 + * @param schList
  717 + * @param oilList
  718 + * @return
  719 + */
  720 + public static List<LsLcPb> to_getLSLC_PB_list(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {
  721 + List<LsLcPb> rs = new ArrayList<>();
  722 + try {
  723 + //按日期分组数据
  724 + ArrayListMultimap<String, ScheduleRealInfo> schMultimap =
  725 + new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));
  726 +
  727 + ArrayListMultimap<String, OilInfo> oilMultimap =
  728 + new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));
  729 +
  730 + ArrayListMultimap<String, SchedulePlanInfo> planMultimap =
  731 + new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));
  732 +
  733 +
  734 + //月份有多少天
  735 + int year = Integer.parseInt(fdate.substring(0, 4));
  736 + int month = Integer.parseInt(fdate.substring(5, 7));
  737 + Calendar cal = Calendar.getInstance();
  738 + cal.set(Calendar.YEAR,year);
  739 + cal.set(Calendar.MONTH,month - 1);//从0开始
  740 + int maxDate = cal.getActualMaximum(Calendar.DATE);
  741 +
  742 + LsLcPb lcPb;
  743 + List<ScheduleRealInfo> pbList;
  744 + List<SchedulePlanInfo> jhList;
  745 + List<OilInfo> yhList;
  746 + String rq,rq2;
  747 + SchedulePlanInfo outPlan;
  748 + int currentDay = cal.get(Calendar.DAY_OF_MONTH);
  749 + for(int i = 1; i <= maxDate; i++){
  750 + lcPb = new LsLcPb();
  751 + lcPb.setDay(i);
  752 +
  753 + rq = fdate + "-" + (i < 10?"0":"") + i;
  754 + rq2 = rq.replaceAll("-", "");
  755 +
  756 + pbList = schMultimap.get(rq);
  757 + yhList = oilMultimap.get(rq2);
  758 + jhList = planMultimap.get(rq2);
  759 +
  760 + if(i < currentDay){
  761 + if(pbList == null || pbList.size() == 0)
  762 + lcPb.setType(4);//休息
  763 + else{
  764 + lcPb.setType(1);
  765 + lcPb.setLckq("");
  766 + if(yhList != null && yhList.size() > 0){
  767 + lcPb.setLcyh(yhList.get(0).getYh());
  768 + }
  769 + lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));
  770 + lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));
  771 + }
  772 + }
  773 + else if (i == currentDay)
  774 + lcPb.setType(3);//今天
  775 + else {
  776 + if(jhList == null || jhList.size() == 0)
  777 + lcPb.setType(4);//休息
  778 + else{
  779 + lcPb.setType(2);
  780 + outPlan = getOutSch(jhList);
  781 + if(null != outPlan){
  782 + lcPb.setPbxl(outPlan.getXlName());
  783 + lcPb.setPblp(outPlan.getLpName());
  784 + lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));
  785 + lcPb.setPbyc(outPlan.getClZbh());
  786 + }
  787 + else
  788 + lcPb.setType(4);//休息
  789 + }
  790 + }
  791 +
  792 + rs.add(lcPb);
  793 + }
  794 + } catch (NoSuchFieldException e) {
  795 + logger.error("", e);
  796 + }
  797 + return rs;
  798 + }
  799 +
  800 + /**
  801 + * HH:mm 格式时间减分钟
  802 + * @param dfsj
  803 + * @param i
  804 + * @return
  805 + */
  806 + private static String minusMinute(String hhmm, int i) {
  807 + try {
  808 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  809 + long t = sdf.parse(hhmm).getTime();
  810 +
  811 + return sdf.format(new Date(t - (i * 60 * 1000)));
  812 + } catch (ParseException e) {
  813 + logger.error("", e);
  814 + }
  815 + return null;
  816 + }
  817 +
  818 + private static SchedulePlanInfo getOutSch(List<SchedulePlanInfo> pbList) {
  819 +
  820 + for(SchedulePlanInfo sch : pbList){
  821 + if(sch.getBcType().equals("out"))
  822 + return sch;
  823 + }
  824 + return null;
  825 + }
  826 +
  827 + public static class OilComp implements Comparator<OilInfo> {
  828 +
  829 + @Override
  830 + public int compare(OilInfo o1, OilInfo o2) {
  831 + return o1.getJcsx() - o2.getJcsx();
  832 + }
  833 + }
  834 +
  835 +
  836 +}