@Override public CashOutPassDto getCashoutPass(Context respCtx, CashOutPassDto cashoutDto) throws ApplicationException { String cashoutOperatorid = respCtx.getOperatorId(); Operator operator = this.operatorDao.findById(Operator.class, cashoutOperatorid); if (operator == null) { throw new ApplicationException( SystemException.CODE_NO_OPERATOR, "operator(id=" + cashoutOperatorid + ") doesn't exist."); } // cashout amount must greater than 0 if (cashoutDto.getAmount().doubleValue() <= 0) { throw new ApplicationException( SystemException.CODE_CASHOUT_AMOUNT_LESSTHAN_ZERO, "GetCashoutPass,OPERATOR(id=" + operator.getId() + ") can't accept cashout amount less or equal 0"); } if (operator.getCreditType() == Merchant.CREDIT_TYPE_DEFINITIVEVALUE) { // check operator balance BigDecimal totalBalance = new BigDecimal("0"); totalBalance = totalBalance.add(operator.getCommisionBalance()); totalBalance = totalBalance.add(operator.getCashoutBalance()); totalBalance = totalBalance.add(operator.getPayoutCreditLevel()); if (logger.isDebugEnabled()) { logger.debug( "current operator :operator_id:" + operator.getId() + ",totalbalance=" + totalBalance.toPlainString()); } // judge the balance whether or not sufficient if (totalBalance.compareTo(cashoutDto.getAmount()) < 0) { throw new ApplicationException( SystemException.CODE_INSUFFICIENT_BALANCE, "OPERATOR(id=" + operator.getId() + ") insufficient balance[commission balance,cashout balance,payout balance]."); } } else if (operator.getCreditType() == Merchant.CREDIT_TYPE_USE_PARENT) { // lookup the merchant Merchant originmerchant = getMerchantByOperator(cashoutOperatorid, false); Merchant finalMerchant = this.merchantDao.findDistributeMerchantByMerchantId(originmerchant.getId()); if (finalMerchant == null) { throw new ApplicationException( SystemException.CODE_NO_MERCHANT, "operator(id=" + cashoutOperatorid + ") doesn't exist parent merchant."); } // check merchant balance BigDecimal totalBalance = new BigDecimal("0"); totalBalance = totalBalance.add(finalMerchant.getCommisionBalance()); totalBalance = totalBalance.add(finalMerchant.getCashoutBalance()); totalBalance = totalBalance.add(finalMerchant.getPayoutCreditLevel()); if (logger.isDebugEnabled()) { logger.debug( "current merchant :final_merchant_id:" + finalMerchant.getId() + ",totalbalance=" + totalBalance.toPlainString()); } // judge the balance whether or not sufficient if (totalBalance.compareTo(cashoutDto.getAmount()) < 0) { throw new ApplicationException( SystemException.CODE_INSUFFICIENT_BALANCE, "MERCHANT(id=" + finalMerchant.getId() + ") insufficient balance[commission balance,cashout balance,payout balance]."); } } // Get sys_configuration SysConfiguration sysConf = this.getSysConfigurationDao().getSysConfiguration(); // successful record the data to 'CASHOUT_PASS' // MAX_EXPIRE_TIME_CASHOUT_PASS (unit: minute) String teTransactionID = respCtx.getTransaction().getId(); CashoutPass cashoutpass = new CashoutPass(); String generalid = this.getUuidManager().getGeneralID(); cashoutpass.setId(generalid); cashoutpass.setOperatorId(cashoutOperatorid); cashoutpass.setCashoutAmount(cashoutDto.getAmount()); cashoutpass.setCashoutPassword(cashoutDto.getPassword()); cashoutpass.setExpireTime( DateUtils.addMinute(new Date(), sysConf.getMaxExpireTimeCashoutPass())); cashoutpass.setTriedTimes(0); cashoutpass.setTeTransactionId(teTransactionID); cashoutpass.setCashoutBarCode(new Barcoder(0, generalid).getBarcode()); // barcode cashoutpass.setCreateBy(respCtx.getOperatorId()); cashoutpass.setCreateTime(net.mpos.fk.util.DateUtils.getCurrentDate()); this.cashoutPassDao.insert(cashoutpass); // assemble the response bean CashOutPassDto respCashoutDto = new CashOutPassDto(); respCashoutDto.setAmount(cashoutDto.getAmount()); respCashoutDto.setExpireTime( net.mpos.fk.util.DateUtils.convertTimestampToString(cashoutpass.getExpireTime())); respCashoutDto.setBarcode(cashoutpass.getCashoutBarCode()); return respCashoutDto; }