diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java index a438820e..43c75d47 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java @@ -1,13 +1,23 @@ package com.ruoyi.common.utils.collection; -import com.ruoyi.common.utils.DateUtils; - import java.math.BigDecimal; import java.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import com.ruoyi.common.utils.DateUtils; + /** * @author wjh * 2024/4/29 @@ -237,4 +247,44 @@ public class CollectionUtils extends org.springframework.util.CollectionUtils { return result; } + + /** + * 将列表转换为树结构 + * @param list 列表 + * @param idFunc 唯一标识获取方法 + * @param parentIdFunc 父级标识获取方法 + * @return 树结构 + */ + public static List toTree(List list) { + if (isEmpty(list)) { + return new ArrayList<>(); + } + + // 使用 Map 优化查找性能 + Map idMap = new HashMap<>(); + for (T node : list) { + idMap.put(node.getId(), node); + } + + List result = new ArrayList<>(); + for (T node : list) { + Object parentId = node.getParentId(); + T parent = (T) idMap.get(parentId); + + if (parent != null) { + // 找到父节点,将当前节点添加到父节点的子节点列表中 + List children = (List) parent.getChildren(); + if (children == null) { + children = new ArrayList<>(); + parent.setChildren(children); + } + children.add(node); + } else { + // 没有父节点,作为根节点 + result.add(node); + } + } + + return result; + } } diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IDCardUtil.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IDCardUtil.java new file mode 100644 index 00000000..1b21e91d --- /dev/null +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IDCardUtil.java @@ -0,0 +1,210 @@ +package com.ruoyi.common.utils.idcard; + +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.net.URLEncoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description:身份证号的util + * @Author: + * @Date: Created in 11:26 2019-03-27 + * @Modified By: + */ +@Slf4j +public class IDCardUtil { + + /** + * 15位身份证号 + */ + private static final Integer FIFTEEN_ID_CARD=15; + /** + * 18位身份证号 + */ + private static final Integer EIGHTEEN_ID_CARD=18; + private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + + /** + * 根据身份证号获取性别 + * @param IDCard + * @return + */ + public static String getSex(String IDCard){ + String sex =""; + if (StringUtils.isNotBlank(IDCard)){ + //15位身份证号 + if (IDCard.length() == FIFTEEN_ID_CARD){ + if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) { + sex = "女"; + } else { + sex = "男"; + } + //18位身份证号 + }else if(IDCard.length() == EIGHTEEN_ID_CARD){ + // 判断性别 + if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) { + sex = "女"; + } else { + sex = "男"; + } + } + } + return sex; + } + + /** + * 根据身份证号获取年龄 + * @param IDCard + * @return + */ + public static Integer getAge(String IDCard){ + Integer age = 0; + Date date = new Date(); + if (StringUtils.isNotBlank(IDCard)&& isValid(IDCard)){ + //15位身份证号 + if (IDCard.length() == FIFTEEN_ID_CARD){ + // 身份证上的年份(15位身份证为1980年前的) + String uyear = "19" + IDCard.substring(6, 8); + // 身份证上的月份 + String uyue = IDCard.substring(8, 10); + // 当前年份 + String fyear = format.format(date).substring(0, 4); + // 当前月份 + String fyue = format.format(date).substring(5, 7); + if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) { + age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1; + // 当前用户还没过生 + } else { + age = Integer.parseInt(fyear) - Integer.parseInt(uyear); + } + //18位身份证号 + }else if(IDCard.length() == EIGHTEEN_ID_CARD){ + // 身份证上的年份 + String year = IDCard.substring(6).substring(0, 4); + // 身份证上的月份 + String yue = IDCard.substring(10).substring(0, 2); + // 当前年份 + String fyear = format.format(date).substring(0, 4); + // 当前月份 + String fyue = format.format(date).substring(5, 7); + // 当前月份大于用户出身的月份表示已过生日 + if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) { + age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1; + // 当前用户还没过生日 + } else { + age = Integer.parseInt(fyear) - Integer.parseInt(year); + } + } + } + return age; + } + + /** + * 获取出生日期 yyyy年MM月dd日 + * @param IDCard + * @return + */ + public static String getBirthday(String IDCard){ + String birthday=""; + String year=""; + String month=""; + String day=""; + if (StringUtils.isNotBlank(IDCard)){ + //15位身份证号 + if (IDCard.length() == FIFTEEN_ID_CARD){ + // 身份证上的年份(15位身份证为1980年前的) + year = "19" + IDCard.substring(6, 8); + //身份证上的月份 + month = IDCard.substring(8, 10); + //身份证上的日期 + day= IDCard.substring(10, 12); + //18位身份证号 + }else if(IDCard.length() == EIGHTEEN_ID_CARD){ + // 身份证上的年份 + year = IDCard.substring(6).substring(0, 4); + // 身份证上的月份 + month = IDCard.substring(10).substring(0, 2); + //身份证上的日期 + day=IDCard.substring(12).substring(0,2); + } + birthday=year+"年"+month+"月"+day+"日"; + } + return birthday; + } + + /** + * 身份证验证 + * @param id 号码内容 + * @return 是否有效 + */ + public static boolean isValid(String id){ + Boolean validResult = true; + //校验长度只能为15或18 + int len = id.length(); + if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD){ + validResult = false; + } + //校验生日 + if (!validDate(id)){ + validResult = false; + } + return validResult; + } + + /** + * 校验生日 + * @param id + * @return + */ + private static boolean validDate(String id) + { + try + { + String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + Date birthDate = sdf.parse(birth); + if (!birth.equals(sdf.format(birthDate))){ + return false; + } + } + catch (ParseException e) + { + return false; + } + return true; + } + + /** + * ocr身份证识别 + * @param url 身份证地址 + * @return + */ + public static IdCardVo ocr(String url){ + String host = "https://swidcard.market.alicloudapi.com/ocr/idcard"; + String appcode = SpringUtils.getRequiredProperty("idcardOcr.appCode"); + Map headers = new HashMap<>(); + //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 + headers.put("Authorization", "APPCODE " + appcode); + //根据API的要求,定义相对应的Content-Type + headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + Map bodys = new HashMap<>(); + bodys.put("image_url", url); + + String result= HttpUtil.createRequest(Method.POST, host).addHeaders(headers).form(bodys).execute().body(); + log.info("ocr身份识别返回==================="+result); + IdCardVo idResponse = JSONObject.parseObject(result, IdCardVo.class); + log.info("ocr身份识别返回识别对象后==================="+ JSON.toJSONString(idResponse)); + return idResponse; + } + +} diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IdCardVo.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IdCardVo.java new file mode 100644 index 00000000..83018a3d --- /dev/null +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/idcard/IdCardVo.java @@ -0,0 +1,46 @@ +package com.ruoyi.common.utils.idcard; + +import lombok.Data; + +/** + * 身份证对象 + * + */ +@Data +public class IdCardVo { + + /** 是否收费*/ + private String charge; + + private PersonInfo result; + + /**调用成功 0000 */ + private String result_code; + private String result_msg; + private String request_id; + + @Data + public static class PersonInfo { + /** 身份证号*/ + private String number; + /** 地址*/ + private String address; + /** 年*/ + private String year; + /** 月*/ + private String month; + /** 民族*/ + private String nation; + /** 日*/ + private String day; + /** 性别*/ + private String sex; + /** 姓名*/ + private String name; + /** 公安局*/ + private String authority; + /** 有效期*/ + private String timelimit; + + } +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java index 45c2a0bc..21f87ba8 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java @@ -82,7 +82,7 @@ public interface BonusMapper /** * 批量更新分成金额 */ - int batchUpdateAmount(@Param("list") List list); + int batchUpdateAmount(@Param("list") List list); /** * 根据到账方统计 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java index fbf3ef46..db119b55 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java @@ -18,7 +18,7 @@ import com.ruoyi.ss.vipOrder.domain.VipOrderVO; */ public interface BonusConverter { /** - * 生产分成列表 + * 生成设备分成列表 */ List toPoList(SysDept platform, DeviceVO device, List staffList); @@ -28,7 +28,7 @@ public interface BonusConverter { List toPoList(VipOrderVO order, Long channelId); /** - * 转为分成数据 + * 生成店铺分成列表 */ List toPoListByVip(StoreVo store, List staffList, boolean isPlatform); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java index b99668a9..f325f0c3 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java @@ -85,27 +85,12 @@ public interface BonusService int payBonus(BonusVO bonus); /** - * 处理分成,按照比例分出金额 + * 分配分成金额,按照比例分出金额 * * @param bonusList 分成列表 * @param money 总金额 */ - void partBonus(List bonusList, BigDecimal money); - - /** - * 根据到账方统计 - */ - List> selectCountByArrival(BonusQuery query); - - /** - * 根据到账方统计订单金额 - */ - List> selectBillAmountByArrival(BonusQuery query); - - /** - * 查询提供分成 - */ - List selectProvideBonus(BonusProvideQuery query); + int partBonus(List bonusList, BigDecimal money); /** * 当未分成时退款 @@ -117,11 +102,6 @@ public interface BonusService */ int refundWhenDividend(Long id, BigDecimal amount); - /** - * 数据隔离过滤 - */ - List filterBonusScope(List bonusList); - /** * 按月查询分成金额 */ @@ -179,11 +159,6 @@ public interface BonusService */ List selectBonusByBstId(BonusBstType bstType, Long bstId); - /** - * 查询收入金额(已分成 + 待分成) - */ - BigDecimal selectSumOfIncomeAmount(BonusQuery query); - /** * 查询总金额 */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java index 58874031..726f174f 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java @@ -9,8 +9,11 @@ import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.ruoyi.ss.bonus.utils.BonusUtil; import com.ruoyi.ss.channel.domain.Channel; import com.ruoyi.ss.channel.domain.ChannelVO; +import com.ruoyi.system.domain.enums.config.ConfigKey; +import com.ruoyi.system.service.ISysConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -52,16 +55,7 @@ public class BonusConverterImpl implements BonusConverter { private ISysDeptService deptService; @Autowired - private StoreStaffService storeStaffService; - - @Autowired - private BonusService bonusService; - - @Autowired - private UserService userService; - - @Autowired - private UserAssembler userAssembler; + private ISysConfigService sysConfigService; @Autowired private StoreService storeService; @@ -164,11 +158,9 @@ public class BonusConverterImpl implements BonusConverter { bonus.setBillNo(order.getOrderNo()); bonus.setToBalance(isPlatform); bonus.setChannelId(channelId); + bonus.setStatus(BonusStatus.UN_DIVIDEND.getStatus()); } - // 分钱 - bonusService.partBonus(result, order.getAmount()); - return result; } @@ -207,7 +199,7 @@ public class BonusConverterImpl implements BonusConverter { public List toPoList(DeviceVO device, TransactionBillVO bill, ChannelVO channel) { // 只有通过平台渠道支付的才需要分成给余额 if (ChannelType.PLATFORM.getType().equals(channel.getType())) { - // 获取设备分成数据 + // 拼接设备分成数据 deviceAssembler.assembleBonusList(device); // 构造分成列表 return this.buildBonusListByPlatform(device.getBonusList(), bill, channel); @@ -227,9 +219,12 @@ public class BonusConverterImpl implements BonusConverter { bonus.setBillNo(bill.getBillNo()); bonus.setToBalance(true); bonus.setChannelId(channel.getChannelId()); + bonus.setStatus(BonusStatus.UN_DIVIDEND.getStatus()); } - // 计算分成金额 - bonusService.partBonus(bonusList, bill.getMoney()); + + // 平台最低需要的分成金额 + BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE); + BonusUtil.partBonusAmount(bonusList, bill.getMoney(), minService); return bonusList; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java index 185a78d5..6d378adc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java @@ -1,7 +1,6 @@ package com.ruoyi.ss.bonus.service.impl; import java.math.BigDecimal; -import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; @@ -206,46 +205,24 @@ public class BonusServiceImpl implements BonusService } @Override - public void partBonus(List bonusList, BigDecimal money) { + public int partBonus(List bonusList, BigDecimal money) { if (CollectionUtils.isEmptyElement(bonusList) || money == null) { - return; + return 0; } - BigDecimal decimal100 = new BigDecimal(100); - - // 获取平台的分成 - Bonus platform = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null); - // 平台存在分成的情况,需要处理最低分成 - if (platform != null) { - BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE); // 平台最低需要的分成金额 - BigDecimal platformAmount = money.multiply(platform.getPoint()).divide(decimal100, 2, RoundingMode.HALF_UP); // 平台预计分成金额 - // 若总金额 < 最低分成,则平台全收 - if (money.compareTo(minService) < 0) { - BonusUtil.partBonusAllPlatform(platform, money); - } - // 若平台分成 < 最低金额,则收取最低金额,其他金额给其他分成方分成 - else if (platformAmount.compareTo(minService) < 0) { - BonusUtil.partBonusMinService(bonusList, money, platform, minService); - } - // 其余正常收取 - else { - BonusUtil.partBonusNormal(bonusList, money); - } - } - // 其余情况,正常收取费用 - else { - BonusUtil.partBonusNormal(bonusList, money); - } - - // 误差处理,将误差值交给可以处理的分成方处理 - BigDecimal dividedAmount = CollectionUtils.sumDecimal(bonusList, Bonus::getAmount); - BonusUtil.handlePartDiff(bonusList, money.subtract(dividedAmount)); - // 处理误差后的分配金额 - dividedAmount = CollectionUtils.sumDecimal(bonusList, Bonus::getAmount); - ServiceUtil.assertion(dividedAmount.compareTo(money) != 0, "分成金额分配出错"); - // 设置预计分成时间等数据 + this.setWaitBonusInfo(bonusList); + + // 更新数据库 + return this.batchUpdateAmount(bonusList); + } + + /** + * 设置待分成数据 + */ + private void setWaitBonusInfo(List bonusList) { LocalDateTime now = LocalDateTime.now(); + // 获取用户列表 List userList = userService.selectByUserIds(bonusList.stream() .filter(item -> BonusArrivalType.userList().contains(item.getArrivalType())) @@ -254,9 +231,9 @@ public class BonusServiceImpl implements BonusService ); // 拼接用户实际到账延迟 userAssembler.assembleRealArrivalDelay(userList); + for (Bonus bonus : bonusList) { bonus.setStatus(BonusStatus.WAIT_DIVIDE.getStatus()); - bonus.setWaitAmount(bonus.getAmount()); // 设置预计分成时间 if (BonusArrivalType.userList().contains(bonus.getArrivalType())) { SmUserVO user = userList.stream().filter(item -> item.getUserId().equals(bonus.getArrivalId())).findFirst().orElse(null); @@ -270,22 +247,6 @@ public class BonusServiceImpl implements BonusService } } - - @Override - public List> selectCountByArrival(BonusQuery query) { - return bonusMapper.selectCountByArrival(query); - } - - @Override - public List> selectBillAmountByArrival(BonusQuery query) { - return bonusMapper.selectBillAmountByArrival(query); - } - - @Override - public List selectProvideBonus(BonusProvideQuery query) { - return bonusMapper.selectProvideBonus(query); - } - @Override public int refundWhenWaitDivide(Long id, BigDecimal amount) { if (id == null) { @@ -304,33 +265,6 @@ public class BonusServiceImpl implements BonusService return bonusMapper.refundWhenDividend(id, amount); } - @Override - public List filterBonusScope(List bonusList) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - Long userId = loginUser.getUserId(); - Long deptId = loginUser.getDeptId(); - return bonusList.stream().filter(bonus -> { - // 前台用户过滤 - if (LoginType.FRONT.equals(loginUser.getLoginType())) { - return BonusArrivalType.userList().contains(bonus.getArrivalType()) && ( - Arrays.asList(bonus.getAncestors().split(",")).contains(userId.toString()) - || bonus.getArrivalId().equals(userId) - ); - } - // 后台用户过滤 - else if (LoginType.ADMIN.equals(loginUser.getLoginType())) { - if (BonusArrivalType.userList().contains(bonus.getArrivalType())) { - return true; - } - if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) { - return Arrays.asList(bonus.getAncestors().split(",")).contains(deptId.toString()) - || bonus.getArrivalId().equals(deptId); - } - } - return false; - }).collect(Collectors.toList()); - } - @Override public List selectMonthPayedAmount(BonusQuery query) { return bonusMapper.selectMonthPayedAmount(query); @@ -437,18 +371,13 @@ public class BonusServiceImpl implements BonusService return this.selectBonusList(query); } - private int batchUpdateAmount(List list) { + private int batchUpdateAmount(List list) { if (CollectionUtils.isEmptyElement(list)) { return 0; } return bonusMapper.batchUpdateAmount(list); } - @Override - public BigDecimal selectSumOfIncomeAmount(BonusQuery query) { - return bonusMapper.selectSumOfIncomeAmount(query); - } - @Override public BigDecimal selectSumOfAmount(BonusQuery query) { return bonusMapper.selectSumOfAmount(query); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/utils/BonusUtil.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/utils/BonusUtil.java index c577c198..806f9904 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/utils/BonusUtil.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/utils/BonusUtil.java @@ -2,13 +2,17 @@ package com.ruoyi.ss.bonus.utils; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.util.List; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.bonus.domain.BonusVO; import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType; +import com.ruoyi.ss.bonus.domain.enums.BonusStatus; +import com.ruoyi.ss.user.domain.SmUserVO; /** * @author wjh @@ -26,7 +30,7 @@ public class BonusUtil { /** * 最低服务费分成处理 */ - public static void partBonusMinService(List bonusList, BigDecimal money, Bonus platform, BigDecimal minService) { + public static void partBonusMinService(List bonusList, BigDecimal money, Bonus platform, BigDecimal minService) { // 平台设置分成为最低金额 setAmount(platform, minService); BigDecimal decimal100 = new BigDecimal("100"); @@ -47,7 +51,7 @@ public class BonusUtil { /** * 基础处理分成 */ - public static void partBonusNormal(List bonusList, BigDecimal money) { + public static void partBonusNormal(List bonusList, BigDecimal money) { BigDecimal decimal100 = new BigDecimal("100"); // 循环遍历,构造分成金额 for (Bonus bonus : bonusList) { @@ -65,7 +69,7 @@ public class BonusUtil { /** * 处理分成的误差 */ - public static void handlePartDiff(List bonusList, BigDecimal diff) { + public static void handlePartDiff(List bonusList, BigDecimal diff) { // 若误差金额为正数或者0,则交给第一个分成方处理 if (diff.compareTo(BigDecimal.ZERO) >= 0) { Bonus bonus = bonusList.get(0); @@ -83,7 +87,7 @@ public class BonusUtil { // 计算当前分成方可以承担的误差金额(确保不会导致金额为负) BigDecimal maxDeductible = bonus.getAmount(); // 最大可扣除金额 BigDecimal adjustAmount = maxDeductible.min(remainingDiff.abs()); - + // 直接调整金额 setAmount(bonus, bonus.getAmount().subtract(adjustAmount)); remainingDiff = remainingDiff.add(adjustAmount); @@ -163,4 +167,38 @@ public class BonusUtil { throw new ServiceException("退款金额分配出错:无法处理误差金额,剩余误差:" + remainingDiff); } } + + public static void partBonusAmount(List bonusList, BigDecimal money, BigDecimal minService) { + BigDecimal decimal100 = new BigDecimal(100); + + // 获取平台的分成 + Bonus platform = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null); + // 平台存在分成的情况,需要处理最低分成 + if (platform != null) { + BigDecimal platformAmount = money.multiply(platform.getPoint()).divide(decimal100, 2, RoundingMode.HALF_UP); // 平台预计分成金额 + // 若总金额 < 最低分成,则平台全收 + if (money.compareTo(minService) < 0) { + BonusUtil.partBonusAllPlatform(platform, money); + } + // 若平台分成 < 最低金额,则收取最低金额,其他金额给其他分成方分成 + else if (platformAmount.compareTo(minService) < 0) { + BonusUtil.partBonusMinService(bonusList, money, platform, minService); + } + // 其余正常收取 + else { + BonusUtil.partBonusNormal(bonusList, money); + } + } + // 其余情况,正常收取费用 + else { + BonusUtil.partBonusNormal(bonusList, money); + } + + // 误差处理,将误差值交给可以处理的分成方处理 + BigDecimal dividedAmount = CollectionUtils.sumDecimal(bonusList, Bonus::getAmount); + BonusUtil.handlePartDiff(bonusList, money.subtract(dividedAmount)); + // 处理误差后的分配金额 + dividedAmount = CollectionUtils.sumDecimal(bonusList, Bonus::getAmount); + ServiceUtil.assertion(dividedAmount.compareTo(money) != 0, "分成金额分配出错"); + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreType.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreType.java index e51ee860..c20fc2ea 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreType.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreType.java @@ -37,4 +37,7 @@ public class StoreType extends BaseEntity @NotNull(message = "排序不能为空") private Integer sort; + @Excel(name = "上级ID") + @ApiModelProperty("上级ID") + private Long parentId; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreTypeVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreTypeVO.java index bc25028c..72deaaed 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreTypeVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/StoreTypeVO.java @@ -1,8 +1,21 @@ package com.ruoyi.ss.storeType.domain; + +import java.util.List; + +import com.ruoyi.common.utils.collection.TreeVO; + +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data -public class StoreTypeVO extends StoreType { - +public class StoreTypeVO extends StoreType implements TreeVO { + + @ApiModelProperty("子节点") + private List children; + + @Override + public void setChildren(List children) { + this.children = (List) children; + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/vo/StoreTypeNameVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/vo/StoreTypeNameVO.java index 73dd8921..3cbb882c 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/vo/StoreTypeNameVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/domain/vo/StoreTypeNameVO.java @@ -9,6 +9,9 @@ public class StoreTypeNameVO { @ApiModelProperty("ID") private Long id; + @ApiModelProperty("上级ID") + private Long parentId; + @ApiModelProperty("名称") private String name; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/mapper/StoreTypeMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/mapper/StoreTypeMapper.xml index e009010d..5e5c724d 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/mapper/StoreTypeMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeType/mapper/StoreTypeMapper.xml @@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sst.name, sst.icon, sst.sort, + sst.parent_id, sst.create_time from ss_store_type sst @@ -19,6 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sst.id = #{query.id} and sst.name like concat('%', #{query.name}, '%') + and sst.parent_id = #{query.parentId} ${query.params.dataScope} @@ -41,12 +43,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" icon, sort, create_time, + parent_id, #{name}, #{icon}, #{sort}, #{createTime}, + #{parentId}, @@ -63,6 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" icon = #{data.icon}, sort = #{data.sort}, create_time = #{data.createTime}, + parent_id = #{data.parentId}, @@ -79,7 +84,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"