コード例 #1
0
  public boolean buy(NotifyModel notify) {
    Logger log = Logger.getLogger(PayNotifyListener.class.getName());
    OrdersModel order = ordersDAO.getById(notify.getObjid());
    if (order == null) {
      log.error("order not exists:" + notify.toString());
      return false;
    }
    UserAccessInfo userAccessInfo = this.genUserAccessInfo(order);
    LogService flumeEventLogger = LogService.getInstance();
    if (order.getStatus() > OrdersModel.STATUS_CLOSED) {
      log.error("order has payed, orderid=" + order.getId() + ", notifylog:" + notify.toString());
      userAccessInfo.setStatus(OrdersErrorEnum.ORDER_STATUS_ERROR.getCode());
      flumeEventLogger.info(userAccessInfo);
      return false;
    }
    CreditModel credit = creditDAO.getByUserid(order.getUserid());
    if (credit == null) {
      log.error("credit not exists:" + notify.toString());
      userAccessInfo.setStatus(OrdersErrorEnum.CREDIT_NOT_EXISTS.getCode());
      flumeEventLogger.info(userAccessInfo);
      return false;
    }

    // 设置订单本次支付金额
    order.setPaytype(notify.getPaytype());
    order.setPaytime((int) (System.currentTimeMillis() / 1000L));
    order.setDirect(notify.getMoney().add(order.getDirect()));
    order.setPayed(notify.getMoney().add(order.getPayed()));
    order.setOutmoney(notify.getMoney().add(order.getOutmoney()));

    BigDecimal toPay = order.getTotalfee().subtract(order.getReduce());
    // 账户余额不足,需再次支付,基本不会走到这个分支
    if (credit.getValue().subtract(toPay).doubleValue() < 0) {
      log.error("credit less, orderid=" + order.getId() + ", notifylog:" + notify.toString());
      ordersDAO.updatePayed(order);
      userAccessInfo.setStatus(OrdersErrorEnum.CREDIT_LESS_ERROR.getCode());
      flumeEventLogger.info(userAccessInfo);
      return false;
    }
    // 账户余额足以支付,减去账户余额,优先级:返利 > 充值卡 > 充值 > 支付
    BigDecimal rebate = new BigDecimal(0);
    BigDecimal giftcard = new BigDecimal(0);
    BigDecimal recharge = new BigDecimal(0);
    BigDecimal direct = new BigDecimal(0);
    if (toPay.doubleValue() > 0.001 && credit.getRebate().doubleValue() > 0.001) {
      if (credit.getRebate().subtract(toPay).doubleValue() > 0.001) {
        rebate = toPay;
      } else {
        rebate = credit.getRebate();
      }
      toPay = toPay.subtract(rebate);
    }
    if (toPay.doubleValue() > 0.001 && credit.getGiftcard().doubleValue() > 0.001) {
      if (credit.getGiftcard().subtract(toPay).doubleValue() > 0.001) {
        giftcard = toPay;
      } else {
        giftcard = credit.getGiftcard();
      }
      toPay = toPay.subtract(giftcard);
    }
    if (toPay.doubleValue() > 0.001 && credit.getRecharge().doubleValue() > 0.001) {
      if (credit.getRecharge().subtract(toPay).doubleValue() > 0.001) {
        recharge = toPay;
      } else {
        recharge = credit.getRecharge();
      }
    }
    if (toPay.doubleValue() > 0.001 && credit.getDirect().doubleValue() > 0.001) {
      if (credit.getDirect().subtract(toPay).doubleValue() > 0.001) {
        direct = toPay;
      } else {
        direct = credit.getDirect();
      }
    }

    BigDecimal balance = null;
    // 减去余额
    try {
      balance =
          creditService.updateUpdate(
              order.getUserid(),
              toPay.negate(),
              rebate.negate(),
              giftcard.negate(),
              recharge.negate(),
              direct.negate());
    } catch (CreditException e) {
      log.error("sql error:", e);
      return false;
    }
    CreditLogModel creditlog = new CreditLogModel();
    creditlog.setUserid(order.getUserid());
    creditlog.setType(CreditLogModel.TYPE_BUY);
    creditlog.setObjid(order.getId());
    creditlog.setValue(toPay.negate());
    creditlog.setBalance(balance);
    creditlog.setRebate(rebate.negate());
    creditlog.setGiftcard(giftcard.negate());
    creditlog.setRecharge(recharge.negate());
    creditlog.setDirect(direct.negate());
    creditlog.setAddtime((int) (System.currentTimeMillis() / 1000L));
    if (creditLogDAO.add(creditlog) != 1) {
      log.error("sql error:" + creditlog.toString());
      return false;
    }

    // 更新订单状态
    if (ordersDAO.setPayed(order) != 1) {
      log.error("sql error:" + creditlog.toString());
      return false;
    }
    flumeEventLogger.info(userAccessInfo);
    return true;
  }