PilotReport.java 7.4 KB
package com.bsth.data.pilot80;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bsth.data.BasicData;
import com.bsth.data.LineConfigData;
import com.bsth.data.gpsdata.GpsEntity;
import com.bsth.data.gpsdata.GpsRealData;
import com.bsth.data.schedule.DayOfSchedule;
import com.bsth.entity.Line;
import com.bsth.entity.directive.D80;
import com.bsth.entity.realcontrol.D80ReplyTemp;
import com.bsth.entity.realcontrol.LineConfig;
import com.bsth.entity.realcontrol.ScheduleRealInfo;
import com.bsth.repository.directive.D80Repository;
import com.bsth.service.directive.DirectiveService;
import com.bsth.websocket.handler.SendUtils;
import com.google.common.collect.ArrayListMultimap;

/**
 * 
 * @ClassName: PilotReport 
 * @Description: TODO(驾驶员上报) 
 * @author PanZhao
 * @date 2016年8月14日 下午11:37:51 
 *
 */
@Component
public class PilotReport {
	
	@Autowired
	D80Repository d80Repository;
	
	@Autowired
	DayOfSchedule dayOfSchedule;
	
	@Autowired
	LineConfigData lineConfigData;
	
	@Autowired
	DirectiveService directiveService;
	
	@Autowired
	GpsRealData gpsRealData;
	
	@Autowired
	SendUtils sendUtils;
	
	//private static ScheduleComparator.FCNO schComp;
	
	private static ArrayListMultimap<String, D80> d80MultiMap;
	
	Logger logger = LoggerFactory.getLogger(PilotReport.class);
	
	static{
		d80MultiMap = ArrayListMultimap.create();
		//schComp = new ScheduleComparator.FCNO();
	}
	
	public void report(D80 d80){
		//入库
		d80Repository.save(d80);
		//入缓存
		d80MultiMap.put(d80.getData().getLineId().toString(), d80);
		
		String nbbm = BasicData.deviceId2NbbmMap.get(d80.getDeviceId());
		//处理
		switch (d80.getData().getRequestCode()) {
		case 0xA3:
			//出场请求
			ScheduleRealInfo outSch = dayOfSchedule.nextByBcType(nbbm, "out");
			//如果有对应出场班次
			if(outSch != null){
				
				//没有计划里程的出场班次,出场既是首发站,发送下一班次的营运指令
				if(outSch.getJhlc() == null)
					outSch = dayOfSchedule.next(outSch);
				
				//下发调度指令
				directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统");
				d80.setRemarks("计划出场时间:" + outSch.getDfsj());
				//当前GPS位置
				GpsEntity gps = gpsRealData.get(d80.getDeviceId());
				if(null != gps)
					d80.addRemarks("<br> 位置:" + coordHtmlStr(gps));
				
				sendUtils.refreshSch(outSch);
			}else
				d80.setRemarks("没有出场计划");
			
			break;
		
		case 0xA5:
			//进场请求
			ScheduleRealInfo inSch = dayOfSchedule.nextByBcType(nbbm, "in");
			//如果有对应出场班次
			if(inSch != null){
				d80.setRemarks("计划进场时间:" + inSch.getDfsj());
				//当前GPS位置
				GpsEntity gps = gpsRealData.get(d80.getDeviceId());
				if(null != gps)
					d80.addRemarks("<br> 位置:" + coordHtmlStr(gps));
			}else
				d80.setRemarks("没有进场计划");
			break;
		}
		
		//推送到页面
		sendUtils.send80ToPage(d80);
	}
	
	/**
	 * 
	 * @Title: reply 
	 * @Description: TODO(调度员回复) 
	 */
	public void reply(D80 d80){
		String nbbm = BasicData.deviceId2NbbmMap.get(d80.getDeviceId());
		Short reqCode = d80.getData().getRequestCode();
		//默认短语回复
		defaultReply(nbbm, reqCode, d80.getConfirmRs() == 0?true:false);
		
		switch (reqCode) {
		case 0xA3:
			//出场请求回复
			applyOutReply(d80);
			break;
		case 0xA5:
			//进场请求回复
			applyInReply(d80);
			break;
		}
	}
	
	/**
	 * 
	 * @Title: applyOutReply 
	 * @Description: TODO(出场请求回复) 
	 */
	public void applyOutReply(D80 d80){
		//同意
		if(d80.getConfirmRs() == 0){
			String nbbm = BasicData.deviceId2NbbmMap.get(d80.getDeviceId());

			ScheduleRealInfo sch = dayOfSchedule.nextByBcType(nbbm, "out");
			if(null == sch)
				return;
			
			LineConfig conf = lineConfigData.get(sch.getXlBm());
			if(conf.getOutConfig() == 1){
				//为相关班次写入请求出场时间
				sch.setFcsjActualAll(d80.getTimestamp());
				
				dayOfSchedule.save(sch);
				//通知页面
				sendUtils.refreshSch(sch);
			}
		}
	}
	
	/**
	 * 
	 * @Title: applyInReply 
	 * @Description: TODO(进场请求回复) 
	 */
	public void applyInReply(D80 d80){
		//同意
		if(d80.getConfirmRs() == 0){
			String nbbm = BasicData.deviceId2NbbmMap.get(d80.getDeviceId());
			
			ScheduleRealInfo sch = dayOfSchedule.nextByBcType(nbbm, "in");
			if(null == sch)
				return;
			
			LineConfig conf = lineConfigData.get(sch.getXlBm());
			if(conf.getInConfig() == 1){
				//为相关班次写入进场时间
				sch.setZdsjActualAll(d80.getTimestamp());
				
				//没有里程的进场班次
				if(sch.getBcsj() == null && sch.getJhlc() == null)
					sch.setFcsjActualAll(d80.getTimestamp());
					
				dayOfSchedule.save(sch);
				//通知页面
				sendUtils.refreshSch(sch);
			}
		}
	}
	
	public void defaultReply(String nbbm, short requestCode, boolean agree){
		Line line = BasicData.nbbm2LineMap.get(nbbm);
		String lineCode = null;
		
		if(line != null)
			lineCode = line.getLineCode();
		else{
			try{
				lineCode = gpsRealData.get(BasicData.deviceId2NbbmMap.inverse().get(nbbm)).getLineId().toString();
			}catch(Exception e){
				logger.error("", e);
			}
		}
		
		if(null == lineCode)
			return;
		
		LineConfig conf = lineConfigData.get(lineCode);
		D80ReplyTemp temp = conf.findByCode(requestCode);
		
		if(null == temp)
			return;
		
		String text;
		if(agree)
			text = temp.getAgreeText();
		else
			text = temp.getRejectText();
		
		directiveService.send60Phrase(nbbm, text, "系统");
	}
	
	/**
	 * 
	 * @Title: resumeOperation 
	 * @Description: TODO(恢复营运) 
	 */
	public void resumeOperation(D80 d80){
		
	}
	
	/**
	 * 
	 * @Title: applyTiaodang 
	 * @Description: TODO(申请调档) 
	 */
	public void applyTiaodang(D80 d80){
		
	}
	
	/**
	 * 
	 * @Title: unconfirmed80 
	 * @Description: TODO(根据lineCode 获取未处理的80数据) 
	 */
	public List<D80> unconfirmed80(Integer lineCode){
		List<D80> lineAll = d80MultiMap.get(lineCode.toString())
				,rs = new ArrayList<>();
		
		for(D80 d80 : lineAll)
			if(!d80.isConfirm())
				rs.add(d80);
		
		return rs;
	}
	
	public D80 findById(int id){
		Collection<D80> all = d80MultiMap.values();
		
		for(D80 d80 : all){
			if(d80.getId() == id)
				return d80;
		}
		
		return null;
	}
	
	public String coordHtmlStr(GpsEntity gps){
		
		return "<span class=\"nt-coord\" data-lon=\""+gps.getLon()+"\" data-lat=\""+gps.getLat()+"\"></span>";
	}
	
	public Collection<D80> findAll(){
		return d80MultiMap.values();
	}
	
	public void clear(String lineCode){
		logger.info("清除 80数据 before: " + d80MultiMap.size());
		d80MultiMap.removeAll(lineCode);
		logger.info("清除 80数据 after: " + d80MultiMap.size());
	}

	public Collection<? extends D80> findByCar(String nbbm) {
		List<D80> rs = new ArrayList<>();
		String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
		if(null == deviceId)
			return rs;
		
		Collection<D80> all = findAll();
		for(D80 d80 : all){
			if(d80.getDeviceId().equals(deviceId))
				rs.add(d80);
		}
		return rs;
	}
}