/** * @Project: hehenian-biz-service * @Package com.hehenian.biz.service.trade.impl * @Title: ReconciliationServiceImpl.java * @Description: TODO * @author: liuzgmf * @date 2014年11月24日 上午10:07:42 * @Copyright: HEHENIAN Co.,Ltd. All rights reserved. * @version V1.0 */ package com.hehenian.biz.service.trade.impl; import com.hehenian.biz.common.account.dataobject.AccountUserDo; import com.hehenian.biz.common.activity.dataobject.ActivityTradeDo; import com.hehenian.biz.common.base.dataobject.NPageDo; import com.hehenian.biz.common.trade.IReconciliationService; import com.hehenian.biz.common.trade.dataobject.*; import com.hehenian.biz.common.trade.dataobject.AuctionDebtDo.AuctionStatus; import com.hehenian.biz.common.trade.dataobject.ReconciliationDo.ReconciliationStatus; import com.hehenian.biz.common.trade.dataobject.ReconciliationDo.ReconciliationType; import com.hehenian.biz.common.util.CalculateUtils; import com.hehenian.biz.component.account.IUserComponent; import com.hehenian.biz.component.activity.IActivityTradeComponent; import com.hehenian.biz.component.trade.*; import com.hehenian.biz.facade.account.AccountType; import com.hehenian.biz.facade.account.IAccountManagerService; import com.hehenian.biz.facade.account.parameter.InParameter; import com.hehenian.biz.facade.account.parameter.OutParameter; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * 交易对账服务 * * @author: liuzgmf * @date 2014年11月24日 上午10:07:42 */ @Service("reconciliationService") public class ReconciliationServiceImpl implements IReconciliationService { private final Logger logger = Logger.getLogger(this.getClass()); @Autowired private IAccountManagerService accountManagerService; @Autowired private IWithdrawComponent withdrawComponent; @Autowired private IUserComponent userComponent; @Autowired private IReconciliationComponent reconciliationComponent; @Autowired private IBorrowComponent borrowComponent; @Autowired private IInvestComponent investComponent; @Autowired private IAssignmentDebtComponent assignmentDebtComponent; @Autowired private IAuctionDebtComponent auctionDebtComponent; @Autowired private IInvestRepaymentComponent investRepaymentComponent; @Autowired private IRechargeComponent rechargeComponent; @Autowired private IActivityTradeComponent activityTradeComponent; @Override public void cashReconciliation() { try { // 新增提现对账记录 addCashReconciliation(); // 提现对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.CASH, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateCashReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 提现对账 * * @author: liuzgmf * @date: 2014年11月24日下午2:48:57 */ private void updateCashReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.CASH, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<WithdrawDo> withdrawDoList = withdrawComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { WithdrawDo targetWithdrawDo = null; for (WithdrawDo withdrawDo : withdrawDoList) { if (withdrawDo.getId().longValue() == reconciliationDo.getOrdId().longValue()) { targetWithdrawDo = withdrawDo; break; } } if (checkedCashReconciliation(reconciliationDo, targetWithdrawDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 对账校验 * * @param reconciliationDo * @param targetWithdrawDo * @return * @author: liuzgmf * @date: 2014年11月24日下午3:30:20 */ private boolean checkedCashReconciliation(ReconciliationDo reconciliationDo, WithdrawDo targetWithdrawDo) { try { if (targetWithdrawDo == null) { reconciliationDo.setReconciliationDesc("提现记录不存在!"); return false; } AccountUserDo userDo = userComponent.getById(targetWithdrawDo.getUserId()); if (userDo == null) { reconciliationDo.setReconciliationDesc("提现用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); // 校验提现用户 if (userDo == null || !reconciliationDo.getUsrCustId().equals(userDo.getUsrCustId().toString())) { errors.append("提现用户不一致[" + reconciliationDo.getUsrCustId() + "|" + userDo.getUsrCustId() + "];"); success = false; } // 校验提现金额 if (!CalculateUtils.eq(reconciliationDo.getTransAmt(), targetWithdrawDo.getSum())) { errors.append("提现金额不一致[" + reconciliationDo.getTransAmt() + "|" + targetWithdrawDo.getSum() + "];"); success = false; } // 校验提现银行卡号 if (!reconciliationDo.getCardId().equals(targetWithdrawDo.getAcount())) { errors.append("提现卡号不一致[" + reconciliationDo.getCardId() + "|" + targetWithdrawDo.getAcount() + "];"); success = false; } // 校验提现状态 if ((reconciliationDo.getTransStat().equals("S") && targetWithdrawDo.getStatus().intValue() != 2) || (!reconciliationDo.getTransStat().equals("S") && targetWithdrawDo.getStatus().intValue() == 2)) { errors.append("提现状态不一致[" + reconciliationDo.getTransStat() + "|" + targetWithdrawDo.getStatus() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 新增提现对账记录 * * @author: liuzgmf * @date: 2014年11月24日下午2:14:02 */ private void addCashReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.CASH); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.cashReconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询提现对账数据失败!"); return; } // 新增提现对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> cashReconciliationDtoList = (List<Map<String, String>>) outParameter .getParams().get("CashReconciliationDtoList"); addReconciliation(cashReconciliationDtoList, ReconciliationType.CASH); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = cashReconciliationDtoList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 新增对账信息 * * @param reconciliationDtoList * @param reconciliationType * @author: liuzgmf * @date: 2014年11月26日上午9:18:38 */ private void addReconciliation(List<Map<String, String>> reconciliationDtoList, ReconciliationType reconciliationType) { List<ReconciliationDo> reconciliationDoList = new ArrayList<ReconciliationDo>(reconciliationDtoList.size()); for (Map<String, String> reconciliationDto : reconciliationDtoList) { ReconciliationDo reconciliationDo = new ReconciliationDo(); reconciliationDo.setReconciliationType(reconciliationType);// 对账类型 reconciliationDo.setReconciliationStatus(ReconciliationStatus.UNRECONCILIATION);// 未对账 reconciliationDo.setOrdId(Long.parseLong(reconciliationDto.get("OrdId"))); reconciliationDo.setMerCustId(reconciliationDto.get("MerCustId")); reconciliationDo.setUsrCustId(reconciliationDto.get("UsrCustId")); reconciliationDo.setCardId(reconciliationDto.get("CardId")); if (StringUtils.isNotBlank(reconciliationDto.get("TransAmt"))) { reconciliationDo.setTransAmt(Double.parseDouble(reconciliationDto.get("TransAmt"))); } reconciliationDo.setTransStat(reconciliationDto.get("TransStat")); try { if (StringUtils.isNotBlank(reconciliationDto.get("PnrDate"))) { reconciliationDo.setPnrDate(DateUtils.parseDate(reconciliationDto.get("PnrDate"), new String[] { "yyyyMMdd" })); } } catch (ParseException e) { logger.error("新增提现对账日期解析错误," + e.getMessage(), e); } reconciliationDo.setPnrSeqId(reconciliationDto.get("PnrSeqId")); try { if (StringUtils.isNotBlank(reconciliationDto.get("OrdDate"))) { reconciliationDo.setOrdDate(DateUtils.parseDate(reconciliationDto.get("OrdDate"), new String[] { "yyyyMMdd" })); } } catch (ParseException e) { logger.error("新增提现对账日期解析错误," + e.getMessage(), e); } reconciliationDo.setInvestCustId(reconciliationDto.get("InvestCustId")); reconciliationDo.setBorrCustId(reconciliationDto.get("BorrCustId")); reconciliationDo.setGateBusiId(reconciliationDto.get("GateBusiId")); reconciliationDo.setOpenBankId(reconciliationDto.get("OpenBankId")); reconciliationDo.setOpenAcctId(reconciliationDto.get("OpenAcctId")); if (StringUtils.isNotBlank(reconciliationDto.get("FeeAmt"))) { reconciliationDo.setFeeAmt(Double.parseDouble(reconciliationDto.get("FeeAmt"))); } reconciliationDo.setFeeCustId(reconciliationDto.get("FeeCustId")); reconciliationDo.setFeeAcctId(reconciliationDto.get("FeeAcctId")); reconciliationDo.setSellCustId(reconciliationDto.get("SellCustId")); if (StringUtils.isNotBlank(reconciliationDto.get("CreditAmt"))) { reconciliationDo.setCreditAmt(Double.parseDouble(reconciliationDto.get("CreditAmt"))); } if (StringUtils.isNotBlank(reconciliationDto.get("CreditDealAmt"))) { reconciliationDo.setCreditDealAmt(Double.parseDouble(reconciliationDto.get("CreditDealAmt"))); } if (StringUtils.isNotBlank(reconciliationDto.get("Fee"))) { reconciliationDo.setFee(Double.parseDouble(reconciliationDto.get("Fee"))); } reconciliationDo.setBuyCustId(reconciliationDto.get("BuyCustId")); reconciliationDoList.add(reconciliationDo); } reconciliationComponent.addReconciliation(reconciliationDoList); } @Override public void loansReconciliation() { try { // 新增放款对账记录 addLoansReconciliation(); // 债权转让对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.LOANS, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateLoansReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 放款对账 * * @author: liuzgmf * @date: 2014年11月25日下午1:57:11 */ private void updateLoansReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.LOANS, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<InvestDo> investDoList = investComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { InvestDo targetInvestDo = null; for (InvestDo investDo : investDoList) { if (investDo.getId().longValue() == reconciliationDo.getOrdId().longValue()) { targetInvestDo = investDo; break; } } if (loansReconciliation(reconciliationDo, targetInvestDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 放款对账 * * @param reconciliationDo * @param investDo * @return * @author: liuzgmf * @date: 2014年11月25日下午2:04:48 */ private boolean loansReconciliation(ReconciliationDo reconciliationDo, InvestDo investDo) { try { if (investDo == null) { reconciliationDo.setReconciliationDesc("投资记录不存在!"); return false; } BorrowDo borrowDo = borrowComponent.getById(investDo.getBorrowId()); if (borrowDo == null) { reconciliationDo.setReconciliationDesc("借款记录不存在!"); return false; } AccountUserDo investUserDo = userComponent.getById(investDo.getInvestor()); if (investUserDo == null) { reconciliationDo.setReconciliationDesc("投资用户不存在!"); return false; } AccountUserDo loanUserDo = userComponent.getById(borrowDo.getPublisher()); if (loanUserDo == null) { reconciliationDo.setReconciliationDesc("借款用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); if (investUserDo == null || !reconciliationDo.getInvestCustId().equals(investUserDo.getUsrCustId() + "")) { errors.append("投资用户不一致[" + reconciliationDo.getInvestCustId() + "|" + investUserDo.getUsrCustId() + "];"); success = false; } if (loanUserDo == null || !reconciliationDo.getBorrCustId().equals(loanUserDo.getUsrCustId() + "")) { errors.append("借款用户不一致[" + reconciliationDo.getBorrCustId() + "|" + loanUserDo.getUsrCustId() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getTransAmt(), investDo.getInvestAmount())) { errors.append("交易金额不一致[" + reconciliationDo.getTransAmt() + "|" + investDo.getInvestAmount() + "];"); success = false; } // 借款状态,如果放款状态为成功(P就为成功),那么借款标的的状态应为满标,还款中,已还完。 // 如果放款状态为失败,则借款的状态不能为满标,还款中,已还完状态中任何一个。 if ((reconciliationDo.getTransStat().equals("P") && borrowDo.getBorrowStatus().intValue() != 3 && borrowDo.getBorrowStatus().intValue() != 4 && borrowDo.getBorrowStatus().intValue() != 5) || (!reconciliationDo.getTransStat().equals("P") && (borrowDo.getBorrowStatus().intValue() == 4 || borrowDo .getBorrowStatus().intValue() == 5))) { errors.append("交易状态不一致[" + reconciliationDo.getTransStat() + "|" + borrowDo.getBorrowStatus() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 新增放款对账记录 * * @author: liuzgmf * @date: 2014年11月25日上午11:24:22 */ private void addLoansReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.LOANS); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("QueryTransType", "LOANS"); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.reconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询放款对账数据失败!"); return; } // 新增放款对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> reconciliationDtoList = (List<Map<String, String>>) outParameter.getParams() .get("ReconciliationDtoList"); addReconciliation(reconciliationDtoList, ReconciliationType.LOANS); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = reconciliationDtoList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } @Override public void repaymentReconciliation() { try { // 查询汇付放款数据,保存至对账表 addRepaymentReconciliation(); // 债权转让对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.REPAYMENT, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateRepaymentReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 还款对账 * * @author: liuzgmf * @date: 2014年11月25日下午1:57:11 */ private void updateRepaymentReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.REPAYMENT, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<InvestRepaymentDo> investRepaymentDoList = investRepaymentComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { InvestRepaymentDo targetInvestRepaymentDo = null; for (InvestRepaymentDo investRepaymentDo : investRepaymentDoList) { if (investRepaymentDo.getId().longValue() == reconciliationDo.getOrdId().longValue()) { targetInvestRepaymentDo = investRepaymentDo; break; } } if (repaymentReconciliation(reconciliationDo, targetInvestRepaymentDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 还款对账 * * @param reconciliationDo * @param investRepaymentDo * @return * @author: liuzgmf * @date: 2014年11月25日下午2:04:48 */ private boolean repaymentReconciliation(ReconciliationDo reconciliationDo, InvestRepaymentDo investRepaymentDo) { try { if (investRepaymentDo == null) { reconciliationDo.setReconciliationDesc("回款记录不存在!"); return false; } AccountUserDo investUserDo = userComponent.getById(investRepaymentDo.getOwner()); if (investUserDo == null) { reconciliationDo.setReconciliationDesc("投资用户不存在!"); return false; } BorrowDo borrowDo = borrowComponent.getById(investRepaymentDo.getBorrowId()); if (borrowDo == null) { reconciliationDo.setReconciliationDesc("借款记录不存在!"); return false; } AccountUserDo loanUserDo = userComponent.getById(borrowDo.getPublisher()); if (loanUserDo == null) { reconciliationDo.setReconciliationDesc("借款用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); if (investUserDo == null || !reconciliationDo.getInvestCustId().equals(investUserDo.getUsrCustId() + "")) { errors.append("投资用户不一致[" + reconciliationDo.getInvestCustId() + "|" + investUserDo.getUsrCustId() + "];"); success = false; } if (loanUserDo == null || !reconciliationDo.getBorrCustId().equals(loanUserDo.getUsrCustId() + "")) { errors.append("借款用户不一致[" + reconciliationDo.getBorrCustId() + "|" + loanUserDo.getUsrCustId() + "];"); success = false; } Double transAmt = CalculateUtils.add(investRepaymentDo.getHasPrincipal(), investRepaymentDo.getHasInterest()); if (!CalculateUtils.eq(reconciliationDo.getTransAmt(), transAmt)) { errors.append("交易金额不一致[" + reconciliationDo.getTransAmt() + "|" + transAmt + "];"); success = false; } // 借款状态,如果还款状态为成功(P就为成功),那么借款标的的状态应为还款中,已还完。 // 如果还款状态为失败,则借款的状态不能为还款中,已还完状态中任何一个。 if ((reconciliationDo.getTransStat().equals("P") && borrowDo.getBorrowStatus().intValue() != 4 && borrowDo .getBorrowStatus().intValue() != 5) || (!reconciliationDo.getTransStat().equals("P") && (borrowDo.getBorrowStatus().intValue() == 4 || borrowDo .getBorrowStatus().intValue() == 5))) { errors.append("交易状态不一致[" + reconciliationDo.getTransStat() + "|" + borrowDo.getBorrowStatus() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 查询汇付放款数据,保存至对账表 * * @author: liuzgmf * @date: 2014年11月25日上午11:24:22 */ private void addRepaymentReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.REPAYMENT); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("QueryTransType", "REPAYMENT"); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.reconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询还款对账数据失败!"); return; } // 新增放款对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> reconciliationDtoList = (List<Map<String, String>>) outParameter.getParams() .get("ReconciliationDtoList"); addReconciliation(reconciliationDtoList, ReconciliationType.REPAYMENT); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = reconciliationDtoList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } @Override public void creditAssignReconciliation() { try { // 查询汇付数据,保存至对账表中 addCreditAssignReconciliation(); // 债权转让对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.DEBT, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateCreditAssignReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } private void updateCreditAssignReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.DEBT, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<AuctionDebtDo> auctionDebtDoList = auctionDebtComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { AuctionDebtDo targetAuctionDebtDo = null; for (AuctionDebtDo auctionDebtDo : auctionDebtDoList) { if (auctionDebtDo.getId().longValue() == reconciliationDo.getOrdId().longValue()) { targetAuctionDebtDo = auctionDebtDo; break; } } if (creditAssignReconciliation(reconciliationDo, targetAuctionDebtDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 债权转让对账 * * @param reconciliationDo * @param targetAuctionDebtDo * @return * @author: liuzgmf * @date: 2014年11月25日上午9:08:52 */ private boolean creditAssignReconciliation(ReconciliationDo reconciliationDo, AuctionDebtDo auctionDebtDo) { try { if (auctionDebtDo == null) { reconciliationDo.setReconciliationDesc("债权认购记录不存在!"); return false; } AssignmentDebtDo assignmentDebtDo = assignmentDebtComponent.getById(auctionDebtDo.getDebtId()); if (assignmentDebtDo == null) { reconciliationDo.setReconciliationDesc("债权转让记录不存在!"); return false; } AccountUserDo alienator = userComponent.getById(assignmentDebtDo.getAlienatorId()); if (alienator == null) { reconciliationDo.setReconciliationDesc("转让用户不存在!"); return false; } AccountUserDo auctioner = userComponent.getById(assignmentDebtDo.getAuctionerId()); if (auctioner == null) { reconciliationDo.setReconciliationDesc("认购用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); if (!reconciliationDo.getSellCustId().equals(alienator.getUsrCustId() + "")) { errors.append("转让用户不一致[" + reconciliationDo.getSellCustId() + "|" + alienator.getUsrCustId() + "];"); success = false; } if (!reconciliationDo.getBuyCustId().equals(auctioner.getUsrCustId() + "")) { errors.append("认购用户不一致[" + reconciliationDo.getBuyCustId() + "|" + auctioner.getUsrCustId() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getCreditAmt(), assignmentDebtDo.getDebtSum())) { errors.append("债权金额不一致[" + reconciliationDo.getCreditAmt() + "|" + assignmentDebtDo.getDebtSum() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getCreditDealAmt(), assignmentDebtDo.getAuctionHighPrice())) { errors.append("认购金额不一致[" + reconciliationDo.getCreditDealAmt() + ":" + assignmentDebtDo.getAuctionHighPrice() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getFee(), assignmentDebtDo.getManageFee())) { errors.append("服务费不一致[" + reconciliationDo.getFee() + "|" + assignmentDebtDo.getManageFee() + "];"); success = false; } if ((reconciliationDo.getTransStat().equals("S") && !auctionDebtDo.getAuctionStatus().equals( AuctionStatus.SUCCESS)) || (!reconciliationDo.getTransStat().equals("S") && auctionDebtDo.getAuctionStatus().equals( AuctionStatus.SUCCESS))) { errors.append("转让状态不一致[" + reconciliationDo.getTransStat() + "|" + auctionDebtDo.getAuctionStatus() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 查询汇付数据,保存至对账表中 * * @author: liuzgmf * @date: 2014年11月25日上午8:45:43 */ private void addCreditAssignReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.DEBT); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.creditAssignReconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询债权转让对账数据失败!"); return; } // 新增提现对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> bidCaReconciliationList = (List<Map<String, String>>) outParameter .getParams().get("BidCaReconciliationList"); addReconciliation(bidCaReconciliationList, ReconciliationType.DEBT); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = bidCaReconciliationList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } @Override public void rechargeReconciliation() { try { // 新增充值记录 addRechargeReconciliation(); // 充值对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.RECHARGE, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateRechargeReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 充值对账 * * @author: liuzgmf * @date: 2014年11月26日上午10:45:21 */ private void updateRechargeReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.RECHARGE, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<RechargeDo> rechargeDoList = rechargeComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { RechargeDo targetRechargeDo = null; for (RechargeDo rechargeDo : rechargeDoList) { if (rechargeDo.getId() == reconciliationDo.getOrdId().longValue()) { targetRechargeDo = rechargeDo; break; } } if (rechargeReconciliation(reconciliationDo, targetRechargeDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 充值对账 * * @param reconciliationDo * @param targetRechargeDo * @return * @author: liuzgmf * @date: 2014年11月26日上午10:49:17 */ private boolean rechargeReconciliation(ReconciliationDo reconciliationDo, RechargeDo rechargeDo) { try { if (rechargeDo == null) { reconciliationDo.setReconciliationDesc("充值记录不存在!"); return false; } AccountUserDo userDo = userComponent.getById(rechargeDo.getUserId()); if (userDo == null) { reconciliationDo.setReconciliationDesc("充值用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); if (!reconciliationDo.getUsrCustId().equals(userDo.getUsrCustId() + "")) { errors.append("充值用户不一致[" + reconciliationDo.getUsrCustId() + "|" + userDo.getUsrCustId() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getTransAmt(), rechargeDo.getRechargeMoney())) { errors.append("充值金额不一致[" + reconciliationDo.getTransAmt() + "|" + rechargeDo.getRechargeMoney() + "];"); success = false; } // if (!CalculateUtils.eq(reconciliationDo.getFeeAmt(), // rechargeDo.getCost())) { // errors.append("充值手续费不一致[" + reconciliationDo.getFeeAmt() + "|" + // rechargeDo.getCost() + "];"); // success = false; // } if ((reconciliationDo.getTransStat().equals("S") && rechargeDo.getResult() != 1) || (!reconciliationDo.getTransStat().equals("S") && rechargeDo.getResult() == 1)) { errors.append("充值状态不一致[" + reconciliationDo.getTransStat() + "|" + rechargeDo.getResult() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 新增充值记录 * * @author: liuzgmf * @date: 2014年11月26日上午10:42:26 */ private void addRechargeReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.RECHARGE); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.saveReconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询充值对账数据失败!"); return; } // 新增提现对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> saveReconciliationDtoList = (List<Map<String, String>>) outParameter .getParams().get("SaveReconciliationDtoList"); addReconciliation(saveReconciliationDtoList, ReconciliationType.RECHARGE); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = saveReconciliationDtoList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } @Override public void trfReconciliation() { try { // 新增商户扣款对账记录 addTrfReconciliation(); // 充值对账 int count = reconciliationComponent.countReconciliations(ReconciliationType.TRANSFER, ReconciliationStatus.UNRECONCILIATION); while (count > 0) { updateTrfReconciliation(); count = count - 50;// 每次执行50条记录 } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 商户扣款对账 * * @author: liuzgmf * @date: 2014年11月26日上午10:45:21 */ private void updateTrfReconciliation() { List<ReconciliationDo> reconciliationDoList = reconciliationComponent.queryReconciliations( ReconciliationType.TRANSFER, ReconciliationStatus.UNRECONCILIATION, 50); if (reconciliationDoList == null || reconciliationDoList.size() == 0) { return; } List<Long> ordIdList = new ArrayList<Long>(reconciliationDoList.size()); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ordIdList.add(reconciliationDo.getOrdId()); } List<ActivityTradeDo> activityTradeDoList = activityTradeComponent.queryByIds(ordIdList); for (ReconciliationDo reconciliationDo : reconciliationDoList) { ActivityTradeDo targetActivityTradeDo = null; for (ActivityTradeDo activityTradeDo : activityTradeDoList) { if (activityTradeDo.getTradeId().longValue() == reconciliationDo.getOrdId().longValue()) { targetActivityTradeDo = activityTradeDo; break; } } if (trfReconciliation(reconciliationDo, targetActivityTradeDo)) { reconciliationDo.setReconciliationStatus(ReconciliationStatus.SUCCESS); } else { reconciliationDo.setReconciliationStatus(ReconciliationStatus.FAILURE); } } reconciliationComponent.updateReconciliationStatus(reconciliationDoList); } /** * 商户扣款对账 * * @param reconciliationDo * @param targetRechargeDo * @return * @author: liuzgmf * @date: 2014年11月26日上午10:49:17 */ private boolean trfReconciliation(ReconciliationDo reconciliationDo, ActivityTradeDo activityTradeDo) { try { if (activityTradeDo == null) { reconciliationDo.setReconciliationDesc("转账记录不存在!"); return false; } AccountUserDo userDo = userComponent.getById(activityTradeDo.getFromUserId()); if (userDo == null) { reconciliationDo.setReconciliationDesc("转账用户不存在!"); return false; } boolean success = true; StringBuffer errors = new StringBuffer(); if (!reconciliationDo.getUsrCustId().equals(userDo.getUsrCustId() + "")) { errors.append("转账用户不一致[" + reconciliationDo.getUsrCustId() + "|" + userDo.getUsrCustId() + "];"); success = false; } if (!CalculateUtils.eq(reconciliationDo.getTransAmt(), activityTradeDo.getRealAmount())) { errors.append("转账金额不一致[" + reconciliationDo.getTransAmt() + "|" + activityTradeDo.getRealAmount() + "];"); success = false; } if ((reconciliationDo.getTransStat().equals("S") && activityTradeDo.getTradeStatus().intValue() != 1) || (!reconciliationDo.getTransStat().equals("S") && activityTradeDo.getTradeStatus().intValue() == 1)) { errors.append("转账状态不一致[" + reconciliationDo.getTransStat() + "|" + activityTradeDo.getTradeStatus() + "];"); success = false; } reconciliationDo.setReconciliationDesc((success ? null : errors.substring(0, errors.length() - 1))); return success; } catch (Exception e) { logger.error(e.getMessage(), e); reconciliationDo.setReconciliationDesc("对账异常!"); return false; } } /** * 新增商户扣款对账记录 * * @author: liuzgmf * @date: 2014年11月26日上午10:42:26 */ private void addTrfReconciliation() { try { InParameter inParameter = new InParameter(); Date beginDate = reconciliationComponent.getReconciliationBeginDate(ReconciliationType.TRANSFER); Date endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("PageSize", 200); while (beginDate.before(new Date())) { OutParameter outParameter = accountManagerService.trfReconciliation(inParameter, AccountType.CHINAPNR); if (!outParameter.isSuccess()) { logger.error("查询充值对账数据失败!"); return; } // 新增提现对账记录 @SuppressWarnings("unchecked") List<Map<String, String>> trfReconciliationDtoList = (List<Map<String, String>>) outParameter .getParams().get("TrfReconciliationDtoList"); addReconciliation(trfReconciliationDtoList, ReconciliationType.TRANSFER); int pageNum = Integer.parseInt((String) outParameter.getParams().get("PageNum")); long totalItems = Long.parseLong((String) outParameter.getParams().get("TotalItems")); int count = trfReconciliationDtoList.size(); if (((pageNum - 1) * 200 + count) < totalItems) {// 继续同步下一页数据 inParameter.getParams().put("PageNum", (pageNum + 1)); continue; } // 下一个同步时间段 beginDate = endDate; endDate = DateUtils.addDays(beginDate, 10); inParameter.getParams().put("PageNum", 1); inParameter.getParams().put("BeginDate", DateFormatUtils.format(beginDate, "yyyyMMdd")); inParameter.getParams().put("EndDate", DateFormatUtils.format(endDate, "yyyyMMdd")); } } catch (Exception e) { logger.error(e.getMessage(), e); } } /** * 查询对账信息 */ @Override public NPageDo<ReconciliationDo> getReconciliations(Map searchItems) { NPageDo<ReconciliationDo> pageDo = new NPageDo<ReconciliationDo>(); try { long count = reconciliationComponent.countRecon(searchItems); pageDo.setTotalCount(count); if (count == 0) { return pageDo; } List<ReconciliationDo> reconciliationDo = reconciliationComponent.getReconciliations(searchItems); pageDo.setModelList(reconciliationDo); // 查询借款用户信息 List<Long> userIdList = new ArrayList<Long>(); for (ReconciliationDo renDo : reconciliationDo) { if (renDo.getUsrCustId() != null) { userIdList.add(Long.valueOf(renDo.getUsrCustId())); } } List<AccountUserDo> userDoList = userComponent.queryUserByCustId(userIdList); for (ReconciliationDo renDo : reconciliationDo) { for (AccountUserDo userDo : userDoList) { if (renDo.getUsrCustId() != null && Long.valueOf(renDo.getUsrCustId()) == userDo.getUsrCustId().longValue()) { renDo.setUserDo(userDo); break; } } } return pageDo; } catch (Exception e) { logger.error(e.getMessage(), e); pageDo.setTotalCount(0l); return pageDo; } } }