/** * @fileName LoanCallbackTask.java * @auther liminglmf * @createDate 2015年6月9日 */ package com.hehenian.lend.manager.service.pdf; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; 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.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.hehenian.biz.common.loan.ILoanContractService; 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.ConsultVO; import com.hehenian.biz.common.loan.dataobject.ContactVO; import com.hehenian.biz.common.loan.dataobject.LoanDo; import com.hehenian.biz.common.loan.dataobject.LoanLogDo; import com.hehenian.biz.common.loan.dataobject.LoanRepaymentDo; import com.hehenian.biz.common.task.ConsultCreateTask; import com.hehenian.biz.common.task.ContactCreateTask; import com.hehenian.biz.common.util.CommonReqUtil; import com.hehenian.biz.common.util.DateUtils; import com.hehenian.biz.common.util.constant.ConstantText; /** * 取放款和还款计划的数据 * * @author liminglmf * */ @Component public class LoanContractServiceImpl implements ILoanContractService{ private Logger logger = Logger.getLogger(LoanContractServiceImpl.class); private static SimpleDateFormat toDate = new SimpleDateFormat("yyyy/MM/dd"); private static SimpleDateFormat toDate1 = new SimpleDateFormat("yyyy-MM-dd"); @Autowired private IManagerLoanRepaymentService managerLoanRepaymentService; @Autowired private IManagerLoanService managerLoanService; @Autowired private ILoanLogService loanLogService; @Autowired @Qualifier("taskExecutor") private org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor executor; @Value("#{sysconfig['loan.fk.url']}") private String loanFkUrl; @Value("#{sysconfig['manager.genPdfUrl']}") private String genPdfUrl; @Value("#{sysconfig['manager.genPdfFilePath']}") private String savePath; /** * * @param returnJsVal * @return */ private JSONArray getLoanList(String returnJsVal){ JSONArray loanList = null; if (StringUtils.isNotBlank(returnJsVal)) { JSONObject data = JSONObject.fromObject(returnJsVal); if ("true".equals(data.get("success").toString())) { loanList = (JSONArray) data.get("loanList"); String sign = data.get("sign").toString(); String checkSign = DigestUtils.md5Hex(ConstantText.MDSIGNKEY + loanList + ConstantText.MDSIGNKEY); if (!(checkSign.equals(sign))) { LoanLogDo log = new LoanLogDo(); log.setLogType(3); log.setLogMsg("数据验证失败!"); log.setLogStatus(1); loanLogService.addLoanLog(log); } } } return loanList; } /** * 调用服务获取每天的放款数据: 更新订单状态,生成还款计划,生成电子合约 * @param date "yyyy/MM/dd" 格式的日期参数 */ @Override public void fankuanProcess(String date) { //call http service and return js string String pushDataStr = CommonReqUtil.pushServiceData(loanFkUrl,"loanDate", date); //获取json格式的订单列表 JSONArray loanList = getLoanList(pushDataStr); this.initRepay(loanList); } /** * 生产合同 * * @param realName * @param idNo * @param orderCode * @param loanAmount * @param repayType * @param yearRate * @param loanPeriod * @param loanTime * @param loanUsage * @param loanId * @param createTime * @throws ParseException */ private void genContactPDF(String realName, String idNo, String orderCode, String loanAmount, String repayType, String yearRate, String loanPeriod, String loanTime, String loanUsage, Long loanId, Date createTime) throws ParseException { ContactVO contactVO = new ContactVO(); String url = genPdfUrl; contactVO.setUrl(url); contactVO.setReqTmplate("Concat"); contactVO.setRealName(realName); contactVO.setIdNo(idNo); contactVO.setCmd("customSave"); // contactVO.setUserId(); contactVO.setOrderCode(orderCode); contactVO.setSavePath(savePath); // contactVO.setLendUserName(lendUserName); // contactVO.setLendIdNo(lendIdNo); contactVO.setBorrowerName(realName); contactVO.setBorrowerIdNo(idNo); contactVO.setLoanAmount(loanAmount); contactVO.setRepayType(repayType); contactVO.setYearRate(yearRate + "%"); contactVO.setLoanPeriod(loanPeriod); contactVO.setLoanDay(loanTime); Date repDate = toDate.parse(loanTime); String repayDay = DateUtils.getEveryTime("yyyy/MM/dd", repDate, -1); contactVO.setRepayDay(repayDay); Date limitDate = toDate.parse(repayDay); String limitTime = toDate.format(DateUtils.getMonthAfter(limitDate, Integer.parseInt(loanPeriod))); contactVO.setLimitTime(limitTime); // contactVO.setAccount(account); contactVO.setLoanUsage(loanUsage); contactVO.setFilePrefix("RJK" + orderCode); contactVO.setProcedure("每月"); contactVO.setScale("0.2"); contactVO.setAdvance("2"); contactVO.setLoanId(loanId); contactVO.setCreateDate(toDate.format(createTime)); this.generateContactPdf(contactVO); } /** * 生产服务协议 * * @param realName * @param idNo * @param loanId * @param loanTime * @param mobile * @param orderCode * @param caddress * @param createTime * @param string */ private void genConsultPDF(String realName, String idNo, Long loanId, String loanTime, String mobile, String orderCode, String caddress, Date createTime, String yearRate) { ConsultVO consultVO = new ConsultVO(); String url = genPdfUrl; consultVO.setUrl(url); consultVO.setRealName(realName); consultVO.setIdNo(idNo); consultVO.setCmd("customSave"); consultVO.setLoanId(loanId); // consultVO.setUserId(userId); consultVO.setReqTmplate("Consult"); consultVO.setSavePath(savePath); consultVO.setLoanDay(loanTime); consultVO.setMobile(mobile); // consultVO.setAddress(address); // consultVO.setCompAddr(compAddr); consultVO.setFilePrefix("RFW" + orderCode); consultVO.setPenalty("3"); consultVO.setCredit("0"); // consultVO.setMobile(loanDo.getMobile()); consultVO.setAddress(caddress); consultVO.setCreateDate(toDate.format(createTime)); consultVO.setRate(yearRate); this.generateConsultPdf(consultVO); } private void initRepay(JSONArray loanList){ if(loanList != null && loanList.size()>0){ for(int i=0;i<loanList.size();i++){ logger.info("一共"+loanList.size()+"放款数据返回"); JSONObject loan = (JSONObject)loanList.get(i); try{ String orderCode = loan.getString("businessNo");//订单号 String idNo = loan.getString("idNo");//借款人身份证号码 //String bankNo = loan.getString("bankNo");//银行编码 //String bankName = loan.getString("bankName");//银行名称 //String platform = loan.getString("platform");//放款渠道 String loanAmount = loan.getString("borrowAmount");//放款金额 String realName = loan.getString("realName");//借款人名称 String loanPeriod = loan.getString("loanPeriod");//借款期限 String loanTime = loan.getString("loanDate");//放款日期 String channel = loan.getString("channel");//放款渠道 1汇付 2通联 String investAnnualRate = loan.getString("annualRate");//投资年利率 Map<String,Object> param = new HashMap<String,Object>(); if(StringUtils.isNotBlank(orderCode)){ param.put("orderCode", orderCode); } if(StringUtils.isNotBlank(idNo)){ param.put("idNo", idNo); } if(StringUtils.isNotBlank(realName)){ param.put("realName", realName); } logger.info("放款回调查询条件:"+param); LoanDo loanDo = managerLoanService.getLoanforUpdate(param); logger.info("放款查询订单结果:"+loanDo==null? "没有找到对应订单":loanDo); //找到订单 if(loanDo != null){ if(loanTime != null){ loanDo.setLoanTime(toDate.parse(loanTime)); } loanDo.setInvestAnnualRate(investAnnualRate == null ? 0.00 : Double.parseDouble(investAnnualRate)); loanDo.setLoanAmount(loanAmount == null ? 0.00 : Double.parseDouble(loanAmount)); loanDo.setLoanStatus(loanDo.getLoanStatus().REPAYING); if(StringUtils.isNotBlank(channel)){ loanDo.setSubjectType(Integer.parseInt(channel)); } //更新放款金额和订单状态 managerLoanService.updateLoan(loanDo); //生成合约 genContactPDF(realName,idNo,orderCode,loanAmount,loanDo.getSchemeName(), loanDo.getAnnualRate().toString(), loanPeriod,loanTime,loanDo.getLoanUsage(), loanDo.getLoanId(),loanDo.getCreateTime()); //生产服务协议 genConsultPDF(realName,idNo,loanDo.getLoanId(), loanTime,loanDo.getMobile(), orderCode,loanDo.getCaddress(), loanDo.getCreateTime(),loanDo.getAnnualRate().toString()); //写还款计划 insertRepaymentData(loanDo, loan.getJSONArray("repayment")); } }catch(Exception e){ logger.error("处理放款数据出错:"+loan); logger.error(e); } } } } /** * 写入还款计划 * * @param loanDo * @param object * @throws ParseException */ private void insertRepaymentData(LoanDo loanDo, JSONArray repayJsonObj) throws ParseException { // {"consultFee":"50.00","repayTime":"1","repayAmount":"250.00","capital":"0.00","servFee":"0.00","principalBalance":"20000.00", // "repaymentId":"208786","borrowId":"112","interest":"200.00","settleSum":"20650.0000","creditFee":"0","repayDate":"2015-08-01", // "gatherRate":"0.0"} if (null == repayJsonObj) { logger.error("放款的时候没有拿到还款计划 loanId=" + loanDo.getLoanId()); return; } //先删除之前的还款计划 managerLoanRepaymentService.deleteRepaymentByLoanId(loanDo.getLoanId()); for (int i = 0; i < repayJsonObj.size(); i++) { JSONObject jsonRepay = repayJsonObj.getJSONObject(i); double consultFee = jsonRepay.getDouble("consultFee"); int repayTime = jsonRepay.getInt("repayTime"); double repayAmount = jsonRepay.getDouble("repayAmount"); double capital = jsonRepay.getDouble("capital"); double servFee = jsonRepay.getDouble("servFee"); double principalBalance = jsonRepay.getDouble("principalBalance"); Long repaymentId = jsonRepay.getLong("repaymentId"); Long borrowId = jsonRepay.getLong("borrowId"); double interest = jsonRepay.getDouble("interest"); double settleSum = jsonRepay.getDouble("settleSum"); double creditFee = jsonRepay.getDouble("creditFee"); String repayDate = jsonRepay.getString("repayDate"); double gatherRate = jsonRepay.getDouble("gatherRate"); Date currentDate = new Date(); LoanRepaymentDo newLoanRepaymentDo = new LoanRepaymentDo(); newLoanRepaymentDo.setCreateDate(currentDate); // newLoanRepaymentDo.setInterestBalance(interestBalance); newLoanRepaymentDo.setLastUpdateDate(currentDate); // newLoanRepaymentDo.setLateDay(lateDay); // newLoanRepaymentDo.setLateFi(lateFi); newLoanRepaymentDo.setLoanId(loanDo.getLoanId()); newLoanRepaymentDo.setOrderCode(loanDo.getOrderCode()); newLoanRepaymentDo.setPrincipalBalance(principalBalance); newLoanRepaymentDo.setRepayDate(toDate1.parse(repayDate)); newLoanRepaymentDo.setRepaymentId(repaymentId); newLoanRepaymentDo.setRepayPeriod(repayTime); newLoanRepaymentDo.setRepayStatus(0); // newLoanRepaymentDo.setRepayStyle(repayStyle); newLoanRepaymentDo.setStillInterest(interest); newLoanRepaymentDo.setStillPrincipal(capital); newLoanRepaymentDo.setStillRepayAll(repayAmount); managerLoanRepaymentService.addLoanRepayment(newLoanRepaymentDo); } } public void generateContactPdf(ContactVO contactVO) { Thread t = executor.createThread(new ContactCreateTask(contactVO)); executor.execute(t, 5000); //executor.execute(new ContactCreateTask(contactVO)); } public void generateConsultPdf(ConsultVO consultVO ) { Thread t = executor.createThread(new ConsultCreateTask(consultVO)); executor.execute(t, 5000); //executor.execute(new ConsultCreateTask(consultVO)); } }