/*
* Powered By zhangyunhua
* Web Site: http://www.hehenian.com
* Since 2008 - 2015
*/
package com.hehenian.biz.service.bank.impl;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.caucho.hessian.client.HessianProxyFactory;
import com.hehenian.biz.common.bank.IBankBingService;
import com.hehenian.biz.common.bank.dataobject.BankBingDo;
import com.hehenian.biz.common.notify.SMSConfig;
import com.hehenian.biz.common.util.StringUtil;
import com.hehenian.biz.component.bank.IBankBingComponent;
import com.hhn.service.pay.IAllinPayRemoteService;
/**
* @author zhangyunhua
* @version 1.0
* @since 1.0
*/
@Service("bankBingService")
public class BankBingServiceImpl implements IBankBingService {
private final Logger logger = Logger.getLogger(this.getClass());
public static String RESULT_CODE_00 = "00"; //成功
public static String RESULT_CODE_01 = "01"; //数据无效
public static String RESULT_CODE_02 = "02"; //系统繁忙重试
public static String RESULT_CODE_03 = "03"; //银行卡被锁定
public static String RESULT_CODE_04 = "04"; //达到最多5次
public static String RESULT_CODE_05 = "05"; //次卡已经绑定过不能重复绑定
public static String RESULT_CODE_07 = "07"; //验证码不正确
public static String RESULT_CODE_08 = "08"; // 此卡无绑定记录
public static String OPERATE_TRUE = "T"; // 操作成功
public static String OPERATE_FALSE = "F"; // 操作失败
@Autowired
private IBankBingComponent bankBingComponent;
@Autowired
SMSConfig smsConfig;
IAllinPayRemoteService allinPay;
/**
* 根据ID 查询
*
* @parameter id
*/
public BankBingDo getById(int id) {
return bankBingComponent.getById(id);
}
/**
* 根据条件查询列表
*/
public List<BankBingDo> selectBankBing(Map<String, Object> parameterMap) {
return bankBingComponent.selectBankBing(parameterMap);
}
/**
* 更新
*/
public int updateBankBingById(BankBingDo newBankBingDo) {
return bankBingComponent.updateBankBingById(newBankBingDo);
}
/**
* 新增
*/
public int addBankBing(BankBingDo newBankBingDo) {
return bankBingComponent.addBankBing(newBankBingDo);
}
/**
* 删除
*/
public int deleteById(int id) {
return bankBingComponent.deleteById(id);
}
/**
* 充值前检查
*
* @param userBankBingList
* 用户所有的绑卡记录
* @param currentBankCode
* 当次需要绑定的卡号
* @return boolean false 不能发送, true 可以发送
* @author: zhangyunhmf
* @date: 2015年1月16日上午11:13:12
*/
// public String checkUserBankBingRecord(List<BankBingDo> userBankBingList,
// String currentBankCode) {
//
// if (null == userBankBingList) {
// return RESULT_CODE_00;
// }
//
// int currentSendCount = 0; // 本次卡的充值成功次数
// int totalBingCount = 0; // 本用户绑卡成功次数
// Set<String> sendCardSet = new HashSet<String>();
//
// int sendBankCardCount =
// StringUtil.strToInt(smsConfig.getSendBankCardCount(), 5);
// int sendPerCardCount =
// StringUtil.strToInt(smsConfig.getSendPerCardCount(), 2);
//
// for (BankBingDo bank : userBankBingList) {
// if (OPERATE_TRUE.equals(bank.getCheckFlag()) &&
// currentBankCode.equals(bank.getBankCode())) {
// return RESULT_CODE_05; // 已经绑定过的卡不用再绑定
// }
//
// if (OPERATE_TRUE.equals(bank.getSendFlag()) &&
// currentBankCode.equals(bank.getBankCode())) {
// currentSendCount++;
// }
// if (OPERATE_TRUE.equals(bank.getSendFlag())) {// 累计发送成功的卡
// sendCardSet.add(bank.getBankCode());
// totalBingCount++;
// }
// if (sendCardSet.size() >= sendBankCardCount) {// 最多绑定5张卡
// return RESULT_CODE_04;
// }
//
// }
//
// if (totalBingCount >= sendPerCardCount * sendBankCardCount) { //
// 累计发送成功的卡最多10次
// return RESULT_CODE_04;
// }
//
// if (currentSendCount < sendPerCardCount) {// 同一张卡充值成功次数最多2次
// return RESULT_CODE_00;
// }
//
// return RESULT_CODE_03;
// }
public String checkUserBankBingRecord(String bankCode, long userId) {
String result = "00";
Long count = bankBingComponent.getSucCardBingCount(bankCode);
if (count > 0) {
result = "05";// 卡已经绑定过;
} else {
Long verifyCardNum = bankBingComponent.countUserVerifyCard(userId);
if (verifyCardNum != null && verifyCardNum >= 5) {
result = "04";// 一个人最多验5张卡;
} else {
count = bankBingComponent.getCardSendCount(bankCode);
if (count >= 2) {
result = "03";// 一张卡从未绑到绑定最多随机充值2次;
}
}
}
return result;
}
/**
* 验证银行充值的金额是否正确
*
* @param
* @return
* @author: zhangyunhmf
* @date: 2015年1月16日上午11:54:15
*/
private String checkBankBingAmount(BankBingDo bankBing, BigDecimal amount) {
int tryCount = StringUtil.strToInt(smsConfig.getTryCountWhenCheck(), 3);
if (bankBing.getCheckNumber() >= tryCount) {
return RESULT_CODE_03;
}
if (OPERATE_TRUE.equals(bankBing.getSendFlag()) && OPERATE_FALSE.equals(bankBing.getCheckFlag())) {// 发送成功,还没有验证成功过的记录
return amount.compareTo(bankBing.getAmount()) == 0 ? RESULT_CODE_00 : RESULT_CODE_07;
}
return RESULT_CODE_07;
}
/*
*
* (no-Javadoc) <p>Title: sendBankIdentifyCode</p> <p>Description: 绑卡的规则: 1.
* 一张卡从未绑到绑定最多随机充值2次 2. 一个人最多绑定5张卡 3. 一次绑定最多只能试3次, 3次不成功, 记录无效 4.
* 绑定成功的记录不可以重复绑定 </p>
* select checkflag from td_bank_bing where cardNo = ?
* if(checkflag= true){
* return 卡已经绑定过;
* }
*
* cardcount = select count(*) from td_bank_bing where user_id = ... and sendflag = true;
* if(cardcount>=5){
* return 2. 一个人最多绑定5张卡;
* }
* else{
* cardNum = select count(*) from td_bank_bing where user_id = ? and cardNo = ? and sendflag = true;
* if(cardNum >=2){
* return 一张卡从未绑到绑定最多随机充值2次;
* }
*
* }
* @param userId
*
* @param bankCode
*
* @param bankType
*
* @return
*
* @see
* com.hehenian.biz.common.bank.IBankBingService#sendBankIdentifyCode(java
* .lang.String, java.lang.String, java.lang.String)
*/
@Override
public Map<String, String> sendBankIdentifyCode(long userId, String userRealName, String bankCode, String bankType,
BigDecimal amount) {
Map<String, String> retMap = new HashMap<String, String>();
logger.info("开始随机充值: userRealName:" + userRealName + "userId:" + userId + " bankcode:" + bankCode + " amount:"
+ amount);
if (null == bankCode || bankCode.trim().length() < 1) {
retMap.put("retCode", RESULT_CODE_01);
return retMap;
}
if (userId == 0) {
retMap.put("retCode", RESULT_CODE_01);
return retMap;
}
// List<BankBingDo> userBankBingList =
// bankBingComponent.getByUserId(userId);
// String result = this.checkUserBankBingRecord(userBankBingList,
// bankCode);
String result = this.checkUserBankBingRecord(bankCode, userId);
/*select checkflag from td_bank_bing where cardNo = ?
* if(checkflag= true){
* return 卡已经绑定过;
* }
*
* cardcount = select count(*) from td_bank_bing where user_id = ... and sendflag = true;
* if(cardcount>=5){
* return 2. 一个人最多绑定5张卡;
* }
* else{
* cardNum = select count(*) from td_bank_bing where user_id = ? and cardNo = ? and sendflag = true;
* if(cardNum >=2){
* return 一张卡从未绑到绑定最多随机充值2次;
* }*/
if (RESULT_CODE_00.equals(result)) {
if (null == allinPay) {
HessianProxyFactory factory = new HessianProxyFactory();
try {
allinPay = (IAllinPayRemoteService) factory.create(IAllinPayRemoteService.class,
smsConfig.getDqlcServiceUrl() + "/allinPay");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/*
* 绑卡的时候调用 向用户银行卡充值,验卡S
*
* @param userId 用户id
*
* @param userName 用户名
*
* @param bankCode 银行卡
*
* @param bankType 银行代码
*
* @param amount
*
* @return Map key="result" boolean true 充值成功 false 充值失败
* key="trade_id" long 交易ID
*
* @author: zhangyunhmf
*
* @date: 2015年1月16日下午4:34:50
*/
Map sendResultMap = allinPay.sendBankCheckAmount(userId, userRealName, bankCode, bankType,
amount.toString());
logger.info(sendResultMap);
boolean sendResult = (Boolean) sendResultMap.get("result");
String tradeId = null;
if (true) {
Object id = sendResultMap.get("actual_account_log_id");
if (null != id)
tradeId = String.valueOf(id);
}
BankBingDo bank = new BankBingDo();
bank.setAmount(amount);
bank.setBankCode(bankCode);
if (null != tradeId) {
bank.setBusinessRecordId(tradeId);
}
bank.setCheckFlag(OPERATE_FALSE); // 未验证
bank.setCheckNumber((short) 0);
bank.setRecordStatus(OPERATE_TRUE); // 有效
bank.setSendFlag(sendResult == true ? OPERATE_TRUE : OPERATE_FALSE); // 发送成功
bank.setSendTime(new Date());
bank.setUserId(userId);
bankBingComponent.addBankBing(bank);
if (sendResult) {
result = RESULT_CODE_00;
} else {
retMap.put("retMsg", (String) sendResultMap.get("errorMessage"));
logger.error("绑卡的时候调用定期理财代付接口失败, 银行卡:" + bankCode + " 错误原因:" + sendResultMap.get("errorMessage"));
Object retCode = sendResultMap.get("retCode");
if (null == retCode) {
result = RESULT_CODE_02;
} else {
result = retCode.toString();
}
}
}
logger.info("结束随机充值: userRealName:" + userRealName + "userId:" + userId + " bankcode:" + bankCode + " amount:"
+ amount + " 充值结果result: " + result);
retMap.put("retCode", result);
return retMap;
}
/*
*
*
* (no-Javadoc) <p>Title: checkBankIdentifyCode</p> <p>Description: 绑卡的规则:
* 1. 一张卡从未绑到绑定最多随机充值2次 2. 一个人最多绑定5张卡 3. 一次绑定最多只能试3次, 3次不成功, 记录无效 4.
* 绑定成功的记录不可以重复绑定 </p>
*
* @param userId
*
* @param bankCode
*
* @param bankType
*
* @param identifyCode
*
* @return
*
* @see
* com.hehenian.biz.common.bank.IBankBingService#checkBankIdentifyCode(java
* .lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public String checkBankIdentifyCode(long userId, String bankCode, String bankType, String amount) {
logger.info("开始验证卡:" + "userId:" + userId + " bankcode:" + bankCode + " amount:" + amount);
if (null == bankCode || bankCode.trim().length() < 1) {
return RESULT_CODE_01;
}
if (userId < 1) {
return RESULT_CODE_01;
}
if (null == amount) {
return RESULT_CODE_01;
}
BigDecimal amountVal;
try {
amountVal = new BigDecimal(amount);
} catch (Throwable e) {
return RESULT_CODE_01;
}// 金额不能转成数字提示无效数据
// 通过用户和卡取最后一次的验证记录
BankBingDo bank = bankBingComponent.getLastBankBingByUserIdBankCode(userId, bankCode);
if (null == bank) {
return RESULT_CODE_08;
}
// 检查验证是否正确
String result = checkBankBingAmount(bank, amountVal);
// 更新验证次数和验证结果
bank.setCheckNumber((short) (bank.getCheckNumber() + 1));
bank.setCheckFlag(RESULT_CODE_00.equals(result) ? OPERATE_TRUE : OPERATE_FALSE);
int tryCount = StringUtil.strToInt(smsConfig.getTryCountWhenCheck(), 3);
if (bank.getCheckNumber() >= tryCount || RESULT_CODE_00.equals(result)) { // 超过三次验证,和已经验证成功过记录不再有效
bank.setRecordStatus(OPERATE_FALSE);
}
bank.setCheckTime(new Date());
bankBingComponent.updateBankBingById(bank);
logger.info("结束验证卡:" + "userId:" + userId + " bankcode:" + bankCode + " amount:" + amount + "验证结果result:"
+ result);
return result;
}
}