From 57d5d570f797e4713c1105d9bf2c039cf037c13d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Tue, 29 Apr 2025 10:20:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E8=90=A5=E5=8C=BA=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E5=95=86=E5=90=8E=EF=BC=8C=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=90=88=E4=BC=99=E4=BA=BA=E7=9A=84=E5=88=86?= =?UTF-8?q?=E6=88=90=E6=98=AF=E5=90=A6=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/MathUtils.java | 11 +++++ .../com/ruoyi/bst/area/domain/AreaVO.java | 4 ++ .../com/ruoyi/bst/area/mapper/AreaMapper.xml | 1 + .../ruoyi/bst/area/service/AreaValidator.java | 6 +++ .../area/service/impl/AreaServiceImpl.java | 17 ++++++- .../area/service/impl/AreaValidatorImpl.java | 16 +++++++ .../areaJoin/service/AreaJoinDashboard.java | 17 +++++++ .../service/impl/AreaJoinDashboardImpl.java | 45 +++++++++++++++++++ .../service/impl/AreaJoinValidatorImpl.java | 27 +++-------- 9 files changed, 121 insertions(+), 23 deletions(-) diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java index ba5e106..de6fc18 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java @@ -162,4 +162,15 @@ public class MathUtils { } return equals(a.setScale(precision, BigDecimal.ROUND_HALF_UP), b.setScale(precision, BigDecimal.ROUND_HALF_UP)); } + + // 获取最大值 + public static BigDecimal max(BigDecimal a, BigDecimal b) { + if (a == null) { + a = BigDecimal.ZERO; + } + if (b == null) { + b = BigDecimal.ZERO; + } + return a.max(b); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/domain/AreaVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/domain/AreaVO.java index d4fa266..4565397 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/domain/AreaVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/domain/AreaVO.java @@ -1,5 +1,7 @@ package com.ruoyi.bst.area.domain; +import java.math.BigDecimal; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,6 +15,8 @@ public class AreaVO extends Area { private String userName; @ApiModelProperty("用户手机号") private String userPhone; + @ApiModelProperty("运营商分成比例") + private BigDecimal userPoint; @ApiModelProperty("创建人名称") private String createName; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml index a60984c..e6eec47 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml @@ -51,6 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" su.nick_name as user_name, su.agent_id as agent_id, su.user_name as user_phone, + su.point as user_point, suc.nick_name as create_name from diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java index 14223e2..e6d57f4 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java @@ -55,4 +55,10 @@ public interface AreaValidator { * @return */ boolean canAddCustomerService(Long areaId); + + /** + * 校验运营区分成 + * @param id 运营区ID + */ + void checkPoint(Long id); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java index cd319f6..ef7aec0 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java @@ -20,6 +20,7 @@ import com.ruoyi.bst.area.domain.vo.LocationAreaVO; import com.ruoyi.bst.area.mapper.AreaMapper; import com.ruoyi.bst.area.service.AreaDashboard; import com.ruoyi.bst.area.service.AreaService; +import com.ruoyi.bst.area.service.AreaValidator; import com.ruoyi.bst.area.utils.AreaUtil; import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission; import com.ruoyi.bst.areaSub.domain.AreaSubVO; @@ -57,6 +58,9 @@ public class AreaServiceImpl implements AreaService @Autowired private AreaDashboard areaDashboard; + @Autowired + private AreaValidator areaValidator; + /** * 查询运营区 * @@ -150,7 +154,18 @@ public class AreaServiceImpl implements AreaService Geometry geometry = GeoUtils.toGeometry(area.getBoundaryStr()); area.setBoundary(GeoUtils.wkt(geometry)); } - return areaMapper.updateArea(area); + Integer result = transactionTemplate.execute(status -> { + int rows = areaMapper.updateArea(area); + + // 若修改运营商ID,则校验运营商的分成 + if (area.getUserId() != null) { + areaValidator.checkPoint(area.getId()); + } + + return rows; + }); + + return result == null ? 0 : result; } /** diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java index 05f6945..317a616 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.bst.area.service.impl; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -14,7 +15,9 @@ import com.ruoyi.bst.area.mapper.AreaMapper; import com.ruoyi.bst.area.service.AreaService; import com.ruoyi.bst.area.service.AreaValidator; import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission; +import com.ruoyi.bst.areaJoin.service.AreaJoinDashboard; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.collection.CollectionUtils; @Service @@ -26,6 +29,9 @@ public class AreaValidatorImpl implements AreaValidator { @Autowired private AreaService areaService; + @Autowired + private AreaJoinDashboard areaJoinDashboard; + @Override public boolean canEdit(Long areaId) { @@ -88,5 +94,15 @@ public class AreaValidatorImpl implements AreaValidator { } + @Override + public void checkPoint(Long id) { + AreaVO area = areaService.selectAreaById(id, true); + ServiceUtil.assertion(area == null, "ID为%s的运营区不存在", id); + + BigDecimal maxPoint = areaJoinDashboard.selectMaxOfAreaPoint(id); + ServiceUtil.assertion(maxPoint.compareTo(area.getUserPoint()) > 0, + "运营区【%s】无法设置运营商【%s】,当前运营区已分配最大分成为【%s%%】,超出运营商分成比例【%s%%】", + area.getName(), area.getUserName(), maxPoint, area.getUserPoint()); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/AreaJoinDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/AreaJoinDashboard.java index aee87c9..1cc116c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/AreaJoinDashboard.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/AreaJoinDashboard.java @@ -29,6 +29,23 @@ public interface AreaJoinDashboard { * 查询分成总和 */ BigDecimal selectSumOfPoint(@Param("query") AreaJoinQuery query); + + /** + * 查询剩余可分配金额 + * @param excludeId 排除ID + * @param areaId 运营区ID + * @param type 类型 + * @param totalPoint 总分成 + * @return + */ + BigDecimal selectRemainPoint(Long excludeId, Long areaId, String type, BigDecimal totalPoint); + /** + * 查询运营区最大分成比例 + * 合伙人加算,加盟商取最大值 + * @param areaId 运营区ID + * @return + */ + BigDecimal selectMaxOfAreaPoint(Long areaId); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinDashboardImpl.java index 84e4c8d..fd617fb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinDashboardImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinDashboardImpl.java @@ -12,6 +12,7 @@ import com.ruoyi.bst.areaJoin.domain.vo.AreaJoinStatVO; import com.ruoyi.bst.areaJoin.mapper.AreaJoinMapper; import com.ruoyi.bst.areaJoin.service.AreaJoinDashboard; import com.ruoyi.common.utils.MathUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.dashboard.constants.StatKeys; @@ -57,4 +58,48 @@ public class AreaJoinDashboardImpl implements AreaJoinDashboard { public BigDecimal selectSumOfPoint(AreaJoinQuery query) { return areaJoinMapper.selectSumOfPoint(query); } + + @Override + public BigDecimal selectRemainPoint(Long excludeId, Long areaId, String type, BigDecimal totalPoint) { + if (areaId == null || StringUtils.isBlank(type)) { + return BigDecimal.ZERO; + } + if (totalPoint == null) { + totalPoint = BigDecimal.ZERO; + } + // 合伙人,查询当前运营区所有合伙人之和 + if (AreaJoinType.PARTNER.getCode().equals(type)) { + AreaJoinQuery query = new AreaJoinQuery(); + query.setAreaId(areaId); + query.setType(AreaJoinType.PARTNER.getCode()); + query.setExcludeId(excludeId); + return MathUtils.subtractDecimal(totalPoint, areaJoinMapper.selectSumOfPoint(query)); + } + // 加盟商,直接返回运营商的分成比例 + else if (AreaJoinType.JOIN.getCode().equals(type)) { + return totalPoint; + } + return BigDecimal.ZERO; + } + + @Override + public BigDecimal selectMaxOfAreaPoint(Long areaId) { + if (areaId == null) { + return BigDecimal.ZERO; + } + + // 查询合伙人 + AreaJoinQuery query = new AreaJoinQuery(); + query.setAreaId(areaId); + query.setType(AreaJoinType.PARTNER.getCode()); + BigDecimal partnerPoint = areaJoinMapper.selectSumOfPoint(query); + + // 查询加盟商 + query.setType(AreaJoinType.JOIN.getCode()); + BigDecimal joinPoint = areaJoinMapper.selectMaxOfPoint(query); + + // 合伙人加算,加盟商取最大值 + return MathUtils.max(partnerPoint, joinPoint); + } + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinValidatorImpl.java index e66c8bb..fcc0b23 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/areaJoin/service/impl/AreaJoinValidatorImpl.java @@ -10,13 +10,12 @@ import org.springframework.stereotype.Service; import com.ruoyi.bst.areaJoin.domain.AreaJoinQuery; import com.ruoyi.bst.areaJoin.domain.AreaJoinVO; -import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinType; import com.ruoyi.bst.areaJoin.mapper.AreaJoinMapper; +import com.ruoyi.bst.areaJoin.service.AreaJoinDashboard; import com.ruoyi.bst.areaJoin.service.AreaJoinValidator; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MathUtils; import com.ruoyi.common.utils.ServiceUtil; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.collection.CollectionUtils; @Service @@ -25,6 +24,9 @@ public class AreaJoinValidatorImpl implements AreaJoinValidator { @Autowired private AreaJoinMapper areaJoinMapper; + @Autowired + private AreaJoinDashboard areaJoinDashboard; + @Override public boolean canEdit(Long id) { return canView(Collections.singletonList(id)); @@ -53,7 +55,7 @@ public class AreaJoinValidatorImpl implements AreaJoinValidator { ServiceUtil.assertion(vo == null, "ID为%s的加盟数据不存在", id); // 查询剩余可分配比例 - BigDecimal remainPoint = this.selectRemainPoint(vo.getId(), vo.getAreaId(), vo.getType(), vo.getMchPoint()); + BigDecimal remainPoint = areaJoinDashboard.selectRemainPoint(vo.getId(), vo.getAreaId(), vo.getType(), vo.getMchPoint()); // 判断分成比例是否高于剩余可分配比例 if (MathUtils.biggerThan(vo.getPoint(), remainPoint)) { @@ -64,25 +66,6 @@ public class AreaJoinValidatorImpl implements AreaJoinValidator { this.checkRepeat(vo); } - private BigDecimal selectRemainPoint(Long excludeId, Long areaId, String type, BigDecimal mchPoint) { - if (areaId == null || StringUtils.isBlank(type)) { - return BigDecimal.ZERO; - } - // 合伙人,查询当前运营区所有合伙人之和 - if (AreaJoinType.PARTNER.getCode().equals(type)) { - AreaJoinQuery query = new AreaJoinQuery(); - query.setAreaId(areaId); - query.setType(AreaJoinType.PARTNER.getCode()); - query.setExcludeId(excludeId); - return MathUtils.subtractDecimal(mchPoint, areaJoinMapper.selectSumOfPoint(query)); - } - // 加盟商,直接返回运营商的分成比例 - else if (AreaJoinType.JOIN.getCode().equals(type)) { - return mchPoint; - } - return BigDecimal.ZERO; - } - private void checkRepeat(AreaJoinVO vo) { if (vo == null || vo.getUserId() == null || vo.getAreaId() == null) { return;