解决了全局异常处理bug

This commit is contained in:
2025-06-24 16:15:39 +08:00
parent a0e60bece6
commit 502f079194
20 changed files with 237 additions and 280 deletions

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.annotation;
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext; import jakarta.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -23,6 +25,6 @@ public class EnumValueValidator implements ConstraintValidator<EnumValue, String
@Override @Override
public boolean isValid(String value, ConstraintValidatorContext context) { public boolean isValid(String value, ConstraintValidatorContext context) {
return validValues.contains(value); return StringUtils.isBlank(value) || validValues.contains(value);
} }
} }

View File

@ -102,14 +102,14 @@ public class CourseController {
/** /**
* 小程序端用户生成推广码 * 小程序端用户生成课程推广码
* @param courseQrcodeAddRequest 课程id * @param courseQrcodeAddRequest 课程id
* @return 课程信息列表 * @return 课程信息列表
*/ */
@PostMapping("generate/qrcode") @PostMapping("generate/qrcode")
@Operation(summary = "小程序端用户生成推广码", description = "参数课程id权限管理员方法名miniGenerateQrcode") @Operation(summary = "小程序端用户生成课程推广码", description = "参数课程id权限管理员方法名miniGenerateQrcode")
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
@SysLog(title = "课程管理", content = "小程序端用户生成推广码") @SysLog(title = "课程管理", content = "小程序端用户生成课程推广码")
public BaseResponse<String> miniGenerateQrcode(@Valid @RequestBody CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception { public BaseResponse<String> miniGenerateQrcode(@Valid @RequestBody CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception {
String videoView = wechatGetQrcodeService.getWxCourseQrCode(courseQrcodeAddRequest); String videoView = wechatGetQrcodeService.getWxCourseQrCode(courseQrcodeAddRequest);
return ResultUtils.success(videoView); return ResultUtils.success(videoView);

View File

@ -1,12 +1,14 @@
package com.greenorange.promotion.controller.course; package com.greenorange.promotion.controller.course;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog; import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant; import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.model.dto.CommonBatchRequest; import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.CommonRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest;
@ -17,12 +19,11 @@ import com.greenorange.promotion.service.course.CourseOrderService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -53,7 +54,7 @@ public class CourseOrderController {
@Operation(summary = "web端管理员添加课程订单", description = "参数课程订单添加请求体权限管理员方法名addCourseOrder") @Operation(summary = "web端管理员添加课程订单", description = "参数课程订单添加请求体权限管理员方法名addCourseOrder")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "课程订单管理", content = "web端管理员添加课程订单") @SysLog(title = "课程订单管理", content = "web端管理员添加课程订单")
public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest) { public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) {
CourseOrder courseOrder = commonService.copyProperties(courseOrderAddRequest, CourseOrder.class); CourseOrder courseOrder = commonService.copyProperties(courseOrderAddRequest, CourseOrder.class);
courseOrderService.save(courseOrder); courseOrderService.save(courseOrder);
return ResultUtils.success(courseOrder.getId()); return ResultUtils.success(courseOrder.getId());
@ -120,26 +121,26 @@ public class CourseOrderController {
return ResultUtils.success(courseOrderVO); return ResultUtils.success(courseOrderVO);
} }
// /** /**
// * Web端管理员分页查询课程订单 * Web端管理员分页查询课程订单
// * @param courseOrderQueryRequest 课程订单查询请求体 * @param courseOrderQueryRequest 课程订单查询请求体
// * @return 课程订单列表 * @return 课程订单列表
// */ */
// @PostMapping("page") @PostMapping("page")
// @Operation(summary = "Web端管理员分页查询课程订单", description = "参数课程订单查询请求体权限管理员方法名listCourseOrderByPage") @Operation(summary = "Web端管理员分页查询课程订单", description = "参数课程订单查询请求体权限管理员方法名listCourseOrderByPage")
// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
// @SysLog(title = "课程订单管理", content = "Web端管理员分页查询课程订单") @SysLog(title = "课程订单管理", content = "Web端管理员分页查询课程订单")
// public BaseResponse<Page<CourseOrderVO>> listCourseOrderByPage(@Valid @RequestBody CourseOrderQueryRequest courseOrderQueryRequest) { public BaseResponse<Page<CourseOrderVO>> listCourseOrderByPage(@Valid @RequestBody CourseOrderQueryRequest courseOrderQueryRequest) {
// long current = courseOrderQueryRequest.getCurrent(); long current = courseOrderQueryRequest.getCurrent();
// long pageSize = courseOrderQueryRequest.getPageSize(); long pageSize = courseOrderQueryRequest.getPageSize();
// QueryWrapper<CourseOrder> queryWrapper = courseOrderService.getQueryWrapper(courseOrderQueryRequest); QueryWrapper<CourseOrder> queryWrapper = courseOrderService.getQueryWrapper(courseOrderQueryRequest);
// Page<CourseOrder> page = courseOrderService.page(new Page<>(current, pageSize), queryWrapper); Page<CourseOrder> page = courseOrderService.page(new Page<>(current, pageSize), queryWrapper);
// List<CourseOrder> courseOrderList = page.getRecords(); List<CourseOrder> courseOrderList = page.getRecords();
// List<CourseOrderVO> courseOrderVOList = commonService.convertList(courseOrderList, CourseOrderVO.class); List<CourseOrderVO> courseOrderVOList = commonService.convertList(courseOrderList, CourseOrderVO.class);
// Page<CourseOrderVO> voPage = new Page<>(current, pageSize); Page<CourseOrderVO> voPage = new Page<>(current, pageSize);
// voPage.setRecords(courseOrderVOList); voPage.setRecords(courseOrderVOList);
// voPage.setPages(page.getPages()); voPage.setPages(page.getPages());
// voPage.setTotal(page.getTotal()); voPage.setTotal(page.getTotal());
// return ResultUtils.success(voPage); return ResultUtils.success(voPage);
// } }
} }

View File

@ -61,18 +61,14 @@ public class GlobalExceptionHandler {
// .append("; ")); // .append("; "));
// return ResultUtils.error(ErrorCode.PARAMS_ERROR, errors.toString()); // return ResultUtils.error(ErrorCode.PARAMS_ERROR, errors.toString());
// 从所有 FieldError 里,排序取第一个 // 按字段名排序取第一个错误的 defaultMessage
FieldError firstError = e.getBindingResult() String msg = e.getBindingResult()
.getFieldErrors().stream().min(Comparator.comparing(FieldError::getField)) .getFieldErrors().stream()
.orElse(null); .sorted(Comparator.comparing(FieldError::getField))
.map(FieldError::getDefaultMessage)
// 直接取它的 defaultMessage即注解里配置的 message .findFirst()
String msg = (firstError != null) .orElse("参数校验失败");
? firstError.getDefaultMessage() return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
: "参数校验失败";
// 返回时只带 msg不再拼前缀或字段名
return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
} }

View File

@ -22,14 +22,12 @@ public class CourseQueryRequest extends PageRequest implements Serializable {
/** /**
* 课程名称 * 课程名称
*/ */
@NotBlank(message = "课程名称不能为空")
@Schema(description = "课程名称", example = "数据分析工程师训练营") @Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name; private String name;
/** /**
* 课程类别[考公考研,自媒体,财经] * 课程类别[考公考研,自媒体,财经]
*/ */
@NotBlank(message = "课程类别不能为空")
@EnumValue(enumClass = CourseTypeEnum.class) @EnumValue(enumClass = CourseTypeEnum.class)
@Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体") @Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体")
private String type; private String type;

View File

@ -39,11 +39,11 @@ public class CourseChapterAddRequest implements Serializable {
private Long duration; private Long duration;
/** /**
* 试看权限 * 试看权限[全集试看,部分试看,关闭,开启]
*/ */
@NotBlank(message = "试看权限不能为空") @NotBlank(message = "试看权限不能为空")
@EnumValue(enumClass = PreviewPermissionEnum.class) @EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限", example = "全集试看") @Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions; private String permissions;
/** /**

View File

@ -22,16 +22,14 @@ public class CourseChapterQueryRequest extends PageRequest implements Serializab
/** /**
* 章节名称 * 章节名称
*/ */
@NotBlank(message = "章节名称不能为空")
@Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?") @Schema(description = "章节名称", example = "企业经营管理者为什么必须懂财务?")
private String name; private String name;
/** /**
* 试看权限 * 试看权限[全集试看,部分试看,关闭,开启]
*/ */
@NotBlank(message = "试看权限不能为空")
@EnumValue(enumClass = PreviewPermissionEnum.class) @EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限", example = "全集试看") @Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions; private String permissions;

View File

@ -47,11 +47,11 @@ public class CourseChapterUpdateRequest implements Serializable {
private Long duration; private Long duration;
/** /**
* 试看权限 * 试看权限[全集试看,部分试看,关闭,开启]
*/ */
@NotBlank(message = "试看权限不能为空") @NotBlank(message = "试看权限不能为空")
@EnumValue(enumClass = PreviewPermissionEnum.class) @EnumValue(enumClass = PreviewPermissionEnum.class)
@Schema(description = "试看权限", example = "全集试看") @Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions; private String permissions;
/** /**

View File

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

View File

@ -1,5 +1,7 @@
package com.greenorange.promotion.model.dto.courseOrder; package com.greenorange.promotion.model.dto.courseOrder;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.OrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
@ -9,6 +11,7 @@ import java.math.BigDecimal;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import com.greenorange.promotion.common.PageRequest; import com.greenorange.promotion.common.PageRequest;
import lombok.EqualsAndHashCode;
/** /**
* 课程订单查询请求体,继承自分页请求 PageRequest * 课程订单查询请求体,继承自分页请求 PageRequest
@ -17,78 +20,18 @@ import com.greenorange.promotion.common.PageRequest;
@Schema(description = "课程订单查询请求体", requiredProperties = {"current", "pageSize"}) @Schema(description = "课程订单查询请求体", requiredProperties = {"current", "pageSize"})
public class CourseOrderQueryRequest extends PageRequest implements Serializable { public class CourseOrderQueryRequest extends PageRequest implements Serializable {
/**
* 订单ID
*/
@Min(value = 1L, message = "订单ID ID不能小于1")
@Schema(description = "订单ID", example = "")
private Long id;
/** /**
* 订单号 * 订单号
*/ */
@NotBlank(message = "订单号不能为空") @Schema(description = "订单号", example = "202506241339232334d234234243")
@Schema(description = "订单号", example = "")
private String orderNumber; private String orderNumber;
/**
* 课程ID
*/
@Min(value = 1L, message = "课程ID ID不能小于1")
@Schema(description = "课程ID", example = "")
private Long courseId;
/** /**
* 课程名称 * 订单状态[交易关闭,交易成功,待支付,已退款]
*/ */
@NotBlank(message = "课程名称不能为空") @EnumValue(enumClass = OrderStatusEnum.class)
@Schema(description = "课程名称", example = "") @Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String name;
/**
* 课程类别
*/
@NotBlank(message = "课程类别不能为空")
@Schema(description = "课程类别", example = "")
private String type;
/**
* 课程封面图片URL
*/
@NotBlank(message = "课程封面图片URL不能为空")
@Schema(description = "课程封面图片URL", example = "")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "")
private BigDecimal originPrice;
/**
* 实际成交价格
*/
@Schema(description = "实际成交价格", example = "")
private BigDecimal discountPrice;
/**
* 订单总金额
*/
@Schema(description = "订单总金额", example = "")
private BigDecimal totalAmount;
/**
* 支付交易号
*/
@NotBlank(message = "支付交易号不能为空")
@Schema(description = "支付交易号", example = "")
private String transactionNumber;
/**
* 订单状态
*/
@NotBlank(message = "订单状态不能为空")
@Schema(description = "订单状态", example = "")
private String orderStatus; private String orderStatus;

View File

@ -1,5 +1,7 @@
package com.greenorange.promotion.model.dto.courseOrder; package com.greenorange.promotion.model.dto.courseOrder;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.OrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
@ -15,16 +17,7 @@ import java.io.Serializable;
@Data @Data
@Schema(description = "课程订单更新请求体", requiredProperties = { @Schema(description = "课程订单更新请求体", requiredProperties = {
"id", "id",
"orderNumber", "orderStatus"
"courseId",
"name",
"type",
"image",
"originPrice",
"discountPrice",
"totalAmount",
"transactionNumber",
"orderStatus",
}) })
public class CourseOrderUpdateRequest implements Serializable { public class CourseOrderUpdateRequest implements Serializable {
@ -32,74 +25,16 @@ public class CourseOrderUpdateRequest implements Serializable {
* 订单ID * 订单ID
*/ */
@Min(value = 1L, message = "订单ID ID不能小于1") @Min(value = 1L, message = "订单ID ID不能小于1")
@Schema(description = "订单ID", example = "") @Schema(description = "订单ID", example = "1")
private Long id; private Long id;
/**
* 订单号
*/
@NotBlank(message = "订单号不能为空")
@Schema(description = "订单号", example = "")
private String orderNumber;
/** /**
* 课程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;
/**
* 课程封面图片URL
*/
@NotBlank(message = "课程封面图片URL不能为空")
@Schema(description = "课程封面图片URL", example = "")
private String image;
/**
* 课程原价
*/
@Schema(description = "课程原价", example = "")
private BigDecimal originPrice;
/**
* 实际成交价格
*/
@Schema(description = "实际成交价格", example = "")
private BigDecimal discountPrice;
/**
* 订单总金额
*/
@Schema(description = "订单总金额", example = "")
private BigDecimal totalAmount;
/**
* 支付交易号
*/
@NotBlank(message = "支付交易号不能为空")
@Schema(description = "支付交易号", example = "")
private String transactionNumber;
/**
* 订单状态
*/ */
@NotBlank(message = "订单状态不能为空") @NotBlank(message = "订单状态不能为空")
@Schema(description = "订单状态", example = "") @EnumValue(enumClass = OrderStatusEnum.class)
@Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus; private String orderStatus;

View File

@ -59,6 +59,7 @@ public class ProjectAddRequest implements Serializable {
/** /**
* 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)] * 项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]
*/ */
@NotBlank(message = "项目状态不能为空")
@EnumValue(enumClass = ProjectStatusEnum.class) @EnumValue(enumClass = ProjectStatusEnum.class)
@Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running") @Schema(description = "项目状态[项目运行(running)|人数已满(full)|项目暂停(paused)]", example = "running")
private String projectStatus; private String projectStatus;

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import lombok.Data; import lombok.Data;
@ -32,7 +34,7 @@ public class CourseChapter implements Serializable {
private Long duration; private Long duration;
/** /**
* 试看权限 * 试看权限[全集试看,部分试看,关闭,开启]
*/ */
private String permissions; private String permissions;
@ -61,6 +63,7 @@ public class CourseChapter implements Serializable {
*/ */
private Date updateTime; private Date updateTime;
@Serial
@TableField(exist = false) @TableField(exist = false)
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -53,7 +55,7 @@ public class CourseOrder implements Serializable {
private BigDecimal originPrice; private BigDecimal originPrice;
/** /**
* 实际成交价格 * 折扣价格
*/ */
private BigDecimal discountPrice; private BigDecimal discountPrice;
@ -68,9 +70,14 @@ public class CourseOrder implements Serializable {
private String transactionNumber; private String transactionNumber;
/** /**
* 订单状态 * 订单状态[交易关闭,交易成功,待支付,已退款]
*/ */
private Object orderStatus; private String orderStatus;
/**
* 用户id
*/
private Long userId;
/** /**
* 是否删除 * 是否删除
@ -87,6 +94,7 @@ public class CourseOrder implements Serializable {
*/ */
private Date updateTime; private Date updateTime;
@Serial
@TableField(exist = false) @TableField(exist = false)
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

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

View File

@ -35,9 +35,9 @@ public class CourseChapterVO implements Serializable {
private Long duration; private Long duration;
/** /**
* 试看权限 * 试看权限[全集试看,部分试看,关闭,开启]
*/ */
@Schema(description = "试看权限", example = "全集试看") @Schema(description = "试看权限[全集试看,部分试看,关闭,开启]", example = "全集试看")
private String permissions; private String permissions;
/** /**

View File

@ -23,63 +23,69 @@ public class CourseOrderVO implements Serializable {
/** /**
* 订单号 * 订单号
*/ */
@Schema(description = "订单号", example = "") @Schema(description = "订单号", example = "202506241339232334d234234243")
private String orderNumber; private String orderNumber;
/** /**
* 课程ID * 课程ID
*/ */
@Schema(description = "课程ID", example = "") @Schema(description = "课程ID", example = "1")
private Long courseId; private Long courseId;
/** /**
* 课程名称 * 课程名称
*/ */
@Schema(description = "课程名称", example = "") @Schema(description = "课程名称", example = "数据分析工程师训练营")
private String name; private String name;
/** /**
* 课程类别 * 课程类别
*/ */
@Schema(description = "课程类别", example = "") @Schema(description = "课程类别", example = "自媒体")
private String type; private String type;
/** /**
* 课程封面图片URL * 课程封面图片URL
*/ */
@Schema(description = "课程封面图片URL", example = "") @Schema(description = "课程封面图片URL", example = "32DHDF3KI")
private String image; private String image;
/** /**
* 课程原价 * 课程原价
*/ */
@Schema(description = "课程原价", example = "") @Schema(description = "课程原价", example = "100.00")
private BigDecimal originPrice; private BigDecimal originPrice;
/** /**
* 实际成交价格 * 折扣价格
*/ */
@Schema(description = "实际成交价格", example = "") @Schema(description = "折扣价格", example = "50.00")
private BigDecimal discountPrice; private BigDecimal discountPrice;
/** /**
* 订单总金额 * 订单总金额
*/ */
@Schema(description = "订单总金额", example = "") @Schema(description = "订单总金额", example = "100.00")
private BigDecimal totalAmount; private BigDecimal totalAmount;
/** /**
* 支付交易号 * 支付交易号
*/ */
@Schema(description = "支付交易号", example = "") @Schema(description = "支付交易号", example = "4342348232388888833333333333")
private String transactionNumber; private String transactionNumber;
/** /**
* 订单状态 * 订单状态[交易关闭,交易成功,待支付,已退款]
*/ */
@Schema(description = "订单状态", example = "") @Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功")
private String orderStatus; private String orderStatus;
/**
* 用户id
*/
@Schema(description = "用户id", example = "1")
private Long userId;
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -1,5 +1,7 @@
package com.greenorange.promotion.service.course; package com.greenorange.promotion.service.course;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
import com.greenorange.promotion.model.entity.CourseOrder; import com.greenorange.promotion.model.entity.CourseOrder;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -10,4 +12,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface CourseOrderService extends IService<CourseOrder> { public interface CourseOrderService extends IService<CourseOrder> {
/**
* 获取查询条件
*/
QueryWrapper<CourseOrder> getQueryWrapper(CourseOrderQueryRequest courseOrderQueryRequest);
} }

View File

@ -1,6 +1,8 @@
package com.greenorange.promotion.service.course.impl; package com.greenorange.promotion.service.course.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
import com.greenorange.promotion.model.entity.CourseOrder; import com.greenorange.promotion.model.entity.CourseOrder;
import com.greenorange.promotion.service.course.CourseOrderService; import com.greenorange.promotion.service.course.CourseOrderService;
import com.greenorange.promotion.mapper.CourseOrderMapper; import com.greenorange.promotion.mapper.CourseOrderMapper;
@ -15,6 +17,16 @@ import org.springframework.stereotype.Service;
public class CourseOrderServiceImpl extends ServiceImpl<CourseOrderMapper, CourseOrder> public class CourseOrderServiceImpl extends ServiceImpl<CourseOrderMapper, CourseOrder>
implements CourseOrderService{ implements CourseOrderService{
/**
* 获取查询条件
*/
@Override
public QueryWrapper<CourseOrder> getQueryWrapper(CourseOrderQueryRequest courseOrderQueryRequest) {
String orderNumber = courseOrderQueryRequest.getOrderNumber();
String orderStatus = courseOrderQueryRequest.getOrderStatus();
return null;
}
} }

View File

@ -36,12 +36,11 @@ class ProjectServiceImplTest {
CommonRequest req = new CommonRequest(); CommonRequest req = new CommonRequest();
req.setId(10L); req.setId(10L);
when(projectService.getById(10L)).thenReturn(null); when(projectService.getById(10L)).thenReturn(null);
// Act & Assert // Act & Assert
RuntimeException ex = assertThrows(RuntimeException.class, () -> RuntimeException ex = assertThrows(RuntimeException.class, () ->
service.queryProjectById(req) service.queryProjectById(req)
); );
assertTrue(ex.getMessage().contains("当前项目不存在")); assertTrue(ex.getMessage().equals("当前项目不存在"));
// commonService.copyProperties 不应被调用 // commonService.copyProperties 不应被调用
verify(commonService, never()).copyProperties(any(), any()); verify(commonService, never()).copyProperties(any(), any());