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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章