| @@ -125,7 +125,8 @@ public class ShiroConfig { | |||
| filterChainDefinitionMap.put("/futeCarCallback/**", "anon"); | |||
| filterChainDefinitionMap.put("/carPaidCallback/**", "anon"); | |||
| filterChainDefinitionMap.put("/keTuoCarCallback/**", "anon"); | |||
| filterChainDefinitionMap.put("/daHuaCarCallback/**", "anon"); | |||
| // static files | |||
| filterChainDefinitionMap.put("/css/**", "anon"); | |||
| filterChainDefinitionMap.put("/js/**", "anon"); | |||
| @@ -181,6 +181,9 @@ public class WxParkCallBackBaseController extends BaseController { | |||
| } | |||
| private Result handleSingleParkInCallBack(EnumCarVendor vendor,EnumCarCmd cmdType,ParkNotifyParam param ,Object sourceParam) { | |||
| if (null == param) { | |||
| return new Result(); | |||
| } | |||
| String carNumber = param.getCarNumber(); | |||
| @@ -250,6 +253,10 @@ public class WxParkCallBackBaseController extends BaseController { | |||
| } | |||
| private Result handleParkOutCallBackSingle(EnumCarVendor vendor,EnumCarCmd cmdType,ParkNotifyParam param,Object sourceParam) { | |||
| if (null == param) { | |||
| return new Result(); | |||
| } | |||
| ParkCacheUtils.removeCache(redisTemplate, vendor.getMessage(), param.getCarNumber()); | |||
| WxCarCmdLog wxCarCmdLog = null; | |||
| @@ -286,7 +293,11 @@ public class WxParkCallBackBaseController extends BaseController { | |||
| } | |||
| private Result handleUnbindCarCallBackSingle(EnumCarVendor vendor,EnumCarCmd cmdType,ParkNotifyParam param,Object sourceParam) { | |||
| WxCarCmdLog wxCarCmdLog = null; | |||
| if (null == param) { | |||
| return new Result(EnumETCPCode.SUCCESS.getCode(), EnumETCPCode.SUCCESS.getMessage()); | |||
| } | |||
| WxCarCmdLog wxCarCmdLog = null; | |||
| try { | |||
| wxCarCmdLog = saveWxCarCmdLog(vendor, cmdType, sourceParam, param); | |||
| }catch(MallinkException e) { | |||
| @@ -325,6 +336,10 @@ public class WxParkCallBackBaseController extends BaseController { | |||
| private Result handlePaidCallbackSingle(EnumCarVendor vendor,EnumCarCmd cmdType,ParkNotifyParam param,Object sourceParam) { | |||
| if (null == param) { | |||
| return new Result(EnumETCPCode.SUCCESS.getCode(), EnumETCPCode.SUCCESS.getMessage()); | |||
| } | |||
| WxCarCmdLog carCmdLogQ = new WxCarCmdLog(); | |||
| String parkId = param.getParkId(); | |||
| WxPark parkQ = new WxPark(); | |||
| @@ -73,11 +73,11 @@ public class WxCarDaHuaCallBackController extends WxParkCallBackBaseController { | |||
| * @Author furunxin | |||
| * @Date 2020/7/8 上午8:27 | |||
| **/ | |||
| @PostMapping(value = "/PostCarInInfo") | |||
| @PostMapping(value = "/carIn") | |||
| public Result parkInCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] keTuoCarCallback parkIn: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] daHuaCarCallback parkIn: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.parkInCallBack(EnumCarVendor.CAR_KETUO, EnumCarCmd.CAR_KETUO_CALLBACK_PARK_IN, paramMap); | |||
| return super.parkInCallBack(EnumCarVendor.CAR_DAHUA, EnumCarCmd.CAR_DAHUA_CALLBACK_PARK_IN, paramMap); | |||
| } | |||
| @@ -88,24 +88,24 @@ public class WxCarDaHuaCallBackController extends WxParkCallBackBaseController { | |||
| * @Author furunxin | |||
| * @Date 2020/7/12 上午9:00 | |||
| **/ | |||
| @PostMapping(value = "/PostCarOutInfo") | |||
| @PostMapping(value = "/carOut") | |||
| public Result parkOutCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] keTuoCarCallback parkOut: " + paramMap.toString()); | |||
| return super.parkOutCallBack(EnumCarVendor.CAR_KETUO, EnumCarCmd.CAR_KETUO_CALLBACK_PARK_OUT, paramMap); | |||
| log.info("["+getIpAddr()+"] daHuaCarCallback parkOut: " + paramMap.toString()); | |||
| return super.parkOutCallBack(EnumCarVendor.CAR_DAHUA, EnumCarCmd.CAR_DAHUA_CALLBACK_PARK_OUT, paramMap); | |||
| } | |||
| @PostMapping(value = "/unbind") | |||
| public Result unbindCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] keTuoCarCallback unbind: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] daHuaCarCallback unbind: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.unbindCarCallBack(EnumCarVendor.CAR_KETUO, EnumCarCmd.CAR_KETUO_CALLBACK_UNBIND, paramMap); | |||
| return super.unbindCarCallBack(EnumCarVendor.CAR_DAHUA, EnumCarCmd.CAR_DAHUA_CALLBACK_UNBIND, paramMap); | |||
| } | |||
| @PostMapping(value = "/PostPayFeeInfo") | |||
| @PostMapping(value = "/paid") | |||
| public Result paidCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] keTuoCarCallback paid: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] daHuaCarCallback paid: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.paidCallback(EnumCarVendor.CAR_KETUO, EnumCarCmd.CAR_KETUO_CALLBACK_PAID, paramMap); | |||
| return super.paidCallback(EnumCarVendor.CAR_DAHUA, EnumCarCmd.CAR_DAHUA_CALLBACK_PAID, paramMap); | |||
| } | |||
| } | |||
| @@ -344,7 +344,6 @@ public class OrderExpiringSchedule { | |||
| return false; | |||
| } | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| public void orderExpired(WxOrder order,boolean checkRealPay) throws MallinkException, Exception { | |||
| if (checkRealPay) { | |||
| @@ -49,7 +49,12 @@ public enum EnumCarCmd { | |||
| CAR_KETUO_CALLBACK_PARK_IN(640,"科拓进场通知"), | |||
| CAR_KETUO_CALLBACK_PARK_OUT(641,"科拓出场通知"), | |||
| CAR_KETUO_CALLBACK_UNBIND(642,"科拓解绑车牌通知"), | |||
| CAR_KETUO_CALLBACK_PAID(643,"科拓支付通知") | |||
| CAR_KETUO_CALLBACK_PAID(643,"科拓支付通知"), | |||
| CAR_DAHUA_CALLBACK_PARK_IN(644,"大华进场通知"), | |||
| CAR_DAHUA_CALLBACK_PARK_OUT(645,"大华出场通知"), | |||
| CAR_DAHUA_CALLBACK_UNBIND(646,"大华解绑车牌通知"), | |||
| CAR_DAHUA_CALLBACK_PAID(647,"大华支付通知") | |||
| ; | |||
| public static EnumCarCmd getEnum(Integer code) { | |||
| @@ -72,6 +77,7 @@ public enum EnumCarCmd { | |||
| list.add(CAR_FUTE_CALLBACK_PARK_IN.getCode()); | |||
| list.add(CAR_LIFANG_CALLBACK_PARK_IN.getCode()); | |||
| list.add(CAR_KETUO_CALLBACK_PARK_IN.getCode()); | |||
| list.add(CAR_DAHUA_CALLBACK_PARK_IN.getCode()); | |||
| return list; | |||
| } | |||
| @@ -86,6 +92,7 @@ public enum EnumCarCmd { | |||
| list.add(CAR_FUTE_CALLBACK_PARK_OUT.getCode()); | |||
| list.add(CAR_LIFANG_CALLBACK_PARK_OUT.getCode()); | |||
| list.add(CAR_KETUO_CALLBACK_PARK_OUT.getCode()); | |||
| list.add(CAR_DAHUA_CALLBACK_PARK_OUT.getCode()); | |||
| return list; | |||
| } | |||
| @@ -100,6 +107,7 @@ public enum EnumCarCmd { | |||
| list.add(CAR_FUTE_CALLBACK_PAID.getCode()); | |||
| list.add(CAR_LIFANG_CALLBACK_PAID.getCode()); | |||
| list.add(CAR_KETUO_CALLBACK_PAID.getCode()); | |||
| list.add(CAR_DAHUA_CALLBACK_PAID.getCode()); | |||
| return list; | |||
| } | |||
| @@ -119,6 +119,7 @@ public class ParkFactory { | |||
| callBackServiceMap.put(EnumCarVendor.CAR_FUTE.getCode(), futeParkCallbackService); | |||
| callBackServiceMap.put(EnumCarVendor.CAR_LIFANG.getCode(), lifangParkCallbackService); | |||
| callBackServiceMap.put(EnumCarVendor.CAR_KETUO.getCode(), keTuoParkCallbackService); | |||
| callBackServiceMap.put(EnumCarVendor.CAR_DAHUA.getCode(), dahuaCallbackService); | |||
| return callBackServiceMap; | |||
| } | |||
| @@ -130,7 +131,6 @@ public class ParkFactory { | |||
| batchCallBackServiceMap.put(EnumCarVendor.CAR_JIESHUN.getCode(), jieshunCallBackService); | |||
| batchCallBackServiceMap.put(EnumCarVendor.CAR_JIESHUN_V2.getCode(), jieshunV2CallBackService); | |||
| batchCallBackServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI.getCode(), haikangWeishiCallBackService); | |||
| batchCallBackServiceMap.put(EnumCarVendor.CAR_DAHUA.getCode(), dahuaCallbackService); | |||
| return batchCallBackServiceMap; | |||
| } | |||
| @@ -31,7 +31,7 @@ import lombok.extern.slf4j.Slf4j; | |||
| @Slf4j | |||
| @Service | |||
| public class DaHuaParkCallbackService extends BaseParkService implements ParkBatchCallBackAdapterService { | |||
| public class DaHuaParkCallbackService extends BaseParkService implements ParkCallBackAdapterService { | |||
| @Autowired | |||
| @@ -44,8 +44,8 @@ public class DaHuaParkCallbackService extends BaseParkService implements ParkBat | |||
| WxCarJSOrderMapper wxCarJSOrderMapper; | |||
| private String handleCarNumber(String carNumber) { | |||
| if (StringUtils.isBlank(carNumber)) { | |||
| return "空车牌"; | |||
| if (StringUtils.isBlank(carNumber) || "无牌车".equals(carNumber)) { | |||
| return null; | |||
| } | |||
| if (carNumber.contains("-")) { | |||
| carNumber = carNumber.replaceAll("-", ""); | |||
| @@ -54,37 +54,23 @@ public class DaHuaParkCallbackService extends BaseParkService implements ParkBat | |||
| } | |||
| /** | |||
| * {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} | |||
| * {parkingLotCode=10005, carInTime=2023-07-24 16:03:25, parkingRecordId=20230724GIBgulTLyuqX07XBMbMRK, carNum=皖MNT597, carInChnId=1000874$14$0$0, parkingLotName=玲珑湾西院} | |||
| */ | |||
| @Override | |||
| public List<ParkNotifyParam> parseInNoticyParam(Object param) { | |||
| public 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); | |||
| } | |||
| } | |||
| return retList; | |||
| } | |||
| return null; | |||
| } | |||
| private ParkNotifyParam parseInNoticyParamSingle(Map<String,Object> paramMap) { | |||
| String carNumber = paramMap.get("carNumber").toString(); | |||
| String parkCode = paramMap.get("parkCode").toString(); | |||
| String parkName = paramMap.get("parkName").toString(); | |||
| String carNumber = paramm.get("carNum").toString(); | |||
| String parkCode = paramm.get("parkingLotCode").toString(); | |||
| String parkName = paramm.get("parkingLotName").toString(); | |||
| String synId = paramMap.get("itemId").toString(); | |||
| String entranceTime = paramMap.get("inTime").toString(); | |||
| String synId = paramm.get("parkingRecordId").toString(); | |||
| String entranceTime = paramm.get("carInTime").toString(); | |||
| ParkNotifyParam p = new ParkNotifyParam(); | |||
| String realCarNumber = handleCarNumber(carNumber); | |||
| if (StringUtils.isBlank(realCarNumber)) { | |||
| return null; | |||
| } | |||
| p.setCarNumber(realCarNumber); | |||
| p.setParkId(parkCode); | |||
| p.setParkName(parkName); | |||
| @@ -98,33 +84,18 @@ public class DaHuaParkCallbackService extends BaseParkService implements ParkBat | |||
| return p; | |||
| } | |||
| /** | |||
| * {parkingLotCode=10005, parkingRecordId=20230724h9XljrQ6hfvPL4tWOO5Yc, carNum=皖MM5823, carOutChnId=1000877$14$0$0, parkingLotName=玲珑湾西院, carOutTime=2023-07-24 16:08:10} | |||
| */ | |||
| @Override | |||
| public List<ParkNotifyParam> parseOutNoticyParam(Object param) { | |||
| public 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); | |||
| } | |||
| } | |||
| return retList; | |||
| } | |||
| return null; | |||
| } | |||
| private ParkNotifyParam parseOutNoticyParamSingle(Map<String, Object> paramMap) { | |||
| String carNumber = paramMap.get("carNumber").toString(); | |||
| String parkCode = paramMap.get("parkCode").toString(); | |||
| String parkName = paramMap.get("parkName").toString(); | |||
| String carNumber = paramm.get("carNum").toString(); | |||
| String parkCode = paramm.get("parkingLotCode").toString(); | |||
| String parkName = paramm.get("parkingLotName").toString(); | |||
| String synId = paramMap.get("itemId").toString(); | |||
| String entranceTime = paramMap.get("outTime").toString(); | |||
| String synId = paramm.get("parkingRecordId").toString(); | |||
| String entranceTime = paramm.get("carOutTime").toString(); | |||
| String realCarNumber = handleCarNumber(carNumber); | |||
| ParkNotifyParam p = new ParkNotifyParam(); | |||
| @@ -144,47 +115,19 @@ public class DaHuaParkCallbackService extends BaseParkService implements ParkBat | |||
| log.error("cyf outTime format error",e); | |||
| return null; | |||
| } | |||
| p.setFee(String.valueOf(paramMap.get("ssMoney"))); | |||
| p.setFee(String.valueOf(paramm.get("ssMoney"))); | |||
| return p; | |||
| } | |||
| @Override | |||
| public List<ParkNotifyParam> parseUnbindNoticyParam(Object param) { | |||
| public ParkNotifyParam parseUnbindNoticyParam(Object param) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public List<ParkNotifyParam> parsePaidNoticyParam(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 = parsePaidNoticyParamSingle(map); | |||
| if (null != ret ) { | |||
| retList.add(ret); | |||
| } | |||
| } | |||
| return retList; | |||
| } | |||
| public ParkNotifyParam parsePaidNoticyParam(Object param) { | |||
| return null; | |||
| } | |||
| DaHuaUtil jieshun = new DaHuaUtil(); | |||
| private ParkNotifyParam parsePaidNoticyParamSingle(Map<String,Object> vo) { | |||
| ParkNotifyParam p = new ParkNotifyParam(); | |||
| p.setCarNumber(handleCarNumber((String) vo.get("carNumber"))); | |||
| p.setParkId(String.valueOf(vo.get("parkCode"))); | |||
| p.setParkOrderId((String) vo.get("itemId")); | |||
| p.setSynId((String) vo.get("itemId")); | |||
| p.setFee(vo.get("ssMoney").toString()); | |||
| try { | |||
| p.setPayTime(jieshun.utcToLocal((String)vo.get("feesTime"))); | |||
| } catch (ParseException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return p; | |||
| } | |||
| } | |||
| @@ -64,7 +64,6 @@ public class DaHuaParkService extends BaseParkService implements ParkAdapterServ | |||
| @Autowired | |||
| WxCarJSOrderMapper wxCarJSOrderMapper; | |||
| DaHuaUtil dahua = new DaHuaUtil(); | |||
| @@ -98,22 +97,8 @@ public class DaHuaParkService extends BaseParkService implements ParkAdapterServ | |||
| } | |||
| /** | |||
| * 先去捷顺注册,调用登陆获取令牌,然后根据令牌调用别的接口 | |||
| * http://ap.jieshun.cn:9088/apply/ 注册信息地址 fumao/iformall2020 | |||
| * | |||
| * 捷顺商户平台:http://merchant.jslife.com.cn/merchant/index.html#/auth/login | |||
| * 捷顺门店平台:http://merchant.jslife.com.cn/store/index.html#/auth/login | |||
| * 门店商户号 000000008032172000003 密码 ycHqp61Acudxz | |||
| * | |||
| * | |||
| * API对接注意事项: | |||
| 1、token有效期两个小时,每两小时内登录一次获取token,调业务接口不需要频繁登录用,建议获取一次token存本地缓存,之后从本地获取,两小时内刷新一次, | |||
| 为避免调业务接口时刚好token被刷新,导致token失效(无效的令牌或令牌已过期),可以做下容错,重新登录获取token或用最新token重新调业务接口。 | |||
| 2、token是和ip是一对一绑定,新的ip服务器调捷顺的接口会出现ip不合法,需把ip提供捷顺方,添加白名单。多个服务调捷顺接口共用一个ip情况下,只能共用一套登录获取token机制,各自登录会冲突。 | |||
| 3、所有接口要带车牌的一律带横杠。格式如:粤-B12345。 | |||
| 4、无效的数据签名是指sn加密方式不对。sn加密方式是对p+signkey进行Md5加密,加密后的字符串大写。 | |||
| */ | |||
| @Override | |||
| public ResultData parkInitConfig(WxPark park) throws Exception { | |||
| // TODO Auto-generated method stub | |||
| @@ -168,7 +153,7 @@ public class DaHuaParkService extends BaseParkService implements ParkAdapterServ | |||
| Integer freeMinute = (Integer)park.getVendorParamsByKey("freeMinute"); | |||
| Date createTime = DateUtils.string2Date(attribute.getString("carInTime"),DateUtils.DATE_TIME_PATTERN).getTime();//计费时间,格式为“yyyy-MM-dd HH:mi:ss” | |||
| Long seconds = attribute.getLong("duration")*60;//停车时长秒 | |||
| Long seconds = attribute.getLong("duration");//停车时长秒 | |||
| Date endTime = DateUtils.getSecondsTimeAfter(seconds, createTime);//离场时间,格式为“yyyy-MM-dd HH:mi:ss” | |||
| String payPath = "pages/parkingOrder/parkingOrder?carNum="+carNumber+"&isFromPay=1&filterRoadsideInParking=0"; | |||
| return new ParkStopFee(parkOrderId,createTime,endTime, | |||
| @@ -144,7 +144,7 @@ public class DaHuaUtil { | |||
| /*token认证登陆**/ | |||
| private static String ProcLogin(String clientId,String clientSecret) { | |||
| String url = TOKEN_URL +"grant_type=client_credentials&scope=server&client_id="+clientId+"&client_secret="+clientSecret; | |||
| String url = TOKEN_URL +"?grant_type=client_credentials&scope=server&client_id="+clientId+"&client_secret="+clientSecret; | |||
| return Proc(url,content_type_token,null,null); | |||
| } | |||