CarController.java 6.6 KB
package com.teplot.air.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.air.led.LedKit;
import com.air.model.AirPort;
import com.air.model.AirPortCar;
import com.air.model.AirPortCarStatus;
import com.jfinal.aop.Before;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.teplot.air.common.AbsController;
import com.teplot.air.controller.StationGateType.GateType;
import com.teplot.air.validator.CarValidator;
import com.teplot.common.Response;

/**
 * Depiction:码头车辆管理
 * <p>
 * Modify:
 * <p>
 * Author: Kevin Lynn
 * <p>
 * Create Date:2017年4月7日 下午3:31:30
 * 
 */
@Before(CarValidator.class)
public class CarController extends AbsController {

	// 手机端车辆进场申请
	public void apply() {
		AirPortCar model = getModel(AirPortCar.class, "");
		String carNo = model.getCarNo();
		boolean flag = false;
		String msg = "";
		AirPortCar old = AirPortCar.dao.searchFirst("carNo", carNo);
		if (old != null && AirPortCarStatus.valueOf(old.getStatus()) == AirPortCarStatus.ENTER) {
			// 已经进场
			msg = "不可重复进场";
		} else {
			// 没有进场,直接进场
			if (old == null) {
				model.setApplyTime(new Date());
				model.save();
			}

			flag = enter(carNo, model.getStationArea());
			msg = flag ? "操作成功" : "不支持该货站";
		}

		Response ret = new Response(flag ? CODE_SUCCESS : CODE_FAILURE);
		ret.setMsg(msg);
		ret.setData(AirPortCar.dao.searchFirst("carNo", carNo));
		renderJson(ret);
	}

	/**
	 * 处理车辆进场申请
	 * 
	 * @param carNo
	 * @return
	 */
	private boolean enter(String carNo, String stationArea) {
		Map<String, Object> maps = new HashMap<String, Object>();
		maps.put("carNo", carNo);
		maps.put("stationArea", stationArea);
		AirPortCar car = AirPortCar.dao.searchFirst1(maps);
		AirPort port = AirPort.dao.free(car.getStationArea(), car.getIsPickup());
		if (port == null) {
			return false;
		}

		car.setEnterTime(new Date());
		car.setStatus(AirPortCarStatus.ENTER.ordinal());
		car.setPortNo(port.getPortNo());
		if (car.update()) {
			return AirPort.dao.enter(car.getStationArea(), car.getIsPickup(), car.getPortNo());
		}

		return false;
	}

	/**
	 * 处理车辆出场
	 * 
	 * @param carNo
	 * @return
	 */
	private boolean exit(String carNo, String stationArea) {
		Map<String, Object> maps = new HashMap<String, Object>();
		maps.put("carNo", carNo);
		maps.put("stationArea", stationArea);
		AirPortCar.dao.update(carNo);
		AirPortCar car = AirPortCar.dao.searchFirst1(maps);
		car.setStatus(AirPortCarStatus.LEFT.ordinal());
		car.setLeaveTime(new Date());
		if (car.update()) {
			return AirPort.dao.left(car.getStationArea(), car.getIsPickup(), car.getPortNo());
		}

		return false;
	}

	// 接收卡口数据传入
	public void channelCar() {
		String gateTypeCode = getPara("stationCode");
		StationGateType gateType = new StationGateType(gateTypeCode);
		Log.getLog(getClass()).error("gateType-->" + gateType.toString());
		String stationArea = gateType.getAreaCode();// 货站区域代码
		String carNo = getPara("carNo");// 车牌号
		Boolean isPickup = getParaToBoolean("isPickup");
		System.out.println(isPickup);
		if (StrKit.notBlank(carNo)) {
			carNo = carNo.toUpperCase();
		}
		GateType type = gateType.getType();// 0 进场;1 出场;
		Response ret = new Response(CODE_FAILURE);
		if (!StrKit.isBlank(stationArea)) {
			if (!StrKit.isBlank(carNo)) {
				if (type != GateType.ERROR) {
					ret = dealCar(stationArea, carNo, type, isPickup);

				} else {

					ret.setMsg("无法判断进出场类型");
				}
			} else {
				ret.setMsg("车牌号不能为空");
			}
		} else {
			ret.setMsg("货站区域代码不能为空");
		}
		renderJson(ret);
	}

	/**
	 * 处理卡口数据
	 * 
	 * @param stationArea 货站区域代码
	 * @param carNo       车牌号
	 * @param type        进出场类型 {@link GateType}
	 */
	private Response dealCar(String stationArea, String carNo, GateType type, boolean isPickup) {
		Response ret = new Response(CODE_FAILURE);
		Map<String, Object> maps = new HashMap<String, Object>();
		maps.put("carNo", carNo);
		maps.put("stationArea", stationArea);
		AirPortCar old = AirPortCar.dao.searchFirst1(maps);
		System.out.println(old);
		if (old != null) {
			AirPortCarStatus status = AirPortCarStatus.valueOf(old.getStatus());
			// 查询最近一条数据状态如果是进场状态 
			if (AirPortCarStatus.ENTER == status && type == GateType.JIN) {
				ret.setMsg("无法重复进场");
			//查询最近插入的数据离场出去判断离场
			}else if(AirPortCarStatus.LEFT == status && type == GateType.CHU){
				ret.setMsg("无法重复出场");
			}else{
				//如果已经来过车辆  重新输入 
			   //如果是进场插入最新的数据  并改变数值
				if (AirPortCarStatus.LEFT == status && type == GateType.JIN) {
					AirPortCar model = new AirPortCar();
					System.out.println(isPickup);
					model.setIsPickup(isPickup);
					model.setCarNo(carNo);
					model.setStationArea(stationArea);
					if (model.save()) {
					} else {
						ret.setMsg("数据录入错误");
					}
				} 
				//重新赋值新的的值
				old = AirPortCar.dao.searchFirst1(maps);
				status = AirPortCarStatus.valueOf(old.getStatus());
				if (AirPortCarStatus.APPLY == status && type == GateType.JIN) {
					// 待进场状态,可进场
					old.setStatus(AirPortCarStatus.ENTER.ordinal());
					if (enter(carNo, stationArea)) {
						// 进场成功
						ret = new Response(CODE_SUCCESS);
						ret.setMsg("进场成功");
						old = AirPortCar.dao.searchFirst1(maps);
						LedKit.sendBigLedScreen(
						LedKit.bigLedText(old.getPortNo(), old.getIsPickup(), carNo, stationArea), stationArea);
						LedKit.nextCar(stationArea, old.getPortNo(), old.getIsPickup());
					} else {
						ret.setMsg("进场失败");
					}
				} else if (AirPortCarStatus.ENTER == status && type == GateType.CHU) {
					// 已进场状态,可出场
					if (exit(carNo, stationArea)) {
						// 成功出场
						ret = new Response(CODE_SUCCESS);
						ret.setMsg("出场成功");
						LedKit.nextCar(stationArea, old.getPortNo(), old.getIsPickup());
					} else {
						// 出场失败
						ret.setMsg("出场失败");
					}
				} 
				LedKit.recovery();

			}

		} else {
			//如果为空插入数据
			if (type == GateType.JIN) {
				AirPortCar model = new AirPortCar();
				System.out.println(isPickup);
				model.setIsPickup(isPickup);
				model.setCarNo(carNo);
				model.setStationArea(stationArea);
				if (model.save()) {
					ret = dealCar(stationArea, carNo, type, isPickup);
				} else {
					ret.setMsg("数据录入错误");
				}
			}else {
				ret.setMsg("本车未曾进站");
			}
		}

		return ret;
	}
}