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 new file mode 100644 index 00000000..4bb73115 --- /dev/null +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/DistributionController.java @@ -0,0 +1,61 @@ +package com.czg.controller.admin; + +import com.czg.annotation.SaAdminCheckPermission; +import com.czg.annotation.SaCheckMainShop; +import com.czg.constant.TableValueConstant; +import com.czg.market.dto.MkDistributionConfigDTO; +import com.czg.market.dto.MkEnableConfigDTO; +import com.czg.market.dto.MkRedemptionConfigDTO; +import com.czg.market.service.MkDistributionConfigService; +import com.czg.market.service.MkEnableConfigService; +import com.czg.market.service.MkRedemptionConfigService; +import com.czg.market.vo.MkDistributionConfigVO; +import com.czg.market.vo.MkEnableConfigVO; +import com.czg.market.vo.MkRedemptionCodeVO; +import com.czg.market.vo.MkRedemptionConfigVO; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.validator.group.UpdateGroup; +import com.mybatisflex.core.paginate.Page; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.groups.Default; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * + * 分销相关 + * @author Administrator + */ +@RestController +@RequestMapping("/admin/distribution") +public class DistributionController { + @Resource + private MkDistributionConfigService configService; + + /** + * 配置信息详情 + */ + @SaAdminCheckPermission(value = "distribution:detail", name = "分销配置") + @GetMapping + public CzgResult detail() { + return CzgResult.success(configService.detail(StpKit.USER.getMainShopId())); + } + + /** + * 配置信息修改 + * + * @return 是否成功 + */ + @SaAdminCheckPermission(value = "distribution:edit", name = "分销修改") + @SaCheckMainShop + @PutMapping + public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @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/MkDistributionConfigDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionConfigDTO.java new file mode 100644 index 00000000..3af79adf --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionConfigDTO.java @@ -0,0 +1,91 @@ + +package com.czg.market.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; +import lombok.experimental.Accessors; +import java.io.Serial; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 分销配置 实体类。 + * + * @author ww + * @since 2025-10-25 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MkDistributionConfigDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 是否开启 + */ +// @NotNull(message = "是否开启不能为空") + private Integer isEnable; + + /** + * pay购买开通 auto自动开通 manual手动开通 + */ +// @NotBlank(message = "开通方式不能为空") + private String openType; + + /** + * 邀请条件人数 + */ + @Min(value = 1, message = "邀请人数不能小于1") + private Integer inviteCount; + + /** + * 被邀请人消费有效 0 1 + */ + private Integer inviteConsume; + + /** + * 购买开通金额 + */ + @DecimalMin(value = "0.01", message = "购买开通金额不能小于0.01") + private BigDecimal payAmount; + + /** + * 每人奖励次数 + */ +// @NotNull(message = "每人奖励次数不能为空") + @Min(value = 1, message = "每人奖励次数不能小于1") + private Integer rewardCount; + + /** + * n天结算 + */ +// @NotNull(message = "结算天数不能为空") + @Min(value = 0, message = "结算天数不能小于0") + private Integer settlementDay; + + /** + * not_upgrade不自动升级 invite邀请有效人数 cost消费金额 + */ +// @NotBlank(message = "升级条件不能为空") + private String upgradeType; + + /** + * 未开通页面富文本 + */ + private String notActivatedPage; + + + @Valid + private List levelConfigList; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionLevelConfigDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionLevelConfigDTO.java new file mode 100644 index 00000000..5e6bb20c --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDistributionLevelConfigDTO.java @@ -0,0 +1,61 @@ + +package com.czg.market.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import jakarta.validation.constraints.*; +import lombok.experimental.Accessors; +import java.io.Serial; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 分销员等级配置 实体类。 + * + * @author ww + * @since 2025-10-25 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MkDistributionLevelConfigDTO implements Serializable { + + + private Long id; + + + /** + * 名称 + */ + @NotBlank(message = "名称不能为空") + private String name; + + /** + * 有效人数 + */ + @Min(value = 1, message = "有效人数不能小于1") + private Integer inviteCount; + + /** + * 消费金额 + */ + @DecimalMin(value = "0.01", message = "消费金额不能小于0.01") + private BigDecimal costAmount; + + /** + * 一级分销比例 + */ + @NotNull(message = "一级分销比例不为空") + private BigDecimal levelOneCommission; + + /** + * 二级分销比例 + */ + private BigDecimal levelTwoCommission; + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionConfig.java new file mode 100644 index 00000000..6cb0e49f --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionConfig.java @@ -0,0 +1,101 @@ +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-25 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_distribution_config") +@Accessors(chain = true) +public class MkDistributionConfig implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 是否开启 + */ + private Integer isEnable; + + /** + * pay购买开通 auto自动开通 manual手动开通 + */ + private String openType; + + /** + * 邀请条件人数 + */ + private Integer inviteCount; + + /** + * 被邀请人消费有效 0 1 + */ + private Integer inviteConsume; + + /** + * 购买开通金额 + */ + private BigDecimal payAmount; + + /** + * 每人奖励次数 + */ + private Integer rewardCount; + + /** + * n天结算 + */ + private Integer settlementDay; + + /** + * not_upgrade不自动升级 invite邀请有效人数 cost消费金额 + */ + private String upgradeType; + + /** + * 未开通页面富文本 + */ + private String notActivatedPage; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + + /** + * 主店id + */ + private Long mainShopId; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionLevelConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionLevelConfig.java new file mode 100644 index 00000000..2acc8eb8 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDistributionLevelConfig.java @@ -0,0 +1,84 @@ +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; + +/** + * 分销员等级配置 实体类。 + * + * @author ww + * @since 2025-10-25 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_distribution_level_config") +public class MkDistributionLevelConfig implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 分销配置表id + */ + private Long distributionConfigId; + + /** + * 主店id + */ + private Long mainShopId; + + /** + * 名称 + */ + private String name; + + /** + * 有效人数 + */ + private Integer inviteCount; + + /** + * 消费金额 + */ + private BigDecimal costAmount; + + /** + * 一级分销比例 + */ + private BigDecimal levelOneCommission; + + /** + * 二级分销比例 + */ + private BigDecimal levelTwoCommission; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + +} 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 new file mode 100644 index 00000000..05043261 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionConfigService.java @@ -0,0 +1,19 @@ +package com.czg.market.service; + +import com.czg.market.dto.MkDistributionConfigDTO; +import com.czg.market.vo.MkDistributionConfigVO; +import com.czg.market.vo.MkRedemptionConfigVO; +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkDistributionConfig; + +/** + * 分销配置 服务层。 + * + * @author ww + * @since 2025-10-25 + */ +public interface MkDistributionConfigService extends IService { + MkDistributionConfigVO detail(Long mainShopId); + + Boolean edit(Long shopId, MkDistributionConfigDTO dto); +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionLevelConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionLevelConfigService.java new file mode 100644 index 00000000..14713f9a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDistributionLevelConfigService.java @@ -0,0 +1,19 @@ +package com.czg.market.service; + +import com.czg.market.dto.MkDistributionLevelConfigDTO; +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkDistributionLevelConfig; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * 分销员等级配置 服务层。 + * + * @author ww + * @since 2025-10-25 + */ +public interface MkDistributionLevelConfigService extends IService { + + void updateByShopId(@Valid List levelConfigList, Long mainShopId, Long id); +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkDistributionConfigVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkDistributionConfigVO.java new file mode 100644 index 00000000..7d07dbf9 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkDistributionConfigVO.java @@ -0,0 +1,19 @@ +package com.czg.market.vo; + +import com.czg.market.entity.MkDistributionConfig; +import com.czg.market.entity.MkDistributionLevelConfig; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * @author Administrator + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MkDistributionConfigVO extends MkDistributionConfig implements Serializable { + private List levelConfigList; + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UShopUserServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UShopUserServiceImpl.java index 12858920..6baa0715 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UShopUserServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UShopUserServiceImpl.java @@ -188,7 +188,7 @@ public class UShopUserServiceImpl implements UShopUserService { @Override public ShopUserDetailDTO getInfo(Long shopId, long userId) { Long mainId = shopInfoService.getMainIdByShopId(shopId); - ShopUser shopUser = shopUserService.getOne(new QueryWrapper().eq(ShopUser::getMainShopId, mainId).eq(ShopUser::getUserId, userId)); + ShopUser shopUser = shopUserService.getShopUserInfo(mainId, shopId); UserInfo userInfo = userInfoService.getById(userId); if (userInfo == null) { throw new ApiNotPrintException("用户信息不存在"); diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionConfigMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionConfigMapper.java new file mode 100644 index 00000000..82f2126d --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionConfigMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkDistributionConfig; + +/** + * 分销配置 映射层。 + * + * @author ww + * @since 2025-10-25 + */ +public interface MkDistributionConfigMapper extends BaseMapper { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionLevelConfigMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionLevelConfigMapper.java new file mode 100644 index 00000000..c3dfab35 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDistributionLevelConfigMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkDistributionLevelConfig; + +/** + * 分销员等级配置 映射层。 + * + * @author ww + * @since 2025-10-25 + */ +public interface MkDistributionLevelConfigMapper extends BaseMapper { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionConfigServiceImpl.java new file mode 100644 index 00000000..4a719824 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionConfigServiceImpl.java @@ -0,0 +1,53 @@ +package com.czg.service.market.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.czg.market.dto.MkDistributionConfigDTO; +import com.czg.market.entity.MkDistributionLevelConfig; +import com.czg.market.service.MkDistributionLevelConfigService; +import com.czg.market.vo.MkDistributionConfigVO; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.market.entity.MkDistributionConfig; +import com.czg.market.service.MkDistributionConfigService; +import com.czg.service.market.mapper.MkDistributionConfigMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +/** + * 分销配置 服务层实现。 + * + * @author ww + * @since 2025-10-25 + */ +@Service +public class MkDistributionConfigServiceImpl extends ServiceImpl implements MkDistributionConfigService{ + + @Resource + private MkDistributionLevelConfigService levelConfigService; + + @Override + public MkDistributionConfigVO detail(Long mainShopId) { + MkDistributionConfig config = getOne(new QueryWrapper().eq(MkDistributionConfig::getMainShopId, mainShopId)); + if (config == null) { + config = new MkDistributionConfig().setMainShopId(mainShopId); + save(config); + config = getOne(new QueryWrapper().eq(MkDistributionConfig::getMainShopId, mainShopId)); + } + + MkDistributionConfigVO configVO = BeanUtil.copyProperties(config, MkDistributionConfigVO.class); + configVO.setLevelConfigList(levelConfigService.list(new QueryWrapper().eq(MkDistributionLevelConfig::getDistributionConfigId, config.getId()))); + return configVO; + } + + @Override + public Boolean edit(Long shopId, MkDistributionConfigDTO dto) { + MkDistributionConfig config = getOne(new QueryWrapper().eq(MkDistributionConfig::getMainShopId, shopId)); + BeanUtil.copyProperties(dto, config); + + if (dto.getLevelConfigList() != null) { + levelConfigService.updateByShopId(dto.getLevelConfigList(), config.getMainShopId(), config.getId()); + } + + return updateById(config); + } +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionLevelConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionLevelConfigServiceImpl.java new file mode 100644 index 00000000..ba6db96e --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDistributionLevelConfigServiceImpl.java @@ -0,0 +1,37 @@ +package com.czg.service.market.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.czg.market.dto.MkDistributionLevelConfigDTO; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.market.entity.MkDistributionLevelConfig; +import com.czg.market.service.MkDistributionLevelConfigService; +import com.czg.service.market.mapper.MkDistributionLevelConfigMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 分销员等级配置 服务层实现。 + * + * @author ww + * @since 2025-10-25 + */ +@Service +public class MkDistributionLevelConfigServiceImpl extends ServiceImpl implements MkDistributionLevelConfigService{ + + @Override + public void updateByShopId(List levelConfigList, Long mainShopId, Long id) { + if (levelConfigList.isEmpty()) { + remove(new QueryWrapper().eq(MkDistributionLevelConfig::getDistributionConfigId, id)); + return; + } + + levelConfigList.forEach(item -> { + MkDistributionLevelConfig config = BeanUtil.copyProperties(item, MkDistributionLevelConfig.class); + config.setDistributionConfigId(id); + config.setMainShopId(mainShopId); + saveOrUpdate(config); + }); + } +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkDistributionConfigMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDistributionConfigMapper.xml new file mode 100644 index 00000000..6436cedf --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkDistributionConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cash-service/market-service/src/main/resources/mapper/MkDistributionLevelConfigMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDistributionLevelConfigMapper.xml new file mode 100644 index 00000000..de4971c6 --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkDistributionLevelConfigMapper.xml @@ -0,0 +1,7 @@ + + + + +