无关风月
2026-02-12 4eef62727fe9ec08a26abe66f620ccdac26c1713
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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;
 
/**
 * <p>
 * 用户优惠券 前端控制器
 * </p>
 *
 * @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<UserCouponVo> getUserCoupon(@RequestBody GetUserCouponDto dto) {
        UserCouponVo userCouponVo = new UserCouponVo();
        // 获取用户所有优惠券
        List<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().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<XpAppUserCoupon> 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<XpAppUserCoupon> 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("/api/v1/coupon/list")
    @ApiOperation(value = "获取用户获取优惠券列表", tags = {"小程序-获取用户获取优惠券列表"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpAppUserCouponVo> 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/coupon/receive")
    @ApiOperation(value = "领取优惠券", tags = {"小程序-领取优惠券"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<String> 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/coupon/detail/{couponId}")
    @ApiOperation(value = "获取用户获取优惠券详情", tags = {"小程序-获取用户获取优惠券详情"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpAppUserCouponListVo> 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<List<String>> 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/coupon/total")
    @ApiOperation(value = "获取用户获取优惠券数量", tags = {"小程序-获取用户获取优惠券数量"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpAppUserCouponTotalVo> total(HttpServletRequest request) {
        // uid已通过拦截器otp校验,可以直接使用
        String uid = request.getHeader("XP-Uid");
        XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(uid);
        return R.ok(vo);
    }
 
 
}