package com.hehenian.lend.manager.time.task;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.hehenian.biz.common.loan.ILoanLogService;
import com.hehenian.biz.common.loan.IManagerLoanRepaymentService;
import com.hehenian.biz.common.loan.IManagerLoanService;
import com.hehenian.biz.common.loan.dataobject.LoanFeeRuleDo;
import com.hehenian.biz.common.loan.dataobject.LoanLogDo;
import com.hehenian.biz.common.loan.dataobject.LoanPersonDo;
import com.hehenian.biz.common.loan.dataobject.LoanRepaymentDo;
import com.hehenian.biz.common.loan.dataobject.LoanRepaymentFeeDo;
import com.hehenian.biz.common.util.CalculateUtils;
import com.hehenian.biz.common.util.DateUtils;
import com.hehenian.biz.common.util.HttpClientUtils;
@Component
public class RepayTask {
private Logger logger = Logger.getLogger(RepayTask.class);
@Autowired
private IManagerLoanService managerLoanService ;
@Autowired
private IManagerLoanRepaymentService managerLoanRepaymentService ;
@Autowired
private ILoanLogService loanLogService;
@Value("#{sysconfig['loan.hk.url']}")
private String loanHkUrl ;
@Scheduled(cron="0 0 22 * * ?")
public void doJob(){
logger.info("repay Task do job..................");
String key = "HHN&XD#$%CD%des$" ;
String pushDataStr = pushData();
if(StringUtils.isNotBlank(pushDataStr)){
try {
JSONObject data = JSONObject.fromObject(pushDataStr);
if("true".equals(data.get("success").toString())){
JSONArray repaymentList = (JSONArray)data.get("repaymentList");
String sign = data.get("sign").toString();
String checkSign = DigestUtils.md5Hex(key+repaymentList.toString()+key);
if(!(checkSign.equals(sign))){
LoanLogDo log = new LoanLogDo();
log.setLogType(3);
log.setLogMsg("数据验证失败!");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
}else{
initRepay(repaymentList);
}
// initRepay(repaymentList);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("unchecked")
private void initRepay(JSONArray repaymentList) throws Exception{
if(repaymentList != null && repaymentList.size()>0){
Map<String,Object> map = new HashMap<String,Object>();
for(int i=0;i<repaymentList.size();i++){
JSONObject repayData = (JSONObject)repaymentList.get(i);
if(checkData(repayData,map)){
Map<String,Object> repaymentParam = (Map<String,Object>)map.get("repaymentParam");
List<LoanRepaymentFeeDo> lrfList = (List<LoanRepaymentFeeDo>)map.get("lrfList");
boolean res = managerLoanRepaymentService.repaymentTask(repaymentParam, lrfList);
LoanLogDo rpLog = new LoanLogDo();
rpLog.setLogType(3);
rpLog.setLoanId(Long.parseLong(repaymentParam.get("loanId").toString()));
rpLog.setOrderCode(repaymentParam.get("orderCode").toString());
if(res){
rpLog.setLogMsg("插入还款记录成功....");
rpLog.setLogStatus(0);
}else{
rpLog.setLogMsg("插入还款记录失败....");
rpLog.setLogStatus(0);
}
loanLogService.addLoanLog(rpLog);
}
}
}
}
private boolean checkData(JSONObject repayData,Map<String,Object> map){
String orderCode = null;
try {
orderCode = repayData.get("businessNo").toString();
} catch (Exception e) {
e.printStackTrace();
}
if(StringUtils.isNotBlank(orderCode)){
List<LoanRepaymentFeeDo> lrfList = new ArrayList<LoanRepaymentFeeDo>();
LoanLogDo log = new LoanLogDo();
log.setLogType(3);
log.setOrderCode(orderCode);
try {
LoanPersonDo loanPersonDo = managerLoanService.getLoanInfoForFkByOrderCode(orderCode);
if(loanPersonDo == null){
log.setLogMsg("添加还款信息失败,订单信息不存在!");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
return false;
}
String realName = repayData.getString("realName");
if(!(realName.equals(loanPersonDo.getRealName()))){
log.setLogMsg("添加还款信息失败,订单用户姓名不一致!db["+loanPersonDo.getRealName()+"],pushData["+realName+"]");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
return false ;
}
String idNo = repayData.getString("idNo");
if(!(idNo.equals(loanPersonDo.getIdNo()))){
log.setLogMsg("添加还款信息失败,订单用户身份证号码不一致!db["+loanPersonDo.getIdNo()+"],pushData["+idNo+"]");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
return false ;
}
Map<String,Object> repaymentParam = new HashMap<String,Object>();
repaymentParam.put("loanId", loanPersonDo.getLoanDo().getLoanId());
repaymentParam.put("orderCode", orderCode);
int loanPeriod = Integer.parseInt(repayData.getString("loanPeriod"));
repaymentParam.put("repayPeriod", loanPeriod);
Map<String,Object> lrdParams = new HashMap<String,Object>();
lrdParams.put("orderCode", orderCode);
lrdParams.put("repayPeriod", loanPeriod);
LoanRepaymentDo lrd = managerLoanRepaymentService.selectRepaymentByOrderCodeAndPeriod(lrdParams);
if(lrd.getRepayStatus().intValue() == 1){
log.setLogMsg("订单已还款!!");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
return false;
}
Date repayDate = DateUtils.parseDateOrNull(repayData.getString("repayDate"), DateUtils.Format_Date_back_slant);
repaymentParam.put("realRepayDate", repayDate);
double principalAmt = Double.parseDouble(repayData.getString("principalAmt")); //本金
repaymentParam.put("realPrincipal", principalAmt);
double iterestAmt = Double.parseDouble(repayData.getString("iterestAmt")); //利息
double consultFeeAmt = Double.parseDouble(repayData.getString("consultFeeAmt")); //管理费
LoanRepaymentFeeDo consultFeeAmtLrfDo = new LoanRepaymentFeeDo();
consultFeeAmtLrfDo.setLoanId(loanPersonDo.getLoanId());
consultFeeAmtLrfDo.setOrderCode(orderCode);
consultFeeAmtLrfDo.setRepayType(1);
consultFeeAmtLrfDo.setFeeType("");
consultFeeAmtLrfDo.setFeeName("管理费");
consultFeeAmtLrfDo.setFeeAmount(consultFeeAmt);
lrfList.add(consultFeeAmtLrfDo);
// double repayAmt = Double.parseDouble(repayData.getString("repayAmt")); //应还款总额
// double preSettleAmt = Double.parseDouble(repayData.getString("preSettleAmt")); //提前还款额度
// double remainPrincipalAmt = Double.parseDouble(repayData.getString("remainPrincipalAmt")); //剩余本金
double lateFeeAmt = Double.parseDouble(repayData.getString("lateFeeAmt"));//滞纳金
repaymentParam.put("realFI", lateFeeAmt);
int lateDay = Integer.parseInt(repayData.getString("lateDay"));//逾期天数
repaymentParam.put("lateDay", lateDay);
int repayStatus = Integer.parseInt(repayData.getString("repayStatus"));//本期是否还完 还款状态(0 默认未偿还 1 已偿还,2-部分还款)
repaymentParam.put("repayStatus", repayStatus);
double repayFee = Double.parseDouble(repayData.getString("repayFee"));//手续费
if(CalculateUtils.gt(repayFee,0d)){
LoanRepaymentFeeDo repayFeeLrfDo = new LoanRepaymentFeeDo();
repayFeeLrfDo.setLoanId(loanPersonDo.getLoanId());
repayFeeLrfDo.setOrderCode(orderCode);
repayFeeLrfDo.setRepayType(1);
repayFeeLrfDo.setFeeType(LoanFeeRuleDo.feeType.REPAY_FEE.toString());
repayFeeLrfDo.setFeeName("手续费");
repayFeeLrfDo.setFeeAmount(repayFee);
lrfList.add(repayFeeLrfDo);
}
double servFeeAmt = Double.parseDouble(repayData.getString("servFeeAmt"));//服务费
if(CalculateUtils.gt(servFeeAmt,0d)){
LoanRepaymentFeeDo servFeeAmtLrfDo = new LoanRepaymentFeeDo();
servFeeAmtLrfDo.setLoanId(loanPersonDo.getLoanId());
servFeeAmtLrfDo.setOrderCode(orderCode);
servFeeAmtLrfDo.setRepayType(1);
servFeeAmtLrfDo.setFeeType(LoanFeeRuleDo.feeType.SERV_FEE.toString());
servFeeAmtLrfDo.setFeeName("服务费");
servFeeAmtLrfDo.setFeeAmount(servFeeAmt);
lrfList.add(servFeeAmtLrfDo);
}
double creditFeeAmt = Double.parseDouble(repayData.getString("creditFeeAmt"));//征信费
if(CalculateUtils.gt(creditFeeAmt,0d)){
LoanRepaymentFeeDo creditFeeAmtLrfDo = new LoanRepaymentFeeDo();
creditFeeAmtLrfDo.setLoanId(loanPersonDo.getLoanId());
creditFeeAmtLrfDo.setOrderCode(orderCode);
creditFeeAmtLrfDo.setRepayType(1);
creditFeeAmtLrfDo.setFeeType(LoanFeeRuleDo.feeType.CREDIT_FEE.toString());
creditFeeAmtLrfDo.setFeeName("征信费");
creditFeeAmtLrfDo.setFeeAmount(creditFeeAmt);
lrfList.add(creditFeeAmtLrfDo);
}
double parkingFeeAmt = Double.parseDouble(repayData.getString("parkingFeeAmt"));//停车费
if(CalculateUtils.gt(parkingFeeAmt,0d)){
LoanRepaymentFeeDo parkingFeeAmtLrfDo = new LoanRepaymentFeeDo();
parkingFeeAmtLrfDo.setLoanId(loanPersonDo.getLoanId());
parkingFeeAmtLrfDo.setOrderCode(orderCode);
parkingFeeAmtLrfDo.setRepayType(1);
parkingFeeAmtLrfDo.setFeeType(LoanFeeRuleDo.feeType.PARKING_FEE.toString());
parkingFeeAmtLrfDo.setFeeName("停车费");
parkingFeeAmtLrfDo.setFeeAmount(parkingFeeAmt);
lrfList.add(parkingFeeAmtLrfDo);
}
double regFeeAmt = Double.parseDouble(repayData.getString("regFeeAmt"));//登记费
if(CalculateUtils.gt(regFeeAmt,0d)){
LoanRepaymentFeeDo regFeeAmtLrfDo = new LoanRepaymentFeeDo();
regFeeAmtLrfDo.setLoanId(loanPersonDo.getLoanId());
regFeeAmtLrfDo.setOrderCode(orderCode);
regFeeAmtLrfDo.setRepayType(1);
regFeeAmtLrfDo.setFeeType(LoanFeeRuleDo.feeType.REG_FEE.toString());
regFeeAmtLrfDo.setFeeName("登记费");
regFeeAmtLrfDo.setFeeAmount(regFeeAmt);
lrfList.add(regFeeAmtLrfDo);
}
double preSettleFeeAmt = Double.parseDouble(repayData.getString("preSettleFeeAmt"));//提前结清手续费
if(CalculateUtils.gt(preSettleFeeAmt,0d)){
LoanRepaymentFeeDo preSettleFeeAmtDo = new LoanRepaymentFeeDo();
preSettleFeeAmtDo.setLoanId(loanPersonDo.getLoanId());
preSettleFeeAmtDo.setOrderCode(orderCode);
preSettleFeeAmtDo.setRepayType(1);
preSettleFeeAmtDo.setFeeType(LoanFeeRuleDo.feeType.SETTLE_FEE.toString());
preSettleFeeAmtDo.setFeeName("提前结清手续费");
preSettleFeeAmtDo.setFeeAmount(preSettleFeeAmt);
lrfList.add(preSettleFeeAmtDo);
}
double realRepayAmt = Double.parseDouble(repayData.getString("realRepayAmt"));//实际还款总额
repaymentParam.put("realRepayAll", realRepayAmt);
repaymentParam.put("realInterest", CalculateUtils.add(iterestAmt,CalculateUtils.add(consultFeeAmt
, CalculateUtils.add(repayFee, CalculateUtils.add(servFeeAmt
, CalculateUtils.add(creditFeeAmt, CalculateUtils.add(parkingFeeAmt,regFeeAmt)))))));
map.put("repaymentParam", repaymentParam);
map.put("lrfList", lrfList);
return true ;
} catch (Exception e) {
logger.error(e.getMessage(), e);
log.setLogMsg("添加还款信息失败,订单参数异常! pushData["+repayData.toString()+"]");
log.setLogStatus(1);
loanLogService.addLoanLog(log);
}
}
return false ;
}
/**
* 发送还款请求, 参数当前日期
* @return
*/
private String pushData(){
/*
JSONObject data = new JSONObject();
data.put("success",true);
data.put("sign", "");
JSONArray repayArr = new JSONArray();
JSONObject repayData = new JSONObject();
repayData.put("realName", "何鲁丽"); //姓名
repayData.put("idNo", "430621198809171818"); //身份证号码
repayData.put("businessNo", "D031505060001"); //业务编号
repayData.put("loanPeriod", "5"); //还款期数
repayData.put("repayDate", "2015/05/08"); //还款日期
repayData.put("principalAmt", "1666.67"); //本金
repayData.put("iterestAmt", "213.89"); //利息
repayData.put("consultFeeAmt", "476.11"); //管理费
repayData.put("repayAmt", "2356.67"); //应还款总额
repayData.put("preSettleAmt", "0"); //提前还款额度
repayData.put("remainPrincipalAmt", "23333.32"); //剩余本金
repayData.put("lateFeeAmt", "0.00"); //滞纳金
repayData.put("lateDay", "0"); //逾期天数
repayData.put("repayStatus", "1"); //本期是否还完
repayData.put("repayFee", "0.00"); //手续费
repayData.put("servFeeAmt", "0"); //服务费
repayData.put("creditFeeAmt", "0"); //征信费
repayData.put("parkingFeeAmt", "0");//停车费
repayData.put("regFeeAmt", "0"); //登记费
repayData.put("preSettleFeeAmt", "0"); //提前结清手续费
repayData.put("realRepayAmt", "2356.67"); //实际还款总额
repayArr.add(repayData);
data.put("repaymentList", repayArr);
String pushDataStr = null;
try {
pushDataStr = data.toString();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return pushDataStr ;
*/
String repayDate = DateUtils.getCurrentDateAsStringByBackSlant();
// repayDate="2015/05/12";
String key = "HHN&XD#$%CD%des$" ;
String sign = DigestUtils.md5Hex(key+repayDate+key);
StringBuffer url = new StringBuffer(loanHkUrl+"?repayDate=");
url.append(repayDate);
url.append("&sign=").append(sign);
logger.info("=============还款借款URL=======================");
logger.info(url.toString());
logger.info("=============还款借款URL=======================");
String res = null;
try {
res = HttpClientUtils.get(url.toString());
} catch (Exception e) {
logger.error(e);
}
return res;
}
public static void main(String args[]){
String repayDate = DateUtils.getCurrentDateAsStringByBackSlant();
String key = "HHN&XD#$%CD%des$" ;
String sign = DigestUtils.md5Hex(key+repayDate+key);
StringBuffer url = new StringBuffer("http://192.168.16.193//repayment.do?repayDate=");
url.append("2015/05/05");
url.append("&sign=").append(sign);
System.out.println("====================================");
System.out.println(url.toString());
System.out.println("====================================");
String res = null;
try {
res = HttpClientUtils.get(url.toString());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(res);
}
}