Compare commits
12 Commits
青橙1.0.0
...
7ca23bc987
Author | SHA1 | Date | |
---|---|---|---|
7ca23bc987 | |||
746ac2c6bd | |||
5ec4c4ff42 | |||
2c25017f0a | |||
c04ae851cd | |||
5b56f29e45 | |||
7140d5008f | |||
460dced912 | |||
d18d87f81d | |||
2827ef39c5 | |||
ddad249dea | |||
8ad84afcfe |
7
pom.xml
7
pom.xml
@ -207,6 +207,13 @@
|
|||||||
<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>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.greenorange.promotion.annotation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有待校验的枚举都应实现此接口,
|
||||||
|
* 并通过 getValue() 返回其对应的校验字符串。
|
||||||
|
*/
|
||||||
|
public interface BaseEnum {
|
||||||
|
/** 返回该枚举常量对应的校验值 */
|
||||||
|
String getValue();
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.greenorange.promotion.annotation;
|
||||||
|
|
||||||
|
import jakarta.validation.ConstraintValidator;
|
||||||
|
import jakarta.validation.ConstraintValidatorContext;
|
||||||
|
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 validValues.contains(value);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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(); // 枚举类类型
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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(); // 枚举类类型
|
|
||||||
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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(); // 枚举类类型
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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(); // 枚举类类型
|
|
||||||
}
|
|
@ -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 {
|
||||||
|
@ -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端管理员分页查询课程章节
|
||||||
|
* @param courseChapterQueryRequest 课程章节查询请求体
|
||||||
|
* @return 课程章节列表
|
||||||
|
*/
|
||||||
|
@PostMapping("page")
|
||||||
|
@Operation(summary = "Web端管理员分页查询课程章节", description = "参数:课程章节查询请求体,权限:管理员,方法名:listCourseChapterByPage")
|
||||||
|
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
|
||||||
|
@SysLog(title = "课程章节管理", content = "Web端管理员分页查询课程章节")
|
||||||
|
public BaseResponse<Page<CourseChapterVO>> listCourseChapterByPage(@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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,160 @@
|
|||||||
|
package com.greenorange.promotion.controller.course;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
|
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.CommonBatchRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.CommonRequest;
|
||||||
|
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.vo.course.CourseVO;
|
||||||
|
import com.greenorange.promotion.service.common.CommonService;
|
||||||
|
import com.greenorange.promotion.service.course.CourseChapterService;
|
||||||
|
import com.greenorange.promotion.service.course.CourseService;
|
||||||
|
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("course")
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "课程模块")
|
||||||
|
public class CourseController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CourseService courseService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CommonService commonService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CourseChapterService courseChapterService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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) {
|
||||||
|
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 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);
|
||||||
|
}
|
||||||
|
}
|
@ -37,10 +37,8 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,6 +138,39 @@ public class ProjectCommissionController {
|
|||||||
return ResultUtils.success(projectCommissionVOList);
|
return ResultUtils.success(projectCommissionVOList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 小程序用户修改项目的抽佣比例
|
||||||
|
// * @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);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小程序用户修改项目的抽佣比例
|
* 小程序用户修改项目的抽佣比例
|
||||||
@ -151,30 +182,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 +261,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 +295,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 +362,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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删除项目明细
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ public class ProjectSettlementController {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小程序端用户根据推广码申请记录id查询结算记录
|
* 小程序端用户根据推广码申请记录id查询结算记录
|
||||||
* @param commonRequest 项目结算记录添加请求体
|
* @param commonRequest 项目结算记录添加请求体
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -58,10 +58,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 +72,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ package com.greenorange.promotion.controller.wechat;
|
|||||||
|
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.freewayso.image.combiner.ImageCombiner;
|
||||||
|
import com.freewayso.image.combiner.enums.OutputFormat;
|
||||||
import com.greenorange.promotion.annotation.RequiresPermission;
|
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.ErrorCode;
|
||||||
@ -19,15 +21,18 @@ import jakarta.annotation.Resource;
|
|||||||
import jakarta.servlet.http.HttpServletRequest;
|
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.core.io.FileSystemResource;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.*;
|
||||||
import java.io.FileOutputStream;
|
import java.nio.file.Path;
|
||||||
import java.io.IOException;
|
import java.nio.file.Paths;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -67,7 +72,7 @@ public class WechatGetQrcodeController {
|
|||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@Hidden
|
// @Hidden
|
||||||
@PostMapping("/get/qrcode")
|
@PostMapping("/get/qrcode")
|
||||||
@Operation(summary = "微信小程序获取二维码", description = "参数:无, 权限:所有人, 方法名:getQrcode")
|
@Operation(summary = "微信小程序获取二维码", description = "参数:无, 权限:所有人, 方法名:getQrcode")
|
||||||
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
|
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
|
||||||
@ -78,6 +83,25 @@ 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 CommonStringRequest commonStringRequest) throws Exception {
|
||||||
|
String inviteCode = commonStringRequest.getTemplateString();
|
||||||
|
String view = wechatGetQrcodeService.getWxCourseQrCode(inviteCode);
|
||||||
|
return ResultUtils.success(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,16 +50,29 @@ 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());
|
||||||
|
|
||||||
|
// 从所有 FieldError 里,排序后取第一个
|
||||||
|
FieldError firstError = e.getBindingResult()
|
||||||
|
.getFieldErrors().stream().min(Comparator.comparing(FieldError::getField))
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
|
// 直接取它的 defaultMessage,即注解里配置的 message
|
||||||
|
String msg = (firstError != null)
|
||||||
|
? firstError.getDefaultMessage()
|
||||||
|
: "参数校验失败";
|
||||||
|
|
||||||
|
// 返回时只带 msg,不再拼前缀或字段名
|
||||||
|
return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 = "CourseChapter";
|
||||||
// 表名
|
// 表名
|
||||||
private static final String TABLE_NAME = "user_account";
|
private static final String TABLE_NAME = "course_chapter";
|
||||||
// 实体类属性名
|
// 实体类属性名
|
||||||
private static final String ENTITY_NAME_LOWER = "userAccount";
|
private static final String ENTITY_NAME_LOWER = "courseChapter";
|
||||||
|
|
||||||
// 父包名
|
// 父包名
|
||||||
private static final String PARENT_PATH = "com.greenorange.promotion";
|
private static final String PARENT_PATH = "com.greenorange.promotion";
|
||||||
|
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
|||||||
|
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 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 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程名称
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "课程名称不能为空")
|
||||||
|
@Schema(description = "课程名称", example = "数据分析工程师训练营")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程类别[考公考研,自媒体,财经]
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "课程类别不能为空")
|
||||||
|
@EnumValue(enumClass = CourseTypeEnum.class)
|
||||||
|
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
|||||||
|
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;
|
||||||
|
import com.greenorange.promotion.common.PageRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程章节查询请求体,继承自分页请求 PageRequest
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "课程章节查询请求体", requiredProperties = {"current", "pageSize"})
|
||||||
|
public class CourseChapterQueryRequest extends PageRequest implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 章节名称
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "章节名称不能为空")
|
||||||
|
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 试看权限
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "试看权限不能为空")
|
||||||
|
@EnumValue(enumClass = PreviewPermissionEnum.class)
|
||||||
|
@Schema(description = "试看权限", example = "全集试看")
|
||||||
|
private String permissions;
|
||||||
|
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 变动金额
|
* 变动金额
|
||||||
*/
|
*/
|
||||||
|
@ -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,7 @@ public class ProjectAddRequest 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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,6 +2,7 @@ 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.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -0,0 +1,92 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否删除
|
||||||
|
*/
|
||||||
|
private Integer isDelete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
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 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 String duration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 试看权限
|
||||||
|
*/
|
||||||
|
private Object permissions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频文件 view 值
|
||||||
|
*/
|
||||||
|
private String videoView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属课程ID
|
||||||
|
*/
|
||||||
|
private Long courseId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否删除
|
||||||
|
*/
|
||||||
|
private Integer isDelete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
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_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 Object orderStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否删除
|
||||||
|
*/
|
||||||
|
private Integer isDelete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 变动金额
|
* 变动金额
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否删除
|
* 是否删除
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取值列表
|
* 获取值列表
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取值列表
|
* 获取值列表
|
||||||
*/
|
*/
|
||||||
|
@ -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,7 +13,7 @@ import java.util.stream.Collectors;
|
|||||||
* 用户角色枚举
|
* 用户角色枚举
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
public enum UserRoleEnum {
|
public enum UserRoleEnum implements BaseEnum {
|
||||||
|
|
||||||
USER("用户", "user"),
|
USER("用户", "user"),
|
||||||
ADMIN("管理员", "admin"),
|
ADMIN("管理员", "admin"),
|
||||||
@ -29,6 +30,14 @@ public enum UserRoleEnum {
|
|||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BaseEnum 要求的方法:返回这个枚举的“校验值”
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取值列表
|
* 获取值列表
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有状态的值列表
|
* 获取所有状态的值列表
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 变动金额
|
* 变动金额
|
||||||
*/
|
*/
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.greenorange.promotion.model.vo.userInfo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上级用户信息 视图对象
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "上级用户信息 视图对象")
|
||||||
|
public class SuperUserInfoVO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户昵称
|
||||||
|
*/
|
||||||
|
@Schema(description = "用户昵称", example = "chenxinzhi")
|
||||||
|
private String nickName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
@Schema(description = "手机号", example = "15888610253")
|
||||||
|
private String phoneNumber;
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
@ -20,6 +20,36 @@ public class WithdrawalApplyVO implements Serializable {
|
|||||||
@Schema(description = "提现申请记录ID", example = "1")
|
@Schema(description = "提现申请记录ID", example = "1")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 持卡人
|
||||||
|
*/
|
||||||
|
@Schema(description = "持卡人", example = "chenxinzhi")
|
||||||
|
private String cardHolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 身份证号
|
||||||
|
*/
|
||||||
|
@Schema(description = "身份证号", example = "110101199001011234")
|
||||||
|
private String idCardNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
@Schema(description = "手机号", example = "15888610253")
|
||||||
|
private String phoneNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 银行卡号
|
||||||
|
*/
|
||||||
|
@Schema(description = "银行卡号", example = "5105105105105100")
|
||||||
|
private String bankCardNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开户银行
|
||||||
|
*/
|
||||||
|
@Schema(description = "开户银行", example = "中国工商银行")
|
||||||
|
private String openBank;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提现金额
|
* 提现金额
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.greenorange.promotion.service.course;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.greenorange.promotion.model.dto.courseChapter.CourseChapterQueryRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.CourseChapter;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course_chapter(课程章节表)】的数据库操作Service
|
||||||
|
* @createDate 2025-06-23 18:30:28
|
||||||
|
*/
|
||||||
|
public interface CourseChapterService extends IService<CourseChapter> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取查询条件
|
||||||
|
*/
|
||||||
|
QueryWrapper<CourseChapter> getQueryWrapper(CourseChapterQueryRequest courseChapterQueryRequest);
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.greenorange.promotion.service.course;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.entity.CourseOrder;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course_order(课程订单表)】的数据库操作Service
|
||||||
|
* @createDate 2025-06-23 18:31:13
|
||||||
|
*/
|
||||||
|
public interface CourseOrderService extends IService<CourseOrder> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.greenorange.promotion.service.course;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.greenorange.promotion.model.dto.course.CourseQueryRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.Course;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course(课程表)】的数据库操作Service
|
||||||
|
* @createDate 2025-06-23 18:29:49
|
||||||
|
*/
|
||||||
|
public interface CourseService extends IService<Course> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取查询条件
|
||||||
|
*/
|
||||||
|
QueryWrapper<Course> getQueryWrapper(CourseQueryRequest courseQueryRequest);
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.greenorange.promotion.service.course;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.entity.PromoRecord;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【promo_record(推广记录表)】的数据库操作Service
|
||||||
|
* @createDate 2025-06-23 18:31:45
|
||||||
|
*/
|
||||||
|
public interface PromoRecordService extends IService<PromoRecord> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.greenorange.promotion.service.course;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.entity.RakeReward;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【rake_reward(课程抽成记录表)】的数据库操作Service
|
||||||
|
* @createDate 2025-06-23 18:32:46
|
||||||
|
*/
|
||||||
|
public interface RakeRewardService extends IService<RakeReward> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.greenorange.promotion.service.course.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.constant.CommonConstant;
|
||||||
|
import com.greenorange.promotion.model.dto.courseChapter.CourseChapterQueryRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.CourseChapter;
|
||||||
|
import com.greenorange.promotion.service.course.CourseChapterService;
|
||||||
|
import com.greenorange.promotion.mapper.CourseChapterMapper;
|
||||||
|
import com.greenorange.promotion.utils.SqlUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course_chapter(课程章节表)】的数据库操作Service实现
|
||||||
|
* @createDate 2025-06-23 18:30:28
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class CourseChapterServiceImpl extends ServiceImpl<CourseChapterMapper, CourseChapter>
|
||||||
|
implements CourseChapterService{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取查询条件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public QueryWrapper<CourseChapter> getQueryWrapper(CourseChapterQueryRequest courseChapterQueryRequest) {
|
||||||
|
String name = courseChapterQueryRequest.getName();
|
||||||
|
String permissions = courseChapterQueryRequest.getPermissions();
|
||||||
|
String sortField = courseChapterQueryRequest.getSortField();
|
||||||
|
String sortOrder = courseChapterQueryRequest.getSortOrder();
|
||||||
|
QueryWrapper<CourseChapter> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq(StringUtils.isNotBlank(name), "name", name);
|
||||||
|
queryWrapper.eq(StringUtils.isNotBlank(permissions), "permissions", permissions);
|
||||||
|
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.greenorange.promotion.service.course.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.model.entity.CourseOrder;
|
||||||
|
import com.greenorange.promotion.service.course.CourseOrderService;
|
||||||
|
import com.greenorange.promotion.mapper.CourseOrderMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course_order(课程订单表)】的数据库操作Service实现
|
||||||
|
* @createDate 2025-06-23 18:31:13
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class CourseOrderServiceImpl extends ServiceImpl<CourseOrderMapper, CourseOrder>
|
||||||
|
implements CourseOrderService{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.greenorange.promotion.service.course.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.constant.CommonConstant;
|
||||||
|
import com.greenorange.promotion.model.dto.course.CourseQueryRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.Course;
|
||||||
|
import com.greenorange.promotion.service.course.CourseService;
|
||||||
|
import com.greenorange.promotion.mapper.CourseMapper;
|
||||||
|
import com.greenorange.promotion.utils.SqlUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【course(课程表)】的数据库操作Service实现
|
||||||
|
* @createDate 2025-06-23 18:29:49
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
|
||||||
|
implements CourseService{
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取查询条件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public QueryWrapper<Course> getQueryWrapper(CourseQueryRequest courseQueryRequest) {
|
||||||
|
String name = courseQueryRequest.getName();
|
||||||
|
String type = courseQueryRequest.getType();
|
||||||
|
String sortField = courseQueryRequest.getSortField();
|
||||||
|
String sortOrder = courseQueryRequest.getSortOrder();
|
||||||
|
QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq(StringUtils.isNotBlank(name), "name", name);
|
||||||
|
queryWrapper.eq(StringUtils.isNotBlank(type), "type", type);
|
||||||
|
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.greenorange.promotion.service.course.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.model.entity.PromoRecord;
|
||||||
|
import com.greenorange.promotion.service.course.PromoRecordService;
|
||||||
|
import com.greenorange.promotion.mapper.PromoRecordMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【promo_record(推广记录表)】的数据库操作Service实现
|
||||||
|
* @createDate 2025-06-23 18:31:45
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class PromoRecordServiceImpl extends ServiceImpl<PromoRecordMapper, PromoRecord>
|
||||||
|
implements PromoRecordService{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.greenorange.promotion.service.course.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.model.entity.RakeReward;
|
||||||
|
import com.greenorange.promotion.service.course.RakeRewardService;
|
||||||
|
import com.greenorange.promotion.mapper.RakeRewardMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 35880
|
||||||
|
* @description 针对表【rake_reward(课程抽成记录表)】的数据库操作Service实现
|
||||||
|
* @createDate 2025-06-23 18:32:46
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class RakeRewardServiceImpl extends ServiceImpl<RakeRewardMapper, RakeReward>
|
||||||
|
implements RakeRewardService{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,7 +1,15 @@
|
|||||||
package com.greenorange.promotion.service.project;
|
package com.greenorange.promotion.service.project;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUniteUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.ProjectCommission;
|
import com.greenorange.promotion.model.entity.ProjectCommission;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -10,4 +18,52 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
*/
|
*/
|
||||||
public interface ProjectCommissionService extends IService<ProjectCommission> {
|
public interface ProjectCommissionService extends IService<ProjectCommission> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改项目的抽佣比例
|
||||||
|
*/
|
||||||
|
void updateProjectCommissionRate(ProjectCommissionUpdateRequest projectCommissionUpdateRequest);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改下级用户的项目明细抽佣比例
|
||||||
|
*/
|
||||||
|
void updateSubUserProjectCommissionRate(SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序用户一键设置项目的的抽佣比例
|
||||||
|
*/
|
||||||
|
void uniteProjectCommissionRate(ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量修改下级用户的单价
|
||||||
|
*/
|
||||||
|
void batchUpdateSubUserMyUnitPrice(List<SubUserProjectCommission> subCommissionList);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量修改用户的单价
|
||||||
|
*/
|
||||||
|
void batchUpdateMyUnitPrice(List<ProjectCommission> projectCommissionList);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对项目抽佣记录进行排序(根据userId, subUserId进行排序)
|
||||||
|
*/
|
||||||
|
void sortSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对项目抽佣记录进行排序(根据projectDetailId, userId, subUserId进行排序)
|
||||||
|
*/
|
||||||
|
void sortProjectDetailAndSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据价格和抽佣比例计算最终价格
|
||||||
|
*/
|
||||||
|
BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
package com.greenorange.promotion.service.project;
|
package com.greenorange.promotion.service.project;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.greenorange.promotion.model.dto.CommonRequest;
|
||||||
import com.greenorange.promotion.model.dto.project.ProjectQueryRequest;
|
import com.greenorange.promotion.model.dto.project.ProjectQueryRequest;
|
||||||
import com.greenorange.promotion.model.entity.Project;
|
import com.greenorange.promotion.model.entity.Project;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.greenorange.promotion.model.vo.project.ProjectCardVO;
|
||||||
|
import com.greenorange.promotion.model.vo.project.ProjectVO;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -17,4 +23,17 @@ public interface ProjectService extends IService<Project> {
|
|||||||
* 获取查询条件
|
* 获取查询条件
|
||||||
*/
|
*/
|
||||||
QueryWrapper<Project> getQueryWrapper(ProjectQueryRequest projectQueryRequest);
|
QueryWrapper<Project> getQueryWrapper(ProjectQueryRequest projectQueryRequest);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序用户查看项目列表
|
||||||
|
* @return 项目列表
|
||||||
|
*/
|
||||||
|
List<ProjectCardVO> queryProjectCardList(HttpServletRequest request);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web端管理员根据id查询项目
|
||||||
|
*/
|
||||||
|
ProjectVO queryProjectById(CommonRequest commonRequest);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.greenorange.promotion.service.project;
|
package com.greenorange.promotion.service.project;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.dto.CommonBatchRequest;
|
||||||
import com.greenorange.promotion.model.entity.PromoCode;
|
import com.greenorange.promotion.model.entity.PromoCode;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
@ -10,4 +11,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
*/
|
*/
|
||||||
public interface PromoCodeService extends IService<PromoCode> {
|
public interface PromoCodeService extends IService<PromoCode> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web端管理员批量删除推广码
|
||||||
|
*/
|
||||||
|
void delBatchPromoCode(CommonBatchRequest commonBatchRequest);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package com.greenorange.promotion.service.project;
|
package com.greenorange.promotion.service.project;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import org.apache.ibatis.annotations.Update;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -10,4 +12,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
*/
|
*/
|
||||||
public interface SubUserProjectCommissionService extends IService<SubUserProjectCommission> {
|
public interface SubUserProjectCommissionService extends IService<SubUserProjectCommission> {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,34 @@
|
|||||||
package com.greenorange.promotion.service.project.impl;
|
package com.greenorange.promotion.service.project.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.greenorange.promotion.model.entity.ProjectCommission;
|
import com.greenorange.promotion.common.ErrorCode;
|
||||||
import com.greenorange.promotion.service.project.ProjectCommissionService;
|
import com.greenorange.promotion.common.ResultUtils;
|
||||||
|
import com.greenorange.promotion.exception.ThrowUtils;
|
||||||
import com.greenorange.promotion.mapper.ProjectCommissionMapper;
|
import com.greenorange.promotion.mapper.ProjectCommissionMapper;
|
||||||
|
import com.greenorange.promotion.mapper.SubUserProjectCommissionMapper;
|
||||||
|
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUniteUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.ProjectCommission;
|
||||||
|
import com.greenorange.promotion.model.entity.ProjectDetail;
|
||||||
|
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
||||||
|
import com.greenorange.promotion.model.entity.UserMainInfo;
|
||||||
|
import com.greenorange.promotion.service.common.CommonService;
|
||||||
|
import com.greenorange.promotion.service.project.ProjectCommissionService;
|
||||||
|
import com.greenorange.promotion.service.project.ProjectDetailService;
|
||||||
|
import com.greenorange.promotion.service.project.SubUserProjectCommissionService;
|
||||||
|
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -15,6 +39,431 @@ import org.springframework.stereotype.Service;
|
|||||||
public class ProjectCommissionServiceImpl extends ServiceImpl<ProjectCommissionMapper, ProjectCommission>
|
public class ProjectCommissionServiceImpl extends ServiceImpl<ProjectCommissionMapper, ProjectCommission>
|
||||||
implements ProjectCommissionService{
|
implements ProjectCommissionService{
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SubUserProjectCommissionService subUserProjectCommissionService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectDetailService projectDetailService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CommonService commonService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private UserMainInfoService userMainInfoService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SubUserProjectCommissionMapper subUserProjectCommissionMapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改项目的抽佣比例
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void updateProjectCommissionRate(ProjectCommissionUpdateRequest projectCommissionUpdateRequest) {
|
||||||
|
Long id = projectCommissionUpdateRequest.getId();
|
||||||
|
BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
|
||||||
|
// 获取当前项目明细信息
|
||||||
|
ProjectCommission projectCommission = this.getById(id);
|
||||||
|
ThrowUtils.throwIf(projectCommission == null, ErrorCode.OPERATION_ERROR, "项目明细抽佣信息不存在");
|
||||||
|
Long projectDetailId = projectCommission.getProjectDetailId();
|
||||||
|
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
|
||||||
|
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
|
||||||
|
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
|
||||||
|
BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
|
||||||
|
// 查询项目明细列表
|
||||||
|
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetailId, this);
|
||||||
|
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissionList, SubUserProjectCommission.class);
|
||||||
|
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissions) {
|
||||||
|
subUserProjectCommission.setSubUserId(-1L);
|
||||||
|
}
|
||||||
|
List<SubUserProjectCommission> subProjectCommissions = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetailId, subUserProjectCommissionService);
|
||||||
|
subProjectCommissions.addAll(subUserProjectCommissions);
|
||||||
|
sortSubProjectCommissions(subProjectCommissions);
|
||||||
|
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
|
||||||
|
Long initSubUserId = projectCommission.getUserId();
|
||||||
|
// 1.封装一个Map集合(键:下级用户id,值:当前用户的单价)
|
||||||
|
Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
SubUserProjectCommission commission = iterator.next();
|
||||||
|
if (!Objects.equals(commission.getUserId(), initSubUserId)) {
|
||||||
|
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
iterator.remove(); // 使用迭代器的 remove() 方法移除
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始更新集合
|
||||||
|
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
|
||||||
|
Long userId = subProjectCommission.getUserId();
|
||||||
|
Long subUserId = subProjectCommission.getSubUserId();
|
||||||
|
// 初始化map
|
||||||
|
if (userId.equals(initSubUserId)) {
|
||||||
|
subProjectCommission.setCurrentCommissionRate(currentCommissionRate);
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
} else {
|
||||||
|
BigDecimal unitPrice = subUserUnitPriceMap.get(userId);
|
||||||
|
subProjectCommission.setMyUnitPrice(unitPrice);
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
// 更新当前用户的项目明细抽佣表和下级用户项目明细抽佣表
|
||||||
|
List<SubUserProjectCommission> subUserProCommissions = subProjectCommissions.stream()
|
||||||
|
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
|
||||||
|
subUserProjectCommissionService.updateBatchById(subUserProCommissions);
|
||||||
|
|
||||||
|
List<SubUserProjectCommission> projectCommissions = subProjectCommissions.stream()
|
||||||
|
.filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
|
||||||
|
List<ProjectCommission> projectCommissionsList = commonService.convertList(projectCommissions, ProjectCommission.class);
|
||||||
|
this.updateBatchById(projectCommissionsList);
|
||||||
|
// 获取结束时间戳
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
long executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
// 更新下级用户项目明细记录
|
||||||
|
List<SubUserProjectCommission> subUserProjectCommissionList = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
|
||||||
|
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
|
||||||
|
batchUpdateSubUserMyUnitPrice(subUserProjectCommissionList);
|
||||||
|
|
||||||
|
// 更新用户项目明细抽佣记录
|
||||||
|
List<SubUserProjectCommission> restProjectCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
|
||||||
|
List<ProjectCommission> proCommissions = commonService.convertList(restProjectCommissions, ProjectCommission.class);
|
||||||
|
// this.updateBatchById(proCommissions);
|
||||||
|
batchUpdateMyUnitPrice(proCommissions);
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改下级用户的项目明细抽佣比例
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void updateSubUserProjectCommissionRate(SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
|
||||||
|
Long id = subUserProjectCommissionUpdateRequest.getId();
|
||||||
|
BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
|
||||||
|
// 获取当前项目明细信息
|
||||||
|
SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
|
||||||
|
ThrowUtils.throwIf(subUserProjectCommission == null, ErrorCode.OPERATION_ERROR, "下级用户项目明细抽佣信息不存在");
|
||||||
|
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
|
||||||
|
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
|
||||||
|
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
|
||||||
|
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
|
||||||
|
BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
|
||||||
|
// 查询项目明细列表
|
||||||
|
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetailId, this);
|
||||||
|
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissionList, SubUserProjectCommission.class);
|
||||||
|
for (SubUserProjectCommission subProjectCommission : subUserProjectCommissions) {
|
||||||
|
subProjectCommission.setSubUserId(-1L);
|
||||||
|
}
|
||||||
|
List<SubUserProjectCommission> subProjectCommissions = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetailId, subUserProjectCommissionService);
|
||||||
|
subProjectCommissions.addAll(subUserProjectCommissions);
|
||||||
|
sortSubProjectCommissions(subProjectCommissions);
|
||||||
|
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
|
||||||
|
Long initSubUserId = subUserProjectCommission.getUserId();
|
||||||
|
// 1.封装一个Map集合(键:下级用户id,值:当前用户的单价)
|
||||||
|
Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
SubUserProjectCommission commission = iterator.next();
|
||||||
|
if (!Objects.equals(commission.getUserId(), initSubUserId)) {
|
||||||
|
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
iterator.remove(); // 使用迭代器的 remove() 方法移除
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始更新集合
|
||||||
|
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
|
||||||
|
Long userId = subProjectCommission.getUserId();
|
||||||
|
Long subUserId = subProjectCommission.getSubUserId();
|
||||||
|
// 初始化map
|
||||||
|
if (userId.equals(initSubUserId)) {
|
||||||
|
// 仅设置单条抽佣比例
|
||||||
|
if (subProjectCommission.getId().equals(id)) subProjectCommission.setCurrentCommissionRate(currentCommissionRate);
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
} else {
|
||||||
|
BigDecimal unitPrice = subUserUnitPriceMap.get(userId);
|
||||||
|
subProjectCommission.setMyUnitPrice(unitPrice);
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
// 更新当前用户的下级用户项目明细抽佣表
|
||||||
|
List<SubUserProjectCommission> subUserProCommissions = subProjectCommissions.stream()
|
||||||
|
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
|
||||||
|
subUserProjectCommissionService.updateBatchById(subUserProCommissions);
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
long executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
// 更新下级用户项目明细记录
|
||||||
|
List<SubUserProjectCommission> subUserProjectCommissionList = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
|
||||||
|
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
|
||||||
|
batchUpdateSubUserMyUnitPrice(subUserProjectCommissionList);
|
||||||
|
|
||||||
|
// 更新用户项目明细抽佣记录
|
||||||
|
List<SubUserProjectCommission> projectCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
|
||||||
|
List<ProjectCommission> proCommissions = commonService.convertList(projectCommissions, ProjectCommission.class);
|
||||||
|
// this.updateBatchById(proCommissions);
|
||||||
|
batchUpdateMyUnitPrice(proCommissions);
|
||||||
|
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序用户一键设置项目的的抽佣比例
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void uniteProjectCommissionRate(ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
|
||||||
|
ThrowUtils.throwIf(uniteCommissionRate.compareTo(BigDecimal.valueOf(10)) > 0, ErrorCode.OPERATION_ERROR, "抽佣比例不能大于10%");
|
||||||
|
|
||||||
|
// 修改项目的统一抽佣比例
|
||||||
|
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 = this.list(projectCommissionLambdaQueryWrapper);
|
||||||
|
|
||||||
|
List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
|
||||||
|
// 封装map集合(键:项目明细id, 值:项目明细最大抽佣比例)
|
||||||
|
Map<Long, BigDecimal> map = new HashMap<>();
|
||||||
|
Map<Long, BigDecimal> minPriceMap = new HashMap<>();
|
||||||
|
for (ProjectDetail projectDetail : projectDetailList) {
|
||||||
|
map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
|
||||||
|
minPriceMap.put(projectDetail.getId(), projectDetail.getProjectMinSettlementPrice());
|
||||||
|
}
|
||||||
|
for (ProjectCommission projectCommission : projectCommissionList) {
|
||||||
|
Long projectDetailId = projectCommission.getProjectDetailId();
|
||||||
|
BigDecimal maxCommissionRate = map.get(projectDetailId);
|
||||||
|
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
|
||||||
|
projectCommission.setCurrentCommissionRate(setCommissionRate);
|
||||||
|
}
|
||||||
|
this.updateBatchById(projectCommissionList);
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
long executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
// 修改下级用户的项目明细抽佣比例
|
||||||
|
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);
|
||||||
|
// 更新项目明细抽佣表和下级项目明细抽佣表的单价
|
||||||
|
List<ProjectCommission> projectCommissions = this.list();
|
||||||
|
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissions, SubUserProjectCommission.class);
|
||||||
|
for (SubUserProjectCommission subProjectCommission : subUserProjectCommissions) {
|
||||||
|
subProjectCommission.setSubUserId(-1L);
|
||||||
|
}
|
||||||
|
List<SubUserProjectCommission> subProjectCommissions = subUserProjectCommissionService.list();
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
|
||||||
|
subProjectCommissions.addAll(subUserProjectCommissions);
|
||||||
|
sortProjectDetailAndSubProjectCommissions(subProjectCommissions);
|
||||||
|
// 1.封装一个Map集合(键:项目明细-下级用户id,值:当前用户的单价)
|
||||||
|
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
|
||||||
|
Map<String, BigDecimal> subUserUnitPriceMap = new HashMap<>();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
SubUserProjectCommission commission = iterator.next();
|
||||||
|
Long projectDetailId = commission.getProjectDetailId();
|
||||||
|
BigDecimal projectMinSettlementPrice = minPriceMap.get(projectDetailId);
|
||||||
|
if (commission.getUserId() < userId) {
|
||||||
|
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
iterator.remove(); // 使用迭代器的 remove() 方法移除
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
|
||||||
|
Long projectDetailId = subProjectCommission.getProjectDetailId();
|
||||||
|
BigDecimal projectMinSettlementPrice = minPriceMap.get(projectDetailId);
|
||||||
|
Long uid = subProjectCommission.getUserId();
|
||||||
|
Long subUserId = subProjectCommission.getSubUserId();
|
||||||
|
if (uid.equals(userId)) {
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
} else {
|
||||||
|
BigDecimal unitPrice = subUserUnitPriceMap.get(projectDetailId + "-" + uid);
|
||||||
|
subProjectCommission.setMyUnitPrice(unitPrice);
|
||||||
|
if (subUserId != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 更新下级用户项目明细记录
|
||||||
|
List<SubUserProjectCommission> subCommissionList = subProjectCommissions.stream()
|
||||||
|
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
|
||||||
|
// 获取开始时间戳
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
// subUserProjectCommissionService.updateBatchById(subCommissionList);
|
||||||
|
batchUpdateSubUserMyUnitPrice(subCommissionList);
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
// 更新用户项目明细抽佣记录
|
||||||
|
List<SubUserProjectCommission> proCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
|
||||||
|
List<ProjectCommission> proCommissionList = commonService.convertList(proCommissions, ProjectCommission.class);
|
||||||
|
// this.updateBatchById(proCommissionList);
|
||||||
|
batchUpdateMyUnitPrice(proCommissionList);
|
||||||
|
|
||||||
|
// 获取结束时间戳
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
// 计算执行时间
|
||||||
|
executionTime = endTime - startTime;
|
||||||
|
System.out.println("程序执行时间: " + executionTime + " 毫秒");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void batchUpdateSubUserMyUnitPrice(List<SubUserProjectCommission> subCommissionList) {
|
||||||
|
if (subCommissionList == null || subCommissionList.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StringBuilder sql = new StringBuilder("UPDATE sub_user_project_commission SET myUnitPrice = CASE id ");
|
||||||
|
|
||||||
|
// 为每个记录构建 WHEN 条件
|
||||||
|
for (SubUserProjectCommission subUserProjectCommission : subCommissionList) {
|
||||||
|
sql.append("WHEN ").append(subUserProjectCommission.getId())
|
||||||
|
.append(" THEN ").append(subUserProjectCommission.getMyUnitPrice()).append(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.append("END WHERE id IN (");
|
||||||
|
|
||||||
|
// 添加所有 ID 到 WHERE 条件
|
||||||
|
for (int i = 0; i < subCommissionList.size(); i++) {
|
||||||
|
sql.append(subCommissionList.get(i).getId());
|
||||||
|
if (i < subCommissionList.size() - 1) {
|
||||||
|
sql.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql.append(");");
|
||||||
|
|
||||||
|
// 执行 SQL 语句
|
||||||
|
subUserProjectCommissionMapper.executeUpdate(sql.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void batchUpdateMyUnitPrice(List<ProjectCommission> projectCommissionList) {
|
||||||
|
if (projectCommissionList == null || projectCommissionList.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StringBuilder sql = new StringBuilder("UPDATE project_commission SET myUnitPrice = CASE id ");
|
||||||
|
|
||||||
|
// 为每条记录构建 WHEN ... THEN ...
|
||||||
|
for (ProjectCommission pc : projectCommissionList) {
|
||||||
|
sql.append("WHEN ").append(pc.getId())
|
||||||
|
.append(" THEN ").append(pc.getMyUnitPrice()).append(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.append("END WHERE id IN (");
|
||||||
|
// 拼接所有 id 到 IN 列表
|
||||||
|
for (int i = 0; i < projectCommissionList.size(); i++) {
|
||||||
|
sql.append(projectCommissionList.get(i).getId());
|
||||||
|
if (i < projectCommissionList.size() - 1) {
|
||||||
|
sql.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql.append(")");
|
||||||
|
|
||||||
|
// 执行拼好的 SQL
|
||||||
|
this.baseMapper.executeUpdate(sql.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
// 封装排序方法
|
||||||
|
public void sortSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions) {
|
||||||
|
// 先根据userId升序排序
|
||||||
|
// 如果userId相同,再根据subUserId升序排序
|
||||||
|
Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
// 封装排序方法
|
||||||
|
public void sortProjectDetailAndSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions) {
|
||||||
|
// 先根据userId升序排序
|
||||||
|
// 如果userId相同,再根据subUserId升序排序
|
||||||
|
Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getProjectDetailId).thenComparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
// 封装方法:根据价格和抽佣比例计算最终价格
|
||||||
|
public BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate) {
|
||||||
|
// 计算抽佣比例对应的系数
|
||||||
|
BigDecimal commissionFactor = BigDecimal.ONE.subtract(commissionRate.divide(BigDecimal.valueOf(100)));
|
||||||
|
|
||||||
|
// 计算最终价格
|
||||||
|
return price.multiply(commissionFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,16 +2,32 @@ package com.greenorange.promotion.service.project.impl;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.common.ErrorCode;
|
||||||
|
import com.greenorange.promotion.common.ResultUtils;
|
||||||
import com.greenorange.promotion.constant.CommonConstant;
|
import com.greenorange.promotion.constant.CommonConstant;
|
||||||
|
import com.greenorange.promotion.exception.ThrowUtils;
|
||||||
|
import com.greenorange.promotion.model.dto.CommonRequest;
|
||||||
import com.greenorange.promotion.model.dto.project.ProjectQueryRequest;
|
import com.greenorange.promotion.model.dto.project.ProjectQueryRequest;
|
||||||
import com.greenorange.promotion.model.entity.Project;
|
import com.greenorange.promotion.model.entity.Project;
|
||||||
|
import com.greenorange.promotion.model.entity.ProjectCommission;
|
||||||
import com.greenorange.promotion.model.entity.UserInfo;
|
import com.greenorange.promotion.model.entity.UserInfo;
|
||||||
|
import com.greenorange.promotion.model.vo.project.ProjectCardVO;
|
||||||
|
import com.greenorange.promotion.model.vo.project.ProjectVO;
|
||||||
|
import com.greenorange.promotion.service.common.CommonService;
|
||||||
|
import com.greenorange.promotion.service.project.ProjectCommissionService;
|
||||||
import com.greenorange.promotion.service.project.ProjectService;
|
import com.greenorange.promotion.service.project.ProjectService;
|
||||||
import com.greenorange.promotion.mapper.ProjectMapper;
|
import com.greenorange.promotion.mapper.ProjectMapper;
|
||||||
import com.greenorange.promotion.utils.SqlUtils;
|
import com.greenorange.promotion.utils.SqlUtils;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
* @description 针对表【project(项目表)】的数据库操作Service实现
|
* @description 针对表【project(项目表)】的数据库操作Service实现
|
||||||
@ -21,6 +37,15 @@ import org.springframework.stereotype.Service;
|
|||||||
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project>
|
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project>
|
||||||
implements ProjectService{
|
implements ProjectService{
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CommonService commonService;
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectCommissionService projectCommissionService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取查询条件
|
* 获取查询条件
|
||||||
*/
|
*/
|
||||||
@ -36,6 +61,49 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project>
|
|||||||
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
|
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
|
||||||
return queryWrapper;
|
return queryWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序用户查看项目列表
|
||||||
|
* @return 项目列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<ProjectCardVO> queryProjectCardList(HttpServletRequest request) {
|
||||||
|
|
||||||
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
// 获取项目明细抽佣列表
|
||||||
|
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, this);
|
||||||
|
for (Project project : projectList) {
|
||||||
|
BigDecimal projectPrice = projectPriceMap.get(project.getId());
|
||||||
|
project.setProjectPrice(projectPrice == null ? BigDecimal.ZERO : projectPrice);
|
||||||
|
}
|
||||||
|
return commonService.convertList(projectList, ProjectCardVO.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web端管理员根据id查询项目
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ProjectVO queryProjectById(CommonRequest commonRequest) {
|
||||||
|
Long id = commonRequest.getId();
|
||||||
|
Project project = this.getById(id);
|
||||||
|
ThrowUtils.throwIf(project == null, ErrorCode.OPERATION_ERROR, "当前项目不存在");
|
||||||
|
return commonService.copyProperties(project, ProjectVO.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,11 +1,17 @@
|
|||||||
package com.greenorange.promotion.service.project.impl;
|
package com.greenorange.promotion.service.project.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.common.ErrorCode;
|
||||||
|
import com.greenorange.promotion.exception.ThrowUtils;
|
||||||
|
import com.greenorange.promotion.model.dto.CommonBatchRequest;
|
||||||
import com.greenorange.promotion.model.entity.PromoCode;
|
import com.greenorange.promotion.model.entity.PromoCode;
|
||||||
import com.greenorange.promotion.service.project.PromoCodeService;
|
import com.greenorange.promotion.service.project.PromoCodeService;
|
||||||
import com.greenorange.promotion.mapper.PromoCodeMapper;
|
import com.greenorange.promotion.mapper.PromoCodeMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
* @description 针对表【promo_code(推广码信息表)】的数据库操作Service实现
|
* @description 针对表【promo_code(推广码信息表)】的数据库操作Service实现
|
||||||
@ -15,6 +21,19 @@ import org.springframework.stereotype.Service;
|
|||||||
public class PromoCodeServiceImpl extends ServiceImpl<PromoCodeMapper, PromoCode>
|
public class PromoCodeServiceImpl extends ServiceImpl<PromoCodeMapper, PromoCode>
|
||||||
implements PromoCodeService{
|
implements PromoCodeService{
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web端管理员批量删除推广码
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void delBatchPromoCode(CommonBatchRequest commonBatchRequest) {
|
||||||
|
List<Long> ids = commonBatchRequest.getIds();
|
||||||
|
LambdaQueryWrapper<PromoCode> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.in(PromoCode::getId, ids).eq(PromoCode::getPromoCodeStatus, true);
|
||||||
|
List<PromoCode> promoCodeList = this.list(lambdaQueryWrapper);
|
||||||
|
ThrowUtils.throwIf(promoCodeList.size() > 0, ErrorCode.OPERATION_ERROR, "当前推广码正在使用中,无法删除");
|
||||||
|
this.removeByIds(ids);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,10 +1,25 @@
|
|||||||
package com.greenorange.promotion.service.project.impl;
|
package com.greenorange.promotion.service.project.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.common.ErrorCode;
|
||||||
|
import com.greenorange.promotion.exception.ThrowUtils;
|
||||||
|
import com.greenorange.promotion.mapper.ProjectCommissionMapper;
|
||||||
|
import com.greenorange.promotion.mapper.UserInfoMapper;
|
||||||
|
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
|
||||||
|
import com.greenorange.promotion.model.entity.ProjectCommission;
|
||||||
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
|
||||||
|
import com.greenorange.promotion.model.entity.UserInfo;
|
||||||
|
import com.greenorange.promotion.service.project.ProjectCommissionService;
|
||||||
import com.greenorange.promotion.service.project.SubUserProjectCommissionService;
|
import com.greenorange.promotion.service.project.SubUserProjectCommissionService;
|
||||||
import com.greenorange.promotion.mapper.SubUserProjectCommissionMapper;
|
import com.greenorange.promotion.mapper.SubUserProjectCommissionMapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -15,6 +30,7 @@ import org.springframework.stereotype.Service;
|
|||||||
public class SubUserProjectCommissionServiceImpl extends ServiceImpl<SubUserProjectCommissionMapper, SubUserProjectCommission>
|
public class SubUserProjectCommissionServiceImpl extends ServiceImpl<SubUserProjectCommissionMapper, SubUserProjectCommission>
|
||||||
implements SubUserProjectCommissionService{
|
implements SubUserProjectCommissionService{
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package com.greenorange.promotion.service.settle;
|
package com.greenorange.promotion.service.settle;
|
||||||
|
|
||||||
|
import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.UserAccount;
|
import com.greenorange.promotion.model.entity.UserAccount;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 35880
|
* @author 35880
|
||||||
@ -10,4 +13,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
*/
|
*/
|
||||||
public interface UserAccountService extends IService<UserAccount> {
|
public interface UserAccountService extends IService<UserAccount> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序端用户添加用户账户
|
||||||
|
*/
|
||||||
|
void addUserAccount(UserAccountAddRequest userAccountAddRequest, HttpServletRequest request);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序端用户根据id修改用户账户信息
|
||||||
|
*/
|
||||||
|
void updateUserAccount(UserAccountUpdateRequest userAccountUpdateRequest, HttpServletRequest request);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
package com.greenorange.promotion.service.settle.impl;
|
package com.greenorange.promotion.service.settle.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest;
|
||||||
|
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.UserAccount;
|
import com.greenorange.promotion.model.entity.UserAccount;
|
||||||
|
import com.greenorange.promotion.service.common.CommonService;
|
||||||
import com.greenorange.promotion.service.settle.UserAccountService;
|
import com.greenorange.promotion.service.settle.UserAccountService;
|
||||||
import com.greenorange.promotion.mapper.UserAccountMapper;
|
import com.greenorange.promotion.mapper.UserAccountMapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -15,6 +20,33 @@ import org.springframework.stereotype.Service;
|
|||||||
public class UserAccountServiceImpl extends ServiceImpl<UserAccountMapper, UserAccount>
|
public class UserAccountServiceImpl extends ServiceImpl<UserAccountMapper, UserAccount>
|
||||||
implements UserAccountService{
|
implements UserAccountService{
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CommonService commonService;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序端用户添加用户账户
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void addUserAccount(UserAccountAddRequest userAccountAddRequest, HttpServletRequest request) {
|
||||||
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
UserAccount userAccount = commonService.copyProperties(userAccountAddRequest, UserAccount.class);
|
||||||
|
userAccount.setUserId(userId);
|
||||||
|
this.save(userAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序端用户根据id修改用户账户信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void updateUserAccount(UserAccountUpdateRequest userAccountUpdateRequest, HttpServletRequest request) {
|
||||||
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
UserAccount userAccount = commonService.copyProperties(userAccountUpdateRequest, UserAccount.class);
|
||||||
|
userAccount.setUserId(userId);
|
||||||
|
this.updateById(userAccount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,4 +22,10 @@ public interface WechatGetQrcodeService {
|
|||||||
* 微信小程序获取二维码
|
* 微信小程序获取二维码
|
||||||
*/
|
*/
|
||||||
String getWxQrCode(String inviteCode) throws IOException;
|
String getWxQrCode(String inviteCode) throws IOException;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信小程序获取课程码
|
||||||
|
*/
|
||||||
|
String getWxCourseQrCode(String inviteCode) throws Exception;
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
package com.greenorange.promotion.service.wechat.impl;
|
package com.greenorange.promotion.service.wechat.impl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import ch.qos.logback.core.util.MD5Util;
|
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.freewayso.image.combiner.ImageCombiner;
|
||||||
|
import com.freewayso.image.combiner.element.TextElement;
|
||||||
|
import com.freewayso.image.combiner.enums.BaseLine;
|
||||||
|
import com.freewayso.image.combiner.enums.OutputFormat;
|
||||||
|
import com.freewayso.image.combiner.enums.ZoomMode;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.greenorange.promotion.common.ErrorCode;
|
import com.greenorange.promotion.common.ErrorCode;
|
||||||
import com.greenorange.promotion.common.ResultUtils;
|
|
||||||
import com.greenorange.promotion.config.WxAccessToken;
|
import com.greenorange.promotion.config.WxAccessToken;
|
||||||
import com.greenorange.promotion.exception.BusinessException;
|
import com.greenorange.promotion.exception.BusinessException;
|
||||||
import com.greenorange.promotion.model.entity.FileInfo;
|
import com.greenorange.promotion.model.entity.FileInfo;
|
||||||
@ -19,16 +21,17 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.apache.commons.lang.RandomStringUtils;
|
import org.apache.commons.lang.RandomStringUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.Base64;
|
import java.net.URL;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -185,4 +188,145 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService {
|
|||||||
fileInfoService.save(fileInfo);
|
fileInfoService.save(fileInfo);
|
||||||
return biz + "-" + view;
|
return biz + "-" + view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信小程序获取课程码
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public String getWxCourseQrCode(String inviteCode) throws Exception {
|
||||||
|
String accessToken = (String) redisTemplate.opsForValue().get(ACCESS_TOKEN_KEY);
|
||||||
|
if (accessToken == null) {
|
||||||
|
accessToken = this.getAccessToken().getAccess_token();
|
||||||
|
}
|
||||||
|
Map<String, Object> param = new HashMap<>();
|
||||||
|
param.put("page", "pages/loginModule/register/register");
|
||||||
|
param.put("scene", "invitationCode=" + inviteCode);
|
||||||
|
param.put("width", 430);
|
||||||
|
param.put("check_path", false);
|
||||||
|
param.put("env_version", "develop");
|
||||||
|
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
|
||||||
|
String jsonParams = JSONUtil.toJsonStr(param);
|
||||||
|
byte[] responseBytes = HttpUtil.createPost(url)
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.body(jsonParams)
|
||||||
|
.execute()
|
||||||
|
.bodyBytes();
|
||||||
|
|
||||||
|
String courseTitle = "【早鸟42折】掌握CAD技能实战技能实战技能实战技能实战工作训练营";
|
||||||
|
String originalPrice = "2680元";
|
||||||
|
String discountPrice = "1680";
|
||||||
|
String discountText = "元券后价";
|
||||||
|
String FontType = "Microsoft YaHei UI";
|
||||||
|
int FontStyle = Font.PLAIN;
|
||||||
|
|
||||||
|
// 加载一张空白图像
|
||||||
|
String blankUrl = "https://img.picui.cn/free/2025/06/21/6856a072e9eea.png";
|
||||||
|
ImageCombiner combiner = new ImageCombiner(blankUrl, 341, 391, ZoomMode.WidthHeight, OutputFormat.PNG);
|
||||||
|
|
||||||
|
// 加载课程图片
|
||||||
|
String courseUrl = "https://img.picui.cn/free/2025/06/22/6856ef5908d4b.jpg";
|
||||||
|
BufferedImage courseImage = ImageIO.read(new URL(courseUrl));
|
||||||
|
|
||||||
|
// Graphics2D graphics = courseImage.createGraphics();
|
||||||
|
// graphics.setColor(Color.decode("#323232"));
|
||||||
|
// graphics.setFont(new Font("阿里巴巴普惠体", Font.PLAIN, 60));
|
||||||
|
// graphics.drawString("测试", 0, 80);
|
||||||
|
// graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
|
||||||
|
// graphics.drawString("测试", 0, 160);
|
||||||
|
// graphics.dispose();
|
||||||
|
|
||||||
|
// 将二维码数据转换为 BufferedImage
|
||||||
|
BufferedImage qrImage = ImageIO.read(new ByteArrayInputStream(responseBytes));
|
||||||
|
|
||||||
|
// 缩放图片(不失真)
|
||||||
|
Image scaledImage = qrImage.getScaledInstance(134, 134, Image.SCALE_SMOOTH);
|
||||||
|
BufferedImage resizedImage = new BufferedImage(134, 134, BufferedImage.TYPE_INT_RGB);
|
||||||
|
resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
|
||||||
|
|
||||||
|
combiner.setQuality(1f);
|
||||||
|
|
||||||
|
// 将课程图片合并到组合器中
|
||||||
|
combiner.addImageElement(courseImage, 18, 16, 306, 158, ZoomMode.WidthHeight).setRoundCorner(5).setCenter(true);
|
||||||
|
// 将二维码图片合并到组合器中
|
||||||
|
combiner.addImageElement(resizedImage, 190, 240);
|
||||||
|
|
||||||
|
// 绘制文本
|
||||||
|
TextElement courseTitleElement = new TextElement(courseTitle, FontType, FontStyle, 18, 20, 186);
|
||||||
|
courseTitleElement.setColor(Color.decode("#323232"))
|
||||||
|
.setCenter(true)
|
||||||
|
.setAutoBreakLine(306);
|
||||||
|
combiner.addElement(courseTitleElement);
|
||||||
|
|
||||||
|
TextElement originalPriceElement = new TextElement(originalPrice, FontType, FontStyle, 24, 56, 275);
|
||||||
|
originalPriceElement.setColor(Color.decode("#8C8C8C")).setStrikeThrough(true);
|
||||||
|
combiner.addElement(originalPriceElement);
|
||||||
|
|
||||||
|
TextElement discountedPriceElement = new TextElement(discountPrice, FontType, Font.BOLD, 28, 31, 343);
|
||||||
|
discountedPriceElement.setColor(Color.decode("#F84947")).setBaseLine(BaseLine.Base).setSpace(0.01f);
|
||||||
|
combiner.addElement(discountedPriceElement);
|
||||||
|
|
||||||
|
TextElement discountedTextElement = new TextElement(discountText, FontType, FontStyle, 16, discountedPriceElement.getX() + discountedPriceElement.getWidth(), 341);
|
||||||
|
discountedTextElement.setColor(Color.decode("#F84947")).setBaseLine(BaseLine.Base);
|
||||||
|
combiner.addElement(discountedTextElement);
|
||||||
|
|
||||||
|
combiner.combine();
|
||||||
|
|
||||||
|
InputStream resultStream = combiner.getCombinedImageStream();
|
||||||
|
byte[] resultBytes = resultStream.readAllBytes();
|
||||||
|
// 创建上传目录,如果不存在
|
||||||
|
String biz = "default";
|
||||||
|
String fileName = RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + "." + "png";
|
||||||
|
// 获取文件类型
|
||||||
|
String fileType = FileUtil.getSuffix(fileName);
|
||||||
|
// 获取view值
|
||||||
|
String view = RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
|
||||||
|
File file = new File(uploadDir + fileName);
|
||||||
|
if (!file.getParentFile().exists()) {
|
||||||
|
file.getParentFile().mkdirs();// 如果路径不存在则创建
|
||||||
|
}
|
||||||
|
// 将文件上传到目标位置
|
||||||
|
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file), BUFFER_SIZE)) {
|
||||||
|
bos.write(resultBytes);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new BusinessException(ErrorCode.OPERATION_ERROR, "文件上传失败,失败原因:" + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件大小
|
||||||
|
Double fileSize = file.length() / 1024.0;
|
||||||
|
fileSize = Double.valueOf(String.format("%.2f", fileSize));
|
||||||
|
// 获取文件哈希值
|
||||||
|
InputStream inputStream = new FileInputStream(file);
|
||||||
|
String hashValue = DigestUtils.sha256Hex(inputStream);
|
||||||
|
// 保存文件
|
||||||
|
FileInfo fileInfo = FileInfo.builder()
|
||||||
|
.name(fileName)
|
||||||
|
.type(fileType)
|
||||||
|
.size(fileSize)
|
||||||
|
.fileView(view)
|
||||||
|
.biz(biz)
|
||||||
|
.hashValue(hashValue)
|
||||||
|
.build();
|
||||||
|
fileInfoService.save(fileInfo);
|
||||||
|
return biz + "-" + view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// 获取本地图形环境
|
||||||
|
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||||
|
// 列出所有可用字体家族名
|
||||||
|
String[] families = ge.getAvailableFontFamilyNames();
|
||||||
|
|
||||||
|
// 打印全部字体(可选)
|
||||||
|
System.out.println("=== Available Font Families ===");
|
||||||
|
Arrays.stream(families).forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,14 @@ package com.greenorange.promotion.utils;
|
|||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.awt.font.LineBreakMeasurer;
|
||||||
|
import java.awt.font.TextLayout;
|
||||||
import java.awt.geom.Ellipse2D;
|
import java.awt.geom.Ellipse2D;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.text.AttributedString;
|
||||||
|
|
||||||
public class QRCodeUtil {
|
public class QRCodeUtil {
|
||||||
|
|
||||||
@ -128,4 +131,9 @@ public class QRCodeUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ spring:
|
|||||||
data:
|
data:
|
||||||
redis:
|
redis:
|
||||||
port: 6379
|
port: 6379
|
||||||
host: 154.8.193.216
|
host: 27.30.77.229
|
||||||
database: 7
|
database: 7
|
||||||
password: Cksys6509
|
password: Cksys6509
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ spring:
|
|||||||
data:
|
data:
|
||||||
redis:
|
redis:
|
||||||
port: 6379
|
port: 6379
|
||||||
host: 154.8.193.216
|
host: 27.30.77.229
|
||||||
database: 9
|
database: 9
|
||||||
password: Cksys6509
|
password: Cksys6509
|
||||||
|
|
||||||
@ -28,8 +28,8 @@ spring:
|
|||||||
|
|
||||||
#文件上传和下载地址
|
#文件上传和下载地址
|
||||||
file:
|
file:
|
||||||
upload-dir: /www/wwwroot/fileUpload_qc/
|
# upload-dir: /www/wwwroot/fileUpload_qc/
|
||||||
# upload-dir: D:/qingcheng/image/
|
upload-dir: D:/qingcheng/image/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
95
src/main/resources/application-practice.yml
Normal file
95
src/main/resources/application-practice.yml
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://27.30.77.229:3306/qingcheng_practice?serverTimezone=Asia/Shanghai
|
||||||
|
username: yyt&jwh
|
||||||
|
password: Qc@A8k3M5q2
|
||||||
|
hikari:
|
||||||
|
maximum-pool-size: 30
|
||||||
|
max-lifetime: 120000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data:
|
||||||
|
redis:
|
||||||
|
port: 6379
|
||||||
|
host: 27.30.77.229
|
||||||
|
database: 10
|
||||||
|
password: Cksys6509
|
||||||
|
|
||||||
|
servlet:
|
||||||
|
multipart:
|
||||||
|
max-file-size: 20MB
|
||||||
|
max-request-size: 20MB
|
||||||
|
jackson:
|
||||||
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
|
time-zone: GMT+8
|
||||||
|
|
||||||
|
|
||||||
|
#文件上传和下载地址
|
||||||
|
file:
|
||||||
|
upload-dir: /www/wwwroot/fileUpload_qc/
|
||||||
|
# upload-dir: D:/qingcheng/image/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
springdoc:
|
||||||
|
default-flat-param-object: true
|
||||||
|
|
||||||
|
#线程池配置
|
||||||
|
threadpool:
|
||||||
|
corePoolSize: 10
|
||||||
|
maxPoolSize: 50
|
||||||
|
queueCapacity: 1024
|
||||||
|
keepAliveTime: 60
|
||||||
|
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 9091
|
||||||
|
|
||||||
|
|
||||||
|
mybatis-plus:
|
||||||
|
mapper-locations: classpath:mapper/*.xml
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: false
|
||||||
|
# log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
|
||||||
|
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
|
global-config:
|
||||||
|
db-config:
|
||||||
|
logic-delete-field: isDelete #全局逻辑删除的实体字段名
|
||||||
|
logic-delete-value: 1 #逻辑已删除值(默认为1)
|
||||||
|
logic-not-delete-value: 0 #逻辑未删除值(默认为0)
|
||||||
|
type-handlers-package: com.cultural.heritage.handler
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wx:
|
||||||
|
mini:
|
||||||
|
appId: wx3f968a09e31d6bed
|
||||||
|
appSecret: 0b23498d19665dc323efdd3ed5367041
|
||||||
|
|
||||||
|
pay:
|
||||||
|
#应用id(小程序id)
|
||||||
|
appId: wx61b63e27bddf4ea2
|
||||||
|
#商户号
|
||||||
|
merchantId: 1700326544
|
||||||
|
# #商户API私钥
|
||||||
|
# privateKeyPath: apiclient_key.pem
|
||||||
|
#商户证书序列号
|
||||||
|
merchantSerialNumber: 6DC8953AB741D309920DA650B92F837BE38A2757
|
||||||
|
# #商户APIv3密钥
|
||||||
|
# apiV3Key: fbemuj4Xql7CYlQJAoTEPYxvPSNgYT2t
|
||||||
|
#通知地址
|
||||||
|
notifyUrl: https://winning-mouse-internally.ngrok-free.app
|
||||||
|
#微信服务器地址
|
||||||
|
domain: https://api.mch.weixin.qq.com
|
||||||
|
#商户APIv2密钥
|
||||||
|
apiV2Key: cvsOH6TgbbdNUUqFJyLmWGaIEKoSqANg
|
||||||
|
#商户API证书
|
||||||
|
certificatePath: static/apiclient_cert.p12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
knife4j:
|
||||||
|
enable: true
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user