ScheduleRealInfoServiceImpl.java 6.25 KB
package com.bsth.service.impl;

import com.bsth.entity.ScheduleRealInfo;
import com.bsth.entity.result.AverageSpeed;
import com.bsth.repository.ScheduleRealInfoRepository;
import com.bsth.service.ScheduleRealInfoService;
import com.bsth.util.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

@Service
public class ScheduleRealInfoServiceImpl implements ScheduleRealInfoService {

    @Autowired
    ScheduleRealInfoRepository scheduleRealInfoRepository;

	// 用于计算的数字,只要是一个年月日就行那天不重要
	private static final String DATEStr = "2000-01-01";

    @Autowired
    JdbcTemplate jdbcTemplate;
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
	public List<AverageSpeed> averageSpeed(String time){

		String sql;
		sql = "SELECT * FROM bsth_c_s_sp_info_real WHERE bc_type in('normal','region') AND schedule_date BETWEEN '"+time+"-01' AND '"+time+"-31'  ORDER BY fgs_bm, xl_bm, schedule_date";
		List<ScheduleRealInfo> list = jdbcTemplate.query(sql,
                    new RowMapper<ScheduleRealInfo>() {
                        @Override
                        public ScheduleRealInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
                            ScheduleRealInfo scheduleRealInfo = new ScheduleRealInfo();
                            scheduleRealInfo.setId(rs.getLong("id"));
                            scheduleRealInfo.setScheduleDateStr(rs.getString("schedule_date_str"));
                            scheduleRealInfo.setXlBm(rs.getString("xl_bm"));
                            scheduleRealInfo.setXlDir(rs.getString("xl_dir"));
                            scheduleRealInfo.setXlName(rs.getString("xl_name"));
                            scheduleRealInfo.setGsBm(rs.getString("gs_bm"));
                            scheduleRealInfo.setGsName(rs.getString("gs_name"));
                            scheduleRealInfo.setFgsBm(rs.getString("fgs_bm"));
                            scheduleRealInfo.setFgsName(rs.getString("fgs_name"));
                            scheduleRealInfo.setFcsj(rs.getString("fcsj"));
                            scheduleRealInfo.setFcsjActual(rs.getString("fcsj_actual"));
                            scheduleRealInfo.setZdsj(rs.getString("zdsj"));
                            scheduleRealInfo.setZdsjActual(rs.getString("zdsj_actual"));
                            scheduleRealInfo.setJhlc(Double.valueOf(rs.getString("jhlc")));
                            scheduleRealInfo.setBcType(rs.getString("bc_type"));
                            return scheduleRealInfo;
                        }
                    });

		if (list.size()<1){
			return null;
		}

		// 左边固定列
		TreeMap<String, ScheduleRealInfo> keyMap = new TreeMap<String, ScheduleRealInfo>();


		// 报表纵向列数据生成
		for (int i = 0; list.size() > i; i++) {
			ScheduleRealInfo sr = list.get(i);

			String key = sr.getFgsBm()+"/"+sr.getXlBm();

			ScheduleRealInfo realInfo = this.initScheduleRealInfo();

			if(keyMap.containsKey(key)){
				realInfo = keyMap.get(key);

				this.summation(realInfo, sr);
			} else {
				// 深度拷贝对象
				BeanUtils.copyProperties(sr,realInfo);
				realInfo.setJhTime(0);
				realInfo.setSjTime(0);
				realInfo.setJhlc(0d);
				this.summation(realInfo, sr);
				keyMap.put(key, realInfo);
			}
		}
		List<AverageSpeed> listAS = new ArrayList<>();
		// 表头和数据
		Iterator iter = keyMap.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			// 获取value
			ScheduleRealInfo c = (ScheduleRealInfo) entry.getValue();

			AverageSpeed as = new AverageSpeed();

			as.setBrancheCompanyId(c.getFgsBm());
			as.setBrancheCompanyName(c.getFgsName());
			as.setCompanyId(c.getGsBm());
			as.setCompanyName(c.getGsName());
			as.setLineCode(c.getXlBm());
			as.setLineName(c.getXlName());
			as.setPlanSpeed(c.getJhTime()==0 ? 0f : (float)(c.getJhlc()*60/ c.getJhTime()));
			as.setRealSpeed(c.getSjTime()==0 ? 0f : (float)(c.getJhlc()*60/ c.getSjTime()));
			as.setRq(DateUtils.getDate(time+"-01"));
			as.setRqStr(time);
			listAS.add(as);
		}
		return listAS;
	}


    
    /* 
     * 将时间戳转换为时间
     */
    public static String stampToDate(String s){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }
	public ScheduleRealInfo summation(ScheduleRealInfo sr1, ScheduleRealInfo sr2){

		try {

			if(!StringUtils.isEmpty(sr2.getFcsjActual()) && !StringUtils.isEmpty(sr2.getZdsjActual())){

				Long sjfcsj = Long.valueOf(DateUtils.dateToStamp(DATEStr + " " + sr2.getFcsjActual() + ":00"));
				Long sjzdsj = Long.valueOf(DateUtils.dateToStamp(DATEStr + " " + sr2.getZdsjActual() + ":00"));
				if(sjzdsj<=sjfcsj){
					sjzdsj += 24*3600*1000;
				}
				int sjTime = (int)(sjzdsj-sjfcsj) / (60*1000);
				Long jhfcsj = Long.valueOf(DateUtils.dateToStamp(DATEStr + " " + sr2.getFcsj() + ":00"));
				Long jhzdsj = Long.valueOf(DateUtils.dateToStamp(DATEStr + " " + sr2.getZdsj() + ":00"));
				if(jhzdsj<=jhfcsj){
					jhzdsj += 24*3600*1000;
				}
				int jhTime = (int)(jhzdsj-jhfcsj) / (60*1000);
				sr1.setJhlc(sr1.getJhlc()+sr2.getJhlc());
				sr1.setJhTime(sr1.getJhTime()+jhTime);
				sr1.setSjTime(sr1.getSjTime()+sjTime);
			}
		}catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			logger.error(e.toString());
		}
		return sr1;
	}
	public ScheduleRealInfo initScheduleRealInfo(){
		ScheduleRealInfo realInfo = new ScheduleRealInfo();
		realInfo.setJhlc(0d);
		realInfo.setSjTime(0);
		realInfo.setJhTime(0);
		return realInfo;
	}
}