PilotReport.java 6.24 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<Integer, 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(), d80);
		
		String nbbm = BasicData.deviceId2NbbmMap.get(d80.getDeviceId());
		//处理
		switch (d80.getData().getRequestCode()) {
		case 0xA3:
			//出场请求
			ScheduleRealInfo outSch = dayOfSchedule.nextByBcType(nbbm, "out");
			//如果有对应出场班次
			if(outSch != null){
				//下发调度指令
				directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "系统");
				//当前GPS位置
				GpsEntity gps = gpsRealData.get(d80.getDeviceId());
				d80.setRemarks("计划出场时间:" + outSch.getDfsj() + "<br> 位置:" + coordHtmlStr(gps));
			}else
				d80.setRemarks("没有出场计划");
			
			break;
		
		case 0xA5:
			//进场请求
			ScheduleRealInfo inSch = dayOfSchedule.nextByBcType(nbbm, "in");
			//如果有对应出场班次
			if(inSch != null){
				//当前GPS位置
				GpsEntity gps = gpsRealData.get(d80.getDeviceId());
				d80.setRemarks("计划进场时间:" + inSch.getDfsj() + "<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());
				
				//通知页面
				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());
				
				//通知页面
				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)
				,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>";
	}
}