解决了全局异常处理bug
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
// }
|
}
|
||||||
}
|
}
|
@ -61,17 +61,13 @@ 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()
|
|
||||||
: "参数校验失败";
|
|
||||||
|
|
||||||
// 返回时只带 msg,不再拼前缀或字段名
|
|
||||||
return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
|
return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
Reference in New Issue
Block a user