JAVA直接跳轉到HTML5頁面

package net.joystart.taskagent.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import net.joystart.City.entity.ServiceCity;
import net.joystart.City.service.ICityService;
import net.joystart.baojia.sign.ZCloudSignConfig;
import net.joystart.carManager.entity.CarManager;
import net.joystart.carManager.service.ICarManagerLogService;
import net.joystart.carManager.service.ICarManagerService;
import net.joystart.common.controller.BaseController;
import net.joystart.common.efence.EfenceBaseType;
import net.joystart.common.efence.EfenceBaseType.EfenceState;
import net.joystart.common.efence.EfenceBuilder;
import net.joystart.common.util.ConstantUtil;
import net.joystart.common.util.HttpRequestUtil;
import net.joystart.common.util.JSONProcesser;
import net.joystart.common.util.MessageResult;
import net.joystart.common.util.PostMsgHttpContent;
import net.joystart.common.util.StringUtil;
import net.joystart.common.util.VehicleControlUtil;
import net.joystart.common.util.baiDu.BaiDuAPIUtil;
import net.joystart.common.util.baiDu.BaiDuAPIUtil.Position;
import net.joystart.common.util.date.UtilTimeFormatter;
import net.joystart.common.util.log.Log4jTask;
import net.joystart.common.util.security.EncryptionUtil;
import net.joystart.common.util.tencent.TengXunAPIUtil;
import net.joystart.customer.entity.Customer;
import net.joystart.customer.entity.MessageTemplate;
import net.joystart.customer.service.ICustomerService;
import net.joystart.customer.service.IMessageTemplateService;
import net.joystart.data.DataBaseUtil;
import net.joystart.device.entity.QueryResult;
import net.joystart.device.service.IVehicleDevice;
import net.joystart.device.service.impl.VehicleDevice;
import net.joystart.fault.service.IFaultReportService;
import net.joystart.mapCoordinates.entity.ReturnForInterface;
import net.joystart.order.controller.OrderController;
import net.joystart.order.entity.DrivingTrack;
import net.joystart.order.entity.InstantOrder;
import net.joystart.order.entity.Order;
import net.joystart.order.service.IOrderService;
import net.joystart.task.vehicleTask.entity.TaskInfo;
import net.joystart.taskagent.controller.entity.TaskToken;
import net.joystart.vehicle.dao.VehicleMapper;
import net.joystart.vehicle.entity.CarState;
import net.joystart.vehicle.entity.Parkinglot;
import net.joystart.vehicle.entity.Vehicle;
import net.joystart.vehicle.entity.VehicleSite;
import net.joystart.vehicle.enums.VehicleStatus;
import net.joystart.vehicle.service.IOperationService;
import net.joystart.vehicle.service.IParkinglotService;
import net.joystart.vehicle.service.IVehicleService;
import net.joystart.vehicle.service.impl.VehicleLock;
import net.joystart.vehicleInterface.controller.VehicleUnLock;
import net.joystart.vehicleInterface.enums.TaskType;
import net.joystart.vehicleInterface.service.IVehicleUnLockService;
import net.joystart.vehicleTask.service.IVehicleTaskService;
import net.joystart.virtualData.AutoAddVirtualData;

/**
 * 第三方任務代理
 * 
 * @author lidc@bagechuxing.cn
 * @create 2017/07/19
 */
@Controller
@Scope("prototype")
@RequestMapping("/agent")
public class AgentController extends BaseController {

	private int AGENT_COMPANY = 1;
	private String AGENT_COMPANY_NAME = "e代駕";
	private final int EXPIRES_IN = 3600;

	@Resource
	IVehicleService vehicleService;

	@Resource
	IVehicleUnLockService vehicleUnLockService;

	@Resource
	ICustomerService customerService;

	@Resource
	ICarManagerService carManagerService;

	@Resource
	ICarManagerLogService carManagerLogService;

	@Resource
	private IFaultReportService faultReportService;

	@Resource
	private IMessageTemplateService messageTemplateService;

	@Resource
	AutoAddVirtualData autoAddVirtualData;

	@Resource
	ICityService cityService;

	@Resource
	IVehicleTaskService vehicleTaskService;

	@Resource
	IParkinglotService parkinglotService;

	@Resource
	IOrderService orderService;

	@Resource
	IOperationService ControlService;

	@Resource
	VehicleMapper vehicleMapper;

	@Resource
	RedisTemplate<String, Object> redisTemplate;

	final Logger logger = LoggerFactory.getLogger(VehicleUnLock.class);

	/***
	 * 合做夥伴ID
	 */
	private String agentId = "CH0110000223";

	/***
	 * 合做夥伴ID
	 */
	private String chanleId = "31";

	/***
	 * 合做夥伴Key
	 */
	private String agentKey = "a";

	private String agentHost = "https://baoyang.d.edaijia.cn/api/third/2/";

	/**
	 * 獲取渠道下全部的商戶列表
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getbusinesslist")
	public void getBusinessList(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "business/listAll";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 獲取商戶的帳號餘額
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getbalance")
	public void getBalance(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "business/balance";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("customerId", request.getParameter("chanleId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 獲取服務支持城市列表
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getcitylist")
	public void getCityList(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "queryCityList";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 根據CODE獲取城市信息
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getcity")
	public void getCity(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "queryCity";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("code", request.getParameter("code"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 預估金額
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/predict")
	public void getPredict(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "price";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("code", request.getParameter("code"));
		params.put("startLng", request.getParameter("startLng"));
		params.put("startLat", request.getParameter("startLat"));
		params.put("endLng", request.getParameter("endLng"));
		params.put("endLat", request.getParameter("endLat"));
		params.put("bookingTime", request.getParameter("bookingTime")); // String(yyyyMMddHHmmss)
		params.put("customerId", request.getParameter("customerId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 下單接口
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/createorder")
	public void createOrder(HttpServletRequest request, HttpServletResponse response) {
		String customerId = "CH0110000223";
		String taskId = request.getParameter("taskid");
		MessageResult message = createOrderByTaskId(Integer.valueOf(taskId), customerId);
		this.out(response, message);
	}

	/**
	 * 取消訂單接口
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/cancelorder")
	public void cancelOrder(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/cancel";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", request.getParameter("orderId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doPostJson(url, getSendParam(params));
		HashMap<String, Object> retObj = JSON.parseObject(result, HashMap.class);
		String code = retObj.get("code").toString();
		String message = retObj.get("message").toString();
		// 下單成功
		if (code == "0") {
			String orderNo = retObj.get("data").toString();
		}
		// 下單失敗
		else {

		}
		this.out(response, retObj);
	}

	/**
	 * 獲取訂單詳情
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/orderdetail")
	public void getOrderDetail(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/detail";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", request.getParameter("orderId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 獲取訂單軌跡
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/ordertrack")
	public void getOrderTrack(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/recordList";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", request.getParameter("orderId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 獲取司機代駕軌跡
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/ordertrace")
	public void getOrderTrace(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/trace";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", request.getParameter("orderId"));
		params.put("type", request.getParameter("type"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String ret = HttpRequestUtil.doGetJson(url, getSendParam(params));
		this.out(response, ret);
	}

	/**
	 * 獲取司機信息
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getdriverinfo")
	public void getDriverInfo(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/driverInfo";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", request.getParameter("orderId"));
		params.put("type", request.getParameter("type"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doGetJson(url, getSendParam(params));
		JSONObject retObj = JSON.parseObject(result, JSONObject.class);
		String code = retObj.get("code").toString();
		String message = retObj.get("message").toString();
		if (code == "0") {
			JSONObject driver = retObj.getJSONObject("data");
		} else {

		}
		this.out(response, retObj);
	}

	/**
	 * 獲取目的人收車驗證碼
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getverifycode")
	public void getVerifyCode(HttpServletRequest request, HttpServletResponse response) {
		MessageResult message = new MessageResult();
		String orderId = request.getParameter("orderId");
		String type = request.getParameter("type");
		String code = getVerifyCode(orderId, type);
		if (code != null) {
			message.setCode("0");
			message.setData(code);
			message.setMessage("success");
		} else {
			message.setCode("1");
			message.setData(null);
			message.setMessage("failure");
		}
		this.out(response, message);
	}

	/***
	 * 獲取收車驗證碼
	 * 
	 * @param orderId
	 * @param type
	 * @return
	 */
	public String getVerifyCode(String orderId, String type) {
		String url = agentHost + "order/verifyCode";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("orderId", orderId);
		params.put("type", type);
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doGetJson(url, getSendParam(params));
		HashMap<String, Object> retObj = JSON.parseObject(result, HashMap.class);
		String code = retObj.get("code").toString();
		String message = retObj.get("message").toString();
		// String message = retObj.get("message").toString();
		if (code.equals("0")) {
			String VerifyCode = retObj.get("data").toString();
			return VerifyCode;
		} else {
			return null;
		}

	}

	/**
	 * 獲取歷史訂單
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getorderlist")
	public void getOrderList(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/queryList";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("startDate", request.getParameter("startDate"));
		params.put("endDate", request.getParameter("endDate"));
		params.put("pageSize", request.getParameter("pageSize"));
		params.put("currentPage", request.getParameter("currentPage"));
		params.put("mobile", request.getParameter("mobile"));
		params.put("createMobile", request.getParameter("createMobile"));
		params.put("customerId", request.getParameter("customerId"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doGetJson(url, getSendParam(params));
		JSONObject retObj = JSON.parseObject(result, JSONObject.class);
		String code = retObj.get("code").toString();
		String message = retObj.get("message").toString();
		if (code == "0") {
			JSONObject orderList = retObj.getJSONObject("data");
			this.out(response, orderList);
		} else {
			this.out(response, retObj);
		}
	}

	/**
	 * 獲取車輛信息照片
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getcarphotos")
	public void getCarPhotos(HttpServletRequest request, HttpServletResponse response) {
		String url = agentHost + "order/getCarPhotos";
		Map<String, String> params = new HashMap<>();
		params.put("orderId", request.getParameter("orderId"));
		params.put("channel", chanleId);
		params.put("daijiaType", request.getParameter("daijiaType"));
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doGetJson(url, getSendParam(params));
		JSONObject retObj = JSON.parseObject(result, JSONObject.class);
		String code = retObj.get("code").toString();
		String message = retObj.get("message").toString();
		if (code == "0") {
			JSONObject orderList = retObj.getJSONObject("data");
			this.out(response, orderList);
		} else {
			this.out(response, retObj);
		}
	}

	/**
	 * 根據車輛Token登錄
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/logintoken")
	public void logintoken(HttpServletRequest request, HttpServletResponse response) {
		logger.info("=======================跳轉成功================================");
		MessageResult message = new MessageResult();
		String token = request.getParameter("token");
		/*String sql = "SELECT * FROM t_base_task_token WHERE token='" + token
				+ "' AND DATE_ADD(createTime,INTERVAL expiresIn MINUTE)>NOW()";*/
		TaskToken taskToken =vehicleService.getTaskToken(token);
		//List<Map<String, Object>> result = DataBaseUtil.query(sql);
		if (taskToken == null) {
			message.setCode("10001");
			message.setMessage("錯誤的受權信息");
			message.setData(token);
			this.out(response, message);
			return;
		}
		String orderId = taskToken.getOrderid().toString();
		logger.info("=======================跳轉成功orderId=" + orderId + "================================");
		String taskId = taskToken.getTaskid().toString();
		logger.info("=======================跳轉成功taskId=" + taskId + "================================");
		String loginUUID = taskToken.getLoginuuid();
		logger.info("=======================跳轉成功loginUUID=" + loginUUID + "================================");
		
		TaskInfo taskInfo = vehicleUnLockService.selectByPrimaryKey(Integer.parseInt(taskId));
		String verifyCode = getVerifyCode(taskInfo.getOutorderid(), "1");
		Order order = orderService.selectByPrimaryKey(Integer.valueOf(orderId));
		if (order != null && (order.getOrderstatus() == 0 || order.getOrderstatus() == 10)) {
			Integer customerId = order.getCustomerid();
			Customer cus = customerService.selectByPrimaryKey(customerId);
			if (cus != null) {
				request.getSession().setAttribute("customer", cus);
			}
			request.getSession().setAttribute("orderid", orderId);
			request.getSession().setAttribute("taskid", taskId);
			request.getSession().setAttribute("loginuuid", loginUUID);
			request.getSession().setAttribute("token", token);
			request.getSession().setAttribute("verifyCode", verifyCode);
			try {
				response.sendRedirect(request.getContextPath() + "/jsp/agent/vehiclecontrol.jsp");
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			message.setCode("11001");
			message.setMessage("訂單不存在或已通過期");
			message.setData(token);
			this.out(response, message);
		}
	}

	/**
	 * 車輛控制接口
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/control")
	public void control(HttpServletRequest request, HttpServletResponse response) {
		MessageResult message = new MessageResult();
		String orderId = request.getParameter("orderid");
		String taskid = request.getParameter("taskid");
		String token = request.getParameter("token");
		String type = request.getParameter("type");
		TaskInfo taskInfo = vehicleUnLockService.selectByPrimaryKey(Integer.parseInt(taskid));
		Order order = orderService.selectByPrimaryKey(Integer.valueOf(orderId));
		if (StringUtils.isBlank(token)) {
			message.setCode("10001");
			message.setMessage("禁止訪問");
			message.setData(orderId);
			this.out(response, message);
			return;
		} else if (checkToken(token) == false) {
			message.setCode("10002");
			message.setMessage("未受權訪問");
			message.setData(orderId);
			this.out(response, message);
			return;
		}
		if (order == null) {
			message.setCode("1");
			message.setMessage("訂單不存在");
			message.setData(orderId);
			this.out(response, message);
			return;
		}
		if (taskInfo.getTaskstatus()==4 || taskInfo.getTaskstatus()==5){
			message.setCode("1");
			message.setMessage("任務已完成不能控制車輛");
			message.setData(taskInfo.getId());
			this.out(response, message);
			return;
		}

		/*
		 * if (order.getOrderstatus() != 0 && order.getOrderstatus() != 10) {
		 * message.setCode("2"); message.setMessage("訂單編號無效");
		 * message.setData(orderId); this.out(response, message); return; }
		 */
		// 訂單未取車,更新爲已取車

		// 經過訂單ID獲取車輛的SN和Code
		IVehicleDevice vehicleDevice = new VehicleDevice(vehicleMapper.selectByPrimaryKey(order.getVehicleid()));
		int result = 0;
		switch (type) {
		case "0":
			result = vehicleDevice.speak();
			break;
		case "1":
			if (order.getOrderstatus() == 0) {//開鎖成功後才更新訂單狀態
				order.setChargingstartdate(new Date());
				order.setOrderstatus(10);
				orderService.updateByPrimaryKeySelective(order);
			}
			result = vehicleDevice.turnOnAndOpen();
			taskInfo.setTaskstatus(2);// 開鎖成功後更新任務狀態
			vehicleUnLockService.updateTaskInfoId(taskInfo);
			List<Integer> list = this.vehicleUnLockService.selectByPrimaryKeyVehidInt(taskInfo.getVehicleid());
			if (list != null && list.size() > 0) {//開鎖成功後刪除車位關係完成任務會重新綁定車位關係
				 vehicleUnLockService.deleteByPrimaryKeyForEach(list);
			}
			break;
		case "2":
			result = vehicleDevice.shutDown();
			break;
		default:
			break;
		}

		message.setCode("0");
		message.setMessage("操做成功");
		message.setData(result);
		this.out(response, message);
		return;
	}

	/**
	 * 獲取車輛信息
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/getvehicleinfo")
	public void getvehicleinfo(HttpServletRequest request, HttpServletResponse response) {
		MessageResult message = new MessageResult();
		String orderId = request.getParameter("orderId");
		String token = request.getParameter("token");
		String type = request.getParameter("type");
		Order order = orderService.selectByPrimaryKey(Integer.valueOf(orderId));
		if (order == null) {
			message.setCode("1");
			message.setMessage("訂單不存在");
			message.setData(orderId);
			this.out(response, message);
			return;
		}
		// 經過訂單ID獲取車輛的SN和Code
		IVehicleDevice vehicleDevice = new VehicleDevice(vehicleMapper.selectByPrimaryKey(order.getVehicleid()));
		QueryResult qr = vehicleDevice.queryInfo();
		CarState carSate = qr.getCarState();
		this.out(response, carSate);
	}

	/**
	 * 更改訂單狀態主動通知接口
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping("/changeorder")
	public void changeOrder(HttpServletRequest request, HttpServletResponse response) {
		logger.info("============================E代駕回調成功==========================================");
		Date now = new Date();
		MessageResult message = new MessageResult();
		String channel = request.getParameter("channel");
		logger.info(
				"============================E代駕回調成功:channel" + channel + "==========================================");
		String orderId = request.getParameter("orderId");
		logger.info(
				"============================E代駕回調成功:orderId" + orderId + "==========================================");
		String status = request.getParameter("status"); // 訂單狀態 Int 是 狀態值參考訂單詳情
		logger.info(
				"============================E代駕回調成功:status" + status + "==========================================");
		String driverNo = request.getParameter("driverNo"); // 司機工號 String
															// ,司機搶單後或者客服派單後不爲空
		if (StringUtils.isNotEmpty(driverNo)) {
			logger.info("============================E代駕回調成功:driverNo" + driverNo
					+ "==========================================");
		} else {
			logger.info("============================E代駕回調成功:driverNo" + null
					+ "==========================================");
		}
		String sign = request.getParameter("sign"); // 簽名 String 是
		logger.info("============================E代駕回調成功:sign" + sign + "==========================================");

		Map<String, String> params = new HashMap<>();
		params.put("channel", channel);
		params.put("orderId", orderId);
		params.put("status", status);
		params.put("driverNo", driverNo);

		String vsign = getSign(params, agentKey);
		logger.info("============================E代駕回調成功:" + vsign + "==========================================");

		/************
		 * 訂單狀態說明 0 已下單 2 資金已凍結 5 訂單取消 用戶取消、司機取消、坐席取消或者客服取消 6 等待司機接單 4 司機已接單
		 * 調用司機搶單模式的時候通知,調用派單模式則跳過此狀態 7 司機已開啓訂單 8 司機已就位 11 司機開車中 12 司機到達目的地 50
		 * 已收車 55 訂單已完成
		 ************/
		if (!vsign.equals(sign)) {
			logger.info("============================E代駕回調成功驗證不一致==========================================");
			message.setCode("1");
			message.setMessage("簽名錯誤");
			message.setData(vsign);
			this.out(response, message);
			return;
		}
		/***** 根據訂單號訂單號獲取任務編號 ********/
		TaskInfo taskInfo = vehicleTaskService.selectByOutOrderId(orderId);
		if (taskInfo == null) {
			message.setCode("3");
			message.setMessage("訂單不存在");
			message.setData(orderId);
			this.out(response, message);
			return;
		}

		/*** 獲取司機信息,發送短信 *****/
		if (status.equals("6") || status.equals("4") || status.equals("7")) {
			String verifyCode = getVerifyCode(taskInfo.getOutorderid(), "1");// 獲取驗證碼
																				// add
																				// cjl
			taskInfo.setOrderkey(verifyCode);
			String url = agentHost + "order/driverInfo";
			Map<String, String> sendParams = new HashMap<>();
			sendParams.put("channel", chanleId);
			sendParams.put("orderId", orderId);
			sign = getSign(sendParams, agentKey);
			sendParams.put("sign", sign);
			String result = HttpRequestUtil.doGetJson(url, getSendParam(sendParams));
			GsonBuilder gb = new GsonBuilder();
			Gson g = gb.create();
			Map<Object, Object> map1 = g.fromJson(result, new TypeToken<Map<Object, Object>>() {
			}.getType());
			String code = map1.get("code").toString();
			Double codeInt = Double.parseDouble(code);
			if (codeInt.intValue() == 0) {
				String data = g.toJson(map1.get("data"));
				Map<Object, Object> map2 = g.fromJson(data, new TypeToken<Map<Object, Object>>() {
				}.getType());
				String driverId = "";
				String driverPhone = "";
				String name = "";
				String pictureSmall = "";
				String pictureMiddle = "";
				String pictureLarge = "";
				String idCard = "";
				if (map2.get("driverId") != null) {
					driverId = map2.get("driverId").toString();
				}
				if (map2.get("driverPhone") != null) {
					driverPhone = map2.get("driverPhone").toString();
				}
				if (map2.get("name") != null) {
					name = map2.get("name").toString();
				}
				if (map2.get("newLevel") != null) {
					Double newLeveld = Double.parseDouble(map2.get("newLevel").toString());
					Integer newLevel = newLeveld.intValue();
				}
				if (map2.get("pictureSmall") != null) {
					pictureSmall = map2.get("pictureSmall").toString();
				}
				if (map2.get("pictureMiddle") != null) {
					pictureMiddle = map2.get("pictureMiddle").toString();
				}
				if (map2.get("pictureLarge") != null) {
					pictureLarge = map2.get("pictureLarge").toString();
				}
				if (map2.get("year") != null) {
					Double yeard = Double.parseDouble(map2.get("year").toString());
					Integer year = yeard.intValue();
				}
				if (map2.get("idCard") != null) {
					idCard = map2.get("idCard").toString();
				}

				//
				if (StringUtils.isBlank(driverPhone)) {
					message.setCode("2");
					message.setMessage("沒法獲取司機信息");
					message.setData(orderId);
					this.out(response, message);
					return;
				} else {
					CarManager carManager = this.carManagerService.selectByMobile(driverPhone);
					if (carManager == null) {
						carManager = new CarManager();
						carManager.setUsername(driverPhone);
						carManager.setName(name);
						carManager.setDrivinglicensephoto(pictureSmall);
						carManager.setMobile(driverPhone);
						if (map2.get("driverId") != null) {
							carManager.setRemark("e代駕司機:" + driverId + ",身份證:" + idCard);
						} else {
							carManager.setRemark("e代駕司機:" + null + ",身份證:" + idCard);
						}
						carManager.setIdphoto(idCard);
						try {
							carManager.setPassword(EncryptionUtil.md5(ConstantUtil.CAR_MANAGER_INITPWD));
						} catch (Exception e1) {
							e1.printStackTrace();
						}
						carManager.setWorkstatus(ConstantUtil.WORKSTATUS);
						carManager.setTaskstatus(ConstantUtil.TASKSTATUS);
						carManager.setCreatedate(now);
						carManager.setSex(0);
						carManager.setIdphoto("e代駕人員");
						carManager.setHoldingidphoto("e代駕人員");
						carManager.setDrivinglicensephoto("e代駕人員");
						this.carManagerService.insertManager(carManager);

						// 獲取司機ID
						carManager = this.carManagerService.selectByMobile(driverPhone);
					}

					Customer cus = new Customer();
					cus.setUsername(driverPhone);
					cus.setName(name);
					cus.setIdcardno(idCard);
					cus.setIsValidateIdCard(new Byte("1"));
					cus.setIsValidateDrivingLicence(new Byte("1"));
					cus.setIsCompany(new Byte("1"));
					cus.setCompanyID(152);// 後續在該暫時沒有想到取E代駕企業的方法
					cus.setCompanyName(AGENT_COMPANY_NAME);
					cus.setAuditstatus(new Byte("1"));
					cus.setIscanorder(new Byte("1"));
					cus.setMobile(driverPhone);
					cus.setSourcechannelid(1);
					cus.setCreatedate(new Date());
					cus.setDepartmentid(223);//E代駕使用部門ID
					try {
						cus.setPassword(EncryptionUtil.md5(ConstantUtil.CAR_MANAGER_INITPWD));
					} catch (Exception e) {
						e.printStackTrace();
					}
					Customer tempCus = customerService.isExistCustomer(cus);

					// 若是用戶不存在,註冊新用戶
					if (tempCus == null) {
						// 獲取註冊模板的信息
						MessageTemplate mTemplate = messageTemplateService
								.selectTitleAndContentByIdentification(ConstantUtil.M_REGISTER_SUCCESS);
						net.joystart.customer.entity.Message mes = null;
						if (mTemplate != null) {
							// 添加站內信
							mes = new net.joystart.customer.entity.Message();
							mes.setTitle(mTemplate.getTitle());
							mes.setContent(mTemplate.getContent());
							mes.setSenddate(new Date());
							mes.setReadstatus(new Byte("0"));
							mes.setIsdelete(new Byte("0"));
							mes.setCreatedate(new Date());
						}
						cus = customerService.Register(cus, mes);
					} else {
						cus.setId(tempCus.getId());
					}

					// 更新用戶UUID
					UUID uuid = UUID.randomUUID();
					cus.setLoginUUID(uuid.toString());
					customerService.updaeCustomer(cus);

					message = acceptTask(taskInfo.getId().toString(), carManager, cus);
					this.out(response, message);

					return;
				}
			} else {
				message.setCode("2");
				message.setMessage("沒法獲取司機信息");
				message.setData(orderId);
				this.out(response, message);
				return;
			}

		} else if (status.equals("5")) {
			if (cancelOrderByTask(taskInfo.getId())) {
				message.setCode("0");
				message.setMessage("success");
				this.out(response, message);
				return;
			} else {
				message.setCode("4");
				message.setMessage("取消訂單失敗");
				message.setData(orderId);
				this.out(response, message);
				return;
			}
		} else if (status.equals("50")) // 已收車
		{
			message.setCode("0");
			message.setMessage("success");
			this.out(response, message);
			return;
		} else if (status.equals("55")) // 已完成
		{
			message.setCode("0");
			message.setMessage("success");
			this.out(response, message);
			return;
		} else {
			message.setCode("0");
			message.setMessage("success");
			this.out(response, message);
			return;
		}

	}

	/**
	 * 領取任務
	 * 
	 * @param request
	 * @param response
	 */
	public MessageResult acceptTask(String taskId, CarManager carManager, Customer cus) {

		MessageResult message = new MessageResult();

		try {

			if (taskId == null) {
				message.setCode(ConstantUtil.M_EXCEPTION);
				message.setMessage("參數taskId不能爲空");
				return message;
			}

			if (vehicleTaskService.IsCanAcceptTask(Integer.valueOf(taskId))) {
				message.setCode(ConstantUtil.M_EXCEPTION);
				message.setMessage("當前車輛已被用戶下單,請聯繫管理人員刪除此任務");
				return message;
			}

			TaskInfo taskInfo = vehicleTaskService.selectByPrimaryKey(Integer.valueOf(taskId));
			if (taskInfo.getTaskstatus() != 0 && taskInfo.getTaskuserid() != null) {
				message.setCode(ConstantUtil.M_EXCEPTION);
				message.setMessage("這個任務已經分配給了其餘人");
				return message;
			}

			// 判斷是充電,且有調度
			if (taskInfo.getTaskimg() != null && taskInfo.getTaskimg().intValue() == 0
					&& taskInfo.getDispatchType().intValue() == 3) {
				taskInfo.setTaskimg(5);
			}

			VehicleLock lock = new VehicleLock(taskInfo.getVehicleid().toString());
			String ret = lock.wrap(new Callable<String>() {
				@Override
				public String call() {
					String uuid = cus.getLoginUUID();
					MessageResult result = new MessageResult();
					InstantOrder instantOrder = new InstantOrder();
					instantOrder.setCustomerId(cus.getId());
					instantOrder.setVehicleId(taskInfo.getVehicleid());
					instantOrder.setIsEnterprise(new Byte("1"));
					instantOrder.setLoginUUID(uuid);
					String token = StringUtil.getRandomString(8, ConstantUtil.REDPACKET_NUMBER_SEEDSOURCE);
					/*** 生成隨機控制密碼 ***/
					try {
						token = EncryptionUtil.md5(token + uuid);
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					// 訂單來源代駕
					instantOrder.setSourceType(4);

					// 插入訂單
					result = orderService.insertInstantOrder(instantOrder);
					HashMap<String, Object> orderMap = new HashMap<String, Object>();
					// dataMap.put("orderId", orderId);
					if (result != null) {
						orderMap = (HashMap<String, Object>) result.getData();
					}
					// IVehicleService vehicleService;
					String orderId = orderMap.get("orderId").toString();

					taskInfo.setAllocationtime(new Date());
					taskInfo.setTaskstatus(1);
					taskInfo.setTaskuserid(carManager.getId());
					taskInfo.setOrderid(Integer.valueOf(orderId)); // 設置訂單關聯任務
					// taskInfo.setOrderkey(orderLoginCode);
					taskInfo.setExpires(EXPIRES_IN);
					vehicleTaskService.acceptTask(taskInfo);

					int taskType = taskInfo.getTasktype();
					String temp = "充電";
					if (0 == taskType) {
						temp = "充電";
					} else if (1 == taskType) {
						temp = "調度";
					} else if (2 == taskType) {
						temp = "整備";
					} else if (3 == taskType) {
						temp = "調度充電";
					} else if (4 == taskType) {
						temp = "加油";
					}
					Vehicle vh = vehicleService.selectByPrimaryKey(taskInfo.getVehicleid());

					// 插入登陸信息
					/*String sql = "insert into `t_base_task_token`(orderid,taskid,loginUUID,token,expiresIn,createTime) values("
							+ orderId + "," + taskId.toString() + ",'" + cus.getLoginUUID() + "','" + token + "',"
							+ EXPIRES_IN + ",'" + new Date() + "')";*/
					//DataBaseUtil.query(sql);
					TaskToken taskToken = new TaskToken();
					taskToken.setCreatetime(new Date());
					taskToken.setOrderid(Integer.parseInt(orderId));
					taskToken.setTaskid(Integer.parseInt(taskId));
					taskToken.setLoginuuid(cus.getLoginUUID());
					taskToken.setToken(token);
					taskToken.setExpiresin(EXPIRES_IN);
					vehicleService.insertSelectiveTaskToken(taskToken);
					
					carManagerLogService.insertLog(carManager.getId(), "接受" + temp + "任務 車牌號:"
							+ (vh != null ? vh.getPlatenumber() : "未知") + " \r\n任務單號:" + taskInfo.getTaskNo());

					/*********************
					 * 發送短信任務連接給代駕人員
					 ******************/
					String taskurl = "http://t.bagechuxing.cn/l/" + token;
					PostMsgHttpContent.sendMessage("13401149982", "您成功領取了任務,點擊如下連接完成任務 " + taskurl);
					return "SUCCESS";
				}

			});

			if ("SUCCESS".equals(ret)) {
				message.setCode(ConstantUtil.M_SUCCESS);
				message.setMessage("接受任務成功");
			} else {
				message.setCode(ConstantUtil.M_SYSTEM_ERROR);
				message.setMessage("系統異常");
			}

			return message;

		} catch (Exception e) {
			e.printStackTrace();
			message.setCode(ConstantUtil.M_SYSTEM_ERROR);
			message.setMessage("系統異常");
			return message;
		}
	}

	/***
	 * 根據任務生成e代駕訂單
	 * 
	 * @param taskid
	 */
	public MessageResult createOrderByTaskId(Integer taskId, String customerId) {
		MessageResult message = new MessageResult();
		if (vehicleTaskService.IsCanAcceptTask(taskId)) {
			message.setCode(ConstantUtil.M_EXCEPTION);
			message.setMessage("當前車輛已被用戶下單,請聯繫管理人員刪除此任務");
			return message;
		}

		TaskInfo taskInfo = vehicleTaskService.selectByPrimaryKey(taskId);
		if (taskInfo.getTaskstatus() != 0 && taskInfo.getTaskuserid() != null) {
			message.setCode(ConstantUtil.M_EXCEPTION);
			message.setMessage("這個任務已經分配給了其餘人");
			return message;
		}

		Integer vehicleId = taskInfo.getVehicleid();
		Vehicle vehicle = vehicleService.selectByPrimaryKey(vehicleId);

		Integer parkId = vehicle.getParkid();
		Parkinglot parkinglot = parkinglotService.selectParkinglotByPrimaryKey(parkId);
		if (parkinglot == null) {
			message.setCode(ConstantUtil.M_EXCEPTION);
			message.setMessage("該車未在任何車場");
			return message;
		}
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MINUTE, +31);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

		String url = agentHost + "order/create";
		Map<String, String> params = new HashMap<>();
		params.put("channel", chanleId);
		params.put("customerId", customerId);
		params.put("type", "1"); // 訂單類型 Int 是 1-取送車
		params.put("mode", "1"); // 訂單成單模式 1-司機搶單(訂單所在城市預定開啓時生效,不然爲客服派單) 0-客服派單
		params.put("createMobile", parkinglot.getTelephone()); // 下單人手機號 String
																// 是 手機號
		params.put("mobile", parkinglot.getTelephone()); // 車主手機號 String 是 手機號
		params.put("username", "巴歌出行"); // 車主姓名 String 是
		params.put("pickupContactName", "巴歌出行"); // 取車地址聯繫人姓名 String 是 最多20個字符
		params.put("pickupContactPhone", parkinglot.getTelephone()); // 取車地址聯繫人手機號
																		// String
																		// 是 手機號
		params.put("pickupAddress", parkinglot.getAddress()); // 取車地址 String 是
																// 最多100個字符
		params.put("pickupAddressLng", parkinglot.getLongitude()); // 取車地址經度
																	// Double 是
		params.put("pickupAddressLat", parkinglot.getLatitude()); // 取車地址緯度
																	// Double 是
		params.put("returnContactName", "巴歌出行"); // 還車地址聯繫人姓名 String 是 最多20個字符
		params.put("returnContactPhone", "13401149982"); // 還車地址聯繫人手機號
															// String
															// 是 手機號

		List<DrivingTrack> listTack = null;
		listTack = vehicleService.getAllCarsPoint(vehicle.getSn());
		if (listTack != null && listTack.size() > 0) {
			DrivingTrack dt = new DrivingTrack();
			dt = listTack.get(0);
			params.put("returnAddressLng", dt.getLongitude().toString()); // 還車地址經度
			// Double
			// 是
			params.put("returnAddressLat", dt.getLatitude().toString()); // 還車地址緯度
			// Double
			// 是
		}
		String returnAddress = BaiDuAPIUtil.getDetailByGPS(
				Double.parseDouble(params.get("returnAddressLng").toString()),
				Double.parseDouble(params.get("returnAddressLat").toString()));
		GsonBuilder gb = new GsonBuilder();
		Gson g = gb.create();
		Map<Object, Object> mapOne = g.fromJson(returnAddress, new TypeToken<Map<Object, Object>>() {
		}.getType());
		Map<Object, Object> mapTwo = (Map<Object, Object>) mapOne.get("result");

		String strOne = mapTwo.get("formatted_address").toString();
		params.put("returnAddress", strOne); // 還車地址 String 是
												// 最多100個字符

		params.put("bookingTime", sdf.format(cal.getTime())); // 預定時間 String
																// (yyyyMMddHHmmss)
																// 是
																// 必須比當前時間晚至少半個小時
		params.put("carNo", vehicle.getPlatenumber()); // 車牌號 String 是
		params.put("carBrandName", vehicle.getCarname()); // 車輛品牌名稱 String 否
															// 最多50個字符
		params.put("carSeriesName", vehicle.getCarname()); // 車輛品牌名稱 String 否
															// 最多50個字符
		String sign = getSign(params, agentKey);
		params.put("sign", sign);
		String result = HttpRequestUtil.doPostJson(url, getSendParam(params));
		logger.info("e代駕下單接口調用:" + params + ",返回結果:" + result);

		HashMap<String, Object> retObj = JSON.parseObject(result, HashMap.class);
		String code = retObj.get("code").toString();
		String msg = retObj.get("message").toString();

		/**** 更新外部訂單號 *****/
		if (code.equals("0")) {
			String orderNo = retObj.get("data").toString();
			/*
			 * String verifyCode = getVerifyCode(orderNo, "1"); if (verifyCode
			 * == null) { message.setCode(ConstantUtil.M_EXCEPTION);
			 * message.setMessage("獲取驗證碼失敗"); return message; } else {
			 * taskInfo.setOrderkey(verifyCode);
			 * taskInfo.setOutorderid(orderNo);
			 * vehicleTaskService.acceptTask(taskInfo);
			 * message.setCode(ConstantUtil.M_SUCCESS);
			 * message.setMessage("SUCCESS"); message.setData(orderNo); return
			 * message; }
			 */
			taskInfo.setOutorderid(orderNo);
			taskInfo.setEdFlag(1);//推送成功
			taskInfo.setEdCreateDate(new Date());
			vehicleTaskService.acceptTask(taskInfo);
			logger.info("=================" + retObj.get("data").toString() + "====================");
			message.setCode(ConstantUtil.M_SUCCESS);
			message.setMessage("推送成功");
			return message;
		} else {
			message.setCode(ConstantUtil.M_EXCEPTION);
			message.setMessage("推送失敗");
			return message;
		}
	}

	/***
	 * 取消訂單接口
	 */
	private boolean cancelOrderByTask(Integer taskId) {
		try {
			TaskInfo taskInfo = vehicleTaskService.selectByPrimaryKey(taskId);
			if (taskInfo != null) {
				taskInfo.setIsdelete(1);
				vehicleTaskService.cancle(taskId);
				Integer orderId = taskInfo.getOrderid();
				if (orderId != null) {
					Order o = orderService.selectByPrimaryKey(orderId);
					Order order = new Order();
					order.setId(new Integer(orderId));
					order.setOrderstatus(40);
					orderService.updateByPrimaryKeySelective(order);
					redisTemplate.opsForHash().delete(ConstantUtil.ORDER_CACHE_KEY, o.getOrderno());
					Vehicle vehicle = new Vehicle(o.getVehicleid(), VehicleStatus.CANRENT.getValue());
					vehicleService.updateByPrimaryKeySelective(vehicle);
				}
				return true;
			} else {
				return false;
			}
		} catch (Exception ex) {
			Log4jTask.addLog("結束訂單報錯", System.currentTimeMillis(), Log4jTask.ERROR, OrderController.class.getName(),
					ex);
			return false;
		}
	}

	/**
	 * @author 完成任務商任務完成接口
	 */
	@Transactional
	@RequestMapping("/finishTask")
	public void taskfinish(HttpServletResponse response, HttpServletRequest request) {
		MessageResult messageResult = new MessageResult();
		String taskid = request.getParameter("taskid");
		String imgUrl = request.getParameter("imgUrl");
		String imgUrlTwo = request.getParameter("imgUrlTwo");
		String accidentType = request.getParameter("accidentType");
		String parkid = request.getParameter("parkid");
		String branchid = request.getParameter("branchid");

		// 整備id插入整備信息表
		String reorgids = request.getParameter("reorgids");
		logger.info("=================任務ID" + taskid + "=================================");
		logger.info("=================完成狀態" + accidentType + "===========================");
		logger.info("=================車場ID" + parkid + "=================================");
		logger.info("=================網點" + branchid + "=================================");
		logger.info("=================整備" + reorgids + "=================================");
		try {
			VehicleSite vs = new VehicleSite();
			TaskInfo taskInfo = vehicleUnLockService.selectByPrimaryKey(Integer.parseInt(taskid));
			taskInfo.setAccidentType(Integer.parseInt(accidentType));
			Integer orderId = taskInfo.getOrderid();
			Order order = orderService.selectByPrimaryKey(orderId);
			int result = 0;

			// 結束訂單信息
			if (order != null) {
				Integer customerId = order.getCustomerid();
				result = ControlService.vehicleControl(customerId, orderId, 3, null, null, "2",2);
			}

			if (StringUtils.isEmpty(parkid) && StringUtils.isEmpty(branchid)) {
				Vehicle vh = vehicleService.selectByPrimaryKey(taskInfo.getVehicleid());
				int siteid = selectSiteid(vh.getSn());
				if (siteid != 0) {
					vs.setId(siteid);
				} else {
					Map<String, Object> params = new HashMap<String, Object>();
					HashMap<String, Object> dataMap = new HashMap<>();
					List<Position> list = VehicleControlUtil.getVehicleLocationBaiDuAndCarLifeFromSn(vh.getSn());
					Position position = list.get(0);
					ServiceCity city = null;

					// 經過座標獲取城市信息
					city = this.cityService.getBaiduServiceCityByGPS(position.getX(), position.getY());
					params.put("cityId", city.getId());

					Parkinglot parkinglot = parkinglotService.findParkinglotCanCharging(params, position.getX(),
							position.getY());
					if (parkinglot == null) {
						messageResult.setData(dataMap);
						messageResult.setCode(ConstantUtil.M_EXCEPTION);
						messageResult.setMessage("車輛在容許的還車區域內");
						this.out(response, messageResult);
						return;
					}

					if (parkinglot.getParktype() != null) {
						EfenceBaseType efenceType;
						try {
							efenceType = EfenceBuilder.BuildEfence(parkinglot.getParktype(),
									parkinglot.getCoordinatepoints());
							EfenceState efenceState = efenceType.GetEfenceState(Double.parseDouble(position.getX()),
									Double.parseDouble(position.getY()));
							if (EfenceState.In.equals(efenceState)) {
								parkid = String.valueOf(parkinglot.getCountyid());
								branchid = String.valueOf(parkinglot.getId());
							}
						} catch (Exception e) {
							messageResult.setCode(ConstantUtil.M_EXCEPTION);
							messageResult.setMessage("獲取站點圍欄信息錯誤");
							this.out(response, messageResult);
							return;
						}
					}

					if (StringUtils.isBlank(branchid)) {
						messageResult.setCode(ConstantUtil.M_EXCEPTION);
						messageResult.setMessage("車輛未在容許的還車區域內");
						this.out(response, messageResult);
						return;
					}
				}
			}

			VehicleLock lock = new VehicleLock(taskInfo.getVehicleid().toString());
			String branchId = branchid;
			String parkId = parkid;
			String ret = lock.wrap(new Callable<String>() {
				@Override
				public String call() {

					if (taskInfo != null && taskInfo.getTaskstatus() != 1 && taskInfo.getTaskstatus() != 0) {
						if (taskInfo.getTaskstatus() == 4) {
							logger.info("當前任務已完成,請刷新 " + taskInfo.getId());
							return ConstantUtil.M_PARAMTER_NULL;
						} else {
							if (branchId != null && !"".equals(branchId)) {
								List<VehicleSite> list = vehicleUnLockService
										.getVehicleSiteLists(Integer.parseInt(branchId));
								if (list.size() == 0) {
									logger.info("該網點暫無車位" + taskInfo.getId());
									return ConstantUtil.M_SITENO;
								}
							} else {
								if (parkId != null && !"".equals(parkId)) {
									List<VehicleSite> list = vehicleUnLockService
											.getVehicleSiteList(Integer.parseInt(parkId));
									if (list.size() == 0) {
										logger.info("該網點暫無車位" + taskInfo.getId());
										return ConstantUtil.M_SITENO;
									}
								}
							}
							Calendar now = Calendar.getInstance(); // 獲取當前系統時間
							Calendar calendar = Calendar.getInstance();
							calendar.setTime(taskInfo.getAllocationtime());
							long timeOne = now.getTimeInMillis();
							long timeTwo = calendar.getTimeInMillis();
							boolean flag = true;

							// 校驗超時日期是否小於一分鐘 add cjl
							if (taskInfo.getChargingtime() != null) { // 充電任務
								Long min = UtilTimeFormatter.seconds(new Date(), taskInfo.getAllocationtime(),
										taskInfo.getChargingtime(), taskInfo.getCountdown());
								if (min != null && min < 60) {
									flag = false;
								}
							} else {
								Long min = UtilTimeFormatter.seconds(new Date(), taskInfo.getAllocationtime(), null,
										taskInfo.getCountdown());
								if (min != null && min < 60) {
									flag = false;
								}
							}
							if (flag) {
								if (taskInfo.getAllocationtime() != null && taskInfo.getTasktype() == 0) {
									if (taskInfo.getChargingtime() != null
											&& taskInfo.getChargingtime().toString().equals("0.5")) {// 充電時間爲半個小時
										int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
										if (taskInfo.getCountdown() != null
												&& (minute - 30) > taskInfo.getCountdown()) {
											taskInfo.setTimeout(minute - taskInfo.getCountdown() - 30);
										}
									} else if (taskInfo.getChargingtime() != null
											&& taskInfo.getChargingtime().toString().equals("1")) {// 充電時間爲一個小時
										int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
										if (taskInfo.getCountdown() != null
												&& (minute - 60) > taskInfo.getCountdown()) {
											taskInfo.setTimeout(minute - taskInfo.getCountdown() - 60);
										}
									} else if (taskInfo.getChargingtime() != null
											&& taskInfo.getChargingtime().toString().equals("1.5")) {// 一個半小時
										int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
										if (taskInfo.getCountdown() != null
												&& (minute - 90) > taskInfo.getCountdown()) {
											taskInfo.setTimeout(minute - taskInfo.getCountdown() - 90);
										}
									} else if (taskInfo.getChargingtime() != null
											&& taskInfo.getChargingtime().toString().equals("2")) {// 倆個小時
										int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
										if (taskInfo.getCountdown() != null
												&& (minute - 120) > taskInfo.getCountdown()) {
											taskInfo.setTimeout(minute - taskInfo.getCountdown() - 120);
										}
									} else if (taskInfo.getChargingtime() == null
											|| taskInfo.getChargingtime().toString().equals("")) {
										int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
										if (taskInfo.getCountdown() != null && minute > taskInfo.getCountdown()) {
											taskInfo.setTimeout(minute - taskInfo.getCountdown());
										}
									}
								} else {
									int minute = new Long((timeOne - timeTwo) / (1000 * 60)).intValue();// 轉化minute搜索
									if (taskInfo.getCountdown() != null && minute > taskInfo.getCountdown()) {
										taskInfo.setTimeout(minute - taskInfo.getCountdown());
									}
								}
							} else {
								taskInfo.setTimeout(0);// 小於1分鐘
							}
							if (accidentType != null && !accidentType.equals("")) {
								taskInfo.setAccidentType(Integer.parseInt(accidentType));
							}
							taskInfo.setAccomplishtime(new Date());
							int res = vehicleUnLockService.updateByPrimaryKeySelective(reorgids, taskInfo, imgUrl,
									imgUrlTwo, parkId, branchId, vs);

							if (res == 1) {
								Vehicle vh = vehicleService.selectByPrimaryKey(taskInfo.getVehicleid());
								carManagerLogService.insertLog(taskInfo.getTaskuserid(),
										TaskType.valueOf(taskInfo.getTasktype()).getName() + " 任務完成 車牌號:"
												+ (vh != null ? vh.getPlatenumber() : "未知") + " \r\n任務單號:"
												+ taskInfo.getTaskNo());
								logger.info("任務完成" + taskInfo.getId());
								return ConstantUtil.M_SUCCESS;
							} else {
								logger.info("任務完成失敗了,請稍後再試" + taskInfo.getId());
								return String.valueOf(res);
							}
						}
					} else {
						logger.info("請操做開鎖功能" + taskInfo.getId());
						return ConstantUtil.M_PARAMTER_NULL;
					}
				}
			});

			if (ret.equals(ConstantUtil.M_SUCCESS)) {
				messageResult.setData(taskInfo.getOrderkey());
				messageResult.setCode(ConstantUtil.M_SUCCESS);
				messageResult.setMessage("任務完成成功");
				this.out(response, messageResult);
			} else {
				messageResult.setData("0");
				messageResult.setCode(ret);
				messageResult.setMessage("任務完成失敗");
				this.out(response, messageResult);
			}
		} catch (Exception ex) {
			messageResult.setData("");
			messageResult.setCode(ConstantUtil.M_EXCEPTION);
			messageResult.setMessage("任務完成失敗");
			this.out(response, messageResult);
			ex.printStackTrace();
		}
	}

	/***
	 * 根據任務生成e代駕訂單(靜態方法供外部調用)
	 * 
	 * @param taskid
	 */
	public static MessageResult createOrderByTask(Integer taskId, String customerId) {
		AgentController agent = new AgentController();
		return agent.createOrderByTaskId(taskId, customerId);
	}

	/***
	 * 選擇站點
	 * 
	 * @param sn
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public int selectSiteid(String sn) {
		int result = 0;
		int parkId = 0;
		int branchId = 0;
		Integer siteID = 0;
		String str = VehicleControlUtil.getGpsInfoFromSn(sn); // 獲取原始GPS座標 ADD
																// CJL
		if (str != null && !"".equals(str)) {
			Map<Object, Object> m = JSONProcesser.parseDataToMap(str);
			if ((double) m.get("result") == 1 && m.get("cars") != null
					&& ((List<Map<Object, Object>>) m.get("cars")).size() > 0) {
				List<Map<Object, Object>> listdetail = (List<Map<Object, Object>>) m.get("cars");
				if (listdetail != null && listdetail.size() > 0) {
					Map<Object, Object> map = listdetail.get(0);
					String lat = map.get("latitude").toString();
					String lon = map.get("longitude").toString();
					List<Parkinglot> parkList = getEfenceByGPS(Double.parseDouble(lon), Double.parseDouble(lat), 1);
					if (parkList == null || parkList.size() == 0) {
						// 車輛不在任何還車區域內
						return result;
					} else {
						int type = 0; // 0車場 1網點
						// 調用接口判斷車輛是否在還車區域內,若是在返回網點或車場的id
						for (int i = 0; i < parkList.size(); i++) {
							Parkinglot parkinglot = parkList.get(i);
							if (parkinglot.getParktype() != null) {
								EfenceBaseType efenceType;
								try {
									efenceType = EfenceBuilder.BuildEfence(parkinglot.getParktype(),
											parkinglot.getCoordinatepoints());
									EfenceState efenceState = efenceType.GetEfenceState(Double.parseDouble(lon),
											Double.parseDouble(lat));
									if (EfenceState.In.equals(efenceState)) {
										parkId = parkinglot.getCountyid();
										branchId = parkinglot.getId();
										type = parkinglot.getStatus();
										break;
									}
								} catch (Exception e) {
									// TODO Auto-generated catch block
									// e.printStackTrace();
								}
							}
						}

						// 若是等於0 說明全部區域都不符合還車條件
						if (parkId == 0 && branchId == 0) {
							return result;
						}

						// 根據返回的車場或網點id,查找是否有車位能夠進行還車
						if (type == 0) {
							// 若是是車場
							siteID = this.vehicleUnLockService.selectSiteIDByID(parkId);
							branchId = 0;
							if (siteID == null) {
								return 0;
							}
							return siteID;
						} else {
							// 若是是網點
							siteID = this.vehicleUnLockService.selectSiteIDByBranchID(branchId);
							if (siteID == null) {
								return 0;
							}
							return siteID;
						}
					}
				}
				return result;
			}
			return result;
		}
		return result;
	}

	/***
	 * 經過當前車輛GPS點獲取能夠使用的車場或網點還車範圍信息
	 * 
	 * @param lng
	 * @param lat
	 * @param Type
	 * @return
	 */
	public List<Parkinglot> getEfenceByGPS(double lng, double lat, int Type) {
		ReturnForInterface rfi = new ReturnForInterface();

		String resutl = TengXunAPIUtil.getDetailByGPS(lng, lat, Type);
		if (!StringUtils.isBlank(resutl)) {
			// 將地圖返回json轉化爲實體
			net.joystart.mapCoordinates.entity.ReturnResult RR = (net.joystart.mapCoordinates.entity.ReturnResult) JSONProcesser
					.jsonProcesser(resutl, net.joystart.mapCoordinates.entity.ReturnResult.class);

			if (RR != null) {
				// 獲取城市的名稱
				String CityName = RR.getResult().getAddress_component().getCity();
				// 獲取城市名稱的前2個字
				String smallCityName = "";
				if (!StringUtils.isBlank(resutl) && !StringUtils.isBlank(CityName)) {
					smallCityName = CityName.substring(0, 2);
				}

				// 根據2個城市名字篩選獲取全部城市對應的id
				Map<String, Object> params = new HashMap<String, Object>();
				params.put("fullname", "%" + CityName + "%");
				params.put("name", "%" + smallCityName + "%");

				// 獲取當前時間的小時和分鐘
				Calendar calendar_as = Calendar.getInstance();

				Date dtnow = new Date();
				SimpleDateFormat sdf = new SimpleDateFormat("HHmm");

				String curtime = sdf.format(dtnow);

				params.put("minsec", Integer.valueOf(curtime));

				return vehicleUnLockService.selectEfenceByCity(params);
			}
		}

		return null;
	}

	/***
	 * 生成e代駕簽名
	 * 
	 * @param params
	 * @param md5_key
	 * @return
	 */
	public boolean checkToken(String token) {
		String sql = "SELECT * FROM t_base_task_token WHERE token='" + token + "'";
		List<Map<String, Object>> result = DataBaseUtil.query(sql);
		if (result == null || result.size() == 0) {
			return false;
		}
		return true;
	}

	/***
	 * 生成e代駕簽名
	 * 
	 * @param params
	 * @param md5_key
	 * @return
	 */
	public String getSign(Map<String, String> params, String md5_key) {
		Map<String, String> sParaNew = paraFiltere(params);
		String preSignStr = createLinkString(sParaNew);
		String tmp = sign(preSignStr);
		return sign(tmp + md5_key);
	}

	/**
	 * 除去數組中的空值和簽名參數
	 * 
	 * @param sArray
	 *            簽名參數組
	 * @return 去掉空值與簽名參數後的新簽名參數組
	 */
	public Map<String, String> paraFilter(Map<String, String> sArray) {

		Map<String, String> result = new HashMap<String, String>();

		if (sArray == null || sArray.size() <= 0) {
			return result;
		}

		for (String key : sArray.keySet()) {
			String value = sArray.get(key);
			if (value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("msg")) {
				continue;
			}
			result.put(key, value);
		}

		return result;
	}

	/**
	 * 除去數組中的空值和簽名參數
	 * 
	 * @param sArray
	 *            簽名參數組
	 * @return 去掉空值與簽名參數後的新簽名參數組
	 */
	public Map<String, String> paraFiltere(Map<String, String> sArray) {

		Map<String, String> result = new HashMap<String, String>();

		if (sArray == null || sArray.size() <= 0) {
			return result;
		}

		for (String key : sArray.keySet()) {
			String value = sArray.get(key);
			if (value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("msg")) {
				result.put(key, "");
				continue;
			}
			result.put(key, value);
		}

		return result;
	}

	/**
	 * 把數組全部元素排序,並按照「參數=參數值」的模式用「&」字符拼接成字符串
	 * 
	 * @param params
	 *            須要排序並參與字符拼接的參數組
	 * @return 拼接後字符串
	 */
	public String createLinkString(Map<String, String> params) {

		List<String> keys = new ArrayList<String>(params.keySet());
		Collections.sort(keys);
		String prestr = "";
		for (int i = 0; i < keys.size(); i++) {
			String key = keys.get(i);
			String value = params.get(key);
			prestr = prestr + key + "=" + value;
		}
		return prestr;
	}

	/**
	 * 把數組全部元素排序,並按照「參數=參數值」的模式用「&」字符拼接成字符串
	 * 
	 * @param params
	 *            須要排序並參與字符拼接的參數組
	 * @return 拼接後字符串
	 */
	public String getSendParam(Map<String, String> params) {

		List<String> keys = new ArrayList<String>(params.keySet());
		Collections.sort(keys);
		String prestr = "";
		for (int i = 0; i < keys.size(); i++) {
			String key = keys.get(i);
			String value = params.get(key);
			if (i == keys.size() - 1) {
				prestr = prestr + key + "=" + value;
			} else {
				prestr = prestr + key + "=" + value + "&";
			}
		}
		return prestr;
	}

	/**
	 * 簽名字符串
	 * 
	 * @param text
	 *            須要簽名的字符串
	 * @param key
	 *            密鑰
	 * @param input_charset
	 *            編碼格式
	 * @return 簽名結果
	 */
	public String sign(String text) {
		return DigestUtils.md5Hex(getContentBytes(text));
	}

	/**
	 * @param content
	 * @param charset
	 * @return
	 * @throws SignatureException
	 * @throws UnsupportedEncodingException
	 */
	private byte[] getContentBytes(String content) {
		try {
			return content.getBytes(ZCloudSignConfig.charset);
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("MD5簽名過程當中出現錯誤,指定的編碼集不對,");
		}
	}

	/**
	 * 故障完成邏輯 add cjl
	 */
	@RequestMapping("/faultFinishTask")
	public void faultFinishTask(HttpServletResponse response, HttpServletRequest request) {
		MessageResult messageResult = new MessageResult();
		String taskid = request.getParameter("taskid");
		if (!taskid.equals("null")) {
			TaskInfo taskInfo = vehicleUnLockService.selectByPrimaryKey(Integer.parseInt(taskid));
			List<Integer> list = this.vehicleUnLockService.selectByPrimaryKeyVehidInt(taskInfo.getVehicleid());
			if (list != null && list.size() > 0) {//防止車位綁定重複 由於故障完成不須要開鎖操做沒法刪除車位關係
				 vehicleUnLockService.deleteByPrimaryKeyForEach(list);
			}
			Order order = orderService.selectByPrimaryKey(taskInfo.getOrderid());
			order.setOrderstatus(10);
			order.setId(taskInfo.getOrderid());
			orderService.updateByPrimaryKeySelectiveStaus(order);//故障完成無需開鎖,因此訂單狀體強制改爲10
			// 結束訂單信息
			if (taskInfo.getOrderid() != null) {
				int result = ControlService.vehicleControl(order.getCustomerid(), order.getId(), 3, null, null, "2",1);
			}
			Vehicle vehicle = vehicleService.selectByPrimaryKey(taskInfo.getVehicleid());
			int recReport = vehicleUnLockService.getFaultReportCount(vehicle.getPlatenumber());
			if (recReport > 0) {
				messageResult.setCode(ConstantUtil.M_EXCEPTION);
				messageResult.setMessage("有未處理完的故障報修,請處理後再上報");
				this.out(response, messageResult);
				return;
			} else {
				taskInfo.setTaskstatus(5);
				int res = vehicleUnLockService.updateTaskInfo(taskInfo);
				if (res != 0) {
					MessageTemplate mTemplate = messageTemplateService
							.selectTitleAndContentByIdentification(ConstantUtil.E_FAULTREPORT);
					Parkinglot parkinglot = vehicleService.selectByPrimaryKeyParkinglot(vehicle.getParkid());
					CarManager carManager =carManagerService.selectByPrimaryKey(taskInfo.getTaskuserid());
					String content = mTemplate.getContent().replaceAll("【plateNumber】", vehicle.getPlatenumber());
					content = content.replaceAll("【name】", carManager.getName());
					content = content.replaceAll("【phone】", carManager.getUsername());
					if(mTemplate!=null)
					{
					  PostMsgHttpContent.sendMessage(parkinglot.getTelephone(),content);
					  logger.info("<----------------故障完成發短信:短信發送成功" + "---------------------->");
					}
					else
					{
					  logger.info("<----------------故障完成發短信:短信模板爲空" + "---------------------->"); 
					}
					
					carManagerLogService.insertLog(taskInfo.getTaskuserid(), "上報故障,車牌號:" + vehicle.getPlatenumber());// +
					// "
					// 故障ID:"
					// +
					// faultReport.getId()
					messageResult.setCode(ConstantUtil.M_SUCCESS);
					messageResult.setMessage("故障上報成功");
					this.out(response, messageResult);
				} else {
					messageResult.setCode(ConstantUtil.M_EXCEPTION);
					messageResult.setMessage("故障上報失敗了,請稍後再試");
					this.out(response, messageResult);
				}
			}
		} else {
			messageResult.setCode(ConstantUtil.M_PARAMTER_NULL);
			messageResult.setMessage("無任務信息");
			this.out(response, messageResult);
		}

	}
}
相關文章
相關標籤/搜索