package com.xiaopeng.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.api.dto.account.GetUserCouponDto; import com.xiaopeng.api.feignClient.operation.XpOpenCityClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** *

* 用户优惠券 前端控制器 *

* * @author mitao * @since 2026-02-03 */ @RestController @RequestMapping("") public class XpAppUserCouponController { private final IXpAppUserCouponService xpAppUserCouponService; private final XpOpenCityClient xpOpenCityClient; public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient) { this.xpAppUserCouponService = xpAppUserCouponService; this.xpOpenCityClient = xpOpenCityClient; } @PostMapping("/inner/appUserCoupon/getUserCoupon") public R getUserCoupon(@RequestBody GetUserCouponDto dto) { UserCouponVo userCouponVo = new UserCouponVo(); // 获取用户所有优惠券 List couponList = xpAppUserCouponService.list(new LambdaQueryWrapper().eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getAppUserId, dto.getUserId()).apply("FIND_IN_SET({0}, open_city_id)", dto.getOpenCityId()) ); if(couponList.isEmpty()){ return R.ok(userCouponVo); } // 计算使用时间规则 couponList = xpAppUserCouponService.timeRule(couponList); if(couponList.isEmpty()){ return R.ok(userCouponVo); } // 优先用满足条件且抵扣金额最大的 List discountUserCoupons = couponList.stream().filter(e -> e.getCouponType() == 1).sorted(Comparator.comparing(XpAppUserCoupon::getMoney).reversed()).collect(Collectors.toList()); if(!discountUserCoupons.isEmpty()){ userCouponVo.setId(discountUserCoupons.get(0).getId()); userCouponVo.setMoney(discountUserCoupons.get(0).getMoney().doubleValue()); return R.ok(userCouponVo); } List fullUserCoupons = couponList.stream().filter(e -> e.getCouponType() == 2 && e.getFullMoney().doubleValue()>dto.getTotalAmount()).sorted(Comparator.comparing(XpAppUserCoupon::getMoney).reversed()).collect(Collectors.toList()); if(!fullUserCoupons.isEmpty()){ userCouponVo.setId(fullUserCoupons.get(0).getId()); userCouponVo.setMoney(fullUserCoupons.get(0).getMoney().doubleValue()); return R.ok(userCouponVo); } return R.ok(userCouponVo); } @PostMapping("/inner/appUserCoupon/useUserCoupon") public R useUserCoupon(@RequestBody GetUserCouponDto dto) { XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserId()); appUserCoupon.setStatus(2); xpAppUserCouponService.updateById(appUserCoupon); return R.ok(); } /** * 获取优惠券列表 */ @PostMapping("/api/v1/mini-program/coupon/list") @ApiOperation(value = "获取用户获取优惠券列表", tags = {"小程序-获取用户获取优惠券列表"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R list(@RequestBody XpUserCouponListQuery query, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); XpAppUserCouponVo vo = xpAppUserCouponService.userCouponList(query, uid); return R.ok(vo); } /** * 领取优惠券 */ @PostMapping("/api/v1/mini-program/coupon/receive") @ApiOperation(value = "领取优惠券", tags = {"小程序-领取优惠券"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R receive(@RequestBody ReceiveCouponDto dto, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); boolean result = xpAppUserCouponService.receive(dto,uid); if(result){ return R.ok(); } return R.fail(); } /** * 获取优惠券详情 */ @GetMapping("/api/v1/mini-program/coupon/detail/{couponId}") @ApiOperation(value = "获取用户获取优惠券详情", tags = {"小程序-获取用户获取优惠券详情"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R detail(@PathVariable("couponId") Long couponId, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); XpAppUserCoupon coupon = xpAppUserCouponService.getById(couponId); if(uid.equals(coupon.getAppUserId().toString())){ XpAppUserCouponListVo vo = new XpAppUserCouponListVo(); vo.setCouponId(coupon.getId().toString()); vo.setTitle(coupon.getCouponName()); vo.setExpireTime(coupon.getExpirationTime()); if("0".equals(vo.getCouponId())){ vo.setApplicableCities(Arrays.asList("不限")); }else { R> r = xpOpenCityClient.pageList(coupon.getOpenCityId()); if(r.getCode()==200){ vo.setApplicableCities(r.getData()); } } return R.ok(vo); } return R.ok(null); } /** * 获取优惠券列表total */ @GetMapping("/api/v1/mini-program/coupon/total") @ApiOperation(value = "获取用户获取优惠券数量", tags = {"小程序-获取用户获取优惠券数量"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R total(HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(uid); return R.ok(vo); } }