当前位置:   article > 正文

java递归解决多级分销算法_java多级收单分佣设计

java多级收单分佣设计

根据客户的要求,要算出代理商自己商户分润和下级贡献给上级的分润,比如A发展->B->C->D;分润比例分别为A0.0015,B0.0012,C0.0010,D0.0010。A 的分润就等于Ax自身分润比例+(A-B分润比例)xB自身分润+(A-B)xC自身分润+(A-B)xD自身分润。

代码实现思路:

1、先查出所有代理商列表。

2、根据用户传入的ID查询他的下级用户(同时用SQL语句查出是否有下级,并做出0,1标识)。

3、递归遍历匹配并计算。

附下代码:


/**
 * 查询代理商分佣和自身商户分佣,并计算汇总
 * @param param 查询参数map
 * @return List
 * @throws Exception 异常
 */
public PageResult pageListUser(PageParam param) throws Exception {
    param.setCountSql("fsms_fee_splitting.pageCountUser");
    param.setRecordSql("fsms_fee_splitting.pageListUser");
    PageResult pr = pageService.pageQuery(param);
    List<User> userList = pr.getPageList();
    param.remove("so_id");
    PageResult prB = pageService.pageQuery(param);//去掉上下级关系的所有代理商列表,用于递归遍历
    List<User> userListB = prB.getPageList();
    if (!CollectionUtils.isEmpty(userList)) {
        countTree(userList, userListB);
    }
    return pr;
}

/**
 * 统计代理商自身分润
 *
 * @param userList 代理商列表,有上下级关系
 * @param userListB 代理商列表,无上下级关系
 * @return 代理商列表
 */
private List<User> countTree(List<User> userList, List<User> userListB) {
    for (User userA : userList) {
        Double fee = 0.0; //总佣金
        Double split = 0.0; //上下级分润比例差
        Map<String, Object> root = new HashMap<String, Object>();
        if (!CollectionUtils.isEmpty(userA.getWb_type()) && !CollectionUtils.isEmpty(userA.getFs_user_id())) {
            fee = MoneyUtil.multiply(userA.getWb_type(), userA.getFs_user_id());//根据结算依据计算A自身商户分润
        }
        if (userA.getSo_child().equals("1")) {//表示有下级
            Double FsCode = 0.0; //下级贡献给上级代理商分润
            Double fsCodeFee = 0.0; //代理结算依据汇总()
            if (!CollectionUtils.isEmpty(userListB)) {
                for (User userB : userListB) {
                    if (userB.getSo_id().equals(userA.getSu_id())) {
                        if (!CollectionUtils.isEmpty(userA.getWb_type()) && !CollectionUtils.isEmpty(userB.getWb_type())) {
                            split = MoneyUtil.subtract(userA.getWb_type(), userB.getWb_type());
                            FsCode = MoneyUtil.add(FsCode, MoneyUtil.multiply(split, MoneyUtil.convertDouble(userB.getFs_user_id())), 4, MoneyUtil.ROUND_HALF_UP);//根据结算依据计算B分润
                            fee = MoneyUtil.add(FsCode, fee, 4, MoneyUtil.ROUND_HALF_UP);
                        }
                        if (userB.getSo_child().equals("1")) {
                            fsCodeFee = MoneyUtil.add(fsCodeFee, MoneyUtil.convertDouble(userB.getFs_user_id()), 4, MoneyUtil.ROUND_HALF_UP);//代理结算依据()+B
                            root = createTree(fsCodeFee, split, fee, FsCode, userListB, userB.getSu_id());//根据结算依据计算C级以下分润
                            fsCodeFee = MoneyUtil.add(fsCodeFee, MoneyUtil.convertDouble(root.get("fsCodeFee")), 4, MoneyUtil.ROUND_HALF_UP);//计算下级贡献给上级代理商分润
                            FsCode =MoneyUtil.convertDouble(root.get("FsCode"));
                            fee = MoneyUtil.convertDouble(root.get("fee"));
                        } else {
                            fsCodeFee = MoneyUtil.add(fsCodeFee, MoneyUtil.convertDouble(userB.getFs_user_id()), 4, MoneyUtil.ROUND_HALF_UP);//代理结算依据()+B
                        }
                    }
                }
            }
            userA.setFs_code(MoneyUtil.roundDouble(String.valueOf(FsCode), 4, MoneyUtil.ROUND_HALF_UP));
            userA.setFs_code_fee(MoneyUtil.roundDouble(String.valueOf(fsCodeFee), 4, MoneyUtil.ROUND_HALF_UP));
        }
        userA.setFs_fee_split(MoneyUtil.roundDouble(String.valueOf(fee), 4, MoneyUtil.ROUND_HALF_UP));
    }
    return userList;
}

/**
 * 用递归遍历代理商,并统计分佣
 *
 * @param split    分佣比例差
 * @param fee      总分佣
 * @param FsCode   分佣差
 * @param userList 代理商列表
 * @param so_id    父级代理ID
 * @return 总佣金
 */
private Map<String, Object> createTree(Double fsCodeFee, Double split, Double fee, Double FsCode, List<User> userList, String so_id) {
    boolean find = false;
    Map<String, Object> root = new HashMap<String, Object>();
    for (User user : userList) {
        if (user.getSo_id().equals(so_id)) {
            find = true;
            if (!CollectionUtils.isEmpty(user.getFs_user_id())) {//判断结算依据,上级分润比例是否为空
                FsCode = MoneyUtil.add(FsCode, MoneyUtil.multiply(split, user.getFs_user_id()), 4, MoneyUtil.ROUND_HALF_UP);//根据结算依据计算代理商C分润,
                fee = MoneyUtil.add(MoneyUtil.multiply(split, user.getFs_user_id()), fee, 4, MoneyUtil.ROUND_HALF_UP);
            }

            if (user.getSo_child().equals("1")) {
                fsCodeFee = MoneyUtil.add(fsCodeFee, MoneyUtil.convertDouble(user.getFs_user_id()), 4, MoneyUtil.ROUND_HALF_UP);代理结算依据()+C
                createTree(fsCodeFee, split, fee, FsCode, userList, user.getSu_id());//递归调用
            }
        } else if (find) {
            break;
        }
    }
    root.put("fee", fee);
    root.put("fsCodeFee", fsCodeFee);
    root.put("FsCode", FsCode);
    return root;
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/403680
推荐阅读
相关标签
  

闽ICP备14008679号