CarController.java 5.3 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.searchFirst(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 car = AirPortCar.dao.searchFirst(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");// 车牌号
		
		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);
				} 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) {
		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.searchFirst(maps);
		if (old != null) {
			AirPortCarStatus 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.searchFirst(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("出场失败");
				}
			} else {
				ret.setMsg("无法重复出场或者进场");
			}
			
			LedKit.recovery();
			
		} else {
			// 货代没有提前录入进场数据,无法分配码头
			ret.setMsg("货代没有提前录入进场数据,无法分配码头");
		}

		return ret;
	}
}