ABS系统-保理结合Java8流+反射完成各个协议的还款结算金额的计算

/***获取保理各个协议的入池金额**/
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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章