/***获取保理各个协议的入池金额**/
public BigDecimal getIncomeAmt(String uid, List<AssetsStatisticsDo> statisticsDoList) {
if (null == statisticsDoList || statisticsDoList.size() == 0) { return BigDecimal.ZERO; }
Map<String, SpecPlanExtDto> extMap = specPlanService.getSpecPlanExtMap(uid, new ArrayList<String>() {{
add(SpecPlanEnumClazz.SpecPlanExtCode.INCOME_POOL.getCode());
}});
String inPoolType = extMap.get(SpecPlanEnumClazz.SpecPlanExtCode.INCOME_POOL.getCode()).getKeyVal();
// 默认只有本金入池
BigDecimal rlt = statisticsDoList.stream().map((e) -> e.getPrincp()).reduce(BigDecimal.ZERO, BigDecimal::add);
if (!inPoolType.equals(SpecPlanEnumClazz.InComePoolEnum.OUT.getType())) {
List<SpecPlanExtDto> inPoolAmtTypes = specPlanService.listSpecPlanExt(uid, new ArrayList<String>() {{
add(SpecPlanEnumClazz.SpecPlanExtCode.IN_POOL_AMT_TYPE.getCode());
}});
log.info("资产过滤金额获取,uid:{}获取部分收益入池金额字段:{}", uid, JSONObject.toJSONString(inPoolAmtTypes));
rlt = getAmtFromIncome(inPoolAmtTypes, statisticsDoList);
}
log.info("资产过滤金额获取,uid:{}获取可过滤金额为:{}", uid, rlt.toPlainString());
return rlt;
}
/**
* 获取部分收益入池的金额用于过滤
*
* @param inPoolAmtTypes
* @param statistics
* @return
*/
private BigDecimal getAmtFromIncome(List<SpecPlanExtDto> inPoolAmtTypes, List<AssetsStatisticsDo> statistics) {
return statistics.stream().map((e) -> {
return inPoolAmtTypes.stream().map((type) -> {
Object tmp = getFieldVal(e, type.getKeyCode());
return tmp == null ? BigDecimal.ZERO : (BigDecimal) tmp;
}).reduce(e.getPrincp() == null ? BigDecimal.ZERO : e.getPrincp(), BigDecimal::add);
}).reduce(BigDecimal.ZERO, BigDecimal::add);
}
/**通过反射获取统计表中对应的费用金额**/
private Object getFieldVal(Object o, String fieldName) {
try {
Field field = o.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object rlt = field.get(o);
field.setAccessible(false);
return rlt;
} catch (ReflectiveOperationException e) {
return null;
}
}
ABS系统-保理结合Java8流+反射完成各个协议的还款结算金额的计算
最新推荐文章于 2023-03-04 10:13:50 发布