Commit f7eabe3d5c9ffb9e83e272875b9d13fe4466f0c9

Authored by 王通
2 parents 5dc2cab3 9bd936f4

Merge branch 'lingang' into changsha

src/main/java/com/bsth/entity/HInfo.java 0 → 100644
  1 +package com.bsth.entity;
  2 +
  3 +
  4 +import org.springframework.format.annotation.DateTimeFormat;
  5 +
  6 +import javax.persistence.Entity;
  7 +import javax.persistence.Id;
  8 +import javax.persistence.Table;
  9 +import java.io.Serializable;
  10 +import java.util.Date;
  11 +
  12 +/**
  13 + * 电量信息表
  14 + */
  15 +@Entity
  16 +@Table(name = "bsth_c_qlb")
  17 +public class HInfo implements Serializable {
  18 + @Id
  19 + private Integer id;
  20 + /**
  21 + * 日期
  22 + */
  23 + @DateTimeFormat(pattern = "yyyy-MM-dd")
  24 + private Date rq;
  25 + /**
  26 + * 内部编码
  27 + */
  28 + private String nbbm;
  29 + /**
  30 + * 驾驶员
  31 + */
  32 + private String jsy;
  33 + /**
  34 + * 充氢量
  35 + */
  36 + private Double jql;
  37 + /**
  38 + * 耗氢
  39 + */
  40 + private Double hn;
  41 +
  42 + @Override
  43 + public int hashCode() {
  44 + return this.toString().hashCode();
  45 + }
  46 +
  47 + @Override
  48 + public boolean equals(Object obj) {
  49 + return this.toString().equals(((HInfo)obj).toString());
  50 + }
  51 +
  52 + @Override
  53 + public String toString() {
  54 + return "hydrogen_" + this.id;
  55 + }
  56 +
  57 + public Integer getId() {
  58 + return id;
  59 + }
  60 +
  61 + public void setId(Integer id) {
  62 + this.id = id;
  63 + }
  64 +
  65 + public Date getRq() {
  66 + return rq;
  67 + }
  68 +
  69 + public void setRq(Date rq) {
  70 + this.rq = rq;
  71 + }
  72 +
  73 + public String getNbbm() {
  74 + return nbbm;
  75 + }
  76 +
  77 + public void setNbbm(String nbbm) {
  78 + this.nbbm = nbbm;
  79 + }
  80 +
  81 + public String getJsy() {
  82 + return jsy;
  83 + }
  84 +
  85 + public void setJsy(String jsy) {
  86 + this.jsy = jsy;
  87 + }
  88 +
  89 + public Double getJql() {
  90 + return jql;
  91 + }
  92 +
  93 + public void setJql(Double jql) {
  94 + this.jql = jql;
  95 + }
  96 +
  97 + public Double getHn() {
  98 + return hn;
  99 + }
  100 +
  101 + public void setHn(Double hn) {
  102 + this.hn = hn;
  103 + }
  104 +
  105 +}
src/main/java/com/bsth/redis/HRedisService.java 0 → 100644
  1 +package com.bsth.redis;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.entity.HInfo;
  5 +import com.bsth.redis.util.RedisUtils;
  6 +import com.bsth.repository.HInfoRepository;
  7 +import com.bsth.util.ConfigUtil;
  8 +import com.bsth.util.ConvertUtil;
  9 +import com.google.common.collect.ArrayListMultimap;
  10 +import org.joda.time.DateTime;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.boot.CommandLineRunner;
  15 +import org.springframework.core.annotation.Order;
  16 +import org.springframework.data.redis.core.RedisTemplate;
  17 +import org.springframework.data.redis.serializer.StringRedisSerializer;
  18 +import org.springframework.stereotype.Component;
  19 +import org.springframework.stereotype.Service;
  20 +
  21 +import java.util.*;
  22 +import java.util.concurrent.TimeUnit;
  23 +
  24 +/**
  25 + * 油量数据Redis缓存
  26 + * Created by panzhao on 2017/3/19.
  27 + */
  28 +@Service
  29 +@Order(3)
  30 +public class HRedisService implements CommandLineRunner {
  31 +
  32 + @Autowired
  33 + private RedisTemplate redisTemplate;
  34 +
  35 + @Autowired
  36 + HInfoRepository hInfoRepository;
  37 +
  38 + @Autowired
  39 + RedisUtils redisUtils;
  40 +
  41 + static Logger logger = LoggerFactory.getLogger(HRedisService.class);
  42 +
  43 + private final static String REDIS_KEY_PREFIX = "hydrogen:";
  44 +
  45 + /**
  46 + * 将油量数据写入redis
  47 + *
  48 + * @param list
  49 + */
  50 + public void wirte(List<HInfo> list) {
  51 + ArrayListMultimap<String, HInfo> multimap;
  52 + try {
  53 + if (list.size() == 0)
  54 + return;
  55 + //按日期和线路分组数据
  56 + Class clazz = HInfo.class;
  57 + multimap = new ConvertUtil().groupMultiList(list, ":", clazz.getDeclaredField("nbbm"), clazz.getDeclaredField("rq"));
  58 +
  59 + //写入redis
  60 + Iterator<String> iterator = multimap.keySet().iterator();
  61 + String key;
  62 + while (iterator.hasNext()) {
  63 + key = iterator.next();
  64 + mergeData(key, multimap.get(key));
  65 + }
  66 + } catch (Exception e) {
  67 + logger.error("", e);
  68 + }
  69 + }
  70 +
  71 + /**
  72 + * 根据车辆和日期获取油耗数据,以 车辆_驾驶员 为key
  73 + *
  74 + * @param nbbmArray
  75 + * @param rq
  76 + * @return
  77 + */
  78 + public ArrayListMultimap findByNbbmGroup(Iterable<String> nbbmArray, String rq) {
  79 + ArrayListMultimap rs = ArrayListMultimap.create();
  80 +
  81 + rq = rq.replaceAll("-", "");
  82 + try {
  83 + List<HInfo> list = new ArrayList<>();
  84 + for (String nbbm : nbbmArray) {
  85 + nbbm = nbbm.split("_")[1];
  86 + list.addAll(read(nbbm, rq));
  87 + }
  88 + Class clazz = HInfo.class;
  89 + rs = new ConvertUtil().groupMultiList(list, "_", clazz.getDeclaredField("nbbm"), clazz.getDeclaredField("jsy"));
  90 + } catch (Exception e) {
  91 + logger.error("", e);
  92 + }
  93 + return rs;
  94 + }
  95 +
  96 + /**
  97 + * 根据车辆和日期获取油耗数据,以 车辆 为key
  98 + *
  99 + * @param nbbmArray
  100 + * @param rq
  101 + * @return
  102 + */
  103 + public ArrayListMultimap findByNbbmGroup1(Iterable<String> nbbmArray, String rq) {
  104 + ArrayListMultimap rs = ArrayListMultimap.create();
  105 +
  106 + rq = rq.replaceAll("-", "");
  107 + try {
  108 + List<HInfo> list = new ArrayList<>();
  109 + Set<String> nbbms = new HashSet<>();
  110 + for (String nbbm : nbbmArray) {
  111 + if (!nbbms.contains(nbbm)) {
  112 + nbbms.add(nbbm);
  113 + list.addAll(read(nbbm, rq));
  114 + }
  115 + }
  116 + Class clazz = HInfo.class;
  117 + rs = new ConvertUtil().groupMultiList(list, "_", clazz.getDeclaredField("nbbm"));
  118 + } catch (Exception e) {
  119 + logger.error("", e);
  120 + }
  121 + return rs;
  122 + }
  123 +
  124 + public List<HInfo> read(String nbbm, String rq) {
  125 + return redisTemplate.opsForList().range(REDIS_KEY_PREFIX + nbbm + ":" + rq, 0, -1);
  126 + }
  127 +
  128 + /**
  129 + * 将 list 与redis里的数据合并
  130 + *
  131 + * @param key
  132 + * @param list
  133 + */
  134 + public void mergeData(String key, List<HInfo> list) {
  135 + key = REDIS_KEY_PREFIX + key;
  136 +
  137 + //更新 直接覆盖更新
  138 + redisTemplate.execute(redisUtils.getUpdateCallback(key, list));
  139 + }
  140 +
  141 + @Autowired
  142 + HRefreshThread hRefreshThread;
  143 +
  144 + @Override
  145 + public void run(String... strings) throws Exception {
  146 + Application.mainServices.schedule(new Runnable() {
  147 + @Override
  148 + public void run() {
  149 + //启动加载油耗缓存
  150 + synchData(null);
  151 + }
  152 + }, 30, TimeUnit.SECONDS);
  153 +
  154 +
  155 + //定时刷新油耗信息
  156 + Application.mainServices.scheduleWithFixedDelay(hRefreshThread, 60 * 40, 60 * 40, TimeUnit.SECONDS);
  157 + }
  158 +
  159 + /**
  160 + * 和数据库同步数据
  161 + */
  162 + public void synchData(Integer days) {
  163 + int cacheDays = Integer.parseInt(ConfigUtil.get("cache.days"));
  164 + if (null != days && days < cacheDays)
  165 + cacheDays = days;
  166 + //设置key 序列化器
  167 + redisTemplate.setKeySerializer(new StringRedisSerializer());
  168 +
  169 + DateTime dt = new DateTime();
  170 + dt = dt.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).minusDays(cacheDays);
  171 + List<HInfo> list = hInfoRepository.findByDateLT(dt.toDate());
  172 + //写入redis
  173 + wirte(list);
  174 + logger.info("刷新氢耗数据, days: " + cacheDays + " -size: " + list.size() + " -LT: " + dt.toString("yyyy-MM-dd"));
  175 + }
  176 +
  177 + @Component
  178 + public static class HRefreshThread extends Thread {
  179 +
  180 + @Autowired
  181 + HRedisService hRedisService;
  182 +
  183 + @Override
  184 + public void run() {
  185 + try {
  186 + hRedisService.synchData(5);
  187 + } catch (Exception e) {
  188 + logger.error("", e);
  189 + }
  190 + }
  191 + }
  192 +}
src/main/java/com/bsth/redis/util/DateUtils.java
@@ -2,6 +2,7 @@ package com.bsth.redis.util; @@ -2,6 +2,7 @@ package com.bsth.redis.util;
2 2
3 import java.text.ParseException; 3 import java.text.ParseException;
4 import java.text.SimpleDateFormat; 4 import java.text.SimpleDateFormat;
  5 +import java.util.ArrayList;
5 import java.util.Calendar; 6 import java.util.Calendar;
6 import java.util.Date; 7 import java.util.Date;
7 8
@@ -133,4 +134,25 @@ public class DateUtils { @@ -133,4 +134,25 @@ public class DateUtils {
133 public static int calcHHmmDiff(String fcsj, String zdsj) throws ParseException { 134 public static int calcHHmmDiff(String fcsj, String zdsj) throws ParseException {
134 return (int) (sdfHHmm.parse(zdsj).getTime() - sdfHHmm.parse(fcsj).getTime()); 135 return (int) (sdfHHmm.parse(zdsj).getTime() - sdfHHmm.parse(fcsj).getTime());
135 } 136 }
136 -} 137 +
  138 + //获取未来7天的时间
  139 + public static ArrayList contextLoads() {
  140 + // 未来past天
  141 + int past = 8;
  142 + Calendar calendar = Calendar.getInstance();
  143 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  144 + ArrayList arrayList = new ArrayList();
  145 + for (int i = 1; i < past; i++) {
  146 + if (i > 0) {
  147 + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
  148 + }
  149 + Date today = calendar.getTime();
  150 + String result = format.format(today);
  151 + arrayList.add(result);
  152 +
  153 + }
  154 +
  155 + return arrayList;
  156 + }
  157 +
  158 + }
src/main/java/com/bsth/repository/HInfoRepository.java 0 → 100644
  1 +package com.bsth.repository;
  2 +
  3 +import com.bsth.entity.HInfo;
  4 +
  5 +import org.springframework.data.jpa.repository.Query;
  6 +import org.springframework.data.repository.PagingAndSortingRepository;
  7 +import org.springframework.stereotype.Repository;
  8 +
  9 +import java.util.Date;
  10 +import java.util.List;
  11 +
  12 +@Repository
  13 +public interface HInfoRepository extends PagingAndSortingRepository<HInfo, Long> {
  14 +
  15 +
  16 + @Query("select h from HInfo h where h.rq>?1")
  17 + List<HInfo> findByDateLT(Date rq);
  18 +}
src/main/java/com/bsth/server_rs/base_info/car/Car.java
@@ -180,12 +180,4 @@ public class Car implements Serializable { @@ -180,12 +180,4 @@ public class Car implements Serializable {
180 public void setRemark(String remark) { 180 public void setRemark(String remark) {
181 this.remark = remark; 181 this.remark = remark;
182 } 182 }
183 -  
184 - public Date getUpdateDate() {  
185 - return updateDate;  
186 - }  
187 -  
188 - public void setUpdateDate(Date updateDate) {  
189 - this.updateDate = updateDate;  
190 - }  
191 } 183 }
src/main/java/com/bsth/server_rs/base_info/station/buffer/StationBufferData.java
@@ -113,4 +113,5 @@ public class StationBufferData implements CommandLineRunner { @@ -113,4 +113,5 @@ public class StationBufferData implements CommandLineRunner {
113 listMap.putAll(k2, routeListMap.get(k2)); 113 listMap.putAll(k2, routeListMap.get(k2));
114 return listMap.asMap(); 114 return listMap.asMap();
115 } 115 }
  116 +
116 } 117 }
src/main/java/com/bsth/server_rs/bigdata/BigscreenService.java
@@ -3829,7 +3829,8 @@ public class BigscreenService { @@ -3829,7 +3829,8 @@ public class BigscreenService {
3829 + " jhzgl,sjzgl,jhyylc,sjyylc,jhyylcz,jhkslc,sjkslc,jhkslcz," 3829 + " jhzgl,sjzgl,jhyylc,sjyylc,jhyylcz,jhkslc,sjkslc,jhkslcz,"
3830 + " jhssgfbcs,sjgfbcs,jhgfbcsz,jhssdgbcs,sjdgbcs,jhdgbcsz," 3830 + " jhssgfbcs,sjgfbcs,jhgfbcsz,jhssdgbcs,sjdgbcs,jhdgbcsz,"
3831 + " jhsmbcs,sjsmbczds,smbczdl,jhsmbcsz,sjsmbczdsz,smbczdlz," 3831 + " jhsmbcs,sjsmbczds,smbczdl,jhsmbcsz,sjsmbczdsz,smbczdlz,"
3832 - + " jhszfcs,sjszfczds,szfczdl,create_date" 3832 + + " jhszfcs,sjszfczds,szfczdl,create_date,"
  3833 + + " jhzgfbcz,jhzgfbcss,sjzgfbc,jhwgfbcz,jhwgfbcss,sjwgfbc"
3833 + " from bsth_c_calc_count " 3834 + " from bsth_c_calc_count "
3834 + " where date = ? "; 3835 + " where date = ? ";
3835 3836
@@ -3880,6 +3881,13 @@ public class BigscreenService { @@ -3880,6 +3881,13 @@ public class BigscreenService {
3880 m.put("sjszfczds", rs.getString("sjszfczds")); 3881 m.put("sjszfczds", rs.getString("sjszfczds"));
3881 m.put("szfczdl", rs.getString("szfczdl")); 3882 m.put("szfczdl", rs.getString("szfczdl"));
3882 3883
  3884 + m.put("jhzgfbcz", rs.getString("jhzgfbcz"));
  3885 + m.put("jhzgfbc", rs.getString("jhzgfbcss"));
  3886 + m.put("sjzgfbc", rs.getString("sjzgfbc"));
  3887 + m.put("jhwgfbcz", rs.getString("jhwgfbcz"));
  3888 + m.put("jhwgfbc", rs.getString("jhwgfbcss"));
  3889 + m.put("sjwgfbc", rs.getString("sjwgfbc"));
  3890 +
3883 Date date = new Date(); 3891 Date date = new Date();
3884 date.setTime(rs.getTimestamp("create_date").getTime()); 3892 date.setTime(rs.getTimestamp("create_date").getTime());
3885 m.put("createDate", sdf.format(date)); 3893 m.put("createDate", sdf.format(date));
@@ -3973,6 +3981,10 @@ public class BigscreenService { @@ -3973,6 +3981,10 @@ public class BigscreenService {
3973 resMap.put("jhbc", t.get("jhbc").toString()); 3981 resMap.put("jhbc", t.get("jhbc").toString());
3974 resMap.put("sjbc", t.get("sjbc").toString()); 3982 resMap.put("sjbc", t.get("sjbc").toString());
3975 resMap.put("bczxl", t.get("bczxl").toString()); 3983 resMap.put("bczxl", t.get("bczxl").toString());
  3984 + resMap.put("jhbcZgf", t.get("jhzgfbc").toString());
  3985 + resMap.put("jhbcWgf", t.get("jhwgfbc").toString());
  3986 + resMap.put("sjbcZgf", t.get("sjzgfbc").toString());
  3987 + resMap.put("sjbcWgf", t.get("sjwgfbc").toString());
3976 resMap.put("jhsmbc", t.get("jhsmbcs").toString()); 3988 resMap.put("jhsmbc", t.get("jhsmbcs").toString());
3977 resMap.put("sjsmzd", t.get("sjsmbczds").toString()); 3989 resMap.put("sjsmzd", t.get("sjsmbczds").toString());
3978 resMap.put("smbzdl", t.get("smbczdl").toString()); 3990 resMap.put("smbzdl", t.get("smbczdl").toString());
src/main/java/com/bsth/server_rs/electric/ElectricService.java
@@ -54,8 +54,8 @@ public class ElectricService { @@ -54,8 +54,8 @@ public class ElectricService {
54 //从数据库查询 54 //从数据库查询
55 //list = jdbcTemplate.query("select fgs_bm,fgs_name,gs_bm,gs_name,jdl,jdz,remarks,rq,creater_date,nbbm,jsy from bsth_c_jdl where gs_bm="+company+" and rq='"+rq+"'" 55 //list = jdbcTemplate.query("select fgs_bm,fgs_name,gs_bm,gs_name,jdl,jdz,remarks,rq,creater_date,nbbm,jsy from bsth_c_jdl where gs_bm="+company+" and rq='"+rq+"'"
56 // , BeanPropertyRowMapper.newInstance(Electric.class)); 56 // , BeanPropertyRowMapper.newInstance(Electric.class));
57 - list = jdbcTemplate.query("select fgsdm as fgs_bm,c.business_name as fgs_name,ssgsdm as gs_bm,b.business_name as gs_name,cdl as jdl,'' as jdz,'' as remarks,rq,createtime as create_date,nbbm,'' as jsy from (select fgsdm,ssgsdm,sum(cdl * 1000) / 1000 as cdl,rq,max(createtime) as createtime,nbbm from bsth_c_dlb where rq = '" + rq + "' GROUP BY fgsdm,ssgsdm,rq,nbbm) a left join bsth_c_business b on a.ssgsdm = b.business_code LEFT JOIN bsth_c_business c on concat(a.ssgsdm, '_', a.fgsdm) = concat(c.up_code, '_', c.business_code) where ssgsdm="+company  
58 - , BeanPropertyRowMapper.newInstance(Electric.class)); 57 + list = jdbcTemplate.query("select fgsdm as fgs_bm,c.business_name as fgs_name,ssgsdm as gs_bm,b.business_name as gs_name,cdl as jdl,'' as jdz,'' as remarks,rq,createtime as create_date,nbbm,'' as jsy from (select fgsdm,ssgsdm,sum(cdl * 1000) / 1000 as cdl,rq,max(createtime) as createtime,nbbm from bsth_c_dlb where rq = ? GROUP BY fgsdm,ssgsdm,rq,nbbm) a left join bsth_c_business b on a.ssgsdm = b.business_code LEFT JOIN bsth_c_business c on concat(a.ssgsdm, '_', a.fgsdm) = concat(c.up_code, '_', c.business_code) where ssgsdm = ?"
  58 + , new Object[]{ rq, company }, BeanPropertyRowMapper.newInstance(Electric.class));
59 }catch (Exception e){ 59 }catch (Exception e){
60 logger.error("ElectricService", e); 60 logger.error("ElectricService", e);
61 } 61 }
src/main/java/com/bsth/server_rs/schedule/plan/SchedulePlanService.java
@@ -52,6 +52,8 @@ public class SchedulePlanService { @@ -52,6 +52,8 @@ public class SchedulePlanService {
52 return all; 52 return all;
53 } 53 }
54 54
  55 +
  56 +
55 @GET 57 @GET
56 @Path("/ycqts/{company}/{month}") 58 @Path("/ycqts/{company}/{month}")
57 public List<AttendancePlanMonth> count_ycqts(@PathParam("company") String company,@PathParam("month") String month){ 59 public List<AttendancePlanMonth> count_ycqts(@PathParam("company") String company,@PathParam("month") String month){
src/main/java/com/bsth/server_rs/schedule/real/ScheduleRealService.java
@@ -13,6 +13,7 @@ import com.bsth.server_rs.base_info.line.Line; @@ -13,6 +13,7 @@ import com.bsth.server_rs.base_info.line.Line;
13 import com.bsth.server_rs.base_info.line.buffer.LineBufferData; 13 import com.bsth.server_rs.base_info.line.buffer.LineBufferData;
14 import com.bsth.server_rs.gps.buffer.GpsRealDataBuffer; 14 import com.bsth.server_rs.gps.buffer.GpsRealDataBuffer;
15 import com.bsth.server_rs.gps.entity.GpsEntity; 15 import com.bsth.server_rs.gps.entity.GpsEntity;
  16 +import com.bsth.server_rs.schedule.dto.PlanScheduleDTO_JK;
16 import com.bsth.server_rs.schedule.dto.ScheduleCcInfoConfig; 17 import com.bsth.server_rs.schedule.dto.ScheduleCcInfoConfig;
17 import com.bsth.server_rs.schedule.dto.ScheduleInOut; 18 import com.bsth.server_rs.schedule.dto.ScheduleInOut;
18 import com.bsth.server_rs.schedule.dto.ScheduleRealInfoDTO_JK; 19 import com.bsth.server_rs.schedule.dto.ScheduleRealInfoDTO_JK;
@@ -216,6 +217,21 @@ public class ScheduleRealService implements InitializingBean { @@ -216,6 +217,21 @@ public class ScheduleRealService implements InitializingBean {
216 } 217 }
217 218
218 @GET 219 @GET
  220 + @Path("/sch_jk_line/{company}/{rq}/{lineCode}")
  221 + public List<ScheduleRealInfoDTO_JK> find_JK_line(@PathParam("company") String company, @PathParam("rq") String rq, @PathParam("lineCode") String lineCode){
  222 + List<ScheduleRealInfoDTO_JK> all = new ArrayList<>();
  223 +
  224 + List<Line> lines = LineBufferData.findByCompany(company);
  225 + for(Line line : lines){
  226 + if(line.getLineCode().equals(lineCode)){
  227 + all.addAll(ScheduleRealInfoDTO_JK.getMultiInstance(redisService.read(rq, line.getLineCode())));
  228 + }
  229 + }
  230 + return all;
  231 + }
  232 +
  233 +
  234 + @GET
219 @Path("/sch_jk_db/{company}/{rq}") 235 @Path("/sch_jk_db/{company}/{rq}")
220 public List<ScheduleRealInfoDTO_JK> sch_jk(@PathParam("company") String company, @PathParam("rq") String rq) { 236 public List<ScheduleRealInfoDTO_JK> sch_jk(@PathParam("company") String company, @PathParam("rq") String rq) {
221 DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd"); 237 DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");
src/main/java/com/bsth/server_ws/util/WSDataConver.java
1 -package com.bsth.server_ws.util;  
2 -  
3 -import java.lang.reflect.Field;  
4 -import java.text.ParseException;  
5 -import java.text.SimpleDateFormat;  
6 -import java.util.ArrayList;  
7 -import java.util.Calendar;  
8 -import java.util.Collections;  
9 -import java.util.Comparator;  
10 -import java.util.Date;  
11 -import java.util.HashMap;  
12 -import java.util.HashSet;  
13 -import java.util.List;  
14 -import java.util.Map;  
15 -import java.util.Set;  
16 -  
17 -import org.apache.commons.lang3.StringUtils;  
18 -import org.apache.poi.ss.formula.functions.T;  
19 -import org.slf4j.Logger;  
20 -import org.slf4j.LoggerFactory;  
21 -  
22 -import com.bsth.entity.DutyEmployee;  
23 -import com.bsth.entity.ElecInfo;  
24 -import com.bsth.entity.OilInfo;  
25 -import com.bsth.entity.SchedulePlanInfo;  
26 -import com.bsth.entity.ScheduleRealInfo;  
27 -import com.bsth.server_ws.attendance.entity.Ssry_attendance;  
28 -import com.bsth.server_ws.attendance.entity.Jsy_attendance;  
29 -import com.bsth.server_ws.park_station.dto.LsLcPb;  
30 -import com.bsth.server_ws.waybill.entity.NH_waybill;  
31 -import com.bsth.server_ws.waybill.entity.NH_waybillItem;  
32 -import com.bsth.server_ws.waybill.entity.SN_lossMileage;  
33 -import com.bsth.server_ws.waybill.entity.SN_waybill;  
34 -import com.bsth.server_ws.waybill.entity.SN_waybillItem;  
35 -import com.bsth.util.Arith;  
36 -import com.bsth.util.ConvertUtil;  
37 -import com.google.common.collect.ArrayListMultimap;  
38 -  
39 -/**  
40 - * Created by panzhao on 2017/3/15.  
41 - */  
42 -public class WSDataConver {  
43 -  
44 - /**  
45 - * 格式编码和名称映射,与老系统保持一致  
46 - */  
47 - private static Map<String, String> gsMap;  
48 -  
49 - static Logger logger = LoggerFactory.getLogger(WSDataConver.class);  
50 -  
51 - static {  
52 - gsMap = new HashMap<>();  
53 - gsMap.put("55", "上南公司");  
54 - gsMap.put("55_4", "上南一分公司");  
55 - gsMap.put("55_3", "上南六分公司");  
56 - gsMap.put("55_1", "上南二分公司");  
57 - gsMap.put("55_2", "上南三分公司");  
58 - gsMap.put("22", "金高公司");  
59 - gsMap.put("22_2", "二分公司");  
60 - gsMap.put("22_1", "四分公司");  
61 - gsMap.put("22_3", "三分公司");  
62 - gsMap.put("22_5", "一分公司");  
63 - gsMap.put("05", "杨高公司");  
64 - gsMap.put("05_5", "杨高分公司");  
65 - gsMap.put("05_6", "周浦分公司");  
66 - gsMap.put("05_3", "芦潮港分公司");  
67 - gsMap.put("05_1", "川沙分公司");  
68 - gsMap.put("26", "南汇公司");  
69 - gsMap.put("26_3", "南汇三分");  
70 - gsMap.put("26_2", "南汇二分");  
71 - gsMap.put("26_1", "南汇一分");  
72 - gsMap.put("26_4", "南汇维修公司");  
73 - gsMap.put("77", "临港公交");  
74 - gsMap.put("77_1", "临港公交");  
75 - }  
76 -  
77 - /**  
78 - * 将班次list 转换成 getCurrentDayPlan 函数需要的格式  
79 - *  
80 - * @param list  
81 - * @return [0:日期,1:线路名称,2:路牌名称,3:车辆自编号,4:,5:,6:起点时间,7:终点时间,8:起点站名称,9:终点站名称,10:班次类型]  
82 - */  
83 - public static String[] to_getCurrentDayPlan(List<ScheduleRealInfo> list) {  
84 - if (list == null || list.size() == 0)  
85 - return new String[0];  
86 -  
87 - Map<String, String> bcTypeMap = new HashMap<>();  
88 - bcTypeMap.put("out", "出场");  
89 - bcTypeMap.put("in", "进场");  
90 -  
91 - String[] array = new String[list.size()];  
92 - StringBuilder sb;  
93 - ScheduleRealInfo sch;  
94 - int len = list.size();  
95 - for(int i = 0; i < len; i ++){  
96 - sb = new StringBuilder();  
97 - sch = list.get(i);  
98 - sb.append(sch.getScheduleDateStr() + ",");  
99 - sb.append(sch.getXlName() + ",");  
100 - sb.append(sch.getLpName() + ",");  
101 - sb.append(sch.getClZbh() + ",");  
102 - sb.append(",");  
103 - sb.append(",");  
104 - sb.append(sch.getDfsj() + ",");  
105 - sb.append(sch.getZdsj() + ",");  
106 - sb.append(sch.getQdzName() + ",");  
107 - sb.append(sch.getZdzName() + ",");  
108 - sb.append(bcTypeMap.containsKey(sch.getBcType())?bcTypeMap.get(sch.getBcType()):"");  
109 -  
110 - array[i] = sb.toString();  
111 - }  
112 - return array;  
113 - }  
114 -  
115 - /**  
116 - * 将班次list 转换成 returnCCInfo 和 returnJCInfo 函数需要的格式  
117 - *  
118 - * @param list  
119 - * @return [0: 日期, 1: 线路编码, 2: 线路名称, 3: 公司名称, 4: 分公司名称, 5: 路牌, 6: 起点站, 7: 起点计划时间,  
120 - * 8: 起点实际时间, 9: 终点站, 10: 终点计划时间, 11: 终点实际时间, 12: 计划里程, 13: 实际里程,  
121 - * 14: 驾驶员, 15: 售票员, 16: 车辆内部编码, 17: 状态(1 为出场。2为进场), 18: 驾驶员名称, 19: 进场顺序号]  
122 - */  
123 - public static String[] to_returnJCCInfo(List<ScheduleRealInfo> list) {  
124 - if(list == null)  
125 - return new String[0];  
126 -  
127 - int size = list.size();  
128 - String[] array = new String[size];  
129 -  
130 - ScheduleRealInfo sch;  
131 - StringBuffer sb;  
132 - for (int i = 0; i < size; i++) {  
133 - sb = new StringBuffer(",");  
134 -  
135 - sch = list.get(i);  
136 - sb.append(sch.getScheduleDateStr() + ",");  
137 - sb.append(sch.getXlBm() + ",");  
138 - sb.append(sch.getXlName() + ",");  
139 - sb.append(gsMap.get(sch.getGsBm()) + ",");  
140 - sb.append(gsMap.get(sch.getGsBm() + "_" + sch.getFgsBm()) + ",");  
141 - sb.append(sch.getLpName() + ",");  
142 - sb.append(sch.getQdzCode() + ",");  
143 - sb.append(sch.getDfsj() + ",");  
144 - sb.append(nvlGetVal(sch.getFcsjActual()) + ",");  
145 - sb.append(sch.getZdzCode() + ",");  
146 - sb.append(sch.getZdsj() + ",");  
147 - sb.append(nvlGetVal(sch.getZdsjActual()) + ",");  
148 - sb.append(nvlGetVal(sch.getJhlc()) + ",");  
149 - sb.append(nvlGetVal(sch.getJhlc()) + ",");  
150 - sb.append(sch.getjGh() + ",");  
151 - sb.append(nvlGetVal(sch.getsGh()) + ",");  
152 - sb.append(sch.getClZbh() + ",");  
153 - sb.append((sch.getBcType().equals("out") ? 1 : 2) + ",");  
154 - sb.append(sch.getjName() + ",");  
155 - //用ID替代老系统的出场顺序号  
156 - sb.append(sch.getId() + ",");  
157 -  
158 - array[i] = sb.substring(1).toString();  
159 - }  
160 - return array;  
161 - }  
162 -  
163 - public static String nvlGetVal(Object val) {  
164 - return val == null ? "" : val.toString();  
165 - }  
166 -  
167 - /**  
168 - * 将实际排班和油耗数据 转换成南汇路单需要的数据格式  
169 - *  
170 - * @param listMap  
171 - * @param oilInfoMap  
172 - * @return  
173 - */  
174 - public static NH_waybill[] to_waybill_NH(ArrayListMultimap<String, ScheduleRealInfo> listMap, ArrayListMultimap<String, OilInfo> oilInfoMap, ArrayListMultimap<String, ElecInfo> elecInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {  
175 - List<String> nbbmArray = new ArrayList<>(listMap.keySet());  
176 -  
177 - NH_waybill[] rs = new NH_waybill[nbbmArray.size() + 1];  
178 - Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");  
179 - //Field lpField = ScheduleRealInfo.class.getDeclaredField("lpName");  
180 -  
181 - List<ScheduleRealInfo> list;  
182 - ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;  
183 - ScheduleRealInfo sch;  
184 - NH_waybill nh_waybill, total = new NH_waybill();  
185 - NH_waybillItem nh_waybillItem, totalItem = new NH_waybillItem();  
186 - List<OilInfo> oilInfo;  
187 - List<ElecInfo> elecInfo;  
188 - boolean isFirst = true;  
189 -  
190 - double jhlc = 0, sjjhlc = 0, cclc = 0, jclc = 0, yylc = 0, kslc = 0, cjlc = 0, lblc = 0, zjlc = 0, zlc = 0;  
191 - double yhTotal = 0;  
192 - for (int i = 0; i < nbbmArray.size(); i++) {  
193 - list = listMap.get(nbbmArray.get(i));  
194 - if (list.size() == 0)  
195 - continue;  
196 - //班次信息  
197 - nh_waybill = new NH_waybill();  
198 - sch = list.get(0);  
199 - //日期  
200 - nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());  
201 - //车辆自编号  
202 - nh_waybill.setM_strNBBM(sch.getClZbh());  
203 - //线路编码  
204 - nh_waybill.setM_strXLBM(sch.getXlBm());  
205 - nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());  
206 - if (isFirst) {  
207 - total.setM_strYYRQ(sch.getScheduleDateStr());  
208 - total.setM_strNBBM("000-000");  
209 - total.setM_strXLBM("000000");  
210 - total.setM_SubInfos(new ArrayList<NH_waybillItem>());  
211 -  
212 - isFirst = false;  
213 - }  
214 -  
215 - //按 驾驶员 分组班次,构造路单子项  
216 - jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);  
217 - for (String jGh : jGhListMap.keySet()) {  
218 - list = jGhListMap.get(jGh);  
219 - nh_waybillItem = new NH_waybillItem();  
220 - //计划里程  
221 - nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));  
222 - jhlc = Arith.add(jhlc, nh_waybillItem.getM_dblJHLC());  
223 - //实际计划公里  
224 - nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));  
225 - sjjhlc = Arith.add(sjjhlc, nh_waybillItem.getM_dblSJJHLC());  
226 - //实际出场里程  
227 - nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));  
228 - cclc = Arith.add(cclc, nh_waybillItem.getM_dblCCLC());  
229 - //实际进场里程  
230 - nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));  
231 - jclc = Arith.add(jclc, nh_waybillItem.getM_dblJCLC());  
232 - //营业公里  
233 - nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));  
234 - yylc = Arith.add(yylc, nh_waybillItem.getM_dblYYLC());  
235 - //空驶公里  
236 - nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));  
237 - kslc = Arith.add(kslc, nh_waybillItem.getM_dblKSLC());  
238 - //抽减公里  
239 - nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));  
240 - cjlc = Arith.add(cjlc, nh_waybillItem.getM_dblCJLC());  
241 - //烂班公里  
242 - nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));  
243 - lblc = Arith.add(lblc, nh_waybillItem.getM_dblLBLC());  
244 - //增加公里  
245 - nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));  
246 - zjlc = Arith.add(zjlc, nh_waybillItem.getM_dblZJLC());  
247 - //总公里  
248 - nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));  
249 - zlc = Arith.add(zlc, nh_waybillItem.getM_dblZLC());  
250 - //烂班公里原因  
251 - nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));  
252 - //抽减公里原因  
253 - nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));  
254 - //计划班次  
255 - nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));  
256 - //实际计划班次  
257 - nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));  
258 - //实际班次 ————> 暂时和实际计划班次相同  
259 - nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));  
260 - //增加班次  
261 - nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));  
262 - //抽减班次  
263 - nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));  
264 - //烂班工时  
265 - nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));  
266 - //路牌  
267 - nh_waybillItem.setM_strLP(list.get(0).getLpName());  
268 - //驾驶员工号  
269 - nh_waybillItem.setM_strJSY(list.get(0).getjGh());  
270 - //售票员工号  
271 - nh_waybillItem.setM_strSPY("");  
272 - for (ScheduleRealInfo sri : list) {  
273 - if (StringUtils.isNotEmpty(sri.getsGh())) {  
274 - nh_waybillItem.setM_strSPY(sri.getsGh());  
275 - break;  
276 - }  
277 - }  
278 - //驾驶员考勤  
279 - nh_waybillItem.setM_strJSYKQ("");  
280 - //售票员考勤  
281 - nh_waybillItem.setM_strSPYKQ("");  
282 - //当班调度员  
283 - nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));  
284 - //营运状态  
285 - nh_waybillItem.setM_strYYZT("");  
286 - //备注  
287 - nh_waybillItem.setM_strBZ("");  
288 -  
289 - oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());  
290 - if (oilInfo != null && oilInfo.size() > 0) {  
291 - Double czyl = 0., jzyl = 0., jzl = 0., ns = 0., yh = 0.;  
292 - String rylx = "";  
293 - for (OilInfo oi : oilInfo) {  
294 - if (oi.getXlbm().equals(sch.getXlBm())) {  
295 - czyl = Arith.add(czyl, oi.getCzyl());  
296 - jzyl = Arith.add(jzyl, oi.getJzyl());  
297 - jzl = Arith.add(jzl, oi.getJzl());  
298 - ns = Arith.add(ns, oi.getNs());  
299 - yh = Arith.add(yh, oi.getYh());  
300 - rylx = oi.getRylx();  
301 - }  
302 - }  
303 - //出场存油  
304 - nh_waybillItem.setM_dblCCCY(czyl);  
305 - //进场存油  
306 - nh_waybillItem.setM_dblJCCY(jzyl);  
307 - //加注量1  
308 - nh_waybillItem.setM_dblJZL1(jzl);  
309 - //加注量2  
310 - nh_waybillItem.setM_dblJZL2(0.0);  
311 - //尿素  
312 - nh_waybillItem.setM_dblNS(ns);  
313 - //消耗量  
314 - nh_waybillItem.setM_dblYH(yh);  
315 - yhTotal = Arith.add(yhTotal, yh);  
316 - //加油地点1  
317 - nh_waybillItem.setM_strJYD1("");  
318 - //加油地点2  
319 - nh_waybillItem.setM_strJYD2("");  
320 - //加油工工号1  
321 - nh_waybillItem.setM_strJYG1("");  
322 - //加油工工号1  
323 - nh_waybillItem.setM_strJYG2("");  
324 - //油耗类型1  
325 - nh_waybillItem.setM_strYHLX1(rylx);  
326 - //油耗类型2  
327 - nh_waybillItem.setM_strYHLX1("");  
328 - }  
329 -  
330 - /*elecInfo = elecInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());  
331 - if (elecInfo != null && elecInfo.size() > 0) {  
332 - Double cdl = 0., hd = 0.;  
333 - for (ElecInfo ei : elecInfo) {  
334 - cdl = Arith.add(cdl, ei.getCdl());  
335 - hd = Arith.add(hd, ei.getHd());  
336 - }  
337 - //出场存油  
338 - nh_waybillItem.setM_dblCCCY(100.0);  
339 - //进场存油  
340 - nh_waybillItem.setM_dblJCCY(100.0);  
341 - //加注量1  
342 - nh_waybillItem.setM_dblJZL1(cdl);  
343 - //加注量2  
344 - nh_waybillItem.setM_dblJZL2(0.0);  
345 - //尿素  
346 - nh_waybillItem.setM_dblNS(0.0);  
347 - //消耗量  
348 - nh_waybillItem.setM_dblYH(hd);  
349 - yhTotal = Arith.add(yhTotal, hd);  
350 - //加油地点1  
351 - nh_waybillItem.setM_strJYD1("");  
352 - //加油地点2  
353 - nh_waybillItem.setM_strJYD2("");  
354 - //加油工工号1  
355 - nh_waybillItem.setM_strJYG1("");  
356 - //加油工工号1  
357 - nh_waybillItem.setM_strJYG2("");  
358 - //油耗类型1  
359 - nh_waybillItem.setM_strYHLX1("");  
360 - //油耗类型2  
361 - nh_waybillItem.setM_strYHLX1("");  
362 - }*/  
363 -  
364 - nh_waybill.getM_SubInfos().add(nh_waybillItem);  
365 - }  
366 -  
367 - rs[i] = nh_waybill;  
368 - }  
369 -  
370 - totalItem.setM_dblJHLC(jhlc);  
371 - totalItem.setM_dblSJJHLC(sjjhlc);  
372 - totalItem.setM_dblCCLC(cclc);  
373 - totalItem.setM_dblJCLC(jclc);  
374 - totalItem.setM_dblYYLC(yylc);  
375 - totalItem.setM_dblKSLC(kslc);  
376 - totalItem.setM_dblCJLC(cjlc);  
377 - totalItem.setM_dblLBLC(lblc);  
378 - totalItem.setM_dblZJLC(zjlc);  
379 - totalItem.setM_dblZLC(zlc);  
380 - totalItem.setM_strSPY("");  
381 - totalItem.setM_strJSYKQ("");  
382 - totalItem.setM_strSPYKQ("");  
383 - totalItem.setM_strYYZT("");  
384 - totalItem.setM_strBZ("");  
385 - totalItem.setM_dblYH(yhTotal);  
386 -  
387 - total.getM_SubInfos().add(totalItem);  
388 -  
389 - rs[rs.length - 1] = total;  
390 -  
391 - return rs;  
392 - }  
393 -  
394 - /**  
395 - * 将实际排班、油耗数据、电量数据 转换成南汇路单需要的数据格式  
396 - *  
397 - * @param listMap  
398 - * @param oilInfoMap  
399 - * @return  
400 - */  
401 - public static NH_waybill[] to_waybill_NH4TH(ArrayListMultimap<String, ScheduleRealInfo> listMap, ArrayListMultimap<String, OilInfo> oilInfoMap, ArrayListMultimap<String, ElecInfo> elecInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {  
402 - // 返回值list形态(可转数组)  
403 - List<NH_waybill> result = new ArrayList<>();  
404 - List<String> nbbmArray = new ArrayList<>(listMap.keySet());  
405 -  
406 - Field xlbmField = ScheduleRealInfo.class.getDeclaredField("xlBm"), jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");  
407 -  
408 - List<ScheduleRealInfo> list;  
409 - ArrayListMultimap<String, ScheduleRealInfo> xlBmListMap, jGhListMap;  
410 - ScheduleRealInfo sch;  
411 - NH_waybill nh_waybill;  
412 - NH_waybillItem nh_waybillItem;  
413 - List<OilInfo> oilInfo;  
414 - List<ElecInfo> elecInfo;  
415 - for (int i = 0; i < nbbmArray.size(); i++) {  
416 - list = listMap.get(nbbmArray.get(i));  
417 - if (list.size() == 0) {  
418 - continue;  
419 - }  
420 -  
421 - xlBmListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", xlbmField);  
422 - for (String xlBm : xlBmListMap.keySet()) {  
423 - list = xlBmListMap.get(xlBm);  
424 -  
425 - //班次信息  
426 - nh_waybill = new NH_waybill();  
427 - sch = list.get(0);  
428 - //日期  
429 - nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());  
430 - //车辆自编号  
431 - nh_waybill.setM_strNBBM(sch.getClZbh());  
432 - //线路编码  
433 - nh_waybill.setM_strXLBM(sch.getXlBm());  
434 - nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());  
435 -  
436 - //按 驾驶员 分组班次,构造路单子项  
437 - jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);  
438 - for (String jGh : jGhListMap.keySet()) {  
439 - list = jGhListMap.get(jGh);  
440 - nh_waybillItem = new NH_waybillItem();  
441 - //计划里程  
442 - nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));  
443 - //实际计划公里  
444 - nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));  
445 - //实际出场里程  
446 - nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));  
447 - //实际进场里程  
448 - nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));  
449 - //营业公里  
450 - nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));  
451 - //空驶公里  
452 - nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));  
453 - //抽减公里  
454 - nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));  
455 - //烂班公里  
456 - nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));  
457 - //增加公里  
458 - nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));  
459 - //总公里  
460 - nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));  
461 - //烂班公里原因  
462 - nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));  
463 - //抽减公里原因  
464 - nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));  
465 - //计划班次  
466 - nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));  
467 - //实际计划班次  
468 - nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));  
469 - //实际班次 ————> 暂时和实际计划班次相同  
470 - nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));  
471 - //增加班次  
472 - nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));  
473 - //抽减班次  
474 - nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));  
475 - //烂班工时  
476 - nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));  
477 - //路牌  
478 - nh_waybillItem.setM_strLP(list.get(0).getLpName());  
479 - //驾驶员工号  
480 - nh_waybillItem.setM_strJSY(list.get(0).getjGh());  
481 - //售票员工号  
482 - nh_waybillItem.setM_strSPY("");  
483 - for (ScheduleRealInfo sri : list) {  
484 - if (StringUtils.isNotEmpty(sri.getsGh())) {  
485 - nh_waybillItem.setM_strSPY(sri.getsGh());  
486 - break;  
487 - }  
488 - }  
489 - //驾驶员考勤  
490 - nh_waybillItem.setM_strJSYKQ("");  
491 - //售票员考勤  
492 - nh_waybillItem.setM_strSPYKQ("");  
493 - //当班调度员  
494 - nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));  
495 - //营运状态  
496 - nh_waybillItem.setM_strYYZT("");  
497 - //备注  
498 - nh_waybillItem.setM_strBZ("");  
499 -  
500 - oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());  
501 - if (oilInfo != null && oilInfo.size() > 0) {  
502 - Double czyl = 0., jzyl = 0., jzl = 0., ns = 0., yh = 0.;  
503 - String rylx = "";  
504 - for (OilInfo oi : oilInfo) {  
505 - if (oi.getXlbm().equals(sch.getXlBm())) {  
506 - czyl = Arith.add(czyl, oi.getCzyl());  
507 - jzyl = Arith.add(jzyl, oi.getJzyl());  
508 - jzl = Arith.add(jzl, oi.getJzl());  
509 - ns = Arith.add(ns, oi.getNs());  
510 - yh = Arith.add(yh, oi.getYh());  
511 - rylx = oi.getRylx();  
512 - }  
513 - }  
514 - //出场存油  
515 - nh_waybillItem.setM_dblCCCY(czyl);  
516 - //进场存油  
517 - nh_waybillItem.setM_dblJCCY(jzyl);  
518 - //加注量1  
519 - nh_waybillItem.setM_dblJZL1(jzl);  
520 - //加注量2  
521 - nh_waybillItem.setM_dblJZL2(0.0);  
522 - //尿素  
523 - nh_waybillItem.setM_dblNS(ns);  
524 - //消耗量  
525 - nh_waybillItem.setM_dblYH(yh);  
526 - //加油地点1  
527 - nh_waybillItem.setM_strJYD1("");  
528 - //加油地点2  
529 - nh_waybillItem.setM_strJYD2("");  
530 - //加油工工号1  
531 - nh_waybillItem.setM_strJYG1("");  
532 - //加油工工号1  
533 - nh_waybillItem.setM_strJYG2("");  
534 - //油耗类型1  
535 - nh_waybillItem.setM_strYHLX1(rylx);  
536 - //油耗类型2  
537 - nh_waybillItem.setM_strYHLX1("");  
538 - }  
539 -  
540 - elecInfo = elecInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());  
541 - if (elecInfo != null && elecInfo.size() > 0) {  
542 - Double cdl = 0., hd = 0.;  
543 - for (ElecInfo ei : elecInfo) {  
544 - cdl = Arith.add(cdl, ei.getCdl());  
545 - hd = Arith.add(hd, ei.getHd());  
546 - }  
547 - //出场存油  
548 - nh_waybillItem.setM_dblCCCY(100.0);  
549 - //进场存油  
550 - nh_waybillItem.setM_dblJCCY(100.0);  
551 - //加注量1  
552 - nh_waybillItem.setM_dblJZL1(cdl);  
553 - //加注量2  
554 - nh_waybillItem.setM_dblJZL2(0.0);  
555 - //尿素  
556 - nh_waybillItem.setM_dblNS(0.0);  
557 - //消耗量  
558 - nh_waybillItem.setM_dblYH(hd);  
559 - //加油地点1  
560 - nh_waybillItem.setM_strJYD1("");  
561 - //加油地点2  
562 - nh_waybillItem.setM_strJYD2("");  
563 - //加油工工号1  
564 - nh_waybillItem.setM_strJYG1("");  
565 - //加油工工号1  
566 - nh_waybillItem.setM_strJYG2("");  
567 - //油耗类型1  
568 - nh_waybillItem.setM_strYHLX1("");  
569 - //油耗类型2  
570 - nh_waybillItem.setM_strYHLX1("");  
571 - }  
572 -  
573 - nh_waybill.getM_SubInfos().add(nh_waybillItem);  
574 - }  
575 -  
576 - result.add(nh_waybill);  
577 - }  
578 - }  
579 -  
580 - return result.toArray(new NH_waybill[result.size()]);  
581 - }  
582 -  
583 -  
584 - /**  
585 - * 将实际排班和油耗数据 转换成上南路单需要的数据格式  
586 - *  
587 - * @param listMap  
588 - * @param oilInfoMap  
589 - * @return  
590 - */  
591 - public static SN_waybill[] to_waybill_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap) throws NoSuchFieldException {  
592 -  
593 - List<String> nbbmArray = new ArrayList<>(listMap.keySet());  
594 - SN_waybill[] rs = new SN_waybill[nbbmArray.size()];  
595 - Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");  
596 -  
597 - List<ScheduleRealInfo> list;  
598 - ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;  
599 - ScheduleRealInfo sch;  
600 - SN_waybill sn_waybill;  
601 - SN_waybillItem sn_waybillItem;  
602 -  
603 - OilComp oilComp = new OilComp();  
604 - List<OilInfo> oilArray;  
605 - for (int i = 0; i < nbbmArray.size(); i++) {  
606 - list = listMap.get(nbbmArray.get(i));  
607 - if (list.size() == 0)  
608 - continue;  
609 -  
610 - sch = list.get(0);  
611 - sn_waybill = new SN_waybill();  
612 - sn_waybill.setLine_no(sch.getXlBm());  
613 - sn_waybill.setWork_date(sch.getScheduleDateStr());  
614 - sn_waybill.setComp_id(sch.getFgsBm());  
615 - sn_waybill.setGuidecard(sch.getLpName());  
616 - sn_waybill.setCar_id(sch.getClZbh());  
617 - //实际班次  
618 - sn_waybill.setAct_num(ScheduleCalculator.countSJJHBC(list));  
619 - //晚班实际班次  
620 - sn_waybill.setL_act_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));  
621 - //营业里程  
622 - sn_waybill.setWork_way(ScheduleCalculator.calcYYLC(list));  
623 - //空驶里程  
624 - sn_waybill.setLeisure_way(ScheduleCalculator.calcKSLC(list));  
625 - //总里程  
626 - sn_waybill.setCount_way(ScheduleCalculator.calcZLC(list));  
627 - //路单类型(0普通,1包车)  
628 - sn_waybill.setLd_type("0");  
629 - //油料类型(2、柴油 3、天然气 4、汽油柴油 5、液化气 6、液化气汽油 7、液化气柴油 8、天然气汽油 9、电)  
630 - //暂时全部柴油车  
631 - sn_waybill.setOil_type("2");  
632 -  
633 - //根据车辆获取油量信息  
634 - oilArray = likeGet(oilInfoMap, sch.getClZbh() + "_");  
635 - if (oilArray.size() > 0) {  
636 - Collections.sort(oilArray, oilComp);  
637 - //出厂存油  
638 - sn_waybill.setOut_oil(oilArray.get(0).getCzyl());  
639 - //油料加注  
640 - sn_waybill.setAdd_oil(sumAddOil(oilArray));  
641 - //进场存油  
642 - sn_waybill.setEnd_oil(oilArray.get(oilArray.size() - 1).getJzyl());  
643 - //油料消耗  
644 - sn_waybill.setExpend_oil(countOilExpend(oilArray));  
645 - //非营业用油类型 非营业用油类型(1.常规车2.包车3.加开包车)  
646 - sn_waybill.setNowork_oil_type("1");  
647 - //非营业用油  
648 - sn_waybill.setNowork_oil(0);  
649 - //非营业用油油耗量(保养用油)  
650 - sn_waybill.setNowork_oil1(0);  
651 - //非营业用油油耗量(票务用油)  
652 - sn_waybill.setNowork_oil2(0);  
653 - //非营业用油油耗量(其他用油)  
654 - sn_waybill.setNowork_oil3(0);  
655 - //营业用油  
656 - sn_waybill.setWork_oil(countOilExpend(oilArray));  
657 - //其他营业用油  
658 - sn_waybill.setQt_work_oil(0);  
659 - }  
660 - sn_waybill.setDriver_detail(new ArrayList<SN_waybillItem>());  
661 -  
662 - //按 驾驶员 分组班次,构造路单子项  
663 - jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);  
664 - for (String jGh : jGhListMap.keySet()) {  
665 - list = jGhListMap.get(jGh);  
666 - sn_waybillItem = new SN_waybillItem();  
667 - sch = list.get(0);  
668 - //司机编号  
669 - sn_waybillItem.setDriver_no(sch.getjGh());  
670 - //司机名称  
671 - sn_waybillItem.setDriver_name(sch.getjName());  
672 - //售票员编号  
673 - sn_waybillItem.setBusman_no(sch.getsGh());  
674 - //售票员名称  
675 - sn_waybillItem.setBusman_name(sch.getsName());  
676 - //行驶里程  
677 - sn_waybillItem.setDriver_way(ScheduleCalculator.calcYYLC(list));  
678 - //空驶公里  
679 - sn_waybillItem.setKs_way(ScheduleCalculator.calcKSLC(list));  
680 - //柴油加注量、电加注量同一字段  
681 - sn_waybillItem.setDo_oil_2(countOilExpend(oilArray, sch.getjGh()));  
682 -  
683 - sn_waybill.getDriver_detail().add(sn_waybillItem);  
684 - }  
685 -  
686 - rs[i] = sn_waybill;  
687 - }  
688 - return rs;  
689 - }  
690 -  
691 - /**  
692 - * 将实际排班转换成上南需要损失公里数据  
693 - *  
694 - * @param listMap  
695 - * @return  
696 - */  
697 - public static SN_lossMileage[] to_lossMileage_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap) throws NoSuchFieldException {  
698 - List<String> lineArray = new ArrayList<>(listMap.keySet());  
699 - SN_lossMileage[] rs = new SN_lossMileage[lineArray.size()];  
700 -  
701 - List<ScheduleRealInfo> list;  
702 - ScheduleRealInfo sch;  
703 - for (int i = 0; i < lineArray.size(); i++) {  
704 - list = listMap.get(lineArray.get(i));  
705 -  
706 - sch = list.get(0);  
707 - SN_lossMileage lossMileage = new SN_lossMileage();  
708 - //线路编号  
709 - lossMileage.setLine_id(sch.getXlBm());  
710 - //营运日期  
711 - lossMileage.setWork_date(sch.getScheduleDateStr());  
712 - //分公司编号  
713 - lossMileage.setComp_id(sch.getFgsBm());  
714 - //少驶公里  
715 - lossMileage.setLoss_way(ScheduleCalculator.calcCJLC(list));  
716 - //实际公里  
717 - lossMileage.setAct_way(ScheduleCalculator.calcYYLC(list));  
718 - //计划公里  
719 - lossMileage.setJh_way(ScheduleCalculator.calcJHLC(list));  
720 -  
721 - //路阻损失公里  
722 - lossMileage.setLoss_lz(ScheduleCalculator.calcCJLC2(list, "路阻"));  
723 - //吊慢损失公里  
724 - lossMileage.setLoss_dm(ScheduleCalculator.calcCJLC2(list, "吊慢"));  
725 - //故障损失公里  
726 - lossMileage.setLoss_gz(ScheduleCalculator.calcCJLC2(list, "故障"));  
727 - //纠纷损失公里  
728 - lossMileage.setLoss_jf(ScheduleCalculator.calcCJLC2(list, "纠纷"));  
729 - //肇事损失公里  
730 - lossMileage.setLoss_zs(ScheduleCalculator.calcCJLC2(list, "肇事"));  
731 - //缺人损失公里  
732 - lossMileage.setLoss_qr(ScheduleCalculator.calcCJLC2(list, "缺人"));  
733 - //缺车损失公里  
734 - lossMileage.setLoss_qc(ScheduleCalculator.calcCJLC2(list, "缺车"));  
735 - //客稀损失公里  
736 - lossMileage.setLoss_kx(ScheduleCalculator.calcCJLC2(list, "客稀"));  
737 - //其他损失公里  
738 - lossMileage.setLoss_qt(ScheduleCalculator.calcCJLC2(list, "其他"));  
739 - //配车损失公里  
740 - lossMileage.setLoss_pc(ScheduleCalculator.calcCJLC2(list, "配车"));  
741 - //保养损失公里  
742 - lossMileage.setLoss_by(ScheduleCalculator.calcCJLC2(list, "保养"));  
743 - //气候损失公里  
744 - lossMileage.setLoss_qh(ScheduleCalculator.calcCJLC2(list, "气候"));  
745 - //援外损失公里  
746 - lossMileage.setLoss_yw(ScheduleCalculator.calcCJLC2(list, "援外"));  
747 - //抽减损失公里  
748 - lossMileage.setLoss_cj(ScheduleCalculator.calcCJLC2(list, "抽减"));  
749 -  
750 - //实际班次  
751 - lossMileage.setAct_num(ScheduleCalculator.countSJJHBC(list));  
752 - //早班班次  
753 - lossMileage.setEarly_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.earlyArray(list)));  
754 - //晚班班次  
755 - lossMileage.setLate_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));  
756 - //另加班次  
757 - lossMileage.setL_act_num(ScheduleCalculator.countZJBC(list));  
758 - //早班另加班次  
759 - lossMileage.setL_early_num(ScheduleCalculator.countZJBC(ScheduleCalculator.earlyArray(list)));  
760 - //晚班另加班次  
761 - lossMileage.setL_late_num(ScheduleCalculator.countZJBC(ScheduleCalculator.lastArray(list)));  
762 - //计划班次  
763 - lossMileage.setJ_act_num(ScheduleCalculator.countJHBC(list));  
764 - //早班计划班次  
765 - lossMileage.setJ_early_num(ScheduleCalculator.countJHBC(ScheduleCalculator.earlyArray(list)));  
766 - //晚班计划班次  
767 - lossMileage.setJ_late_num(ScheduleCalculator.countJHBC(ScheduleCalculator.lastArray(list)));  
768 - //放站班次  
769 - lossMileage.setF_act_bc(ScheduleCalculator.countEmpty(list));  
770 - //早班放站班次  
771 - lossMileage.setF_early_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.earlyArray(list)));  
772 - //晚班放站班次  
773 - lossMileage.setF_late_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.lastArray(list)));  
774 - //调头班次  
775 - lossMileage.setDt_act_bc(0);  
776 - //早班调头班次  
777 - lossMileage.setDt_early_bc(0);  
778 - //晚班调头班次  
779 - lossMileage.setDt_late_bc(0);  
780 - //大间隔班次  
781 - lossMileage.setD_act_num(ScheduleCalculator.countSpaceLg(list));  
782 - //早班大间隔班次  
783 - lossMileage.setD_early_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.earlyArray(list)));  
784 - //晚班大间隔班次  
785 - lossMileage.setD_late_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.lastArray(list)));  
786 - //最大间隔时间  
787 - lossMileage.setD_act_max(ScheduleCalculator.calcMaxSpace(list));  
788 - //故障分  
789 - lossMileage.setLoss_gzf(0);  
790 - //故障次数  
791 - lossMileage.setLoss_gzcs(0);  
792 -  
793 -  
794 - rs[i] = lossMileage;  
795 - }  
796 - return rs;  
797 - }  
798 -  
799 - private static double countOilExpend(List<OilInfo> oilArray) {  
800 - double sum = 0;  
801 - for (OilInfo oilInfo : oilArray) {  
802 - sum = Arith.add(sum, oilInfo.getYh());  
803 - }  
804 - return sum;  
805 - }  
806 -  
807 - private static double sumAddOil(List<OilInfo> oilArray) {  
808 - double sum = 0;  
809 - for (OilInfo oilInfo : oilArray) {  
810 - sum = Arith.add(sum, oilInfo.getJzl());  
811 - }  
812 - return sum;  
813 - }  
814 -  
815 - private static double countOilExpend(List<OilInfo> oilArray, String jGh) {  
816 - double sum = 0;  
817 - for (OilInfo oilInfo : oilArray) {  
818 - if (oilInfo.getJsy().equals(jGh))  
819 - sum = Arith.add(sum, oilInfo.getYh());  
820 - }  
821 - return sum;  
822 - }  
823 -  
824 - public static <T> List<T> likeGet(Map<String, T> map, String key) {  
825 - Set<String> ks = map.keySet();  
826 - List<T> list = new ArrayList<>();  
827 -  
828 - if (StringUtils.isEmpty(key))  
829 - return list;  
830 -  
831 - for (String k : ks) {  
832 - if (k.indexOf(key) != -1) {  
833 - list.add(map.get(k));  
834 - }  
835 - }  
836 - return list;  
837 - }  
838 -  
839 - /**  
840 - * 将数据转换成南汇工资系统需要的驾驶员考勤数据  
841 - *  
842 - * @param plans  
843 - * @param reals  
844 - * @param types  
845 - * @return  
846 - */  
847 - public static Jsy_attendance[] to_jsyAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsySet, Map<String, String> types, String rq) {  
848 - //List<String> ghArray = new ArrayList<>(types.keySet());  
849 - List<Jsy_attendance> rs = new ArrayList<Jsy_attendance>();  
850 - for (String jGh : jsySet) {  
851 - List<SchedulePlanInfo> tplans = searchByJsy(plans, jGh);  
852 - List<ScheduleRealInfo> treals = searchRealByJsy(reals, jGh);  
853 - Set<String> lines = new HashSet<String>();  
854 - for (SchedulePlanInfo p : tplans) {  
855 - lines.add(p.getXlBm());  
856 - }  
857 - for (ScheduleRealInfo r : treals) {  
858 - lines.add(r.getXlBm());  
859 - }  
860 - for (String line : lines) {  
861 - Jsy_attendance attendance = new Jsy_attendance();  
862 - SchedulePlanInfo plan = null;  
863 - ScheduleRealInfo real = null;  
864 - for (SchedulePlanInfo p : tplans) {  
865 - if (line.equals(p.getXlBm())) {  
866 - plan = p;  
867 - break;  
868 - }  
869 - }  
870 - for (ScheduleRealInfo r : treals) {  
871 - if (line.equals(r.getXlBm())) {  
872 - real = r;  
873 - break;  
874 - }  
875 - }  
876 - attendance.setRq(rq);  
877 - //考勤  
878 - attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));  
879 - //班型  
880 - attendance.setPlanType(types.get(jGh)==null?"1":types.get(jGh));  
881 - //驾驶员工号  
882 - attendance.setjGh(jGh);  
883 - //早晚班类型  
884 - attendance.calcZybType(reals);  
885 -  
886 - //实际计划  
887 - if(real != null){  
888 - attendance.setXlBm(real.getXlBm());  
889 - attendance.setXlName(real.getXlName());  
890 - attendance.setjName(real.getjName());  
891 - attendance.setsGh(real.getsGh());  
892 - attendance.setsName(real.getsName());  
893 - attendance.setCompany(real.getGsBm());  
894 - attendance.setFgsCompany(real.getFgsBm());  
895 - attendance.addLpName(real.getLpName());  
896 - attendance.addCl(real.getClZbh());  
897 - }  
898 - //计划  
899 - else if(plan != null){  
900 - attendance.setXlBm(plan.getXlBm());  
901 - attendance.setXlName(plan.getXlName());  
902 - attendance.setjName(plan.getjName());  
903 - attendance.setsGh(plan.getsGh());  
904 - attendance.setsName(plan.getsName());  
905 - attendance.setCompany(plan.getGsBm());  
906 - attendance.setFgsCompany(plan.getFgsBm());  
907 - attendance.addLpName(plan.getLpName());  
908 - attendance.addCl(plan.getClZbh());  
909 - }  
910 -  
911 - rs.add(attendance);  
912 - }  
913 - }  
914 -  
915 - return rs.toArray(new Jsy_attendance[rs.size()]);  
916 - }  
917 -  
918 - /**  
919 - * 将数据转换成南汇工资系统需要的考勤数据(司/售) 版本2  
920 - *  
921 - * @param plans  
922 - * @param reals  
923 - * @param types  
924 - * @return  
925 - */  
926 - public static Ssry_attendance[] toAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsys, Set<String> spys, String rq) {  
927 - //List<String> ghArray = new ArrayList<>(types.keySet());  
928 - List<Ssry_attendance> rs = new ArrayList<Ssry_attendance>();  
929 - for (String jGh : jsys) {  
930 - List<SchedulePlanInfo> tplans = searchByGh(plans, jGh, 1);  
931 - List<ScheduleRealInfo> treals = searchRealByGh(reals, jGh, 1);  
932 - padding(reals, tplans, treals, jGh, rq, 1, rs);  
933 - }  
934 -  
935 - for (String sGh : spys) {  
936 - List<SchedulePlanInfo> tplans = searchByGh(plans, sGh, 2);  
937 - List<ScheduleRealInfo> treals = searchRealByGh(reals, sGh, 2);  
938 - padding(reals, tplans, treals, sGh, rq, 2, rs);  
939 - }  
940 -  
941 - return rs.toArray(new Ssry_attendance[rs.size()]);  
942 - }  
943 -  
944 - private static void padding(List<ScheduleRealInfo> reals, List<SchedulePlanInfo> tplans, List<ScheduleRealInfo> treals, String gh, String rq, int yglx, List<Ssry_attendance> rs) {  
945 - Set<String> lines = new HashSet<String>();  
946 - for (SchedulePlanInfo p : tplans) {  
947 - lines.add(p.getXlBm());  
948 - }  
949 - for (ScheduleRealInfo r : treals) {  
950 - lines.add(r.getXlBm());  
951 - }  
952 - for (String line : lines) {  
953 - Ssry_attendance attendance = new Ssry_attendance();  
954 - SchedulePlanInfo plan = null;  
955 - ScheduleRealInfo real = null;  
956 - Set<String> cls = new HashSet<String>(), lps = new HashSet<String>();  
957 - for (SchedulePlanInfo p : tplans) {  
958 - if (line.equals(p.getXlBm())) {  
959 - plan = p;  
960 - cls.add(p.getClZbh());  
961 - lps.add(p.getLpName());  
962 - }  
963 - }  
964 - for (ScheduleRealInfo r : treals) {  
965 - if (line.equals(r.getXlBm())) {  
966 - real = r;  
967 - cls.add(r.getClZbh());  
968 - lps.add(r.getLpName());  
969 - }  
970 - }  
971 - for (String cl : cls) {  
972 - attendance.addCl(cl);  
973 - }  
974 - for (String lp : lps) {  
975 - attendance.addLpName(lp);  
976 - }  
977 - attendance.setYglx(yglx);  
978 - attendance.setRq(rq);  
979 - //考勤  
980 - attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));  
981 - //驾驶员工号  
982 - attendance.setGh(gh);  
983 - //早晚班类型  
984 - attendance.calcZybType(reals);  
985 -  
986 - String name = null;  
987 - //实际计划  
988 - if(real != null){  
989 - attendance.setXlBm(real.getXlBm());  
990 - attendance.setXlName(real.getXlName());  
991 - if (yglx == 1) {  
992 - name = real.getjName();  
993 - } else if (yglx == 2) {  
994 - name = real.getsName();  
995 - }  
996 - }  
997 - //计划  
998 - else if(plan != null){  
999 - attendance.setXlBm(plan.getXlBm());  
1000 - attendance.setXlName(plan.getXlName());  
1001 - if (yglx == 1) {  
1002 - name = plan.getjName();  
1003 - } else if (yglx == 2) {  
1004 - name = plan.getsName();  
1005 - }  
1006 - }  
1007 - attendance.setName(name);  
1008 -  
1009 - rs.add(attendance);  
1010 - }  
1011 - }  
1012 -  
1013 - public static List<SchedulePlanInfo> searchByJsy(List<SchedulePlanInfo> plans, String jGh){  
1014 - List<SchedulePlanInfo> rs = new ArrayList<SchedulePlanInfo>();  
1015 - String oldLineId = "0";  
1016 - for(SchedulePlanInfo plan : plans){  
1017 - if (plan.getjGh().equals(jGh) && !oldLineId.equals(plan.getXlBm())) {  
1018 - rs.add(plan);  
1019 - oldLineId = plan.getXlBm();  
1020 - }  
1021 - }  
1022 -  
1023 - return rs;  
1024 - }  
1025 -  
1026 - public static List<SchedulePlanInfo> searchByGh(List<SchedulePlanInfo> plans, String gh, int yglx){  
1027 - List<SchedulePlanInfo> rs = new ArrayList<SchedulePlanInfo>();  
1028 - for(SchedulePlanInfo plan : plans){  
1029 - String tgh = null;  
1030 - if (yglx == 1) {  
1031 - tgh = plan.getjGh();  
1032 - } else if (yglx == 2) {  
1033 - tgh = plan.getsGh();  
1034 - }  
1035 - if (gh.equals(tgh)) {  
1036 - rs.add(plan);  
1037 - }  
1038 - }  
1039 -  
1040 - return rs;  
1041 - }  
1042 -  
1043 - public static List<ScheduleRealInfo> searchRealByJsy(List<ScheduleRealInfo> reals, String jGh){  
1044 - List<ScheduleRealInfo> rs = new ArrayList<ScheduleRealInfo>();  
1045 - String oldLineId = "0";  
1046 - for(ScheduleRealInfo sch : reals){  
1047 - if (sch.getjGh().equals(jGh) && !oldLineId.equals(sch.getXlBm())) {  
1048 - rs.add(sch);  
1049 - oldLineId = sch.getXlBm();  
1050 - }  
1051 - }  
1052 -  
1053 - return rs;  
1054 - }  
1055 -  
1056 - public static List<ScheduleRealInfo> searchRealByGh(List<ScheduleRealInfo> reals, String gh, int yglx){  
1057 - List<ScheduleRealInfo> rs = new ArrayList<ScheduleRealInfo>();  
1058 - for(ScheduleRealInfo sch : reals){  
1059 - String tgh = null;  
1060 - if (yglx == 1) {  
1061 - tgh = sch.getjGh();  
1062 - } else if (yglx == 2) {  
1063 - tgh = sch.getsGh();  
1064 - }  
1065 - if (gh.equals(tgh)) {  
1066 - rs.add(sch);  
1067 - }  
1068 - }  
1069 -  
1070 - return rs;  
1071 - }  
1072 -  
1073 - /**  
1074 - * 将排班和油耗转换成综合查询需要的数据  
1075 - * @param schList  
1076 - * @param oilList  
1077 - * @return  
1078 - */  
1079 - public static String[] to_getLSLC_PB(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {  
1080 - String[] array = new String[0];  
1081 - try {  
1082 - //按日期分组数据  
1083 - ArrayListMultimap<String, ScheduleRealInfo> schMultimap =  
1084 - new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));  
1085 -  
1086 - ArrayListMultimap<String, OilInfo> oilMultimap =  
1087 - new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));  
1088 -  
1089 - ArrayListMultimap<String, SchedulePlanInfo> planMultimap =  
1090 - new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));  
1091 -  
1092 -  
1093 - //月份有多少天  
1094 - int year = Integer.parseInt(fdate.substring(0, 4));  
1095 - int month = Integer.parseInt(fdate.substring(5, 7));  
1096 - Calendar cal = Calendar.getInstance();  
1097 - cal.set(Calendar.YEAR,year);  
1098 - cal.set(Calendar.MONTH,month - 1);//从0开始  
1099 - int maxDate = cal.getActualMaximum(Calendar.DATE);  
1100 -  
1101 - List<LsLcPb> rs = new ArrayList<>();  
1102 - LsLcPb lcPb;  
1103 - List<ScheduleRealInfo> pbList;  
1104 - List<SchedulePlanInfo> jhList;  
1105 - List<OilInfo> yhList;  
1106 - String rq,rq2;  
1107 - SchedulePlanInfo outPlan;  
1108 - int currentDay = cal.get(Calendar.DAY_OF_MONTH);  
1109 - for(int i = 1; i <= maxDate; i++){  
1110 - lcPb = new LsLcPb();  
1111 - lcPb.setDay(i);  
1112 -  
1113 - rq = fdate + "-" + (i < 10?"0":"") + i;  
1114 - rq2 = rq.replaceAll("-", "");  
1115 -  
1116 - pbList = schMultimap.get(rq);  
1117 - yhList = oilMultimap.get(rq2);  
1118 - jhList = planMultimap.get(rq2);  
1119 -  
1120 - if(i < currentDay){  
1121 - if(pbList == null || pbList.size() == 0)  
1122 - lcPb.setType(4);//休息  
1123 - else{  
1124 - lcPb.setType(1);  
1125 - lcPb.setLckq("");  
1126 - if(yhList != null && yhList.size() > 0){  
1127 - lcPb.setLcyh(yhList.get(0).getYh());  
1128 - }  
1129 - lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));  
1130 - lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));  
1131 - }  
1132 - }  
1133 - else if (i == currentDay)  
1134 - lcPb.setType(3);//今天  
1135 - else {  
1136 - if(jhList == null || jhList.size() == 0)  
1137 - lcPb.setType(4);//休息  
1138 - else{  
1139 - lcPb.setType(2);  
1140 - outPlan = getOutSch(jhList);  
1141 - if(null != outPlan){  
1142 - lcPb.setPbxl(outPlan.getXlName());  
1143 - lcPb.setPblp(outPlan.getLpName());  
1144 - lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));  
1145 - lcPb.setPbyc(outPlan.getClZbh());  
1146 - }  
1147 - else  
1148 - lcPb.setType(4);//休息  
1149 - }  
1150 - }  
1151 -  
1152 - rs.add(lcPb);  
1153 - }  
1154 -  
1155 - //拼接成字符串数组  
1156 - array = new String[rs.size()];  
1157 - StringBuilder sb;  
1158 - for(int i = 0,len=rs.size(); i < len; i++){  
1159 - lcPb = rs.get(i);  
1160 - sb = new StringBuilder();  
1161 -  
1162 - sb.append(lcPb.getType());  
1163 -  
1164 - switch (lcPb.getType()){  
1165 - case 1:  
1166 - sb.append("," + lcPb.getLckq());  
1167 - sb.append("," + lcPb.getLcyh());  
1168 - sb.append("," + lcPb.getLcyylc());  
1169 - sb.append("," + lcPb.getLcfyylc());  
1170 - break;  
1171 - case 2:  
1172 - sb.append("," + lcPb.getPbxl());  
1173 - sb.append("," + lcPb.getPblp());  
1174 - sb.append("," + lcPb.getPbbd());  
1175 - sb.append("," + lcPb.getPbyc());  
1176 - break;  
1177 - }  
1178 - sb.append("," + lcPb.getDay());  
1179 - array[i] = sb.toString();  
1180 - }  
1181 - } catch (NoSuchFieldException e) {  
1182 - logger.error("", e);  
1183 - }  
1184 - return array;  
1185 - }  
1186 -  
1187 - /**  
1188 - * 将排班和油耗转换成综合查询需要的数据  
1189 - * @param schList  
1190 - * @param oilList  
1191 - * @return  
1192 - */  
1193 - public static List<LsLcPb> to_getLSLC_PB_list(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {  
1194 - List<LsLcPb> rs = new ArrayList<>();  
1195 - try {  
1196 - //按日期分组数据  
1197 - ArrayListMultimap<String, ScheduleRealInfo> schMultimap =  
1198 - new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));  
1199 -  
1200 - ArrayListMultimap<String, OilInfo> oilMultimap =  
1201 - new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));  
1202 -  
1203 - ArrayListMultimap<String, SchedulePlanInfo> planMultimap =  
1204 - new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));  
1205 -  
1206 -  
1207 - //月份有多少天  
1208 - int year = Integer.parseInt(fdate.substring(0, 4));  
1209 - int month = Integer.parseInt(fdate.substring(5, 7));  
1210 - Calendar cal = Calendar.getInstance();  
1211 - cal.set(Calendar.YEAR,year);  
1212 - cal.set(Calendar.MONTH,month - 1);//从0开始  
1213 - int maxDate = cal.getActualMaximum(Calendar.DATE);  
1214 -  
1215 - LsLcPb lcPb;  
1216 - List<ScheduleRealInfo> pbList;  
1217 - List<SchedulePlanInfo> jhList;  
1218 - List<OilInfo> yhList;  
1219 - String rq,rq2;  
1220 - SchedulePlanInfo outPlan;  
1221 - int currentDay = cal.get(Calendar.DAY_OF_MONTH);  
1222 - for(int i = 1; i <= maxDate; i++){  
1223 - lcPb = new LsLcPb();  
1224 - lcPb.setDay(i);  
1225 -  
1226 - rq = fdate + "-" + (i < 10?"0":"") + i;  
1227 - rq2 = rq.replaceAll("-", "");  
1228 -  
1229 - pbList = schMultimap.get(rq);  
1230 - yhList = oilMultimap.get(rq2);  
1231 - jhList = planMultimap.get(rq2);  
1232 -  
1233 - if(i < currentDay){  
1234 - if(pbList == null || pbList.size() == 0)  
1235 - lcPb.setType(4);//休息  
1236 - else{  
1237 - lcPb.setType(1);  
1238 - lcPb.setLckq("");  
1239 - if(yhList != null && yhList.size() > 0){  
1240 - lcPb.setLcyh(yhList.get(0).getYh());  
1241 - }  
1242 - lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));  
1243 - lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));  
1244 - }  
1245 - }  
1246 - else if (i == currentDay)  
1247 - lcPb.setType(3);//今天  
1248 - else {  
1249 - if(jhList == null || jhList.size() == 0)  
1250 - lcPb.setType(4);//休息  
1251 - else{  
1252 - lcPb.setType(2);  
1253 - outPlan = getOutSch(jhList);  
1254 - if(null != outPlan){  
1255 - lcPb.setPbxl(outPlan.getXlName());  
1256 - lcPb.setPblp(outPlan.getLpName());  
1257 - lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));  
1258 - lcPb.setPbyc(outPlan.getClZbh());  
1259 - }  
1260 - else  
1261 - lcPb.setType(4);//休息  
1262 - }  
1263 - }  
1264 -  
1265 - rs.add(lcPb);  
1266 - }  
1267 - } catch (NoSuchFieldException e) {  
1268 - logger.error("", e);  
1269 - }  
1270 - return rs;  
1271 - }  
1272 -  
1273 - /**  
1274 - * HH:mm 格式时间减分钟  
1275 - * @param dfsj  
1276 - * @param i  
1277 - * @return  
1278 - */  
1279 - private static String minusMinute(String hhmm, int i) {  
1280 - try {  
1281 - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");  
1282 - long t = sdf.parse(hhmm).getTime();  
1283 -  
1284 - return sdf.format(new Date(t - (i * 60 * 1000)));  
1285 - } catch (ParseException e) {  
1286 - logger.error("", e);  
1287 - }  
1288 - return null;  
1289 - }  
1290 -  
1291 - private static SchedulePlanInfo getOutSch(List<SchedulePlanInfo> pbList) {  
1292 -  
1293 - for(SchedulePlanInfo sch : pbList){  
1294 - if(sch.getBcType().equals("out"))  
1295 - return sch;  
1296 - }  
1297 - return null;  
1298 - }  
1299 -  
1300 - public static class OilComp implements Comparator<OilInfo> {  
1301 -  
1302 - @Override  
1303 - public int compare(OilInfo o1, OilInfo o2) {  
1304 - return o1.getJcsx() - o2.getJcsx();  
1305 - }  
1306 - }  
1307 -  
1308 -  
1309 -} 1 +package com.bsth.server_ws.util;
  2 +
  3 +import java.lang.reflect.Field;
  4 +import java.text.ParseException;
  5 +import java.text.SimpleDateFormat;
  6 +import java.util.ArrayList;
  7 +import java.util.Calendar;
  8 +import java.util.Collections;
  9 +import java.util.Comparator;
  10 +import java.util.Date;
  11 +import java.util.HashMap;
  12 +import java.util.HashSet;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +import java.util.Set;
  16 +
  17 +import org.apache.commons.lang3.StringUtils;
  18 +import org.apache.poi.ss.formula.functions.T;
  19 +import org.slf4j.Logger;
  20 +import org.slf4j.LoggerFactory;
  21 +
  22 +import com.bsth.entity.DutyEmployee;
  23 +import com.bsth.entity.ElecInfo;
  24 +import com.bsth.entity.HInfo;
  25 +import com.bsth.entity.OilInfo;
  26 +import com.bsth.entity.SchedulePlanInfo;
  27 +import com.bsth.entity.ScheduleRealInfo;
  28 +import com.bsth.server_ws.attendance.entity.Ssry_attendance;
  29 +import com.bsth.server_ws.attendance.entity.Jsy_attendance;
  30 +import com.bsth.server_ws.park_station.dto.LsLcPb;
  31 +import com.bsth.server_ws.waybill.entity.NH_waybill;
  32 +import com.bsth.server_ws.waybill.entity.NH_waybillItem;
  33 +import com.bsth.server_ws.waybill.entity.SN_lossMileage;
  34 +import com.bsth.server_ws.waybill.entity.SN_waybill;
  35 +import com.bsth.server_ws.waybill.entity.SN_waybillItem;
  36 +import com.bsth.util.Arith;
  37 +import com.bsth.util.ConvertUtil;
  38 +import com.google.common.collect.ArrayListMultimap;
  39 +
  40 +/**
  41 + * Created by panzhao on 2017/3/15.
  42 + */
  43 +public class WSDataConver {
  44 +
  45 + /**
  46 + * 格式编码和名称映射,与老系统保持一致
  47 + */
  48 + private static Map<String, String> gsMap;
  49 +
  50 + static Logger logger = LoggerFactory.getLogger(WSDataConver.class);
  51 +
  52 + static {
  53 + gsMap = new HashMap<>();
  54 + gsMap.put("55", "上南公司");
  55 + gsMap.put("55_4", "上南一分公司");
  56 + gsMap.put("55_3", "上南六分公司");
  57 + gsMap.put("55_1", "上南二分公司");
  58 + gsMap.put("55_2", "上南三分公司");
  59 + gsMap.put("22", "金高公司");
  60 + gsMap.put("22_2", "二分公司");
  61 + gsMap.put("22_1", "四分公司");
  62 + gsMap.put("22_3", "三分公司");
  63 + gsMap.put("22_5", "一分公司");
  64 + gsMap.put("05", "杨高公司");
  65 + gsMap.put("05_5", "杨高分公司");
  66 + gsMap.put("05_6", "周浦分公司");
  67 + gsMap.put("05_3", "芦潮港分公司");
  68 + gsMap.put("05_1", "川沙分公司");
  69 + gsMap.put("26", "南汇公司");
  70 + gsMap.put("26_3", "南汇三分");
  71 + gsMap.put("26_2", "南汇二分");
  72 + gsMap.put("26_1", "南汇一分");
  73 + gsMap.put("26_4", "南汇维修公司");
  74 + gsMap.put("77", "临港公交");
  75 + gsMap.put("77_1", "临港公交");
  76 + }
  77 +
  78 + /**
  79 + * 将班次list 转换成 getCurrentDayPlan 函数需要的格式
  80 + *
  81 + * @param list
  82 + * @return [0:日期,1:线路名称,2:路牌名称,3:车辆自编号,4:,5:,6:起点时间,7:终点时间,8:起点站名称,9:终点站名称,10:班次类型]
  83 + */
  84 + public static String[] to_getCurrentDayPlan(List<ScheduleRealInfo> list) {
  85 + if (list == null || list.size() == 0)
  86 + return new String[0];
  87 +
  88 + Map<String, String> bcTypeMap = new HashMap<>();
  89 + bcTypeMap.put("out", "出场");
  90 + bcTypeMap.put("in", "进场");
  91 +
  92 + String[] array = new String[list.size()];
  93 + StringBuilder sb;
  94 + ScheduleRealInfo sch;
  95 + int len = list.size();
  96 + for(int i = 0; i < len; i ++){
  97 + sb = new StringBuilder();
  98 + sch = list.get(i);
  99 + sb.append(sch.getScheduleDateStr() + ",");
  100 + sb.append(sch.getXlName() + ",");
  101 + sb.append(sch.getLpName() + ",");
  102 + sb.append(sch.getClZbh() + ",");
  103 + sb.append(",");
  104 + sb.append(",");
  105 + sb.append(sch.getDfsj() + ",");
  106 + sb.append(sch.getZdsj() + ",");
  107 + sb.append(sch.getQdzName() + ",");
  108 + sb.append(sch.getZdzName() + ",");
  109 + sb.append(bcTypeMap.containsKey(sch.getBcType())?bcTypeMap.get(sch.getBcType()):"");
  110 +
  111 + array[i] = sb.toString();
  112 + }
  113 + return array;
  114 + }
  115 +
  116 + /**
  117 + * 将班次list 转换成 returnCCInfo 和 returnJCInfo 函数需要的格式
  118 + *
  119 + * @param list
  120 + * @return [0: 日期, 1: 线路编码, 2: 线路名称, 3: 公司名称, 4: 分公司名称, 5: 路牌, 6: 起点站, 7: 起点计划时间,
  121 + * 8: 起点实际时间, 9: 终点站, 10: 终点计划时间, 11: 终点实际时间, 12: 计划里程, 13: 实际里程,
  122 + * 14: 驾驶员, 15: 售票员, 16: 车辆内部编码, 17: 状态(1 为出场。2为进场), 18: 驾驶员名称, 19: 进场顺序号]
  123 + */
  124 + public static String[] to_returnJCCInfo(List<ScheduleRealInfo> list) {
  125 + if(list == null)
  126 + return new String[0];
  127 +
  128 + int size = list.size();
  129 + String[] array = new String[size];
  130 +
  131 + ScheduleRealInfo sch;
  132 + StringBuffer sb;
  133 + for (int i = 0; i < size; i++) {
  134 + sb = new StringBuffer(",");
  135 +
  136 + sch = list.get(i);
  137 + sb.append(sch.getScheduleDateStr() + ",");
  138 + sb.append(sch.getXlBm() + ",");
  139 + sb.append(sch.getXlName() + ",");
  140 + sb.append(gsMap.get(sch.getGsBm()) + ",");
  141 + sb.append(gsMap.get(sch.getGsBm() + "_" + sch.getFgsBm()) + ",");
  142 + sb.append(sch.getLpName() + ",");
  143 + sb.append(sch.getQdzCode() + ",");
  144 + sb.append(sch.getDfsj() + ",");
  145 + sb.append(nvlGetVal(sch.getFcsjActual()) + ",");
  146 + sb.append(sch.getZdzCode() + ",");
  147 + sb.append(sch.getZdsj() + ",");
  148 + sb.append(nvlGetVal(sch.getZdsjActual()) + ",");
  149 + sb.append(nvlGetVal(sch.getJhlc()) + ",");
  150 + sb.append(nvlGetVal(sch.getJhlc()) + ",");
  151 + sb.append(sch.getjGh() + ",");
  152 + sb.append(nvlGetVal(sch.getsGh()) + ",");
  153 + sb.append(sch.getClZbh() + ",");
  154 + sb.append((sch.getBcType().equals("out") ? 1 : 2) + ",");
  155 + sb.append(sch.getjName() + ",");
  156 + //用ID替代老系统的出场顺序号
  157 + sb.append(sch.getId() + ",");
  158 +
  159 + array[i] = sb.substring(1).toString();
  160 + }
  161 + return array;
  162 + }
  163 +
  164 + public static String nvlGetVal(Object val) {
  165 + return val == null ? "" : val.toString();
  166 + }
  167 +
  168 + /**
  169 + * 将实际排班和油耗数据 转换成南汇路单需要的数据格式
  170 + *
  171 + * @param listMap
  172 + * @param oilInfoMap
  173 + * @return
  174 + */
  175 + public static NH_waybill[] to_waybill_NH(ArrayListMultimap<String, ScheduleRealInfo> listMap, ArrayListMultimap<String, OilInfo> oilInfoMap, ArrayListMultimap<String, ElecInfo> elecInfoMap, ArrayListMultimap<String, HInfo> hInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {
  176 + List<String> nbbmArray = new ArrayList<>(listMap.keySet());
  177 +
  178 + NH_waybill[] rs = new NH_waybill[nbbmArray.size() + 1];
  179 + Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");
  180 + //Field lpField = ScheduleRealInfo.class.getDeclaredField("lpName");
  181 +
  182 + NH_waybill total = new NH_waybill();
  183 + NH_waybillItem nh_waybillItem, totalItem = new NH_waybillItem();
  184 + boolean isFirst = true;
  185 +
  186 + double jhlc = 0, sjjhlc = 0, cclc = 0, jclc = 0, yylc = 0, kslc = 0, cjlc = 0, lblc = 0, zjlc = 0, zlc = 0;
  187 + double yhTotal = 0;
  188 + for (int i = 0; i < nbbmArray.size(); i++) {
  189 + List<ScheduleRealInfo> listSch = listMap.get(nbbmArray.get(i));
  190 + if (listSch.size() == 0)
  191 + continue;
  192 + //班次信息
  193 + NH_waybill nh_waybill = new NH_waybill();
  194 + ScheduleRealInfo sch = listSch.get(0);
  195 + //日期
  196 + nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());
  197 + //车辆自编号
  198 + nh_waybill.setM_strNBBM(sch.getClZbh());
  199 + //线路编码
  200 + nh_waybill.setM_strXLBM(sch.getXlBm());
  201 + nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());
  202 + if (isFirst) {
  203 + total.setM_strYYRQ(sch.getScheduleDateStr());
  204 + total.setM_strNBBM("000-000");
  205 + total.setM_strXLBM("000000");
  206 + total.setM_SubInfos(new ArrayList<NH_waybillItem>());
  207 +
  208 + isFirst = false;
  209 + }
  210 +
  211 + //按 驾驶员 分组班次,构造路单子项
  212 + ArrayListMultimap<String, ScheduleRealInfo> jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(listSch, "_", jGhField);
  213 + for (String jGh : jGhListMap.keySet()) {
  214 + List<ScheduleRealInfo> list = jGhListMap.get(jGh);
  215 + nh_waybillItem = new NH_waybillItem();
  216 + //计划里程
  217 + nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));
  218 + jhlc = Arith.add(jhlc, nh_waybillItem.getM_dblJHLC());
  219 + //实际计划公里
  220 + nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));
  221 + sjjhlc = Arith.add(sjjhlc, nh_waybillItem.getM_dblSJJHLC());
  222 + //实际出场里程
  223 + nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));
  224 + cclc = Arith.add(cclc, nh_waybillItem.getM_dblCCLC());
  225 + //实际进场里程
  226 + nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));
  227 + jclc = Arith.add(jclc, nh_waybillItem.getM_dblJCLC());
  228 + //营业公里
  229 + nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));
  230 + yylc = Arith.add(yylc, nh_waybillItem.getM_dblYYLC());
  231 + //空驶公里
  232 + nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));
  233 + kslc = Arith.add(kslc, nh_waybillItem.getM_dblKSLC());
  234 + //抽减公里
  235 + nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));
  236 + cjlc = Arith.add(cjlc, nh_waybillItem.getM_dblCJLC());
  237 + //烂班公里
  238 + nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));
  239 + lblc = Arith.add(lblc, nh_waybillItem.getM_dblLBLC());
  240 + //增加公里
  241 + nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));
  242 + zjlc = Arith.add(zjlc, nh_waybillItem.getM_dblZJLC());
  243 + //总公里
  244 + nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));
  245 + zlc = Arith.add(zlc, nh_waybillItem.getM_dblZLC());
  246 + //烂班公里原因
  247 + nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));
  248 + //抽减公里原因
  249 + nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));
  250 + //计划班次
  251 + nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));
  252 + //实际计划班次
  253 + nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));
  254 + //实际班次 ————> 暂时和实际计划班次相同
  255 + nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));
  256 + //增加班次
  257 + nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));
  258 + //抽减班次
  259 + nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));
  260 + //烂班工时
  261 + nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));
  262 + //路牌
  263 + nh_waybillItem.setM_strLP(list.get(0).getLpName());
  264 + //驾驶员工号
  265 + nh_waybillItem.setM_strJSY(list.get(0).getjGh());
  266 + //售票员工号
  267 + nh_waybillItem.setM_strSPY("");
  268 + for (ScheduleRealInfo sri : list) {
  269 + if (StringUtils.isNotEmpty(sri.getsGh())) {
  270 + nh_waybillItem.setM_strSPY(sri.getsGh());
  271 + break;
  272 + }
  273 + }
  274 + //驾驶员考勤
  275 + nh_waybillItem.setM_strJSYKQ("");
  276 + //售票员考勤
  277 + nh_waybillItem.setM_strSPYKQ("");
  278 + //当班调度员
  279 + nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));
  280 + //营运状态
  281 + nh_waybillItem.setM_strYYZT("");
  282 + //备注
  283 + nh_waybillItem.setM_strBZ("");
  284 +
  285 + List<OilInfo> oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  286 + if (oilInfo != null && oilInfo.size() > 0) {
  287 + Double czyl = 0., jzyl = 0., jzl = 0., ns = 0., yh = 0.;
  288 + String rylx = "";
  289 + for (OilInfo oi : oilInfo) {
  290 + if (oi.getXlbm().equals(sch.getXlBm())) {
  291 + czyl = Arith.add(czyl, oi.getCzyl());
  292 + jzyl = Arith.add(jzyl, oi.getJzyl());
  293 + jzl = Arith.add(jzl, oi.getJzl());
  294 + ns = Arith.add(ns, oi.getNs());
  295 + yh = Arith.add(yh, oi.getYh());
  296 + rylx = oi.getRylx();
  297 + }
  298 + }
  299 + //出场存油
  300 + nh_waybillItem.setM_dblCCCY(czyl);
  301 + //进场存油
  302 + nh_waybillItem.setM_dblJCCY(jzyl);
  303 + //加注量1
  304 + nh_waybillItem.setM_dblJZL1(jzl);
  305 + //加注量2
  306 + nh_waybillItem.setM_dblJZL2(0.0);
  307 + //尿素
  308 + nh_waybillItem.setM_dblNS(ns);
  309 + //消耗量
  310 + nh_waybillItem.setM_dblYH(yh);
  311 + yhTotal = Arith.add(yhTotal, yh);
  312 + //加油地点1
  313 + nh_waybillItem.setM_strJYD1("");
  314 + //加油地点2
  315 + nh_waybillItem.setM_strJYD2("");
  316 + //加油工工号1
  317 + nh_waybillItem.setM_strJYG1("");
  318 + //加油工工号1
  319 + nh_waybillItem.setM_strJYG2("");
  320 + //油耗类型1
  321 + nh_waybillItem.setM_strYHLX1(rylx);
  322 + //油耗类型2
  323 + nh_waybillItem.setM_strYHLX1("");
  324 + }
  325 +
  326 + List<ElecInfo> elecInfo = elecInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  327 + if (elecInfo != null && elecInfo.size() > 0) {
  328 + Double cdl = 0., hd = 0.;
  329 + for (ElecInfo ei : elecInfo) {
  330 + cdl = Arith.add(cdl, ei.getCdl());
  331 + hd = Arith.add(hd, ei.getHd());
  332 + }
  333 + //出场存油
  334 + nh_waybillItem.setM_dblCCCY(100.0);
  335 + //进场存油
  336 + nh_waybillItem.setM_dblJCCY(100.0);
  337 + //加注量1
  338 + nh_waybillItem.setM_dblJZL1(cdl);
  339 + //加注量2
  340 + nh_waybillItem.setM_dblJZL2(0.0);
  341 + //尿素
  342 + nh_waybillItem.setM_dblNS(0.0);
  343 + //消耗量
  344 + nh_waybillItem.setM_dblYH(hd);
  345 + yhTotal = Arith.add(yhTotal, hd);
  346 + //加油地点1
  347 + nh_waybillItem.setM_strJYD1("");
  348 + //加油地点2
  349 + nh_waybillItem.setM_strJYD2("");
  350 + //加油工工号1
  351 + nh_waybillItem.setM_strJYG1("");
  352 + //加油工工号1
  353 + nh_waybillItem.setM_strJYG2("");
  354 + //油耗类型1
  355 + nh_waybillItem.setM_strYHLX1("");
  356 + //油耗类型2
  357 + nh_waybillItem.setM_strYHLX1("");
  358 + }
  359 +
  360 + List<HInfo> hInfo = hInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  361 + if (hInfo != null && hInfo.size() > 0) {
  362 + Double cql = 0., hq = 0.;
  363 + for (HInfo h : hInfo) {
  364 + cql = Arith.add(cql, h.getJql());
  365 + hq = Arith.add(hq, h.getHn());
  366 + }
  367 + //出场存油
  368 + nh_waybillItem.setM_dblCCCY(100.0);
  369 + //进场存油
  370 + nh_waybillItem.setM_dblJCCY(100.0);
  371 + //加注量1
  372 + nh_waybillItem.setM_dblJZL1(cql);
  373 + //加注量2
  374 + nh_waybillItem.setM_dblJZL2(0.0);
  375 + //尿素
  376 + nh_waybillItem.setM_dblNS(0.0);
  377 + //消耗量
  378 + nh_waybillItem.setM_dblYH(hq);
  379 + yhTotal = Arith.add(yhTotal, hq);
  380 + //加油地点1
  381 + nh_waybillItem.setM_strJYD1("");
  382 + //加油地点2
  383 + nh_waybillItem.setM_strJYD2("");
  384 + //加油工工号1
  385 + nh_waybillItem.setM_strJYG1("");
  386 + //加油工工号1
  387 + nh_waybillItem.setM_strJYG2("");
  388 + //油耗类型1
  389 + nh_waybillItem.setM_strYHLX1("");
  390 + //油耗类型2
  391 + nh_waybillItem.setM_strYHLX1("");
  392 + }
  393 +
  394 + nh_waybill.getM_SubInfos().add(nh_waybillItem);
  395 + }
  396 +
  397 + rs[i] = nh_waybill;
  398 + }
  399 +
  400 + totalItem.setM_dblJHLC(jhlc);
  401 + totalItem.setM_dblSJJHLC(sjjhlc);
  402 + totalItem.setM_dblCCLC(cclc);
  403 + totalItem.setM_dblJCLC(jclc);
  404 + totalItem.setM_dblYYLC(yylc);
  405 + totalItem.setM_dblKSLC(kslc);
  406 + totalItem.setM_dblCJLC(cjlc);
  407 + totalItem.setM_dblLBLC(lblc);
  408 + totalItem.setM_dblZJLC(zjlc);
  409 + totalItem.setM_dblZLC(zlc);
  410 + totalItem.setM_strSPY("");
  411 + totalItem.setM_strJSYKQ("");
  412 + totalItem.setM_strSPYKQ("");
  413 + totalItem.setM_strYYZT("");
  414 + totalItem.setM_strBZ("");
  415 + totalItem.setM_dblYH(yhTotal);
  416 +
  417 + total.getM_SubInfos().add(totalItem);
  418 +
  419 + rs[rs.length - 1] = total;
  420 +
  421 + return rs;
  422 + }
  423 +
  424 + /**
  425 + * 将实际排班、油耗数据、电量数据 转换成南汇路单需要的数据格式
  426 + *
  427 + * @param listMap
  428 + * @param oilInfoMap
  429 + * @return
  430 + */
  431 + public static NH_waybill[] to_waybill_NH4TH(ArrayListMultimap<String, ScheduleRealInfo> listMap, ArrayListMultimap<String, OilInfo> oilInfoMap, ArrayListMultimap<String, ElecInfo> elecInfoMap, List<DutyEmployee> des) throws NoSuchFieldException {
  432 + // 返回值list形态(可转数组)
  433 + List<NH_waybill> result = new ArrayList<>();
  434 + List<String> nbbmArray = new ArrayList<>(listMap.keySet());
  435 +
  436 + Field xlbmField = ScheduleRealInfo.class.getDeclaredField("xlBm"), jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");
  437 +
  438 + List<ScheduleRealInfo> list;
  439 + ArrayListMultimap<String, ScheduleRealInfo> xlBmListMap, jGhListMap;
  440 + ScheduleRealInfo sch;
  441 + NH_waybill nh_waybill;
  442 + NH_waybillItem nh_waybillItem;
  443 + List<OilInfo> oilInfo;
  444 + List<ElecInfo> elecInfo;
  445 + for (int i = 0; i < nbbmArray.size(); i++) {
  446 + list = listMap.get(nbbmArray.get(i));
  447 + if (list.size() == 0) {
  448 + continue;
  449 + }
  450 +
  451 + xlBmListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", xlbmField);
  452 + for (String xlBm : xlBmListMap.keySet()) {
  453 + list = xlBmListMap.get(xlBm);
  454 +
  455 + //班次信息
  456 + nh_waybill = new NH_waybill();
  457 + sch = list.get(0);
  458 + //日期
  459 + nh_waybill.setM_strYYRQ(sch.getScheduleDateStr());
  460 + //车辆自编号
  461 + nh_waybill.setM_strNBBM(sch.getClZbh());
  462 + //线路编码
  463 + nh_waybill.setM_strXLBM(sch.getXlBm());
  464 + nh_waybill.setM_SubInfos(new ArrayList<NH_waybillItem>());
  465 +
  466 + //按 驾驶员 分组班次,构造路单子项
  467 + jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);
  468 + for (String jGh : jGhListMap.keySet()) {
  469 + list = jGhListMap.get(jGh);
  470 + nh_waybillItem = new NH_waybillItem();
  471 + //计划里程
  472 + nh_waybillItem.setM_dblJHLC(ScheduleCalculator.calcJHLC(list));
  473 + //实际计划公里
  474 + nh_waybillItem.setM_dblSJJHLC(ScheduleCalculator.calcSJLC(list));
  475 + //实际出场里程
  476 + nh_waybillItem.setM_dblCCLC(ScheduleCalculator.calcCCLC(list));
  477 + //实际进场里程
  478 + nh_waybillItem.setM_dblJCLC(ScheduleCalculator.calcJCLC(list));
  479 + //营业公里
  480 + nh_waybillItem.setM_dblYYLC(ScheduleCalculator.calcYYLC(list));
  481 + //空驶公里
  482 + nh_waybillItem.setM_dblKSLC(ScheduleCalculator.calcKSLC(list));
  483 + //抽减公里
  484 + nh_waybillItem.setM_dblCJLC(ScheduleCalculator.calcCJLC(list));
  485 + //烂班公里
  486 + nh_waybillItem.setM_dblLBLC(ScheduleCalculator.calcLBLC(list));
  487 + //增加公里
  488 + nh_waybillItem.setM_dblZJLC(ScheduleCalculator.calcZJLC(list));
  489 + //总公里
  490 + nh_waybillItem.setM_dblZLC(ScheduleCalculator.calcZLC(list));
  491 + //烂班公里原因
  492 + nh_waybillItem.setM_strLBYY(ScheduleCalculator.joinLBYY(list));
  493 + //抽减公里原因
  494 + nh_waybillItem.setM_strCJYY(ScheduleCalculator.joinCJYY(list));
  495 + //计划班次
  496 + nh_waybillItem.setM_intJHBC(ScheduleCalculator.countJHBC(list));
  497 + //实际计划班次
  498 + nh_waybillItem.setM_intSJJHBC(ScheduleCalculator.countSJJHBC(list));
  499 + //实际班次 ————> 暂时和实际计划班次相同
  500 + nh_waybillItem.setM_intSJBC(ScheduleCalculator.countSJJHBC(list));
  501 + //增加班次
  502 + nh_waybillItem.setM_intZJBC(ScheduleCalculator.countZJBC(list));
  503 + //抽减班次
  504 + nh_waybillItem.setM_intCJBC(ScheduleCalculator.countCJBC(list));
  505 + //烂班工时
  506 + nh_waybillItem.setM_dblLBGS(ScheduleCalculator.calcLBGS(list));
  507 + //路牌
  508 + nh_waybillItem.setM_strLP(list.get(0).getLpName());
  509 + //驾驶员工号
  510 + nh_waybillItem.setM_strJSY(list.get(0).getjGh());
  511 + //售票员工号
  512 + nh_waybillItem.setM_strSPY("");
  513 + for (ScheduleRealInfo sri : list) {
  514 + if (StringUtils.isNotEmpty(sri.getsGh())) {
  515 + nh_waybillItem.setM_strSPY(sri.getsGh());
  516 + break;
  517 + }
  518 + }
  519 + //驾驶员考勤
  520 + nh_waybillItem.setM_strJSYKQ("");
  521 + //售票员考勤
  522 + nh_waybillItem.setM_strSPYKQ("");
  523 + //当班调度员
  524 + nh_waybillItem.setM_strDDY(ScheduleCalculator.calcDDY(list, des));
  525 + //营运状态
  526 + nh_waybillItem.setM_strYYZT("");
  527 + //备注
  528 + nh_waybillItem.setM_strBZ("");
  529 +
  530 + oilInfo = oilInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  531 + if (oilInfo != null && oilInfo.size() > 0) {
  532 + Double czyl = 0., jzyl = 0., jzl = 0., ns = 0., yh = 0.;
  533 + String rylx = "";
  534 + for (OilInfo oi : oilInfo) {
  535 + if (oi.getXlbm().equals(sch.getXlBm())) {
  536 + czyl = Arith.add(czyl, oi.getCzyl());
  537 + jzyl = Arith.add(jzyl, oi.getJzyl());
  538 + jzl = Arith.add(jzl, oi.getJzl());
  539 + ns = Arith.add(ns, oi.getNs());
  540 + yh = Arith.add(yh, oi.getYh());
  541 + rylx = oi.getRylx();
  542 + }
  543 + }
  544 + //出场存油
  545 + nh_waybillItem.setM_dblCCCY(czyl);
  546 + //进场存油
  547 + nh_waybillItem.setM_dblJCCY(jzyl);
  548 + //加注量1
  549 + nh_waybillItem.setM_dblJZL1(jzl);
  550 + //加注量2
  551 + nh_waybillItem.setM_dblJZL2(0.0);
  552 + //尿素
  553 + nh_waybillItem.setM_dblNS(ns);
  554 + //消耗量
  555 + nh_waybillItem.setM_dblYH(yh);
  556 + //加油地点1
  557 + nh_waybillItem.setM_strJYD1("");
  558 + //加油地点2
  559 + nh_waybillItem.setM_strJYD2("");
  560 + //加油工工号1
  561 + nh_waybillItem.setM_strJYG1("");
  562 + //加油工工号1
  563 + nh_waybillItem.setM_strJYG2("");
  564 + //油耗类型1
  565 + nh_waybillItem.setM_strYHLX1(rylx);
  566 + //油耗类型2
  567 + nh_waybillItem.setM_strYHLX1("");
  568 + }
  569 +
  570 + elecInfo = elecInfoMap.get(list.get(0).getClZbh() + "_" + list.get(0).getjGh());
  571 + if (elecInfo != null && elecInfo.size() > 0) {
  572 + Double cdl = 0., hd = 0.;
  573 + for (ElecInfo ei : elecInfo) {
  574 + cdl = Arith.add(cdl, ei.getCdl());
  575 + hd = Arith.add(hd, ei.getHd());
  576 + }
  577 + //出场存油
  578 + nh_waybillItem.setM_dblCCCY(100.0);
  579 + //进场存油
  580 + nh_waybillItem.setM_dblJCCY(100.0);
  581 + //加注量1
  582 + nh_waybillItem.setM_dblJZL1(cdl);
  583 + //加注量2
  584 + nh_waybillItem.setM_dblJZL2(0.0);
  585 + //尿素
  586 + nh_waybillItem.setM_dblNS(0.0);
  587 + //消耗量
  588 + nh_waybillItem.setM_dblYH(hd);
  589 + //加油地点1
  590 + nh_waybillItem.setM_strJYD1("");
  591 + //加油地点2
  592 + nh_waybillItem.setM_strJYD2("");
  593 + //加油工工号1
  594 + nh_waybillItem.setM_strJYG1("");
  595 + //加油工工号1
  596 + nh_waybillItem.setM_strJYG2("");
  597 + //油耗类型1
  598 + nh_waybillItem.setM_strYHLX1("");
  599 + //油耗类型2
  600 + nh_waybillItem.setM_strYHLX1("");
  601 + }
  602 +
  603 + nh_waybill.getM_SubInfos().add(nh_waybillItem);
  604 + }
  605 +
  606 + result.add(nh_waybill);
  607 + }
  608 + }
  609 +
  610 + return result.toArray(new NH_waybill[result.size()]);
  611 + }
  612 +
  613 +
  614 + /**
  615 + * 将实际排班和油耗数据 转换成上南路单需要的数据格式
  616 + *
  617 + * @param listMap
  618 + * @param oilInfoMap
  619 + * @return
  620 + */
  621 + public static SN_waybill[] to_waybill_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap, Map<String, OilInfo> oilInfoMap) throws NoSuchFieldException {
  622 +
  623 + List<String> nbbmArray = new ArrayList<>(listMap.keySet());
  624 + SN_waybill[] rs = new SN_waybill[nbbmArray.size()];
  625 + Field jGhField = ScheduleRealInfo.class.getDeclaredField("jGh");
  626 +
  627 + List<ScheduleRealInfo> list;
  628 + ArrayListMultimap<String, ScheduleRealInfo> jGhListMap;
  629 + ScheduleRealInfo sch;
  630 + SN_waybill sn_waybill;
  631 + SN_waybillItem sn_waybillItem;
  632 +
  633 + OilComp oilComp = new OilComp();
  634 + List<OilInfo> oilArray;
  635 + for (int i = 0; i < nbbmArray.size(); i++) {
  636 + list = listMap.get(nbbmArray.get(i));
  637 + if (list.size() == 0)
  638 + continue;
  639 +
  640 + sch = list.get(0);
  641 + sn_waybill = new SN_waybill();
  642 + sn_waybill.setLine_no(sch.getXlBm());
  643 + sn_waybill.setWork_date(sch.getScheduleDateStr());
  644 + sn_waybill.setComp_id(sch.getFgsBm());
  645 + sn_waybill.setGuidecard(sch.getLpName());
  646 + sn_waybill.setCar_id(sch.getClZbh());
  647 + //实际班次
  648 + sn_waybill.setAct_num(ScheduleCalculator.countSJJHBC(list));
  649 + //晚班实际班次
  650 + sn_waybill.setL_act_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));
  651 + //营业里程
  652 + sn_waybill.setWork_way(ScheduleCalculator.calcYYLC(list));
  653 + //空驶里程
  654 + sn_waybill.setLeisure_way(ScheduleCalculator.calcKSLC(list));
  655 + //总里程
  656 + sn_waybill.setCount_way(ScheduleCalculator.calcZLC(list));
  657 + //路单类型(0普通,1包车)
  658 + sn_waybill.setLd_type("0");
  659 + //油料类型(2、柴油 3、天然气 4、汽油柴油 5、液化气 6、液化气汽油 7、液化气柴油 8、天然气汽油 9、电)
  660 + //暂时全部柴油车
  661 + sn_waybill.setOil_type("2");
  662 +
  663 + //根据车辆获取油量信息
  664 + oilArray = likeGet(oilInfoMap, sch.getClZbh() + "_");
  665 + if (oilArray.size() > 0) {
  666 + Collections.sort(oilArray, oilComp);
  667 + //出厂存油
  668 + sn_waybill.setOut_oil(oilArray.get(0).getCzyl());
  669 + //油料加注
  670 + sn_waybill.setAdd_oil(sumAddOil(oilArray));
  671 + //进场存油
  672 + sn_waybill.setEnd_oil(oilArray.get(oilArray.size() - 1).getJzyl());
  673 + //油料消耗
  674 + sn_waybill.setExpend_oil(countOilExpend(oilArray));
  675 + //非营业用油类型 非营业用油类型(1.常规车2.包车3.加开包车)
  676 + sn_waybill.setNowork_oil_type("1");
  677 + //非营业用油
  678 + sn_waybill.setNowork_oil(0);
  679 + //非营业用油油耗量(保养用油)
  680 + sn_waybill.setNowork_oil1(0);
  681 + //非营业用油油耗量(票务用油)
  682 + sn_waybill.setNowork_oil2(0);
  683 + //非营业用油油耗量(其他用油)
  684 + sn_waybill.setNowork_oil3(0);
  685 + //营业用油
  686 + sn_waybill.setWork_oil(countOilExpend(oilArray));
  687 + //其他营业用油
  688 + sn_waybill.setQt_work_oil(0);
  689 + }
  690 + sn_waybill.setDriver_detail(new ArrayList<SN_waybillItem>());
  691 +
  692 + //按 驾驶员 分组班次,构造路单子项
  693 + jGhListMap = new ConvertUtil<ScheduleRealInfo>().groupMultiList(list, "_", jGhField);
  694 + for (String jGh : jGhListMap.keySet()) {
  695 + list = jGhListMap.get(jGh);
  696 + sn_waybillItem = new SN_waybillItem();
  697 + sch = list.get(0);
  698 + //司机编号
  699 + sn_waybillItem.setDriver_no(sch.getjGh());
  700 + //司机名称
  701 + sn_waybillItem.setDriver_name(sch.getjName());
  702 + //售票员编号
  703 + sn_waybillItem.setBusman_no(sch.getsGh());
  704 + //售票员名称
  705 + sn_waybillItem.setBusman_name(sch.getsName());
  706 + //行驶里程
  707 + sn_waybillItem.setDriver_way(ScheduleCalculator.calcYYLC(list));
  708 + //空驶公里
  709 + sn_waybillItem.setKs_way(ScheduleCalculator.calcKSLC(list));
  710 + //柴油加注量、电加注量同一字段
  711 + sn_waybillItem.setDo_oil_2(countOilExpend(oilArray, sch.getjGh()));
  712 +
  713 + sn_waybill.getDriver_detail().add(sn_waybillItem);
  714 + }
  715 +
  716 + rs[i] = sn_waybill;
  717 + }
  718 + return rs;
  719 + }
  720 +
  721 + /**
  722 + * 将实际排班转换成上南需要损失公里数据
  723 + *
  724 + * @param listMap
  725 + * @return
  726 + */
  727 + public static SN_lossMileage[] to_lossMileage_SN(ArrayListMultimap<String, ScheduleRealInfo> listMap) throws NoSuchFieldException {
  728 + List<String> lineArray = new ArrayList<>(listMap.keySet());
  729 + SN_lossMileage[] rs = new SN_lossMileage[lineArray.size()];
  730 +
  731 + List<ScheduleRealInfo> list;
  732 + ScheduleRealInfo sch;
  733 + for (int i = 0; i < lineArray.size(); i++) {
  734 + list = listMap.get(lineArray.get(i));
  735 +
  736 + sch = list.get(0);
  737 + SN_lossMileage lossMileage = new SN_lossMileage();
  738 + //线路编号
  739 + lossMileage.setLine_id(sch.getXlBm());
  740 + //营运日期
  741 + lossMileage.setWork_date(sch.getScheduleDateStr());
  742 + //分公司编号
  743 + lossMileage.setComp_id(sch.getFgsBm());
  744 + //少驶公里
  745 + lossMileage.setLoss_way(ScheduleCalculator.calcCJLC(list));
  746 + //实际公里
  747 + lossMileage.setAct_way(ScheduleCalculator.calcYYLC(list));
  748 + //计划公里
  749 + lossMileage.setJh_way(ScheduleCalculator.calcJHLC(list));
  750 +
  751 + //路阻损失公里
  752 + lossMileage.setLoss_lz(ScheduleCalculator.calcCJLC2(list, "路阻"));
  753 + //吊慢损失公里
  754 + lossMileage.setLoss_dm(ScheduleCalculator.calcCJLC2(list, "吊慢"));
  755 + //故障损失公里
  756 + lossMileage.setLoss_gz(ScheduleCalculator.calcCJLC2(list, "故障"));
  757 + //纠纷损失公里
  758 + lossMileage.setLoss_jf(ScheduleCalculator.calcCJLC2(list, "纠纷"));
  759 + //肇事损失公里
  760 + lossMileage.setLoss_zs(ScheduleCalculator.calcCJLC2(list, "肇事"));
  761 + //缺人损失公里
  762 + lossMileage.setLoss_qr(ScheduleCalculator.calcCJLC2(list, "缺人"));
  763 + //缺车损失公里
  764 + lossMileage.setLoss_qc(ScheduleCalculator.calcCJLC2(list, "缺车"));
  765 + //客稀损失公里
  766 + lossMileage.setLoss_kx(ScheduleCalculator.calcCJLC2(list, "客稀"));
  767 + //其他损失公里
  768 + lossMileage.setLoss_qt(ScheduleCalculator.calcCJLC2(list, "其他"));
  769 + //配车损失公里
  770 + lossMileage.setLoss_pc(ScheduleCalculator.calcCJLC2(list, "配车"));
  771 + //保养损失公里
  772 + lossMileage.setLoss_by(ScheduleCalculator.calcCJLC2(list, "保养"));
  773 + //气候损失公里
  774 + lossMileage.setLoss_qh(ScheduleCalculator.calcCJLC2(list, "气候"));
  775 + //援外损失公里
  776 + lossMileage.setLoss_yw(ScheduleCalculator.calcCJLC2(list, "援外"));
  777 + //抽减损失公里
  778 + lossMileage.setLoss_cj(ScheduleCalculator.calcCJLC2(list, "抽减"));
  779 +
  780 + //实际班次
  781 + lossMileage.setAct_num(ScheduleCalculator.countSJJHBC(list));
  782 + //早班班次
  783 + lossMileage.setEarly_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.earlyArray(list)));
  784 + //晚班班次
  785 + lossMileage.setLate_num(ScheduleCalculator.countSJJHBC(ScheduleCalculator.lastArray(list)));
  786 + //另加班次
  787 + lossMileage.setL_act_num(ScheduleCalculator.countZJBC(list));
  788 + //早班另加班次
  789 + lossMileage.setL_early_num(ScheduleCalculator.countZJBC(ScheduleCalculator.earlyArray(list)));
  790 + //晚班另加班次
  791 + lossMileage.setL_late_num(ScheduleCalculator.countZJBC(ScheduleCalculator.lastArray(list)));
  792 + //计划班次
  793 + lossMileage.setJ_act_num(ScheduleCalculator.countJHBC(list));
  794 + //早班计划班次
  795 + lossMileage.setJ_early_num(ScheduleCalculator.countJHBC(ScheduleCalculator.earlyArray(list)));
  796 + //晚班计划班次
  797 + lossMileage.setJ_late_num(ScheduleCalculator.countJHBC(ScheduleCalculator.lastArray(list)));
  798 + //放站班次
  799 + lossMileage.setF_act_bc(ScheduleCalculator.countEmpty(list));
  800 + //早班放站班次
  801 + lossMileage.setF_early_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.earlyArray(list)));
  802 + //晚班放站班次
  803 + lossMileage.setF_late_bc(ScheduleCalculator.countEmpty(ScheduleCalculator.lastArray(list)));
  804 + //调头班次
  805 + lossMileage.setDt_act_bc(0);
  806 + //早班调头班次
  807 + lossMileage.setDt_early_bc(0);
  808 + //晚班调头班次
  809 + lossMileage.setDt_late_bc(0);
  810 + //大间隔班次
  811 + lossMileage.setD_act_num(ScheduleCalculator.countSpaceLg(list));
  812 + //早班大间隔班次
  813 + lossMileage.setD_early_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.earlyArray(list)));
  814 + //晚班大间隔班次
  815 + lossMileage.setD_late_num(ScheduleCalculator.countSpaceLg(ScheduleCalculator.lastArray(list)));
  816 + //最大间隔时间
  817 + lossMileage.setD_act_max(ScheduleCalculator.calcMaxSpace(list));
  818 + //故障分
  819 + lossMileage.setLoss_gzf(0);
  820 + //故障次数
  821 + lossMileage.setLoss_gzcs(0);
  822 +
  823 +
  824 + rs[i] = lossMileage;
  825 + }
  826 + return rs;
  827 + }
  828 +
  829 + private static double countOilExpend(List<OilInfo> oilArray) {
  830 + double sum = 0;
  831 + for (OilInfo oilInfo : oilArray) {
  832 + sum = Arith.add(sum, oilInfo.getYh());
  833 + }
  834 + return sum;
  835 + }
  836 +
  837 + private static double sumAddOil(List<OilInfo> oilArray) {
  838 + double sum = 0;
  839 + for (OilInfo oilInfo : oilArray) {
  840 + sum = Arith.add(sum, oilInfo.getJzl());
  841 + }
  842 + return sum;
  843 + }
  844 +
  845 + private static double countOilExpend(List<OilInfo> oilArray, String jGh) {
  846 + double sum = 0;
  847 + for (OilInfo oilInfo : oilArray) {
  848 + if (oilInfo.getJsy().equals(jGh))
  849 + sum = Arith.add(sum, oilInfo.getYh());
  850 + }
  851 + return sum;
  852 + }
  853 +
  854 + public static <T> List<T> likeGet(Map<String, T> map, String key) {
  855 + Set<String> ks = map.keySet();
  856 + List<T> list = new ArrayList<>();
  857 +
  858 + if (StringUtils.isEmpty(key))
  859 + return list;
  860 +
  861 + for (String k : ks) {
  862 + if (k.indexOf(key) != -1) {
  863 + list.add(map.get(k));
  864 + }
  865 + }
  866 + return list;
  867 + }
  868 +
  869 + /**
  870 + * 将数据转换成南汇工资系统需要的驾驶员考勤数据
  871 + *
  872 + * @param plans
  873 + * @param reals
  874 + * @param types
  875 + * @return
  876 + */
  877 + public static Jsy_attendance[] to_jsyAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsySet, Map<String, String> types, String rq) {
  878 + //List<String> ghArray = new ArrayList<>(types.keySet());
  879 + List<Jsy_attendance> rs = new ArrayList<Jsy_attendance>();
  880 + for (String jGh : jsySet) {
  881 + List<SchedulePlanInfo> tplans = searchByJsy(plans, jGh);
  882 + List<ScheduleRealInfo> treals = searchRealByJsy(reals, jGh);
  883 + Set<String> lines = new HashSet<String>();
  884 + for (SchedulePlanInfo p : tplans) {
  885 + lines.add(p.getXlBm());
  886 + }
  887 + for (ScheduleRealInfo r : treals) {
  888 + lines.add(r.getXlBm());
  889 + }
  890 + for (String line : lines) {
  891 + Jsy_attendance attendance = new Jsy_attendance();
  892 + SchedulePlanInfo plan = null;
  893 + ScheduleRealInfo real = null;
  894 + for (SchedulePlanInfo p : tplans) {
  895 + if (line.equals(p.getXlBm())) {
  896 + plan = p;
  897 + break;
  898 + }
  899 + }
  900 + for (ScheduleRealInfo r : treals) {
  901 + if (line.equals(r.getXlBm())) {
  902 + real = r;
  903 + break;
  904 + }
  905 + }
  906 + attendance.setRq(rq);
  907 + //考勤
  908 + attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));
  909 + //班型
  910 + attendance.setPlanType(types.get(jGh)==null?"1":types.get(jGh));
  911 + //驾驶员工号
  912 + attendance.setjGh(jGh);
  913 + //早晚班类型
  914 + attendance.calcZybType(reals);
  915 +
  916 + //实际计划
  917 + if(real != null){
  918 + attendance.setXlBm(real.getXlBm());
  919 + attendance.setXlName(real.getXlName());
  920 + attendance.setjName(real.getjName());
  921 + attendance.setsGh(real.getsGh());
  922 + attendance.setsName(real.getsName());
  923 + attendance.setCompany(real.getGsBm());
  924 + attendance.setFgsCompany(real.getFgsBm());
  925 + attendance.addLpName(real.getLpName());
  926 + attendance.addCl(real.getClZbh());
  927 + }
  928 + //计划
  929 + else if(plan != null){
  930 + attendance.setXlBm(plan.getXlBm());
  931 + attendance.setXlName(plan.getXlName());
  932 + attendance.setjName(plan.getjName());
  933 + attendance.setsGh(plan.getsGh());
  934 + attendance.setsName(plan.getsName());
  935 + attendance.setCompany(plan.getGsBm());
  936 + attendance.setFgsCompany(plan.getFgsBm());
  937 + attendance.addLpName(plan.getLpName());
  938 + attendance.addCl(plan.getClZbh());
  939 + }
  940 +
  941 + rs.add(attendance);
  942 + }
  943 + }
  944 +
  945 + return rs.toArray(new Jsy_attendance[rs.size()]);
  946 + }
  947 +
  948 + /**
  949 + * 将数据转换成南汇工资系统需要的考勤数据(司/售) 版本2
  950 + *
  951 + * @param plans
  952 + * @param reals
  953 + * @param types
  954 + * @return
  955 + */
  956 + public static Ssry_attendance[] toAttendanceNH(List<SchedulePlanInfo> plans, List<ScheduleRealInfo> reals, Set<String> jsys, Set<String> spys, String rq) {
  957 + //List<String> ghArray = new ArrayList<>(types.keySet());
  958 + List<Ssry_attendance> rs = new ArrayList<Ssry_attendance>();
  959 + for (String jGh : jsys) {
  960 + List<SchedulePlanInfo> tplans = searchByGh(plans, jGh, 1);
  961 + List<ScheduleRealInfo> treals = searchRealByGh(reals, jGh, 1);
  962 + padding(reals, tplans, treals, jGh, rq, 1, rs);
  963 + }
  964 +
  965 + for (String sGh : spys) {
  966 + List<SchedulePlanInfo> tplans = searchByGh(plans, sGh, 2);
  967 + List<ScheduleRealInfo> treals = searchRealByGh(reals, sGh, 2);
  968 + padding(reals, tplans, treals, sGh, rq, 2, rs);
  969 + }
  970 +
  971 + return rs.toArray(new Ssry_attendance[rs.size()]);
  972 + }
  973 +
  974 + private static void padding(List<ScheduleRealInfo> reals, List<SchedulePlanInfo> tplans, List<ScheduleRealInfo> treals, String gh, String rq, int yglx, List<Ssry_attendance> rs) {
  975 + Set<String> lines = new HashSet<String>();
  976 + for (SchedulePlanInfo p : tplans) {
  977 + lines.add(p.getXlBm());
  978 + }
  979 + for (ScheduleRealInfo r : treals) {
  980 + lines.add(r.getXlBm());
  981 + }
  982 + for (String line : lines) {
  983 + Ssry_attendance attendance = new Ssry_attendance();
  984 + SchedulePlanInfo plan = null;
  985 + ScheduleRealInfo real = null;
  986 + Set<String> cls = new HashSet<String>(), lps = new HashSet<String>();
  987 + for (SchedulePlanInfo p : tplans) {
  988 + if (line.equals(p.getXlBm())) {
  989 + plan = p;
  990 + cls.add(p.getClZbh());
  991 + lps.add(p.getLpName());
  992 + }
  993 + }
  994 + for (ScheduleRealInfo r : treals) {
  995 + if (line.equals(r.getXlBm())) {
  996 + real = r;
  997 + cls.add(r.getClZbh());
  998 + lps.add(r.getLpName());
  999 + }
  1000 + }
  1001 + for (String cl : cls) {
  1002 + attendance.addCl(cl);
  1003 + }
  1004 + for (String lp : lps) {
  1005 + attendance.addLpName(lp);
  1006 + }
  1007 + attendance.setYglx(yglx);
  1008 + attendance.setRq(rq);
  1009 + //考勤
  1010 + attendance.setStatus((plan==null?"0":"1") + "," + (real==null?"0":"1"));
  1011 + //驾驶员工号
  1012 + attendance.setGh(gh);
  1013 + //早晚班类型
  1014 + attendance.calcZybType(reals);
  1015 +
  1016 + String name = null;
  1017 + //实际计划
  1018 + if(real != null){
  1019 + attendance.setXlBm(real.getXlBm());
  1020 + attendance.setXlName(real.getXlName());
  1021 + if (yglx == 1) {
  1022 + name = real.getjName();
  1023 + } else if (yglx == 2) {
  1024 + name = real.getsName();
  1025 + }
  1026 + }
  1027 + //计划
  1028 + else if(plan != null){
  1029 + attendance.setXlBm(plan.getXlBm());
  1030 + attendance.setXlName(plan.getXlName());
  1031 + if (yglx == 1) {
  1032 + name = plan.getjName();
  1033 + } else if (yglx == 2) {
  1034 + name = plan.getsName();
  1035 + }
  1036 + }
  1037 + attendance.setName(name);
  1038 +
  1039 + rs.add(attendance);
  1040 + }
  1041 + }
  1042 +
  1043 + public static List<SchedulePlanInfo> searchByJsy(List<SchedulePlanInfo> plans, String jGh){
  1044 + List<SchedulePlanInfo> rs = new ArrayList<SchedulePlanInfo>();
  1045 + String oldLineId = "0";
  1046 + for(SchedulePlanInfo plan : plans){
  1047 + if (plan.getjGh().equals(jGh) && !oldLineId.equals(plan.getXlBm())) {
  1048 + rs.add(plan);
  1049 + oldLineId = plan.getXlBm();
  1050 + }
  1051 + }
  1052 +
  1053 + return rs;
  1054 + }
  1055 +
  1056 + public static List<SchedulePlanInfo> searchByGh(List<SchedulePlanInfo> plans, String gh, int yglx){
  1057 + List<SchedulePlanInfo> rs = new ArrayList<SchedulePlanInfo>();
  1058 + for(SchedulePlanInfo plan : plans){
  1059 + String tgh = null;
  1060 + if (yglx == 1) {
  1061 + tgh = plan.getjGh();
  1062 + } else if (yglx == 2) {
  1063 + tgh = plan.getsGh();
  1064 + }
  1065 + if (gh.equals(tgh)) {
  1066 + rs.add(plan);
  1067 + }
  1068 + }
  1069 +
  1070 + return rs;
  1071 + }
  1072 +
  1073 + public static List<ScheduleRealInfo> searchRealByJsy(List<ScheduleRealInfo> reals, String jGh){
  1074 + List<ScheduleRealInfo> rs = new ArrayList<ScheduleRealInfo>();
  1075 + String oldLineId = "0";
  1076 + for(ScheduleRealInfo sch : reals){
  1077 + if (sch.getjGh().equals(jGh) && !oldLineId.equals(sch.getXlBm())) {
  1078 + rs.add(sch);
  1079 + oldLineId = sch.getXlBm();
  1080 + }
  1081 + }
  1082 +
  1083 + return rs;
  1084 + }
  1085 +
  1086 + public static List<ScheduleRealInfo> searchRealByGh(List<ScheduleRealInfo> reals, String gh, int yglx){
  1087 + List<ScheduleRealInfo> rs = new ArrayList<ScheduleRealInfo>();
  1088 + for(ScheduleRealInfo sch : reals){
  1089 + String tgh = null;
  1090 + if (yglx == 1) {
  1091 + tgh = sch.getjGh();
  1092 + } else if (yglx == 2) {
  1093 + tgh = sch.getsGh();
  1094 + }
  1095 + if (gh.equals(tgh)) {
  1096 + rs.add(sch);
  1097 + }
  1098 + }
  1099 +
  1100 + return rs;
  1101 + }
  1102 +
  1103 + /**
  1104 + * 将排班和油耗转换成综合查询需要的数据
  1105 + * @param schList
  1106 + * @param oilList
  1107 + * @return
  1108 + */
  1109 + public static String[] to_getLSLC_PB(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {
  1110 + String[] array = new String[0];
  1111 + try {
  1112 + //按日期分组数据
  1113 + ArrayListMultimap<String, ScheduleRealInfo> schMultimap =
  1114 + new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));
  1115 +
  1116 + ArrayListMultimap<String, OilInfo> oilMultimap =
  1117 + new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));
  1118 +
  1119 + ArrayListMultimap<String, SchedulePlanInfo> planMultimap =
  1120 + new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));
  1121 +
  1122 +
  1123 + //月份有多少天
  1124 + int year = Integer.parseInt(fdate.substring(0, 4));
  1125 + int month = Integer.parseInt(fdate.substring(5, 7));
  1126 + Calendar cal = Calendar.getInstance();
  1127 + cal.set(Calendar.YEAR,year);
  1128 + cal.set(Calendar.MONTH,month - 1);//从0开始
  1129 + int maxDate = cal.getActualMaximum(Calendar.DATE);
  1130 +
  1131 + List<LsLcPb> rs = new ArrayList<>();
  1132 + LsLcPb lcPb;
  1133 + List<ScheduleRealInfo> pbList;
  1134 + List<SchedulePlanInfo> jhList;
  1135 + List<OilInfo> yhList;
  1136 + String rq,rq2;
  1137 + SchedulePlanInfo outPlan;
  1138 + int currentDay = cal.get(Calendar.DAY_OF_MONTH);
  1139 + for(int i = 1; i <= maxDate; i++){
  1140 + lcPb = new LsLcPb();
  1141 + lcPb.setDay(i);
  1142 +
  1143 + rq = fdate + "-" + (i < 10?"0":"") + i;
  1144 + rq2 = rq.replaceAll("-", "");
  1145 +
  1146 + pbList = schMultimap.get(rq);
  1147 + yhList = oilMultimap.get(rq2);
  1148 + jhList = planMultimap.get(rq2);
  1149 +
  1150 + if(i < currentDay){
  1151 + if(pbList == null || pbList.size() == 0)
  1152 + lcPb.setType(4);//休息
  1153 + else{
  1154 + lcPb.setType(1);
  1155 + lcPb.setLckq("");
  1156 + if(yhList != null && yhList.size() > 0){
  1157 + lcPb.setLcyh(yhList.get(0).getYh());
  1158 + }
  1159 + lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));
  1160 + lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));
  1161 + }
  1162 + }
  1163 + else if (i == currentDay)
  1164 + lcPb.setType(3);//今天
  1165 + else {
  1166 + if(jhList == null || jhList.size() == 0)
  1167 + lcPb.setType(4);//休息
  1168 + else{
  1169 + lcPb.setType(2);
  1170 + outPlan = getOutSch(jhList);
  1171 + if(null != outPlan){
  1172 + lcPb.setPbxl(outPlan.getXlName());
  1173 + lcPb.setPblp(outPlan.getLpName());
  1174 + lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));
  1175 + lcPb.setPbyc(outPlan.getClZbh());
  1176 + }
  1177 + else
  1178 + lcPb.setType(4);//休息
  1179 + }
  1180 + }
  1181 +
  1182 + rs.add(lcPb);
  1183 + }
  1184 +
  1185 + //拼接成字符串数组
  1186 + array = new String[rs.size()];
  1187 + StringBuilder sb;
  1188 + for(int i = 0,len=rs.size(); i < len; i++){
  1189 + lcPb = rs.get(i);
  1190 + sb = new StringBuilder();
  1191 +
  1192 + sb.append(lcPb.getType());
  1193 +
  1194 + switch (lcPb.getType()){
  1195 + case 1:
  1196 + sb.append("," + lcPb.getLckq());
  1197 + sb.append("," + lcPb.getLcyh());
  1198 + sb.append("," + lcPb.getLcyylc());
  1199 + sb.append("," + lcPb.getLcfyylc());
  1200 + break;
  1201 + case 2:
  1202 + sb.append("," + lcPb.getPbxl());
  1203 + sb.append("," + lcPb.getPblp());
  1204 + sb.append("," + lcPb.getPbbd());
  1205 + sb.append("," + lcPb.getPbyc());
  1206 + break;
  1207 + }
  1208 + sb.append("," + lcPb.getDay());
  1209 + array[i] = sb.toString();
  1210 + }
  1211 + } catch (NoSuchFieldException e) {
  1212 + logger.error("", e);
  1213 + }
  1214 + return array;
  1215 + }
  1216 +
  1217 + /**
  1218 + * 将排班和油耗转换成综合查询需要的数据
  1219 + * @param schList
  1220 + * @param oilList
  1221 + * @return
  1222 + */
  1223 + public static List<LsLcPb> to_getLSLC_PB_list(String fdate, List<ScheduleRealInfo> schList, List<OilInfo> oilList, List<SchedulePlanInfo> planList) {
  1224 + List<LsLcPb> rs = new ArrayList<>();
  1225 + try {
  1226 + //按日期分组数据
  1227 + ArrayListMultimap<String, ScheduleRealInfo> schMultimap =
  1228 + new ConvertUtil().groupMultiList(schList, "_", ScheduleRealInfo.class.getDeclaredField("scheduleDateStr"));
  1229 +
  1230 + ArrayListMultimap<String, OilInfo> oilMultimap =
  1231 + new ConvertUtil().groupMultiList(oilList, "_", OilInfo.class.getDeclaredField("rq"));
  1232 +
  1233 + ArrayListMultimap<String, SchedulePlanInfo> planMultimap =
  1234 + new ConvertUtil().groupMultiList(planList, "_", SchedulePlanInfo.class.getDeclaredField("scheduleDate"));
  1235 +
  1236 +
  1237 + //月份有多少天
  1238 + int year = Integer.parseInt(fdate.substring(0, 4));
  1239 + int month = Integer.parseInt(fdate.substring(5, 7));
  1240 + Calendar cal = Calendar.getInstance();
  1241 + cal.set(Calendar.YEAR,year);
  1242 + cal.set(Calendar.MONTH,month - 1);//从0开始
  1243 + int maxDate = cal.getActualMaximum(Calendar.DATE);
  1244 +
  1245 + LsLcPb lcPb;
  1246 + List<ScheduleRealInfo> pbList;
  1247 + List<SchedulePlanInfo> jhList;
  1248 + List<OilInfo> yhList;
  1249 + String rq,rq2;
  1250 + SchedulePlanInfo outPlan;
  1251 + int currentDay = cal.get(Calendar.DAY_OF_MONTH);
  1252 + for(int i = 1; i <= maxDate; i++){
  1253 + lcPb = new LsLcPb();
  1254 + lcPb.setDay(i);
  1255 +
  1256 + rq = fdate + "-" + (i < 10?"0":"") + i;
  1257 + rq2 = rq.replaceAll("-", "");
  1258 +
  1259 + pbList = schMultimap.get(rq);
  1260 + yhList = oilMultimap.get(rq2);
  1261 + jhList = planMultimap.get(rq2);
  1262 +
  1263 + if(i < currentDay){
  1264 + if(pbList == null || pbList.size() == 0)
  1265 + lcPb.setType(4);//休息
  1266 + else{
  1267 + lcPb.setType(1);
  1268 + lcPb.setLckq("");
  1269 + if(yhList != null && yhList.size() > 0){
  1270 + lcPb.setLcyh(yhList.get(0).getYh());
  1271 + }
  1272 + lcPb.setLcyylc(ScheduleCalculator.calcYYLC(pbList));
  1273 + lcPb.setLcfyylc(ScheduleCalculator.calcKSLC(pbList));
  1274 + }
  1275 + }
  1276 + else if (i == currentDay)
  1277 + lcPb.setType(3);//今天
  1278 + else {
  1279 + if(jhList == null || jhList.size() == 0)
  1280 + lcPb.setType(4);//休息
  1281 + else{
  1282 + lcPb.setType(2);
  1283 + outPlan = getOutSch(jhList);
  1284 + if(null != outPlan){
  1285 + lcPb.setPbxl(outPlan.getXlName());
  1286 + lcPb.setPblp(outPlan.getLpName());
  1287 + lcPb.setPbbd(minusMinute(outPlan.getFcsj(), 15));
  1288 + lcPb.setPbyc(outPlan.getClZbh());
  1289 + }
  1290 + else
  1291 + lcPb.setType(4);//休息
  1292 + }
  1293 + }
  1294 +
  1295 + rs.add(lcPb);
  1296 + }
  1297 + } catch (NoSuchFieldException e) {
  1298 + logger.error("", e);
  1299 + }
  1300 + return rs;
  1301 + }
  1302 +
  1303 + /**
  1304 + * HH:mm 格式时间减分钟
  1305 + * @param dfsj
  1306 + * @param i
  1307 + * @return
  1308 + */
  1309 + private static String minusMinute(String hhmm, int i) {
  1310 + try {
  1311 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  1312 + long t = sdf.parse(hhmm).getTime();
  1313 +
  1314 + return sdf.format(new Date(t - (i * 60 * 1000)));
  1315 + } catch (ParseException e) {
  1316 + logger.error("", e);
  1317 + }
  1318 + return null;
  1319 + }
  1320 +
  1321 + private static SchedulePlanInfo getOutSch(List<SchedulePlanInfo> pbList) {
  1322 +
  1323 + for(SchedulePlanInfo sch : pbList){
  1324 + if(sch.getBcType().equals("out"))
  1325 + return sch;
  1326 + }
  1327 + return null;
  1328 + }
  1329 +
  1330 + public static class OilComp implements Comparator<OilInfo> {
  1331 +
  1332 + @Override
  1333 + public int compare(OilInfo o1, OilInfo o2) {
  1334 + return o1.getJcsx() - o2.getJcsx();
  1335 + }
  1336 + }
  1337 +
  1338 +
  1339 +}
src/main/java/com/bsth/server_ws/waybill/LD_ServiceSoap.java
1 -package com.bsth.server_ws.waybill;  
2 -  
3 -import java.util.List;  
4 -import java.util.Map;  
5 -  
6 -import javax.jws.WebService;  
7 -import javax.xml.ws.Holder;  
8 -  
9 -import com.fasterxml.jackson.databind.ObjectMapper;  
10 -import org.joda.time.format.DateTimeFormat;  
11 -import org.joda.time.format.DateTimeFormatter;  
12 -import org.slf4j.Logger;  
13 -import org.slf4j.LoggerFactory;  
14 -import org.springframework.beans.BeansException;  
15 -import org.springframework.context.ApplicationContext;  
16 -import org.springframework.context.ApplicationContextAware;  
17 -import org.springframework.stereotype.Component;  
18 -  
19 -import com.bsth.entity.DutyEmployee;  
20 -import com.bsth.entity.ElecInfo;  
21 -import com.bsth.entity.OilInfo;  
22 -import com.bsth.entity.ScheduleRealInfo;  
23 -import com.bsth.redis.ElecRedisService;  
24 -import com.bsth.redis.OilRedisService;  
25 -import com.bsth.redis.ScheduleRedisService;  
26 -import com.bsth.repository.DutyEmployeeRepository;  
27 -import com.bsth.server_ws.util.WSDataConver;  
28 -import com.bsth.server_ws.waybill.entity.NH_waybill;  
29 -import com.bsth.server_ws.waybill.entity.SN_lossMileage;  
30 -import com.bsth.server_ws.waybill.entity.SN_waybill;  
31 -import com.bsth.service.UserService;  
32 -import com.google.common.collect.ArrayListMultimap;  
33 -  
34 -/**  
35 - * Created by panzhao on 2017/3/17.  
36 - */  
37 -@Component  
38 -@WebService(  
39 - name = "LD_ServiceSoap",  
40 - portName = "LD_ServiceSoap",  
41 - serviceName = "LD_Service",  
42 - targetNamespace = "http://control.bsth.com/",  
43 - endpointInterface = "com.bsth.server_ws.waybill.LD_Service")  
44 -public class LD_ServiceSoap implements LD_Service, ApplicationContextAware {  
45 -  
46 - static OilRedisService oilRedisService;  
47 - static ElecRedisService elecRedisService;  
48 - static ScheduleRedisService scheduleRedisService;  
49 - static DutyEmployeeRepository dutyEmployeeRepository;  
50 -  
51 - static UserService userService;  
52 -  
53 - Logger logger = LoggerFactory.getLogger(this.getClass());  
54 -  
55 - private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm"),  
56 - fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd");  
57 -  
58 - @Override  
59 - public boolean waybill_NH(String password, String rq, String companyId, Holder<NH_waybill[]> result, Holder<String> fError) {  
60 - try {  
61 - if(userService.get(password) == null){  
62 - fError.value = "无效的密码!";  
63 - return false;  
64 - }  
65 - //日期减一天,老接口是这样的  
66 - //rq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));  
67 - String prveRq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));  
68 -  
69 - //实际排班  
70 - ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(prveRq, companyId);  
71 - //油耗信息  
72 - ArrayListMultimap<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroup(listMap.keySet(), prveRq);  
73 - //电耗信息  
74 - ArrayListMultimap<String, ElecInfo> elecInfoMap = elecRedisService.findByNbbmGroup(listMap.keySet(), prveRq);  
75 - //当班调派  
76 - long st = fmtyyyyMMddHHmm.parseMillis(prveRq + "00:00"), et = fmtyyyyMMddHHmm.parseMillis(prveRq + "23:59");  
77 - List<DutyEmployee> des = dutyEmployeeRepository.findByTime(st, et);  
78 - //转换成南汇路单需要的格式  
79 - NH_waybill[] array = WSDataConver.to_waybill_NH(listMap, oilInfoMap, elecInfoMap, des);  
80 - result.value = array;  
81 -  
82 - //不再代理老接口数据  
83 - /*if(companyId.equals("26") && !WebServiceProxy.isAllNew(companyId)){  
84 - ClsLDInfo[] oldArray = OldWSClient.getNH_LD(companyId, rq);  
85 - //合并新老系统的数据  
86 - result.value = WebServiceProxy.mergerData(result.value, oldArray, companyId);  
87 - }*/  
88 - } catch (Exception e) {  
89 - logger.error("", e);  
90 - fError.value = "服务器出现异常!";  
91 - return false;  
92 - }  
93 - return true;  
94 - }  
95 -  
96 - @Override  
97 - public boolean waybill_NH4TH(String password, String rq, String companyId, Holder<NH_waybill[]> result, Holder<String> fError) {  
98 - try {  
99 - if(userService.get(password) == null){  
100 - fError.value = "无效的密码!";  
101 - return false;  
102 - }  
103 - //日期减一天,老接口是这样的  
104 - //rq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));  
105 - String prveRq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));  
106 -  
107 - //实际排班  
108 - ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(prveRq, companyId);  
109 - //油耗信息  
110 - ArrayListMultimap<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroup(listMap.keySet(), prveRq);  
111 - //电耗信息  
112 - ArrayListMultimap<String, ElecInfo> elecInfoMap = elecRedisService.findByNbbmGroup(listMap.keySet(), prveRq);  
113 - //当班调派  
114 - long st = fmtyyyyMMddHHmm.parseMillis(prveRq + "00:00"), et = fmtyyyyMMddHHmm.parseMillis(prveRq + "23:59");  
115 - List<DutyEmployee> des = dutyEmployeeRepository.findByTime(st, et);  
116 - //转换成南汇路单需要的格式  
117 - NH_waybill[] array = WSDataConver.to_waybill_NH4TH(listMap, oilInfoMap, elecInfoMap, des);  
118 - result.value = array;  
119 -  
120 - //不再代理老接口数据  
121 - /*if(companyId.equals("26") && !WebServiceProxy.isAllNew(companyId)){  
122 - ClsLDInfo[] oldArray = OldWSClient.getNH_LD(companyId, rq);  
123 - //合并新老系统的数据  
124 - result.value = WebServiceProxy.mergerData(result.value, oldArray, companyId);  
125 - }*/  
126 - } catch (Exception e) {  
127 - logger.error("", e);  
128 - fError.value = "服务器出现异常!";  
129 - return false;  
130 - }  
131 - return true;  
132 - }  
133 -  
134 - @Override  
135 - public boolean waybill_SN(String password, String rq, String companyId, Holder<SN_waybill[]> result, Holder<String> fError) {  
136 - try {  
137 - if(userService.get(password) == null){  
138 - fError.value = "无效的密码!";  
139 - return false;  
140 - }  
141 -  
142 - //实际排班  
143 - ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(rq, companyId);  
144 - //油耗信息  
145 - Map<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroupRaw(listMap.keySet(), rq);  
146 - //转换成上南路单需要的格式  
147 - SN_waybill[] array = WSDataConver.to_waybill_SN(listMap, oilInfoMap);  
148 - result.value = array;  
149 - } catch (Exception e) {  
150 - logger.error("", e);  
151 - fError.value = "服务器出现异常!";  
152 - return false;  
153 - }  
154 - return true;  
155 - }  
156 -  
157 - @Override  
158 - public boolean lossMileage(String password, String rq, String companyId, Holder<SN_lossMileage[]> result, Holder<String> fError) {  
159 - try {  
160 - if(userService.get(password) == null){  
161 - fError.value = "无效的密码!";  
162 - return false;  
163 - }  
164 -  
165 - //按线路分组的实际排班  
166 - ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByLine(rq, companyId);  
167 - //转换成上南需要的损失公里数据  
168 - SN_lossMileage[] array = WSDataConver.to_lossMileage_SN(listMap);  
169 - result.value = array;  
170 - } catch (Exception e) {  
171 - logger.error("", e);  
172 - fError.value = "服务器出现异常!";  
173 - return false;  
174 - }  
175 - return false;  
176 - }  
177 -  
178 -  
179 - @Override  
180 - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
181 - oilRedisService = applicationContext.getBean(OilRedisService.class);  
182 - elecRedisService = applicationContext.getBean(ElecRedisService.class);  
183 - scheduleRedisService = applicationContext.getBean(ScheduleRedisService.class);  
184 - dutyEmployeeRepository = applicationContext.getBean(DutyEmployeeRepository.class);  
185 - userService = applicationContext.getBean(UserService.class);  
186 - }  
187 -} 1 +package com.bsth.server_ws.waybill;
  2 +
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +
  6 +import javax.jws.WebService;
  7 +import javax.xml.ws.Holder;
  8 +
  9 +import com.fasterxml.jackson.databind.ObjectMapper;
  10 +import org.joda.time.format.DateTimeFormat;
  11 +import org.joda.time.format.DateTimeFormatter;
  12 +import org.slf4j.Logger;
  13 +import org.slf4j.LoggerFactory;
  14 +import org.springframework.beans.BeansException;
  15 +import org.springframework.context.ApplicationContext;
  16 +import org.springframework.context.ApplicationContextAware;
  17 +import org.springframework.stereotype.Component;
  18 +
  19 +import com.bsth.entity.DutyEmployee;
  20 +import com.bsth.entity.ElecInfo;
  21 +import com.bsth.entity.HInfo;
  22 +import com.bsth.entity.OilInfo;
  23 +import com.bsth.entity.ScheduleRealInfo;
  24 +import com.bsth.redis.ElecRedisService;
  25 +import com.bsth.redis.HRedisService;
  26 +import com.bsth.redis.OilRedisService;
  27 +import com.bsth.redis.ScheduleRedisService;
  28 +import com.bsth.repository.DutyEmployeeRepository;
  29 +import com.bsth.server_ws.util.WSDataConver;
  30 +import com.bsth.server_ws.waybill.entity.NH_waybill;
  31 +import com.bsth.server_ws.waybill.entity.SN_lossMileage;
  32 +import com.bsth.server_ws.waybill.entity.SN_waybill;
  33 +import com.bsth.service.UserService;
  34 +import com.google.common.collect.ArrayListMultimap;
  35 +
  36 +/**
  37 + * Created by panzhao on 2017/3/17.
  38 + */
  39 +@Component
  40 +@WebService(
  41 + name = "LD_ServiceSoap",
  42 + portName = "LD_ServiceSoap",
  43 + serviceName = "LD_Service",
  44 + targetNamespace = "http://control.bsth.com/",
  45 + endpointInterface = "com.bsth.server_ws.waybill.LD_Service")
  46 +public class LD_ServiceSoap implements LD_Service, ApplicationContextAware {
  47 +
  48 + static OilRedisService oilRedisService;
  49 + static ElecRedisService elecRedisService;
  50 + static HRedisService hRedisService;
  51 + static ScheduleRedisService scheduleRedisService;
  52 + static DutyEmployeeRepository dutyEmployeeRepository;
  53 +
  54 + static UserService userService;
  55 +
  56 + Logger logger = LoggerFactory.getLogger(this.getClass());
  57 +
  58 + private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm"),
  59 + fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd");
  60 +
  61 + @Override
  62 + public boolean waybill_NH(String password, String rq, String companyId, Holder<NH_waybill[]> result, Holder<String> fError) {
  63 + try {
  64 + if(userService.get(password) == null){
  65 + fError.value = "无效的密码!";
  66 + return false;
  67 + }
  68 + //日期减一天,老接口是这样的
  69 + //rq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));
  70 + String prveRq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));
  71 +
  72 + //实际排班
  73 + ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(prveRq, companyId);
  74 + //油耗信息
  75 + ArrayListMultimap<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroup(listMap.keySet(), prveRq);
  76 + //电耗信息
  77 + ArrayListMultimap<String, ElecInfo> elecInfoMap = elecRedisService.findByNbbmGroup(listMap.keySet(), prveRq);
  78 + //氢耗信息
  79 + ArrayListMultimap<String, HInfo> hInfoMap = hRedisService.findByNbbmGroup(listMap.keySet(), prveRq);
  80 + //当班调派
  81 + long st = fmtyyyyMMddHHmm.parseMillis(prveRq + "00:00"), et = fmtyyyyMMddHHmm.parseMillis(prveRq + "23:59");
  82 + List<DutyEmployee> des = dutyEmployeeRepository.findByTime(st, et);
  83 + //转换成南汇路单需要的格式
  84 + NH_waybill[] array = WSDataConver.to_waybill_NH(listMap, oilInfoMap, elecInfoMap, hInfoMap, des);
  85 + result.value = array;
  86 +
  87 + //不再代理老接口数据
  88 + /*if(companyId.equals("26") && !WebServiceProxy.isAllNew(companyId)){
  89 + ClsLDInfo[] oldArray = OldWSClient.getNH_LD(companyId, rq);
  90 + //合并新老系统的数据
  91 + result.value = WebServiceProxy.mergerData(result.value, oldArray, companyId);
  92 + }*/
  93 + } catch (Exception e) {
  94 + logger.error("", e);
  95 + fError.value = "服务器出现异常!";
  96 + return false;
  97 + }
  98 + return true;
  99 + }
  100 +
  101 + @Override
  102 + public boolean waybill_NH4TH(String password, String rq, String companyId, Holder<NH_waybill[]> result, Holder<String> fError) {
  103 + try {
  104 + if(userService.get(password) == null){
  105 + fError.value = "无效的密码!";
  106 + return false;
  107 + }
  108 + //日期减一天,老接口是这样的
  109 + //rq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));
  110 + String prveRq = fmtyyyyMMdd.print(fmtyyyyMMdd.parseDateTime(rq).minusDays(1));
  111 +
  112 + //实际排班
  113 + ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(prveRq, companyId);
  114 + //油耗信息
  115 + ArrayListMultimap<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroup(listMap.keySet(), prveRq);
  116 + //电耗信息
  117 + ArrayListMultimap<String, ElecInfo> elecInfoMap = elecRedisService.findByNbbmGroup(listMap.keySet(), prveRq);
  118 + //当班调派
  119 + long st = fmtyyyyMMddHHmm.parseMillis(prveRq + "00:00"), et = fmtyyyyMMddHHmm.parseMillis(prveRq + "23:59");
  120 + List<DutyEmployee> des = dutyEmployeeRepository.findByTime(st, et);
  121 + //转换成南汇路单需要的格式
  122 + NH_waybill[] array = WSDataConver.to_waybill_NH4TH(listMap, oilInfoMap, elecInfoMap, des);
  123 + result.value = array;
  124 +
  125 + //不再代理老接口数据
  126 + /*if(companyId.equals("26") && !WebServiceProxy.isAllNew(companyId)){
  127 + ClsLDInfo[] oldArray = OldWSClient.getNH_LD(companyId, rq);
  128 + //合并新老系统的数据
  129 + result.value = WebServiceProxy.mergerData(result.value, oldArray, companyId);
  130 + }*/
  131 + } catch (Exception e) {
  132 + logger.error("", e);
  133 + fError.value = "服务器出现异常!";
  134 + return false;
  135 + }
  136 + return true;
  137 + }
  138 +
  139 + @Override
  140 + public boolean waybill_SN(String password, String rq, String companyId, Holder<SN_waybill[]> result, Holder<String> fError) {
  141 + try {
  142 + if(userService.get(password) == null){
  143 + fError.value = "无效的密码!";
  144 + return false;
  145 + }
  146 +
  147 + //实际排班
  148 + ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByNbbm(rq, companyId);
  149 + //油耗信息
  150 + Map<String, OilInfo> oilInfoMap = oilRedisService.findByNbbmGroupRaw(listMap.keySet(), rq);
  151 + //转换成上南路单需要的格式
  152 + SN_waybill[] array = WSDataConver.to_waybill_SN(listMap, oilInfoMap);
  153 + result.value = array;
  154 + } catch (Exception e) {
  155 + logger.error("", e);
  156 + fError.value = "服务器出现异常!";
  157 + return false;
  158 + }
  159 + return true;
  160 + }
  161 +
  162 + @Override
  163 + public boolean lossMileage(String password, String rq, String companyId, Holder<SN_lossMileage[]> result, Holder<String> fError) {
  164 + try {
  165 + if(userService.get(password) == null){
  166 + fError.value = "无效的密码!";
  167 + return false;
  168 + }
  169 +
  170 + //按线路分组的实际排班
  171 + ArrayListMultimap<String, ScheduleRealInfo> listMap = scheduleRedisService.findByDateAndGroupByLine(rq, companyId);
  172 + //转换成上南需要的损失公里数据
  173 + SN_lossMileage[] array = WSDataConver.to_lossMileage_SN(listMap);
  174 + result.value = array;
  175 + } catch (Exception e) {
  176 + logger.error("", e);
  177 + fError.value = "服务器出现异常!";
  178 + return false;
  179 + }
  180 + return false;
  181 + }
  182 +
  183 +
  184 + @Override
  185 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  186 + oilRedisService = applicationContext.getBean(OilRedisService.class);
  187 + elecRedisService = applicationContext.getBean(ElecRedisService.class);
  188 + hRedisService = applicationContext.getBean(HRedisService.class);
  189 + scheduleRedisService = applicationContext.getBean(ScheduleRedisService.class);
  190 + dutyEmployeeRepository = applicationContext.getBean(DutyEmployeeRepository.class);
  191 + userService = applicationContext.getBean(UserService.class);
  192 + }
  193 +}