From bf083f698e949778b094d69c9e5b2ea2d8b79872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 27 Oct 2025 16:00:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E9=94=80=E5=88=86=E9=92=B1=E5=85=B7?= =?UTF-8?q?=E4=BD=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/DistributionController.java | 2 +- .../czg/market/dto/MkDistributionFlowDTO.java | 103 ++++++++++++++++ .../czg/market/entity/MkDistributionFlow.java | 114 ++++++++++++++++++ .../service/MkDistributionConfigService.java | 2 +- .../service/MkDistributionFlowService.java | 14 +++ .../service/MkDistributionUserService.java | 13 ++ .../com/czg/constant/TableValueConstant.java | 17 +++ .../account/mapper/ShopInfoMapper.java | 5 + .../service/impl/ShopInfoServiceImpl.java | 8 +- .../src/main/java/com/czg/Main.java | 2 +- .../mapper/MkDistributionFlowMapper.java | 14 +++ .../impl/MkDistributionFlowServiceImpl.java | 18 +++ .../impl/MkDistributionUserServiceImpl.java | 82 +++++++++++-- .../mapper/MkDistributionFlowMapper.xml | 7 ++ 14 files changed, 387 insertions(+), 14 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionFlowDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionFlow.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionFlowService.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionFlowMapper.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionFlowServiceImpl.java create mode 100644 cash-service/market-service/src/main/resources/mapper/MkDistributionFlowMapper.xml diff --git a/cash-api/market-server/src/main/java/com/czg/controller/admin/DistributionController.java b/cash-api/market-server/src/main/java/com/czg/controller/admin/DistributionController.java index 8ce8a78c6..07231b0d1 100644 --- a/cash-api/market-server/src/main/java/com/czg/controller/admin/DistributionController.java +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/DistributionController.java @@ -52,7 +52,7 @@ public class DistributionController { @SaAdminCheckPermission(value = "distribution:edit", name = "分销修改") @SaCheckMainShop @PutMapping - public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @RequestBody MkDistributionConfigDTO dto) { + public CzgResult edit( @RequestBody MkDistributionConfigDTO dto) { return CzgResult.success(configService.edit(StpKit.USER.getShopId(), dto)); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionFlowDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionFlowDTO.java new file mode 100644 index 000000000..cb1caa036 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionFlowDTO.java @@ -0,0 +1,103 @@ + +package com.czg.market.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.experimental.Accessors; +import java.io.Serial; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 分销记录表 实体类。 + * + * @author ww + * @since 2025-10-27 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MkDistributionFlowDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 店铺用户id + */ + private Long shopUserId; + + /** + * 用户id + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 等级id + */ + private Long levelId; + + /** + * 等级名称 + */ + private String levelName; + + /** + * 用户名称 + */ + private String nickname; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 订单总金额 + */ + private BigDecimal amount; + + /** + * 奖励金额 + */ + private BigDecimal rewardAmount; + + /** + * order订单 recharge充值 + */ + private String type; + + /** + * pending待入账 success已入账 + */ + private String status; + + /** + * 创建时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionFlow.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionFlow.java new file mode 100644 index 000000000..a2f10109a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionFlow.java @@ -0,0 +1,114 @@ +package com.czg.market.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 分销记录表 实体类。 + * + * @author ww + * @since 2025-10-27 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_distribution_flow") +@Accessors(chain = true) +public class MkDistributionFlow implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 店铺用户id + */ + private Long shopUserId; + + + /** + * 店铺id + */ + private Long shopId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 等级id + */ + private Long levelId; + + /** + * 等级 + */ + private Integer level; + + /** + * 用户名称 + */ + private String nickname; + private String sourceNickName; + + /** + * 订单编号 + */ + private String orderNo; + + private Long sourceId; + /** + * 订单总金额 + */ + private BigDecimal amount; + + /** + * 奖励金额 + */ + private BigDecimal rewardAmount; + + /** + * order订单 recharge充值 + */ + private String type; + + /** + * pending待入账 success已入账 + */ + private String status; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + + /** + * 来源用户id + */ + private Long sourceShopUserId; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionConfigService.java index 29018d4fe..0ad5d1475 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionConfigService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionConfigService.java @@ -16,7 +16,7 @@ import java.util.Map; * @since 2025-10-25 */ public interface MkDistributionConfigService extends IService { - MkDistributionConfigVO detail(Long mainShopId); + MkDistributionConfigVO detail(Long shopId); Boolean edit(Long shopId, MkDistributionConfigDTO dto); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionFlowService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionFlowService.java new file mode 100644 index 000000000..9405f4cf1 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionFlowService.java @@ -0,0 +1,14 @@ +package com.czg.market.service; + +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkDistributionFlow; + +/** + * 分销记录表 服务层。 + * + * @author ww + * @since 2025-10-27 + */ +public interface MkDistributionFlowService extends IService { + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionUserService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionUserService.java index 8d6a9ba32..d52106bf8 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionUserService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionUserService.java @@ -54,6 +54,19 @@ public interface MkDistributionUserService extends IService */ void open(Long userId, BigDecimal amount, Long shopId, Long sourceId); + /** + * 分销商户运营余额充值回调 + */ void rechargeCallBack(Long userId, Long shopId, BigDecimal amount, Long paymentId); + /** + * 发放分销奖励 + * @param orderId 订单id + * @param orderNo 订单编号 + * @param amount 金额 + * @param userId 用户id + * @param shopId 店铺id + */ + void distribute(Long orderId, String orderNo, BigDecimal amount, Long userId, Long shopId, String type); + } diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/constant/TableValueConstant.java b/cash-common/cash-common-tools/src/main/java/com/czg/constant/TableValueConstant.java index 7f9f7d65b..df249050d 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/constant/TableValueConstant.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/constant/TableValueConstant.java @@ -58,6 +58,23 @@ public interface TableValueConstant { } } + } + + interface DistributionFlow { + @Getter + enum Status { + PENDING("pending", "待入账"), + SUCCESS("sub", "已入账"), + SELF_RECHARGE("self_recharge", "自助充值"); + private final String code; + private final String msg; + + Status(String code, String msg) { + this.code = code; + this.msg = msg; + } + } + } interface EnableConfig { @Getter diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopInfoMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopInfoMapper.java index 9fdb9e073..0f3616147 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopInfoMapper.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopInfoMapper.java @@ -5,7 +5,9 @@ import com.czg.account.dto.shopinfo.ShopInfoSubVO; import com.czg.account.entity.ShopInfo; import com.mybatisflex.core.BaseMapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; +import java.math.BigDecimal; import java.util.List; /** @@ -17,4 +19,7 @@ import java.util.List; public interface ShopInfoMapper extends BaseMapper { List getSubList(@Param("lng") String lng, @Param("lat") String lat, @Param("distance") float distance); + + @Update("update tb_shop_info set amount = amount + #{amount} where id = #{id} and amount + #{amount} >= 0") + boolean updateAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index f24fd757c..ad6e1a674 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -453,9 +453,11 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (shopInfo.getAmount() == null) { shopInfo.setAmount(BigDecimal.ZERO); } - shopInfo.setAmount(shopInfo.getAmount().add(amount)); - updateById(shopInfo); - return shopInfo.getAmount(); + boolean flag = mapper.updateAmount(id, amount); + if (!flag) { + throw new CzgException("更新失败"); + } + return shopInfo.getAmount().add(amount); } diff --git a/cash-service/code-generator/src/main/java/com/czg/Main.java b/cash-service/code-generator/src/main/java/com/czg/Main.java index 3bde3fbdc..0e4ce6c73 100644 --- a/cash-service/code-generator/src/main/java/com/czg/Main.java +++ b/cash-service/code-generator/src/main/java/com/czg/Main.java @@ -34,7 +34,7 @@ public class Main { // String packageName = "product"; String packageName = "market"; // tableName 指定需要生成的表 - String tableName = "mk_distribution_amount_flow"; + String tableName = "mk_distribution_flow"; String author = "ww"; //是否生成DTO实体 默认生成 boolean isGenerateDto = true; diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionFlowMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionFlowMapper.java new file mode 100644 index 000000000..1d8f7eea6 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionFlowMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkDistributionFlow; + +/** + * 分销记录表 映射层。 + * + * @author ww + * @since 2025-10-27 + */ +public interface MkDistributionFlowMapper extends BaseMapper { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionFlowServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionFlowServiceImpl.java new file mode 100644 index 000000000..440f2a086 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionFlowServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.service.market.service.impl; + +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.market.entity.MkDistributionFlow; +import com.czg.market.service.MkDistributionFlowService; +import com.czg.service.market.mapper.MkDistributionFlowMapper; +import org.springframework.stereotype.Service; + +/** + * 分销记录表 服务层实现。 + * + * @author ww + * @since 2025-10-27 + */ +@Service +public class MkDistributionFlowServiceImpl extends ServiceImpl implements MkDistributionFlowService{ + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionUserServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionUserServiceImpl.java index 22ce3669d..6b7646685 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionUserServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionUserServiceImpl.java @@ -10,14 +10,8 @@ import com.czg.account.service.ShopUserService; import com.czg.constant.TableValueConstant; import com.czg.exception.CzgException; import com.czg.market.dto.MkDistributionUserDTO; -import com.czg.market.entity.MkDistributionAmountFlow; -import com.czg.market.entity.MkDistributionConfig; -import com.czg.market.entity.MkDistributionLevelConfig; -import com.czg.market.entity.MkDistributionUser; -import com.czg.market.service.MkDistributionAmountFlowService; -import com.czg.market.service.MkDistributionConfigService; -import com.czg.market.service.MkDistributionLevelConfigService; -import com.czg.market.service.MkDistributionUserService; +import com.czg.market.entity.*; +import com.czg.market.service.*; import com.czg.market.vo.MkDistributionConfigVO; import com.czg.order.dto.MkDistributionPayDTO; import com.czg.order.entity.OrderPayment; @@ -26,14 +20,17 @@ import com.czg.sa.StpKit; import com.czg.service.market.mapper.MkDistributionUserMapper; import com.czg.system.service.WxService; import com.czg.utils.AssertUtil; +import com.czg.utils.FunUtils; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -46,6 +43,7 @@ import java.util.stream.Collectors; * @author ww * @since 2025-10-27 */ +@Slf4j @Service public class MkDistributionUserServiceImpl extends ServiceImpl implements MkDistributionUserService { @@ -55,6 +53,9 @@ public class MkDistributionUserServiceImpl extends ServiceImpl { + AssertUtil.isTrue(amount.compareTo(BigDecimal.ZERO) == 0, "分销金额不能为0"); + MkDistributionConfigVO config = mkDistributionConfigService.detail(shopId); + AssertUtil.isTrue(config.getIsEnable() != 1, "分销未开启"); + + // 当前用户上级分销员 + ShopUser sourceShopUserInfo = shopUserService.getShopUserInfo(shopId, sourceUserId); + if (sourceShopUserInfo.getDistributionUserId() == null) { + return; + } + MkDistributionUser distributionUser = getOne(new QueryWrapper().eq(MkDistributionUser::getId, sourceShopUserInfo)); + AssertUtil.isNull(distributionUser, "分销员不存在"); + AssertUtil.isTrue(distributionUser.getStatus() != 1, "分销员未开启"); + + // 上上级分销员 + if (distributionUser.getParentId() != null) { + + } + + MkDistributionLevelConfig level = levelConfigService.getById(distributionUser.getDistributionLevelId()); + AssertUtil.isNull(level, "分销等级不存在"); + + if (config.getRewardCount() != null && config.getRewardCount() > 0) { + long count = distributionFlowService.count(new QueryWrapper().eq(MkDistributionFlow::getSourceShopUserId, sourceUserId) + .eq(MkDistributionFlow::getShopUserId, distributionUser.getShopUserId())); + if (count >= config.getRewardCount()) { + log.info("分销员{}已达到奖励次数上限, 次数: {}", distributionUser.getShopUserId(), config.getRewardCount()); + return; + } + } + + // 店铺信息 + ShopInfo shopInfo = shopInfoService.getById(shopId); + BigDecimal oneAmount = amount.multiply(level.getLevelOneCommission().divide(BigDecimal.valueOf(100), RoundingMode.DOWN)); + + boolean flag = true; + BigDecimal finalAmount = BigDecimal.ZERO; + try { + shopInfoService.updateAmount(shopId, oneAmount.negate()); + }catch (Exception e) { + flag = false; + } + + MkDistributionFlow mkDistributionFlow = new MkDistributionFlow().setShopUserId(distributionUser.getShopUserId()).setShopId(distributionUser.getShopId()).setDistributionUserId(distributionUser.getId()) + .setLevelId(distributionUser.getDistributionLevelId()).setLevel(level.getLevel()).setSourceNickName(sourceShopUserInfo.getNickName()).setOrderNo(orderNo) + .setSourceId(sourceId).setAmount(amount).setType(type).setStatus(flag ? TableValueConstant.DistributionFlow.Status.SUCCESS.getCode() : + TableValueConstant.DistributionFlow.Status.PENDING.getCode()) + .setRewardAmount(oneAmount); + distributionFlowService.save(mkDistributionFlow); + + if (flag) { + distributionAmountFlowService.save(new MkDistributionAmountFlow() + .setType(TableValueConstant.DistributionAmountFlow.Type.SELF_RECHARGE.getCode()) + .setShopId(shopId).setAmount(finalAmount).setChangeAmount(amount).setSourceId(mkDistributionFlow.getId()) + .setRemark("自助充值").setOpAccount(StpKit.USER.getAccount())); + } + + + }, "分销方法执行失败"); + } } diff --git a/cash-service/market-service/src/main/resources/mapper/MkDistributionFlowMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDistributionFlowMapper.xml new file mode 100644 index 000000000..9c584947e --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkDistributionFlowMapper.xml @@ -0,0 +1,7 @@ + + + + +