package com.xiaopeng.account.controller;
import com.alibaba.fastjson.JSONObject;
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.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.api.dto.account.GetUserCouponDto;
import com.xiaopeng.api.dto.account.UseUserCouponDto;
import com.xiaopeng.api.dto.account.UserResourcesDto;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
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;
private final UserResourcesClient userResourcesClient;
public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient, UserResourcesClient userResourcesClient) {
this.xpAppUserCouponService = xpAppUserCouponService;
this.xpOpenCityClient = xpOpenCityClient;
this.userResourcesClient = userResourcesClient;
}
@PostMapping("/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(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()){
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 UseUserCouponDto 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");
// 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());
}
}
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");
// 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/send")
@ApiOperation(value = "发放优惠券", tags = {"管理后台-发放优惠券"})
public R send(@RequestBody SendCouponDto dto) {
xpAppUserCouponService.send(dto);
return R.ok();
}
}