| @@ -118,6 +118,7 @@ public class ShiroConfig { | |||||
| filterChainDefinitionMap.put("/carCallback/**", "anon"); | filterChainDefinitionMap.put("/carCallback/**", "anon"); | ||||
| filterChainDefinitionMap.put("/jieshunCarCallback/**", "anon"); | filterChainDefinitionMap.put("/jieshunCarCallback/**", "anon"); | ||||
| filterChainDefinitionMap.put("/cyfCarCallback/**", "anon"); | filterChainDefinitionMap.put("/cyfCarCallback/**", "anon"); | ||||
| filterChainDefinitionMap.put("/hkwsCarCallback/**", "anon"); | |||||
| // static files | // static files | ||||
| filterChainDefinitionMap.put("/css/**", "anon"); | filterChainDefinitionMap.put("/css/**", "anon"); | ||||
| @@ -0,0 +1,222 @@ | |||||
| package com.iformall.controller.callback.car.haikangweishi; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.alibaba.fastjson.JSONObject; | |||||
| import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.Result; | |||||
| import com.iformall.controller.base.BaseController; | |||||
| import com.iformall.controller.callback.car.WxParkCallBackBaseController; | |||||
| import com.iformall.domain.po.*; | |||||
| import com.iformall.domain.vo.WxCarCYFVo; | |||||
| import com.iformall.enums.EnumCarCmd; | |||||
| import com.iformall.enums.EnumCarVendor; | |||||
| import com.iformall.enums.EnumCouponSendSendType; | |||||
| import com.iformall.enums.EnumPayWay; | |||||
| import com.iformall.service.*; | |||||
| import com.iformall.service.park.impl.cyf.CYFUtil; | |||||
| import com.iformall.service.park.impl.tjd.TJDUtil; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.apache.commons.collections.CollectionUtils; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.web.bind.annotation.PostMapping; | |||||
| import org.springframework.web.bind.annotation.RequestBody; | |||||
| import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.RestController; | |||||
| import java.util.Date; | |||||
| import java.util.HashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| /** | |||||
| * @author: furunxin | |||||
| * @Date: 2020/7/6 15:29 | |||||
| * @Description: 海康威视回调接口 | |||||
| */ | |||||
| @Slf4j | |||||
| @RestController | |||||
| @RequestMapping("/hkwsCarCallback") | |||||
| public class WxCarHaiKangWeiShiCallBackController extends WxParkCallBackBaseController { | |||||
| @Autowired | |||||
| WxParkService wxParkService; | |||||
| @Autowired | |||||
| WxCarCmdLogService wxCarCmdLogService; | |||||
| @Autowired | |||||
| WxCUserService wxCUserService; | |||||
| @Autowired | |||||
| WxCUserCarService wxCUserCarService; | |||||
| @Autowired | |||||
| WxCouponSendService wxCouponSendService; | |||||
| @Autowired | |||||
| WxCarPayRecordService wxCarPayRecordService; | |||||
| @Autowired | |||||
| WxCUserBasicInfoService wxCUserBasicInfoService; | |||||
| /** | |||||
| * 入场事件: | |||||
| { | |||||
| "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" | |||||
| } | |||||
| } | |||||
| 3 出场事件: | |||||
| { | |||||
| "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" | |||||
| } | |||||
| } | |||||
| 4 图片事件: | |||||
| { | |||||
| "method":"OnEventNotify", | |||||
| "params":{ | |||||
| "ability":"vehicle_pass_out_event", | |||||
| "eventType":771760144, | |||||
| "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", | |||||
| "plateNoPicUrl":"62834762", | |||||
| "plateType":8, | |||||
| "vehicleColor":12, | |||||
| "vehiclePicUrl":"62834762", | |||||
| "vehicleType":12 | |||||
| } | |||||
| } | |||||
| ], | |||||
| "sendTime":"2021-07-01T17:31:19.659+08:00" | |||||
| } | |||||
| } | |||||
| * @param paramMap | |||||
| * @return | |||||
| * | |||||
| * 这个接口需要你们实现的时候规定下: | |||||
| 1、POST格式, | |||||
| 2、接口返回参数JSON格式:{errcode:0, errmsg: "success",data:null} | |||||
| 3、接口建议接收到过车事件,立即返回接收成功 | |||||
| * | |||||
| */ | |||||
| @PostMapping(value = "/notify") | |||||
| public Map notify(@RequestBody Map<String, Object> paramMap) { | |||||
| log.info("["+getIpAddr()+"] hkwsCarCallback notify: " + paramMap.toString()); | |||||
| Map params = (Map)paramMap.get("params"); | |||||
| String eventType = params.get("eventType").toString(); | |||||
| Result result = null; | |||||
| if ("771760131".equals(eventType)) { | |||||
| //解析车易付参数 | |||||
| result = super.parkInCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_IN, paramMap); | |||||
| }else if ("771760134".equals(eventType)) { | |||||
| result = super.parkOutCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_OUT, paramMap); | |||||
| } | |||||
| Map retMap = new HashMap(); | |||||
| int errcode = 0; | |||||
| String msg = "success"; | |||||
| if (null != result) { | |||||
| if (result.code != Result.SUCCESS) { | |||||
| errcode = result.code; | |||||
| msg = result.message; | |||||
| } | |||||
| }else { | |||||
| errcode = Result.ERROR; | |||||
| msg = "no result.eventType["+eventType+"]"; | |||||
| } | |||||
| retMap.put("errcode", errcode); | |||||
| retMap.put("errmsg", msg); | |||||
| retMap.put("data", null); | |||||
| return retMap; | |||||
| } | |||||
| } | |||||
| @@ -23,7 +23,11 @@ public enum EnumCarCmd { | |||||
| CAR_JIESHUN_CALLBACK_PARK_IN(624,"捷顺进场通知"), | CAR_JIESHUN_CALLBACK_PARK_IN(624,"捷顺进场通知"), | ||||
| CAR_JIESHUN_CALLBACK_PARK_OUT(625,"捷顺进场通知"), | CAR_JIESHUN_CALLBACK_PARK_OUT(625,"捷顺进场通知"), | ||||
| CAR_JIESHUN_CALLBACK_UNBIND(626,"捷顺解绑车牌通知"), | CAR_JIESHUN_CALLBACK_UNBIND(626,"捷顺解绑车牌通知"), | ||||
| CAR_JIESHUN_CALLBACK_PAID(627,"捷顺支付通知") | |||||
| CAR_JIESHUN_CALLBACK_PAID(627,"捷顺支付通知"), | |||||
| CAR_HAIKANGWEISHI_CALLBACK_PARK_IN(628,"捷顺进场通知"), | |||||
| CAR_HAIKANGWEISHI_CALLBACK_PARK_OUT(629,"捷顺进场通知"), | |||||
| CAR_HAIKANGWEISHI_CALLBACK_UNBIND(630,"捷顺解绑车牌通知"), | |||||
| CAR_HAIKANGWEISHI_CALLBACK_PAID(631,"捷顺支付通知") | |||||
| ; | ; | ||||
| public static EnumCarCmd getEnum(Integer code) { | public static EnumCarCmd getEnum(Integer code) { | ||||
| @@ -14,7 +14,7 @@ public enum EnumCarVendor { | |||||
| CAR_BOLINK(5, "BoLink",false), | CAR_BOLINK(5, "BoLink",false), | ||||
| CAE_CYF(6,"CYF",false), | CAE_CYF(6,"CYF",false), | ||||
| CAR_JIESHUN(7,"JIESHUN",true), | CAR_JIESHUN(7,"JIESHUN",true), | ||||
| CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",false) | |||||
| CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",true) | |||||
| ; | ; | ||||
| public static EnumCarVendor getEnum(Integer code) { | public static EnumCarVendor getEnum(Integer code) { | ||||
| @@ -88,10 +88,9 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| @Override | @Override | ||||
| public List<ParkNotifyParam> parseInNoticyParam(Object param) { | public List<ParkNotifyParam> parseInNoticyParam(Object param) { | ||||
| Map<String,Object> paramm = (Map<String, Object>) param; | Map<String,Object> paramm = (Map<String, Object>) param; | ||||
| String paramsstr = (String) paramm.get("params"); | |||||
| JSONObject paramobject = JSONArray.parseObject(paramsstr); | |||||
| if (null != paramobject) { | |||||
| JSONArray list = paramobject.getJSONArray("events"); | |||||
| Map params = (Map) paramm.get("params"); | |||||
| if (null != params) { | |||||
| List list = (List)params.get("events"); | |||||
| if (null != list && list.size() > 0 ) { | if (null != list && list.size() > 0 ) { | ||||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | ||||
| for (int i = 0 ; i < list.size() ; i ++) { | for (int i = 0 ; i < list.size() ; i ++) { | ||||
| @@ -108,16 +107,18 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| } | } | ||||
| private ParkNotifyParam parseInNoticyParamSingle(Map<String,Object> paramMap) { | 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(); | |||||
| Map vehicle = (Map)paramMap.get("vehicle"); | |||||
| Map resource = (Map)paramMap.get("resource"); | |||||
| String carNumber = vehicle.get("plateNo").toString(); | |||||
| String parkCode = resource.get("parkId").toString(); | |||||
| String parkName = resource.get("parkName").toString(); | |||||
| String synId = paramMap.get("itemId").toString(); | |||||
| String entranceTime = paramMap.get("inTime").toString(); | |||||
| String synId = paramMap.get("eventIndexCode").toString(); | |||||
| String entranceTime = paramMap.get("crossTime").toString(); | |||||
| ParkNotifyParam p = new ParkNotifyParam(); | ParkNotifyParam p = new ParkNotifyParam(); | ||||
| String realCarNumber = carNumber; | |||||
| p.setCarNumber(realCarNumber); | |||||
| p.setCarNumber(carNumber); | |||||
| p.setParkId(parkCode); | p.setParkId(parkCode); | ||||
| p.setParkName(parkName); | p.setParkName(parkName); | ||||
| p.setSynId(synId); | p.setSynId(synId); | ||||
| @@ -172,10 +173,9 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| @Override | @Override | ||||
| public List<ParkNotifyParam> parseOutNoticyParam(Object param) { | public List<ParkNotifyParam> parseOutNoticyParam(Object param) { | ||||
| Map<String,Object> paramm = (Map<String, Object>) param; | Map<String,Object> paramm = (Map<String, Object>) param; | ||||
| String paramsstr = (String) paramm.get("params"); | |||||
| JSONObject paramobject = JSONArray.parseObject(paramsstr); | |||||
| if (null != paramobject) { | |||||
| JSONArray list = paramobject.getJSONArray("events"); | |||||
| Map params = (Map) paramm.get("params"); | |||||
| if (null != params) { | |||||
| List list = (List)params.get("events"); | |||||
| if (null != list && list.size() > 0 ) { | if (null != list && list.size() > 0 ) { | ||||
| List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>(); | ||||
| for (int i = 0 ; i < list.size() ; i ++) { | for (int i = 0 ; i < list.size() ; i ++) { | ||||
| @@ -188,23 +188,23 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| return retList; | return retList; | ||||
| } | } | ||||
| } | } | ||||
| return null; | return null; | ||||
| } | } | ||||
| private ParkNotifyParam parseOutNoticyParamSingle(Map<String, Object> paramMap) { | 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(); | |||||
| Map vehicle = (Map)paramMap.get("vehicle"); | |||||
| Map resource = (Map)paramMap.get("resource"); | |||||
| String carNumber = vehicle.get("plateNo").toString(); | |||||
| String parkCode = resource.get("parkId").toString(); | |||||
| String parkName = resource.get("parkName").toString(); | |||||
| String synId = paramMap.get("itemId").toString(); | |||||
| String entranceTime = paramMap.get("outTime").toString(); | |||||
| String synId = paramMap.get("eventIndexCode").toString(); | |||||
| String entranceTime = paramMap.get("crossTime").toString(); | |||||
| String realCarNumber = carNumber; | |||||
| ParkNotifyParam p = new ParkNotifyParam(); | ParkNotifyParam p = new ParkNotifyParam(); | ||||
| p.setCarNumber(realCarNumber); | |||||
| p.setCarNumber(carNumber); | |||||
| p.setParkId(parkCode); | p.setParkId(parkCode); | ||||
| p.setParkName(parkName); | p.setParkName(parkName); | ||||
| p.setSynId(synId); | p.setSynId(synId); | ||||
| @@ -220,7 +220,6 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| // log.error("cyf outTime format error",e); | // log.error("cyf outTime format error",e); | ||||
| // return null; | // return null; | ||||
| // } | // } | ||||
| p.setFee(String.valueOf(paramMap.get("ssMoney"))); | |||||
| return p; | return p; | ||||
| } | } | ||||
| @@ -231,35 +230,6 @@ public class HaiKangWeiShiParkCallbackService extends BaseParkService implements | |||||
| @Override | @Override | ||||
| public List<ParkNotifyParam> parsePaidNoticyParam(Object param) { | 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; | |||||
| } | |||||
| return null; | return null; | ||||
| } | } | ||||
| private ParkNotifyParam parsePaidNoticyParamSingle(Map<String,Object> vo) { | |||||
| ParkNotifyParam p = new ParkNotifyParam(); | |||||
| p.setCarNumber((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; | |||||
| } | |||||
| } | } | ||||
| @@ -43,6 +43,7 @@ public class HaiKangWeiShiUtil { | |||||
| public static final String TOKEN_URL = "https://open.hikyun.com/artemis/oauth/token"; | 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 GET_FEE = "https://open.hikyun.com/api/pmsc/v1/pay/ quickGetVehicleBill"; | ||||
| public static final String COUPON_USE = "https://open.hikyun.com/api/pmsc/v1/coupon/addition"; | public static final String COUPON_USE = "https://open.hikyun.com/api/pmsc/v1/coupon/addition"; | ||||
| public static final String SUBSCRIPTION = "https://open.hikyun.com/api/pmsc/v1/sub/subscription"; | |||||
| /** | /** | ||||
| @@ -98,7 +99,7 @@ public class HaiKangWeiShiUtil { | |||||
| JSONObject vp = JSON.parseObject(vendroParams); | JSONObject vp = JSON.parseObject(vendroParams); | ||||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | ||||
| list.add(new BasicNameValuePair("chargeSource", "THIRD"));//商户编号 | list.add(new BasicNameValuePair("chargeSource", "THIRD"));//商户编号 | ||||
| list.add(new BasicNameValuePair("parkId", wxPark.getParkId())); | |||||
| list.add(new BasicNameValuePair("parkId", wxPark.getParkingId())); | |||||
| list.add(new BasicNameValuePair("plateNo", carNumber)); | list.add(new BasicNameValuePair("plateNo", carNumber)); | ||||
| String retCode= ProcBussiness(GET_FEE, list, token); | String retCode= ProcBussiness(GET_FEE, list, token); | ||||
| if (StringUtils.isBlank(retCode)) { | if (StringUtils.isBlank(retCode)) { | ||||
| @@ -145,6 +146,32 @@ public class HaiKangWeiShiUtil { | |||||
| return result; | return result; | ||||
| } | } | ||||
| /** | |||||
| * 消息订阅 3.1.8 | |||||
| * @param clientId | |||||
| * @param clientSecret | |||||
| * @return | |||||
| */ | |||||
| public JSONObject subscription(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>(); | |||||
| list.add(new BasicNameValuePair("partnerAppKey", vp.getString("AppKey")));//商户编号 | |||||
| list.add(new BasicNameValuePair("projectId", vp.getString("projectId"))); | |||||
| list.add(new BasicNameValuePair("eventTypes", carNumber)); | |||||
| list.add(new BasicNameValuePair("subUrl", vp.getString("subUrl"))); | |||||
| String retCode = ProcBussiness(SUBSCRIPTION, 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认证登陆**/ | /*token认证登陆**/ | ||||
| private static String ProcLogin(String clientId,String clientSecret) { | private static String ProcLogin(String clientId,String clientSecret) { | ||||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | ||||
| @@ -155,7 +182,6 @@ public class HaiKangWeiShiUtil { | |||||
| private static String ProcBussiness(String url,ArrayList<NameValuePair> list,String token) { | private static String ProcBussiness(String url,ArrayList<NameValuePair> list,String token) { | ||||
| try { | try { | ||||
| //TODO 11111111 | |||||
| String authorization = ""; | String authorization = ""; | ||||
| return Proc(url,list,token,authorization); | return Proc(url,list,token,authorization); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||