package com.talentcard.server.business.admin; import com.talentcard.server.business.PageResult; import com.talentcard.server.common.ApiResponse; import com.talentcard.server.request.CouponClaimIssueRequest; import com.talentcard.server.request.CouponClaimStatusRequest; import com.talentcard.server.request.CouponManagementSaveRequest; import com.talentcard.server.request.CouponManagementStatusRequest; import com.talentcard.server.service.MerchantCouponManagementService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; import java.util.Map; @RestController @RequestMapping("/api/admin/benefit-service-config/coupons") @Tag(name = "后台-权益服务配置-优惠券管理", description = "管理优惠券类型、面额、适用商户、有效期、发放批次及领取/使用状态") public class BenefitServiceCouponAdminController { private final MerchantCouponManagementService service; public BenefitServiceCouponAdminController(MerchantCouponManagementService service) { this.service = service; } @GetMapping @Operation(summary = "分页查询优惠券配置") public ApiResponse>> page( @Parameter(description = "适用商户ID") @RequestParam(required = false) Long merchantId, @Parameter(description = "优惠券类型") @RequestParam(required = false) String couponType, @Parameter(description = "发放批次号") @RequestParam(required = false) String batchNo, @Parameter(description = "状态:0下架、1上架") @RequestParam(required = false) Integer status, @Parameter(description = "优惠券或商户名称关键词") @RequestParam(required = false) String keyword, @Parameter(description = "查询指定日期有效的优惠券") @RequestParam(required = false) LocalDate validOn, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { return ApiResponse.success(service.coupons(merchantId, couponType, batchNo, status, keyword, validOn, page, size)); } @GetMapping("/{id}") @Operation(summary = "查询优惠券配置详情") public ApiResponse> detail(@PathVariable Long id) { return ApiResponse.success(service.coupon(id)); } @PostMapping @Operation(summary = "新增优惠券配置") public ApiResponse> create(@Valid @RequestBody CouponManagementSaveRequest request) { return ApiResponse.success(service.createCoupon(request)); } @PutMapping("/{id}") @Operation(summary = "修改优惠券配置") public ApiResponse> update(@PathVariable Long id, @Valid @RequestBody CouponManagementSaveRequest request) { return ApiResponse.success(service.updateCoupon(id, request)); } @PatchMapping("/{id}/status") @Operation(summary = "优惠券上架或下架") public ApiResponse> status(@PathVariable Long id, @Valid @RequestBody CouponManagementStatusRequest request) { return ApiResponse.success(service.updateCouponStatus(id, request.status())); } @PostMapping("/{id}/claims") @Operation(summary = "后台发放优惠券", description = "按发放批次和发放总量为指定持卡人生成领取记录") public ApiResponse> issue(@PathVariable Long id, @Valid @RequestBody CouponClaimIssueRequest request) { return ApiResponse.success(service.issue(id, request)); } @GetMapping("/claims") @Operation(summary = "分页查询优惠券领取和使用记录") public ApiResponse>> claims( @RequestParam(required = false) Long couponId, @RequestParam(required = false) Long merchantId, @RequestParam(required = false) String batchNo, @Parameter(description = "领取状态:0待领取、1已领取、2已取消") @RequestParam(required = false) Integer claimStatus, @Parameter(description = "使用状态:0未使用、1已使用、2已过期、3已作废") @RequestParam(required = false) Integer useStatus, @Parameter(description = "领取编号/持卡人/手机号/卡号关键词") @RequestParam(required = false) String keyword, @RequestParam(required = false) LocalDate startDate, @RequestParam(required = false) LocalDate endDate, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { return ApiResponse.success(service.claims(couponId, merchantId, batchNo, claimStatus, useStatus, keyword, startDate, endDate, page, size)); } @GetMapping("/claims/{claimId}") @Operation(summary = "查询优惠券领取记录详情") public ApiResponse> claim(@PathVariable Long claimId) { return ApiResponse.success(service.claim(claimId)); } @PatchMapping("/claims/{claimId}/status") @Operation(summary = "维护优惠券领取和使用状态") public ApiResponse> claimStatus(@PathVariable Long claimId, @Valid @RequestBody CouponClaimStatusRequest request) { return ApiResponse.success(service.updateClaimStatus(claimId, request)); } }