赞
踩
根据客户的要求,要算出代理商自己商户分润和下级贡献给上级的分润,比如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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。