发表于: 2017-10-30 22:11:15
1 654
一.今天完成的主要事情
1.解决了昨天遗留的问题,完成了跑批的五个功能中的第一个功能
该功能比较复杂,涉及到的表和情况也比较多,今天只是完成功能,并没有对代码进行重构,明天花时间对这段代码进行完善重构
由于功能比较复杂,所以先用文字将逻辑过程都描述出来,结果如下
//向用户付息
//第一步,遍历整个List,获取Repayment对象
//第二步,从Repayment对象中获取还款金额,userId,investmentId
//第三步,根据investmentId获取investment对象, 根据userId获取user对象
//第四步,根据investment对象获取付款银行和付款银行卡号,userProductRelationId,
//第五步,调用支付功能,向用户账户打钱
//第六步,支付完毕后返回两种状态,成功或者失败
//成功:1.根据userProductRelationId获取userProductRelation对象,修改该对象中的已分配收益和未分配收益字段
// 2.修改user对象中的累计收益字段和未读消息字段,累计收益字段加上打的钱,未读消息字段加1
// 3.更改该条记录的状态为已经还款
// 4.在交易记录表中新增一条记录,交易类型为回款,交易状态为回款成功
// 5.在消息表中新增一条记录,自动消息,消息类型为回款成功
//失败:1.修改user对象中的未读消息字段,未读消息字段加1
// 2.在交易记录表中新增一条记录,交易类型为回款,交易状态为回款失败
// 3.在消息表中新增一条记录,自动消息,消息类型为回款失败
//向用户付本金
//第一步,遍历整个List,获取Repayment对象
//第二步,从Repayment对象中获取还款金额,userId,investmentId
//第三步,根据userId获取User对象,根据investmentId获取Investment对象
//第四步,根据investment对象获取付款银行和付款银行卡号,userProductRelationId
//第五步,根据userProductRealtionId获取UserProductRelation对象
//第六步,根据userProductRelation对象中的available字段判断是否有续投(是否为-1)
//无续投: 调用支付功能,向用户打钱,支付有两种状态,成功或者失败
// 成功:1.修改userProductRelation对象中的status字段为已退出
// 2.修改user对象中的未读消息字段,未读消息字段加1,user对象中的asset字段减去付款金额
// 3.更改该条记录的状态为已经还款
// 4.在交易记录表中新增一条记录,交易类型为回款,交易状态为回款成功
// 5.在消息表中新增一条记录,自动消息,消息类型为回款成功
// 失败:1.修改user对象中的未读消息字段,未读消息字段加1
// 2.在交易记录表中新增一条记录,交易类型为回款,交易状态为回款失败
// 3.在消息表中新增一条记录,自动消息,消息类型为回款失败
//有续投: 续投无效:
// 调用支付功能,向用户打钱,支付有两种状态,成功或者失败(同无续投)
// 在消息表中新增两条记录,一条是续投失败,一条是回款失败/成功
// 续投有效:
// 1.根据该记录中的againInvestmentId字段,找到续投记录
// 2.将该条记录的状态更改为已退出,将用户对象中的是否有消息字段加1
// 3.计算并修改投资记录中起息日期,投资状态为投资中
// 4.根据续投记录计算回款计划,加入repayment表中
// 5.在投资记录表中新增一条记录
// 6.在交易记录表中新增两条记录,一条为回款成功,一条为付款成功
// 7.在消息表中新增一条记录,消息类型为续投成功
通过这段文字,基本将所有情况都罗列了出来,剩下的就是一条一条的实现
代码如下:主要逻辑功能都再该方法中实现
private void processForData(List<Repayment> repayments) throws ServiceException, ServiceDaoException {
//遍历整个list,获取Repayment对象
for (Repayment repayment : repayments) {
//从Repayment对象中获取还款金额,userId,investmentId
BigDecimal repaymentAmount = repayment.getRepaymentAmount();
Long userId = repayment.getUserId();
Long investmentId = repayment.getInvestmentId();
//根据userId和investmentId获取user对象和investment对象
try {
User user = userService.getObjectById(userId);
Investment investment = investmentService.getObjectById(investmentId);
String cardNumber = investment.getPaymentCard();
String bankName = investment.getPaymentBank();
Long userProductRelationId = investment.getUprId();
Product product = productService.getObjectById(investment.getProductId());
UserProductRelation userProductRelation = userProductRelationService.getObjectById(
userProductRelationId);
log.info("get user, investment, cardNumebr, bankName, userProductRelation, product success!");
String messageTitle;
int tradeStatus;
if (repayment.getType() == Repayment.TYPE_INTEREST) {
log.info("现在是还利息.....");
//向用户付息,模拟调用支付接口
Integer payResult = OtherUtil.payMethod(repaymentAmount, cardNumber, bankName);
log.info("get payResult is : " + payResult);
if (payResult == 1){
//付款成功
//更新userProductRelation对象
userProductRelation.setDistributedIncome(userProductRelation.getDistributedIncome().add(repaymentAmount));
userProductRelation.setUndistributedIncome(userProductRelation.getUndistributedIncome().subtract(repaymentAmount));
userProductRelationService.update(userProductRelation);
log.info("update userProductRelation success!");
//更新用户对象相应字段
user.setAccumulatedIncome(user.getAccumulatedIncome().add(repaymentAmount));
//更新该条还款记录
repayment.setStatus(Repayment.STATUS_ALREADY_REPAYMENT);
repaymentService.update(repayment);
log.info("update repayment success!");
tradeStatus = Trade.STATUS_SUCCESS;
messageTitle = "回款成功";
} else{
//付款失败
tradeStatus = Trade.STATUS_FAILURE;
messageTitle = "回款失败";
}
user.setMessageChecked(user.getMessageChecked() + 1);
//在交易记录表中新增一条记录
Trade trade = OtherUtil.createTrade(userId, investmentId, investment.getProductId(),
repaymentAmount, tradeStatus, Trade.TYPE_REPAY);
Long tradeId = tradeService.insert(trade);
//在消息表中新增一条记录
Message message = OtherUtil.createAutoMessage(userId, userProductRelationId, product,
messageTitle, Message.AUTOMESSAGE_REPAYMENT_FAILURE);
Long messageId = messageService.insert(message);
log.info("update trade, message success!");
} else if (repayment.getType() == Repayment.TYPE_CAPITAL) {
log.info("现在是还本金.......");
//向用户付本金
//无续投或者续投无效
if (userProductRelation.getAvailable()==UserProductRelation.REINVEST_NOT ||
userProductRelation.getAvailable()==UserProductRelation.REINVEST_INVALID){
//向用户付款,模拟调用支付接口
Integer payResult = OtherUtil.payMethod(repaymentAmount, cardNumber, bankName);
if (payResult ==1){
//更新userProductRelation对象
userProductRelation.setStatus(UserProductRelation.STATUS_QUITED);
userProductRelationService.update(userProductRelation);
//更新用户对象
user.setAsset(user.getAsset().subtract(repaymentAmount));
userService.update(user);
//更新该条还款记录
repayment.setStatus(Repayment.STATUS_ALREADY_REPAYMENT);
repaymentService.update(repayment);
tradeStatus = Trade.STATUS_SUCCESS;
messageTitle = "回款成功";
log.info("还本金,支付成功,执行完毕.........");
} else{
tradeStatus = Trade.STATUS_FAILURE;
messageTitle = "回款失败";
}
user.setMessageChecked(user.getMessageChecked() + 1);
//在交易记录表中新增一条记录
Trade trade = OtherUtil.createTrade(userId, investmentId, investment.getProductId(),
repaymentAmount, tradeStatus, Trade.TYPE_REPAY);
Long tradeId = tradeService.insert(trade);
if (userProductRelation.getAvailable()==UserProductRelation.REINVEST_INVALID){
Message extraMessage = OtherUtil.createAutoMessage(userId, userProductRelationId, product,
"续投失败", Message.AUTOMESSAGE_REINVESTMENT_FAILURE);
messageService.insert(extraMessage);
}
//在消息表中新增一条记录
Message message = OtherUtil.createAutoMessage(userId, userProductRelationId, product,
messageTitle, Message.AUTOMESSAGE_REPAYMENT_FAILURE);
Long messageId = messageService.insert(message);
log.info("======================================================");
} else {
//续投有效
//先获取续投记录
Long againInvestmentId = userProductRelation.getAgainInvestmentId();
UserProductRelation upr = userProductRelationService.getObjectById(againInvestmentId);
//更改原投资记录和续投记录
userProductRelation.setStatus(UserProductRelation.STATUS_QUITED);
upr.setStatus(UserProductRelation.STATUS_INVESTING);
upr.setAvailable(UserProductRelation.REINVEST_NOT);
upr.setAgainInvestmentId(-1L);
List<UserProductRelation> userProductRelations = new ArrayList<UserProductRelation>();
userProductRelations.add(userProductRelation);
userProductRelations.add(upr);
userProductRelationService.updateList(userProductRelations);
//计算回款计划,加入repayment表
List<Repayment> repaymentList = OtherUtil.getRepaymentPlanList(upr.getChargingInterestDate(),
upr.getInvestAmount(), product.getAnnualYield(), product.getFinancialPeriod(),
product.getPaymentBackWay());
repaymentService.insertList(repaymentList);
//新增一条投资记录
Investment investment1 = OtherUtil.getInvestmentObject(investment.getSignatureImgUrl(),
userId, product, upr.getId(), cardNumber, bankName);
investmentService.insert(investment1);
//在交易记录表中新增两条记录
Trade tradeRepay = OtherUtil.createTrade(userId, investmentId, investment.getProductId(),
repaymentAmount, Trade.STATUS_SUCCESS, Trade.TYPE_REPAY);
Trade tradePay = OtherUtil.createTrade(userId, investmentId, investment.getProductId(),
repaymentAmount, Trade.STATUS_SUCCESS, Trade.TYPE_PAY);
List<Trade> trades = new ArrayList<Trade>();
tradeService.insertList(trades);
//在消息表中新增一条记录
Message message = OtherUtil.createAutoMessage(userId, userProductRelationId, product,
"续投成功", Message.AUTOMESSAGE_REINVESTMENT_SUCCESS);
Long messageId = messageService.insert(message);
log.info("续投成功++++++++++++++++++++++++++++++++++++++++++++++");
}
} else {
log.info("Field type error!");
}
} catch (Throwable t){
t.printStackTrace();
log.error(t.getMessage());
}
}
}
这段代码可以说非常糟糕,明天会对该段代码进行重构,拆分,尽量优化,并且记录好日志文件
二.明天计划完成的主要事情
1.优化今天的代码
2.完成第二个功能
3.如果有时间,进行第三个功能
三.遇到的问题
暂无
四,收获
学会公司的etl定时任务的配置
五,项目进度情况
已经再一次延期至11月5号,这一次一定不能再延了,要完成和深圳分院的其他学员一起做真实项目了
评论