| @@ -1,24 +1,17 @@ | |||||
| package com.iformall.controller.callback; | package com.iformall.controller.callback; | ||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.common.SysConfigConstant; | |||||
| import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON; | |||||
| import com.iformall.controller.base.BaseController; | import com.iformall.controller.base.BaseController; | ||||
| import com.iformall.domain.po.*; | import com.iformall.domain.po.*; | ||||
| import com.iformall.domain.po.base.TenantEntity; | import com.iformall.domain.po.base.TenantEntity; | ||||
| import com.iformall.domain.vo.WxCouponOrderCVo; | import com.iformall.domain.vo.WxCouponOrderCVo; | ||||
| import com.iformall.enums.EnumAssignTagsTrigger; | import com.iformall.enums.EnumAssignTagsTrigger; | ||||
| import com.iformall.enums.EnumCouponType; | |||||
| import com.iformall.enums.EnumCouponValidType; | |||||
| import com.iformall.enums.EnumCouponVerifyType; | |||||
| import com.iformall.enums.EnumCreditLockedStatus; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.tags.jinmao.JinMaoOrderTagsDeveloper; | import com.iformall.service.tags.jinmao.JinMaoOrderTagsDeveloper; | ||||
| import com.iformall.service.tags.jinmao.JinMaoUserTagsDeveloper; | import com.iformall.service.tags.jinmao.JinMaoUserTagsDeveloper; | ||||
| import com.iformall.utils.Base64Util; | |||||
| import com.iformall.utils.DateUtils; | import com.iformall.utils.DateUtils; | ||||
| import org.apache.commons.io.IOUtils; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -28,12 +21,17 @@ import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.ResponseBody; | import org.springframework.web.bind.annotation.ResponseBody; | ||||
| import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
| import java.math.RoundingMode; | |||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | |||||
| import java.util.Locale; | import java.util.Locale; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| /** | /** | ||||
| * 金茂数据推送 | * 金茂数据推送 | ||||
| @@ -206,23 +204,92 @@ public class JinMaoController extends BaseController { | |||||
| } | } | ||||
| /** | |||||
| * Request: | |||||
| * 二维码、指纹、RFID | |||||
| * GET /data/Acs.aspx?method=SearchCardAcs&type=1&Reader=0&DataLen=1024&Index=4681&Serial=R12034&Status=03&Input=0000&Ver=135&ID=R12034&MAC=0004A33CCCB2&Card=Base64编码的数据 | |||||
| * POST BODY {"type":"10","Reader":"1","DataLen":"952","Index":"1979","Serial":"R12034","Status":"03","Input":"0000","Ver":"135","ID":"R12034","IP":"192.168.3.34","MAC":"0004A33CCCB2","Card":"S4dTUzIxAAACxMgECAUHCc7QAADixCEBAAAAgmkSmsQtAB4PxgD1AKLLygBQAKIPmgBhxBUOpABnAGUPysSSADIPRABcAHHJUgCfAIQNbQCdxKwPTgCyAI4NLsSyAGUORwALAEzKtQDzAL0P4AD1xAMPDgACAcEPTcQCAa4OlADPAbTLUwATAZwPooCZR35/GgBnhP4DmMBLB3uHw6Nyk3GzzwMf9gdyB4X1UhKTHfA9K6sRj9RIOWojxn1WDg03AMnl24H/3x34MT8a/QfW6jrMKM5+E4+P7QJPV5WtaAZ/W4tryBRca45isvpHH5YLnzR+nePru1jHICzFAMsW2gQAZwkejgcAtgUgwDpGBsTCBiLA/wXFlAvTNgYAqwYeBT4IxIYMFsD//wXALcIBWA8JQcHMAHDKDkZEwBEAiRUOBMD9wP7/wAXA/TtG/xIARR7MwMI6/sA2PsE/Og8C+icDP0A1UzoKAvIsA/9LPf/NAJ7oG0xHCQCZ9SDCBEs4BADJM+JVCMQ0NQZKMELQACyE/C/A/v5DO//9+sH/SwUAJo/9/QT8EABgTRAFK/07/v1YRg0A2lX4hUrAKMAGANJh9YX+DgBjYhA7wf6I/jJWDwBiohdJOkFF/2wKAGJrJYXAPsAWAA+r9EQ5/iv+NT5iSRMCyXnwNf4u/+z+wgVQFQAIhPCE//zj//7+wf9nBH8RxAqP6/47/Tgq/I7AwnsFAMxQLTzCAceWN8FEwwBCXXXBwWkHAJablQDFwnMHAE9lgMcEYxIACZvrOv7DP//7//3//a/CdM8BVqMr/TIEksPOAVSpPTeGQgcChLNXwP//+zoEAu23Z1YHAEMVU8I+/jYEAEnSjJsExArY7cLCT80AS3RSU/wnBQDv9gE//8AGEBEAMv3/8QcQEQYD/+4FEsgMCcBAUkLFC0HFAQALRVIAayMBAA=="} | |||||
| * @param 接收到的数据类型 type | |||||
| 0 = 卡; | |||||
| 1 = 串口232接口输入字符串,如二维码等;(不推荐) | |||||
| 2 = 密码; | |||||
| 3 = 按钮请求; | |||||
| 6 或者26= 二代证数据; | |||||
| 9 = Base64编码数据,用于串口输入,二维码;(推荐) | |||||
| 10 = 指纹数据; | |||||
| 11 = 指静脉数据; | |||||
| 12 = RFID卡; | |||||
| 13或者23 = 人脸; | |||||
| * | |||||
| * @param Card:接收到的卡号、密码、二维码、身份证号码等 | |||||
| * @param Serial:控制器序列号,用于区别设备 | |||||
| * | |||||
| * Response: | |||||
| * DATA={"Card":"4238669","Systime":"2017-01-18 11:47:09","Voice":"........,........","ActIndex":"0","AcsRes":"1","Time":"1","Note":"..........................","Name":"................"} | |||||
| * @param AcsRes : 必须。处理结果,1打开,2报警,3关闭,0拒绝 | |||||
| * @param ActIndex : 必须。动作位置,继电器位置, 0-2,0:进,1:出,2:报警 | |||||
| * @param Time : 必须。继电器动作时间,也就是继电器保持动作多少秒 | |||||
| * @param LCD : 可选参数,屏幕显示页面,无表示由控制器本身控制。2019-06-14 | |||||
| * @param LCDTime : 可选参数,屏幕保持显示的时间 2019-07-05 | |||||
| * @param Name: 可选参数,姓名,显示在LCD屏幕上,小于16字节 | |||||
| * @param Note : 可选参数,事件说明,显示在LCD屏幕上,小于32字节 | |||||
| * @param Card : 可选参数,卡号字符串,显示在LCD屏幕上,小于16字节 | |||||
| * @param Systime : 可选参数,时间,显示在LCD屏幕上,小于20字节 | |||||
| * @param Voice : 可选参数,语音字符串,用于播报,小于,小于40字 | |||||
| * | |||||
| * AcsRes ActIndex 动作继电器 | |||||
| 不允许开 0 0 - | |||||
| 允许进 1 0 打开LockA | |||||
| 允许出 1 1 打开LockB | |||||
| 控制输出 1 2 打开Alarm | |||||
| 报警 2 0 Alarm | |||||
| 关闭输出 3 0 关闭 LockA | |||||
| 关闭输出 3 1 关闭LockB | |||||
| 关闭输出 3 2 关闭Alarm | |||||
| 全关 4 X 关闭LockA LockB | |||||
| 全开 100 x 打开LockA LockB | |||||
| * @param param | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| @RequestMapping(value = "/dfh/verify") | @RequestMapping(value = "/dfh/verify") | ||||
| public ResultData dfhVerify(@RequestBody Map param) throws Exception { | |||||
| logger.info("dfh verify:"+param); | |||||
| public void dfhVerify(HttpServletRequest request,HttpServletResponse response) throws Exception { | |||||
| InputStream inputStream = null; | |||||
| try { | try { | ||||
| String couponOrderIdStr = param.get("couponOrderId")==null?"":param.get("couponOrderId").toString(); | |||||
| if (StringUtils.isBlank(couponOrderIdStr)) { | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||||
| inputStream = request.getInputStream(); | |||||
| String paramStr = IOUtils.toString(inputStream, "utf-8"); | |||||
| logger.info("dfh verify: {}",paramStr); | |||||
| if (StringUtils.isBlank(paramStr)) { | |||||
| generateResult(response,true,false, null, "参数不能为空paramStr", null, "参数非法"); | |||||
| return ; | |||||
| } | } | ||||
| String _decodeCouponOrderId = WxCouponOrderCVo.getDecodeExpiredCouponOrderId(couponOrderIdStr); | |||||
| Map param = JSON.parseObject(paramStr, Map.class); | |||||
| String typeStr = param.get("type")==null?"":param.get("type").toString(); | |||||
| if (StringUtils.isBlank(typeStr) || (!"9".equals(typeStr))) { | |||||
| generateResult(response,true,false, null, "参数非法type"+typeStr, null, "参数非法"); | |||||
| return ; | |||||
| } | |||||
| String couponOrderIdStr = param.get("Card")==null?"":param.get("Card").toString(); | |||||
| if (StringUtils.isBlank(couponOrderIdStr)) { | |||||
| generateResult(response,true,false, null, "参数不能为空Card", null, "参数非法"); | |||||
| return ; | |||||
| } | |||||
| String mac = (String)param.get("MAC"); | |||||
| String serial = (String)param.get("Serial"); | |||||
| String _base64CouponOrderId = decodeBase64Url(couponOrderIdStr); | |||||
| String _decodeCouponOrderId = WxCouponOrderCVo.getDecodeExpiredCouponOrderId(_base64CouponOrderId); | |||||
| if (_decodeCouponOrderId.contains(WxCouponOrderCVo.arg)) { | if (_decodeCouponOrderId.contains(WxCouponOrderCVo.arg)) { | ||||
| String[] decodeids = _decodeCouponOrderId.split(WxCouponOrderCVo.arg); | String[] decodeids = _decodeCouponOrderId.split(WxCouponOrderCVo.arg); | ||||
| couponOrderIdStr = decodeids[0]; | couponOrderIdStr = decodeids[0]; | ||||
| String expiredtimeStr = decodeids[1]; | String expiredtimeStr = decodeids[1]; | ||||
| Date expiredtime = DateUtils.string2Date(expiredtimeStr).getTime(); | Date expiredtime = DateUtils.string2Date(expiredtimeStr).getTime(); | ||||
| if (expiredtime.before(new Date())) { | if (expiredtime.before(new Date())) { | ||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"码已失效,请更新二维码后重试"); | |||||
| generateResult(response,true,false, null, "码已失效,请刷新", null, "码已失效"); | |||||
| return ; | |||||
| } | } | ||||
| } | } | ||||
| @@ -232,21 +299,98 @@ public class JinMaoController extends BaseController { | |||||
| } catch (NumberFormatException e) { | } catch (NumberFormatException e) { | ||||
| couponOrderId = 0L; | couponOrderId = 0L; | ||||
| logger.error("couponOrderId参数不正确: " + param.toString()); | logger.error("couponOrderId参数不正确: " + param.toString()); | ||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||||
| generateResult(response,true,false, null, "参数非法Card"+couponOrderIdStr, null, "参数非法"); | |||||
| return ; | |||||
| } | } | ||||
| try { | try { | ||||
| WxCouponOrder couponOrder = wxCouponOrderService.verifyByEquiment(couponOrderId, "1035", "1037", "闸机扫码核销"); | |||||
| return new ResultData(couponOrder); | |||||
| WxCouponOrder couponOrder = wxCouponOrderService.verifyByEquiment(couponOrderId, "789", "null", "闸机扫码核销[Serial:"+serial+",MAC:"+mac+"]"); | |||||
| generateResult(response,false,true, couponOrder.getCouponName(), "核销成功", String.valueOf(couponOrder.getId()), "核销成功"); | |||||
| return ; | |||||
| }catch(Exception e) { | }catch(Exception e) { | ||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getMessage()); | |||||
| logger.error("JinMaoController --dfhOrder",e); | |||||
| generateResult(response,true,false, null, "核销错误"+e.getMessage(), null, "核销错误"); | |||||
| return ; | |||||
| } | } | ||||
| }catch(Exception e){ | }catch(Exception e){ | ||||
| logger.error("JinMaoController --dfhOrder",e); | logger.error("JinMaoController --dfhOrder",e); | ||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getMessage()); | |||||
| generateResult(response,true,false, null, "核销错误"+e.getMessage(), null, "核销错误"); | |||||
| return ; | |||||
| }finally { | |||||
| if (null != inputStream ) { | |||||
| inputStream.close(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| //Base64解码规则: 用+替换-, 用/替换_ 字符串后面按4的倍数补齐= 然后正常解码 | |||||
| private static String decodeBase64Url(String secureUrlBase64) | |||||
| { | |||||
| secureUrlBase64 = secureUrlBase64.replace('-', '+').replace('_', '/'); | |||||
| switch (secureUrlBase64.length() % 4) { | |||||
| case 2: | |||||
| secureUrlBase64 += "=="; | |||||
| break; | |||||
| case 3: | |||||
| secureUrlBase64 += "="; | |||||
| break; | |||||
| } | |||||
| return new String(Base64Util.decode(secureUrlBase64)); | |||||
| } | |||||
| private void generateResult(HttpServletResponse response,boolean alerm,boolean open,String name, String msg,String card,String voice) { | |||||
| Map<String,String> retMap = new HashMap<String,String>(); | |||||
| if (alerm) { | |||||
| //报警 | |||||
| retMap.put("AcsRes", "2"); | |||||
| retMap.put("ActIndex", "0"); | |||||
| }else { | |||||
| if (open) { | |||||
| //允许进 | |||||
| retMap.put("AcsRes", "1"); | |||||
| retMap.put("ActIndex", "0"); | |||||
| }else { | |||||
| //不允许进 | |||||
| retMap.put("AcsRes", "0"); | |||||
| retMap.put("ActIndex", "0"); | |||||
| } | |||||
| } | |||||
| retMap.put("Time", "3"); | |||||
| if (null != name) { | |||||
| try { | |||||
| retMap.put("Name", new String(name.getBytes(),"utf-8")); | |||||
| } catch (UnsupportedEncodingException e) { | |||||
| } | |||||
| } | |||||
| if (null != msg) { | |||||
| try { | |||||
| retMap.put("Note", new String(msg.getBytes(),"utf-8")); | |||||
| } catch (UnsupportedEncodingException e) { | |||||
| } | |||||
| } | |||||
| if (null != card) { | |||||
| retMap.put("Card", card); | |||||
| } | |||||
| retMap.put("Systime", DateUtils.date2String(new Date())); | |||||
| if (null != voice) { | |||||
| try { | |||||
| retMap.put("Voice", new String(voice.getBytes(),"utf-8")); | |||||
| } catch (UnsupportedEncodingException e) { | |||||
| } | |||||
| } | |||||
| PrintWriter out; | |||||
| try { | |||||
| response.setContentType("text/html"); | |||||
| response.setCharacterEncoding("GB2312"); | |||||
| out = response.getWriter(); | |||||
| out.print("DATA="+JSON.toJSONString(retMap)); | |||||
| out.close(); | |||||
| } catch (IOException e) { | |||||
| logger.error(" jinmao writeResponse error.",e); | |||||
| } | |||||
| } | |||||
| } | } | ||||