Compare commits

1 Commits

Author SHA1 Message Date
5c6b502c1e 我修复了boss与admin创建相同账号无校验 2025-06-27 14:57:42 +08:00
176 changed files with 2329 additions and 8680 deletions

12
pom.xml
View File

@ -214,18 +214,6 @@
<version>2.6.9</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.8.7</version> <!-- 换成你项目里使用的 Spring Security 版本 -->
</dependency>
<!--rabbitmq依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

View File

@ -5,9 +5,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
@MapperScan("com.greenorange.promotion.mapper")
public class GreenOrangeApplication {

View File

@ -4,7 +4,6 @@ import com.auth0.jwt.interfaces.DecodedJWT;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.model.enums.UserRoleEnum;
@ -21,8 +20,6 @@ import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@ -58,56 +55,28 @@ public class PermissionCheck {
ThrowUtils.throwIf(interfaceRoleEnum == null, ErrorCode.NO_AUTH_ERROR);
// 获取用户权限
String token = request.getHeader("Authorization");
ThrowUtils.throwIf(StringUtils.isBlank(token), ErrorCode.NO_AUTH_ERROR, "token为空");
ThrowUtils.throwIf(StringUtils.isBlank(token), ErrorCode.NO_AUTH_ERROR, "JWT为空");
// 解析token
DecodedJWT decodedJWT;
try {
decodedJWT = jwtUtils.verify(token);
} catch (Exception e) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "token已过期");
}
DecodedJWT decodedJWT = jwtUtils.verify(token);
String userAccount = decodedJWT.getClaim("userAccount").asString();
String userPassword = decodedJWT.getClaim("userPassword").asString();
String userRole = decodedJWT.getClaim("userRole").asString();
// 查询用户信息
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserInfo::getUserAccount, userAccount).eq(UserInfo::getUserPassword, userPassword);
// 如果是小程序用户, 就加上权限条件
lambdaQueryWrapper.eq(StringUtils.isNotBlank(userRole), UserInfo::getUserRole, userRole);
UserInfo userInfo = userInfoService.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "用户不存在");
// 将用户id存入request方便后续在接口中使
// 将用户id存入request于记录日志
request.setAttribute("userId", userInfo.getId());
// 获取用户权限的枚举类
if (userRole == null) userRole = userInfo.getUserRole();
String userRole = userInfo.getUserRole();
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
// 接口权限只能是 USERADMINBOSS用户权限是 ADMINBOSSUSERBAN
// 校验角色
ThrowUtils.throwIf(UserRoleEnum.BAN.equals(userRoleEnum), ErrorCode.PARAMS_ERROR, "用户已被封禁");
Map<UserRoleEnum, Integer> userRoleMap = new HashMap<>();
userRoleMap.put(UserRoleEnum.USER, 1);
userRoleMap.put(UserRoleEnum.STAFF, 2);
userRoleMap.put(UserRoleEnum.SUPERVISOR, 3);
userRoleMap.put(UserRoleEnum.MANAGER, 4);
userRoleMap.put(UserRoleEnum.ADMIN, 5);
userRoleMap.put(UserRoleEnum.BOSS, 6);
Integer userRoleNumber = userRoleMap.get(userRoleEnum);
Integer interfaceRoleNumber = userRoleMap.get(interfaceRoleEnum);
if (userRoleNumber == 1) {
ThrowUtils.throwIf(interfaceRoleNumber > 1, ErrorCode.NO_AUTH_ERROR);
} else if (userRoleNumber == 2) {
ThrowUtils.throwIf(interfaceRoleNumber > 2, ErrorCode.NO_AUTH_ERROR);
} else if (userRoleNumber == 3) {
ThrowUtils.throwIf(interfaceRoleNumber > 3, ErrorCode.NO_AUTH_ERROR);
} else if (userRoleNumber == 4) {
ThrowUtils.throwIf(interfaceRoleNumber > 4, ErrorCode.NO_AUTH_ERROR);
} else if (userRoleNumber == 5) {
ThrowUtils.throwIf(interfaceRoleNumber != 5, ErrorCode.NO_AUTH_ERROR);
} else {
ThrowUtils.throwIf(interfaceRoleNumber < 5, ErrorCode.NO_AUTH_ERROR);
}
ThrowUtils.throwIf(UserRoleEnum.USER.equals(userRoleEnum) && !UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR);
ThrowUtils.throwIf(UserRoleEnum.BAN.equals(userRoleEnum), ErrorCode.NO_AUTH_ERROR, "用户已被封禁");
ThrowUtils.throwIf(UserRoleEnum.ADMIN.equals(userRoleEnum) && UserRoleEnum.BOSS.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR);
return joinPoint.proceed();
}

View File

@ -4,7 +4,7 @@ import lombok.Getter;
@Getter
public enum ErrorCode {
// private static final SUCESS = new ErrorCode(1, "ok");
SUCCESS(1,"ok"),
PARAMS_ERROR(40000,"请求参数错误"),
NOT_LOGIN_ERROR(40100,"未登录"),

View File

@ -16,27 +16,15 @@ public class CorsConfig {
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
// 1. 准备一个“规则源”,用于给不同路径配置 CORS 规则
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 2. 创建一个“跨域配置”对象,往里填各种允许/不允许的选项
CorsConfiguration config = new CorsConfiguration();
// 【允许携带 Cookie 这类 “凭证”】
// 携带cookie
config.setAllowCredentials(true);
// 【允许的来源域名】
// 用通配符 "*",表示不管从哪个域来的,都允许。
// 这里用的是 addAllowedOriginPattern而不是 addAllowedOrigin
// 是为了和 allowCredentials(true) 一起使用时不报错。
// 放行哪些域名(必须用 patterns否则 * 会和 allowCredentials 冲突)
config.addAllowedOriginPattern("*");
// 【允许的请求头】
// 客户端可以带哪些自定义的 HTTP 头,比如 Content-Type、X-Token…
config.addAllowedHeader("*");
// 【允许的请求方法】
// GET、POST、PUT、DELETE、OPTIONS……所有都放行
config.addAllowedMethod("*");
// 把上面这套“跨域规则”注册到所有接口路径(/**
source.registerCorsConfiguration("/**", config);
// 3.用这套规则,创建一个 CorsFilter 过滤器,
// 4.并把它交给 Spring 管理,优先级设为最高
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;

View File

@ -1,25 +0,0 @@
package com.greenorange.promotion.config;
import org.springframework.amqp.support.converter.DefaultClassMapper;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public MessageConverter jsonToMapMessageConverter() {
DefaultClassMapper defaultClassMapper = new DefaultClassMapper();
defaultClassMapper.setTrustedPackages("com.greenorange.promotion.utils.MultiDelayMessage"); // trusted packages
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
jackson2JsonMessageConverter.setClassMapper(defaultClassMapper);
return jackson2JsonMessageConverter;
}
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}

View File

@ -18,13 +18,8 @@ public class RedisConfig {
// 指定kv的序列化方式
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
// 普通 KV 用 JSON 序列化 value用字符串序列化 key
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// Hash 类型hashKey 用字符串序列化hashValue 也用字符串
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}

View File

@ -1,44 +0,0 @@
//package com.greenorange.promotion.config;
//
//import cn.binarywang.wx.miniapp.api.WxMaService;
//import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
//import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Configuration;
//
//@Data
//@Slf4j
//@Configuration
//@ConfigurationProperties(prefix = "wx.mini")
//public class WxOpenConfig {
//
// private String appId;
//
// private String appSecret;
//
// private WxMaService wxMaService;
//
// /**
// * 单例模式
// */
// public WxMaService getWxMaService() {
// if (wxMaService != null) {
// return wxMaService;
// }
// synchronized (this) {
// if (wxMaService != null) {
// return wxMaService;
// }
// WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
// config.setAppid(appId);
// config.setSecret(appSecret);
// WxMaService service = new WxMaServiceImpl();
// service.setWxMaConfig(config);
// wxMaService = service;
// return wxMaService;
// }
// }
//
//}

View File

@ -1,78 +0,0 @@
//package com.greenorange.promotion.config;
//
//import com.wechat.pay.java.core.RSAAutoCertificateConfig;
//import com.wechat.pay.java.core.util.IOUtil;
//import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
//import com.wechat.pay.java.service.refund.RefundService;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//
//@Data
//@Slf4j
//@Configuration
//@Component("WxPayConfig")
//@ConfigurationProperties(prefix = "wx.pay")
//public class WxPayConfig {
//
// private String appId;
//
// private String apiV3Key;
//
// private String notifyUrl;
//
// private String merchantId;
//
// private String privateKeyPath;
//
// private String merchantSerialNumber;
//
// // RSA配置
// private RSAAutoCertificateConfig RSAConfig;
//
// // JSAPI支付
// private JsapiServiceExtension jsapiServiceExtension;
//
// // 退款
// private RefundService refundService;
//
// /**
// * 初始化配置
// */
// @Bean
// public boolean initWxPayConfig() throws IOException {
// this.RSAConfig = buildRSAAutoCertificateConfig();
// this.jsapiServiceExtension = buildJsapiServiceExtension(RSAConfig);
// this.refundService = buildRefundService(RSAConfig);
// return true;
// }
//
// // 构建并使用自动更新平台证书的RSA配置一个商户号只能初始化一个配置否则会因为重复的下载任务报错
// private RSAAutoCertificateConfig buildRSAAutoCertificateConfig() throws IOException {
// // 将 resource 目录下的文件转为 InputStream然后利用 IOUtil.toString(inputStream) 转化为密钥
// String privateKey = IOUtil.toString(new ClassPathResource(privateKeyPath).getInputStream());
// return new RSAAutoCertificateConfig.Builder()
// .merchantId(merchantId)
// .privateKey(privateKey)
// .merchantSerialNumber(merchantSerialNumber)
// .apiV3Key(apiV3Key)
// .build();
// }
//
// // 构建JSAPI支付
// private JsapiServiceExtension buildJsapiServiceExtension(RSAAutoCertificateConfig config) {
// return new JsapiServiceExtension.Builder().config(config).build();
// }
//
// // 构建退款
// private RefundService buildRefundService(RSAAutoCertificateConfig config) {
// return new RefundService.Builder().config(config).build();
// }
//
//}

View File

@ -13,6 +13,6 @@ public interface CommonConstant {
/**
* 降序
*/
String SORT_ORDER_DESC = "descend";
String SORT_ORDER_DESC = " descend";
}

View File

@ -1,17 +0,0 @@
package com.greenorange.promotion.constant;
import java.util.List;
public interface MqConstant {
List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 120000L, 120000L, 300000L);
// List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L);
String DELAY_EXCHANGE = "delay.topic";
String DELAY_ORDER_QUEUE = "order.delay.queue";
String DELAY_ORDER_ROUTING_KEY = "order.key";
}

View File

@ -1,7 +1,5 @@
package com.greenorange.promotion.constant;
import java.math.BigDecimal;
public interface SystemConstant {
/**
@ -13,36 +11,6 @@ public interface SystemConstant {
/**
* 文件公共前缀
*/
String FILE_COMMON_PREFIX = "http://160.202.242.36:9091/file/download/";
/**
* 默认头像view值
*/
String DEFAULT_AVATAR_VIEW = "default-QU7P9SD5";
/**
* 一级抽成比例
*/
BigDecimal FIRST_LEVEL_COMMISSION_RATE = new BigDecimal("0.02");
/**
* 二级抽成比例
*/
BigDecimal SECOND_LEVEL_COMMISSION_RATE = new BigDecimal("0.03");
/**
* 退款比例
*/
BigDecimal REFUND_RATE = new BigDecimal("0.8");
/**
* 手续费比例
*/
BigDecimal FEE_RATE = new BigDecimal("0.2");
String FILE_COMMON_PREFIX = "http://27.30.77.229:9091/file/download/";
}

View File

@ -14,7 +14,7 @@ public interface UserConstant {
/**
* 用户默认头像
*/
String USER_DEFAULT_AVATAR = SystemConstant.DEFAULT_AVATAR_VIEW;
String USER_DEFAULT_AVATAR = "";
/**
@ -43,28 +43,4 @@ public interface UserConstant {
*/
String BAN_ROLE = "ban";
/**
* 经理
*/
String MANAGER_ROLE = "manager";
/**
* 主管
*/
String SUPERVISOR_ROLE = "supervisor";
/**
* 员工
*/
String STAFF_ROLE = "staff";
/**
* 员工申请须知
*/
String APPLY_NOTICE_KEY = "applyNotice";
/**
* 课程购买须知
*/
String COURSE_DESC_KEY = "courseDesc";
}

View File

@ -1,149 +0,0 @@
package com.greenorange.promotion.controller.course;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.model.dto.CommonStringRequest;
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.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 轮播图 控制器
*/
@RestController
@RequestMapping("banner")
@Slf4j
@Tag(name = "轮播图模块")
@Transactional
public class BannerController {
@Resource
private RedisTemplate<String, String> redisTemplate;
private static final String BANNER_KEY = "banners:list";
private static final String TOMBSTONE = "\u0000__DEL__\u0000"; // 删除占位符,极低冲突
/**
* web端管理员添加轮播图
* @param commonStringRequest 图片view值
* @return 是否添加成功
*/
@PostMapping("add")
@Operation(summary = "web端管理员添加轮播图", description = "参数图片view值权限管理员方法名addBanner")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> addBanner(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String view = commonStringRequest.getTemplateString();
redisTemplate.opsForList().rightPush(BANNER_KEY, view);
return ResultUtils.success(true);
}
/**
* 删除轮播图(根据索引)
* @param index 索引
* @return 是否添加成功
*/
@PostMapping("del")
@Operation(summary = "删除轮播图(根据索引)", description = "参数图片view值权限管理员方法名delBanner")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> delBanner(@RequestParam long index) {
long len = getLenOrThrow();
long idx = normalizeIndex(index, len);
try {
// 先把该位置设置为占位符
redisTemplate.opsForList().set(BANNER_KEY, idx, TOMBSTONE);
// 再删除第一个占位符
Long removed = redisTemplate.opsForList().remove(BANNER_KEY, 1, TOMBSTONE);
boolean ok = removed != null && removed > 0;
log.info("按索引删除轮播图index={}, removed={}", idx, ok);
return ResultUtils.success(ok);
} catch (Exception e) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "索引越界或参数错误");
}
}
/**
* 修改轮播图(根据索引)
* @param index 索引
* @param newView 新的图片view值
* @return 是否添加成功
*/
@PostMapping("modify")
@Operation(summary = "修改轮播图(根据索引)", description = "参数图片view值权限管理员方法名delBanner")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> modifyBanner(@RequestParam long index, @RequestParam String newView) {
long len = getLenOrThrow();
long idx = normalizeIndex(index, len); // 支持 -1
try {
redisTemplate.opsForList().set(BANNER_KEY, idx, newView);
log.info("更新轮播图index={} -> {}", idx, newView);
return ResultUtils.success(true);
} catch (Exception e) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "索引越界或参数错误");
}
}
/**
* web端获取所有轮播图按添加顺序
*/
@GetMapping("web/list")
@Operation(summary = "web端获取所有轮播图按添加顺序", description = "按添加顺序返回")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<String>> webListBanners() {
List<String> banners = redisTemplate.opsForList().range(BANNER_KEY, 0, -1);
return ResultUtils.success(banners);
}
/**
* 小程序端获取所有轮播图(按添加顺序)
*/
@GetMapping("mini/list")
@Operation(summary = "小程序端获取所有轮播图(按添加顺序)", description = "按添加顺序返回")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<List<String>> miniListBanners() {
List<String> banners = redisTemplate.opsForList().range(BANNER_KEY, 0, -1);
return ResultUtils.success(banners);
}
/* ===== 工具方法 ===== */
/** 获取列表长度,不存在或为空时抛错 */
private long getLenOrThrow() {
Long len = redisTemplate.opsForList().size(BANNER_KEY);
if (len == null || len == 0) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "轮播图列表为空");
}
return len;
}
/** 归一化索引(支持负索引),并做范围校验 */
private long normalizeIndex(long index, long len) {
long idx = index < 0 ? len + index : index; // -1 -> len-1
if (idx < 0 || idx >= len) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "索引越界:" + index);
}
return idx;
}
}

View File

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

View File

@ -10,6 +10,7 @@ import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
@ -18,10 +19,16 @@ import com.greenorange.promotion.model.dto.course.CourseAddRequest;
import com.greenorange.promotion.model.dto.course.CourseQueryRequest;
import com.greenorange.promotion.model.dto.course.CourseUpdateRequest;
import com.greenorange.promotion.model.entity.Course;
import com.greenorange.promotion.model.entity.CourseChapter;
import com.greenorange.promotion.model.entity.CourseQrcodeApply;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.model.vo.course.CourseCardVO;
import com.greenorange.promotion.model.vo.course.CourseDetailVO;
import com.greenorange.promotion.model.vo.course.CourseVO;
import com.greenorange.promotion.model.vo.courseChapter.CourseChapterVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CourseChapterService;
import com.greenorange.promotion.service.course.CourseQrcodeApplyService;
import com.greenorange.promotion.service.course.CourseService;
import com.greenorange.promotion.service.wechat.WechatGetQrcodeService;
import io.swagger.v3.oas.annotations.Operation;
@ -30,7 +37,6 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -49,7 +55,6 @@ import java.util.stream.Collectors;
@RequestMapping("course")
@Slf4j
@Tag(name = "课程模块")
@Transactional
public class CourseController {
@Resource
@ -58,6 +63,16 @@ public class CourseController {
@Resource
private CommonService commonService;
@Resource
private CourseChapterService courseChapterService;
@Resource
private WechatGetQrcodeService wechatGetQrcodeService;
@Resource
private CourseQrcodeApplyService courseQrcodeApplyService;
/**
* 小程序端用户查看热门课程列表
@ -97,26 +112,6 @@ public class CourseController {
}
/**
* 小程序端用户根据名称搜索课程
* @param commonStringRequest 搜索关键词
* @return 课程信息列表
*/
@PostMapping("query/keyword")
@Operation(summary = "小程序端用户根据类别查看课程列表", description = "参数搜索关键词权限管理员方法名miniQueryCourseByKeyword")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户根据名称搜索课程")
public BaseResponse<List<CourseCardVO>> miniQueryCourseByKeyword(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String keyword = commonStringRequest.getTemplateString();
LambdaQueryWrapper<Course> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Course::getIsShelves, 1);
lambdaQueryWrapper.like(Course::getName, keyword);
List<Course> courseList = courseService.list(lambdaQueryWrapper);
List<CourseCardVO> courseCardVOS = commonService.convertList(courseList, CourseCardVO.class);
return ResultUtils.success(courseCardVOS);
}
/**
* 小程序端用户根据id查询课程详情
* @param commonRequest 课程id
@ -129,10 +124,29 @@ public class CourseController {
Long id = commonRequest.getId();
Course course = courseService.getById(id);
CourseDetailVO courseDetailVO = commonService.copyProperties(course, CourseDetailVO.class);
LambdaQueryWrapper<CourseChapter> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(CourseChapter::getCourseId, id);
List<CourseChapter> courseChapterList = courseChapterService.list(lambdaQueryWrapper);
List<CourseChapterVO> courseChapterVOS = commonService.convertList(courseChapterList, CourseChapterVO.class);
courseDetailVO.setCourseChapters(courseChapterVOS);
return ResultUtils.success(courseDetailVO);
}
/**
* 小程序端用户生成课程推广码
* @param commonRequest 课程id
* @return 课程信息列表
*/
@PostMapping("generate/qrcode")
@Operation(summary = "小程序端用户生成课程推广码", description = "参数课程id权限管理员方法名miniGenerateQrcode")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户生成课程推广码")
public BaseResponse<String> miniGenerateQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception {
String videoView = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request);
return ResultUtils.success(videoView);
}
/**
* 小程序端用户根据id查看课程基本信息
@ -151,6 +165,24 @@ public class CourseController {
}
/**
* 小程序端用户查看当前课程推广码
* @param commonRequest 课程id
* @return 课程推广码(view值)
*/
@PostMapping("verify")
@Operation(summary = "小程序端用户查看当前课程推广码", description = "参数课程id权限管理员方法名verifyIsApplyCourseQrcode")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户查看当前课程推广码")
public BaseResponse<String> verifyIsApplyCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
Long courseId = commonRequest.getId();
LambdaQueryWrapper<CourseQrcodeApply> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(CourseQrcodeApply::getUserId, userId).eq(CourseQrcodeApply::getCourseId, courseId);
CourseQrcodeApply courseQrcodeApply = courseQrcodeApplyService.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(courseQrcodeApply == null, ErrorCode.OPERATION_ERROR, "当前用户尚未申请该课程的推广码");
return ResultUtils.success(courseQrcodeApply.getCourseQrcode());
}
@ -168,6 +200,9 @@ public class CourseController {
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程管理", content = "web端管理员添加课程")
public BaseResponse<Long> addCourse(@Valid @RequestBody CourseAddRequest courseAddRequest) {
BigDecimal firstLevelRate = courseAddRequest.getFirstLevelRate();
BigDecimal secondLevelRate = courseAddRequest.getSecondLevelRate();
ThrowUtils.throwIf(firstLevelRate.compareTo(secondLevelRate) < 0, ErrorCode.PARAMS_ERROR, "一级佣金比例不能小于二级佣金比例");
Course course = commonService.copyProperties(courseAddRequest, Course.class);
courseService.save(course);
return ResultUtils.success(course.getId());
@ -200,6 +235,9 @@ public class CourseController {
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);
}
@ -215,6 +253,10 @@ public class CourseController {
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);
}

View File

@ -10,7 +10,6 @@ import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.OrderStatusConstant;
import com.greenorange.promotion.constant.SystemConstant;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
@ -18,20 +17,14 @@ import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest;
import com.greenorange.promotion.model.entity.*;
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.model.entity.Course;
import com.greenorange.promotion.model.entity.CourseOrder;
import com.greenorange.promotion.model.vo.course.CourseCardVO;
import com.greenorange.promotion.model.vo.course.CourseVO;
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderBaseInfoVO;
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderCardVO;
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CourseOrderService;
import com.greenorange.promotion.service.course.CoursePromotionCommissionPendingService;
import com.greenorange.promotion.service.course.CourseService;
import com.greenorange.promotion.service.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserPerformanceSummaryService;
import com.greenorange.promotion.utils.OrderNumberUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -39,17 +32,13 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
@ -59,7 +48,6 @@ import java.util.function.Function;
@RequestMapping("courseOrder")
@Slf4j
@Tag(name = "课程订单模块")
@Transactional
public class CourseOrderController {
@Resource
@ -71,15 +59,6 @@ public class CourseOrderController {
@Resource
private CommonService commonService;
@Resource
private UserInfoService userInfoService;
@Resource
private UserPerformanceSummaryService userPerformanceSummaryService;
@Resource
private CoursePromotionCommissionPendingService coursePromotionCommissionPendingService;
/**
* 小程序端用户生成课程订单
* @param courseOrderAddRequest 课程id
@ -91,173 +70,18 @@ public class CourseOrderController {
@SysLog(title = "课程订单管理", content = "小程序端用户生成课程订单")
public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
UserInfo userInfo = userInfoService.getById(userId);
String userRole = userInfo.getUserRole();
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
ThrowUtils.throwIf(!UserRoleEnum.USER.equals(userRoleEnum), ErrorCode.NO_AUTH_ERROR, "只有普通用户才能创建订单");
Long courseId = courseOrderAddRequest.getCourseId();
Course course = courseService.getById(courseId);
ThrowUtils.throwIf(course == null, ErrorCode.OPERATION_ERROR, "该课程不存在");
CourseVO courseVO = commonService.copyProperties(course, CourseVO.class);
CourseOrder courseOrder = commonService.copyProperties(courseVO, CourseOrder.class);
courseOrder.setId(null);
courseOrder.setCourseId(courseId);
CourseOrder courseOrder = commonService.copyProperties(course, CourseOrder.class);
courseOrder.setOrderNumber(OrderNumberUtils.generateOrderId());
courseOrder.setTotalAmount(course.getDiscountPrice());
courseOrder.setUserId(userId);
courseOrderService.save(courseOrder);
// 向消息队列中发送订单创建的消息
courseOrderService.sendCreateOrderMessage(courseOrder.getId());
return ResultUtils.success(courseOrder.getId());
}
/**
* 模拟订单支付回调
*/
@PostMapping("payment")
@Operation(summary = "模拟订单支付回调", description = "参数订单id权限管理员方法名paymentCourse")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<Boolean> paymentCourse(@Valid @RequestBody CommonRequest commonRequest) {
System.out.println("---------------------------微信支付回调(开始)-------------------------------");
// 获取订单信息
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
// 修改订单状态
LambdaUpdateWrapper<CourseOrder> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(CourseOrder::getId, courseOrder.getId())
.set(CourseOrder::getOrderStatus, OrderStatusConstant.SUCCESS);
courseOrderService.update(updateWrapper);
// 修改当前课程下单人数
Long courseId = courseOrder.getCourseId();
Course course = courseService.getById(courseId);
if (course != null) {
course.setOrderCount(course.getOrderCount() + 1);
courseService.updateById(course);
}
// 更新主管和员工的绩效记录
Long userId = courseOrder.getUserId();
List<Long> pathToRoot = userInfoService.findPathToRoot(userId);
List<Long> subPathToRoot = pathToRoot.subList(1, 3);
List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetFieldWithSpecificFields(
subPathToRoot, userPerformanceSummaryService, Function.identity(), UserPerformanceSummary::getUserId,
List.of(UserPerformanceSummary::getTotalAmount, UserPerformanceSummary::getNetAmount, UserPerformanceSummary::getOrderCount,
UserPerformanceSummary::getToRelease, UserPerformanceSummary::getToSettle));
BigDecimal rate;
Map<String, BigDecimal> rateMap = userPerformanceSummaryService.queryRakeRewardsRate();
for (int i = 0; i < userPerformanceSummaryList.size(); i ++ ) {
if (i == 0) rate = rateMap.get("first");
else rate = rateMap.get("second");
// 计算理论上获得的最大提成奖励
BigDecimal rakeRewards = courseOrder.getTotalAmount().multiply(rate);
UserPerformanceSummary userPerformanceSummary = userPerformanceSummaryList.get(i);
userPerformanceSummary.setTotalAmount(userPerformanceSummary.getTotalAmount().add(courseOrder.getTotalAmount()));
userPerformanceSummary.setNetAmount(userPerformanceSummary.getNetAmount().add(courseOrder.getTotalAmount().multiply(SystemConstant.FEE_RATE)));
userPerformanceSummary.setOrderCount(userPerformanceSummary.getOrderCount() + 1);
userPerformanceSummary.setToRelease(userPerformanceSummary.getToRelease().add(rakeRewards.multiply(SystemConstant.REFUND_RATE)));
userPerformanceSummary.setToSettle(userPerformanceSummary.getToSettle().add(rakeRewards.multiply(SystemConstant.FEE_RATE)));
}
userPerformanceSummaryService.updateBatchById(userPerformanceSummaryList);
// 添加课程推广待提成记录
Long firstUserId = subPathToRoot.get(0);
Long secondUserId = subPathToRoot.get(1);
CoursePromotionCommissionPending coursePromotionCommissionPending = CoursePromotionCommissionPending.builder()
.firstUserId(firstUserId)
.secondUserId(secondUserId)
.courseId(courseId)
.name(courseOrder.getName())
.type(courseOrder.getType())
.image(courseOrder.getImage())
.orderId(courseOrder.getId())
.userId(userId)
.firstRate(rateMap.get("first"))
.secondRate(rateMap.get("second"))
.firstReward(courseOrder.getTotalAmount().multiply(rateMap.get("first")))
.secondReward(courseOrder.getTotalAmount().multiply(rateMap.get("second")))
.totalAmount(courseOrder.getTotalAmount())
.commissionStatus(CommissionStatusEnum.PENDING.getValue())
.orderCreateTime(courseOrder.getCreateTime())
.build();
coursePromotionCommissionPendingService.save(coursePromotionCommissionPending);
System.out.println("---------------------------微信支付回调(结束)-------------------------------");
return ResultUtils.success(true);
}
/**
* 模拟订单退款回调
*/
@PostMapping("refund")
@Operation(summary = "模拟订单退款回调", description = "参数订单id权限管理员方法名refundCourse")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> refundCourse(@Valid @RequestBody CommonRequest commonRequest) {
System.out.println("---------------------------微信退款回调(开始)-------------------------------");
// 获取订单信息
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
// 修改订单状态
LambdaUpdateWrapper<CourseOrder> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(CourseOrder::getId, courseOrder.getId())
.set(CourseOrder::getOrderStatus, OrderStatusConstant.REFUNDED);
courseOrderService.update(updateWrapper);
// 修改课程下单人数
Long courseId = courseOrder.getCourseId();
Course course = courseService.getById(courseId);
if (course != null) {
course.setOrderCount(course.getOrderCount() - 1);
courseService.updateById(course);
}
// 更新主管和员工的绩效记录
Long userId = courseOrder.getUserId();
List<Long> pathToRoot = userInfoService.findPathToRoot(userId);
List<Long> superUserIdList = pathToRoot.subList(1, 3);
List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetFieldWithSpecificFields(
superUserIdList, userPerformanceSummaryService, Function.identity(), UserPerformanceSummary::getUserId,
List.of(UserPerformanceSummary::getTotalAmount, UserPerformanceSummary::getToRelease, UserPerformanceSummary::getRefunded));
BigDecimal rate;
LambdaQueryWrapper<CoursePromotionCommissionPending> coursePromotionQueryWrapper = new LambdaQueryWrapper<>();
coursePromotionQueryWrapper.eq(CoursePromotionCommissionPending::getOrderId, courseOrder.getId());
CoursePromotionCommissionPending coursePromotionCommissionPending = coursePromotionCommissionPendingService.getOne(coursePromotionQueryWrapper);
for (int i = 0; i < userPerformanceSummaryList.size(); i ++ ) {
if (i == 0) rate = coursePromotionCommissionPending.getFirstRate();
else rate = coursePromotionCommissionPending.getSecondRate();
// 计算理论上获得的最大提成奖励
BigDecimal rakeRewards = courseOrder.getTotalAmount().multiply(rate);
UserPerformanceSummary userPerformanceSummary = userPerformanceSummaryList.get(i);
userPerformanceSummary.setTotalAmount(userPerformanceSummary.getTotalAmount().subtract(courseOrder.getTotalAmount().multiply(SystemConstant.REFUND_RATE)));
userPerformanceSummary.setToRelease(userPerformanceSummary.getToRelease().subtract(rakeRewards.multiply(SystemConstant.REFUND_RATE)));
userPerformanceSummary.setRefunded(userPerformanceSummary.getRefunded().add(rakeRewards.multiply(SystemConstant.REFUND_RATE)));
}
userPerformanceSummaryService.updateBatchById(userPerformanceSummaryList);
// 修改课程推广待提成状态为"已失效"
LambdaUpdateWrapper<CoursePromotionCommissionPending> coursePromotionUpdateWrapper = new LambdaUpdateWrapper<>();
coursePromotionUpdateWrapper.eq(CoursePromotionCommissionPending::getOrderId, courseOrder.getId())
.set(CoursePromotionCommissionPending::getCommissionStatus, CommissionStatusEnum.EXPIRED.getValue());
coursePromotionCommissionPendingService.update(coursePromotionUpdateWrapper);
System.out.println("---------------------------微信退款回调(结束)-------------------------------");
return ResultUtils.success(true);
}
/**
* 小程序端用户取消课程订单
* @param courseOrderAddRequest 课程id
@ -315,43 +139,43 @@ public class CourseOrderController {
//
// /**
// * web端管理员根据id删除课程订单
// * @param commonRequest 课程订单删除请求体
// * @return 是否删除成功
// */
// @PostMapping("delete")
// @Operation(summary = "web端管理员根据id删除课程订单", description = "参数课程订单删除请求体权限管理员方法名delCourseOrder")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "课程订单管理", content = "web端管理员根据id删除课程订单")
// public BaseResponse<Boolean> delCourseOrder(@Valid @RequestBody CommonRequest commonRequest) {
// Long id = commonRequest.getId();
// CourseOrder courseOrder = courseOrderService.getById(id);
// ThrowUtils.throwIf(courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.CLOSED),
// ErrorCode.OPERATION_ERROR, "该课程订单不存在或订单状态错误");
// courseOrderService.removeById(id);
// return ResultUtils.success(true);
// }
//
// /**
// * web端管理员批量删除课程订单
// * @param commonBatchRequest 课程订单批量删除请求体
// * @return 是否删除成功
// */
// @PostMapping("delBatch")
// @Operation(summary = "web端管理员批量删除课程订单", description = "参数课程订单批量删除请求体权限管理员方法名delBatchCourseOrder")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "课程订单管理", content = "web端管理员批量删除课程订单")
// public BaseResponse<Boolean> delBatchCourseOrder(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
// List<Long> ids = commonBatchRequest.getIds();
// LambdaQueryWrapper<CourseOrder> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.ne(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED);
// long count = courseOrderService.count(queryWrapper);
// ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "存在未关闭的课程订单");
// courseOrderService.removeByIds(ids);
// return ResultUtils.success(true);
// }
/**
* web端管理员根据id删除课程订单
* @param commonRequest 课程订单删除请求体
* @return 是否删除成功
*/
@PostMapping("delete")
@Operation(summary = "web端管理员根据id删除课程订单", description = "参数课程订单删除请求体权限管理员方法名delCourseOrder")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员根据id删除课程订单")
public BaseResponse<Boolean> delCourseOrder(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
CourseOrder courseOrder = courseOrderService.getById(id);
ThrowUtils.throwIf(courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.CLOSED),
ErrorCode.OPERATION_ERROR, "该课程订单不存在或订单状态错误");
courseOrderService.removeById(id);
return ResultUtils.success(true);
}
/**
* web端管理员批量删除课程订单
* @param commonBatchRequest 课程订单批量删除请求体
* @return 是否删除成功
*/
@PostMapping("delBatch")
@Operation(summary = "web端管理员批量删除课程订单", description = "参数课程订单批量删除请求体权限管理员方法名delBatchCourseOrder")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员批量删除课程订单")
public BaseResponse<Boolean> delBatchCourseOrder(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
List<Long> ids = commonBatchRequest.getIds();
LambdaQueryWrapper<CourseOrder> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ne(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED);
long count = courseOrderService.count(queryWrapper);
ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "存在未关闭的课程订单");
courseOrderService.removeByIds(ids);
return ResultUtils.success(true);
}
/**
* web端管理员根据id查询课程订单
@ -378,15 +202,15 @@ public class CourseOrderController {
@Operation(summary = "Web端管理员分页查询课程订单", description = "参数课程订单查询请求体权限管理员方法名listCourseOrderByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "Web端管理员分页查询课程订单")
public BaseResponse<Page<CourseOrderBaseInfoVO>> listCourseOrderByPage(@Valid @RequestBody CourseOrderQueryRequest courseOrderQueryRequest) {
public BaseResponse<Page<CourseOrderVO>> listCourseOrderByPage(@Valid @RequestBody CourseOrderQueryRequest courseOrderQueryRequest) {
long current = courseOrderQueryRequest.getCurrent();
long pageSize = courseOrderQueryRequest.getPageSize();
QueryWrapper<CourseOrder> queryWrapper = courseOrderService.getQueryWrapper(courseOrderQueryRequest);
Page<CourseOrder> page = courseOrderService.page(new Page<>(current, pageSize), queryWrapper);
List<CourseOrder> courseOrderList = page.getRecords();
List<CourseOrderBaseInfoVO> courseOrderBaseInfoVOS = commonService.convertList(courseOrderList, CourseOrderBaseInfoVO.class);
Page<CourseOrderBaseInfoVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(courseOrderBaseInfoVOS);
List<CourseOrderVO> courseOrderVOList = commonService.convertList(courseOrderList, CourseOrderVO.class);
Page<CourseOrderVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(courseOrderVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);

View File

@ -1,161 +0,0 @@
package com.greenorange.promotion.controller.course;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.coursePromotionCommissionPending.CoursePromotionCommissionPendingAddRequest;
import com.greenorange.promotion.model.dto.coursePromotionCommissionPending.CoursePromotionCommissionPendingQueryRequest;
import com.greenorange.promotion.model.dto.coursePromotionCommissionPending.CoursePromotionCommissionPendingUpdateRequest;
import com.greenorange.promotion.model.entity.CoursePromotionCommissionPending;
import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.model.entity.UserPerformanceSummary;
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.model.vo.coursePromotionCommissionPending.CoursePromotionCommissionPendingVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.course.CoursePromotionCommissionPendingService;
import com.greenorange.promotion.service.userInfo.UserInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.model.dto.CommonRequest;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
import java.math.BigDecimal;
import java.util.List;
///**
// * 课程推广待提成记录 控制器
// */
//@RestController
//@RequestMapping("coursePromo")
//@Slf4j
//@Tag(name = "课程推广待提成记录模块")
//@Transactional
//public class CoursePromotionCommissionPendingController {
//
// @Resource
// private CoursePromotionCommissionPendingService coursePromotionCommissionPendingService;
//
// @Resource
// private CommonService commonService;
//
// @Resource
// private UserInfoService userInfoService;
//
//
// /**
// * 小程序端根据一级二级用户id查询课程推广待提成记录
// * @return 是否修改成功
// */
// @PostMapping("query/userId")
// @Operation(summary = "小程序端根据一级二级用户id查询课程推广待提成记录", description = "参数权限管理员方法名queryCoursePromotionCommissionPendingByUserId")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "课程推广待提成记录管理", content = "小程序端根据一级二级用户id查询课程推广待提成记录")
// public BaseResponse<List<CoursePromotionCommissionPendingVO>> queryCoursePromotionCommissionPendingByUserId(HttpServletRequest request) {
// Long userId = (Long) request.getAttribute("userId");
// UserInfo userInfo = userInfoService.getById(userId);
// String userRole = userInfo.getUserRole();
// UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
// LambdaQueryWrapper<CoursePromotionCommissionPending> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// if (UserRoleEnum.SUPERVISOR.equals(userRoleEnum)) {
// lambdaQueryWrapper.eq(CoursePromotionCommissionPending::getFirstUserId, userId);
// }else if (UserRoleEnum.STAFF.equals(userRoleEnum)) {
// lambdaQueryWrapper.eq(CoursePromotionCommissionPending::getSecondUserId, userId);
// } else {
// throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
// }
// List<CoursePromotionCommissionPending> coursePromotionCommissionPendingList = coursePromotionCommissionPendingService.list(lambdaQueryWrapper);
// List<CoursePromotionCommissionPendingVO> coursePromotionCommissionPendingVOS = commonService.convertList(coursePromotionCommissionPendingList, CoursePromotionCommissionPendingVO.class);
// return ResultUtils.success(coursePromotionCommissionPendingVOS);
// }
//
//
//
//
//
//
//
// /**
// * web端管理员根据id查询课程推广待提成记录
// * @param commonRequest 课程推广待提成记录id
// * @return 是否修改成功
// */
// @PostMapping("query/id")
// @Operation(summary = "web端管理员根据id查询课程推广待提成记录", description = "参数课程推广待提成记录id权限管理员方法名queryCoursePromotionCommissionPendingById")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "课程推广待提成记录管理", content = "web端管理员根据id查询课程推广待提成记录")
// public BaseResponse<CoursePromotionCommissionPendingVO> queryCoursePromotionCommissionPendingById(@Valid @RequestBody CommonRequest commonRequest) {
// Long id = commonRequest.getId();
// CoursePromotionCommissionPending coursePromotionCommissionPending = coursePromotionCommissionPendingService.getById(id);
// CoursePromotionCommissionPendingVO coursePromotionCommissionPendingVO = commonService.copyProperties(coursePromotionCommissionPending, CoursePromotionCommissionPendingVO.class);
// return ResultUtils.success(coursePromotionCommissionPendingVO);
// }
//
//
// /**
// * web端管理员根据id修改课程推广待提成记录状态
// * @param commonRequest 课程推广待提成记录id
// * @return 是否修改成功
// */
// @PostMapping("update")
// @Operation(summary = "web端管理员根据id修改课程推广待提成记录状态", description = "参数课程推广待提成记录id权限管理员方法名modifyCoursePromotionCommissionPendingStatus")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "课程推广待提成记录管理", content = "web端管理员根据id修改课程推广待提成记录状态")
// public BaseResponse<Boolean> modifyCoursePromotionCommissionPendingStatus(@Valid @RequestBody CommonRequest commonRequest) {
// Long id = commonRequest.getId();
// CoursePromotionCommissionPending coursePromotionCommissionPending = coursePromotionCommissionPendingService.getById(id);
// String commissionStatus = coursePromotionCommissionPending.getCommissionStatus();
// ThrowUtils.throwIf(!commissionStatus.equals(CommissionStatusEnum.PENDING.getValue()), ErrorCode.OPERATION_ERROR, "课程推广待提成记录状态错误");
// LambdaUpdateWrapper<CoursePromotionCommissionPending> updateWrapper = new LambdaUpdateWrapper<>();
// updateWrapper.eq(CoursePromotionCommissionPending::getId, id).set(CoursePromotionCommissionPending::getCommissionStatus, CommissionStatusEnum.COMPLETED.getValue());
// coursePromotionCommissionPendingService.update(updateWrapper);
// return ResultUtils.success(true);
// }
//
//
// /**
// * Web端管理员分页查询课程推广待提成记录
// * @param coursePromotionCommissionPendingQueryRequest 课程推广待提成记录查询请求体
// * @return 课程推广待提成记录列表
// */
// @PostMapping("page")
// @Operation(summary = "Web端管理员分页查询课程推广待提成记录", description = "参数课程推广待提成记录查询请求体权限管理员方法名listCoursePromotionCommissionPendingByPage")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "课程推广待提成记录管理", content = "Web端管理员分页查询课程推广待提成记录")
// public BaseResponse<Page<CoursePromotionCommissionPendingVO>> listCoursePromotionCommissionPendingByPage(@Valid @RequestBody CoursePromotionCommissionPendingQueryRequest coursePromotionCommissionPendingQueryRequest) {
// long current = coursePromotionCommissionPendingQueryRequest.getCurrent();
// long pageSize = coursePromotionCommissionPendingQueryRequest.getPageSize();
// QueryWrapper<CoursePromotionCommissionPending> queryWrapper = coursePromotionCommissionPendingService.getQueryWrapper(coursePromotionCommissionPendingQueryRequest);
// Page<CoursePromotionCommissionPending> page = coursePromotionCommissionPendingService.page(new Page<>(current, pageSize), queryWrapper);
// List<CoursePromotionCommissionPending> coursePromotionCommissionPendingList = page.getRecords();
// List<CoursePromotionCommissionPendingVO> coursePromotionCommissionPendingVOList = commonService.convertList(coursePromotionCommissionPendingList, CoursePromotionCommissionPendingVO.class);
// Page<CoursePromotionCommissionPendingVO> voPage = new Page<>(current, pageSize);
// voPage.setRecords(coursePromotionCommissionPendingVOList);
// voPage.setPages(page.getPages());
// voPage.setTotal(page.getTotal());
// return ResultUtils.success(voPage);
// }
//}

View File

@ -1,72 +0,0 @@
//package com.greenorange.promotion.controller.course;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//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.refundRecord.RefundRecordAddRequest;
//import com.greenorange.promotion.model.dto.refundRecord.RefundRecordQueryRequest;
//import com.greenorange.promotion.model.dto.refundRecord.RefundRecordUpdateRequest;
//import com.greenorange.promotion.model.entity.RefundRecord;
//import com.greenorange.promotion.model.vo.refundRecord.RefundRecordVO;
//import com.greenorange.promotion.service.common.CommonService;
//import com.greenorange.promotion.service.refund.RefundRecordService;
//import io.swagger.v3.oas.annotations.Operation;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.greenorange.promotion.model.dto.CommonRequest;
//import jakarta.validation.Valid;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.List;
//
//
///**
// * 退款记录 控制器
// */
//@RestController
//@RequestMapping("refundRecord")
//@Slf4j
//@Tag(name = "退款记录模块")
//@Transactional
//public class RefundRecordController {
//
// @Resource
// private RefundRecordService refundRecordService;
//
// @Resource
// private CommonService commonService;
//
//
// /**
// * Web端管理员分页查询退款记录
// * @param refundRecordQueryRequest 退款记录查询请求体
// * @return 退款记录列表
// */
// @PostMapping("page")
// @Operation(summary = "Web端管理员分页查询退款记录", description = "参数退款记录查询请求体权限管理员方法名listRefundRecordByPage")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "退款记录管理", content = "Web端管理员分页查询退款记录")
// public BaseResponse<Page<RefundRecordVO>> listRefundRecordByPage(@Valid @RequestBody RefundRecordQueryRequest refundRecordQueryRequest) {
// long current = refundRecordQueryRequest.getCurrent();
// long pageSize = refundRecordQueryRequest.getPageSize();
// QueryWrapper<RefundRecord> queryWrapper = refundRecordService.getQueryWrapper(refundRecordQueryRequest);
// Page<RefundRecord> page = refundRecordService.page(new Page<>(current, pageSize), queryWrapper);
// List<RefundRecord> refundRecordList = page.getRecords();
// List<RefundRecordVO> refundRecordVOList = commonService.convertList(refundRecordList, RefundRecordVO.class);
// Page<RefundRecordVO> voPage = new Page<>(current, pageSize);
// voPage.setRecords(refundRecordVOList);
// voPage.setPages(page.getPages());
// voPage.setTotal(page.getTotal());
// return ResultUtils.success(voPage);
// }
//}

View File

@ -10,7 +10,6 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -24,7 +23,6 @@ import java.io.IOException;
@RequestMapping("file")
@Slf4j
@Tag(name = "文件管理")
@Transactional
public class FileInfoController {

View File

@ -0,0 +1,15 @@
package com.greenorange.promotion.controller.practice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IdCardNumRequest {
private String idcardnum;
}

View File

@ -0,0 +1,16 @@
package com.greenorange.promotion.controller.practice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.checkerframework.checker.units.qual.A;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Project_commission {
private Long userid;
}

View File

@ -0,0 +1,15 @@
package com.greenorange.promotion.controller.practice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Promo_code_apply {
private Long userid;
}

View File

@ -0,0 +1,19 @@
package com.greenorange.promotion.controller.practice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//有getset方法to-string方法
@Data
//无参构造函数
@NoArgsConstructor
//全参构造函数
@AllArgsConstructor
public class QueryRequest {
private Long pagesize;
private Long pagenum;
}

View File

@ -0,0 +1,16 @@
package com.greenorange.promotion.controller.practice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Toselect {
private String phoneNumber;
private String bankNumber;
}

View File

@ -0,0 +1,223 @@
package com.greenorange.promotion.controller.practice;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.model.entity.PromoCodeApply;
import com.greenorange.promotion.model.entity.UserAccount;
import com.greenorange.promotion.service.project.ProjectCommissionService;
import com.greenorange.promotion.service.project.PromoCodeApplyService;
import com.greenorange.promotion.service.project.impl.PromoCodeApplyServiceImpl;
import com.greenorange.promotion.service.settle.UserAccountService;
import jakarta.annotation.Resource;
import org.checkerframework.common.util.report.qual.ReportWrite;
import org.jacoco.agent.rt.internal_f3994fa.IExceptionLogger;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.util.*;
//@ResponseBody 把返回值传到浏览器上
//@Controller 把当前类的对象创建出来存放到SpringIOC容器
//@RestController = @Controller + @ResponseBody
@RestController
// ip + 端口号用于运行这个服务
// ip + 端口号 + /test/hello
// @Controller @Service @Mapper 把当前类的对象创建出来存放到SpringIOC容器
@RequestMapping("test")
public class UserAccountTestController {
// 对userAccount表实现功能
// 1.插入删除修改全部查询根据id查询
@Resource
// 从容器中取出名字为userAccountService的对象
private UserAccountService userAccountService;
@PostMapping("/add")
public BaseResponse<String> add(@RequestBody UserAccountAddRequest userAccountAddRequest){
if (userAccountAddRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数不能为空");
}
if (userAccountAddRequest.getBankCardNumber() == null ||
userAccountAddRequest.getPhoneNumber() == null ||
userAccountAddRequest.getIdCardNumber() == null ||
userAccountAddRequest.getCardHolder() == null ||
userAccountAddRequest.getOpenBank() == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "必填字段不能为空");
}
UserAccount userAccount = new UserAccount();
// userAccount.setId(null);
// userAccount.setBankCardNumber(userAccountAddRequest.getBankCardNumber());
// userAccount.setOpenBank(userAccountAddRequest.getOpenBank());
// userAccount.setPhoneNumber(userAccountAddRequest.getPhoneNumber());
// userAccount.setIdCardNumber(userAccountAddRequest.getIdCardNumber());
// userAccount.setCardHolder(userAccountAddRequest.getCardHolder());
// userAccount.setUserId(1L);
BeanUtils.copyProperties(userAccountAddRequest, userAccount);
boolean result = userAccountService.save(userAccount);
if (!result) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "新增用户账户失败");
}
return ResultUtils.success("插入成功");
}
// @GetMapping("/delete")
// public String delete(@RequestParam Long id) {
// boolean removed = userAccountService.removeById(id);
// return removed ? "删除成功" : "删除失败";
// @GetMapping("/delete/{id}")
// public String delete(@PathVariable Long id) {
// boolean removed = userAccountService.removeById(id);
// return removed ? "删除成功" : "删除失败";
// }
@PostMapping("/delete")
public BaseResponse<String> delete(@RequestBody CommonRequest commonRequest){
Long id = commonRequest.getId();
if(id == null) throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数 id 不能为空");
boolean removed = userAccountService.removeById(id);
return ResultUtils.success(removed ? "删除成功" : "删除失败");
}
@PostMapping("/update")
public BaseResponse<String> update(@RequestBody UserAccountUpdateRequest userAccountUpdateRequest){
if (userAccountUpdateRequest == null || userAccountUpdateRequest.getId() == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "更新操作必须提供 ID");
}
UserAccount existing = userAccountService.getById(userAccountUpdateRequest.getId());
if (existing == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "要更新的用户账户不存在");
}
UserAccount userAccount = new UserAccount();
// userAccount.setId(userAccountUpdateRequest.getId());
// userAccount.setOpenBank(userAccountUpdateRequest.getOpenBank());
// userAccount.setPhoneNumber(userAccountUpdateRequest.getPhoneNumber());
// userAccount.setCardHolder(userAccountUpdateRequest.getCardHolder());
// userAccount.setIdCardNumber(userAccountUpdateRequest.getIdCardNumber());
// userAccount.setUserId(1L);
BeanUtils.copyProperties(userAccountUpdateRequest, userAccount);
userAccountService.updateById(userAccount);
boolean result = userAccountService.updateById(userAccount);
if (!result) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "更新失败,请稍后再试");
}
return ResultUtils.success("更新成功");
}
//根据id查询
@PostMapping("/select")
public BaseResponse<UserAccount> select(@RequestBody CommonRequest commonRequest){
Long id = commonRequest.getId();
if (id == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数 id 不能为空");
}
UserAccount selected = userAccountService.getById(id);
if (selected == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "未找到对应的用户记录");
}
return ResultUtils.success(selected);
}
@GetMapping("success")
public BaseResponse<String> test() {
for (int i = 0; i < 10; i ++ )
System.out.println("运行了这个程序");
String template = "运行程序";
return ResultUtils.success(template);
// return new BaseResponse<>(1, template, "ok");
}
//查询所有数据
@PostMapping("/list")
public BaseResponse<List<UserAccount>> list(){
// 这里你可以根据 queryRequest 构造查询条件
return ResultUtils.success(userAccountService.list());
}
//分页查询
// @PostMapping("/pagelist")
// public BaseResponse<List<UserAccount>> pagelist(@RequestBody QueryRequest queryRequest){
// System.out.println(queryRequest.toString());
// Long start = queryRequest.getPagesize() * (queryRequest.getPagenum() - 1);
// List<UserAccount> list = userAccountService.list();
// List<UserAccount> newlist = list.subList(start.intValue(), start.intValue() + queryRequest.getPagesize().intValue());
// return ResultUtils.success(newlist);
// }
@PostMapping("/pagelist")
public BaseResponse<Page<UserAccount>> pagelist(@RequestBody QueryRequest queryRequest){
Long pagesize = queryRequest.getPagesize();
Long pagenum = queryRequest.getPagenum();
Page<UserAccount> userAccountPage = new Page<>(pagenum, pagesize);//分页的规则
Page<UserAccount> page = userAccountService.page(userAccountPage);//根据分页规则取出集合里对应的部分
return ResultUtils.success(page);
}
//根据IdCardnum查询
@PostMapping("/idcardnumselect")
public BaseResponse<UserAccount> idcardnumselect(@RequestBody IdCardNumRequest idCardNumRequest) throws Exception {
String idcardnum = idCardNumRequest.getIdcardnum();
// LambdaQueryWrapper<UserAccount> queryWrapper = new LambdaQueryWrapper<>();
QueryWrapper<UserAccount> queryWrapper = new QueryWrapper<>();
// queryWrapper.eq(UserAccount::getIdCardNumber, idcardnum);
queryWrapper.eq("idCardNumber", idcardnum);
UserAccount userAccount = userAccountService.getOne(queryWrapper);
if(userAccount == null) throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "这条记录不存在");
// if(userAccount == null) ResultUtils.error(ErrorCode.NOT_FOUND_ERROR);
return ResultUtils.success(userAccount);
}
//根据phoneNumber,bankCardNumber
@PostMapping("phonebankNumberselect")
public BaseResponse<List<UserAccount>> phonebankselect(@RequestBody Toselect toselect){
String phoneNumber = toselect.getPhoneNumber();
String bankNumber = toselect.getBankNumber();
LambdaQueryWrapper<UserAccount> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserAccount::getPhoneNumber, phoneNumber);
queryWrapper.eq(UserAccount::getBankCardNumber, bankNumber);
List<UserAccount> list = userAccountService.list(queryWrapper);
if (list == null || list.isEmpty()) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "没有符合条件的用户账户信息");
}
return ResultUtils.success(list);
}
@Resource
private PromoCodeApplyService promoCodeApplyService;
@Resource
private ProjectCommissionService projectCommissionService;
@PostMapping("/queryByIds")
public BaseResponse<List<ProjectCommission>> phonebankselectHello(){
List<PromoCodeApply> list = promoCodeApplyService.list();
List<Long> ids = list.stream().map(PromoCodeApply::getUserId).toList();
LambdaQueryWrapper<ProjectCommission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(ProjectCommission::getUserId, ids);
List<ProjectCommission> projectCommissions = projectCommissionService.list(lambdaQueryWrapper);
return ResultUtils.success(projectCommissions);
}
// @GetMapping("error")
// public BaseResponse<String> error() throws Exception {
//// String error = "空指针异常";
// String template = null;
// if (template == null) throw new Exception("空指针异常");
// return ResultUtils.success("error");
// }
}

View File

@ -33,12 +33,8 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.GenericDeclaration;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@ -52,7 +48,6 @@ import java.util.stream.Collectors;
@RequestMapping("projectCommission")
@Slf4j
@Tag(name = "项目明细抽佣管理")
@Transactional
public class ProjectCommissionController {
@Resource
@ -73,6 +68,12 @@ public class ProjectCommissionController {
@Resource
private UserInfoService userInfoService;
@Resource
private UserMainInfoService userMainInfoService;
/**
* 小程序用户查看查询项目的抽佣情况
@ -137,16 +138,6 @@ public class ProjectCommissionController {
return ResultUtils.success(projectCommissionVOList);
}
// public static void main(String[] args) {
// PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// String encode = passwordEncoder.encode("123456");
// System.out.println(encode);
// boolean matches = passwordEncoder.matches("123456", "$2a$10$/yBGQqsHK78vlEtuMGTVY.bU/TamHQbr4wQIzj1B1H1ud/ZKPGICC");
// System.out.println(matches);
// }
//
// /**
// * 小程序用户修改项目的抽佣比例

View File

@ -33,7 +33,6 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -52,7 +51,6 @@ import java.util.Map;
@RequestMapping("project")
@Slf4j
@Tag(name = "项目管理")
@Transactional
public class ProjectController {
@Resource

View File

@ -15,7 +15,6 @@ import com.greenorange.promotion.model.dto.projectDetail.ProjectDetailAddRequest
import com.greenorange.promotion.model.dto.projectDetail.ProjectDetailUpdateRequest;
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionAddRequest;
import com.greenorange.promotion.model.entity.*;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.model.vo.projectDetail.ProjectDetailVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.project.ProjectCommissionService;
@ -28,7 +27,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.greenorange.promotion.model.dto.CommonRequest;
@ -48,7 +46,6 @@ import java.util.stream.Collectors;
@RequestMapping("projectDetail")
@Slf4j
@Tag(name = "项目明细管理")
@Transactional
public class ProjectDetailController {
@Resource
@ -95,9 +92,7 @@ public class ProjectDetailController {
projectService.updateById(project);
// 获取所有的小程序用户
LambdaQueryWrapper<UserInfo> miniUserInfoQueryWrapper = userInfoService.getMiniUserInfoQueryWrapper();
List<UserInfo> userInfoList = userInfoService.list(miniUserInfoQueryWrapper);
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<>();

View File

@ -23,7 +23,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -42,7 +41,6 @@ import java.util.List;
@RequestMapping("projectNotification")
@Slf4j
@Tag(name = "项目通知管理")
@Transactional
public class ProjectNotificationController {
@Resource

View File

@ -30,7 +30,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -50,7 +49,6 @@ import java.util.Map;
@RequestMapping("promoCodeApply")
@Slf4j
@Tag(name = "推广码申请记录管理")
@Transactional
public class PromoCodeApplyController {
@Resource

View File

@ -24,7 +24,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -43,7 +42,6 @@ import java.util.List;
@RequestMapping("promoCode")
@Slf4j
@Tag(name = "推广码管理")
@Transactional
public class PromoCodeController {
@Resource

View File

@ -0,0 +1,17 @@
package com.greenorange.promotion.controller.projectSettlement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Addqurrywithdraw {
private Long userid;
private BigDecimal payouts;
}

View File

@ -47,7 +47,6 @@ import java.util.function.Function;
@RequestMapping("projectSettlement")
@Slf4j
@Tag(name = "项目结算记录管理")
@Transactional
public class ProjectSettlementController {
@Resource

View File

@ -2,20 +2,18 @@ package com.greenorange.promotion.controller.projectSettlement;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.userAccount.UserAccountQueryRequest;
import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyAddRequest;
import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyQueryRequest;
import com.greenorange.promotion.model.entity.FundsChange;
import com.greenorange.promotion.model.entity.UserAccount;
import com.greenorange.promotion.model.entity.UserMainInfo;
import com.greenorange.promotion.model.entity.WithdrawalApply;
import com.greenorange.promotion.model.entity.*;
import com.greenorange.promotion.model.vo.fundsChange.FundsChangeVO;
import com.greenorange.promotion.model.vo.fundsChange.FundsItemVO;
import com.greenorange.promotion.model.vo.userAccount.UserAccountConditionVO;
@ -24,16 +22,19 @@ import com.greenorange.promotion.service.common.CommonService;
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.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Priority;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -49,150 +50,47 @@ import java.util.List;
@RequestMapping("withdrawalApply")
@Slf4j
@Tag(name = "提现申请记录管理")
@Transactional
public class WithdrawalApplyController {
@Resource
private UserAccountService userAccountService;
@Resource
private UserMainInfoService userMainInfoService;
@Resource
private WithdrawalApplyService withdrawalApplyService;
@Resource
private FundsChangeService fundsChangeService;
@Resource
private CommonService commonService;
@Resource
private UserMainInfoService userMainInfoService;
@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);
}
/**
* 小程序端用户申请提现
* @param withdrawalApplyAddRequest 提现申请记录查添加请求体
* @return 提现申请记录id
*/
@PostMapping("add")
@Operation(summary = "小程序端用户申请提现", description = "参数提现申请记录查添加请求体权限管理员方法名addWithdrawalApply")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "提现申请记录管理", content = "小程序端用户申请提现")
public BaseResponse<Long> addWithdrawalApply(@Valid @RequestBody WithdrawalApplyAddRequest withdrawalApplyAddRequest, HttpServletRequest request) {
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();
WithdrawalApply withdrawalApply = WithdrawalApply.builder()
.withdrawnAmount(withdrawnAmount)
.cardHolder(userAccount.getCardHolder())
.idCardNumber(userAccount.getIdCardNumber())
.phoneNumber(userAccount.getPhoneNumber())
.bankCardNumber(userAccount.getBankCardNumber())
.openBank(userAccount.getOpenBank())
.userId(userId)
.build();
@PostMapping("addqurry")
public BaseResponse<String> addqurry(@RequestBody Addqurrywithdraw addqurrywithdraw ){
Long userid = addqurrywithdraw.getUserid();
BigDecimal payouts = addqurrywithdraw.getPayouts();
LambdaQueryWrapper<UserMainInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserMainInfo::getUserId, userid);
UserMainInfo one = userMainInfoService.getOne(queryWrapper);
BigDecimal currentBalance = one.getCurrentBalance();
if(payouts.compareTo(currentBalance) > 0) throw new BusinessException(ErrorCode.OPERATION_ERROR,"提现金额超过当前的余额");
LambdaQueryWrapper<UserAccount> queryWrapper2 = new LambdaQueryWrapper<>();
queryWrapper2.eq(UserAccount::getUserId, userid);
UserAccount two = userAccountService.getOne(queryWrapper2);
WithdrawalApply withdrawalApply = new WithdrawalApply();
BeanUtils.copyProperties(two, withdrawalApply);
withdrawalApply.setId(null);
withdrawalApply.setUpdateTime(null);
withdrawalApply.setCreateTime(null);
withdrawalApply.setWithdrawnAmount(payouts);
withdrawalApply.setWithdrawalStatus("processing");
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();
BigDecimal subtract = currentBalance.subtract(payouts);
one.setCurrentBalance(subtract);
userMainInfoService.updateById(one);
FundsChange fundsChange = new FundsChange();
fundsChange.setUserId(userid);
fundsChange.setChangeAmount(payouts);
fundsChange.setProjectName("processing");
fundsChange.setCurrentAmount(subtract);
fundsChange.setProjectSettlementId(0L);
fundsChangeService.save(fundsChange);
return ResultUtils.success(withdrawalApply.getId());
return ResultUtils.success("提现成功");
}
}
/**
* 小程序端用户查询提现申请记录
* @return 提现申请记录列表
*/
@PostMapping("query")
@Operation(summary = "小程序端用户查询提现申请记录", description = "参数权限管理员方法名queryWithdrawalApplyByUserId")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "提现申请记录管理", content = "小程序端用户查询提现申请记录")
public BaseResponse<List<WithdrawalApplyVO>> queryWithdrawalApplyByUserId(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
List<WithdrawalApply> withdrawalApplyList = commonService.findByFieldEqTargetField(WithdrawalApply::getUserId, userId, withdrawalApplyService);
List<WithdrawalApplyVO> withdrawalApplyVOS = commonService.convertList(withdrawalApplyList, WithdrawalApplyVO.class);
Collections.reverse(withdrawalApplyVOS);
return ResultUtils.success(withdrawalApplyVOS);
}
/**
* 小程序端用户查询资金变动记录
* @return 提现申请记录id
*/
@PostMapping("query/change")
@Operation(summary = "小程序端用户查询资金变动记录", description = "参数权限管理员方法名queryFundsChangeByUserId")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "提现申请记录管理", content = "小程序端用户查询资金变动记录")
public BaseResponse<FundsItemVO> queryFundsChangeByUserId(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
LambdaQueryWrapper<UserMainInfo> userMainInfoLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserMainInfo::getUserId, userId, userMainInfoService);
UserMainInfo userMainInfo = userMainInfoService.getOne(userMainInfoLambdaQueryWrapper);
FundsItemVO fundsItemVO = commonService.copyProperties(userMainInfo, FundsItemVO.class);
List<FundsChange> fundsChangeList = commonService.findByFieldEqTargetField(FundsChange::getUserId, userId, fundsChangeService);
List<FundsChangeVO> fundsChangeVOS = commonService.convertList(fundsChangeList, FundsChangeVO.class);
Collections.reverse(fundsChangeVOS);
fundsItemVO.setFundsChangeVOList(fundsChangeVOS);
return ResultUtils.success(fundsItemVO);
}
/**
* Web端管理员分页查询提现申请记录
* @param withdrawalApplyQueryRequest 提现申请记录查询请求体
* @return 提现申请记录列表
*/
@PostMapping("page")
@Operation(summary = "Web端管理员分页查询提现申请记录", description = "参数提现申请记录查询请求体权限管理员方法名listWithdrawalApplyByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "提现申请记录管理", content = "Web端管理员分页查询提现申请记录")
public BaseResponse<Page<WithdrawalApplyVO>> listWithdrawalApplyByPage(@Valid @RequestBody WithdrawalApplyQueryRequest withdrawalApplyQueryRequest) {
long current = withdrawalApplyQueryRequest.getCurrent();
long pageSize = withdrawalApplyQueryRequest.getPageSize();
QueryWrapper<WithdrawalApply> queryWrapper = withdrawalApplyService.getQueryWrapper(withdrawalApplyQueryRequest);
Page<WithdrawalApply> page = withdrawalApplyService.page(new Page<>(current, pageSize), queryWrapper);
List<WithdrawalApply> withdrawalApplyList = page.getRecords();
List<WithdrawalApplyVO> withdrawalApplyVOList = commonService.convertList(withdrawalApplyList, WithdrawalApplyVO.class);
Page<WithdrawalApplyVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(withdrawalApplyVOList);
voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage);
}
}

View File

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

View File

@ -1,11 +1,17 @@
package com.greenorange.promotion.controller.userInfo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountAddRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountQueryRequest;
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
import com.greenorange.promotion.model.entity.UserAccount;
import com.greenorange.promotion.model.vo.userAccount.UserAccountVO;
@ -15,14 +21,17 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.model.dto.CommonRequest;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 用户账户 控制器
@ -31,7 +40,6 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("userAccount")
@Slf4j
@Tag(name = "用户账户管理")
@Transactional
public class UserAccountController {
@Resource

View File

@ -1,11 +1,8 @@
package com.greenorange.promotion.controller.userInfo;
import cn.binarywang.wx.miniapp.api.WxMaQrcodeService;
import cn.binarywang.wx.miniapp.bean.WxMaQrcode;
import com.auth0.jwt.interfaces.DecodedJWT;
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;
@ -13,6 +10,7 @@ import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.exception.BusinessException;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
@ -20,13 +18,12 @@ import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.model.dto.userInfo.*;
import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.model.entity.UserMainInfo;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.model.vo.userInfo.*;
import com.greenorange.promotion.model.vo.userInfo.SuperUserInfoVO;
import com.greenorange.promotion.model.vo.userInfo.UserInfoVO;
import com.greenorange.promotion.model.vo.userMainInfo.UserMainInfoVO;
import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
import com.greenorange.promotion.service.wechat.WechatGetQrcodeService;
import com.greenorange.promotion.utils.JWTUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -34,16 +31,11 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.apache.ibatis.io.JBoss6VFS;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
@ -53,7 +45,6 @@ import java.util.concurrent.TimeUnit;
@RequestMapping("userInfo")
@Slf4j
@Tag(name = "用户管理")
@Transactional
public class UserInfoController {
@ -77,165 +68,32 @@ public class UserInfoController {
private JWTUtils jwtUtils;
@Resource
private WechatGetQrcodeService wechatGetQrcodeService;
// @PostMapping("test")
// public BaseResponse<Boolean> test() throws IOException {
// List<UserInfo> list = userInfoService.list();
// Map<Long, UserInfo> map = new HashMap<>();
// for (UserInfo userInfo : list) {
// map.put(userInfo.getId(), userInfo);
// }
// List<UserMainInfo> userMainInfoList = userMainInfoService.list();
// for (UserMainInfo userMainInfo : userMainInfoList) {
// Long userId = userMainInfo.getUserId();
// UserInfo userInfo = map.get(userId);
// String userRole = userInfo.getUserRole();
// UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
// String view = wechatGetQrcodeService.getWxQrCode(userInfo.getInvitationCode(), userRoleEnum);
// userMainInfo.setInviteQrCode(view);
// }
// userMainInfoService.saveOrUpdateBatch(userMainInfoList);
// return ResultUtils.success(true);
// }
/**
* 小程序端用户校验token
* @return 是否校验成功
*/
@PostMapping("verify/token")
@Operation(summary = "小程序端用户校验token", description = "参数token, 权限管理员boss, admin)方法名verifyToken")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<Boolean> verifyToken() {
return ResultUtils.success(true);
}
/**
* web端修改员工申请须知
* @param commonStringRequest 修改内容
* @return 是否修改成功
*/
@PostMapping("modify/applyNotice")
@Operation(summary = "web端修改员工申请须知", description = "参数修改内容权限管理员boss, admin)方法名modifyApplyNotice")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> modifyApplyNotice(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String applyNotice = commonStringRequest.getTemplateString();
redisTemplate.opsForValue().set(UserConstant.APPLY_NOTICE_KEY, applyNotice);
return ResultUtils.success(true);
}
/**
* Web端小程序端查询员工申请须知
* @return 是否修改成功
*/
@PostMapping("query/applyNotice")
@Operation(summary = "Web端小程序端查询员工申请须知", description = "参数权限管理员boss, admin)方法名queryApplyNotice")
public BaseResponse<String> queryApplyNotice() {
String applyNotice = redisTemplate.opsForValue().get(UserConstant.APPLY_NOTICE_KEY);
return ResultUtils.success(applyNotice);
}
/**
* web端修改课程购买须知
* @param commonStringRequest 修改内容
* @return 是否修改成功
*/
@PostMapping("modify/courseDesc")
@Operation(summary = "web端修改课程购买须知", description = "参数修改内容权限管理员boss, admin)方法名modifyCourseDesc")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> modifyCourseDesc(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String courseDesc = commonStringRequest.getTemplateString();
redisTemplate.opsForValue().set(UserConstant.COURSE_DESC_KEY, courseDesc);
return ResultUtils.success(true);
}
/**
* Web端小程序端查询课程购买须知
* @return 是否修改成功
*/
@PostMapping("query/courseDesc")
@Operation(summary = "Web端小程序端查询课程购买须知", description = "参数权限管理员boss, admin)方法名queryApplyNotice")
public BaseResponse<String> queryCourseDesc() {
String courseDesc = redisTemplate.opsForValue().get(UserConstant.COURSE_DESC_KEY);
return ResultUtils.success(courseDesc);
}
/**
* 小程序端用户修改用户昵称
* @param commonStringRequest 昵称
* @return 是否修改成功
*/
@PostMapping("modify/nickname")
@Operation(summary = "小程序端用户修改用户昵称", description = "参数昵称权限管理员boss, admin)方法名modifyNickname")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<Boolean> modifyNickname(@Valid @RequestBody CommonStringRequest commonStringRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
String nickName = commonStringRequest.getTemplateString();
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getNickName, nickName);
queryWrapper.ne(UserInfo::getId, userId);
ThrowUtils.throwIf(userInfoService.count(queryWrapper) > 0, ErrorCode.PARAMS_ERROR, "昵称已存在");
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(UserInfo::getId, userId).set(UserInfo::getNickName, nickName);
userInfoService.update(updateWrapper);
return ResultUtils.success(true);
}
/**
* 小程序端用户修改用户头像
* @param commonStringRequest 头像view值
* @return 是否修改成功
*/
@PostMapping("modify/avatar")
@Operation(summary = "小程序端用户修改用户头像", description = "参数头像view值权限管理员boss, admin)方法名modifyUserAvatar")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<Boolean> modifyUserAvatar(@Valid @RequestBody CommonStringRequest commonStringRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
String view = commonStringRequest.getTemplateString();
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(UserInfo::getId, userId).set(UserInfo::getUserAvatar, view);
userInfoService.update(updateWrapper);
return ResultUtils.success(true);
}
/**
* 小程序端用户获取验证码(用于注册)
* @param verificationCodeGetRequest 验证码获取请求体
* @param commonStringRequest 手机号
* @return 验证码
*/
@PostMapping("code/register")
@Operation(summary = "小程序端用户获取验证码(用于注册)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCodeForRegister")
public BaseResponse<String> getVerificationCodeForRegister(@Valid @RequestBody VerificationCodeGetRequest verificationCodeGetRequest) {
String verificationCode = userInfoService.getVerificationCodeForRegister(verificationCodeGetRequest);
// @SysLog(title = "用户管理", content = "小程序端用户获取验证码")
public BaseResponse<String> getVerificationCodeForRegister(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String phoneNumber = commonStringRequest.getTemplateString();
String verificationCode = userInfoService.getVerificationCodeForRegister(phoneNumber);
return ResultUtils.success(verificationCode);
}
/**
* 小程序端用户获取验证码(用于密码登录和忘记密码)
* @param verificationCodeGetRequest 验证码获取请求体
* @param commonStringRequest 手机号
* @return 验证码
*/
@PostMapping("code/pwd")
@Operation(summary = "小程序端用户获取验证码(用于密码登录和忘记密码)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCode")
// @SysLog(title = "用户管理", content = "小程序端用户获取验证码")
public BaseResponse<String> getVerificationCode(@Valid @RequestBody VerificationCodeGetRequest verificationCodeGetRequest) {
String verificationCode = userInfoService.getVerificationCodeForPwdLogin(verificationCodeGetRequest);
public BaseResponse<String> getVerificationCode(@Valid @RequestBody CommonStringRequest commonStringRequest) {
String phoneNumber = commonStringRequest.getTemplateString();
String verificationCode = userInfoService.getVerificationCodeForPwdLogin(phoneNumber);
return ResultUtils.success(verificationCode);
}
@ -247,6 +105,7 @@ public class UserInfoController {
*/
@PostMapping("inviteCode")
@Operation(summary = "小程序端用户根据id获取上级邀请码", description = "参数用户id权限管理员boss, admin)方法名getParentUserInviteCode")
// @SysLog(title = "用户管理", content = "小程序端用户根据id获取上级邀请码")
public BaseResponse<String> getParentUserInviteCode(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
UserInfo userInfo = userInfoService.getById(id);
@ -262,6 +121,7 @@ public class UserInfoController {
*/
@PostMapping("register")
@Operation(summary = "小程序端用户注册", description = "参数小程序用户注册请求体权限管理员boss, admin)方法名userInfoMiniRegister")
// @SysLog(title = "用户管理", content = "小程序端用户注册")
public BaseResponse<Boolean> userInfoMiniRegister(@Valid @RequestBody UserInfoRegisterRequest userInfoRegisterRequest) {
userInfoService.userInfoMiniRegister(userInfoRegisterRequest);
return ResultUtils.success(true);
@ -276,13 +136,13 @@ public class UserInfoController {
*/
@PostMapping("mini/pwd/login")
@Operation(summary = "小程序端用户密码登录", description = "参数小程序用户密码登录请求体权限管理员boss, admin)方法名userInfoMiniLogin")
// @SysLog(title = "用户管理", content = "小程序端用户密码登录")
public BaseResponse<String> userInfoMiniLoginByPwd(@Valid @RequestBody UserInfoMiniPasswordLoginRequest userInfoMiniPasswordLoginRequest) {
String token = userInfoService.userInfoMiniLoginByPwd(userInfoMiniPasswordLoginRequest);
return ResultUtils.success(token);
}
/**
* 小程序端用户验证码登录
* @param userInfoMiniVerifyCodeLoginRequest 小程序用户验证码登录请求体
@ -304,6 +164,7 @@ public class UserInfoController {
*/
@PostMapping("mini/out/reset/pwd")
@Operation(summary = "小程序用户重置密码(外部)", description = "参数小程序用户密码重置请求体权限管理员boss, admin)方法名userInfoMiniOuterResetPwd")
// @SysLog(title = "用户管理", content = "小程序用户重置密码(外部)")
public BaseResponse<Boolean> userInfoMiniOuterResetPwd(@Valid @RequestBody UserInfoResetRequest userInfoResetRequest) {
userInfoService.userInfoMiniResetPwd(userInfoResetRequest, false);
return ResultUtils.success(true);
@ -325,9 +186,6 @@ public class UserInfoController {
}
/**
* web端用户根据jwt获取用户信息
* @return 用户信息
@ -387,6 +245,7 @@ public class UserInfoController {
@GetMapping("mini/logout")
@Operation(summary = "小程序端用户退出登录", description = "参数JWT权限管理员boss, admin)方法名userInfoMiniLogout")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "用户管理", content = "小程序端用户退出登录")
public BaseResponse<Boolean> userInfoMiniLogout(@RequestHeader("Authorization") String token) {
// 获取token的过期时间
DecodedJWT decodedJWT = jwtUtils.verify(token);
@ -446,6 +305,14 @@ public class UserInfoController {
@RequiresPermission(mustRole = UserConstant.BOSS_ROLE)
@SysLog(title = "用户管理", content = "web端管理员添加用户")
public BaseResponse<Boolean> addUserInfo(@Valid @RequestBody UserInfoAddRequest userInfoAddRequest) {
String userAccount = userInfoAddRequest.getUserAccount();
String userPassword = userInfoAddRequest.getUserPassword();
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getUserRole,"boss");
UserInfo one = userInfoService.getOne(queryWrapper);
String userAccount2 = one.getUserAccount();
String userPassword2 = one.getUserPassword();
if(userAccount2.equals(userAccount) && userPassword2.equals(userPassword)) throw new BusinessException(ErrorCode.OPERATION_ERROR,"不能添加跟boss重名的账号和密码");
UserInfo userInfo = commonService.copyProperties(userInfoAddRequest, UserInfo.class);
userInfo.setParentUserId(-1L);
userInfo.setUserRole(UserConstant.ADMIN_ROLE);
@ -551,6 +418,24 @@ public class UserInfoController {
// /**
// * (小程序端)查询当前用户到根节点的userId路径
// * @param commonRequest 用户id
// * @return 用户表列表
// */
// @PostMapping("query/path")
// @Operation(summary = "查询当前用户到根节点的userId路径", description = "参数用户id权限管理员boss, admin),方法名:findPathToRootUserIdList")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "用户管理", content = "查询当前用户到根节点的userId路径")
// public BaseResponse<List<Long>> findPathToRootUserIdList(@Valid @RequestBody CommonRequest commonRequest) {
// Long userId = commonRequest.getId();
// List<Long> pathToRoot = userInfoService.findPathToRoot(userId);
// return ResultUtils.success(pathToRoot);
// }
/**
* 小程序端用户获取上级用户信息
* @return 上级用户信息
@ -571,90 +456,4 @@ public class UserInfoController {
/**
* web端管理员查询主管列表
* @return 主管列表
*/
@PostMapping("query/supervisor")
@Operation(summary = "web端管理员查询主管列表", description = "参数权限管理员boss, admin),方法名:querySupervisorList")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<SupervisorUserVO>> querySupervisorList() {
// 获取用户基本信息和主要信息表
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserRoleEnum.SUPERVISOR.getValue(), userInfoService);
List<UserMainInfo> userMainInfoList = commonService.findByFieldInTargetField(userInfoList, userMainInfoService, UserInfo::getId, UserMainInfo::getUserId);
// 封装Map, 键: 用户id用户信息
Map<Long, UserInfo> userInfoMap = new HashMap<>();
for (UserInfo userInfo : userInfoList) {
userInfoMap.put(userInfo.getId(), userInfo);
}
List<SupervisorUserVO> supervisorUserVOS = new ArrayList<>();
for (UserMainInfo userMainInfo : userMainInfoList) {
SupervisorUserVO supervisorUserVO = commonService.copyProperties(userMainInfo, SupervisorUserVO.class);
UserInfo userInfo = userInfoMap.get(userMainInfo.getUserId());
BeanUtils.copyProperties(userInfo, supervisorUserVO);
supervisorUserVOS.add(supervisorUserVO);
}
return ResultUtils.success(supervisorUserVOS);
}
/**
* web端管理员根据主管id查询员工列表
* @param commonRequest 主管id
* @return 员工列表
*/
@PostMapping("query/staff")
@Operation(summary = "web端管理员根据主管id查询员工列表", description = "参数主管id权限管理员boss, admin),方法名:queryStaffListBySupervisorId")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<StaffUserVO>> queryStaffListBySupervisorId(@Valid @RequestBody CommonRequest commonRequest) {
Long id = commonRequest.getId();
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getParentUserId, id, userInfoService);
List<UserMainInfo> userMainInfoList = commonService.findByFieldInTargetField(userInfoList, userMainInfoService, UserInfo::getId, UserMainInfo::getUserId);
// 封装Map, 键: 用户id用户信息
Map<Long, UserInfo> userInfoMap = new HashMap<>();
for (UserInfo userInfo : userInfoList) {
userInfoMap.put(userInfo.getId(), userInfo);
}
List<StaffUserVO> staffUserVOS = new ArrayList<>();
for (UserMainInfo userMainInfo : userMainInfoList) {
StaffUserVO staffUserVO = commonService.copyProperties(userMainInfo, StaffUserVO.class);
UserInfo userInfo = userInfoMap.get(userMainInfo.getUserId());
BeanUtils.copyProperties(userInfo, staffUserVO);
staffUserVOS.add(staffUserVO);
}
return ResultUtils.success(staffUserVOS);
}
/**
* web端管理员查看经理信息
* @return 经理信息
*/
@PostMapping("query/manager")
@Operation(summary = "web端管理员查看经理信息", description = "参数权限管理员boss, admin),方法名:queryManagerInfo")
@RequiresPermission(mustRole = UserConstant.BOSS_ROLE)
public BaseResponse<ManagerUserInfoVO> queryManagerInfo() {
LambdaQueryWrapper<UserInfo> userInfoLambdaQueryWrapper = commonService.buildQueryWrapperByField(UserInfo::getUserRole, UserConstant.MANAGER_ROLE, userInfoService);
UserInfo managerUserInfo = userInfoService.getOne(userInfoLambdaQueryWrapper);
ManagerUserInfoVO managerUserInfoVO = commonService.copyProperties(managerUserInfo, ManagerUserInfoVO.class);
return ResultUtils.success(managerUserInfoVO);
}
/**
* web端管理员修改经理信息
* @return 是否修改成功
*/
@PostMapping("modify/manager")
@Operation(summary = "web端管理员修改经理信息", description = "参数权限管理员boss, admin),方法名:modifyManagerInfo")
@RequiresPermission(mustRole = UserConstant.BOSS_ROLE)
public BaseResponse<Boolean> modifyManagerInfo(@Valid @RequestBody ManagerUserInfoUpdateRequest managerUserInfoUpdateRequest) {
UserInfo userInfo = commonService.copyProperties(managerUserInfoUpdateRequest, UserInfo.class);
userInfoService.updateById(userInfo);
return ResultUtils.success(true);
}
}

View File

@ -24,7 +24,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.greenorange.promotion.model.dto.CommonRequest;
@ -46,7 +45,6 @@ import java.util.Map;
@RequestMapping("userMainInfo")
@Slf4j
@Tag(name = "用户主要信息管理")
@Transactional
public class UserMainInfoController {
@Resource
@ -115,4 +113,104 @@ public class UserMainInfoController {
return ResultUtils.success(userTeamInfoVO);
}
// /**
// * web端管理员添加用户主要信息
// * @param userMainInfoAddRequest 用户主要信息添加请求体
// * @return 是否添加成功
// */
// @PostMapping("add")
// @Operation(summary = "web端管理员添加用户主要信息", description = "参数用户主要信息添加请求体权限管理员方法名addUserMainInfo")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "web端管理员添加用户主要信息")
// public BaseResponse<Boolean> addUserMainInfo(@Valid @RequestBody UserMainInfoAddRequest userMainInfoAddRequest) {
// UserMainInfo userMainInfo = commonService.copyProperties(userMainInfoAddRequest, UserMainInfo.class);
// userMainInfoService.save(userMainInfo);
// return ResultUtils.success(true);
// }
//
// /**
// * web端管理员根据id修改用户主要信息信息
// * @param userMainInfoUpdateRequest 用户主要信息更新请求体
// * @return 是否更新成功
// */
// @PostMapping("update")
// @Operation(summary = "web端管理员更新用户主要信息", description = "参数用户主要信息更新请求体权限管理员方法名updateUserMainInfo")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "web端管理员根据id修改用户主要信息信息")
// public BaseResponse<Boolean> updateUserMainInfo(@Valid @RequestBody UserMainInfoUpdateRequest userMainInfoUpdateRequest) {
// UserMainInfo userMainInfo = commonService.copyProperties(userMainInfoUpdateRequest, UserMainInfo.class);
// userMainInfoService.updateById(userMainInfo);
// return ResultUtils.success(true);
// }
//
// /**
// * web端管理员根据id删除用户主要信息
// * @param commonRequest 用户主要信息删除请求体
// * @return 是否删除成功
// */
// @PostMapping("delete")
// @Operation(summary = "web端管理员根据id删除用户主要信息", description = "参数用户主要信息删除请求体权限管理员方法名delUserMainInfo")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "web端管理员根据id删除用户主要信息")
// public BaseResponse<Boolean> delUserMainInfo(@Valid @RequestBody CommonRequest commonRequest) {
// Long id = commonRequest.getId();
// userMainInfoService.removeById(id);
// return ResultUtils.success(true);
// }
//
// /**
// * web端管理员批量删除用户主要信息
// * @param commonBatchRequest 用户主要信息批量删除请求体
// * @return 是否删除成功
// */
// @PostMapping("delBatch")
// @Operation(summary = "web端管理员批量删除用户主要信息", description = "参数用户主要信息批量删除请求体权限管理员方法名delBatchUserMainInfo")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "web端管理员批量删除用户主要信息")
// public BaseResponse<Boolean> delBatchUserMainInfo(@Valid @RequestBody CommonBatchRequest commonBatchRequest) {
// List<Long> ids = commonBatchRequest.getIds();
// userMainInfoService.removeByIds(ids);
// return ResultUtils.success(true);
// }
//
// /**
// * web端管理员根据id查询用户主要信息
// * @param commonRequest 用户主要信息查询请求体
// * @return 用户主要信息信息
// */
// @PostMapping("queryById")
// @Operation(summary = "web端管理员根据id查询用户主要信息", description = "参数用户主要信息查询请求体权限管理员方法名queryUserMainInfoById")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "web端管理员根据id查询用户主要信息")
// public BaseResponse<UserMainInfoVO> queryUserMainInfoById(@Valid @RequestBody CommonRequest commonRequest) {
// Long id = commonRequest.getId();
// UserMainInfo userMainInfo = userMainInfoService.getById(id);
// ThrowUtils.throwIf(userMainInfo == null, ErrorCode.OPERATION_ERROR, "当前用户主要信息不存在");
// UserMainInfoVO userMainInfoVO = commonService.copyProperties(userMainInfo, UserMainInfoVO.class);
// return ResultUtils.success(userMainInfoVO);
// }
// /**
// * Web端管理员分页查询用户主要信息
// * @param userMainInfoQueryRequest 用户主要信息查询请求体
// * @return 用户主要信息列表
// */
// @PostMapping("page")
// @Operation(summary = "Web端管理员分页查询用户主要信息", description = "参数用户主要信息查询请求体权限管理员方法名listUserMainInfoByPage")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "用户主要信息管理", content = "Web端管理员分页查询用户主要信息")
// public BaseResponse<Page<UserMainInfoVO>> listUserMainInfoByPage(@Valid @RequestBody UserMainInfoQueryRequest userMainInfoQueryRequest) {
// long current = userMainInfoQueryRequest.getCurrent();
// long pageSize = userMainInfoQueryRequest.getPageSize();
// QueryWrapper<UserMainInfo> queryWrapper = userMainInfoService.getQueryWrapper(userMainInfoQueryRequest);
// Page<UserMainInfo> page = userMainInfoService.page(new Page<>(current, pageSize), queryWrapper);
// List<UserMainInfo> userMainInfoList = page.getRecords();
// List<UserMainInfoVO> userMainInfoVOList = commonService.convertList(userMainInfoList, UserMainInfoVO.class);
// Page<UserMainInfoVO> voPage = new Page<>(current, pageSize);
// voPage.setRecords(userMainInfoVOList);
// voPage.setPages(page.getPages());
// voPage.setTotal(page.getTotal());
// return ResultUtils.success(voPage);
// }
}

View File

@ -6,7 +6,6 @@ import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.config.WxAccessToken;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.CommonStringRequest;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import com.greenorange.promotion.service.wechat.WechatGetQrcodeService;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
@ -16,7 +15,6 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.io.*;
@ -26,7 +24,6 @@ import java.io.*;
@RestController
@Tag(name = "获取二维码模块")
@RequestMapping("/qrcode")
@Transactional
public class WechatGetQrcodeController {
@ -57,29 +54,30 @@ public class WechatGetQrcodeController {
* @return
* @throws IOException
*/
@Hidden
@PostMapping("/get/qrcode")
@Operation(summary = "微信小程序获取二维码", description = "参数:无, 权限:所有人, 方法名getQrcode")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<String> getQrcode(@Valid @RequestBody CommonStringRequest commonStringRequest) throws IOException {
String inviteCode = commonStringRequest.getTemplateString();
String view = wechatGetQrcodeService.getWxQrCode(inviteCode, UserRoleEnum.SUPERVISOR);
String view = wechatGetQrcodeService.getWxQrCode(inviteCode);
return ResultUtils.success(view);
}
// /**
// * 微信小程序获取课程码
// * @return
// * @throws IOException
// */
// @Hidden
// @PostMapping("/get/course/qrcode")
// @Operation(summary = "微信小程序获取课程码", description = "参数:无, 权限:所有人, 方法名getCourseQrcode")
//// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// public BaseResponse<String> getCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception {
// String view = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request);
// return ResultUtils.success(view);
// }
/**
* 微信小程序获取课程码
* @return
* @throws IOException
*/
@Hidden
@PostMapping("/get/course/qrcode")
@Operation(summary = "微信小程序获取课程码", description = "参数:无, 权限:所有人, 方法名getCourseQrcode")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<String> getCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception {
String view = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request);
return ResultUtils.success(view);
}

View File

@ -1,153 +0,0 @@
//package com.greenorange.promotion.controller.wechat;
//
//import cn.binarywang.wx.miniapp.api.WxMaService;
//import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
//import com.greenorange.promotion.annotation.RequiresPermission;
//import com.greenorange.promotion.common.BaseResponse;
//import com.greenorange.promotion.common.ErrorCode;
//import com.greenorange.promotion.common.ResultUtils;
//import com.greenorange.promotion.config.WxOpenConfig;
//import com.greenorange.promotion.constant.OrderStatusConstant;
//import com.greenorange.promotion.constant.UserConstant;
//import com.greenorange.promotion.exception.BusinessException;
//import com.greenorange.promotion.exception.ThrowUtils;
//import com.greenorange.promotion.model.dto.CommonRequest;
//import com.greenorange.promotion.model.dto.wxPay.WechatPayRequest;
//import com.greenorange.promotion.model.entity.CourseOrder;
//import com.greenorange.promotion.model.entity.UserInfo;
//import com.greenorange.promotion.service.course.CourseOrderService;
//import com.greenorange.promotion.service.userInfo.UserInfoService;
//import com.greenorange.promotion.service.wechat.WechatPayService;
//import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
//import com.wechat.pay.java.service.payments.model.Transaction;
//import com.wechat.pay.java.service.refund.model.Refund;
//import com.wechat.pay.java.service.refund.model.RefundNotification;
//import io.swagger.v3.oas.annotations.Hidden;
//import io.swagger.v3.oas.annotations.Operation;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import jakarta.annotation.Resource;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.validation.Valid;
//import lombok.extern.slf4j.Slf4j;
//import me.chanjar.weixin.common.error.WxErrorException;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.transaction.annotation.Transactional;
//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.io.IOException;
//
//@Slf4j
//@RestController
//@Tag(name = "微信支付")
//@RequestMapping("/wxPay")
//@Transactional
//public class WechatPayController {
//
//
// @Resource
// private WechatPayService weChatService;
//
// @Resource
// private UserInfoService userInfoService;
//
// @Resource
// private CourseOrderService courseOrderService;
//
// @Resource
// private WxOpenConfig wxOpenConfig;
//
//
//
//
// /**
// * JSAPI 下单
// */
// @PostMapping("/payment/create")
// @Operation(summary = "JSAPI 下单", description = "参数订单id, 权限:所有人, 方法名createPayment")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// public BaseResponse<PrepayWithRequestPaymentResponse> createPayment(@Valid @RequestBody WechatPayRequest wechatPayRequest, HttpServletRequest request) {
//
// String code = wechatPayRequest.getCode();
// WxMaJscode2SessionResult sessionInfo;
// String miniOpenId;
// try {
// WxMaService wxMaService = wxOpenConfig.getWxMaService();
// sessionInfo = wxMaService.jsCode2SessionInfo(code);
// miniOpenId = sessionInfo.getOpenid();
// if (StringUtils.isAnyBlank(miniOpenId)) {
// throw new BusinessException(ErrorCode.SYSTEM_ERROR);
// }
// } catch (WxErrorException e) {
// log.error("userLoginByWxOpen error", e);
// throw new BusinessException(ErrorCode.SYSTEM_ERROR, "登录失败,系统错误");
// }
// Long userId = (Long) request.getAttribute("userId");
// UserInfo userInfo = userInfoService.getById(userId);
//
// Long orderId = wechatPayRequest.getOrderId();
// CourseOrder courseOrder = courseOrderService.getById(orderId);
// ThrowUtils.throwIf(courseOrder == null, ErrorCode.NOT_FOUND_ERROR, "订单不存在");
// ThrowUtils.throwIf(!courseOrder.getOrderStatus().equals(OrderStatusConstant.PENDING), ErrorCode.OPERATION_ERROR, "订单状态错误");
// if (!userInfo.getId().equals(courseOrder.getUserId())) {
// throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "你不是该订单用户!");
// }
// PrepayWithRequestPaymentResponse response = weChatService.createPayment(String.valueOf(orderId), miniOpenId, courseOrder.getTotalAmount());
// return ResultUtils.success(response);
// }
//
//
//
// /**
// * JSAPI 下单回调
// */
// @Hidden
// @PostMapping("/payment/callback")
// @Operation(summary = "JSAPI 下单回调", description = "参数订单id, 权限:所有人, 方法名callbackPayment")
// public synchronized BaseResponse<Boolean> callbackPayment(HttpServletRequest request) throws IOException {
// // 获取下单信息
// Transaction transaction = weChatService.getTransactionInfo(request);
// System.out.println("下单信息:" + transaction);
// // 支付回调
// boolean result = weChatService.paymentCallback(transaction);
// ThrowUtils.throwIf(!result, ErrorCode.SYSTEM_ERROR, "微信支付回调失败");
// return ResultUtils.success(true);
// }
//
//
// /**
// * Web管理员部分退款
// * @param commonRequest 订单id
// */
// @PostMapping("/refund/part/create")
// @Operation(summary = "Web管理员部分退款", description = "参数订单id, 权限web端管理员, 方法名createPartRefund")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// public BaseResponse<Refund> createPartRefund(@Valid @RequestBody CommonRequest commonRequest) {
// Long orderId = commonRequest.getId();
// CourseOrder courseOrder = courseOrderService.getById(orderId);
// ThrowUtils.throwIf(courseOrder == null, ErrorCode.OPERATION_ERROR, "订单不存在");
//
// Refund refund = weChatService.refundPartPayment(String.valueOf(orderId), courseOrder.getTotalAmount());
// return ResultUtils.success(refund);
// }
//
//
// /**
// * 部分退款回调
// */
// @Hidden
// @PostMapping("/refund/part/callback")
// @Operation(summary = "部分退款回调", description = "参数订单id, 权限web端管理员, 方法名callbackRefundPart")
// public BaseResponse<Boolean> callbackRefundPart(HttpServletRequest request) {
// // 获取退款信息
// RefundNotification refundNotification = weChatService.getRefundInfo(request);
// // 退款回调
// boolean result = weChatService.refundPartCallback(refundNotification);
// ThrowUtils.throwIf(!result, ErrorCode.SYSTEM_ERROR, "退款回调失败");
// return ResultUtils.success(true);
// }
//
//
//}

View File

@ -11,7 +11,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -24,10 +23,10 @@ import java.util.Map;
@RestController
@Tag(name = "微信提现模块")
@RequestMapping("/payouts")
@Transactional
public class WechatPayoutsController {
/**
* 微信小程序积分提现到银行卡
*/

View File

@ -15,7 +15,7 @@ import java.util.*;
public class Generator {
// 数据源配置
private static final String DATASOURCE_URL = "jdbc:mysql://160.202.242.36:3306/qingcheng_dev?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 PASSWORD = "Qc@8ls2jf";
@ -27,13 +27,13 @@ public class Generator {
// 作者
private static final String AUTHOR = "chenxinzhi";
// 表注释
private static final String TABLE_COMMENT = "用户绩效汇总";
private static final String TABLE_COMMENT = "课程订单";
// 实体类名
private static final String ENTITY_NAME = "UserPerformanceSummary";
private static final String ENTITY_NAME = "CourseOrder";
// 表名
private static final String TABLE_NAME = "user_performance_summary";
private static final String TABLE_NAME = "course_order";
// 实体类属性名
private static final String ENTITY_NAME_LOWER = "userPerformanceSummary";
private static final String ENTITY_NAME_LOWER = "courseOrder";
// 父包名
private static final String PARENT_PATH = "com.greenorange.promotion";

View File

@ -1,66 +0,0 @@
package com.greenorange.promotion.listener;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.greenorange.promotion.constant.MqConstant;
import com.greenorange.promotion.constant.OrderStatusConstant;
import com.greenorange.promotion.model.entity.CourseOrder;
import com.greenorange.promotion.service.course.CourseOrderService;
import com.greenorange.promotion.utils.MultiDelayMessage;
import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
@Component
public class OrderStatusListener {
@Resource
private CourseOrderService courseOrderService;
@Resource
private RabbitTemplate rabbitTemplate;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(MqConstant.DELAY_ORDER_QUEUE),
exchange = @Exchange(name = MqConstant.DELAY_EXCHANGE, delayed = "true"),
key = MqConstant.DELAY_ORDER_ROUTING_KEY
))
public void listenDelayMessage(MultiDelayMessage<Long> msg) {
System.out.println("\n\n\n\n\nOrderStatusListener.listenerDelayMessage msg-------------------------------->" + msg);
// 1.获取消息中的订单id
Long orderId = msg.getData();
// 2.查询订单,判断状态是否为待支付
CourseOrder courseOrder = courseOrderService.getById(orderId);
// 订单不存在或者订单已经支付
if (courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.PENDING)) {
return ;
}
// 3.订单未支付,判断是否还有剩余延时时间
if (msg.hasNextDelay()) {
// 有延迟时间需要重发延迟消息先获取延迟时间的int值
// 发送延时消息
Long delayValue = msg.removeNextDelay();
rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE,
MqConstant.DELAY_ORDER_ROUTING_KEY, msg, message -> {
// 添加延迟消息属性
message.getMessageProperties().setDelayLong(delayValue);
return message;
});
return ;
}
// 没有剩余延时时间,说明订单超时未支付,需取消订单
LambdaUpdateWrapper<CourseOrder> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(CourseOrder::getId, orderId)
.set(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED);
courseOrderService.update(lambdaUpdateWrapper);
}
}

View File

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

View File

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

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.CoursePromotionCommissionPending;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【course_promotion_commission_pending(课程推广待提成记录)】的数据库操作Mapper
* @createDate 2025-07-01 09:22:57
* @Entity com.greenorange.promotion.model.entity.CoursePromotionCommissionPending
*/
public interface CoursePromotionCommissionPendingMapper extends BaseMapper<CoursePromotionCommissionPending> {
}

View File

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

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.EmployeePromotionRecords;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【employee_promotion_records(员工推广记录表)】的数据库操作Mapper
* @createDate 2025-07-12 22:27:51
* @Entity com.greenorange.promotion.model.entity.EmployeePromotionRecords
*/
public interface EmployeePromotionRecordsMapper extends BaseMapper<EmployeePromotionRecords> {
}

View File

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

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.RefundRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【refund_record(退款记录表)】的数据库操作Mapper
* @createDate 2025-07-01 08:18:44
* @Entity com.greenorange.promotion.model.entity.RefundRecord
*/
public interface RefundRecordMapper extends BaseMapper<RefundRecord> {
}

View File

@ -20,12 +20,6 @@ public interface UserInfoMapper extends BaseMapper<UserInfo> {
List<Long> findPathToRoot(Long userId);
/**
* 查询当前用户的所有下级用户(包括间接)
*/
List<Long> findAllSubUser(Long userId);
}

View File

@ -1,18 +0,0 @@
package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.UserPerformanceSummary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 35880
* @description 针对表【user_performance_summary(用户绩效汇总表)】的数据库操作Mapper
* @createDate 2025-07-10 20:38:41
* @Entity com.greenorange.promotion.model.entity.UserPerformanceSummary
*/
public interface UserPerformanceSummaryMapper extends BaseMapper<UserPerformanceSummary> {
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -19,9 +19,12 @@ import java.io.Serializable;
"name",
"type",
"detail",
"promoCodeDesc",
"image",
"originPrice",
"discountPrice"
"discountPrice",
"firstLevelRate",
"secondLevelRate",
})
public class CourseAddRequest implements Serializable {
@ -33,11 +36,11 @@ public class CourseAddRequest implements Serializable {
private String name;
/**
* 课程类别[考公,财经]
* 课程类别[考公考研,自媒体,财经]
*/
@NotBlank(message = "课程类别不能为空")
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公,财经]", example = "财经")
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
@ -47,6 +50,13 @@ public class CourseAddRequest implements Serializable {
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@NotBlank(message = "推广码说明(富文本)不能为空")
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@ -68,6 +78,20 @@ public class CourseAddRequest implements Serializable {
@Schema(description = "折扣价格", example = "2499")
private BigDecimal discountPrice;
/**
* 一级佣金比例(%
*/
@DecimalMin(value = "0", message = "一级佣金比例不能小于0")
@Schema(description = "一级佣金比例(%", example = "10")
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
@DecimalMin(value = "0", message = "二级佣金比例不能小于0")
@Schema(description = "二级佣金比例(%", example = "5")
private BigDecimal secondLevelRate;
@Serial
private static final long serialVersionUID = 1L;

View File

@ -28,10 +28,10 @@ public class CourseQueryRequest extends PageRequest implements Serializable {
private String name;
/**
* 课程类别[考公,财经]
* 课程类别[考公考研,自媒体,财经]
*/
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公,财经]", example = "自媒体")
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;

View File

@ -22,10 +22,13 @@ import java.io.Serializable;
"name",
"type",
"detail",
"promoCodeDesc",
"image",
"originPrice",
"discountPrice",
"orderCount"
"orderCount",
"firstLevelRate",
"secondLevelRate",
})
public class CourseUpdateRequest implements Serializable {
@ -44,11 +47,11 @@ public class CourseUpdateRequest implements Serializable {
private String name;
/**
* 课程类别[考公,财经]
* 课程类别[考公考研,自媒体,财经]
*/
@NotBlank(message = "课程类别不能为空")
@EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公,财经]", example = "自媒体")
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type;
/**
@ -58,6 +61,13 @@ public class CourseUpdateRequest implements Serializable {
@Schema(description = "课程概述(富文本)", example = "富文本")
private String detail;
/**
* 推广码说明(富文本)
*/
@NotBlank(message = "推广码说明(富文本)不能为空")
@Schema(description = "推广码说明(富文本)", example = "富文本")
private String promoCodeDesc;
/**
* 课程图片URL
*/
@ -85,6 +95,20 @@ public class CourseUpdateRequest implements Serializable {
@Schema(description = "已下单人数", example = "100")
private Integer orderCount;
/**
* 一级佣金比例(%
*/
@DecimalMin(value = "0.0", message = "一级佣金比例不能小于0")
@Schema(description = "一级佣金比例(%", example = "10")
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
@DecimalMin(value = "0.0", message = "二级佣金比例不能小于0")
@Schema(description = "二级佣金比例(%", example = "5")
private BigDecimal secondLevelRate;
@Serial
private static final long serialVersionUID = 1L;

View File

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

View File

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

View File

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

View File

@ -1,114 +0,0 @@
package com.greenorange.promotion.model.dto.coursePromotionCommissionPending;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
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 java.time.LocalDate;
/**
* 课程推广待提成记录添加请求体
*/
@Data
@Schema(description = "课程推广待提成记录添加请求体", requiredProperties = {
"firstUserId",
"secondUserId",
"courseId",
"name",
"type",
"image",
"orderId",
"userId",
"totalAmount",
"commissionStatus",
"orderCreateTime",
})
public class CoursePromotionCommissionPendingAddRequest implements Serializable {
/**
* 一级用户
*/
@Min(value = 1L, message = "一级用户 ID不能小于1")
@Schema(description = "一级用户", example = "1")
private Long firstUserId;
/**
* 二级用户
*/
@Min(value = 1L, message = "二级用户 ID不能小于1")
@Schema(description = "二级用户", example = "2")
private Long secondUserId;
/**
* 课程id
*/
@Min(value = 1L, message = "课程id ID不能小于1")
@Schema(description = "课程id", example = "1")
private Long courseId;
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "财务管理")
private String name;
/**
* 课程类别
*/
@NotBlank(message = "课程类别不能为空")
@Schema(description = "课程类别", example = "财经")
private String type;
/**
* 课程图片
*/
@NotBlank(message = "课程图片不能为空")
@Schema(description = "课程图片", example = "3JD32NDS")
private String image;
/**
* 课程订单id
*/
@Min(value = 1L, message = "课程订单id ID不能小于1")
@Schema(description = "课程订单id", example = "1")
private Long orderId;
/**
* 下单用户id
*/
@Min(value = 1L, message = "下单用户id ID不能小于1")
@Schema(description = "下单用户id", example = "1")
private Long userId;
/**
* 订单价格
*/
@Schema(description = "订单价格", example = "50.00")
private BigDecimal totalAmount;
/**
* 提成状态
*/
@NotBlank(message = "提成状态不能为空")
@EnumValue(enumClass = CommissionStatusEnum.class)
@Schema(description = "提成状态", example = "待提成")
private String commissionStatus;
/**
* 订单创建时间
*/
@Schema(description = "订单创建时间", example = "2025-05-02 12:23:00")
private LocalDate orderCreateTime;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,47 +0,0 @@
package com.greenorange.promotion.model.dto.coursePromotionCommissionPending;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
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 java.time.LocalDate;
import com.greenorange.promotion.common.PageRequest;
/**
* 课程推广待提成记录查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "课程推广待提成记录查询请求体", requiredProperties = {"current", "pageSize"})
public class CoursePromotionCommissionPendingQueryRequest extends PageRequest implements Serializable {
/**
* 课程名称
*/
@Schema(description = "课程名称", example = "财务管理")
private String name;
/**
* 课程类别
*/
@Schema(description = "课程类别", example = "财经")
private String type;
/**
* 提成状态
*/
@EnumValue(enumClass = CommissionStatusEnum.class)
@Schema(description = "提成状态", example = "待提成")
private String commissionStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,118 +0,0 @@
package com.greenorange.promotion.model.dto.coursePromotionCommissionPending;
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 java.time.LocalDate;
/**
* 课程推广待提成记录更新请求体
*/
@Data
@Schema(description = "课程推广待提成记录更新请求体", requiredProperties = {
"id",
"firstUserId",
"secondUserId",
"courseId",
"name",
"type",
"image",
"orderId",
"userId",
"totalAmount",
"commissionStatus",
"orderCreateTime",
})
public class CoursePromotionCommissionPendingUpdateRequest implements Serializable {
/**
* id
*/
@Min(value = 1L, message = "id ID不能小于1")
@Schema(description = "id", example = "")
private Long id;
/**
* 一级用户
*/
@Min(value = 1L, message = "一级用户 ID不能小于1")
@Schema(description = "一级用户", example = "")
private Long firstUserId;
/**
* 二级用户
*/
@Min(value = 1L, message = "二级用户 ID不能小于1")
@Schema(description = "二级用户", example = "")
private Long secondUserId;
/**
* 课程id
*/
@Min(value = 1L, message = "课程id ID不能小于1")
@Schema(description = "课程id", example = "")
private Long courseId;
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "")
private String name;
/**
* 课程类别
*/
@NotBlank(message = "课程类别不能为空")
@Schema(description = "课程类别", example = "")
private String type;
/**
* 课程图片
*/
@NotBlank(message = "课程图片不能为空")
@Schema(description = "课程图片", example = "")
private String image;
/**
* 课程订单id
*/
@Min(value = 1L, message = "课程订单id ID不能小于1")
@Schema(description = "课程订单id", example = "")
private Long orderId;
/**
* 下单用户id
*/
@Min(value = 1L, message = "下单用户id ID不能小于1")
@Schema(description = "下单用户id", example = "")
private Long userId;
/**
* 订单价格
*/
@Schema(description = "订单价格", example = "")
private BigDecimal totalAmount;
/**
* 提成状态
*/
@NotBlank(message = "提成状态不能为空")
@Schema(description = "提成状态", example = "")
private String commissionStatus;
/**
* 订单创建时间
*/
@Schema(description = "订单创建时间", example = "")
private LocalDate orderCreateTime;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,86 +0,0 @@
package com.greenorange.promotion.model.dto.refundRecord;
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 = {
"outTradeNo",
"outRefundNo",
"name",
"type",
"image",
"totalAmount",
"refundAmount",
"userId",
})
public class RefundRecordAddRequest implements Serializable {
/**
* 订单号
*/
@NotBlank(message = "订单号不能为空")
@Schema(description = "订单号", example = "")
private String outTradeNo;
/**
* 退款单号
*/
@NotBlank(message = "退款单号不能为空")
@Schema(description = "退款单号", example = "")
private String outRefundNo;
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "")
private String name;
/**
* 课程类别
*/
@NotBlank(message = "课程类别不能为空")
@Schema(description = "课程类别", example = "")
private String type;
/**
* 课程图片
*/
@NotBlank(message = "课程图片不能为空")
@Schema(description = "课程图片", example = "")
private String image;
/**
* 订单价格
*/
@Schema(description = "订单价格", example = "")
private BigDecimal totalAmount;
/**
* 退款金额
*/
@Schema(description = "退款金额", example = "")
private BigDecimal refundAmount;
/**
* 用户id
*/
@Min(value = 1L, message = "用户id ID不能小于1")
@Schema(description = "用户id", example = "")
private Long userId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,30 +0,0 @@
package com.greenorange.promotion.model.dto.refundRecord;
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 RefundRecordQueryRequest extends PageRequest implements Serializable {
/**
* 退款单号
*/
@Schema(description = "退款单号", example = "42250701082233444328323233")
private String outRefundNo;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,93 +0,0 @@
package com.greenorange.promotion.model.dto.refundRecord;
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",
"orderNumber",
"outRefundNo",
"name",
"type",
"image",
"totalAmount",
"refundAmount",
"userId",
})
public class RefundRecordUpdateRequest implements Serializable {
/**
* 退款记录id
*/
@Min(value = 1L, message = "退款记录id ID不能小于1")
@Schema(description = "退款记录id", example = "")
private Long id;
/**
* 订单号
*/
@NotBlank(message = "订单号不能为空")
@Schema(description = "订单号", example = "")
private String orderNumber;
/**
* 退款单号
*/
@NotBlank(message = "退款单号不能为空")
@Schema(description = "退款单号", example = "")
private String outRefundNo;
/**
* 课程名称
*/
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "")
private String name;
/**
* 课程类别
*/
@NotBlank(message = "课程类别不能为空")
@Schema(description = "课程类别", example = "")
private String type;
/**
* 课程图片
*/
@NotBlank(message = "课程图片不能为空")
@Schema(description = "课程图片", example = "")
private String image;
/**
* 订单价格
*/
@Schema(description = "订单价格", example = "")
private BigDecimal totalAmount;
/**
* 退款金额
*/
@Schema(description = "退款金额", example = "")
private BigDecimal refundAmount;
/**
* 用户id
*/
@Min(value = 1L, message = "用户id ID不能小于1")
@Schema(description = "用户id", example = "")
private Long userId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,60 +0,0 @@
package com.greenorange.promotion.model.dto.userInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 经理信息更新请求体
*/
@Data
@Schema(description = "经理信息更新请求体", requiredProperties = {"id", "nickName", "userAvatar",
"phoneNumber", "userPassword"})
public class ManagerUserInfoUpdateRequest implements Serializable {
/**
* 用户表 ID
*/
@Min(value = 1L, message = "用户ID不能小于1")
@Schema(description = "用户ID", example = "1")
private Long id;
/**
* 用户昵称
*/
@NotBlank(message = "用户昵称不能为空")
@Schema(description = "用户昵称", example = "chenxinzhi")
private String nickName;
/**
* 用户头像URL
*/
@NotBlank(message = "用户头像URL不能为空")
@Schema(description = "用户头像URL", example = "http://xxx.png")
private String userAvatar;
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 密码(建议加密存储)
*/
@NotBlank(message = "密码不能为空")
@Schema(description = "密码(建议加密存储)", example = "qingcheng")
private String userPassword;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,7 +1,5 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
@ -32,15 +30,6 @@ public class UserInfoMiniPasswordLoginRequest implements Serializable {
@Schema(description = "密码(建议加密存储)", example = "qingcheng")
private String userPassword;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;

View File

@ -1,7 +1,5 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@ -31,14 +29,6 @@ public class UserInfoMiniVerifyCodeLoginRequest implements Serializable {
@Schema(description = "验证码", example = "666999")
private String verificationCode;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;

View File

@ -1,11 +1,7 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.BaseEnum;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@ -32,15 +28,6 @@ public class UserInfoQueryRequest extends PageRequest implements Serializable {
private String phoneNumber;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "admin")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,15 +1,10 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
@ -58,14 +53,6 @@ public class UserInfoRegisterRequest implements Serializable {
@Schema(description = "密码(建议加密存储)", example = "qingcheng")
private String userPassword;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;

View File

@ -1,15 +1,9 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
@ -19,7 +13,7 @@ import java.io.Serializable;
*/
@Data
@Schema(description = "小程序用户信息重置请求体", requiredProperties =
{"phoneNumber", "verificationCode", "userPassword", "userConfirmPassword, userRole"})
{"phoneNumber", "verificationCode", "userPassword", "userConfirmPassword"})
public class UserInfoResetRequest implements Serializable {
/**
@ -58,14 +52,6 @@ public class UserInfoResetRequest implements Serializable {
@Schema(description = "token内部重置使用", example = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY5MjE5MzE5NywiZXhwIjoxNjkyMTk3Nzk3fQ.Q_5Y5Z")
private String sourceToken;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,36 +0,0 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 验证码发送请求体
*/
@Data
@Schema(description = "验证码发送请求体", requiredProperties = {"phoneNumber", "userRole"})
public class VerificationCodeGetRequest implements Serializable {
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,33 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 客户下单汇总查询请求体
*/
@Data
@Schema(description = "客户下单汇总查询请求体", requiredProperties = {"nickName", "phoneNumber"})
public class MiniUserCourseOrderQueryRequest implements Serializable {
/**
* 订单号
*/
@Schema(description = "订单号", example = "202502345023453428745832")
private String orderNumber;
/**
* 员工id
*/
@NotNull(message = "主管用户id不能为null")
@Schema(description = "员工id", example = "1")
private Long staffUserId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,32 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 主管绩效汇总查询请求体
*/
@Data
@Schema(description = "主管绩效汇总查询请求体", requiredProperties = {"nickName", "phoneNumber"})
public class MiniUserPerformanceSummaryQueryRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,63 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import com.greenorange.promotion.constant.CommonConstant;
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;
/**
* 小程序端绩效排名查询请求体,继承自分页请求 PageRequest
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "小程序端绩效排名查询请求体", requiredProperties = {"current", "pageSize"})
public class MiniUserPerformanceSummaryRankQueryRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 起始日期
*/
@Schema(description = "起始日期", example = "2025-02-29 10:00:00")
private String startDate;
/**
* 结束日期
*/
@Schema(description = "结束日期", example = "2025-02-29 10:00:00")
private String endDate;
/**
* 排序字段
*/
@Schema(description = "排序字段", example = "id")
private String sortField;
/**
* 排序顺序(默认升序)
*/
@Schema(description = "排序顺序((升:ascend;降:descend", example = "ascend")
private String sortOrder = CommonConstant.SORT_ORDER_ASC;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,41 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 员工绩效汇总查询请求体
*/
@Data
@Schema(description = "员工绩效汇总查询请求体", requiredProperties = {"nickName", "phoneNumber"})
public class MiniUserPerformanceSummaryStaffQueryRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 主管用户id
*/
@NotNull(message = "主管用户id不能为null")
@Schema(description = "主管用户id", example = "1")
private Long supervisorUserId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,30 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 抽成比例查询请求体
*/
@Data
@Schema(description = "抽成比例查询请求体", requiredProperties = {"level"})
public class RakeRewardsQueryRequest implements Serializable {
/**
* 级别
*/
@NotBlank(message = "级别不能为空")
@Pattern(regexp = "first|second", message = "级别只能是first或second")
@Schema(description = "级别", example = "first")
private String level;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,40 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.*;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 抽成比例更新请求体
*/
@Data
@Schema(description = "抽成比例更新请求体", requiredProperties = {"level", "rate"})
public class RakeRewardsUpdateRequest implements Serializable {
/**
* 级别
*/
@NotBlank(message = "级别不能为空")
@Pattern(regexp = "first|second", message = "级别只能是first或second")
@Schema(description = "级别", example = "first")
private String level;
/**
* 抽成比例
*/
@DecimalMin(value = "0.0", message = "抽成比例不能小于0.0")
@DecimalMax(value = "1.0", message = "抽成比例不能大于1.0")
@Schema(description = "抽成比例", example = "0.1")
private BigDecimal rate;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,46 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 客户下单汇总查询请求体
*/
@Data
@Schema(description = "客户下单汇总查询请求体", requiredProperties = {"nickName", "phoneNumber"})
public class UserCourseOrderQueryRequest extends PageRequest implements Serializable {
/**
* 订单号
*/
@Schema(description = "订单号", example = "202502345023453428745832")
private String orderNumber;
/**
* 起始日期
*/
@Schema(description = "起始日期", example = "2025-02-29 10:00:00")
private String startDate;
/**
* 结束日期
*/
@Schema(description = "结束日期", example = "2025-02-29 10:00:00")
private String endDate;
/**
* 员工id
*/
@NotNull(message = "主管用户id不能为null")
@Schema(description = "员工id", example = "1")
private Long staffUserId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,36 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
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 UserPerformanceSummaryQueryRequest extends PageRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,44 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 绩效排名查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "绩效排名查询请求体", requiredProperties = {"current", "pageSize"})
public class UserPerformanceSummaryRankQueryRequest extends PageRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 起始日期
*/
@Schema(description = "起始日期", example = "2025-02-29 10:00:00")
private String startDate;
/**
* 结束日期
*/
@Schema(description = "结束日期", example = "2025-02-29 10:00:00")
private String endDate;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,40 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 员工绩效汇总查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "员工绩效汇总查询请求体", requiredProperties = {"current", "pageSize"})
public class UserPerformanceSummaryStaffQueryRequest extends PageRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 主管用户id
*/
@NotNull(message = "主管用户id不能为null")
@Schema(description = "主管用户id", example = "1")
private Long supervisorUserId;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,33 +0,0 @@
package com.greenorange.promotion.model.dto.userPerformanceSummary;
import com.greenorange.promotion.common.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 主管绩效汇总查询请求体,继承自分页请求 PageRequest
*/
@Data
@Schema(description = "主管绩效汇总查询请求体", requiredProperties = {"current", "pageSize"})
public class UserPerformanceSummarySupervisorQueryRequest extends PageRequest implements Serializable {
/**
* 姓名
*/
@Schema(description = "姓名", example = "chenxinzhi")
private String nickName;
/**
* 手机号
*/
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -1,33 +0,0 @@
package com.greenorange.promotion.model.dto.wxPay;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(description = "微信支付请求体", requiredProperties = {"orderId", "code"})
public class WechatPayRequest implements Serializable {
/**
* 订单id
*/
@NotNull(message = "id不能为null")
@Min(value = 1L, message = "id不能小于1")
@Schema(description = "订单id", example = "1")
private Long orderId;
/**
* 用户登录凭证
*/
@NotBlank(message = "用户登录凭证不能为空")
@Schema(description = "用户登录凭证", example = "23nm5jfds22a2324rr32rr")
private String code;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -28,7 +28,7 @@ public class Course implements Serializable {
private String name;
/**
* 课程类别[考公,财经]
* 课程类别[考公考研,自媒体,财经]
*/
private String type;
@ -37,6 +37,11 @@ public class Course implements Serializable {
*/
private String detail;
/**
* 推广码说明(富文本)
*/
private String promoCodeDesc;
/**
* 课程图片URL
*/
@ -57,6 +62,16 @@ public class Course implements Serializable {
*/
private Integer orderCount;
/**
* 一级佣金比例(%
*/
private BigDecimal firstLevelRate;
/**
* 二级佣金比例(%
*/
private BigDecimal secondLevelRate;
/**
* 是否上架(true:上架false:下架)
*/

View File

@ -4,57 +4,49 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 晋升申请
* @TableName advancement_apply
* 课程章节
* @TableName course_chapter
*/
@TableName(value ="advancement_apply")
@TableName(value ="course_chapter")
@Data
public class AdvancementApply implements Serializable {
public class CourseChapter implements Serializable {
/**
* 晋升申请id
* 章节ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 申请人姓名
* 章节名称
*/
private String name;
/**
* 申请人手机号
* 章节时长格式可自定义"00:10:00"
*/
private String phone;
private Long duration;
/**
* 简历
* 试看权限[全集试看,部分试看,关闭,开启]
*/
private String resume;
private String permissions;
/**
* 身份证号
* 视频文件 view
*/
private String idCard;
private String videoView;
/**
* 审核状态
* 所属课程ID
*/
private String reviewStatus;
/**
* 拒绝理由
*/
private String rejectReason;
/**
* 用户id(申请成功后获得)
*/
private Long userId;
private Long courseId;
/**
* 是否删除
@ -71,6 +63,7 @@ public class AdvancementApply implements Serializable {
*/
private Date updateTime;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -1,124 +0,0 @@
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.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 课程推广待提成记录
* @TableName course_promotion_commission_pending
*/
@TableName(value ="course_promotion_commission_pending")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CoursePromotionCommissionPending implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 一级用户
*/
private Long firstUserId;
/**
* 二级用户
*/
private Long secondUserId;
/**
* 课程id
*/
private Long courseId;
/**
* 课程名称
*/
private String name;
/**
* 课程类别
*/
private String type;
/**
* 课程图片
*/
private String image;
/**
* 课程订单id
*/
private Long orderId;
/**
* 下单用户id
*/
private Long userId;
/**
* 一级抽佣比例
*/
private BigDecimal firstRate;
/**
* 二级抽佣比例
*/
private BigDecimal secondRate;
/**
* 订单价格
*/
private BigDecimal totalAmount;
/**
* 提成状态
*/
private String commissionStatus;
/**
* 订单创建时间
*/
private Date orderCreateTime;
/**
* 一级抽成奖励
*/
private BigDecimal firstReward;
/**
* 二级抽成奖励
*/
private BigDecimal secondReward;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -7,43 +7,42 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 员工推广记录
* @TableName employee_promotion_records
* 课程推广码申请
* @TableName course_qrcode_apply
*/
@TableName(value ="employee_promotion_records")
@TableName(value ="course_qrcode_apply")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmployeePromotionRecords implements Serializable {
public class CourseQrcodeApply implements Serializable {
/**
* 主键ID
* 课程推广码申请id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 主管ID
*/
private Long firstUserId;
/**
* 员工ID
*/
private Long secondUserId;
/**
* 客户ID
* 用户id
*/
private Long userId;
/**
* 课程id
*/
private Long courseId;
/**
* 课程推广码(view值)
*/
private String courseQrcode;
/**
* 是否删除
*/

View File

@ -7,63 +7,58 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 退款记录表
* @TableName refund_record
* 推广记录表
* @TableName promo_record
*/
@TableName(value ="refund_record")
@TableName(value ="promo_record")
@Data
public class RefundRecord implements Serializable {
public class PromoRecord implements Serializable {
/**
* 退款记录id
* 推广记录ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 订单号
* 被推广课程ID
*/
private String outTradeNo;
private Long courseId;
/**
* 退款单号
* 下级用户ID
*/
private String outRefundNo;
private Long subUserId;
/**
* 课程名
* 下级用户昵
*/
private String name;
private String nickName;
/**
* 课程类别
* 下级用户手机号
*/
private String type;
private String phone;
/**
* 课程图片
* 下级带给上级的收益
*/
private String image;
private BigDecimal benefits;
/**
* 订单价格
* 绑定时间字符串格式
*/
private BigDecimal totalAmount;
private String bindTime;
/**
* 退款金额
* 推广类型
*/
private BigDecimal refundAmount;
private Object promoType;
/**
* 用户id
* 推广人上级用户ID
*/
private Long userId;

View File

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

View File

@ -7,12 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 用户主要信息表
@ -20,9 +15,6 @@ import lombok.NoArgsConstructor;
*/
@TableName(value ="user_main_info")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserMainInfo implements Serializable {
/**
* 主键ID

View File

@ -1,102 +0,0 @@
package com.greenorange.promotion.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 用户绩效汇总表
* @TableName user_performance_summary
*/
@TableName(value ="user_performance_summary")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserPerformanceSummary implements Serializable {
/**
* 用户ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 订单总金额
*/
private BigDecimal totalAmount;
/**
* 净成交
*/
private BigDecimal netAmount;
/**
* 推广人数
*/
private Integer promoCount;
/**
* 员工数量
*/
private Integer empCount;
/**
* 下单数量
*/
private Integer orderCount;
/**
* 待释放
*/
private BigDecimal toRelease;
/**
* 可结算
*/
private BigDecimal toSettle;
/**
* 已结算
*/
private BigDecimal settled;
/**
* 已回退
*/
private BigDecimal refunded;
/**
* 用户id
*/
private Long userId;
/**
* 是否删除
*/
private Integer isDelete;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -1,58 +0,0 @@
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 CommissionStatusEnum implements BaseEnum {
PENDING("待提成"),
COMPLETED("已提成"),
EXPIRED("已失效");
private final String value;
CommissionStatusEnum(String value) {
this.value = value;
}
/**
* BaseEnum 要求的方法:返回枚举对应的校验值
*/
@Override
public String getValue() {
return this.value;
}
/**
* 获取所有枚举值列表
*/
public static List<String> getValues() {
return Arrays.stream(values())
.map(CommissionStatusEnum::getValue)
.collect(Collectors.toList());
}
/**
* 根据值获取对应的枚举对象
*/
public static CommissionStatusEnum getEnumByValue(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
for (CommissionStatusEnum status : CommissionStatusEnum.values()) {
if (status.value.equals(value)) {
return status;
}
}
return null;
}
}

View File

@ -14,9 +14,9 @@ import java.util.stream.Collectors;
@Getter
public enum CourseTypeEnum implements BaseEnum {
KAOGONG("考公"),
KAOBIAN("考编"),
KAOZHENG("考证");
KAOGONGKAOYAN("考公考研"),
ZIMEITI("自媒体"),
CAIJING("财经");
private final String value;

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