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 +}
... ...