26 Commits

Author SHA1 Message Date
5f7c3b50ff Merge branch 'feature-course' into dev 2025-06-29 23:19:22 +08:00
869fd1a8b1 新增了小程序用户晋升申请的模块 2025-06-29 23:18:58 +08:00
e880431e07 修改了环境 2025-06-27 14:56:23 +08:00
1513ea51dc 删除了字体 2025-06-26 09:15:57 +08:00
bbd063c4cd ------------- 2025-06-25 16:48:42 +08:00
42aff09dae 修改了课程分页查询接口 2025-06-25 09:04:25 +08:00
77c73355e2 修复了上架字段的非空注解 2025-06-25 08:54:05 +08:00
3d8fd5591e 添加的功能:小程序端用户查看当前课程推广码
修改的bug: Web端管理员根据课程id分页查询课程章节
2025-06-24 22:34:58 +08:00
ad6eb74170 修复课程模块的bug 2025-06-24 21:53:12 +08:00
1f7e1211cf 完成了课程模块的订单部分 2025-06-24 19:49:24 +08:00
502f079194 解决了全局异常处理bug 2025-06-24 16:15:39 +08:00
a0e60bece6 --------------- 2025-06-24 13:51:31 +08:00
f871d61650 修改了课程模块接口,添加了课程订单模块 2025-06-24 13:31:54 +08:00
95d30cc5f6 添加了课程模块的功能:
1.小程序端用户根据类别查看课程列表
2.小程序端用户根据id查询课程详情
3.小程序端用户生成推广码
2025-06-24 10:42:28 +08:00
7ca23bc987 完成了Web端课程模块 2025-06-24 09:18:01 +08:00
746ac2c6bd 添加了课程模块 2025-06-23 18:11:19 +08:00
5ec4c4ff42 修改了代码结构 2025-06-23 16:30:46 +08:00
2c25017f0a 添加生成课程码的功能 2025-06-23 08:36:27 +08:00
c04ae851cd 修改了环境 2025-06-17 20:18:50 +08:00
5b56f29e45 修改了环境 2025-06-17 13:41:30 +08:00
7140d5008f 修复的bug
1.小程序一键设置下级用户的抽佣比例->解决了最底层用户无法设置抽佣比例
2025-06-17 09:49:56 +08:00
460dced912 修复的功能
1.web端管理员添加项目明细后,项目明细价格根据小程序用户的抽佣比例自动调整
2025-06-16 10:25:41 +08:00
d18d87f81d 添加的新功能
1.小程序用户修改项目的抽佣比例
2.小程序用户修改下级用户的项目明细抽佣比例
3.小程序用户一键设置项目的的抽佣比例
2025-06-15 17:38:05 +08:00
2827ef39c5 --------- 2025-06-11 14:24:53 +08:00
ddad249dea 修复了接口(小程序端用户提现申请)
(小程序端用户查询资金变动记录)
2025-06-11 10:46:09 +08:00
8ad84afcfe 修复了接口(小程序端用户提现申请) 2025-06-11 09:18:11 +08:00
153 changed files with 6274 additions and 689 deletions

14
pom.xml
View File

@ -207,6 +207,20 @@
<version>2.6</version> <version>2.6</version>
</dependency> </dependency>
<!--图片合成-->
<dependency>
<groupId>com.freewayso</groupId>
<artifactId>image-combiner</artifactId>
<version>2.6.9</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.8.7</version> <!-- 换成你项目里使用的 Spring Security 版本 -->
</dependency>

View File

@ -0,0 +1,10 @@
package com.greenorange.promotion.annotation;
/**
* 所有待校验的枚举都应实现此接口,
* 并通过 getValue() 返回其对应的校验字符串。
*/
public interface BaseEnum {
/** 返回该枚举常量对应的校验值 */
String getValue();
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = EnumValueValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValue {
String message() default "无效的枚举值";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/** 要校验的枚举类,必须实现 BaseEnum */
Class<? extends BaseEnum> enumClass();
}

View File

@ -0,0 +1,30 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 初始化时从 enumClass 拿到所有常量的 getValue()
* 然后在 isValid 中判断传入值是否包含于其中。
*/
public class EnumValueValidator implements ConstraintValidator<EnumValue, String> {
private Set<String> validValues;
@Override
public void initialize(EnumValue annotation) {
Class<? extends BaseEnum> enumClass = annotation.enumClass();
validValues = Stream.of(enumClass.getEnumConstants())
.map(BaseEnum::getValue)
.collect(Collectors.toSet());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return StringUtils.isBlank(value) || validValues.contains(value);
}
}

View File

@ -1,20 +0,0 @@
package com.greenorange.promotion.annotation;
import com.greenorange.promotion.model.enums.FileUploadBizEnum;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
// 枚举校验器
public class FileEnumValidator implements ConstraintValidator<FileEnumValue, String> {
@Override
public void initialize(FileEnumValue constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return FileUploadBizEnum.getEnumByValue(value) != null;
}
}

View File

@ -1,20 +0,0 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定义校验注解
@Constraint(validatedBy = FileEnumValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface FileEnumValue {
String message() default "文件业务类型错误"; // 错误信息
Class<?>[] groups() default {}; // 组别
Class<? extends Payload>[] payload() default {}; // 负载
Class<? extends Enum<?>> enumClass(); // 枚举类类型
}

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.annotation;
import com.greenorange.promotion.model.enums.ProjectStatusEnum;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class ProjectStatusEnumValidator implements ConstraintValidator<ProjectStatusEnumValue, String> {
@Override
public void initialize(ProjectStatusEnumValue constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return ProjectStatusEnum.getEnumByValue(value) != null;
}
}

View File

@ -1,22 +0,0 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定义校验注解
@Constraint(validatedBy = ProjectStatusEnumValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ProjectStatusEnumValue {
String message() default "项目状态错误"; // 错误信息
Class<?>[] groups() default {}; // 组别
Class<? extends Payload>[] payload() default {}; // 负载
Class<? extends Enum<?>> enumClass(); // 枚举类类型
}

View File

@ -1,22 +0,0 @@
package com.greenorange.promotion.annotation;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
// 枚举校验器
public class UserEnumValidator implements ConstraintValidator<UserEnumValue, String> {
@Override
public void initialize(UserEnumValue constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return UserRoleEnum.getEnumByValue(value) != null;
}
}

View File

@ -1,20 +0,0 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定义校验注解
@Constraint(validatedBy = UserEnumValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserEnumValue {
String message() default "无效的用户角色"; // 错误信息
Class<?>[] groups() default {}; // 组别
Class<? extends Payload>[] payload() default {}; // 负载
Class<? extends Enum<?>> enumClass(); // 枚举类类型
}

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.annotation;
import com.greenorange.promotion.model.enums.WithdrawStatusEnum;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class WithdrawStatusEnumValidator implements ConstraintValidator<WithdrawStatusEnumValue, String> {
@Override
public void initialize(WithdrawStatusEnumValue constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return WithdrawStatusEnum.getEnumByValue(value) != null;
}
}

View File

@ -1,21 +0,0 @@
package com.greenorange.promotion.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定义校验注解
@Constraint(validatedBy = WithdrawStatusEnumValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface WithdrawStatusEnumValue {
String message() default "提现状态错误"; // 错误信息
Class<?>[] groups() default {}; // 组别
Class<? extends Payload>[] payload() default {}; // 负载
Class<? extends Enum<?>> enumClass(); // 枚举类类型
}

View File

@ -0,0 +1,17 @@
package com.greenorange.promotion.constant;
/**
* 订单状态常量
*/
public interface OrderStatusConstant {
String CLOSED = "交易关闭";
String SUCCESS = "交易成功";
String PENDING = "待支付";
String REFUNDED = "已退款";
}

View File

@ -2,8 +2,6 @@ package com.greenorange.promotion.constant;
/** /**
* 正则表达式常量 * 正则表达式常量
*
* @author <a href="https://xuande-hk.gitee.io">玄德</a>
*/ */
@SuppressWarnings("all") @SuppressWarnings("all")
public interface RegexConstant { public interface RegexConstant {

View File

@ -7,4 +7,10 @@ public interface SystemConstant {
*/ */
String VERIFICATION_CODE = "verificationCode"; String VERIFICATION_CODE = "verificationCode";
/**
* 文件公共前缀
*/
String FILE_COMMON_PREFIX = "http://27.30.77.229:9091/file/download/";
} }

View File

@ -43,4 +43,19 @@ public interface UserConstant {
*/ */
String BAN_ROLE = "ban"; String BAN_ROLE = "ban";
/**
* 经理
*/
String MANAGER_ROLE = "manager";
/**
* 主管
*/
String SUPERVISOR_ROLE = "supervisor";
/**
* 员工
*/
String STAFF_ROLE = "staff";
} }

View File

@ -0,0 +1,145 @@
package com.greenorange.promotion.controller.course;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.courseChapter.CourseChapterAddRequest;
import com.greenorange.promotion.model.dto.courseChapter.CourseChapterQueryRequest;
import com.greenorange.promotion.model.dto.courseChapter.CourseChapterUpdateRequest;
import com.greenorange.promotion.model.entity.CourseChapter;
import com.greenorange.promotion.model.vo.courseChapter.CourseChapterVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CourseChapterService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 课程章节 控制器
*/
@RestController
@RequestMapping("courseChapter")
@Slf4j
@Tag(name = "课程章节模块")
public class CourseChapterController {
@Resource
private CourseChapterService courseChapterService;
@Resource
private CommonService commonService;
/**
* web端管理员添加课程章节
* @param courseChapterAddRequest 课程章节添加请求体
* @return 是否添加成功
*/
@PostMapping("add")
@Operation(summary = "web端管理员添加课程章节", description = "参数课程章节添加请求体权限管理员方法名addCourseChapter")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "web端管理员添加课程章节")
public BaseResponse<Long> addCourseChapter(@Valid @RequestBody CourseChapterAddRequest courseChapterAddRequest) {
CourseChapter courseChapter = commonService.copyProperties(courseChapterAddRequest, CourseChapter.class);
courseChapterService.save(courseChapter);
return ResultUtils.success(courseChapter.getId());
}
/**
* web端管理员根据id修改课程章节信息
* @param courseChapterUpdateRequest 课程章节更新请求体
* @return 是否更新成功
*/
@PostMapping("update")
@Operation(summary = "web端管理员根据id修改课程章节", description = "参数课程章节更新请求体权限管理员方法名updateCourseChapter")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "web端管理员根据id修改课程章节信息")
public BaseResponse<Boolean> updateCourseChapter(@Valid @RequestBody CourseChapterUpdateRequest courseChapterUpdateRequest) {
CourseChapter courseChapter = commonService.copyProperties(courseChapterUpdateRequest, CourseChapter.class);
courseChapterService.updateById(courseChapter);
return ResultUtils.success(true);
}
/**
* web端管理员根据id删除课程章节
* @param commonRequest 课程章节删除请求体
* @return 是否删除成功
*/
@PostMapping("delete")
@Operation(summary = "web端管理员根据id删除课程章节", description = "参数课程章节删除请求体权限管理员方法名delCourseChapter")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "web端管理员根据id删除课程章节")
public BaseResponse<Boolean> delCourseChapter(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
courseChapterService.removeById(id);
return ResultUtils.success(true);
}
/**
* web端管理员批量删除课程章节
* @param commonBatchRequest 课程章节批量删除请求体
* @return 是否删除成功
*/
@PostMapping("delBatch")
@Operation(summary = "web端管理员批量删除课程章节", description = "参数课程章节批量删除请求体权限管理员方法名delBatchCourseChapter")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "web端管理员批量删除课程章节")
public BaseResponse<Boolean> delBatchCourseChapter(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
List<Long> ids = commonBatchRequest.getIds();
courseChapterService.removeByIds(ids);
return ResultUtils.success(true);
}
/**
* web端管理员根据id查询课程章节
* @param commonRequest 课程章节查询请求体
* @return 课程章节信息
*/
@PostMapping("queryById")
@Operation(summary = "web端管理员根据id查询课程章节", description = "参数课程章节查询请求体权限管理员方法名queryCourseChapterById")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "web端管理员根据id查询课程章节")
public BaseResponse<CourseChapterVO> queryCourseChapterById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
CourseChapter courseChapter = courseChapterService.getById(id);
CourseChapterVO courseChapterVO = commonService.copyProperties(courseChapter, CourseChapterVO.class);
return ResultUtils.success(courseChapterVO);
}
/**
* Web端管理员根据课程id分页查询课程章节
* @param courseChapterQueryRequest 课程章节查询请求体
* @return 课程章节列表
*/
@PostMapping("page")
@Operation(summary = "Web端管理员根据课程id分页查询课程章节", description = "参数课程章节查询请求体权限管理员方法名listCourseChapterByPageByCourseId")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程章节管理", content = "Web端管理员根据课程id分页查询课程章节")
public BaseResponse<Page<CourseChapterVO>> listCourseChapterByPageByCourseId(@Valid @RequestBody CourseChapterQueryRequest courseChapterQueryRequest) {
long current = courseChapterQueryRequest.getCurrent();
long pageSize = courseChapterQueryRequest.getPageSize();
QueryWrapper<CourseChapter> queryWrapper = courseChapterService.getQueryWrapper(courseChapterQueryRequest);
Page<CourseChapter> page = courseChapterService.page(new Page<>(current, pageSize), queryWrapper);
List<CourseChapter> courseChapterList = page.getRecords();
List<CourseChapterVO> courseChapterVOList = commonService.convertList(courseChapterList, CourseChapterVO.class);
Page<CourseChapterVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(courseChapterVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);
}
}

View File

@ -0,0 +1,320 @@
package com.greenorange.promotion.controller.course;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.model.dto.course.CourseAddRequest;
import com.greenorange.promotion.model.dto.course.CourseQueryRequest;
import com.greenorange.promotion.model.dto.course.CourseUpdateRequest;
import com.greenorange.promotion.model.entity.Course;
import com.greenorange.promotion.model.entity.CourseChapter;
import com.greenorange.promotion.model.entity.CourseQrcodeApply;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.model.vo.course.CourseCardVO;
import com.greenorange.promotion.model.vo.course.CourseDetailVO;
import com.greenorange.promotion.model.vo.course.CourseVO;
import com.greenorange.promotion.model.vo.courseChapter.CourseChapterVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CourseChapterService;
import com.greenorange.promotion.service.course.CourseQrcodeApplyService;
import com.greenorange.promotion.service.course.CourseService;
import com.greenorange.promotion.service.wechat.WechatGetQrcodeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 课程 控制器
*/
@RestController
@RequestMapping("course")
@Slf4j
@Tag(name = "课程模块")
public class CourseController {
@Resource
private CourseService courseService;
@Resource
private CommonService commonService;
@Resource
private CourseChapterService courseChapterService;
@Resource
private WechatGetQrcodeService wechatGetQrcodeService;
@Resource
private CourseQrcodeApplyService courseQrcodeApplyService;
/**
* 小程序端用户查看热门课程列表
* @return 课程信息列表
*/
@PostMapping("query/hot")
@Operation(summary = "小程序端用户查看热门课程列表", description = "参数权限管理员方法名miniQueryHotCourseList")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户查看热门课程列表")
public BaseResponse<List<CourseCardVO>> miniQueryHotCourseList() {
List<Course> courseList = commonService.findByFieldEqTargetField(Course::getIsShelves, true, courseService);
// 降序排序并取前四个元素
courseList = courseList.stream()
.sorted((course1, course2) -> Integer.compare(course2.getOrderCount(), course1.getOrderCount())) // 降序排序
.limit(4) // 取前四个元素
.collect(Collectors.toList());
List<CourseCardVO> courseCardVOS = commonService.convertList(courseList, CourseCardVO.class);
return ResultUtils.success(courseCardVOS);
}
/**
* 小程序端用户根据类别查看课程列表
* @param commonStringRequest 课程类别
* @return 课程信息列表
*/
@PostMapping("query/type")
@Operation(summary = "小程序端用户根据类别查看课程列表", description = "参数课程添加请求体权限管理员方法名miniQueryCourseByType")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户根据类别查看课程列表")
public BaseResponse<List<CourseCardVO>> miniQueryCourseByType(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String courseType = commonStringRequest.getTemplateString();
Map<SFunction<Course, ?>, Object> fieldConditions = Map.of(Course::getType, courseType, Course::getIsShelves, true);
List<Course> courseList = commonService.findByFieldEqTargetFields(fieldConditions, courseService);
List<CourseCardVO> courseCardVOS = commonService.convertList(courseList, CourseCardVO.class);
return ResultUtils.success(courseCardVOS);
}
/**
* 小程序端用户根据id查询课程详情
* @param commonRequest 课程id
* @return 课程信息列表
*/
@PostMapping("query/id")
@Operation(summary = "小程序端用户根据id查询课程详情", description = "参数课程id权限管理员方法名miniQueryCourseById")
@SysLog(title = "课程管理", content = "小程序端用户根据id查询课程详情")
public BaseResponse<CourseDetailVO> miniQueryCourseById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
Course course = courseService.getById(id);
CourseDetailVO courseDetailVO = commonService.copyProperties(course, CourseDetailVO.class);
LambdaQueryWrapper<CourseChapter> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(CourseChapter::getCourseId, id);
List<CourseChapter> courseChapterList = courseChapterService.list(lambdaQueryWrapper);
List<CourseChapterVO> courseChapterVOS = commonService.convertList(courseChapterList, CourseChapterVO.class);
courseDetailVO.setCourseChapters(courseChapterVOS);
return ResultUtils.success(courseDetailVO);
}
/**
* 小程序端用户生成课程推广码
* @param commonRequest 课程id
* @return 课程信息列表
*/
@PostMapping("generate/qrcode")
@Operation(summary = "小程序端用户生成课程推广码", description = "参数课程id权限管理员方法名miniGenerateQrcode")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户生成课程推广码")
public BaseResponse<String> miniGenerateQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception {
String videoView = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request);
return ResultUtils.success(videoView);
}
/**
* 小程序端用户根据id查看课程基本信息
* @param commonRequest 课程id
* @return 课程基本信息
*/
@PostMapping("detail/id")
@Operation(summary = "小程序端用户根据id查看课程基本信息", description = "参数课程id权限管理员方法名miniQueryCourseBaseInfo")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户根据id查看课程基本信息")
public BaseResponse<CourseCardVO> miniQueryCourseBaseInfo(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
Course course = courseService.getById(id);
CourseCardVO courseCardVO = commonService.copyProperties(course, CourseCardVO.class);
return ResultUtils.success(courseCardVO);
}
/**
* 小程序端用户查看当前课程推广码
* @param commonRequest 课程id
* @return 课程推广码(view值)
*/
@PostMapping("verify")
@Operation(summary = "小程序端用户查看当前课程推广码", description = "参数课程id权限管理员方法名verifyIsApplyCourseQrcode")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户查看当前课程推广码")
public BaseResponse<String> verifyIsApplyCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
Long courseId = commonRequest.getId();
LambdaQueryWrapper<CourseQrcodeApply> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(CourseQrcodeApply::getUserId, userId).eq(CourseQrcodeApply::getCourseId, courseId);
CourseQrcodeApply courseQrcodeApply = courseQrcodeApplyService.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(courseQrcodeApply == null, ErrorCode.OPERATION_ERROR, "当前用户尚未申请该课程的推广码");
return ResultUtils.success(courseQrcodeApply.getCourseQrcode());
}
/**
* web端管理员添加课程
* @param courseAddRequest 课程添加请求体
* @return 是否添加成功
*/
@PostMapping("add")
@Operation(summary = "web端管理员添加课程", description = "参数课程添加请求体权限管理员方法名addCourse")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员添加课程")
public BaseResponse<Long> addCourse(@Valid @RequestBody CourseAddRequest courseAddRequest) {
BigDecimal firstLevelRate = courseAddRequest.getFirstLevelRate();
BigDecimal secondLevelRate = courseAddRequest.getSecondLevelRate();
ThrowUtils.throwIf(firstLevelRate.compareTo(secondLevelRate) < 0, ErrorCode.PARAMS_ERROR, "一级佣金比例不能小于二级佣金比例");
Course course = commonService.copyProperties(courseAddRequest, Course.class);
courseService.save(course);
return ResultUtils.success(course.getId());
}
/**
* web端管理员根据id修改课程信息
* @param courseUpdateRequest 课程更新请求体
* @return 是否更新成功
*/
@PostMapping("update")
@Operation(summary = "web端管理员根据id修改课程信息", description = "参数课程更新请求体权限管理员方法名updateCourse")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员根据id修改课程信息")
public BaseResponse<Boolean> updateCourse(@Valid @RequestBody CourseUpdateRequest courseUpdateRequest) {
Course course = commonService.copyProperties(courseUpdateRequest, Course.class);
courseService.updateById(course);
return ResultUtils.success(true);
}
/**
* web端管理员根据id删除课程
* @param commonRequest 课程删除请求体
* @return 是否删除成功
*/
@PostMapping("delete")
@Operation(summary = "web端管理员根据id删除课程", description = "参数课程删除请求体权限管理员方法名delCourse")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员根据id删除课程")
public BaseResponse<Boolean> delCourse(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
courseService.removeById(id);
// 删除课程下的所有章节
LambdaQueryWrapper<CourseChapter> lambdaQueryWrapper = commonService.buildQueryWrapperByField(CourseChapter::getCourseId, id, courseChapterService);
courseChapterService.remove(lambdaQueryWrapper);
return ResultUtils.success(true);
}
/**
* web端管理员批量删除课程
* @param commonBatchRequest 课程批量删除请求体
* @return 是否删除成功
*/
@PostMapping("delBatch")
@Operation(summary = "web端管理员批量删除课程", description = "参数课程批量删除请求体权限管理员方法名delBatchCourse")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员批量删除课程")
public BaseResponse<Boolean> delBatchCourse(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
List<Long> ids = commonBatchRequest.getIds();
courseService.removeByIds(ids);
// 批量删除课程下的所有章节
LambdaQueryWrapper<CourseChapter> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(CourseChapter::getCourseId, ids);
courseChapterService.remove(lambdaQueryWrapper);
return ResultUtils.success(true);
}
/**
* web端管理员根据id查询课程
* @param commonRequest 课程查询请求体
* @return 课程信息
*/
@PostMapping("queryById")
@Operation(summary = "web端管理员根据id查询课程", description = "参数课程查询请求体权限管理员方法名queryCourseById")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员根据id查询课程")
public BaseResponse<CourseVO> queryCourseById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
Course course = courseService.getById(id);
CourseVO courseVO = commonService.copyProperties(course, CourseVO.class);
return ResultUtils.success(courseVO);
}
/**
* web端管理员上架课程
* @param commonRequest 课程id
* @return 课程信息
*/
@PostMapping("isShelves")
@Operation(summary = "web端管理员上架课程", description = "参数课程查询请求体权限管理员方法名updateCourseShelvesStatus")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员上架课程")
public BaseResponse<Boolean> updateCourseShelvesStatus(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
Course course = courseService.getById(id);
course.setIsShelves(!course.getIsShelves());
courseService.updateById(course);
return ResultUtils.success(true);
}
/**
* Web端管理员分页查询课程
* @param courseQueryRequest 课程查询请求体
* @return 课程列表
*/
@PostMapping("page")
@Operation(summary = "Web端管理员分页查询课程", description = "参数课程查询请求体权限管理员方法名listCourseByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "Web端管理员分页查询课程")
public BaseResponse<Page<CourseVO>> listCourseByPage(@Valid @RequestBody CourseQueryRequest courseQueryRequest) {
long current = courseQueryRequest.getCurrent();
long pageSize = courseQueryRequest.getPageSize();
QueryWrapper<Course> queryWrapper = courseService.getQueryWrapper(courseQueryRequest);
Page<Course> page = courseService.page(new Page<>(current, pageSize), queryWrapper);
List<Course> courseList = page.getRecords();
List<CourseVO> courseVOList = commonService.convertList(courseList, CourseVO.class);
Page<CourseVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(courseVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);
}
}

View File

@ -0,0 +1,218 @@
package com.greenorange.promotion.controller.course;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.OrderStatusConstant;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest;
import com.greenorange.promotion.model.entity.Course;
import com.greenorange.promotion.model.entity.CourseOrder;
import com.greenorange.promotion.model.vo.course.CourseCardVO;
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderCardVO;
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CourseOrderService;
import com.greenorange.promotion.service.course.CourseService;
import com.greenorange.promotion.utils.OrderNumberUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
/**
* 课程订单 控制器
*/
@RestController
@RequestMapping("courseOrder")
@Slf4j
@Tag(name = "课程订单模块")
public class CourseOrderController {
@Resource
private CourseService courseService;
@Resource
private CourseOrderService courseOrderService;
@Resource
private CommonService commonService;
/**
* 小程序端用户生成课程订单
* @param courseOrderAddRequest 课程id
* @return 是否添加成功
*/
@PostMapping("add")
@Operation(summary = "小程序端用户生成课程订单", description = "参数课程id权限管理员方法名addCourseOrder")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程订单管理", content = "小程序端用户生成课程订单")
public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
Long courseId = courseOrderAddRequest.getCourseId();
Course course = courseService.getById(courseId);
ThrowUtils.throwIf(course == null, ErrorCode.OPERATION_ERROR, "该课程不存在");
CourseOrder courseOrder = commonService.copyProperties(course, CourseOrder.class);
courseOrder.setOrderNumber(OrderNumberUtils.generateOrderId());
courseOrder.setTotalAmount(course.getDiscountPrice());
courseOrder.setUserId(userId);
courseOrderService.save(courseOrder);
return ResultUtils.success(courseOrder.getId());
}
/**
* 小程序端用户取消课程订单
* @param courseOrderAddRequest 课程id
* @return 是否添加成功
*/
@PostMapping("cancel")
@Operation(summary = "小程序端用户取消课程订单", description = "参数订单id权限管理员方法名cancelCourseOrder")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程订单管理", content = "小程序端用户取消课程订单")
public BaseResponse<Long> cancelCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest) {
Long courseId = courseOrderAddRequest.getCourseId();
CourseOrder courseOrder = courseOrderService.getById(courseId);
ThrowUtils.throwIf(courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.PENDING),
ErrorCode.OPERATION_ERROR, "该订单不存在或者订单状态错误");
LambdaUpdateWrapper<CourseOrder> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(CourseOrder::getId, courseId).set(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED);
courseOrderService.update(updateWrapper);
return ResultUtils.success(courseOrder.getId());
}
/**
* 小程序端用户查询课程订单列表
* @return 课程订单列表
*/
@PostMapping("query/list")
@Operation(summary = "小程序端用户查询课程订单列表", description = "参数:无,权限:管理员,方法名:queryCourseOrderList")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程订单管理", content = "小程序端用户查询课程订单列表")
public BaseResponse<List<CourseOrderCardVO>> queryCourseOrderList(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
List<CourseOrder> courseOrderList = commonService.findByFieldEqTargetField(CourseOrder::getUserId, userId, courseOrderService);
List<CourseOrderCardVO> courseOrderCardVOS = commonService.convertList(courseOrderList, CourseOrderCardVO.class);
Collections.reverse(courseOrderCardVOS);
return ResultUtils.success(courseOrderCardVOS);
}
/**
* 小程序端用户根据id查询订单详情
* @return 课程订单列表
*/
@PostMapping("query/detail")
@Operation(summary = "小程序端用户根据id查询订单详情", description = "参数订单id权限管理员方法名:queryCourseOrderDetailById")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程订单管理", content = "小程序端用户根据id查询订单详情")
public BaseResponse<CourseOrderVO> queryCourseOrderDetailById(@RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
CourseOrderVO courseOrderVO = commonService.copyProperties(courseOrder, CourseOrderVO.class);
return ResultUtils.success(courseOrderVO);
}
/**
* web端管理员根据id删除课程订单
* @param commonRequest 课程订单删除请求体
* @return 是否删除成功
*/
@PostMapping("delete")
@Operation(summary = "web端管理员根据id删除课程订单", description = "参数课程订单删除请求体权限管理员方法名delCourseOrder")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员根据id删除课程订单")
public BaseResponse<Boolean> delCourseOrder(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
ThrowUtils.throwIf(courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.CLOSED),
ErrorCode.OPERATION_ERROR, "该课程订单不存在或订单状态错误");
courseOrderService.removeById(id);
return ResultUtils.success(true);
}
/**
* web端管理员批量删除课程订单
* @param commonBatchRequest 课程订单批量删除请求体
* @return 是否删除成功
*/
@PostMapping("delBatch")
@Operation(summary = "web端管理员批量删除课程订单", description = "参数课程订单批量删除请求体权限管理员方法名delBatchCourseOrder")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员批量删除课程订单")
public BaseResponse<Boolean> delBatchCourseOrder(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
List<Long> ids = commonBatchRequest.getIds();
LambdaQueryWrapper<CourseOrder> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ne(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED);
long count = courseOrderService.count(queryWrapper);
ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "存在未关闭的课程订单");
courseOrderService.removeByIds(ids);
return ResultUtils.success(true);
}
/**
* web端管理员根据id查询课程订单
* @param commonRequest 课程订单查询请求体
* @return 课程订单信息
*/
@PostMapping("queryById")
@Operation(summary = "web端管理员根据id查询课程订单", description = "参数课程订单查询请求体权限管理员方法名queryCourseOrderById")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员根据id查询课程订单")
public BaseResponse<CourseOrderVO> queryCourseOrderById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
CourseOrderVO courseOrderVO = commonService.copyProperties(courseOrder, CourseOrderVO.class);
return ResultUtils.success(courseOrderVO);
}
/**
* Web端管理员分页查询课程订单
* @param courseOrderQueryRequest 课程订单查询请求体
* @return 课程订单列表
*/
@PostMapping("page")
@Operation(summary = "Web端管理员分页查询课程订单", description = "参数课程订单查询请求体权限管理员方法名listCourseOrderByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "Web端管理员分页查询课程订单")
public BaseResponse<Page<CourseOrderVO>> listCourseOrderByPage(@Valid @RequestBody CourseOrderQueryRequest courseOrderQueryRequest) {
long current = courseOrderQueryRequest.getCurrent();
long pageSize = courseOrderQueryRequest.getPageSize();
QueryWrapper<CourseOrder> queryWrapper = courseOrderService.getQueryWrapper(courseOrderQueryRequest);
Page<CourseOrder> page = courseOrderService.page(new Page<>(current, pageSize), queryWrapper);
List<CourseOrder> courseOrderList = page.getRecords();
List<CourseOrderVO> courseOrderVOList = commonService.convertList(courseOrderList, CourseOrderVO.class);
Page<CourseOrderVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(courseOrderVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);
}
}

View File

@ -33,14 +33,15 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.lang.reflect.GenericDeclaration;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap; import java.util.stream.Collectors;
import java.util.List;
import java.util.Map;
/** /**
@ -141,6 +142,49 @@ public class ProjectCommissionController {
} }
// public static void main(String[] args) {
// PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// String encode = passwordEncoder.encode("123456");
// System.out.println(encode);
// boolean matches = passwordEncoder.matches("123456", "$2a$10$/yBGQqsHK78vlEtuMGTVY.bU/TamHQbr4wQIzj1B1H1ud/ZKPGICC");
// System.out.println(matches);
// }
//
// /**
// * 小程序用户修改项目的抽佣比例
// * @param projectCommissionUpdateRequest 项目明细抽佣更新请求体
// * @return 是否添加成功
// */
// @PostMapping("update/rate")
// @Operation(summary = "小程序用户修改项目的抽佣比例", description = "参数项目明细抽佣更新请求体权限管理员方法名updateProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改项目的抽佣比例")
// public BaseResponse<Boolean> updateProjectCommissionRate(@Valid @RequestBody ProjectCommissionUpdateRequest projectCommissionUpdateRequest, HttpServletRequest request) {
// Long id = projectCommissionUpdateRequest.getId();
// BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
// // 校验当前抽佣比例不能大于最大抽佣比例
// ProjectCommission projectCommission = projectCommissionService.getById(id);
// Long projectDetailId = projectCommission.getProjectDetailId();
// ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
// ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
// projectCommission.setCurrentCommissionRate(currentCommissionRate);
// projectCommissionService.updateById(projectCommission);
//
// // 批量更新下级用户的项目明细抽佣比例
// Long userId = (Long) request.getAttribute("userId");
// Map<SFunction<SubUserProjectCommission, ?>, Object> fieldConditions = Map.of(SubUserProjectCommission::getProjectDetailId, projectDetailId, SubUserProjectCommission::getUserId, userId);
// List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetFields(fieldConditions, subUserProjectCommissionService);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
// }
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// return ResultUtils.success(true);
// }
/** /**
* 小程序用户修改项目的抽佣比例 * 小程序用户修改项目的抽佣比例
* @param projectCommissionUpdateRequest 项目明细抽佣更新请求体 * @param projectCommissionUpdateRequest 项目明细抽佣更新请求体
@ -151,30 +195,11 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改项目的抽佣比例") // @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改项目的抽佣比例")
public BaseResponse<Boolean> updateProjectCommissionRate(@Valid @RequestBody ProjectCommissionUpdateRequest projectCommissionUpdateRequest, HttpServletRequest request) { public BaseResponse<Boolean> updateProjectCommissionRate(@Valid @RequestBody ProjectCommissionUpdateRequest projectCommissionUpdateRequest, HttpServletRequest request) {
Long id = projectCommissionUpdateRequest.getId(); projectCommissionService.updateProjectCommissionRate(projectCommissionUpdateRequest);
BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
// 校验当前抽佣比例不能大于最大抽佣比例
ProjectCommission projectCommission = projectCommissionService.getById(id);
Long projectDetailId = projectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
projectCommission.setCurrentCommissionRate(currentCommissionRate);
projectCommissionService.updateById(projectCommission);
// 批量更新下级用户的项目明细抽佣比例
Long userId = (Long) request.getAttribute("userId");
Map<SFunction<SubUserProjectCommission, ?>, Object> fieldConditions = Map.of(SubUserProjectCommission::getProjectDetailId, projectDetailId, SubUserProjectCommission::getUserId, userId);
List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetFields(fieldConditions, subUserProjectCommissionService);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
}
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
return ResultUtils.success(true); return ResultUtils.success(true);
} }
/** /**
* 小程序用户查看下级用户的项目明细抽佣情况 * 小程序用户查看下级用户的项目明细抽佣情况
* @param commonRequest 项目id * @param commonRequest 项目id
@ -249,6 +274,30 @@ public class ProjectCommissionController {
} }
// /**
// * 小程序用户修改下级用户的项目明细抽佣比例
// * @param subUserProjectCommissionUpdateRequest 下级用户项目明细抽佣更新请求体
// * @return 是否添加成功
// */
// @PostMapping("update/sub/rate")
// @Operation(summary = "小程序用户修改下级用户的项目明细抽佣比例", description = "参数下级用户项目明细抽佣更新请求体权限管理员方法名updateSubUserProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改下级用户的项目明细抽佣比例")
// public BaseResponse<Boolean> updateSubUserProjectCommissionRate(@Valid @RequestBody SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
// Long id = subUserProjectCommissionUpdateRequest.getId();
// BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
// // 校验当前抽佣比例不能大于最大抽佣比例
// SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
// Long projectDetailId = subUserProjectCommission.getProjectDetailId();
// ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
// ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
// subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
// subUserProjectCommissionService.updateById(subUserProjectCommission);
// return ResultUtils.success(true);
// }
/** /**
* 小程序用户修改下级用户的项目明细抽佣比例 * 小程序用户修改下级用户的项目明细抽佣比例
* @param subUserProjectCommissionUpdateRequest 下级用户项目明细抽佣更新请求体 * @param subUserProjectCommissionUpdateRequest 下级用户项目明细抽佣更新请求体
@ -259,20 +308,63 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改下级用户的项目明细抽佣比例") // @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改下级用户的项目明细抽佣比例")
public BaseResponse<Boolean> updateSubUserProjectCommissionRate(@Valid @RequestBody SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) { public BaseResponse<Boolean> updateSubUserProjectCommissionRate(@Valid @RequestBody SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
Long id = subUserProjectCommissionUpdateRequest.getId(); projectCommissionService.updateSubUserProjectCommissionRate(subUserProjectCommissionUpdateRequest);
BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
// 校验当前抽佣比例不能大于最大抽佣比例
SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
subUserProjectCommissionService.updateById(subUserProjectCommission);
return ResultUtils.success(true); return ResultUtils.success(true);
} }
// /**
// * 小程序用户一键设置项目的的抽佣比例
// * @param projectCommissionUniteUpdateRequest 统一抽佣比例
// * @return 是否添加成功
// */
// @PostMapping("update/unite/rate")
// @Operation(summary = "小程序用户一键设置项目的的抽佣比例", description = "参数统一抽佣比例权限管理员方法名uniteProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户一键设置项目的的抽佣比例")
// public BaseResponse<Boolean> uniteProjectCommissionRate(@Valid @RequestBody ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
// Long userId = (Long) request.getAttribute("userId");
// BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
//
// // 修改项目的统一抽佣比例
// LambdaUpdateWrapper<UserMainInfo> userMainInfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
// userMainInfoLambdaUpdateWrapper.eq(UserMainInfo::getUserId, userId).set(UserMainInfo::getUniteRate, uniteCommissionRate);
// userMainInfoService.update(userMainInfoLambdaUpdateWrapper);
//
// LambdaQueryWrapper<ProjectCommission> projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
// projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId);
// List<ProjectCommission> projectCommissionList = projectCommissionService.list(projectCommissionLambdaQueryWrapper);
//
// List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
// // 封装map集合项目明细id, 值:项目明细最大抽佣比例)
// Map<Long, BigDecimal> map = new HashMap<>();
// for (ProjectDetail projectDetail : projectDetailList) {
// map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
// }
// for (ProjectCommission projectCommission : projectCommissionList) {
// Long projectDetailId = projectCommission.getProjectDetailId();
// BigDecimal maxCommissionRate = map.get(projectDetailId);
// BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
// projectCommission.setCurrentCommissionRate(setCommissionRate);
// }
// projectCommissionService.updateBatchById(projectCommissionList);
//
// // 修改下级用户的项目明细抽佣比例
// LambdaQueryWrapper<SubUserProjectCommission> subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
// subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId);
// List<SubUserProjectCommission> subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// Long projectDetailId = subUserProjectCommission.getProjectDetailId();
// BigDecimal maxCommissionRate = map.get(projectDetailId);
// BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
// subUserProjectCommission.setCurrentCommissionRate(setCommissionRate);
// }
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// return ResultUtils.success(true);
// }
/** /**
* 小程序用户一键设置项目的的抽佣比例 * 小程序用户一键设置项目的的抽佣比例
* @param projectCommissionUniteUpdateRequest 统一抽佣比例 * @param projectCommissionUniteUpdateRequest 统一抽佣比例
@ -283,43 +375,7 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户一键设置项目的的抽佣比例") // @SysLog(title = "项目明细抽佣管理", content = "小程序用户一键设置项目的的抽佣比例")
public BaseResponse<Boolean> uniteProjectCommissionRate(@Valid @RequestBody ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) { public BaseResponse<Boolean> uniteProjectCommissionRate(@Valid @RequestBody ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); projectCommissionService.uniteProjectCommissionRate(projectCommissionUniteUpdateRequest, request);
BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
// 修改项目的统一抽佣比例
LambdaUpdateWrapper<UserMainInfo> userMainInfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userMainInfoLambdaUpdateWrapper.eq(UserMainInfo::getUserId, userId).set(UserMainInfo::getUniteRate, uniteCommissionRate);
userMainInfoService.update(userMainInfoLambdaUpdateWrapper);
LambdaQueryWrapper<ProjectCommission> projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId);
List<ProjectCommission> projectCommissionList = projectCommissionService.list(projectCommissionLambdaQueryWrapper);
List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
// 封装map集合项目明细id, 值:项目明细最大抽佣比例)
Map<Long, BigDecimal> map = new HashMap<>();
for (ProjectDetail projectDetail : projectDetailList) {
map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
}
for (ProjectCommission projectCommission : projectCommissionList) {
Long projectDetailId = projectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
projectCommission.setCurrentCommissionRate(setCommissionRate);
}
projectCommissionService.updateBatchById(projectCommissionList);
// 修改下级用户的项目明细抽佣比例
LambdaQueryWrapper<SubUserProjectCommission> subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId);
List<SubUserProjectCommission> subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
subUserProjectCommission.setCurrentCommissionRate(setCommissionRate);
}
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
return ResultUtils.success(true); return ResultUtils.success(true);
} }

View File

@ -91,27 +91,7 @@ public class ProjectController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目管理", content = "小程序用户查看项目列表") // @SysLog(title = "项目管理", content = "小程序用户查看项目列表")
public BaseResponse<List<ProjectCardVO>> queryProjectCardList(HttpServletRequest request) { public BaseResponse<List<ProjectCardVO>> queryProjectCardList(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); List<ProjectCardVO> projectCardVOS = projectService.queryProjectCardList(request);
// 获取项目明细抽佣列表
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getUserId, userId, projectCommissionService);
// 封装Map集合项目id, 值:项目总价)
Map<Long, BigDecimal> projectPriceMap = new HashMap<>();
for (ProjectCommission projectCommission : projectCommissionList) {
Long projectId = projectCommission.getProjectId();
BigDecimal projectPrice = projectPriceMap.get(projectId);
if (projectPrice == null) {
projectPrice = projectCommission.getMyUnitPrice();
} else {
projectPrice = projectPrice.add(projectCommission.getMyUnitPrice());
}
projectPriceMap.put(projectId, projectPrice);
}
List<Project> projectList = commonService.findByFieldEqTargetField(Project::getIsShelves, 1, projectService);
for (Project project : projectList) {
BigDecimal projectPrice = projectPriceMap.get(project.getId());
project.setProjectPrice(projectPrice == null ? BigDecimal.ZERO : projectPrice);
}
List<ProjectCardVO> projectCardVOS = commonService.convertList(projectList, ProjectCardVO.class);
return ResultUtils.success(projectCardVOS); return ResultUtils.success(projectCardVOS);
} }
@ -281,10 +261,7 @@ public class ProjectController {
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "项目管理", content = "web端管理员根据id查询项目") @SysLog(title = "项目管理", content = "web端管理员根据id查询项目")
public BaseResponse<ProjectVO> queryProjectById(@Valid @RequestBody CommonRequest commonRequest) { public BaseResponse<ProjectVO> queryProjectById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId(); ProjectVO projectVO = projectService.queryProjectById(commonRequest);
Project project = projectService.getById(id);
ThrowUtils.throwIf(project == null, ErrorCode.OPERATION_ERROR, "当前项目不存在");
ProjectVO projectVO = commonService.copyProperties(project, ProjectVO.class);
return ResultUtils.success(projectVO); return ResultUtils.success(projectVO);
} }

View File

@ -22,6 +22,7 @@ import com.greenorange.promotion.service.project.ProjectDetailService;
import com.greenorange.promotion.service.project.ProjectService; import com.greenorange.promotion.service.project.ProjectService;
import com.greenorange.promotion.service.project.SubUserProjectCommissionService; import com.greenorange.promotion.service.project.SubUserProjectCommissionService;
import com.greenorange.promotion.service.userInfo.UserInfoService; import com.greenorange.promotion.service.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -65,6 +66,9 @@ public class ProjectDetailController {
@Resource @Resource
private ProjectService projectService; private ProjectService projectService;
@Resource
private UserMainInfoService userMainInfoService;
/** /**
* web端管理员添加项目明细 * web端管理员添加项目明细
* @param projectDetailAddRequest 项目明细添加请求体 * @param projectDetailAddRequest 项目明细添加请求体
@ -89,6 +93,13 @@ public class ProjectDetailController {
// 获取所有的小程序用户 // 获取所有的小程序用户
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService); List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService);
List<UserMainInfo> userMainInfoList = commonService.findByFieldInTargetField(userInfoList, userMainInfoService, UserInfo::getId, UserMainInfo::getUserId);
// 封装Map(键用户id, 值:抽佣比例)
Map<Long, BigDecimal> userCommissionRateMap = new HashMap<>();
for (UserMainInfo userMainInfo : userMainInfoList) {
userCommissionRateMap.put(userMainInfo.getUserId(), userMainInfo.getUniteRate());
}
// 获取参数信息 // 获取参数信息
List<ProjectCommissionAddRequest> projectCommissionAddRequestList = new ArrayList<>(); List<ProjectCommissionAddRequest> projectCommissionAddRequestList = new ArrayList<>();
Long projectDetailId = projectDetail.getId(); Long projectDetailId = projectDetail.getId();
@ -106,7 +117,11 @@ public class ProjectDetailController {
projectCommissionAddRequestList.add(projectCommissionAddRequest); projectCommissionAddRequestList.add(projectCommissionAddRequest);
} }
List<ProjectCommission> projectCommissions = commonService.convertList(projectCommissionAddRequestList, ProjectCommission.class); List<ProjectCommission> projectCommissions = commonService.convertList(projectCommissionAddRequestList, ProjectCommission.class);
projectCommissionService.saveBatch(projectCommissions); List<SubUserProjectCommission> userProjectCommissions = commonService.convertList(projectCommissions, SubUserProjectCommission.class);
for (SubUserProjectCommission userProjectCommission : userProjectCommissions) {
userProjectCommission.setSubUserId(-1L);
}
// projectCommissionService.saveBatch(projectCommissions);
// 给所有用户添加一条下级项目明细抽佣表 // 给所有用户添加一条下级项目明细抽佣表
List<SubUserProjectCommissionAddRequest> subUserProjectCommissionAddRequestList = new ArrayList<>(); List<SubUserProjectCommissionAddRequest> subUserProjectCommissionAddRequestList = new ArrayList<>();
@ -122,80 +137,119 @@ public class ProjectDetailController {
subUserProjectCommissionAddRequestList.add(subUserProjectCommissionAddRequest); subUserProjectCommissionAddRequestList.add(subUserProjectCommissionAddRequest);
} }
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(subUserProjectCommissionAddRequestList, SubUserProjectCommission.class); List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(subUserProjectCommissionAddRequestList, SubUserProjectCommission.class);
subUserProjectCommissionService.saveBatch(subUserProjectCommissions); // subUserProjectCommissionService.saveBatch(subUserProjectCommissions);
subUserProjectCommissions.addAll(userProjectCommissions);
return ResultUtils.success(true); // 对抽佣记录进行排序
} projectCommissionService.sortSubProjectCommissions(subUserProjectCommissions);
// 设置抽佣比例和单价
/**
* web端管理员根据id修改项目明细信息
* @param projectDetailUpdateRequest 项目明细更新请求体
* @return 是否更新成功
*/
@PostMapping("update")
@Operation(summary = "web端管理员更新项目明细", description = "参数项目明细更新请求体权限管理员方法名updateProjectDetail")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "项目明细管理", content = "web端管理员根据id修改项目明细信息")
public BaseResponse<Boolean> updateProjectDetail(@Valid @RequestBody ProjectDetailUpdateRequest projectDetailUpdateRequest) {
// 更新项目明细的结算价格
Long projectDetailId = projectDetailUpdateRequest.getId();
ProjectDetail sourceProjectDetail = projectDetailService.getById(projectDetailId);
ProjectDetail projectDetail = commonService.copyProperties(projectDetailUpdateRequest, ProjectDetail.class);
// 1.更新项目明细的结算价格
projectDetailService.updateById(projectDetail);
// 更新项目的价格
Long projectId = projectDetail.getProjectId();
Project project = projectService.getById(projectId);
project.setProjectPrice(project.getProjectPrice().subtract(sourceProjectDetail.getProjectSettlementPrice()).add(projectDetail.getProjectSettlementPrice()));
projectService.updateById(project);
// 2.更新抽佣比例(如果抽佣比例比原来小)
List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetail.getId(), subUserProjectCommissionService);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate();
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
if (currentCommissionRate.compareTo(maxCommissionRate) > 0) subUserProjectCommission.setCurrentCommissionRate(maxCommissionRate);
}
// 将下级用户项目明细抽佣列表根据父级用户id进行排序升序
subUserProjectCommissionList.sort(Comparator.comparing(SubUserProjectCommission::getUserId));
// 更新下级用户项目明细抽佣表记录
BigDecimal projectSettlementPrice = projectDetail.getProjectSettlementPrice();
BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
// 封装Map集合下级用户id下级用户单价 // 封装Map集合下级用户id下级用户单价
Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>(); Map<Long, BigDecimal> subUserProjectCommissionMap = new HashMap<>();
// 获取小程序用户的根用户 for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissions) {
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService);
UserInfo rootUserInfo = userInfoList.get(0);
// 存储根用户的单价
subUserUnitPriceMap.put(rootUserInfo.getId(), projectSettlementPrice);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// 记录上级用户的对下级用户的抽佣比例
BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate();
Long userId = subUserProjectCommission.getUserId(); Long userId = subUserProjectCommission.getUserId();
Long subUserId = subUserProjectCommission.getSubUserId(); Long subUserId = subUserProjectCommission.getSubUserId();
// 获取当前用户的单价,并将当前记录修改为当前用户的单价 // 设置抽佣比例
BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); BigDecimal uniteRate = userCommissionRateMap.get(userId);
subUserProjectCommission.setMyUnitPrice(userUnitPrice); subUserProjectCommission.setCurrentCommissionRate(uniteRate);
// 计算下级用户的单价 // 设置单价
BigDecimal subUserUnitPrice = userUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate)); BigDecimal myUnitPrice = subUserProjectCommissionMap.get(userId);
// 如果下级用户的单价小于项目明细最小结算价格,则设置下级用户的单价为项目明细最小结算价格 if (myUnitPrice == null) myUnitPrice = subUserProjectCommission.getMyUnitPrice();
if (subUserUnitPrice.compareTo(projectMinSettlementPrice) < 0) subUserUnitPrice = projectMinSettlementPrice; subUserProjectCommission.setMyUnitPrice(myUnitPrice);
// 存储下级用户的单价 BigDecimal subUserUnitPrice = projectCommissionService.calculateFinalPrice(myUnitPrice, uniteRate);
subUserUnitPriceMap.put(subUserId, subUserUnitPrice); if (subUserId != -1L) subUserProjectCommissionMap.put(subUserId, subUserUnitPrice);
} }
// 更新下级用户项目明细抽佣表记录
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList); long startTime = System.currentTimeMillis();
// 更新用户项目明细抽佣表记录
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetail.getId(), projectCommissionService); // 批量更新下级用户项目明细抽佣记录
for (ProjectCommission projectCommission : projectCommissionList) { List<SubUserProjectCommission> subProjectCommissions = subUserProjectCommissions.stream()
Long userId = projectCommission.getUserId(); .filter(subUserProjectCommission -> subUserProjectCommission.getSubUserId() != -1L).toList();
BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); subUserProjectCommissionService.saveBatch(subProjectCommissions);
projectCommission.setMyUnitPrice(userUnitPrice); // 批量更新用户项目明细抽佣记录
}
projectCommissionService.updateBatchById(projectCommissionList); List<SubUserProjectCommission> projectCommissionList = subUserProjectCommissions.stream()
.filter(subUserProjectCommission -> subUserProjectCommission.getSubUserId() == -1L).toList();
List<ProjectCommission> commissionList = commonService.convertList(projectCommissionList, ProjectCommission.class);
projectCommissionService.saveBatch(commissionList);
// 获取结束时间戳
long endTime = System.currentTimeMillis();
// 计算执行时间
long executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
return ResultUtils.success(true); return ResultUtils.success(true);
} }
//
// /**
// * web端管理员根据id修改项目明细信息
// * @param projectDetailUpdateRequest 项目明细更新请求体
// * @return 是否更新成功
// */
// @PostMapping("update")
// @Operation(summary = "web端管理员更新项目明细", description = "参数项目明细更新请求体权限管理员方法名updateProjectDetail")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "项目明细管理", content = "web端管理员根据id修改项目明细信息")
// public BaseResponse<Boolean> updateProjectDetail(@Valid @RequestBody ProjectDetailUpdateRequest projectDetailUpdateRequest) {
//
// // 更新项目明细的结算价格
// Long projectDetailId = projectDetailUpdateRequest.getId();
// ProjectDetail sourceProjectDetail = projectDetailService.getById(projectDetailId);
// ProjectDetail projectDetail = commonService.copyProperties(projectDetailUpdateRequest, ProjectDetail.class);
// // 1.更新项目明细的结算价格
// projectDetailService.updateById(projectDetail);
// // 更新项目的价格
// Long projectId = projectDetail.getProjectId();
// Project project = projectService.getById(projectId);
// project.setProjectPrice(project.getProjectPrice().subtract(sourceProjectDetail.getProjectSettlementPrice()).add(projectDetail.getProjectSettlementPrice()));
// projectService.updateById(project);
// // 2.更新抽佣比例(如果抽佣比例比原来小)
// List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetail.getId(), subUserProjectCommissionService);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate();
// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
// if (currentCommissionRate.compareTo(maxCommissionRate) > 0) subUserProjectCommission.setCurrentCommissionRate(maxCommissionRate);
// }
// // 将下级用户项目明细抽佣列表根据父级用户id进行排序升序
// subUserProjectCommissionList.sort(Comparator.comparing(SubUserProjectCommission::getUserId));
// // 更新下级用户项目明细抽佣表记录
// BigDecimal projectSettlementPrice = projectDetail.getProjectSettlementPrice();
// BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
// // 封装Map集合下级用户id下级用户单价
// Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>();
// // 获取小程序用户的根用户
// List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService);
// UserInfo rootUserInfo = userInfoList.get(0);
// // 存储根用户的单价
// subUserUnitPriceMap.put(rootUserInfo.getId(), projectSettlementPrice);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// // 记录上级用户的对下级用户的抽佣比例
// BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate();
// Long userId = subUserProjectCommission.getUserId();
// Long subUserId = subUserProjectCommission.getSubUserId();
// // 获取当前用户的单价,并将当前记录修改为当前用户的单价
// BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId);
// subUserProjectCommission.setMyUnitPrice(userUnitPrice);
// // 计算下级用户的单价
// BigDecimal subUserUnitPrice = userUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate));
// // 如果下级用户的单价小于项目明细最小结算价格,则设置下级用户的单价为项目明细最小结算价格
// if (subUserUnitPrice.compareTo(projectMinSettlementPrice) < 0) subUserUnitPrice = projectMinSettlementPrice;
// // 存储下级用户的单价
// subUserUnitPriceMap.put(subUserId, subUserUnitPrice);
// }
// // 更新下级用户项目明细抽佣表记录
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// // 更新用户项目明细抽佣表记录
// List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetail.getId(), projectCommissionService);
// for (ProjectCommission projectCommission : projectCommissionList) {
// Long userId = projectCommission.getUserId();
// BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId);
// projectCommission.setMyUnitPrice(userUnitPrice);
// }
// projectCommissionService.updateBatchById(projectCommissionList);
//
// return ResultUtils.success(true);
// }
/** /**
* web端管理员根据id删除项目明细 * web端管理员根据id删除项目明细

View File

@ -114,12 +114,7 @@ public class PromoCodeController {
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "推广码管理", content = "web端管理员批量删除推广码") @SysLog(title = "推广码管理", content = "web端管理员批量删除推广码")
public BaseResponse<Boolean> delBatchPromoCode(@Valid @RequestBody CommonBatchRequest commonBatchRequest) { public BaseResponse<Boolean> delBatchPromoCode(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
List<Long> ids = commonBatchRequest.getIds(); promoCodeService.delBatchPromoCode(commonBatchRequest);
LambdaQueryWrapper<PromoCode> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(PromoCode::getId, ids).eq(PromoCode::getPromoCodeStatus, true);
List<PromoCode> promoCodeList = promoCodeService.list(lambdaQueryWrapper);
ThrowUtils.throwIf(promoCodeList.size() > 0, ErrorCode.OPERATION_ERROR, "当前推广码正在使用中,无法删除");
promoCodeService.removeByIds(ids);
return ResultUtils.success(true); return ResultUtils.success(true);
} }

View File

@ -75,6 +75,7 @@ public class ProjectSettlementController {
/** /**
* 小程序端用户根据推广码申请记录id查询结算记录 * 小程序端用户根据推广码申请记录id查询结算记录
* @param commonRequest 项目结算记录添加请求体 * @param commonRequest 项目结算记录添加请求体

View File

@ -5,19 +5,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog; import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant; import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyAddRequest; import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyAddRequest;
import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyQueryRequest; import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyQueryRequest;
import com.greenorange.promotion.model.entity.FundsChange; import com.greenorange.promotion.model.entity.*;
import com.greenorange.promotion.model.entity.UserMainInfo;
import com.greenorange.promotion.model.entity.WithdrawalApply;
import com.greenorange.promotion.model.vo.fundsChange.FundsChangeVO; import com.greenorange.promotion.model.vo.fundsChange.FundsChangeVO;
import com.greenorange.promotion.model.vo.fundsChange.FundsItemVO; import com.greenorange.promotion.model.vo.fundsChange.FundsItemVO;
import com.greenorange.promotion.model.vo.userAccount.UserAccountConditionVO;
import com.greenorange.promotion.model.vo.withdrawalApply.WithdrawalApplyVO; import com.greenorange.promotion.model.vo.withdrawalApply.WithdrawalApplyVO;
import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.settle.FundsChangeService; import com.greenorange.promotion.service.settle.FundsChangeService;
import com.greenorange.promotion.service.settle.UserAccountService;
import com.greenorange.promotion.service.settle.WithdrawalApplyService; import com.greenorange.promotion.service.settle.WithdrawalApplyService;
import com.greenorange.promotion.service.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService; import com.greenorange.promotion.service.userInfo.UserMainInfoService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -32,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collections;
import java.util.List; import java.util.List;
@ -56,6 +60,34 @@ public class WithdrawalApplyController {
@Resource @Resource
private UserMainInfoService userMainInfoService; private UserMainInfoService userMainInfoService;
@Resource
private UserInfoService userInfoService;
@Resource
private UserAccountService userAccountService;
/**
* 小程序端用户查询账户提现状况
* @return 提现申请记录id
*/
@PostMapping("query/condition")
@Operation(summary = "小程序端用户查询账户提现状况", description = "参数权限管理员方法名queryWithdrawalCondition")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<UserAccountConditionVO> queryWithdrawalCondition(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
LambdaQueryWrapper<UserMainInfo> userMainInfoLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserMainInfo::getUserId, userId, userMainInfoService);
UserMainInfo userMainInfo = userMainInfoService.getOne(userMainInfoLambdaQueryWrapper);
LambdaQueryWrapper<UserAccount> userAccountLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserAccount::getUserId, userId, userAccountService);
UserAccount userAccount = userAccountService.getOne(userAccountLambdaQueryWrapper);
String bankCardNumber = userAccount == null ? "" : userAccount.getBankCardNumber();
UserAccountConditionVO userAccountConditionVO = UserAccountConditionVO.builder()
.currentBalance(userMainInfo.getCurrentBalance())
.bankCardNumber(bankCardNumber)
.build();
return ResultUtils.success(userAccountConditionVO);
}
/** /**
* 小程序端用户申请提现 * 小程序端用户申请提现
@ -68,12 +100,35 @@ public class WithdrawalApplyController {
// @SysLog(title = "提现申请记录管理", content = "小程序端用户申请提现") // @SysLog(title = "提现申请记录管理", content = "小程序端用户申请提现")
public BaseResponse<Long> addWithdrawalApply(@Valid @RequestBody WithdrawalApplyAddRequest withdrawalApplyAddRequest, HttpServletRequest request) { public BaseResponse<Long> addWithdrawalApply(@Valid @RequestBody WithdrawalApplyAddRequest withdrawalApplyAddRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); Long userId = (Long) request.getAttribute("userId");
LambdaQueryWrapper<UserAccount> userAccountLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserAccount::getUserId, userId, userAccountService);
UserAccount userAccount = userAccountService.getOne(userAccountLambdaQueryWrapper);
ThrowUtils.throwIf(userAccount == null, ErrorCode.OPERATION_ERROR, "请先绑定银行卡");
BigDecimal withdrawnAmount = withdrawalApplyAddRequest.getWithdrawnAmount(); BigDecimal withdrawnAmount = withdrawalApplyAddRequest.getWithdrawnAmount();
WithdrawalApply withdrawalApply = WithdrawalApply.builder() WithdrawalApply withdrawalApply = WithdrawalApply.builder()
.withdrawnAmount(withdrawnAmount) .withdrawnAmount(withdrawnAmount)
.cardHolder(userAccount.getCardHolder())
.idCardNumber(userAccount.getIdCardNumber())
.phoneNumber(userAccount.getPhoneNumber())
.bankCardNumber(userAccount.getBankCardNumber())
.openBank(userAccount.getOpenBank())
.userId(userId) .userId(userId)
.build(); .build();
withdrawalApplyService.save(withdrawalApply); withdrawalApplyService.save(withdrawalApply);
// 修改个人主要信息
LambdaQueryWrapper<UserMainInfo> userMainInfoLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserMainInfo::getUserId, userId, userMainInfoService);
UserMainInfo userMainInfo = userMainInfoService.getOne(userMainInfoLambdaQueryWrapper);
userMainInfo.setWithdrawalAmount(userMainInfo.getWithdrawalAmount().add(withdrawnAmount));
userMainInfo.setCurrentBalance(userMainInfo.getCurrentBalance().subtract(withdrawnAmount));
userMainInfoService.updateById(userMainInfo);
// 添加资金明细记录
FundsChange fundsChange = FundsChange.builder()
.projectName("用户提现")
.changeAmount(withdrawnAmount.negate())
.currentAmount(userMainInfo.getCurrentBalance())
.userId(userId)
.projectSettlementId(0L)
.build();
fundsChangeService.save(fundsChange);
return ResultUtils.success(withdrawalApply.getId()); return ResultUtils.success(withdrawalApply.getId());
} }
@ -90,6 +145,7 @@ public class WithdrawalApplyController {
Long userId = (Long) request.getAttribute("userId"); Long userId = (Long) request.getAttribute("userId");
List<WithdrawalApply> withdrawalApplyList = commonService.findByFieldEqTargetField(WithdrawalApply::getUserId, userId, withdrawalApplyService); List<WithdrawalApply> withdrawalApplyList = commonService.findByFieldEqTargetField(WithdrawalApply::getUserId, userId, withdrawalApplyService);
List<WithdrawalApplyVO> withdrawalApplyVOS = commonService.convertList(withdrawalApplyList, WithdrawalApplyVO.class); List<WithdrawalApplyVO> withdrawalApplyVOS = commonService.convertList(withdrawalApplyList, WithdrawalApplyVO.class);
Collections.reverse(withdrawalApplyVOS);
return ResultUtils.success(withdrawalApplyVOS); return ResultUtils.success(withdrawalApplyVOS);
} }
@ -104,12 +160,12 @@ public class WithdrawalApplyController {
// @SysLog(title = "提现申请记录管理", content = "小程序端用户查询资金变动记录") // @SysLog(title = "提现申请记录管理", content = "小程序端用户查询资金变动记录")
public BaseResponse<FundsItemVO> queryFundsChangeByUserId(HttpServletRequest request) { public BaseResponse<FundsItemVO> queryFundsChangeByUserId(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); Long userId = (Long) request.getAttribute("userId");
LambdaQueryWrapper<UserMainInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserMainInfo> userMainInfoLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserMainInfo::getUserId, userId, userMainInfoService);
lambdaQueryWrapper.eq(UserMainInfo::getUserId, userId); UserMainInfo userMainInfo = userMainInfoService.getOne(userMainInfoLambdaQueryWrapper);
UserMainInfo userMainInfo = userMainInfoService.getOne(lambdaQueryWrapper);
FundsItemVO fundsItemVO = commonService.copyProperties(userMainInfo, FundsItemVO.class); FundsItemVO fundsItemVO = commonService.copyProperties(userMainInfo, FundsItemVO.class);
List<FundsChange> fundsChangeList = commonService.findByFieldEqTargetField(FundsChange::getUserId, userId, fundsChangeService); List<FundsChange> fundsChangeList = commonService.findByFieldEqTargetField(FundsChange::getUserId, userId, fundsChangeService);
List<FundsChangeVO> fundsChangeVOS = commonService.convertList(fundsChangeList, FundsChangeVO.class); List<FundsChangeVO> fundsChangeVOS = commonService.convertList(fundsChangeList, FundsChangeVO.class);
Collections.reverse(fundsChangeVOS);
fundsItemVO.setFundsChangeVOList(fundsChangeVOS); fundsItemVO.setFundsChangeVOList(fundsChangeVOS);
return ResultUtils.success(fundsItemVO); return ResultUtils.success(fundsItemVO);
} }

View File

@ -0,0 +1,218 @@
package com.greenorange.promotion.controller.userInfo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.model.dto.advancementApply.*;
import com.greenorange.promotion.model.entity.AdvancementApply;
import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.model.enums.ReviewStatusEnum;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyApproveVO;
import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyVOPlus;
import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.userInfo.AdvancementApplyService;
import com.greenorange.promotion.service.userInfo.UserInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.UUID;
/**
* 晋升申请 控制器
*/
@RestController
@RequestMapping("advancementApply")
@Slf4j
@Tag(name = "晋升申请模块")
public class AdvancementApplyController {
@Resource
private AdvancementApplyService advancementApplyService;
@Resource
private CommonService commonService;
@Resource
private UserInfoService userInfoService;
/**
* 小程序段用户添加晋升申请记录
* @param advancementApplyAddRequest 晋升申请记录添加请求体
* @return 申请记录查询凭据
*/
@PostMapping("add")
@Operation(summary = "小程序段用户添加晋升申请记录", description = "参数晋升申请添加请求体权限管理员方法名addAdvancementApply")
@SysLog(title = "晋升申请管理", content = "小程序段用户添加晋升申请记录")
public BaseResponse<String> addAdvancementApply(@Valid @RequestBody AdvancementApplyAddRequest advancementApplyAddRequest) {
String phone = advancementApplyAddRequest.getPhone();
String verificationCode = advancementApplyAddRequest.getVerificationCode();
// 校验用户手机号和验证码
userInfoService.checkPhoneAndVerificationCode(phone, verificationCode, UserRoleEnum.STAFF);
AdvancementApply advancementApply = commonService.copyProperties(advancementApplyAddRequest, AdvancementApply.class);
advancementApply.setCredential(UUID.randomUUID().toString());
advancementApplyService.save(advancementApply);
return ResultUtils.success(advancementApply.getCredential());
}
/**
* 小程序端用户撤销晋升申请记录
* @param commonRequest 晋升申请记录id
* @return 是否更新成功
*/
@PostMapping("modify/status")
@Operation(summary = "小程序端用户撤销晋升申请记录", description = "参数晋升申请更新请求体权限管理员方法名revokeAdvancementApply")
@SysLog(title = "晋升申请管理", content = "小程序端用户撤销晋升申请记录")
public BaseResponse<Boolean> revokeAdvancementApply(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
LambdaUpdateWrapper<AdvancementApply> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AdvancementApply::getId, id).set(AdvancementApply::getReviewStatus, ReviewStatusEnum.WITHDRAWN.getValue());
advancementApplyService.update(updateWrapper);
return ResultUtils.success(true);
}
/**
* 小程序端用户根据id修改晋升申请记录信息
* @param advancementApplyUpdateRequest 晋升申请更新请求体
* @return 是否更新成功
*/
@PostMapping("update")
@Operation(summary = "小程序端用户根据id修改晋升申请记录信息", description = "参数晋升申请更新请求体权限管理员方法名updateAdvancementApply")
@SysLog(title = "晋升申请管理", content = "小程序端用户根据id修改晋升申请记录信息")
public BaseResponse<Boolean> updateAdvancementApply(@Valid @RequestBody AdvancementApplyUpdateRequest advancementApplyUpdateRequest) {
String phone = advancementApplyUpdateRequest.getPhone();
String verificationCode = advancementApplyUpdateRequest.getVerificationCode();
// 校验用户手机号和验证码
userInfoService.checkPhoneAndVerificationCode(phone, verificationCode, UserRoleEnum.STAFF);
AdvancementApply advancementApply = commonService.copyProperties(advancementApplyUpdateRequest, AdvancementApply.class);
advancementApplyService.updateById(advancementApply);
return ResultUtils.success(true);
}
/**
* 小程序端用户根据凭证credential查询晋升申请记录
* @param commonStringRequest 查询凭证
* @return 晋升申请记录信息
*/
@PostMapping("query/credential")
@Operation(summary = "小程序端用户根据凭证credential查询晋升申请记录", description = "参数晋升申请更新请求体权限管理员方法名queryAdvancementApplyByCredential")
@SysLog(title = "晋升申请管理", content = "小程序端用户根据凭证credential查询晋升申请记录")
public BaseResponse<AdvancementApplyApproveVO> queryAdvancementApplyByCredential(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String credential = commonStringRequest.getTemplateString();
LambdaQueryWrapper<AdvancementApply> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(AdvancementApply::getCredential, credential);
AdvancementApply advancementApply = advancementApplyService.getOne(lambdaQueryWrapper);
AdvancementApplyApproveVO advancementApplyApproveVO = commonService.copyProperties(advancementApply, AdvancementApplyApproveVO.class);
String reviewStatus = advancementApply.getReviewStatus();
ReviewStatusEnum reviewStatusEnum = ReviewStatusEnum.getEnumByValue(reviewStatus);
// 如果审核通过,填充账号密码
if (ReviewStatusEnum.APPROVED.equals(reviewStatusEnum)) {
Long userId = advancementApply.getUserId();
UserInfo userInfo = userInfoService.getById(userId);
advancementApplyApproveVO.setUserAccount(userInfo.getUserAccount());
advancementApplyApproveVO.setUserPassword(userInfo.getUserPassword());
}
// 如果审核拒绝,填充拒绝理由
if (ReviewStatusEnum.REJECTED.equals(reviewStatusEnum)) {
advancementApplyApproveVO.setRejectReason(advancementApply.getRejectReason());
}
return ResultUtils.success(advancementApplyApproveVO);
}
/**
* web端管理员批准用户的晋升申请
* @param advancementApplyApproveRequest 晋升申请等信息
* @return 晋升用户的账号密码
*/
@PostMapping("approve")
@Operation(summary = "web端管理员批准用户的晋升申请", description = "参数晋升申请id权限管理员方法名approveAdvancementApply")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "晋升申请管理", content = "web端管理员批准用户的晋升申请")
public BaseResponse<Boolean> approveAdvancementApply(@Valid @RequestBody AdvancementApplyApproveRequest advancementApplyApproveRequest) {
userInfoService.staffUserInfoMiniRegister(advancementApplyApproveRequest);
return ResultUtils.success(true);
}
/**
* web端管理员拒绝晋升申请
* @param advancementApplyRejectRequest 晋升申请拒绝请求体
* @return 晋升申请信息
*/
@PostMapping("reject")
@Operation(summary = "web端管理员拒绝晋升申请", description = "参数晋升申请拒绝请求体权限管理员方法名rejectAdvancementApply")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "晋升申请管理", content = "web端管理员拒绝晋升申请")
public BaseResponse<Boolean> rejectAdvancementApply(@Valid @RequestBody AdvancementApplyRejectRequest advancementApplyRejectRequest) {
Long applyId = advancementApplyRejectRequest.getApplyId();
String rejectReason = advancementApplyRejectRequest.getRejectReason();
LambdaUpdateWrapper<AdvancementApply> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AdvancementApply::getId, applyId)
.set(AdvancementApply::getReviewStatus, ReviewStatusEnum.REJECTED.getValue())
.set(AdvancementApply::getRejectReason, rejectReason);
advancementApplyService.update(updateWrapper);
return ResultUtils.success(true);
}
/**
* web端管理员根据id查询晋升申请
* @param commonRequest 晋升申请id
* @return 晋升申请信息
*/
@PostMapping("queryById")
@Operation(summary = "web端管理员根据id查询晋升申请", description = "参数晋升申请id权限管理员方法名queryAdvancementApplyById")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "晋升申请管理", content = "web端管理员根据id查询晋升申请")
public BaseResponse<AdvancementApplyVOPlus> queryAdvancementApplyById(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
AdvancementApply advancementApply = advancementApplyService.getById(id);
AdvancementApplyVOPlus advancementApplyVOPlus = commonService.copyProperties(advancementApply, AdvancementApplyVOPlus.class);
return ResultUtils.success(advancementApplyVOPlus);
}
/**
* Web端管理员分页查询晋升申请
* @param advancementApplyQueryRequest 晋升申请查询请求体
* @return 晋升申请列表
*/
@PostMapping("page")
@Operation(summary = "Web端管理员分页查询晋升申请", description = "参数晋升申请查询请求体权限管理员方法名listAdvancementApplyByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "晋升申请管理", content = "Web端管理员分页查询晋升申请")
public BaseResponse<Page<AdvancementApplyVO>> listAdvancementApplyByPage(@Valid @RequestBody AdvancementApplyQueryRequest advancementApplyQueryRequest) {
long current = advancementApplyQueryRequest.getCurrent();
long pageSize = advancementApplyQueryRequest.getPageSize();
QueryWrapper<AdvancementApply> queryWrapper = advancementApplyService.getQueryWrapper(advancementApplyQueryRequest);
Page<AdvancementApply> page = advancementApplyService.page(new Page<>(current, pageSize), queryWrapper);
List<AdvancementApply> advancementApplyList = page.getRecords();
List<AdvancementApplyVO> advancementApplyVOList = commonService.convertList(advancementApplyList, AdvancementApplyVO.class);
Page<AdvancementApplyVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(advancementApplyVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);
}
}

View File

@ -13,6 +13,7 @@ import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest; import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountQueryRequest; import com.greenorange.promotion.model.dto.userAccount.UserAccountQueryRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest; import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
import com.greenorange.promotion.model.entity.ProjectSettlement;
import com.greenorange.promotion.model.entity.UserAccount; import com.greenorange.promotion.model.entity.UserAccount;
import com.greenorange.promotion.model.vo.userAccount.UserAccountVO; import com.greenorange.promotion.model.vo.userAccount.UserAccountVO;
import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.common.CommonService;
@ -58,10 +59,7 @@ public class UserAccountController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "用户账户管理", content = "小程序端用户添加用户账户") // @SysLog(title = "用户账户管理", content = "小程序端用户添加用户账户")
public BaseResponse<Boolean> addUserAccount(@Valid @RequestBody UserAccountAddRequest userAccountAddRequest, HttpServletRequest request) { public BaseResponse<Boolean> addUserAccount(@Valid @RequestBody UserAccountAddRequest userAccountAddRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); userAccountService.addUserAccount(userAccountAddRequest, request);
UserAccount userAccount = commonService.copyProperties(userAccountAddRequest, UserAccount.class);
userAccount.setUserId(userId);
userAccountService.save(userAccount);
return ResultUtils.success(true); return ResultUtils.success(true);
} }
@ -75,10 +73,7 @@ public class UserAccountController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "用户账户管理", content = "小程序端用户根据id修改用户账户信息") // @SysLog(title = "用户账户管理", content = "小程序端用户根据id修改用户账户信息")
public BaseResponse<Boolean> updateUserAccount(@Valid @RequestBody UserAccountUpdateRequest userAccountUpdateRequest, HttpServletRequest request) { public BaseResponse<Boolean> updateUserAccount(@Valid @RequestBody UserAccountUpdateRequest userAccountUpdateRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); userAccountService.updateUserAccount(userAccountUpdateRequest, request);
UserAccount userAccount = commonService.copyProperties(userAccountUpdateRequest, UserAccount.class);
userAccount.setUserId(userId);
userAccountService.updateById(userAccount);
return ResultUtils.success(true); return ResultUtils.success(true);
} }

View File

@ -17,6 +17,7 @@ import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.model.dto.userInfo.*; import com.greenorange.promotion.model.dto.userInfo.*;
import com.greenorange.promotion.model.entity.UserInfo; import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.model.entity.UserMainInfo; import com.greenorange.promotion.model.entity.UserMainInfo;
import com.greenorange.promotion.model.vo.userInfo.SuperUserInfoVO;
import com.greenorange.promotion.model.vo.userInfo.UserInfoVO; import com.greenorange.promotion.model.vo.userInfo.UserInfoVO;
import com.greenorange.promotion.model.vo.userMainInfo.UserMainInfoVO; import com.greenorange.promotion.model.vo.userMainInfo.UserMainInfoVO;
import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.common.CommonService;
@ -406,6 +407,8 @@ public class UserInfoController {
} }
// /** // /**
// * (小程序端)查询当前用户到根节点的userId路径 // * (小程序端)查询当前用户到根节点的userId路径
// * @param commonRequest 用户id // * @param commonRequest 用户id
@ -423,6 +426,23 @@ public class UserInfoController {
/**
* 小程序端用户获取上级用户信息
* @return 上级用户信息
*/
@PostMapping("getSuper")
@Operation(summary = "小程序端用户获取上级用户信息", description = "参数用户表查询请求体权限管理员boss, admin),方法名:queryUserInfoById")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<SuperUserInfoVO> getSuperUserInfo(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
UserInfo userInfo = userInfoService.getById(userId);
Long parentUserId = userInfo.getParentUserId();
if (parentUserId != 0) {
userInfo = userInfoService.getById(parentUserId);
}
SuperUserInfoVO superUserInfoVO = commonService.copyProperties(userInfo, SuperUserInfoVO.class);
return ResultUtils.success(superUserInfoVO);
}

View File

@ -1,17 +1,12 @@
package com.greenorange.promotion.controller.wechat; package com.greenorange.promotion.controller.wechat;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.config.WxAccessToken; import com.greenorange.promotion.config.WxAccessToken;
import com.greenorange.promotion.constant.UserConstant; import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.CommonStringRequest; import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.service.wechat.WechatGetQrcodeService; import com.greenorange.promotion.service.wechat.WechatGetQrcodeService;
import com.greenorange.promotion.utils.QRCodeUtil;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -22,15 +17,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO; import java.io.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Slf4j @Slf4j
@ -78,6 +65,24 @@ public class WechatGetQrcodeController {
} }
/**
* 微信小程序获取课程码
* @return
* @throws IOException
*/
@Hidden
@PostMapping("/get/course/qrcode")
@Operation(summary = "微信小程序获取课程码", description = "参数:无, 权限:所有人, 方法名getCourseQrcode")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<String> getCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception {
String view = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request);
return ResultUtils.success(view);
}

View File

@ -50,16 +50,25 @@ public class GlobalExceptionHandler {
// 处理参数绑定失败的异常 // 处理参数绑定失败的异常
@ExceptionHandler(MethodArgumentNotValidException.class) @ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResponse<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { public BaseResponse<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
StringBuilder errors = new StringBuilder(); // StringBuilder errors = new StringBuilder();
// 按字段名排序,确保每次返回的顺序一致 // // 按字段名排序,确保每次返回的顺序一致
e.getBindingResult().getFieldErrors().stream() // e.getBindingResult().getFieldErrors().stream()
.sorted(Comparator.comparing(FieldError::getField)) // 按字段名排序 // .sorted(Comparator.comparing(FieldError::getField)) // 按字段名排序
.forEach(fieldError -> errors.append("参数: ") // .forEach(fieldError -> errors.append("参数: ")
.append(fieldError.getField()) // .append(fieldError.getField())
.append(" | 错误: ") // .append(" | 错误: ")
.append(fieldError.getDefaultMessage()) // .append(fieldError.getDefaultMessage())
.append("; ")); // .append("; "));
return ResultUtils.error(ErrorCode.PARAMS_ERROR, errors.toString()); // return ResultUtils.error(ErrorCode.PARAMS_ERROR, errors.toString());
// 按字段名排序,取第一个错误的 defaultMessage
String msg = e.getBindingResult()
.getFieldErrors().stream()
.sorted(Comparator.comparing(FieldError::getField))
.map(FieldError::getDefaultMessage)
.findFirst()
.orElse("参数校验失败");
return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
} }

View File

@ -15,9 +15,9 @@ import java.util.*;
public class Generator { public class Generator {
// 数据源配置 // 数据源配置
private static final String DATASOURCE_URL = "jdbc:mysql://1.94.237.210:3306/qingcheng?serverTimezone=Asia/Shanghai"; private static final String DATASOURCE_URL = "jdbc:mysql://27.30.77.229:3306/qingcheng_dev?serverTimezone=Asia/Shanghai";
private static final String USERNAME = "qingcheng"; private static final String USERNAME = "qingcheng";
private static final String PASSWORD = "Qc@123456"; private static final String PASSWORD = "Qc@8ls2jf";
// 输出路径 // 输出路径
private static final String OUTPUT_PATH = System.getProperty("user.dir"); private static final String OUTPUT_PATH = System.getProperty("user.dir");
@ -27,13 +27,13 @@ public class Generator {
// 作者 // 作者
private static final String AUTHOR = "chenxinzhi"; private static final String AUTHOR = "chenxinzhi";
// 表注释 // 表注释
private static final String TABLE_COMMENT = "用户账户"; private static final String TABLE_COMMENT = "晋升申请";
// 实体类名 // 实体类名
private static final String ENTITY_NAME = "UserAccount"; private static final String ENTITY_NAME = "AdvancementApply";
// 表名 // 表名
private static final String TABLE_NAME = "user_account"; private static final String TABLE_NAME = "advancement_apply";
// 实体类属性名 // 实体类属性名
private static final String ENTITY_NAME_LOWER = "userAccount"; private static final String ENTITY_NAME_LOWER = "advancementApply";
// 父包名 // 父包名
private static final String PARENT_PATH = "com.greenorange.promotion"; private static final String PARENT_PATH = "com.greenorange.promotion";

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.AdvancementApply;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【advancement_apply(晋升申请表)】的数据库操作Mapper
* @createDate 2025-06-29 12:39:54
* @Entity com.greenorange.promotion.model.entity.AdvancementApply
*/
public interface AdvancementApplyMapper extends BaseMapper<AdvancementApply> {
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.CourseChapter;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【course_chapter(课程章节表)】的数据库操作Mapper
* @createDate 2025-06-23 18:30:28
* @Entity com.greenorange.promotion.model.entity.CourseChapter
*/
public interface CourseChapterMapper extends BaseMapper<CourseChapter> {
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.Course;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【course(课程表)】的数据库操作Mapper
* @createDate 2025-06-23 18:29:49
* @Entity com.greenorange.promotion.model.entity.Course
*/
public interface CourseMapper extends BaseMapper<Course> {
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.CourseOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【course_order(课程订单表)】的数据库操作Mapper
* @createDate 2025-06-23 18:31:13
* @Entity com.greenorange.promotion.model.entity.CourseOrder
*/
public interface CourseOrderMapper extends BaseMapper<CourseOrder> {
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.CourseQrcodeApply;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【course_qrcode_apply(课程推广码申请表)】的数据库操作Mapper
* @createDate 2025-06-24 22:10:39
* @Entity com.greenorange.promotion.model.entity.CourseQrcodeApply
*/
public interface CourseQrcodeApplyMapper extends BaseMapper<CourseQrcodeApply> {
}

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.ProjectCommission; import com.greenorange.promotion.model.entity.ProjectCommission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/** /**
* @author 35880 * @author 35880
@ -11,6 +13,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface ProjectCommissionMapper extends BaseMapper<ProjectCommission> { public interface ProjectCommissionMapper extends BaseMapper<ProjectCommission> {
@Update("${sql}")
void executeUpdate(@Param("sql") String sql);
} }

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.PromoRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【promo_record(推广记录表)】的数据库操作Mapper
* @createDate 2025-06-23 18:31:45
* @Entity com.greenorange.promotion.model.entity.PromoRecord
*/
public interface PromoRecordMapper extends BaseMapper<PromoRecord> {
}

View File

@ -0,0 +1,18 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.RakeReward;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【rake_reward(课程抽成记录表)】的数据库操作Mapper
* @createDate 2025-06-23 18:32:46
* @Entity com.greenorange.promotion.model.entity.RakeReward
*/
public interface RakeRewardMapper extends BaseMapper<RakeReward> {
}

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.SubUserProjectCommission; import com.greenorange.promotion.model.entity.SubUserProjectCommission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/** /**
* @author 35880 * @author 35880
@ -11,6 +13,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface SubUserProjectCommissionMapper extends BaseMapper<SubUserProjectCommission> { public interface SubUserProjectCommissionMapper extends BaseMapper<SubUserProjectCommission> {
@Update("${sql}")
void executeUpdate(@Param("sql") String sql);
} }

View File

@ -0,0 +1,54 @@
package com.greenorange.promotion.model.dto.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 晋升申请添加请求体
*/
@Data
@Schema(description = "晋升申请添加请求体", requiredProperties = {
"name",
"verificationCode"
})
public class AdvancementApplyAddRequest implements Serializable {
/**
* 申请人姓名
*/
@NotBlank(message = "申请人姓名不能为空")
@Schema(description = "申请人姓名", example = "张三")
private String name;
/**
* 申请人手机号
*/
@NotBlank(message = "申请人手机号不能为空")
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 验证码
*/
@NotBlank(message = "验证码不能为空")
@Schema(description = "验证码", example = "666999")
private String verificationCode;
/**
* 简历(view值)
*/
@NotBlank(message = "简历(view值)不能为空")
@Schema(description = "简历(view值)", example = "D89SKF3N")
private String resume;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,49 @@
package com.greenorange.promotion.model.dto.advancementApply;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 晋升申请批准请求体
*/
@Data
@Schema(description = "晋升申请批准请求体", requiredProperties = {
"applyId",
"invitationCode",
"userRole"
})
public class AdvancementApplyApproveRequest implements Serializable {
/**
* 晋升申请id
*/
@Min(value = 1, message = "晋升申请id不能小于1")
@Schema(description = "晋升申请id", example = "1")
private Long applyId;
/**
* 邀请码
*/
@NotBlank(message = "邀请码不能为空")
@Schema(description = "邀请码", example = "666999")
private String invitationCode;
/**
* 用户角色
*/
@NotBlank(message = "用户角色不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "用户角色", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,42 @@
package com.greenorange.promotion.model.dto.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest;
/**
* 晋升申请查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "晋升申请查询请求体", requiredProperties = {"current", "pageSize"})
public class AdvancementApplyQueryRequest extends PageRequest implements Serializable {
/**
* 申请人姓名
*/
@Schema(description = "申请人姓名", example = "张三")
private String name;
/**
* 申请人手机号
*/
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 审核状态
*/
@Schema(description = "审核状态", example = "待审核")
private String reviewStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,40 @@
package com.greenorange.promotion.model.dto.advancementApply;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 晋升申请拒绝请求体
*/
@Data
@Schema(description = "晋升申请拒绝请求体", requiredProperties = {
"applyId",
"rejectReason"
})
public class AdvancementApplyRejectRequest implements Serializable {
/**
* 晋升申请id
*/
@Min(value = 1, message = "晋升申请id不能小于1")
@Schema(description = "晋升申请id", example = "1")
private Long applyId;
/**
* 拒绝理由
*/
@NotBlank(message = "拒绝理由不能为空")
@Schema(description = "拒绝理由", example = "拒绝理由")
private String rejectReason;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,71 @@
package com.greenorange.promotion.model.dto.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 晋升申请更新请求体
*/
@Data
@Schema(description = "晋升申请更新请求体", requiredProperties = {
"id",
"name",
"phone",
"verificationCode",
"resume",
"reviewStatus",
})
public class AdvancementApplyUpdateRequest implements Serializable {
/**
* 晋升申请id
*/
@Min(value = 1L, message = "晋升申请id ID不能小于1")
@Schema(description = "晋升申请id", example = "张三")
private Long id;
/**
* 申请人姓名
*/
@NotBlank(message = "申请人姓名不能为空")
@Schema(description = "申请人姓名", example = "")
private String name;
/**
* 申请人手机号
*/
@NotBlank(message = "申请人手机号不能为空")
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 验证码
*/
@NotBlank(message = "验证码不能为空")
@Schema(description = "验证码", example = "666999")
private String verificationCode;
/**
* 简历(view值)
*/
@NotBlank(message = "简历(view值)不能为空")
@Schema(description = "简历(view值)", example = "3DFK2K3J")
private String resume;
/**
* 审核状态
*/
@NotBlank(message = "审核状态不能为空")
@Schema(description = "审核状态", example = "待审核")
private String reviewStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,99 @@
package com.greenorange.promotion.model.dto.course;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.CourseTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程添加请求体
*/
@Data
@Schema(description = "课程添加请求体", requiredProperties = {
"name",
"type",
"detail",
"promoCodeDesc",
"image",
"originPrice",
"discountPrice",
"firstLevelRate",
"secondLevelRate",
})
public class CourseAddRequest implements Serializable {
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@NotBlank(message = "课程类别不能为空")
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 课程概述(富文本)
*/
@NotBlank(message = "课程概述(富文本)不能为空")
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@NotBlank(message = "推广码说明(富文本)不能为空")
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@NotBlank(message = "课程图片URL不能为空")
@Schema(description = "课程图片URL", example = "324IEHJDE")
private String image;
/**
* 课程原价
*/
@DecimalMin(value = "0", message = "课程原价不能小于0")
@Schema(description = "课程原价", example = "3499")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@DecimalMin(value = "0", message = "折扣价格不能小于0")
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 一级佣金比例(%
*/
@DecimalMin(value = "0", message = "一级佣金比例不能小于0")
@Schema(description = "一级佣金比例(%", example = "10")
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
@DecimalMin(value = "0", message = "二级佣金比例不能小于0")
@Schema(description = "二级佣金比例(%", example = "5")
private BigDecimal secondLevelRate;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,48 @@
package com.greenorange.promotion.model.dto.course;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.CourseTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jdk.jfr.BooleanFlag;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest;
/**
* 课程查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "课程查询请求体", requiredProperties = {"current", "pageSize"})
public class CourseQueryRequest extends PageRequest implements Serializable {
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 是否上架(true:上架false:下架)
*/
@Schema(description = "是否上架(true:上架false:下架)", example = "true")
private Boolean isShelves;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,115 @@
package com.greenorange.promotion.model.dto.course;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.CourseTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程更新请求体
*/
@Data
@Schema(description = "课程更新请求体", requiredProperties = {
"id",
"name",
"type",
"detail",
"promoCodeDesc",
"image",
"originPrice",
"discountPrice",
"orderCount",
"firstLevelRate",
"secondLevelRate",
})
public class CourseUpdateRequest implements Serializable {
/**
* 课程ID
*/
@Min(value = 1L, message = "课程ID ID不能小于1")
@Schema(description = "课程ID", example = "1")
private Long id;
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@NotBlank(message = "课程类别不能为空")
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 课程概述(富文本)
*/
@NotBlank(message = "课程概述(富文本)不能为空")
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@NotBlank(message = "推广码说明(富文本)不能为空")
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@NotBlank(message = "课程图片URL不能为空")
@Schema(description = "课程图片URL", example = "324IEHJDE")
private String image;
/**
* 课程原价
*/
@DecimalMin(value = "0.0", message = "课程原价不能小于0")
@Schema(description = "课程原价", example = "3499")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@DecimalMin(value = "0.0", message = "折扣价格不能小于0")
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 已下单人数
*/
@Schema(description = "已下单人数", example = "100")
private Integer orderCount;
/**
* 一级佣金比例(%
*/
@DecimalMin(value = "0.0", message = "一级佣金比例不能小于0")
@Schema(description = "一级佣金比例(%", example = "10")
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
@DecimalMin(value = "0.0", message = "二级佣金比例不能小于0")
@Schema(description = "二级佣金比例(%", example = "5")
private BigDecimal secondLevelRate;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,67 @@
package com.greenorange.promotion.model.dto.courseChapter;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.PreviewPermissionEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程章节添加请求体
*/
@Data
@Schema(description = "课程章节添加请求体", requiredProperties = {
"name",
"duration",
"permissions",
"videoView",
"courseId",
})
public class CourseChapterAddRequest implements Serializable {
/**
* 章节名称
*/
@NotBlank(message = "章节名称不能为空")
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
private String name;
/**
* 章节时长(单位:秒)
*/
@Min(value = 0L, message = "章节时长不能小于0")
@Schema(description = "章节时长", example = "600")
private Long duration;
/**
* 试看权限[全集试看,部分试看,关闭,开启]
*/
@NotBlank(message = "试看权限不能为空")
@EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions;
/**
* 视频文件 view 值
*/
@NotBlank(message = "视频文件 view 值不能为空")
@Schema(description = "视频文件 view 值", example = "3E29KDS9")
private String videoView;
/**
* 所属课程ID
*/
@Min(value = 1L, message = "所属课程ID ID不能小于1")
@Schema(description = "所属课程ID", example = "1")
private Long courseId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,48 @@
package com.greenorange.promotion.model.dto.courseChapter;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.PreviewPermissionEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest;
/**
* 课程章节查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "课程章节查询请求体", requiredProperties = {"current", "pageSize"})
public class CourseChapterQueryRequest extends PageRequest implements Serializable {
/**
* 章节名称
*/
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
private String name;
/**
* 试看权限[全集试看,部分试看,关闭,开启]
*/
@EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions;
/**
* 课程id
*/
@NotNull(message = "课程id不能为null")
@Min(value = 1, message = "课程id不能小于1")
@Schema(description = "课程id", example = "1")
private Long courseId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,74 @@
package com.greenorange.promotion.model.dto.courseChapter;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.PreviewPermissionEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程章节更新请求体
*/
@Data
@Schema(description = "课程章节更新请求体", requiredProperties = {
"id",
"name",
"duration",
"permissions",
"videoView",
"courseId",
})
public class CourseChapterUpdateRequest implements Serializable {
/**
* 章节ID
*/
@Min(value = 1L, message = "章节ID ID不能小于1")
@Schema(description = "章节ID", example = "1")
private Long id;
/**
* 章节名称
*/
@NotBlank(message = "章节名称不能为空")
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
private String name;
/**
* 章节时长(单位:秒)
*/
@Min(value = 0L, message = "章节时长不能小于0")
@Schema(description = "章节时长", example = "600")
private Long duration;
/**
* 试看权限[全集试看,部分试看,关闭,开启]
*/
@NotBlank(message = "试看权限不能为空")
@EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions;
/**
* 视频文件 view 值
*/
@NotBlank(message = "视频文件 view 值不能为空")
@Schema(description = "视频文件 view 值", example = "3E29KDS9")
private String videoView;
/**
* 所属课程ID
*/
@Min(value = 1L, message = "所属课程ID ID不能小于1")
@Schema(description = "所属课程ID", example = "1")
private Long courseId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,92 @@
package com.greenorange.promotion.model.dto.courseOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程订单添加请求体
*/
@Data
@Schema(description = "课程订单添加请求体", requiredProperties = {
"courseId"
})
public class CourseOrderAddRequest implements Serializable {
// /**
// * 订单号
// */
// @NotBlank(message = "订单号不能为空")
// @Schema(description = "订单号", example = "202506241339232334d234234243")
// private String orderNumber;
/**
* 课程ID
*/
@Min(value = 1L, message = "课程ID ID不能小于1")
@Schema(description = "课程ID", example = "1")
private Long courseId;
// /**
// * 课程名称
// */
// @NotBlank(message = "课程名称不能为空")
// @Schema(description = "课程名称", example = "数据分析工程师训练营")
// private String name;
//
// /**
// * 课程类别
// */
// @NotBlank(message = "课程类别不能为空")
// @Schema(description = "课程类别", example = "自媒体")
// private String type;
//
// /**
// * 课程封面图片URL
// */
// @NotBlank(message = "课程封面图片URL不能为空")
// @Schema(description = "课程封面图片URL", example = "38EFJID33")
// private String image;
//
// /**
// * 课程原价
// */
// @Schema(description = "课程原价", example = "20.00")
// private BigDecimal originPrice;
//
// /**
// * 折扣价格
// */
// @Schema(description = "折扣价格", example = "80.00")
// private BigDecimal discountPrice;
//
// /**
// * 订单总金额
// */
// @Schema(description = "订单总金额", example = "80.00")
// private BigDecimal totalAmount;
//
// /**
// * 支付交易号
// */
// @NotBlank(message = "支付交易号不能为空")
// @Schema(description = "支付交易号", example = "432332333324444444444444423")
// private String transactionNumber;
//
// /**
// * 订单状态
// */
// @NotBlank(message = "订单状态不能为空")
//// @EnumValue(enumClass = CourseOrderStatusEnum.class)
// @Schema(description = "订单状态", example = "order")
// private String orderStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,41 @@
package com.greenorange.promotion.model.dto.courseOrder;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.OrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest;
import lombok.EqualsAndHashCode;
/**
* 课程订单查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "课程订单查询请求体", requiredProperties = {"current", "pageSize"})
public class CourseOrderQueryRequest extends PageRequest implements Serializable {
/**
* 订单号
*/
@Schema(description = "订单号", example = "202506241339232334d234234243")
private String orderNumber;
/**
* 订单状态[交易关闭,交易成功,待支付,已退款]
*/
@EnumValue(enumClass = OrderStatusEnum.class)
@Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,43 @@
package com.greenorange.promotion.model.dto.courseOrder;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.OrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial;
import java.io.Serializable;
/**
* 课程订单更新请求体
*/
@Data
@Schema(description = "课程订单更新请求体", requiredProperties = {
"id",
"orderStatus"
})
public class CourseOrderUpdateRequest implements Serializable {
/**
* 订单ID
*/
@Min(value = 1L, message = "订单ID ID不能小于1")
@Schema(description = "订单ID", example = "1")
private Long id;
/**
* 订单状态[交易关闭,交易成功,待支付,已退款]
*/
@NotBlank(message = "订单状态不能为空")
@EnumValue(enumClass = OrderStatusEnum.class)
@Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,13 +1,10 @@
package com.greenorange.promotion.model.dto.fileInfo; package com.greenorange.promotion.model.dto.fileInfo;
import com.greenorange.promotion.annotation.FileEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.FileUploadBizEnum; import com.greenorange.promotion.model.enums.FileUploadBizEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -55,7 +52,7 @@ public class FileInfoAddRequest implements Serializable {
/** /**
* 文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))] * 文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]
*/ */
@FileEnumValue(enumClass = FileUploadBizEnum.class) @EnumValue(enumClass = FileUploadBizEnum.class)
@Schema(description = "文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]", example = "avatar") @Schema(description = "文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]", example = "avatar")
private String biz; private String biz;

View File

@ -1,36 +0,0 @@
package com.greenorange.promotion.model.dto.fileInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest;
/**
* 文件查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "文件查询请求体", requiredProperties = {"current", "pageSize"})
public class FileInfoQueryRequest extends PageRequest implements Serializable {
/**
* 文件ID
*/
@Min(value = 1L, message = "文件ID ID不能小于1")
@Schema(description = "文件ID", example = "1")
private Long id;
/**
* 文件view值
*/
@Schema(description = "文件view值", example = "3E8U2AM8")
private String fileView;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,79 +0,0 @@
package com.greenorange.promotion.model.dto.fileInfo;
import com.greenorange.promotion.annotation.FileEnumValue;
import com.greenorange.promotion.model.enums.FileUploadBizEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 文件更新请求体
*/
@Data
@Schema(description = "文件更新请求体", requiredProperties = {
"id",
"name",
"type",
"size",
"fileView",
"biz",
})
public class FileInfoUpdateRequest implements Serializable {
/**
* 文件ID
*/
@Min(value = 1L, message = "文件ID ID不能小于1")
@Schema(description = "文件ID", example = "1")
private Long id;
/**
* 文件名
*/
@NotBlank(message = "文件名不能为空")
@Schema(description = "文件名", example = "file.png")
private String name;
/**
* 文件类型
*/
@NotBlank(message = "文件类型不能为空")
@Schema(description = "文件类型", example = "png")
private String type;
/**
* 文件大小(KB)
*/
@Min(value = 1L, message = "文件大小 ID不能小于1")
@Schema(description = "文件大小", example = "3000")
private Double size;
/**
* 文件view值
*/
@NotBlank(message = "文件view值不能为空")
@Schema(description = "文件view值", example = "3E8U2AM8")
private String fileView;
/**
* 文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]
*/
@FileEnumValue(enumClass = FileUploadBizEnum.class)
@Schema(description = "文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]", example = "default")
private String biz;
/**
* 文件hash值
*/
@NotBlank(message = "文件hash值不能为空")
@Schema(description = "文件hash值", example = "3E8U2AM8")
private String hashValue;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,6 +1,6 @@
package com.greenorange.promotion.model.dto.fileInfo; package com.greenorange.promotion.model.dto.fileInfo;
import com.greenorange.promotion.annotation.FileEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.FileUploadBizEnum; import com.greenorange.promotion.model.enums.FileUploadBizEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -15,7 +15,7 @@ public class UploadFileRequest implements Serializable {
/** /**
* 文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))] * 文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]
*/ */
@FileEnumValue(enumClass = FileUploadBizEnum.class) @EnumValue(enumClass = FileUploadBizEnum.class)
@Schema(description = "文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]", example = "default") @Schema(description = "文件业务类型[头像(avatar)|项目(project)|富文本(richText)|默认(default))]", example = "default")
private String biz; private String biz;

View File

@ -29,6 +29,12 @@ public class FundsChangeAddRequest implements Serializable {
@Schema(description = "项目名称", example = "饿了么-超吃卡") @Schema(description = "项目名称", example = "饿了么-超吃卡")
private String projectName; private String projectName;
/**
* 项目明细名称
*/
@Schema(description = "项目明细名称", example = "2.9元购买30元券包")
private String projectDetailName;
/** /**
* 变动金额 * 变动金额
*/ */

View File

@ -1,21 +1,14 @@
package com.greenorange.promotion.model.dto.project; package com.greenorange.promotion.model.dto.project;
import com.greenorange.promotion.annotation.ProjectStatusEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.dto.projectDetail.ProjectDetailAddRequest;
import com.greenorange.promotion.model.dto.projectDetail.ProjectDetailUpdateRequest;
import com.greenorange.promotion.model.dto.projectNotification.ProjectNotificationAddRequest;
import com.greenorange.promotion.model.entity.ProjectNotification;
import com.greenorange.promotion.model.enums.ProjectStatusEnum; import com.greenorange.promotion.model.enums.ProjectStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/** /**
* 项目添加请求体 * 项目添加请求体
@ -66,7 +59,8 @@ public class ProjectAddRequest implements Serializable {
/** /**
* 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)] * 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]
*/ */
@ProjectStatusEnumValue(enumClass = ProjectStatusEnum.class) @NotBlank(message = "项目状态不能为空")
@EnumValue(enumClass = ProjectStatusEnum.class)
@Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running") @Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running")
private String projectStatus; private String projectStatus;

View File

@ -1,6 +1,6 @@
package com.greenorange.promotion.model.dto.project; package com.greenorange.promotion.model.dto.project;
import com.greenorange.promotion.annotation.ProjectStatusEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.ProjectStatusEnum; import com.greenorange.promotion.model.enums.ProjectStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
@ -27,7 +27,7 @@ public class ProjectStatusUpdateRequest implements Serializable {
/** /**
* 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)] * 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]
*/ */
@ProjectStatusEnumValue(enumClass = ProjectStatusEnum.class) @EnumValue(enumClass = ProjectStatusEnum.class)
@Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running") @Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running")
private String projectStatus; private String projectStatus;

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.model.dto.project;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.ProjectStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
@ -103,6 +105,7 @@ public class ProjectUpdateRequest implements Serializable {
/** /**
* 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)] * 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]
*/ */
@EnumValue(enumClass = ProjectStatusEnum.class)
@Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running") @Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running")
private String projectStatus; private String projectStatus;

View File

@ -1,10 +1,7 @@
package com.greenorange.promotion.model.dto.userInfo; package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.UserEnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.Data; import lombok.Data;
@ -16,7 +13,7 @@ import java.io.Serializable;
*/ */
@Data @Data
@Schema(description = "用户添加请求体", requiredProperties = {"nickName", "userAvatar", "phoneNumber", @Schema(description = "用户添加请求体", requiredProperties = {"nickName", "userAvatar", "phoneNumber",
"userAccount", "userPassword", "userRole"}) "userAccount", "userPassword"})
public class UserInfoAddRequest implements Serializable { public class UserInfoAddRequest implements Serializable {
/** /**

View File

@ -2,8 +2,12 @@ package com.greenorange.promotion.model.dto.userInfo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -41,6 +45,7 @@ public class UserInfoRegisterRequest implements Serializable {
* 邀请码 * 邀请码
*/ */
@Schema(description = "邀请码", example = "666999") @Schema(description = "邀请码", example = "666999")
@NotBlank(message = "邀请码不能为空")
private String invitationCode; private String invitationCode;
/** /**

View File

@ -3,7 +3,10 @@ package com.greenorange.promotion.model.dto.userInfo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;

View File

@ -1,7 +1,5 @@
package com.greenorange.promotion.model.dto.userInfo; package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.UserEnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
@ -16,8 +14,8 @@ import java.io.Serializable;
* 用户更新请求体 * 用户更新请求体
*/ */
@Data @Data
@Schema(description = "用户更新请求体", requiredProperties = {"id", "nickName", "userAvatar", "phoneNumber", @Schema(description = "用户更新请求体", requiredProperties = {"id", "nickName", "userAvatar",
"userAccount", "userPassword", "userRole"}) "userAccount", "userPassword"})
public class UserInfoUpdateRequest implements Serializable { public class UserInfoUpdateRequest implements Serializable {
/** /**
@ -42,13 +40,6 @@ public class UserInfoUpdateRequest implements Serializable {
@Schema(description = "用户头像URL", example = "3E8U2AM8") @Schema(description = "用户头像URL", example = "3E8U2AM8")
private String userAvatar; private String userAvatar;
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/** /**
* 账号 * 账号
*/ */
@ -65,25 +56,6 @@ public class UserInfoUpdateRequest implements Serializable {
@Schema(description = "密码(建议加密存储)", example = "qingcheng") @Schema(description = "密码(建议加密存储)", example = "qingcheng")
private String userPassword; private String userPassword;
/**
* 邀请码
*/
@Schema(description = "邀请码", example = "666999")
private String invitationCode;
/**
* 用户角色
*/
@UserEnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "用户角色", example = "user")
private String userRole;
/**
* 上级用户id
*/
@Schema(description = "上级用户id", example = "1")
private Long parentUserId;
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -1,10 +1,6 @@
package com.greenorange.promotion.model.dto.withdrawalApply; package com.greenorange.promotion.model.dto.withdrawalApply;
import com.greenorange.promotion.annotation.WithdrawStatusEnumValue;
import com.greenorange.promotion.model.enums.WithdrawStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -16,9 +12,7 @@ import java.io.Serializable;
*/ */
@Data @Data
@Schema(description = "提现申请记录添加请求体", requiredProperties = { @Schema(description = "提现申请记录添加请求体", requiredProperties = {
"withdrawnAmount", "withdrawnAmount"
"withdrawalStatus",
"userId",
}) })
public class WithdrawalApplyAddRequest implements Serializable { public class WithdrawalApplyAddRequest implements Serializable {

View File

@ -1,12 +1,9 @@
package com.greenorange.promotion.model.dto.withdrawalApply; package com.greenorange.promotion.model.dto.withdrawalApply;
import com.greenorange.promotion.annotation.WithdrawStatusEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.WithdrawStatusEnum; import com.greenorange.promotion.model.enums.WithdrawStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -22,6 +19,7 @@ public class WithdrawalApplyQueryRequest extends PageRequest implements Serializ
/** /**
* 提现状态[提现中(processing)|提现成功(success)|提现失败(failed)] * 提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]
*/ */
@EnumValue(enumClass = WithdrawStatusEnum.class)
@Schema(description = "提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]", example = "processing") @Schema(description = "提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]", example = "processing")
private String withdrawalStatus; private String withdrawalStatus;

View File

@ -1,9 +1,8 @@
package com.greenorange.promotion.model.dto.withdrawalApply; package com.greenorange.promotion.model.dto.withdrawalApply;
import com.greenorange.promotion.annotation.WithdrawStatusEnumValue; import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.WithdrawStatusEnum; import com.greenorange.promotion.model.enums.WithdrawStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -17,9 +16,7 @@ import java.io.Serializable;
@Data @Data
@Schema(description = "提现申请记录更新请求体", requiredProperties = { @Schema(description = "提现申请记录更新请求体", requiredProperties = {
"id", "id",
"withdrawnAmount", "withdrawalStatus"
"withdrawalStatus",
"userId",
}) })
public class WithdrawalApplyUpdateRequest implements Serializable { public class WithdrawalApplyUpdateRequest implements Serializable {
@ -30,26 +27,13 @@ public class WithdrawalApplyUpdateRequest implements Serializable {
@Schema(description = "提现申请ID", example = "1") @Schema(description = "提现申请ID", example = "1")
private Long id; private Long id;
/**
* 提现金额
*/
@Schema(description = "提现金额", example = "1.00")
private BigDecimal withdrawnAmount;
/** /**
* 提现状态[提现中(processing)|提现成功(success)|提现失败(failed)] * 提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]
*/ */
@WithdrawStatusEnumValue(enumClass = WithdrawStatusEnum.class) @EnumValue(enumClass = WithdrawStatusEnum.class)
@Schema(description = "提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]", example = "processing") @Schema(description = "提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]", example = "processing")
private String withdrawalStatus; private String withdrawalStatus;
/**
* 用户ID
*/
@Min(value = 1L, message = "用户ID ID不能小于1")
@Schema(description = "用户ID", example = "1")
private Long userId;
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -0,0 +1,76 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 晋升申请表
* @TableName advancement_apply
*/
@TableName(value ="advancement_apply")
@Data
public class AdvancementApply implements Serializable {
/**
* 晋升申请id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 申请人姓名
*/
private String name;
/**
* 申请人手机号
*/
private String phone;
/**
* 简历
*/
private String resume;
/**
* 查询凭证
*/
private String credential;
/**
* 审核状态
*/
private String reviewStatus;
/**
* 拒绝理由
*/
private String rejectReason;
/**
* 用户id(申请成功后获得)
*/
private Long userId;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,97 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 课程表
* @TableName course
*/
@TableName(value ="course")
@Data
public class Course implements Serializable {
/**
* 课程ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 课程名称
*/
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
private String type;
/**
* 课程概述(富文本)
*/
private String detail;
/**
* 推广码说明(富文本)
*/
private String promoCodeDesc;
/**
* 课程图片URL
*/
private String image;
/**
* 课程原价
*/
private BigDecimal originPrice;
/**
* 折扣价格
*/
private BigDecimal discountPrice;
/**
* 已下单人数
*/
private Integer orderCount;
/**
* 一级佣金比例(%
*/
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
private BigDecimal secondLevelRate;
/**
* 是否上架(true:上架false:下架)
*/
private Boolean isShelves;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,69 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 课程章节表
* @TableName course_chapter
*/
@TableName(value ="course_chapter")
@Data
public class CourseChapter implements Serializable {
/**
* 章节ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 章节名称
*/
private String name;
/**
* 章节时长(格式可自定义,如"00:10:00"
*/
private Long duration;
/**
* 试看权限[全集试看,部分试看,关闭,开启]
*/
private String permissions;
/**
* 视频文件 view 值
*/
private String videoView;
/**
* 所属课程ID
*/
private Long courseId;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,100 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 课程订单表
* @TableName course_order
*/
@TableName(value ="course_order")
@Data
public class CourseOrder implements Serializable {
/**
* 订单ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 订单号
*/
private String orderNumber;
/**
* 课程ID
*/
private Long courseId;
/**
* 课程名称
*/
private String name;
/**
* 课程类别
*/
private String type;
/**
* 课程封面图片URL
*/
private String image;
/**
* 课程原价
*/
private BigDecimal originPrice;
/**
* 折扣价格
*/
private BigDecimal discountPrice;
/**
* 订单总金额
*/
private BigDecimal totalAmount;
/**
* 支付交易号
*/
private String transactionNumber;
/**
* 订单状态[交易关闭,交易成功,待支付,已退款]
*/
private String orderStatus;
/**
* 用户id
*/
private Long userId;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,63 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 课程推广码申请表
* @TableName course_qrcode_apply
*/
@TableName(value ="course_qrcode_apply")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CourseQrcodeApply implements Serializable {
/**
* 课程推广码申请id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 课程id
*/
private Long courseId;
/**
* 课程推广码(view值)
*/
private String courseQrcode;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -8,6 +8,7 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@ -35,6 +36,11 @@ public class FundsChange implements Serializable {
*/ */
private String projectName; private String projectName;
/**
* 项目明细名称
*/
private String projectDetailName;
/** /**
* 变动金额 * 变动金额
*/ */

View File

@ -0,0 +1,82 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 推广记录表
* @TableName promo_record
*/
@TableName(value ="promo_record")
@Data
public class PromoRecord implements Serializable {
/**
* 推广记录ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 被推广课程ID
*/
private Long courseId;
/**
* 下级用户ID
*/
private Long subUserId;
/**
* 下级用户昵称
*/
private String nickName;
/**
* 下级用户手机号
*/
private String phone;
/**
* 下级带给上级的收益
*/
private BigDecimal benefits;
/**
* 绑定时间(字符串格式)
*/
private String bindTime;
/**
* 推广类型
*/
private Object promoType;
/**
* 推广人上级用户ID
*/
private Long userId;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,112 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 课程抽成记录表
* @TableName rake_reward
*/
@TableName(value ="rake_reward")
@Data
public class RakeReward implements Serializable {
/**
* 抽成记录ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 课程ID
*/
private Long courseId;
/**
* 课程名称
*/
private String name;
/**
* 课程类别
*/
private String type;
/**
* 课程图片URL
*/
private String image;
/**
* 一级佣金比例(%
*/
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
private BigDecimal secondLevelRate;
/**
* 订单ID
*/
private Long orderId;
/**
* 下单用户ID
*/
private Long userId;
/**
* 下单用户昵称
*/
private String nickName;
/**
* 订单金额
*/
private BigDecimal totalAmount;
/**
* 订单创建日期
*/
private Date orderCreateTime;
/**
* 对应推广记录ID
*/
private Long promoId;
/**
* 推广类型
*/
private Object promoType;
/**
* 抽成补贴金额
*/
private BigDecimal reward;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -69,4 +69,5 @@ public class SubUserProjectCommission implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

@ -18,6 +18,9 @@ import lombok.NoArgsConstructor;
*/ */
@TableName(value ="user_info") @TableName(value ="user_info")
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserInfo implements Serializable { public class UserInfo implements Serializable {
/** /**
* 用户ID * 用户ID

View File

@ -44,6 +44,31 @@ public class WithdrawalApply implements Serializable {
*/ */
private Long userId; private Long userId;
/**
* 持卡人
*/
private String cardHolder;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 手机号
*/
private String phoneNumber;
/**
* 银行卡号
*/
private String bankCardNumber;
/**
* 开户银行
*/
private String openBank;
/** /**
* 是否删除 * 是否删除
*/ */

View File

@ -0,0 +1,58 @@
package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 课程类型枚举
*/
@Getter
public enum CourseTypeEnum implements BaseEnum {
KAOGONGKAOYAN("考公考研"),
ZIMEITI("自媒体"),
CAIJING("财经");
private final String value;
CourseTypeEnum(String value) {
this.value = value;
}
/**
* BaseEnum 要求的方法:返回枚举对应的校验值
*/
@Override
public String getValue() {
return this.value;
}
/**
* 获取所有枚举值列表
*/
public static List<String> getValues() {
return Arrays.stream(values())
.map(CourseTypeEnum::getValue)
.collect(Collectors.toList());
}
/**
* 根据值获取对应的枚举对象
*/
public static CourseTypeEnum getEnumByValue(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
for (CourseTypeEnum type : CourseTypeEnum.values()) {
if (type.value.equals(value)) {
return type;
}
}
return null;
}
}

View File

@ -1,5 +1,6 @@
package com.greenorange.promotion.model.enums; package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -11,7 +12,7 @@ import java.util.stream.Collectors;
* 文件上传业务类型枚举 * 文件上传业务类型枚举
*/ */
@Getter @Getter
public enum FileUploadBizEnum { public enum FileUploadBizEnum implements BaseEnum {
AVATAR("用户头像", "avatar"), AVATAR("用户头像", "avatar"),
PROJECT("项目", "project"), PROJECT("项目", "project"),
@ -26,6 +27,14 @@ public enum FileUploadBizEnum {
this.value = value; this.value = value;
} }
/**
* BaseEnum 要求的方法:返回这个枚举的“校验值”
*/
@Override
public String getValue() {
return this.value;
}
/** /**
* 获取值列表 * 获取值列表
*/ */

View File

@ -0,0 +1,59 @@
package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 订单状态枚举
*/
@Getter
public enum OrderStatusEnum implements BaseEnum {
CLOSED("交易关闭"),
SUCCESS("交易成功"),
PENDING("待支付"),
REFUNDED("已退款");
private final String value;
OrderStatusEnum(String value) {
this.value = value;
}
/**
* BaseEnum 要求的方法:返回枚举对应的校验值
*/
@Override
public String getValue() {
return this.value;
}
/**
* 获取所有枚举值列表
*/
public static List<String> getValues() {
return Arrays.stream(values())
.map(OrderStatusEnum::getValue)
.collect(Collectors.toList());
}
/**
* 根据值获取对应的枚举对象
*/
public static OrderStatusEnum getEnumByValue(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
for (OrderStatusEnum status : OrderStatusEnum.values()) {
if (status.value.equals(value)) {
return status;
}
}
return null;
}
}

View File

@ -0,0 +1,59 @@
package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 试看权限枚举
*/
@Getter
public enum PreviewPermissionEnum implements BaseEnum {
FULL_VIEW("全集试看"),
PART_VIEW("部分试看"),
CLOSED("关闭"),
OPEN("开启");
private final String value;
PreviewPermissionEnum(String value) {
this.value = value;
}
/**
* BaseEnum 要求的方法:返回枚举对应的校验值
*/
@Override
public String getValue() {
return this.value;
}
/**
* 获取所有枚举值列表
*/
public static List<String> getValues() {
return Arrays.stream(values())
.map(PreviewPermissionEnum::getValue)
.collect(Collectors.toList());
}
/**
* 根据值获取对应的枚举对象
*/
public static PreviewPermissionEnum getEnumByValue(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
for (PreviewPermissionEnum permission : PreviewPermissionEnum.values()) {
if (permission.value.equals(value)) {
return permission;
}
}
return null;
}
}

View File

@ -1,5 +1,6 @@
package com.greenorange.promotion.model.enums; package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -11,7 +12,7 @@ import java.util.stream.Collectors;
* 项目状态枚举 * 项目状态枚举
*/ */
@Getter @Getter
public enum ProjectStatusEnum { public enum ProjectStatusEnum implements BaseEnum {
RUNNING("项目运行", "running"), RUNNING("项目运行", "running"),
FULL("人数已满", "full"), FULL("人数已满", "full"),
@ -25,6 +26,14 @@ public enum ProjectStatusEnum {
this.value = value; this.value = value;
} }
/**
* BaseEnum 要求的方法:返回这个枚举的“校验值”
*/
@Override
public String getValue() {
return this.value;
}
/** /**
* 获取值列表 * 获取值列表
*/ */

View File

@ -0,0 +1,59 @@
package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 审核状态枚举
*/
@Getter
public enum ReviewStatusEnum implements BaseEnum {
PENDING("待审核"),
APPROVED("已通过"),
REJECTED("已拒绝"),
WITHDRAWN("已撤回");
private final String value;
ReviewStatusEnum(String value) {
this.value = value;
}
/**
* BaseEnum 要求的方法:返回枚举对应的校验值
*/
@Override
public String getValue() {
return this.value;
}
/**
* 获取所有枚举值列表
*/
public static List<String> getValues() {
return Arrays.stream(values())
.map(ReviewStatusEnum::getValue)
.collect(Collectors.toList());
}
/**
* 根据值获取对应的枚举对象
*/
public static ReviewStatusEnum getEnumByValue(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
for (ReviewStatusEnum status : ReviewStatusEnum.values()) {
if (status.value.equals(value)) {
return status;
}
}
return null;
}
}

View File

@ -1,5 +1,6 @@
package com.greenorange.promotion.model.enums; package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -12,12 +13,15 @@ import java.util.stream.Collectors;
* 用户角色枚举 * 用户角色枚举
*/ */
@Getter @Getter
public enum UserRoleEnum { public enum UserRoleEnum implements BaseEnum {
USER("用户", "user"), USER("用户", "user"),
ADMIN("管理员", "admin"), ADMIN("管理员", "admin"),
BOSS("Boss", "boss"), BOSS("Boss", "boss"),
BAN("被封号", "ban"); BAN("被封号", "ban"),
MANAGER("经理", "manager"),
SUPERVISOR("主管", "supervisor"),
STAFF("员工", "staff");
private final String text; private final String text;
@ -29,6 +33,14 @@ public enum UserRoleEnum {
this.value = value; this.value = value;
} }
/**
* BaseEnum 要求的方法:返回这个枚举的“校验值”
*/
@Override
public String getValue() {
return this.value;
}
/** /**
* 获取值列表 * 获取值列表
*/ */

View File

@ -1,5 +1,6 @@
package com.greenorange.promotion.model.enums; package com.greenorange.promotion.model.enums;
import com.greenorange.promotion.annotation.BaseEnum;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -11,7 +12,7 @@ import java.util.stream.Collectors;
* 提现状态枚举 * 提现状态枚举
*/ */
@Getter @Getter
public enum WithdrawStatusEnum { public enum WithdrawStatusEnum implements BaseEnum {
PROCESSING("提现中", "processing"), PROCESSING("提现中", "processing"),
SUCCESS("提现成功", "success"), SUCCESS("提现成功", "success"),
@ -26,6 +27,14 @@ public enum WithdrawStatusEnum {
this.value = value; this.value = value;
} }
/**
* BaseEnum 要求的方法:返回这个枚举的“校验值”
*/
@Override
public String getValue() {
return this.value;
}
/** /**
* 获取所有状态的值列表 * 获取所有状态的值列表
*/ */

View File

@ -0,0 +1,57 @@
package com.greenorange.promotion.model.vo.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 晋升申请审核结果 视图对象
*/
@Data
@Schema(description = "晋升申请审核结果 视图对象")
public class AdvancementApplyApproveVO implements Serializable {
/**
* 申请人姓名
*/
@Schema(description = "申请人姓名", example = "张三")
private String name;
/**
* 申请人手机号
*/
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 审核状态
*/
@Schema(description = "审核状态", example = "待审核")
private String reviewStatus;
/**
* 拒绝理由
*/
@Schema(description = "拒绝理由", example = "")
private String rejectReason;
/**
* 账号
*/
@Schema(description = "账号", example = "qingcheng")
private String userAccount;
/**
* 密码(建议加密存储)
*/
@Schema(description = "密码(建议加密存储)", example = "qingcheng")
private String userPassword;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,64 @@
package com.greenorange.promotion.model.vo.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.UUID;
/**
* 晋升申请 视图对象
*/
@Data
@Schema(description = "晋升申请 视图对象")
public class AdvancementApplyVO implements Serializable {
/**
* 晋升申请ID
*/
@Schema(description = "晋升申请ID", example = "1")
private Long id;
/**
* 申请人姓名
*/
@Schema(description = "申请人姓名", example = "张三")
private String name;
/**
* 申请人手机号
*/
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 简历(view值)
*/
@Schema(description = "简历(view值)", example = "32DK8DKL8")
private String resume;
/**
* 查询凭证
*/
@Schema(description = "查询凭证", example = "cef281c7-578f-4cc9-aca9-f1b5f6bcacb1")
private String credential;
/**
* 审核状态
*/
@Schema(description = "审核状态", example = "待审核")
private String reviewStatus;
/**
* 创建时间
*/
@Schema(description = "创建时间", example = "2023-03-01 00:00:00")
private Date createTime;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,64 @@
package com.greenorange.promotion.model.vo.advancementApply;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 晋升申请记录id查询 视图对象
*/
@Data
@Schema(description = "晋升申请记录id查询 视图对象")
public class AdvancementApplyVOPlus implements Serializable {
/**
* 晋升申请ID
*/
@Schema(description = "晋升申请ID", example = "1")
private Long id;
/**
* 申请人姓名
*/
@Schema(description = "申请人姓名", example = "张三")
private String name;
/**
* 申请人手机号
*/
@Schema(description = "申请人手机号", example = "15888610253")
private String phone;
/**
* 简历(view值)
*/
@Schema(description = "简历(view值)", example = "32DK8DKL8")
private String resume;
/**
* 查询凭证
*/
@Schema(description = "查询凭证", example = "cef281c7-578f-4cc9-aca9-f1b5f6bcacb1")
private String credential;
/**
* 审核状态
*/
@Schema(description = "审核状态", example = "待审核")
private String reviewStatus;
/**
* 拒绝理由
*/
@Schema(description = "拒绝理由", example = "")
private String rejectReason;
/**
* 创建时间
*/
@Schema(description = "创建时间", example = "2023-03-01 00:00:00")
private Date createTime;
}

View File

@ -0,0 +1,60 @@
package com.greenorange.promotion.model.vo.course;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Schema(description = "课程卡片 视图对象")
public class CourseCardVO implements Serializable {
/**
* 课程ID
*/
@Schema(description = "课程ID", example = "1")
private Long id;
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 课程图片URL
*/
@Schema(description = "课程图片URL", example = "324IEHJDE")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "3499")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 已下单人数
*/
@Schema(description = "已下单人数", example = "100")
private Integer orderCount;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,75 @@
package com.greenorange.promotion.model.vo.course;
import com.greenorange.promotion.model.vo.courseChapter.CourseChapterVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@Schema(description = "课程详情 视图对象")
public class CourseDetailVO implements Serializable {
/**
* 课程ID
*/
@Schema(description = "课程ID", example = "1")
private Long id;
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 课程概述(富文本)
*/
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@Schema(description = "课程图片URL", example = "324IEHJDE")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "3499")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 课程章节
*/
@Schema(description = "课程章节")
private List<CourseChapterVO> courseChapters;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,92 @@
package com.greenorange.promotion.model.vo.course;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 课程 视图对象
*/
@Data
@Schema(description = "课程 视图对象")
public class CourseVO implements Serializable {
/**
* 课程ID
*/
@Schema(description = "课程ID", example = "1")
private Long id;
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别[考公考研,自媒体,财经]
*/
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
* 课程概述(富文本)
*/
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@Schema(description = "课程图片URL", example = "324IEHJDE")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "3499")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 已下单人数
*/
@Schema(description = "已下单人数", example = "100")
private Integer orderCount;
/**
* 一级佣金比例(%
*/
@Schema(description = "一级佣金比例(%", example = "10")
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
@Schema(description = "二级佣金比例(%", example = "5")
private BigDecimal secondLevelRate;
/**
* 是否上架(true:上架false:下架)
*/
@Schema(description = "是否上架(true:上架false:下架)", example = "true")
private Boolean isShelves;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,58 @@
package com.greenorange.promotion.model.vo.courseChapter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 课程章节 视图对象
*/
@Data
@Schema(description = "课程章节 视图对象")
public class CourseChapterVO implements Serializable {
/**
* 课程章节ID
*/
@Schema(description = "课程章节ID", example = "1")
private Long id;
/**
* 章节名称
*/
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
private String name;
/**
* 章节时长(单位:秒)
*/
@Schema(description = "章节时长", example = "600")
private Long duration;
/**
* 试看权限[全集试看,部分试看,关闭,开启]
*/
@Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions;
/**
* 视频文件 view 值
*/
@Schema(description = "视频文件 view 值", example = "3E29KDS9")
private String videoView;
/**
* 所属课程ID
*/
@Schema(description = "所属课程ID", example = "所属课程ID ID不能小于1")
private Long courseId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,60 @@
package com.greenorange.promotion.model.vo.courseOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 课程订单卡片 视图对象
*/
@Data
@Schema(description = "课程订单卡片 视图对象")
public class CourseOrderCardVO implements Serializable {
/**
* 课程订单ID
*/
@Schema(description = "课程订单ID", example = "1")
private Long id;
/**
* 订单号
*/
@Schema(description = "订单号", example = "202506241339232334d234234243")
private String orderNumber;
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别
*/
@Schema(description = "课程类别", example = "自媒体")
private String type;
/**
* 订单总金额
*/
@Schema(description = "订单总金额", example = "100.00")
private BigDecimal totalAmount;
/**
* 订单状态[交易关闭,交易成功,待支付,已退款]
*/
@Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus;
/**
* 创建时间
*/
@Schema(description = "创建时间", example = "2025-06-24 13:39:23")
private Date createTime;
}

View File

@ -0,0 +1,105 @@
package com.greenorange.promotion.model.vo.courseOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 课程订单 视图对象
*/
@Data
@Schema(description = "课程订单 视图对象")
public class CourseOrderVO implements Serializable {
/**
* 课程订单ID
*/
@Schema(description = "课程订单ID", example = "1")
private Long id;
/**
* 订单号
*/
@Schema(description = "订单号", example = "202506241339232334d234234243")
private String orderNumber;
/**
* 课程ID
*/
@Schema(description = "课程ID", example = "1")
private Long courseId;
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name;
/**
* 课程类别
*/
@Schema(description = "课程类别", example = "自媒体")
private String type;
/**
* 课程封面图片URL
*/
@Schema(description = "课程封面图片URL", example = "32DHDF3KI")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "100.00")
private BigDecimal originPrice;
/**
* 折扣价格
*/
@Schema(description = "折扣价格", example = "50.00")
private BigDecimal discountPrice;
/**
* 订单总金额
*/
@Schema(description = "订单总金额", example = "100.00")
private BigDecimal totalAmount;
/**
* 支付交易号
*/
@Schema(description = "支付交易号", example = "4342348232388888833333333333")
private String transactionNumber;
/**
* 订单状态[交易关闭,交易成功,待支付,已退款]
*/
@Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus;
/**
* 用户id
*/
@Schema(description = "用户id", example = "1")
private Long userId;
/**
* 创建时间
*/
@Schema(description = "创建时间", example = "2025-06-24 13:39:23")
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间", example = "2025-06-24 13:39:23")
private Date updateTime;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,6 +1,7 @@
package com.greenorange.promotion.model.vo.fundsChange; package com.greenorange.promotion.model.vo.fundsChange;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
@ -27,6 +28,12 @@ public class FundsChangeVO implements Serializable {
@Schema(description = "项目名称", example = "饿了么-超吃卡") @Schema(description = "项目名称", example = "饿了么-超吃卡")
private String projectName; private String projectName;
/**
* 项目明细名称
*/
@Schema(description = "项目明细名称", example = "2.9元购买30元券包")
private String projectDetailName;
/** /**
* 变动金额 * 变动金额
*/ */

View File

@ -1,13 +1,17 @@
package com.greenorange.promotion.model.vo.project; package com.greenorange.promotion.model.vo.project;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
public class ProjectCardVO implements Serializable { public class ProjectCardVO implements Serializable {
/** /**

View File

@ -0,0 +1,36 @@
package com.greenorange.promotion.model.vo.userAccount;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "用户账户情况 视图对象")
public class UserAccountConditionVO implements Serializable {
/**
* 当前余额
*/
@Schema(description = "当前余额", example = "10.00")
private BigDecimal currentBalance;
/**
* 银行卡号
*/
@Schema(description = "银行卡号", example = "5105105105105100")
private String bankCardNumber;
@Serial
private static final long serialVersionUID = 1L;
}

Some files were not shown because too many files have changed in this diff Show More