| @@ -14,7 +14,7 @@ public enum EnumCarVendor { | |||
| CAR_BOLINK(5, "BoLink",false), | |||
| CAE_CYF(6,"CYF",false), | |||
| CAR_JIESHUN(7,"JIESHUN",true), | |||
| CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",true) | |||
| CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",false) | |||
| ; | |||
| public static EnumCarVendor getEnum(Integer code) { | |||
| @@ -48,23 +48,61 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||
| /** | |||
| * {dataItems=[{"inTime":"2020-12-09 11:21:15","carNumber":"浙-AF81797","inCarPhoto":"p201127315/NISSP_IMG_PARK_IN/20201209/a9f1130651b9493f8eab64f14afbdd47","isReal":0,"itemId":"a9f1130651b9493f8eab64f14afbdd47","inOperator":"超级管理员","equipName":"东门入口","parkName":"杭州东站西子国际","vehicleInfo":"{\"plateNo\":\"浙-AF81797\",\"plateColor\":\"GREEN\",\"plateBackColor\":0,\"plateWordColor\":0,\"vehicleColor\":null,\"vehicleLogo\":null,\"vehicleModel\":null,\"mainModel\":0,\"subModel\":0,\"vehicleModelTrust\":0,\"mainModelTrust\":0,\"subModelTrust\":0,\"plateNoTrust\":1,\"vehicleLogoTrust\":0,\"vehicleColorTrust\":0}","equipCode":"208202496","parkCode":"p201127315"}], pno=dzxzgj, sn=6C958D99D2769AA16F3A3F06E962263F, tn=-2, ts=20201209112118886, ve=1.0} | |||
| *{ | |||
| "method":"OnEventNotify", | |||
| "params":{ | |||
| "ability":"vehicle_pass_in_event", | |||
| "eventType":771760131, | |||
| "events":[ | |||
| { | |||
| "crossTime":"2021-07-01T17:29:27+08:00", | |||
| "crossType":1, | |||
| "eventIndexCode":"74b64514-4888-4f42-8cf7-22fed37d5dc8", | |||
| "eventType":3, | |||
| "resource":{ | |||
| "deviceId":"3715149265421676", | |||
| "deviceSerial":"R20150664", | |||
| "direction":0, | |||
| "entranceId":"2063867554789264", | |||
| "entranceName":"前门1", | |||
| "parkId":"2064637172217744", | |||
| "parkName":"车库", | |||
| "resType":"roadway", | |||
| "roadWayId":"2064272439342992", | |||
| "roadWayName":"前门入口" | |||
| }, | |||
| "stopType":11, | |||
| "vehicle":{ | |||
| "plateColor":12, | |||
| "plateNo":"苏A23658", | |||
| "plateType":8, | |||
| "vehicleColor":12, | |||
| "vehicleType":12 | |||
| } | |||
| } | |||
| ], | |||
| "sendTime":"2021-07-01T17:29:29.315+08:00" | |||
| } | |||
| } | |||
| */ | |||
| @Override | |||
| public List<ParkNotifyParam> parseInNoticyParam(Object param) { | |||
| Map<String,Object> paramm = (Map<String, Object>) param; | |||
| String liststr = (String) paramm.get("dataItems"); | |||
| JSONArray list = JSONArray.parseArray(liststr); | |||
| if (null != list && list.size() > 0 ) { | |||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | |||
| for (int i = 0 ; i < list.size() ; i ++) { | |||
| Map<String,Object> map = (Map<String, Object>) list.get(i); | |||
| ParkNotifyParam ret = parseInNoticyParamSingle(map); | |||
| if (null != ret ) { | |||
| retList.add(ret); | |||
| String paramsstr = (String) paramm.get("params"); | |||
| JSONObject paramobject = JSONArray.parseObject(paramsstr); | |||
| if (null != paramobject) { | |||
| JSONArray list = paramobject.getJSONArray("events"); | |||
| if (null != list && list.size() > 0 ) { | |||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | |||
| for (int i = 0 ; i < list.size() ; i ++) { | |||
| Map<String,Object> map = (Map<String, Object>) list.get(i); | |||
| ParkNotifyParam ret = parseInNoticyParamSingle(map); | |||
| if (null != ret ) { | |||
| retList.add(ret); | |||
| } | |||
| } | |||
| return retList; | |||
| } | |||
| return retList; | |||
| } | |||
| return null; | |||
| } | |||
| @@ -92,22 +130,66 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||
| return p; | |||
| } | |||
| /** | |||
| * { | |||
| "method":"OnEventNotify", | |||
| "params":{ | |||
| "ability":"vehicle_pass_out_event", | |||
| "eventType":771760134, | |||
| "events":[ | |||
| { | |||
| "crossTime":"2021-07-01T17:31:17+08:00", | |||
| "crossType":1, | |||
| "eventIndexCode":"a5464f46-ba7b-4059-b657-5ebc2f3774a9", | |||
| "eventType":4, | |||
| "resource":{ | |||
| "deviceId":"370573791833424", | |||
| "deviceSerial":"9b1037b5-8a95-4657-81f0-edf27f71d92f", | |||
| "direction":1, | |||
| "entranceId":"2063867554789264", | |||
| "entranceName":"前门1", | |||
| "parkId":"2064637172217744", | |||
| "parkName":"车库", | |||
| "resType":"roadway", | |||
| "roadWayId":"2064664422217616", | |||
| "roadWayName":"前门出口test" | |||
| }, | |||
| "stopType":11, | |||
| "vehicle":{ | |||
| "plateColor":12, | |||
| "plateNo":"苏A23658", | |||
| "plateType":8, | |||
| "vehicleColor":12, | |||
| "vehicleType":12 | |||
| } | |||
| } | |||
| ], | |||
| "sendTime":"2021-07-01T17:31:17.337+08:00" | |||
| } | |||
| } | |||
| */ | |||
| @Override | |||
| public List<ParkNotifyParam> parseOutNoticyParam(Object param) { | |||
| Map<String,Object> paramm = (Map<String, Object>) param; | |||
| String liststr = (String) paramm.get("dataItems"); | |||
| JSONArray list = JSONArray.parseArray(liststr); | |||
| if (null != list && list.size() > 0 ) { | |||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | |||
| for (int i = 0 ; i < list.size() ; i ++) { | |||
| Map<String,Object> map = (Map<String, Object>) list.get(i); | |||
| ParkNotifyParam ret = parseOutNoticyParamSingle(map); | |||
| if (null != ret ) { | |||
| retList.add(ret); | |||
| String paramsstr = (String) paramm.get("params"); | |||
| JSONObject paramobject = JSONArray.parseObject(paramsstr); | |||
| if (null != paramobject) { | |||
| JSONArray list = paramobject.getJSONArray("events"); | |||
| if (null != list && list.size() > 0 ) { | |||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | |||
| for (int i = 0 ; i < list.size() ; i ++) { | |||
| Map<String,Object> map = (Map<String, Object>) list.get(i); | |||
| ParkNotifyParam ret = parseOutNoticyParamSingle(map); | |||
| if (null != ret ) { | |||
| retList.add(ret); | |||
| } | |||
| } | |||
| return retList; | |||
| } | |||
| return retList; | |||
| } | |||
| return null; | |||
| } | |||
| @@ -129,20 +129,8 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda | |||
| return new ResultData(21000,"车辆未入场"); | |||
| } | |||
| JSONObject attribute = haikang.getFee(park, carNumber, getCacheToken(park)); | |||
| String retCode = haikang.getFee(park, carNumber, getCacheToken(park)); | |||
| if (StringUtils.isBlank(retCode)) { | |||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getFee error. has no result"); | |||
| } | |||
| JSONObject result = JSON.parseObject(retCode); | |||
| if (result.getInteger("code") != 0 ) { | |||
| String message = result.getString("msg"); | |||
| throw new MallinkException(result.getInteger("code"), "haikang getFee error."+message); | |||
| } | |||
| JSONObject attribute = result.getJSONObject("data"); | |||
| if (null == attribute) { | |||
| throw new MallinkException(result.getInteger("code"), "haikang getFee error. no order result"+carNumber); | |||
| } | |||
| String appId = ""; | |||
| String parkOrderId = attribute.getString("id"); | |||
| String _createTime = attribute.getString("entranceTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss” | |||
| @@ -175,15 +163,11 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda | |||
| if (StringUtils.isBlank(planNo)) { | |||
| return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置[planNo]。"+coupon.getTitle()); | |||
| } | |||
| //String ret = jieshun.getCoupon(park, planNo,userCar.getCUserPhone(), getCacheToken(park)); | |||
| //打折登陆验证 | |||
| String ret = haikang.useCoupon(park,planNo,carNumber,orderNo, getCacheToken(park)); | |||
| logger.info("haikangweishi useCoupon result:"+ret); | |||
| JSONObject retObj = JSON.parseObject(ret); | |||
| JSONObject retObj = haikang.useCoupon(park,planNo,carNumber,orderNo, getCacheToken(park)); | |||
| if (retObj.getIntValue("code") == 0){ | |||
| return new ResultData(); | |||
| }else { | |||
| logger.error("haikangweishi useCoupon error. paramMap: {} . haikangResult: {}",JSON.toJSONString(paramMap),ret); | |||
| logger.error("haikangweishi useCoupon error. paramMap: {} . haikangResult: {}",JSON.toJSONString(paramMap),retObj); | |||
| String msg = retObj.getString("msg"); | |||
| return new ResultData(retObj.getIntValue("code"), "当前用户领用到海康威视停车券失败:"+msg); | |||
| } | |||
| @@ -1,7 +1,9 @@ | |||
| package com.iformall.service.park.impl.haikangweishi; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.domain.po.WxPark; | |||
| import com.iformall.exception.MallinkException; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| @@ -39,7 +41,8 @@ import java.util.Map; | |||
| public class HaiKangWeiShiUtil { | |||
| public static final String TOKEN_URL = "https://open.hikyun.com/artemis/oauth/token"; | |||
| public static final String GET_FEE = "https://open.hikyun.com/api/pmsc/v1/pay/quickGetVehicleBill"; | |||
| public static final String CAR_STOP_INFO = "https://open.hikyun.com/api/pmsc/v1/tempCarInRecords/page"; | |||
| public static final String GET_FEE = "https://open.hikyun.com/api/pmsc/v1/pay/getVehicleBill"; | |||
| public static final String COUPON_USE = "https://open.hikyun.com/api/pmsc/v1/coupon/addition"; | |||
| @@ -88,32 +91,101 @@ public class HaiKangWeiShiUtil { | |||
| } | |||
| /** | |||
| * 查询停车费 3.5.5 快速获取账单接口 | |||
| * 3.5.7 查询临时车停车信息 | |||
| */ | |||
| private JSONObject getCarStopInfo(WxPark wxPark,String carNumber,String token) { | |||
| String vendroParams = wxPark.getVendorParams(); | |||
| JSONObject vp = JSON.parseObject(vendroParams); | |||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| list.add(new BasicNameValuePair("pageNo", "1")); | |||
| list.add(new BasicNameValuePair("pageSize", "1")); | |||
| list.add(new BasicNameValuePair("parkId", wxPark.getParkId())); | |||
| list.add(new BasicNameValuePair("plateNo", carNumber));// | |||
| String carStopInfo = ProcBussiness(CAR_STOP_INFO, list, token); | |||
| if (StringUtils.isBlank(carStopInfo)) { | |||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getCarStopInfo error. has no result"); | |||
| } | |||
| JSONObject carStopInfoResult = JSON.parseObject(carStopInfo); | |||
| if (carStopInfoResult.getInteger("code") != 0 ) { | |||
| String message = carStopInfoResult.getString("msg"); | |||
| throw new MallinkException(carStopInfoResult.getInteger("code"), "haikang getCarStopInfo error."+message); | |||
| } | |||
| JSONObject carStopInfoAttribute = carStopInfoResult.getJSONObject("data"); | |||
| if (null == carStopInfoAttribute) { | |||
| throw new MallinkException(carStopInfoResult.getInteger("code"), "haikang getCarStopInfo error. no result"+carNumber); | |||
| } | |||
| JSONArray carStopInfoList = carStopInfoResult.getJSONArray("list"); | |||
| if (null == carStopInfoList || carStopInfoList.size() <= 0 ) { | |||
| throw new MallinkException(carStopInfoResult.getInteger("code"), "haikang getCarStopInfo error. no result"+carNumber); | |||
| } | |||
| return carStopInfoList.getJSONObject(0); | |||
| } | |||
| /** | |||
| * 查询停车费 3.5.3 获取账单接口 | |||
| * @return | |||
| */ | |||
| public String getFee(WxPark wxPark,String cardNumber,String token) { | |||
| public JSONObject getFee(WxPark wxPark,String carNumber,String token) { | |||
| JSONObject carStopInfo = getCarStopInfo(wxPark,carNumber,token); | |||
| String vendroParams = wxPark.getVendorParams(); | |||
| JSONObject vp = JSON.parseObject(vendroParams); | |||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| list.add(new BasicNameValuePair("chargeSource", "THIRD"));//商户编号 | |||
| list.add(new BasicNameValuePair("parkId", wxPark.getParkId()));//优惠券编号 | |||
| list.add(new BasicNameValuePair("plateNo", cardNumber));//优惠券编号 | |||
| return ProcBussiness(GET_FEE, list, token); | |||
| Map vehicle = new HashMap(); | |||
| vehicle.put("parkId", wxPark.getParkId()); | |||
| vehicle.put("plateNo", carNumber); | |||
| vehicle.put("vehicleType", 1); | |||
| vehicle.put("plateType", 1); | |||
| vehicle.put("groupId", 1); | |||
| vehicle.put("freeTime", new Object[] {}); | |||
| list.add(new BasicNameValuePair("vehicle", "["+JSON.toJSONString(vehicle)+"]") );//商户编号 | |||
| String retCode= ProcBussiness(GET_FEE, list, token); | |||
| if (StringUtils.isBlank(retCode)) { | |||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getFee error. has no result"); | |||
| } | |||
| JSONObject result = JSON.parseObject(retCode); | |||
| if (result.getInteger("code") != 0 ) { | |||
| String message = result.getString("msg"); | |||
| throw new MallinkException(result.getInteger("code"), "haikang getFee error."+message); | |||
| } | |||
| JSONObject attribute = result.getJSONObject("data"); | |||
| if (null == attribute) { | |||
| throw new MallinkException(result.getInteger("code"), "haikang getFee error. no result"+carNumber); | |||
| } | |||
| return attribute; | |||
| } | |||
| /** | |||
| * 2、有优惠券方式 | |||
| 发优惠券的时候是会返回一个优惠券id(3.5.9.1), | |||
| 在用户出场的时候,获取停车账单(3.5.3), | |||
| 使用停车账单和优惠券id获取优惠账单(3.5.4), | |||
| 调用账单支付确认接口(3.5.6); | |||
| 完成一次优惠缴费 | |||
| * 使用优惠券 3.5.9.1接口进行车牌和优惠信息绑定优惠券后,车辆出场时会自动抵扣 | |||
| **/ | |||
| public String useCoupon(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token){ | |||
| public JSONObject useCoupon(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token){ | |||
| String vendroParams = wxPark.getVendorParams(); | |||
| JSONObject vp = JSON.parseObject(vendroParams); | |||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| Map couponmap = new HashMap(); | |||
| couponmap.put("plateNo", carNumber); | |||
| couponmap.put("ruleId", couponNo); | |||
| couponmap.put("parkId", wxPark.getParkId()); | |||
| list.add(new BasicNameValuePair("coupons", "["+JSON.toJSONString(couponmap)+"]") );//商户编号 | |||
| return ProcBussiness(COUPON_USE, list,token); | |||
| String retCode = ProcBussiness(COUPON_USE, list,token); | |||
| if (StringUtils.isBlank(retCode)) { | |||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang useCoupon error. has no result"); | |||
| } | |||
| JSONObject result = JSON.parseObject(retCode); | |||
| if (result.getInteger("code") != 0 ) { | |||
| String message = result.getString("msg"); | |||
| throw new MallinkException(result.getInteger("code"), "haikang useCoupon error."+message); | |||
| } | |||
| return result; | |||
| } | |||
| /*token认证登陆**/ | |||