feat:分销码代码生成

This commit is contained in:
dzc committed 2025-12-04 10:43:33 +08:00
1 parent f5e64795cd
commit a4cddba118
15 files changed
+423 -17

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
-- ----------------------------
-- Table structure for trade_brokerage_code
-- ----------------------------
DROP TABLE IF EXISTS `trade_brokerage_code`;
CREATE TABLE `trade_brokerage_code`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '收件地址编号',
`member_id` bigint NOT NULL COMMENT '用户编号',
`poster_pic` varchar(256) NOT NULL COMMENT '邀请海报图',
`code` varchar(32) NOT NULL COMMENT '邀请码',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '分销码';
@@ -107,5 +107,6 @@ public interface ErrorCodeConstants {
ErrorCode BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING = new ErrorCode(1_011_008_001, "佣金提现记录状态不是审核中");
ErrorCode BROKERAGE_WITHDRAW_MIN_PRICE = new ErrorCode(1_011_008_002, "提现金额不能低于 {} 元");
ErrorCode BROKERAGE_WITHDRAW_USER_BALANCE_NOT_ENOUGH = new ErrorCode(1_011_008_003, "您当前最多可提现 {} 元");
ErrorCode BROKERAGE_CODE_NOT_EXISTS = new ErrorCode(1_011_008_004, "分销码不存在");
}
@@ -0,0 +1,76 @@
package cn.iocoder.yudao.module.trade.controller.admin.brokerage;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodePageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodeRespVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodeSaveReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageCodeDO;
import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageCodeService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 分销码")
@RestController
@RequestMapping("/trade/brokerage-code")
@Validated
public class BrokerageCodeController {
@Resource
private BrokerageCodeService brokerageCodeService;
@PostMapping("/create")
@Operation(summary = "创建分销码")
@PreAuthorize("@ss.hasPermission('trade:brokerage-code:create')")
public CommonResult<Long> createBrokerageCode(@Valid @RequestBody BrokerageCodeSaveReqVO createReqVO) {
return success(brokerageCodeService.createBrokerageCode(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新分销码")
@PreAuthorize("@ss.hasPermission('trade:brokerage-code:update')")
public CommonResult<Boolean> updateBrokerageCode(@Valid @RequestBody BrokerageCodeSaveReqVO updateReqVO) {
brokerageCodeService.updateBrokerageCode(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除分销码")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('trade:brokerage-code:delete')")
public CommonResult<Boolean> deleteBrokerageCode(@RequestParam("id") Long id) {
brokerageCodeService.deleteBrokerageCode(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得分销码")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('trade:brokerage-code:query')")
public CommonResult<BrokerageCodeRespVO> getBrokerageCode(@RequestParam("id") Long id) {
BrokerageCodeDO brokerageCode = brokerageCodeService.getBrokerageCode(id);
return success(BeanUtils.toBean(brokerageCode, BrokerageCodeRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得分销码分页")
@PreAuthorize("@ss.hasPermission('trade:brokerage-code:query')")
public CommonResult<PageResult<BrokerageCodeRespVO>> getBrokerageCodePage(@Valid BrokerageCodePageReqVO pageReqVO) {
PageResult<BrokerageCodeDO> pageResult = brokerageCodeService.getBrokerageCodePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, BrokerageCodeRespVO.class));
}
}
@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code;
import lombok.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 分销码分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BrokerageCodePageReqVO extends PageParam {
@Schema(description = "用户编号", example = "31166")
private Long memberId;
@Schema(description = "邀请海报图")
private String posterPic;
@Schema(description = "邀请码")
private String code;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 分销码 Response VO")
@Data
@ExcelIgnoreUnannotated
public class BrokerageCodeRespVO {
@Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27682")
@ExcelProperty("收件地址编号")
private Long id;
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31166")
@ExcelProperty("用户编号")
private Long memberId;
@Schema(description = "邀请海报图", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("邀请海报图")
private String posterPic;
@Schema(description = "邀请码", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("邀请码")
private String code;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 分销码新增/修改 Request VO")
@Data
public class BrokerageCodeSaveReqVO {
@Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27682")
private Long id;
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31166")
@NotNull(message = "用户编号不能为空")
private Long memberId;
@Schema(description = "邀请海报图", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "邀请海报图不能为空")
private String posterPic;
@Schema(description = "邀请码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "邀请码不能为空")
private String code;
}
@@ -41,4 +41,10 @@ public class AppTradeConfigRespVO {
@Schema(description = "提现方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]")
private List<Integer> brokerageWithdrawTypes;
@Schema(description = "一级返佣比例", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer brokerageFirstPercent;
@Schema(description = "二级返佣比例", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer brokerageSecondPercent;
}
@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.trade.dal.dataobject.brokerage;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 分销码 DO
*/
@TableName("trade_brokerage_code")
@KeySequence("trade_brokerage_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BrokerageCodeDO extends BaseDO {
/**
* 收件地址编号
*/
@TableId
private Long id;
/**
* 用户编号
*/
private Long memberId;
/**
* 邀请海报图
*/
private String posterPic;
/**
* 邀请码
*/
private String code;
}
@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.trade.dal.mysql.brokerage;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodePageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageCodeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 分销码 Mapper
*/
@Mapper
public interface BrokerageCodeMapper extends BaseMapperX<BrokerageCodeDO> {
default PageResult<BrokerageCodeDO> selectPage(BrokerageCodePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageCodeDO>()
.eqIfPresent(BrokerageCodeDO::getMemberId, reqVO.getMemberId())
.eqIfPresent(BrokerageCodeDO::getPosterPic, reqVO.getPosterPic())
.eqIfPresent(BrokerageCodeDO::getCode, reqVO.getCode())
.betweenIfPresent(BrokerageCodeDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(BrokerageCodeDO::getId));
}
}
@@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.trade.service.brokerage;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodePageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodeSaveReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageCodeDO;
/**
* 分销码 Service 接口
*/
public interface BrokerageCodeService {
/**
* 创建分销码
*/
Long createBrokerageCode(@Valid BrokerageCodeSaveReqVO createReqVO);
/**
* 更新分销码
*/
void updateBrokerageCode(@Valid BrokerageCodeSaveReqVO updateReqVO);
/**
* 删除分销码
*/
void deleteBrokerageCode(Long id);
/**
* 获得分销码
*/
BrokerageCodeDO getBrokerageCode(Long id);
/**
* 获得分销码分页
*/
PageResult<BrokerageCodeDO> getBrokerageCodePage(BrokerageCodePageReqVO pageReqVO);
}
@@ -0,0 +1,70 @@
package cn.iocoder.yudao.module.trade.service.brokerage;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodePageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.code.BrokerageCodeSaveReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageCodeDO;
import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageCodeMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.BROKERAGE_CODE_NOT_EXISTS;
/**
* 分销码 Service 实现类
*/
@Service
@Validated
public class BrokerageCodeServiceImpl implements BrokerageCodeService {
@Resource
private BrokerageCodeMapper brokerageCodeMapper;
@Override
public Long createBrokerageCode(BrokerageCodeSaveReqVO createReqVO) {
// 插入
BrokerageCodeDO brokerageCode = BeanUtils.toBean(createReqVO, BrokerageCodeDO.class);
brokerageCodeMapper.insert(brokerageCode);
// 返回
return brokerageCode.getId();
}
@Override
public void updateBrokerageCode(BrokerageCodeSaveReqVO updateReqVO) {
// 校验存在
validateBrokerageCodeExists(updateReqVO.getId());
// 更新
BrokerageCodeDO updateObj = BeanUtils.toBean(updateReqVO, BrokerageCodeDO.class);
brokerageCodeMapper.updateById(updateObj);
}
@Override
public void deleteBrokerageCode(Long id) {
// 校验存在
validateBrokerageCodeExists(id);
// 删除
brokerageCodeMapper.deleteById(id);
}
private void validateBrokerageCodeExists(Long id) {
if (brokerageCodeMapper.selectById(id) == null) {
throw exception(BROKERAGE_CODE_NOT_EXISTS);
}
}
@Override
public BrokerageCodeDO getBrokerageCode(Long id) {
return brokerageCodeMapper.selectById(id);
}
@Override
public PageResult<BrokerageCodeDO> getBrokerageCodePage(BrokerageCodePageReqVO pageReqVO) {
return brokerageCodeMapper.selectPage(pageReqVO);
}
}
@@ -53,4 +53,11 @@ public class AppComAuthController {
return success(comAuthService.getUserAuth(getLoginUserId()));
}
@GetMapping("/cancel")
@Operation(summary = "取消认证")
public CommonResult cancelMemberUserAuth(@RequestParam("authId") Long authId) {
comAuthService.cancelUserAuth(authId, getLoginUserId());
return success(true);
}
}
@@ -39,6 +39,11 @@ public interface ComAuthService {
*/
void deleteAuth(Long id);
/**
* 取消认证
*/
void cancelUserAuth(Long authId, Long loginUserId);
/**
* 获得用户认证
*/
@@ -202,6 +202,22 @@ public class ComAuthServiceImpl implements ComAuthService {
authMapper.deleteById(id);
}
/**
* 取消认证
*/
@Override
public void cancelUserAuth(Long authId, Long loginUserId) {
ComAuthDO detail = authMapper.selectOne(new LambdaQueryWrapperX<ComAuthDO>()
.eq(ComAuthDO::getId, authId)
.eq(ComAuthDO::getAuthMemberId, loginUserId)
);
if (ObjectUtil.isEmpty(detail)) {
throw exception(MemberErrorCode.COM_AUTH_NOT_EXISTS);
}
// 删除
authMapper.deleteById(detail.getId());
}
/**
* 获得用户认证
*/
@@ -174,6 +174,7 @@ public class RecentServiceImpl implements RecentService {
if (ObjectUtil.isNotEmpty(dto.getMemberRecentId())) {
validateRecentExists(dto.getMemberRecentId());
}
List<MemberRecentOperateEnum> likeActionList = Arrays.asList(MemberRecentOperateEnum.MEMBER_COLLECT, MemberRecentOperateEnum.RECENT_LIKE);
OperationDO operationDO = operationMapper.selectOne(new LambdaQueryWrapperX<OperationDO>()
.eq(OperationDO::getMemberId, dto.getMemberId())
.eq(OperationDO::getOperatorMemberId, dto.getOperatorMemberId())
@@ -183,21 +184,23 @@ public class RecentServiceImpl implements RecentService {
MemberRecentOperateEnum.RECENT_LIKE.getType()
))
);
if (ObjectUtil.isNotEmpty(operationDO)) {
if (ObjectUtil.isEmpty(operationDO.getCancelTime())) {
// 取消
operationDO.setCancelTime(LocalDateTime.now());
operationMapper.updateById(operationDO);
return operationDO.getId();
}
// 重新点赞
else {
LambdaUpdateWrapper<OperationDO> updateWrapper = new LambdaUpdateWrapper<OperationDO>()
.eq(OperationDO::getId, operationDO.getId())
.set(OperationDO::getTapTime, LocalDateTime.now())
.set(OperationDO::getCancelTime, null);
operationMapper.update(updateWrapper);
return operationDO.getId();
if (likeActionList.contains(dto.getAction())) {
if (ObjectUtil.isNotEmpty(operationDO)) {
if (ObjectUtil.isEmpty(operationDO.getCancelTime())) {
// 取消
operationDO.setCancelTime(LocalDateTime.now());
operationMapper.updateById(operationDO);
return operationDO.getId();
}
// 重新点赞
else {
LambdaUpdateWrapper<OperationDO> updateWrapper = new LambdaUpdateWrapper<OperationDO>()
.eq(OperationDO::getId, operationDO.getId())
.set(OperationDO::getTapTime, LocalDateTime.now())
.set(OperationDO::getCancelTime, null);
operationMapper.update(updateWrapper);
return operationDO.getId();
}
}
}
operationDO = new OperationDO();
@@ -583,9 +586,9 @@ public class RecentServiceImpl implements RecentService {
List<Long> recentIds = list.stream().map(RecentPageResVo::getId).collect(Collectors.toList());
List<OperationStatusVo> operationStatusList = operationService.getRecentOperationStatus(operateUserId, recentIds);
if (ObjectUtil.isEmpty(operationStatusList)) return;
Map<Long, OperationStatusVo> totalMap = IterUtil.toMap(operationStatusList, OperationStatusVo::getMemberId);
Map<Long, OperationStatusVo> totalMap = IterUtil.toMap(operationStatusList, OperationStatusVo::getMemberRecentId);
for (RecentPageResVo entity : list) {
OperationStatusVo target = totalMap.get(entity.getMemberId());
OperationStatusVo target = totalMap.get(entity.getId());
if (ObjectUtil.isEmpty(target)) {
entity.setRecentOperationStatus(new OperationStatusVo());
continue;