发表于: 2017-10-23 21:54:31

1 646


一.今天完成的主要事情

1.完成了投资接口和续投接口

因为复盘项目的计划中没有要求支付功能的实现,所以这里的支付就是采用比较简单的写个假方法实现,后续如果有时间,再研究支付宝的接口完善

该接口的逻辑并不是非常复杂,首先是要获取用户的银行卡信息,银行信息等一系列信息,然后调用支付接口,然后根据支付接口返回的状态进行下一步操作,当然,在真实项目中支付接口的使用肯定不是这样子的,应该是用户去请求支付接口,支付接口和项目的业务逻辑是分开的,支付接口调用完毕之后,钱真正到账时会有向接口发送一个回调,接口根据回调继续下一步的操作.

投资接口的代码如下:

/**
* 18. 用户投资产品接口
*
* @param
* @return
* @throws ServiceException
* @throws ServiceDaoException
*/
@RequestMapping(value = "/a/u/product/investment", method = RequestMethod.POST)
public String investProduct(HttpServletRequest request,
HttpServletResponse response, ModelMap model, Long uid,
Long productId, BigDecimal investAmount, Long defaultCardId,
String signatureImgUrl)
throws Exception {

log.info("investProduct() parameters : uid: " + uid + ", productId: " + productId +
", investAmount: " + investAmount + ", defaultCardId: " + defaultCardId +
", signatureImgUrl: " + signatureImgUrl);

//验证参数
   Integer validateResult = InvestUtil.validateInvestProduct(uid, productId, investAmount, defaultCardId, signatureImgUrl);
if (validateResult < 0) {
model.addAttribute("code", validateResult);
return "/common/failure";
}

try {
//根据defaultCardId获取用户付款银行卡号和银行信息
       UserBankRelation userBankRelation = userBankRelationService.getObjectById(defaultCardId);
log.info("get userBankRelation data by Id, userBankRelation is : " + userBankRelation);
if (DataUtils.isNullOrEmpty(userBankRelation)) {
log.info("Couldn't find userBankRelation by id, id is : " + uid);
model.addAttribute("code", -4);
return "/common/failure";
}
String cardNumber = userBankRelation.getCardNumber();
Long bankId = userBankRelation.getBankId();
Bank bank = bankService.getObjectById(bankId);
log.info("get bank data by Id, bank is : " + bank);
if (DataUtils.isNullOrEmpty(bank)) {
log.info("Couldn't find bank by bankId, bankId is : " + bankId);
model.addAttribute("code", -4);
return "/common/failure";
}

//TODO 调用支付接口
       Integer payResult = InvestUtil.payMethod(investAmount, cardNumber, bank.getBankName());

//查询并修改用户信息
       User user = userService.getObjectById(uid);
log.info("get user data by Id, id is : " + uid);
if (DataUtils.isNullOrEmpty(user)) {
log.info("Couldn't find user by userId, userId is : " + uid);
model.addAttribute("code", -4);
return "/common/failure";
}
user.setMessageChecked(user.getMessageChecked() + 1);

//根据产品Id查询产品的相关信息
       Product product = productService.getObjectById(productId);
log.info("get product data By productId, product is: " + product);
if (DataUtils.isNullOrEmpty(product)) {
log.info("Couldn't find product by productId, productId is : " + productId);
model.addAttribute("code", -4);
return "/common/failure";
}

String messageTitle;
Integer tradeStatus;
Integer tradeType;
Long userProductRelationId = -1L;
Long investmentId = -1L;
if (payResult < 0) {
//更新用户,提示有新消息
           userService.update(user);

//设置消息的标题为投资失败
           messageTitle = "投资失败";

//设置交易类型和交易状态为付款和失败
           tradeStatus = 0;
tradeType = 1;
} else {
//支付成功,更新用户账户信息
           user.setAsset(investAmount.add(user.getAsset()));
userService.update(user);

//在用户产品关联表中新增一条记录
           Integer available = -1;
Integer status = 2;
Long againInvestmentId = -1L;
           UserProductRelation userProductRelation = InvestUtil.getUserProductRelationByUserAndProduct(
                   user, product, investAmount, againInvestmentId, available, status, System.currentTimeMillis());

log.info("insert userProductRelation ,userProductRelation is : " + userProductRelation);
userProductRelationId = userProductRelationService.insert(userProductRelation);
log.info("insert userProductRelation success, userProductRealtionId is :" + userProductRelationId);

//在投资记录表中新增一条记录
           Investment investment = InvestUtil.getInvestmentObject(signatureImgUrl, uid, product, userProductRelationId,
                                   cardNumber, bank.getBankName());

log.info("insert investment, investment is : " + investment);
investmentId = investmentService.insert(investment);
log.info("insert investment success, investmentId is : " + investmentId);

//定义消息的标题title为投资成功
           messageTitle = "投资成功";

//定义交易类型和交易状态为付款和成功
           tradeStatus = 1;
tradeType = 1;
}
//在消息表中新增一条记录
       Message message = MessageUtil.createAutoMessage(uid, userProductRelationId, product, messageTitle);
log.info("insert message, message is : " + message);
Long messageId = messageService.insert(message);
log.info("insert message success, messageId is:" + messageId);

//在交易流水表中新增一条记录
       Trade trade = TradeUtil.createTrade(uid, investmentId, productId, investAmount, tradeStatus, tradeType);
log.info("insert trade, trade is : " + trade);
Long tradeId = tradeService.insert(trade);
log.info("insert trade success, tradeId is : " + tradeId);

model.addAttribute("code", 0);
} catch (Throwable t) {
t.printStackTrace();
log.error(t.getMessage());
log.error("invest error,Parameters is :  uid:" + uid + ", productId: "+ productId +
", investAmount: " + investAmount + ", defaultCardId: " + defaultCardId +
", signatureImgUrl: " + signatureImgUrl);
model.addAttribute("code", -1);
}

return "/common/success";
}

其中值得一说的是加粗的几个功能方法,因为用户在投资成功之后需要对好几个表进行新增记录操作,在这种情况下,如果在接口中生成对象,会使接口的代码量急剧上升,所以我就单独写了几个功能类,专门负责生成相应的对象.这些方法接收的参数都是表记录中可能有好几个值的字段,这样,就可以在不同的情况下都使用这些功能类,增强了复用性

以下是生成UserProductrelation对象的功能类

/**
* 生成用户投资的产品对象
*
*
* @param
* @return
*/
public static UserProductRelation getUserProductRelationByUserAndProduct(User user, Product product,
BigDecimal investAmount,
Long againInvestmentId, Integer available,
Integer status, Long startTime) {

UserProductRelation userProductRelation = null;

//设置用户ID
   userProductRelation.setUserId(user.getId());
//设置产品ID
   userProductRelation.setProductId(product.getId());
//设置投资金额
   userProductRelation.setInvestAmount(investAmount);
//设置投资起息日期
   userProductRelation.setChargingInterestDate(startTime + product.getChargingInterestWay()*1000*3600*24);
//设置投资到期日期
   userProductRelation.setDueDate(userProductRelation.getChargingInterestDate() + product.getFinancialPeriod()*1000*3600*24);
//设置预期收益
   userProductRelation.setExpectedIncome(getInterest(investAmount, product.getAnnualYield(),
product.getFinancialPeriod()));
//设置状态
   userProductRelation.setStatus(status);
//设置未分配收益
   userProductRelation.setUndistributedIncome(userProductRelation.getExpectedIncome());
//设置已分配收益
   userProductRelation.setDistributedIncome(new BigDecimal("0"));
//设置续投记录ID
   userProductRelation.setAgainInvestmentId(againInvestmentId);
//设置续投是否有效
   userProductRelation.setAvailable(available);
//设置创建人,更新人
   userProductRelation.setCreateBy(user.getId());
userProductRelation.setUpdateBy(user.getId());
//设置创建时间和更新时间
   userProductRelation.setCreateAt(System.currentTimeMillis());
userProductRelation.setUpdateBy(System.currentTimeMillis());

return userProductRelation;
}


2.完成了查询交易记录列表接口和查询交易记录详情接口

这两个接口比较简单,就不把代码贴出来了

二.明天计划完成的事情

完成用户投资这个stroy,开始用户登陆,注册,找回密码stroy

三.遇到的问题

暂无

四,收获

以上

五,项目进度情况

已经延期,争取不再延期


返回列表 返回列表
评论

    分享到