package com.xiaopeng.account.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; 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.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.account.vo.UserCouponListVo; import com.xiaopeng.api.dto.account.GetUserCouponDto; import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest; import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.operation.XpActicityClient; import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpOpenCityClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.NavigationCouponPickerVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.math.BigDecimal; import java.time.LocalDateTime; 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; private final UserResourcesClient userResourcesClient; private final XpCouponClient xpCouponClient; @Resource private XpActicityClient xpActicityClient; public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient, UserResourcesClient userResourcesClient, XpCouponClient xpCouponClient) { this.xpAppUserCouponService = xpAppUserCouponService; this.xpOpenCityClient = xpOpenCityClient; this.userResourcesClient = userResourcesClient; this.xpCouponClient = xpCouponClient; } @PostMapping("/v1/api/appUserCoupon/pageList") @ApiOperation(value = "白名单用户优惠券列表",tags = {"管理后台-白名单-用户优惠券列表"},response = XpAppUserCouponListVo.class) public R> pageList(@RequestBody XpAppUserCouponPageListQuery query) { if(StrUtil.isNotBlank(query.getActicityName()) ){ List acticityIds = xpActicityClient.findListToIds(query.getActicityName()).getData(); query.setActicityIds(acticityIds); } PageInfo pageList = xpAppUserCouponService.pageList(query); return R.ok(pageList); } @PostMapping("/v1/api/appUserCoupon/deleteByIds") @ApiOperation(value = "根据ids删除用户优惠券", tags = {"管理后台-白名单-删除用户优惠券"}) public R deleteByIds(@RequestBody XpAppUserCouponPageListQuery query ) { if (query.getIds() == null || query.getIds().isEmpty()) { return R.fail("ID列表不能为空"); } boolean result = xpAppUserCouponService.removeByIds(query.getIds()); return R.ok(result); } @PostMapping("/logan/inner/appUserCoupon/getUserCoupon") public R getUserCoupon(@RequestBody GetUserCouponDto dto) { // String phone ="18888888888"; // if(dto.getUserId()>1){ // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(dto.getUserId().toString()); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } // } UserCouponVo userCouponVo = new UserCouponVo(); // 获取用户所有优惠券 List couponList = xpAppUserCouponService.list(new LambdaQueryWrapper().eq(dto.getUserCouponId()!=null,XpAppUserCoupon::getId, dto.getUserCouponId()).eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getAppUserId,dto.getUserId()).apply("(FIND_IN_SET({0}, open_city_id) or open_city_id='0')", dto.getOpenCityId()) ); if(couponList.isEmpty()){ return R.ok(userCouponVo); } // 计算使用时间规则 couponList = xpAppUserCouponService.timeRule(couponList); if(couponList.isEmpty()){ if(dto.getUserCouponId()!=null){ userCouponVo.setStatus(2); } return R.ok(userCouponVo); } if(dto.getUserCouponId()!=null){ XpAppUserCoupon coupon = couponList.get(0); // 判断是否满足金额 if(coupon.getCouponType()==2){ if(dto.getTotalAmount() 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 && dto.getTotalAmount() >= e.getFullMoney().doubleValue()).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("/logan/inner/appUserCoupon/useUserCoupon") public R useUserCoupon(@RequestBody UseUserCouponDto dto) { XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId()); appUserCoupon.setStatus(2); appUserCoupon.setUseTime(LocalDateTime.now()); appUserCoupon.setAppUserId(null); xpAppUserCouponService.updateById(appUserCoupon); return R.ok(appUserCoupon.getMoney()); } /** * 退回用户的优惠卷 * @param dto * @return */ @PostMapping("/logan/inner/appUserCoupon/backUserCoupon") public R backUserCoupon(@RequestBody UseUserCouponDto dto) { if(dto.getUserCouponId() == null){ return R.ok(); } XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId()); //状态(1=未使用,2=已使用,3=已过期 0=待领取 4=占用中) if(appUserCoupon.getExpirationTime().isAfter(LocalDateTime.now())){ appUserCoupon.setStatus(3); }else{ appUserCoupon.setStatus(1); } appUserCoupon.setUseTime(null); appUserCoupon.setAppUserId(null); xpAppUserCouponService.updateById(appUserCoupon); return R.ok(); } /** * 获取优惠券列表 */ @PostMapping("/api/v1/mini-program/coupon/navigation-picker") @ApiOperation(value = "导航下单-选券弹窗(排序、最佳优惠、气泡文案)", tags = {"小程序-优惠券"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R navigationCouponPicker(@RequestBody @Valid NavigationCouponPickerRequest request, HttpServletRequest httpRequest) { String uid = httpRequest.getHeader("XP-Uid"); return R.ok(xpAppUserCouponService.navigationCouponPicker(Long.valueOf(uid), request)); } @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"); // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } 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"); // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } 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()); vo.setTimeRule(coupon.getTimeJson()); if("0".equals(vo.getCouponId())){ vo.setApplicableCities(Arrays.asList("不限")); }else { R> r = xpOpenCityClient.pageList(coupon.getOpenCityId()); if(r.getCode()==200){ vo.setApplicableCities(r.getData()); } } R coupon1 = xpCouponClient.getCouponById(coupon.getCouponId()); if(coupon1!=null){ XpCoupon xpCoupon = coupon1.getData(); vo.setCouponDesc(xpCoupon.getCouponDescription()); } return R.ok(vo); } return R.ok(null); } /** * 获取即将过期的优惠卷 */ @GetMapping("/api/v1/mini-program/coupon/findListExpirationTime") @ApiOperation(value = "获取即将过期的优惠卷", tags = {"小程序-获取即将过期的优惠卷"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R> findListExpirationTime(HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); List listExpirationTime = xpAppUserCouponService.findListExpirationTime(uid); return R.ok(listExpirationTime); } /** * 获取优惠券列表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"); // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(uid); return R.ok(vo); } @PostMapping("/api/v1/appUserCoupon/saveInfo_activity") @ApiOperation(value = "活动发放优惠券", tags = {"管理后台-活动发放优惠券"}) public R saveInfo_activity(@RequestBody UseUserCouponDto dto) { xpAppUserCouponService.saveInfo_activity(dto); return R.ok(); } /** * 发放优惠券 */ @PostMapping("/api/v1/appUserCoupon/send") @ApiOperation(value = "发放优惠券", tags = {"管理后台-发放优惠券"}) public R send(@RequestBody SendCouponDto dto) { xpAppUserCouponService.send(dto); return R.ok(); } @GetMapping("/logan/inner/appUserCoupon/holding") @ApiOperation(value = "查询优惠券是否已有用户使用", tags = {"管理后台-优惠券是否占用"}) public R holding(@RequestParam Long couponId) { return R.ok(xpAppUserCouponService.holding(couponId)); } /** * 1.0获取用户可用优惠券数量 */ @GetMapping("/api/v1/mini-program/getUserCouponNum") @ApiOperation(value = "1.0获取用户可用优惠券数量", tags = {"小程序-获取用户可用优惠券数量"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R getUserCouponNum(HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); Integer num = xpAppUserCouponService.getUserCouponNum(uid); return R.ok(num); } /** * 获取优惠券切换页面列表 * @param orderMoney * @param request * @return */ @GetMapping("/api/v1/mini-program/getUserCouponList") @ApiOperation(value = "获取优惠券切换页面列表", tags = {"小程序-获取用户可用优惠券数量"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R getUserCouponList(BigDecimal orderMoney, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); UserCouponListVo userCouponList = xpAppUserCouponService.getUserCouponList(orderMoney, uid); return R.ok(userCouponList); } /** * 获取用户活动领取的优惠券 * @return */ @PostMapping("/logan/inner/appUserCoupon/getXpAppUserCoupon") public R> getXpAppUserCoupon(@RequestParam Long activityId){ List list = xpAppUserCouponService.list(new QueryWrapper() .eq("activity_id", activityId).eq("is_deleted", 0)); return R.ok(list); } @PostMapping("/api/v1/activity/getCouponReceiptRecord") @ApiOperation(value = "获取活动领取记录", tags = {"管理后台-活动管理"}) public R> getCouponReceiptRecord(@RequestBody CouponReceiptRecordVo vo){ PageInfo pageInfo = new PageInfo(vo.getPageNum(), vo.getPageSize()); List couponReceiptRecord = xpAppUserCouponService.getCouponReceiptRecord(pageInfo, vo); pageInfo.setRecords(couponReceiptRecord); return R.ok(pageInfo); } /** * 计算优惠金额 * @param vo * @return */ @PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount") public R calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo){ BigDecimal bigDecimal = xpAppUserCouponService.calculateDiscountAmount(vo); return R.ok(bigDecimal); } }