Exemplo n.º 1
0
 public static InvestSub getInvestSub(Invest invest, LoanCalculator loanCalculator)
     throws IllegalAccessException, InvocationTargetException, NoMatchingObjectsException {
   InvestSub sub = new InvestSub();
   BeanUtils.copyProperties(sub, invest);
   sub.getRepayRoadmap();
   Loan loan = invest.getLoan();
   sub.setLoanId(loan.getId());
   sub.setLoanName(loan.getName());
   sub.setJd(loanCalculator.calculateRaiseCompletedRate(loan.getId()));
   return sub;
 }
  @Override
  @Transactional(rollbackFor = Exception.class)
  public TrusteeshipOperation createOperation(Invest invest, FacesContext fc) throws IOException {
    String transferApplyId = invest.getTransferApply().getId();
    // 购买债权人的id
    String userId = invest.getUser().getId();
    // 购买的债权本金 transferCorpus(投资时填写的投资额)
    double transferCorpus = invest.getInvestMoney();
    double remainCorpus = transferService.calculateRemainCorpus(transferApplyId);
    if (transferCorpus <= 0 || transferCorpus > remainCorpus) {
      throw new YeePayOperationException("购买本金必须小于等于" + remainCorpus + "且大于0");
    }
    TransferApply ta = ht.get(TransferApply.class, transferApplyId);
    // 购买的本金占剩余本金的比例corpusRate
    double corpusRate = ArithUtil.div(transferCorpus, remainCorpus);
    // 购买的本金占所有转让本金的比例corpusRateInAll
    double corpusRateInAll = ArithUtil.div(transferCorpus, ta.getCorpus());
    // 投资人实际出的钱=债权的购买金额=债权转出价格*corpusRateInAll (债权转出价格=本金-折让金)
    double buyPrice = ArithUtil.mul(ta.getPrice(), corpusRateInAll, 2);

    if (buyPrice > userBillBO.getBalance(userId)) {
      throw new YeePayOperationException("余额不足。");
    }

    // 购买时候,扣除手续费,从转让人收到的金额中扣除。费用根据购买价格计算
    double fee = feeConfigBO.getFee(FeePoint.TRANSFER, FeeType.FACTORAGE, null, null, buyPrice);

    Invest investNew = new Invest();
    investNew.setId(IdGenerator.randomUUID());
    investNew.setMoney(transferCorpus);
    investNew.setStatus(InvestConstants.InvestStatus.CANCEL);
    investNew.setRate(ta.getInvest().getRate());
    investNew.setTransferApply(ta);
    investNew.setLoan(ta.getInvest().getLoan());
    investNew.setTime(new Date());
    investNew.setUser(new User(userId));
    investNew.setInvestMoney(transferCorpus);
    // 在这里添加投标状态是手动投标
    investNew.setIsAutoInvest(false);
    ht.save(investNew);
    ht.update(ta);

    DecimalFormat currentNumberFormat = new DecimalFormat("#0.00");
    // 构建投资参数实体
    CPTransaction cp = new CPTransaction();
    cp.setNotifyUrl(
        YeePayConstants.ResponseS2SUrl.PRE_RESPONSE_URL + YeePayConstants.OperationType.TRANSFER);
    cp.setCallbackUrl(
        YeePayConstants.ResponseWebUrl.PRE_RESPONSE_URL + YeePayConstants.OperationType.TRANSFER);
    // cp.setExpired(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(DateUtil.addMinute(new
    // Date(), 10)));
    cp.setRequestNo(YeePayConstants.RequestNoPre.TRANSFER + investNew.getId());
    cp.setPlateformNo(YeePayConstants.Config.MER_CODE);
    cp.setPlatformUserNo(userId);
    cp.setBizType(YeepayCpTransactionConstant.CREDIT_ASSIGNMENT.name());
    cp.setUserType("MEMBER");

    // 资金明细
    FundDetail fd = new FundDetail();
    // 给转让债权的人的钱
    fd.setAmount(currentNumberFormat.format(buyPrice - fee));
    fd.setTargetPlatformUserNo(ta.getInvest().getUser().getId());
    fd.setTargetUserType("MEMBER");
    fd.setBizType(YeepayCpTransactionConstant.CREDIT_ASSIGNMENT.name());
    cp.getFundDetails().add(fd);

    // 平台分润
    if (fee > 0.0) {
      fd = new FundDetail();
      // 投资人给平台的钱=fee
      fd.setAmount(currentNumberFormat.format(fee));
      fd.setTargetPlatformUserNo(YeePayConstants.Config.MER_CODE);
      fd.setTargetUserType("MERCHANT");
      fd.setBizType(YeepayCpTransactionConstant.COMMISSION.name());
      cp.getFundDetails().add(fd);
    }

    // 扩展参数
    Extend extend = new Extend();
    Loan loan = ta.getInvest().getLoan();
    extend.setTenderOrderNo(loan.getId());
    extend.setCreditorPlatformUserNo(ta.getInvest().getUser().getId());
    // 判断购买的债券是否是自动投标
    if (ta.getInvest().getIsAutoInvest()) {
      extend.setOriginalRequestNo(
          YeePayConstants.RequestNoPre.AUTO_INVEST + ta.getInvest().getId());
    } else {
      extend.setOriginalRequestNo(YeePayConstants.RequestNoPre.INVEST + ta.getInvest().getId());
    }
    cp.setExtend(extend);
    log.debug(cp.toString());

    Map<String, String> params = new HashMap<String, String>();
    params.put("req", cp.toString());
    String sign = CFCASignUtil.sign(cp.toString());
    params.put("sign", sign);

    // 保存本地
    TrusteeshipOperation to = new TrusteeshipOperation();
    to.setId(IdGenerator.randomUUID());
    to.setMarkId(investNew.getId());
    to.setOperator(Double.toString(buyPrice) + "&" + Double.toString(corpusRate) + "&" + userId);
    to.setRequestUrl(YeePayConstants.RequestUrl.TRANSFER);
    to.setRequestData(MapUtil.mapToString(params));
    to.setStatus(TrusteeshipConstants.Status.UN_SEND);
    to.setType(YeePayConstants.OperationType.TRANSFER);
    to.setTrusteeship("yeepay");
    trusteeshipOperationBO.save(to);
    try {
      // 发送信息
      sendOperation(to.getId(), "utf-8", fc);
    } catch (IOException e) {
      e.printStackTrace();
    }

    return null;
  }