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); } } }