Browse Source

fix jinmao

release_toaliyun_real
xiaohanzi 4 years ago
parent
commit
46d6be83f4
1 changed files with 167 additions and 23 deletions
  1. +167
    -23
      mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java

+ 167
- 23
mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java View File

@@ -1,24 +1,17 @@
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.domain.po.*;
import com.iformall.domain.po.base.TenantEntity;
import com.iformall.domain.vo.WxCouponOrderCVo;
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.tags.jinmao.JinMaoOrderTagsDeveloper;
import com.iformall.service.tags.jinmao.JinMaoUserTagsDeveloper;
import com.iformall.utils.Base64Util;
import com.iformall.utils.DateUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
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.RestController;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
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")
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 {
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)) {
String[] decodeids = _decodeCouponOrderId.split(WxCouponOrderCVo.arg);
couponOrderIdStr = decodeids[0];
String expiredtimeStr = decodeids[1];
Date expiredtime = DateUtils.string2Date(expiredtimeStr).getTime();
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) {
couponOrderId = 0L;
logger.error("couponOrderId参数不正确: " + param.toString());
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
generateResult(response,true,false, null, "参数非法Card"+couponOrderIdStr, null, "参数非法");
return ;
}

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

Loading…
Cancel
Save