use of com.tony.billing.entity.FundInfo in project BillingDubbo by TonyJiangWJ.
the class FundInfoServiceImpl method checkFundsExistence.
@Override
public List<FundExistenceCheck> checkFundsExistence(List<FundExistenceCheck> fundCheckList) {
Preconditions.checkState(CollectionUtils.isNotEmpty(fundCheckList), "待检测列表不能为空");
List<FundInfo> userFundsList = mapper.listUserExistsFunds(UserIdContainer.getUserId(), fundCheckList.stream().map(FundExistenceCheck::getFundCode).distinct().collect(Collectors.toList()));
if (CollectionUtils.isEmpty(userFundsList)) {
return Collections.emptyList();
}
Map<String, List<FundInfo>> resultMap = userFundsList.stream().collect(Collectors.groupingBy(FundInfo::getFundCode));
List<FundExistenceCheck> resultList = new CopyOnWriteArrayList<>();
fundCheckList.parallelStream().forEach(fundCheck -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
List<FundInfo> fundInfos = resultMap.get(fundCheck.getFundCode());
if (CollectionUtils.isNotEmpty(fundInfos)) {
for (FundInfo fundInfo : fundInfos) {
String confirmDate = fundInfo.getConfirmDate().toInstant().atZone(TimeConstants.CHINA_ZONE).format(formatter);
if (confirmDate.equals(fundCheck.getConfirmDate()) && fundInfo.getPurchaseAmount().compareTo(fundCheck.getPurchaseAmount()) == 0) {
resultList.add(fundCheck);
}
}
}
});
return resultList;
}
use of com.tony.billing.entity.FundInfo in project BillingDubbo by TonyJiangWJ.
the class FundInfoServiceImpl method enhanceFund.
@Override
@Transactional(rollbackFor = { BaseBusinessException.class, Exception.class })
public boolean enhanceFund(FundEnhanceRequest request) {
FundInfo condition = new FundInfo();
condition.setInStore(EnumYesOrNo.YES.val());
condition.setFundCode(request.getFundCode());
condition.setUserId(UserIdContainer.getUserId());
List<FundInfo> matchedFunds = mapper.listFundsBefore(condition, request.getDateBefore());
AtomicBoolean operateSuccess = new AtomicBoolean(false);
AtomicBoolean sqlError = new AtomicBoolean(false);
if (CollectionUtils.isNotEmpty(matchedFunds)) {
Optional<BigDecimal> totalAmountOpt = matchedFunds.stream().map(FundInfo::getPurchaseAmount).reduce(BigDecimal::add);
totalAmountOpt.ifPresent(totalAmount -> {
BigDecimal currentAmount = new BigDecimal(request.getCurrentAmount());
if (currentAmount.compareTo(totalAmount) > 0) {
BigDecimal enhanceRate = currentAmount.divide(totalAmount, 4, BigDecimal.ROUND_HALF_UP);
logger.info("增强基金:{} 增强前总量:{} 增强后总量:{} 倍率:{}", request.getFundCode(), totalAmount, currentAmount, enhanceRate);
matchedFunds.parallelStream().forEach(fundInfo -> {
FundInfoHistory fundInfoHistory = new FundInfoHistory();
BeanUtils.copyProperties(fundInfo, fundInfoHistory);
fundInfoHistory.setId(null);
fundInfoHistory.setOriginId(fundInfo.getId());
fundInfoHistory.setChangeType(EnumFundChangeType.ENHANCE.getType());
fundInfoHistory.setCreateTime(new Date());
fundInfoHistory.setModifyTime(new Date());
try {
fundInfoHistoryMapper.insert(fundInfoHistory);
fundInfo.setPurchaseAmount(fundInfo.getPurchaseAmount().multiply(enhanceRate).setScale(2, BigDecimal.ROUND_HALF_UP));
fundInfo.setPurchaseValue(fundInfo.getPurchaseValue().divide(enhanceRate, BigDecimal.ROUND_HALF_UP));
mapper.update(fundInfo);
} catch (Exception e) {
logger.error("保存增强后基金数据异常", e);
sqlError.set(true);
}
});
operateSuccess.set(true);
} else {
logger.error("增强后持有总量必须大于增强前的持有总量");
}
});
if (sqlError.get()) {
throw new BaseBusinessException("保存增强后基金数据,SQL执行失败");
}
}
return operateSuccess.get();
}
Aggregations