diff --git a/src/main/java/com/greenorange/promotion/constant/OrderStatusConstant.java b/src/main/java/com/greenorange/promotion/constant/OrderStatusConstant.java new file mode 100644 index 0000000..686982a --- /dev/null +++ b/src/main/java/com/greenorange/promotion/constant/OrderStatusConstant.java @@ -0,0 +1,17 @@ +package com.greenorange.promotion.constant; + +/** + * 订单状态常量 + */ +public interface OrderStatusConstant { + + String CLOSED = "交易关闭"; + + String SUCCESS = "交易成功"; + + String PENDING = "待支付"; + + String REFUNDED = "已退款"; + + +} diff --git a/src/main/java/com/greenorange/promotion/controller/course/CourseController.java b/src/main/java/com/greenorange/promotion/controller/course/CourseController.java index 1b2d8ec..f5cb332 100644 --- a/src/main/java/com/greenorange/promotion/controller/course/CourseController.java +++ b/src/main/java/com/greenorange/promotion/controller/course/CourseController.java @@ -1,9 +1,7 @@ package com.greenorange.promotion.controller.course; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.SysLog; @@ -14,7 +12,6 @@ import com.greenorange.promotion.model.dto.CommonBatchRequest; import com.greenorange.promotion.model.dto.CommonRequest; import com.greenorange.promotion.model.dto.CommonStringRequest; import com.greenorange.promotion.model.dto.course.CourseAddRequest; -import com.greenorange.promotion.model.dto.course.CourseQrcodeAddRequest; import com.greenorange.promotion.model.dto.course.CourseQueryRequest; import com.greenorange.promotion.model.dto.course.CourseUpdateRequest; import com.greenorange.promotion.model.entity.Course; @@ -30,6 +27,7 @@ import com.greenorange.promotion.service.wechat.WechatGetQrcodeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; @@ -38,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.stream.Collectors; /** @@ -62,6 +61,27 @@ public class CourseController { private WechatGetQrcodeService wechatGetQrcodeService; + + /** + * 小程序端用户查看热门课程列表 + * @return 课程信息列表 + */ + @PostMapping("query/hot") + @Operation(summary = "小程序端用户查看热门课程列表", description = "参数:无,权限:管理员,方法名:miniQueryHotCourseList") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程管理", content = "小程序端用户查看热门课程列表") + public BaseResponse> miniQueryHotCourseList() { + List courseList = courseService.list(); + // 降序排序并取前四个元素 + courseList = courseList.stream() + .sorted((course1, course2) -> Integer.compare(course2.getOrderCount(), course1.getOrderCount())) // 降序排序 + .limit(4) // 取前四个元素 + .collect(Collectors.toList()); + List courseCardVOS = commonService.convertList(courseList, CourseCardVO.class); + return ResultUtils.success(courseCardVOS); + } + + /** * 小程序端用户根据类别查看课程列表 * @param commonStringRequest 课程类别 @@ -103,15 +123,15 @@ public class CourseController { /** * 小程序端用户生成课程推广码 - * @param courseQrcodeAddRequest 课程id + * @param commonRequest 课程id * @return 课程信息列表 */ @PostMapping("generate/qrcode") @Operation(summary = "小程序端用户生成课程推广码", description = "参数:课程id,权限:管理员,方法名:miniGenerateQrcode") @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @SysLog(title = "课程管理", content = "小程序端用户生成课程推广码") - public BaseResponse miniGenerateQrcode(@Valid @RequestBody CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception { - String videoView = wechatGetQrcodeService.getWxCourseQrCode(courseQrcodeAddRequest); + public BaseResponse miniGenerateQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception { + String videoView = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request); return ResultUtils.success(videoView); } @@ -135,6 +155,8 @@ public class CourseController { + + /** * web端管理员添加课程 * @param courseAddRequest 课程添加请求体 @@ -156,7 +178,7 @@ public class CourseController { * @return 是否更新成功 */ @PostMapping("update") - @Operation(summary = "web端管理员根据id修改课程", description = "参数:课程更新请求体,权限:管理员,方法名:updateCourse") + @Operation(summary = "web端管理员根据id修改课程信息", description = "参数:课程更新请求体,权限:管理员,方法名:updateCourse") @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @SysLog(title = "课程管理", content = "web端管理员根据id修改课程信息") public BaseResponse updateCourse(@Valid @RequestBody CourseUpdateRequest courseUpdateRequest) { diff --git a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java index a153fee..0c10d7e 100644 --- a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java +++ b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java @@ -1,21 +1,31 @@ package com.greenorange.promotion.controller.course; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.SysLog; import com.greenorange.promotion.common.BaseResponse; +import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.common.ResultUtils; +import com.greenorange.promotion.constant.OrderStatusConstant; import com.greenorange.promotion.constant.UserConstant; +import com.greenorange.promotion.exception.ThrowUtils; import com.greenorange.promotion.model.dto.CommonBatchRequest; import com.greenorange.promotion.model.dto.CommonRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest; +import com.greenorange.promotion.model.entity.Course; import com.greenorange.promotion.model.entity.CourseOrder; +import com.greenorange.promotion.model.vo.course.CourseCardVO; +import com.greenorange.promotion.model.vo.courseOrder.CourseOrderCardVO; import com.greenorange.promotion.model.vo.courseOrder.CourseOrderVO; import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.course.CourseOrderService; +import com.greenorange.promotion.service.course.CourseService; +import com.greenorange.promotion.utils.OrderNumberUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -27,6 +37,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; import java.util.List; @@ -39,6 +50,9 @@ import java.util.List; @Tag(name = "课程订单模块") public class CourseOrderController { + @Resource + private CourseService courseService; + @Resource private CourseOrderService courseOrderService; @@ -46,35 +60,103 @@ public class CourseOrderController { private CommonService commonService; /** - * web端管理员添加课程订单 - * @param courseOrderAddRequest 课程订单添加请求体 + * 小程序端用户生成课程订单 + * @param courseOrderAddRequest 课程id * @return 是否添加成功 */ @PostMapping("add") - @Operation(summary = "web端管理员添加课程订单", description = "参数:课程订单添加请求体,权限:管理员,方法名:addCourseOrder") - @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) - @SysLog(title = "课程订单管理", content = "web端管理员添加课程订单") + @Operation(summary = "小程序端用户生成课程订单", description = "参数:课程id,权限:管理员,方法名:addCourseOrder") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程订单管理", content = "小程序端用户生成课程订单") public BaseResponse addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) { - CourseOrder courseOrder = commonService.copyProperties(courseOrderAddRequest, CourseOrder.class); + Long userId = (Long) request.getAttribute("userId"); + Long courseId = courseOrderAddRequest.getCourseId(); + Course course = courseService.getById(courseId); + ThrowUtils.throwIf(course == null, ErrorCode.OPERATION_ERROR, "该课程不存在"); + CourseOrder courseOrder = commonService.copyProperties(course, CourseOrder.class); + courseOrder.setOrderNumber(OrderNumberUtils.generateOrderId()); + courseOrder.setTotalAmount(course.getDiscountPrice()); + courseOrder.setUserId(userId); courseOrderService.save(courseOrder); return ResultUtils.success(courseOrder.getId()); } + /** - * web端管理员根据id修改课程订单信息 - * @param courseOrderUpdateRequest 课程订单更新请求体 - * @return 是否更新成功 + * 小程序端用户取消课程订单 + * @param courseOrderAddRequest 课程id + * @return 是否添加成功 */ - @PostMapping("update") - @Operation(summary = "web端管理员根据id修改课程订单", description = "参数:课程订单更新请求体,权限:管理员,方法名:updateCourseOrder") - @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) - @SysLog(title = "课程订单管理", content = "web端管理员根据id修改课程订单信息") - public BaseResponse updateCourseOrder(@Valid @RequestBody CourseOrderUpdateRequest courseOrderUpdateRequest) { - CourseOrder courseOrder = commonService.copyProperties(courseOrderUpdateRequest, CourseOrder.class); - courseOrderService.updateById(courseOrder); - return ResultUtils.success(true); + @PostMapping("cancel") + @Operation(summary = "小程序端用户取消课程订单", description = "参数:订单id,权限:管理员,方法名:cancelCourseOrder") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程订单管理", content = "小程序端用户取消课程订单") + public BaseResponse cancelCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest) { + Long courseId = courseOrderAddRequest.getCourseId(); + CourseOrder courseOrder = courseOrderService.getById(courseId); + ThrowUtils.throwIf(courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.PENDING), + ErrorCode.OPERATION_ERROR, "该订单不存在或者订单状态错误"); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(CourseOrder::getId, courseId).set(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED); + courseOrderService.update(updateWrapper); + return ResultUtils.success(courseOrder.getId()); } + + /** + * 小程序端用户在提交订单页中显示课程信息 + * @param commonRequest 课程id + * @return 是否添加成功 + */ + @PostMapping("show/info") + @Operation(summary = "小程序端用户在提交订单页中显示课程信息", description = "参数:订单id,权限:管理员,方法名:showCourseInfo") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程订单管理", content = "小程序端用户在提交订单页中显示课程信息") + public BaseResponse showCourseInfo(@Valid @RequestBody CommonRequest commonRequest) { + Long id = commonRequest.getId(); + Course course = courseService.getById(id); + CourseCardVO courseCardVO = commonService.copyProperties(course, CourseCardVO.class); + return ResultUtils.success(courseCardVO); + } + + + /** + * 小程序端用户查询课程订单列表 + * @return 课程订单列表 + */ + @PostMapping("query/list") + @Operation(summary = "小程序端用户查询课程订单列表", description = "参数:无,权限:管理员,方法名:queryCourseOrderList") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程订单管理", content = "小程序端用户查询课程订单列表") + public BaseResponse> queryCourseOrderList(HttpServletRequest request) { + Long userId = (Long) request.getAttribute("userId"); + List courseOrderList = commonService.findByFieldEqTargetField(CourseOrder::getUserId, userId, courseOrderService); + List courseOrderCardVOS = commonService.convertList(courseOrderList, CourseOrderCardVO.class); + Collections.reverse(courseOrderCardVOS); + return ResultUtils.success(courseOrderCardVOS); + } + + + /** + * 小程序端用户根据id查询订单详情 + * @return 课程订单列表 + */ + @PostMapping("query/detail") + @Operation(summary = "小程序端用户根据id查询订单详情", description = "参数:订单id,权限:管理员,方法名:queryCourseOrderDetailById") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + @SysLog(title = "课程订单管理", content = "小程序端用户根据id查询订单详情") + public BaseResponse queryCourseOrderDetailById(@RequestBody CommonRequest commonRequest) { + Long id = commonRequest.getId(); + CourseOrder courseOrder = courseOrderService.getById(id); + CourseOrderVO courseOrderVO = commonService.copyProperties(courseOrder, CourseOrderVO.class); + return ResultUtils.success(courseOrderVO); + } + + + + + + /** * web端管理员根据id删除课程订单 * @param commonRequest 课程订单删除请求体 @@ -86,6 +168,9 @@ public class CourseOrderController { @SysLog(title = "课程订单管理", content = "web端管理员根据id删除课程订单") public BaseResponse 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); } @@ -101,6 +186,10 @@ public class CourseOrderController { @SysLog(title = "课程订单管理", content = "web端管理员批量删除课程订单") public BaseResponse delBatchCourseOrder(@Valid @RequestBody CommonBatchRequest commonBatchRequest) { List ids = commonBatchRequest.getIds(); + LambdaQueryWrapper 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); } diff --git a/src/main/java/com/greenorange/promotion/controller/wechat/WechatGetQrcodeController.java b/src/main/java/com/greenorange/promotion/controller/wechat/WechatGetQrcodeController.java index 1ec95c7..59fb323 100644 --- a/src/main/java/com/greenorange/promotion/controller/wechat/WechatGetQrcodeController.java +++ b/src/main/java/com/greenorange/promotion/controller/wechat/WechatGetQrcodeController.java @@ -1,20 +1,12 @@ package com.greenorange.promotion.controller.wechat; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; -import com.freewayso.image.combiner.ImageCombiner; -import com.freewayso.image.combiner.enums.OutputFormat; -import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.common.BaseResponse; -import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.config.WxAccessToken; -import com.greenorange.promotion.constant.UserConstant; +import com.greenorange.promotion.model.dto.CommonRequest; import com.greenorange.promotion.model.dto.CommonStringRequest; -import com.greenorange.promotion.model.dto.course.CourseQrcodeAddRequest; import com.greenorange.promotion.service.wechat.WechatGetQrcodeService; -import com.greenorange.promotion.utils.QRCodeUtil; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,21 +14,10 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; -import org.springframework.core.io.FileSystemResource; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; import java.io.*; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Base64; -import java.util.HashMap; -import java.util.Map; @Slf4j @@ -93,8 +74,8 @@ public class WechatGetQrcodeController { @PostMapping("/get/course/qrcode") @Operation(summary = "微信小程序获取课程码", description = "参数:无, 权限:所有人, 方法名:getCourseQrcode") // @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) - public BaseResponse getCourseQrcode(@Valid @RequestBody CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception { - String view = wechatGetQrcodeService.getWxCourseQrCode(courseQrcodeAddRequest); + public BaseResponse getCourseQrcode(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) throws Exception { + String view = wechatGetQrcodeService.getWxCourseQrCode(commonRequest, request); return ResultUtils.success(view); } diff --git a/src/main/java/com/greenorange/promotion/model/dto/course/CourseQrcodeAddRequest.java b/src/main/java/com/greenorange/promotion/model/dto/course/CourseQrcodeAddRequest.java deleted file mode 100644 index bdffed3..0000000 --- a/src/main/java/com/greenorange/promotion/model/dto/course/CourseQrcodeAddRequest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.greenorange.promotion.model.dto.course; - -import com.greenorange.promotion.annotation.EnumValue; -import com.greenorange.promotion.model.enums.CourseTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 课程推广码生成请求体 - */ -@Data -@Schema(description = "课程推广码生成请求体", requiredProperties = { - "id", - "name", - "type", - "image", - "originPrice", - "discountPrice", - "invitationCode" -}) -public class CourseQrcodeAddRequest implements Serializable { - /** - * 课程ID - */ - @Min(value = 1L, message = "课程ID ID不能小于1") - @Schema(description = "课程ID", example = "1") - private Long id; - - /** - * 课程名称 - */ - @NotBlank(message = "课程名称不能为空") - @Schema(description = "课程名称", example = "数据分析工程师训练营") - private String name; - - /** - * 课程类别[考公考研,自媒体,财经] - */ - @NotBlank(message = "课程类别不能为空") - @EnumValue(enumClass = CourseTypeEnum.class) - @Schema(description = "课程类别[考公考研,自媒体,财经]", example = "自媒体") - private String type; - - /** - * 课程图片URL - */ - @NotBlank(message = "课程图片URL不能为空") - @Schema(description = "课程图片URL", example = "324IEHJDE") - private String image; - - /** - * 课程原价 - */ - @DecimalMin(value = "0.0", message = "课程原价不能小于0") - @Schema(description = "课程原价", example = "3499") - private BigDecimal originPrice; - - /** - * 折扣价格 - */ - @DecimalMin(value = "0.0", message = "折扣价格不能小于0") - @Schema(description = "折扣价格", example = "2499") - private BigDecimal discountPrice; - - /** - * 邀请码 - */ - @Schema(description = "邀请码", example = "666999") - @NotBlank(message = "邀请码不能为空") - private String invitationCode; - -} diff --git a/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderCardVO.java b/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderCardVO.java new file mode 100644 index 0000000..9ce4961 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderCardVO.java @@ -0,0 +1,60 @@ +package com.greenorange.promotion.model.vo.courseOrder; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 课程订单卡片 视图对象 + */ +@Data +@Schema(description = "课程订单卡片 视图对象") +public class CourseOrderCardVO implements Serializable { + + + /** + * 课程订单ID + */ + @Schema(description = "课程订单ID", example = "1") + private Long id; + + /** + * 订单号 + */ + @Schema(description = "订单号", example = "202506241339232334d234234243") + private String orderNumber; + + /** + * 课程名称 + */ + @Schema(description = "课程名称", example = "数据分析工程师训练营") + private String name; + + /** + * 课程类别 + */ + @Schema(description = "课程类别", example = "自媒体") + private String type; + + /** + * 订单总金额 + */ + @Schema(description = "订单总金额", example = "100.00") + private BigDecimal totalAmount; + + /** + * 订单状态[交易关闭,交易成功,待支付,已退款] + */ + @Schema(description = "订单状态[交易关闭,交易成功,待支付,已退款]", example = "交易成功") + private String orderStatus; + + /** + * 创建时间 + */ + @Schema(description = "创建时间", example = "2025-06-24 13:39:23") + private Date createTime; + +} diff --git a/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderVO.java b/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderVO.java index d21ec2e..6db61ea 100644 --- a/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderVO.java +++ b/src/main/java/com/greenorange/promotion/model/vo/courseOrder/CourseOrderVO.java @@ -6,6 +6,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; /** * 课程订单 视图对象 @@ -86,6 +87,18 @@ public class CourseOrderVO implements Serializable { @Schema(description = "用户id", example = "1") private Long userId; + /** + * 创建时间 + */ + @Schema(description = "创建时间", example = "2025-06-24 13:39:23") + private Date createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间", example = "2025-06-24 13:39:23") + private Date updateTime; + @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java b/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java index 0ed873c..ddb9962 100644 --- a/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java @@ -2,10 +2,13 @@ package com.greenorange.promotion.service.course.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.greenorange.promotion.constant.CommonConstant; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest; import com.greenorange.promotion.model.entity.CourseOrder; import com.greenorange.promotion.service.course.CourseOrderService; import com.greenorange.promotion.mapper.CourseOrderMapper; +import com.greenorange.promotion.utils.SqlUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; /** @@ -25,7 +28,13 @@ public class CourseOrderServiceImpl extends ServiceImpl getQueryWrapper(CourseOrderQueryRequest courseOrderQueryRequest) { String orderNumber = courseOrderQueryRequest.getOrderNumber(); String orderStatus = courseOrderQueryRequest.getOrderStatus(); - return null; + String sortField = courseOrderQueryRequest.getSortField(); + String sortOrder = courseOrderQueryRequest.getSortOrder(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(orderNumber), "orderNumber", orderNumber); + queryWrapper.eq(StringUtils.isNotBlank(orderStatus), "orderStatus", orderStatus); + queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField); + return queryWrapper; } } diff --git a/src/main/java/com/greenorange/promotion/service/wechat/WechatGetQrcodeService.java b/src/main/java/com/greenorange/promotion/service/wechat/WechatGetQrcodeService.java index ffd4d20..447db0a 100644 --- a/src/main/java/com/greenorange/promotion/service/wechat/WechatGetQrcodeService.java +++ b/src/main/java/com/greenorange/promotion/service/wechat/WechatGetQrcodeService.java @@ -1,7 +1,8 @@ package com.greenorange.promotion.service.wechat; import com.greenorange.promotion.config.WxAccessToken; -import com.greenorange.promotion.model.dto.course.CourseQrcodeAddRequest; +import com.greenorange.promotion.model.dto.CommonRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; @@ -28,5 +29,5 @@ public interface WechatGetQrcodeService { /** * 微信小程序获取课程码 */ - String getWxCourseQrCode(CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception; + String getWxCourseQrCode(CommonRequest courseQrcodeAddRequest, HttpServletRequest request) throws Exception; } diff --git a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java index 9a60e1f..0106285 100644 --- a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java @@ -14,13 +14,18 @@ import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.config.WxAccessToken; import com.greenorange.promotion.constant.SystemConstant; import com.greenorange.promotion.exception.BusinessException; -import com.greenorange.promotion.model.dto.course.CourseQrcodeAddRequest; +import com.greenorange.promotion.model.dto.CommonRequest; +import com.greenorange.promotion.model.entity.Course; import com.greenorange.promotion.model.entity.FileInfo; +import com.greenorange.promotion.model.entity.UserInfo; +import com.greenorange.promotion.service.course.CourseService; import com.greenorange.promotion.service.file.FileInfoService; +import com.greenorange.promotion.service.userInfo.UserInfoService; import com.greenorange.promotion.service.wechat.WechatGetQrcodeService; import com.greenorange.promotion.utils.QRCodeUtil; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.RandomStringUtils; import org.springframework.beans.factory.annotation.Value; @@ -33,7 +38,6 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.net.URL; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -42,7 +46,6 @@ import java.util.concurrent.TimeUnit; public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { - // 文件上传的存储目录 @Value("${file.upload-dir}") private String uploadDir; @@ -65,10 +68,15 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { @Value("${wx.mini.appSecret}") private String appSecret; - @Resource private FileInfoService fileInfoService; + @Resource + private UserInfoService userInfoService; + + @Resource + private CourseService courseService; + /** * 获取接口调用凭据 @@ -199,13 +207,23 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { */ @Override @Transactional(rollbackFor = Exception.class) - public String getWxCourseQrCode(CourseQrcodeAddRequest courseQrcodeAddRequest) throws Exception { + public String getWxCourseQrCode(CommonRequest commonRequest, HttpServletRequest request) throws Exception { String accessToken = (String) redisTemplate.opsForValue().get(ACCESS_TOKEN_KEY); if (accessToken == null) { accessToken = this.getAccessToken().getAccess_token(); } - String invitationCode = courseQrcodeAddRequest.getInvitationCode(); - Long id = courseQrcodeAddRequest.getId(); + // 获取用户邀请码 + Long userId = (Long) request.getAttribute("userId"); + UserInfo userInfo = userInfoService.getById(userId); + String invitationCode = userInfo.getInvitationCode(); + // 获取课程信息 + Long id = commonRequest.getId(); + Course course = courseService.getById(id); + String courseTitle = course.getName(); + String originalPrice = String.valueOf(course.getOriginPrice()); + String discountPrice = String.valueOf(course.getDiscountPrice()); + String discountText = "元券后价"; + Map param = new HashMap<>(); param.put("page", "pages/loginModule/register/register"); param.put("scene", "invitationCode=" + invitationCode + "&courseId=" + id); @@ -220,10 +238,7 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { .execute() .bodyBytes(); - String courseTitle = courseQrcodeAddRequest.getName(); - String originalPrice = String.valueOf(courseQrcodeAddRequest.getOriginPrice()); - String discountPrice = String.valueOf(courseQrcodeAddRequest.getDiscountPrice()); - String discountText = "元券后价"; + String FontType = "Microsoft YaHei UI"; int FontStyle = Font.PLAIN; @@ -232,7 +247,7 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { ImageCombiner combiner = new ImageCombiner(blankUrl, 341, 391, ZoomMode.WidthHeight, OutputFormat.PNG); // 加载课程图片 - String courseUrl = SystemConstant.FILE_COMMON_PREFIX + courseQrcodeAddRequest.getImage(); + String courseUrl = SystemConstant.FILE_COMMON_PREFIX + course.getImage(); BufferedImage courseImage = ImageIO.read(new URL(courseUrl)); // Graphics2D graphics = courseImage.createGraphics(); diff --git a/src/main/java/com/greenorange/promotion/utils/OrderNumberUtils.java b/src/main/java/com/greenorange/promotion/utils/OrderNumberUtils.java index 3c3b2ca..642d8c4 100644 --- a/src/main/java/com/greenorange/promotion/utils/OrderNumberUtils.java +++ b/src/main/java/com/greenorange/promotion/utils/OrderNumberUtils.java @@ -38,7 +38,7 @@ public class OrderNumberUtils { // 获取时间戳(精确到秒) String timestamp = DATE_FORMAT.format(new Date()); - // 获取4位随机数 + // 获取6位随机数 String randomNumber = generateRandomNumber(); // 获取6位自增序列号,并确保不超过最大值 @@ -56,10 +56,10 @@ public class OrderNumberUtils { return new SimpleDateFormat("yyyyMMdd").format(new Date()); } - // 生成4位随机数(范围:0000到9999) + // 生成6位随机数(范围:000000到999999) private static String generateRandomNumber() { - int random = (int) (Math.random() * 10000); // 生成0到9999之间的随机数 - return String.format("%04d", random); // 格式化为4位 + int random = (int) (Math.random() * 1000000); // 生成0到999999之间的随机数 + return String.format("%06d", random); // 格式化为6位 } // 获取下一个自增序列号,使用ReentrantLock来确保线程安全 diff --git a/src/main/resources/templates/controller.java.vm b/src/main/resources/templates/controller.java.vm index 7426b50..5ce0586 100644 --- a/src/main/resources/templates/controller.java.vm +++ b/src/main/resources/templates/controller.java.vm @@ -42,7 +42,7 @@ public class ${entityName}Controller { * @return 是否更新成功 */ @PostMapping("update") - @Operation(summary = "web端管理员根据id修改${entityComment}", description = "参数:${entityComment}更新请求体,权限:管理员,方法名:update${entityName}") + @Operation(summary = "web端管理员根据id修改${entityComment}信息", description = "参数:${entityComment}更新请求体,权限:管理员,方法名:update${entityName}") @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) @SysLog(title = "${entityComment}管理", content = "web端管理员根据id修改${entityComment}信息") public BaseResponse update${entityName}(@Valid @RequestBody ${entityName}UpdateRequest ${entityNameLower}UpdateRequest) {