feat(pricing): 添加券码管理和使用功能

- 新增券码批次配置和券码实体
- 实现券码创建、领取、使用等接口
- 添加券码状态和优惠类型枚举
- 优化价格计算逻辑,支持券码优惠
- 新增优惠检测和应用相关功能
This commit is contained in:
2025-08-21 09:35:08 +08:00
parent e9035af542
commit eb327723cd
52 changed files with 2572 additions and 455 deletions

View File

@@ -0,0 +1,92 @@
package com.ycwl.basic.pricing.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ycwl.basic.pricing.dto.req.VoucherBatchCreateReq;
import com.ycwl.basic.pricing.dto.req.VoucherBatchQueryReq;
import com.ycwl.basic.pricing.dto.req.VoucherClaimReq;
import com.ycwl.basic.pricing.dto.req.VoucherCodeQueryReq;
import com.ycwl.basic.pricing.dto.resp.VoucherBatchResp;
import com.ycwl.basic.pricing.dto.resp.VoucherBatchStatsResp;
import com.ycwl.basic.pricing.dto.resp.VoucherCodeResp;
import com.ycwl.basic.pricing.service.VoucherBatchService;
import com.ycwl.basic.pricing.service.VoucherCodeService;
import com.ycwl.basic.utils.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/pricing/voucher")
@RequiredArgsConstructor
public class VoucherManagementController {
private final VoucherBatchService voucherBatchService;
private final VoucherCodeService voucherCodeService;
@PostMapping("/batch/create")
public ApiResponse<Long> createBatch(@RequestBody VoucherBatchCreateReq req) {
Long batchId = voucherBatchService.createBatch(req);
return ApiResponse.success(batchId);
}
@PostMapping("/batch/list")
public ApiResponse<Page<VoucherBatchResp>> getBatchList(@RequestBody VoucherBatchQueryReq req) {
Page<VoucherBatchResp> page = voucherBatchService.queryBatchList(req);
return ApiResponse.success(page);
}
@GetMapping("/batch/{id}")
public ApiResponse<VoucherBatchResp> getBatchDetail(@PathVariable Long id) {
VoucherBatchResp batch = voucherBatchService.getBatchDetail(id);
return ApiResponse.success(batch);
}
@GetMapping("/batch/{id}/stats")
public ApiResponse<VoucherBatchStatsResp> getBatchStats(@PathVariable Long id) {
VoucherBatchStatsResp stats = voucherBatchService.getBatchStats(id);
return ApiResponse.success(stats);
}
@PutMapping("/batch/{id}/status")
public ApiResponse<Void> updateBatchStatus(@PathVariable Long id, @RequestParam Integer status) {
voucherBatchService.updateBatchStatus(id, status);
return ApiResponse.success(null);
}
@PostMapping("/codes")
public ApiResponse<Page<VoucherCodeResp>> getCodeList(@RequestBody VoucherCodeQueryReq req) {
Page<VoucherCodeResp> page = voucherCodeService.queryCodeList(req);
return ApiResponse.success(page);
}
@PutMapping("/code/{id}/use")
public ApiResponse<Void> markCodeAsUsed(@PathVariable Long id, @RequestParam(required = false) String remark) {
voucherCodeService.markCodeAsUsed(id, remark);
return ApiResponse.success(null);
}
@GetMapping("/scenic/{scenicId}/users")
public ApiResponse<Page<VoucherCodeResp>> getUsersInScenic(@PathVariable Long scenicId,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
VoucherCodeQueryReq req = new VoucherCodeQueryReq();
req.setScenicId(scenicId);
req.setPageNum(pageNum);
req.setPageSize(pageSize);
Page<VoucherCodeResp> page = voucherCodeService.queryCodeList(req);
return ApiResponse.success(page);
}
@PostMapping("/mobile/claim")
public ApiResponse<VoucherCodeResp> claimVoucher(@RequestBody VoucherClaimReq req) {
VoucherCodeResp result = voucherCodeService.claimVoucher(req);
return ApiResponse.success(result);
}
@GetMapping("/mobile/my-codes")
public ApiResponse<List<VoucherCodeResp>> getMyVoucherCodes(@RequestParam Long faceId) {
List<VoucherCodeResp> codes = voucherCodeService.getMyVoucherCodes(faceId);
return ApiResponse.success(codes);
}
}