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.AppUserCouponSaveBatchVo;
|
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;
|
|
/**
|
* <p>
|
* 用户优惠券 前端控制器
|
* </p>
|
*
|
* @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<PageInfo<XpAppUserCouponListVo>> pageList(@RequestBody XpAppUserCouponPageListQuery query) {
|
|
if(StrUtil.isNotBlank(query.getActicityName()) ){
|
List<String> acticityIds = xpActicityClient.findListToIds(query.getActicityName()).getData();
|
query.setActicityIds(acticityIds);
|
}
|
|
PageInfo<XpAppUserCouponListVo> pageList = xpAppUserCouponService.pageList(query);
|
return R.ok(pageList);
|
}
|
|
@PostMapping("/v1/api/appUserCoupon/deleteByIds")
|
@ApiOperation(value = "根据ids删除用户优惠券", tags = {"管理后台-白名单-删除用户优惠券"})
|
public R<Boolean> 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<UserCouponVo> 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<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().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()<coupon.getFullMoney().doubleValue()){
|
userCouponVo.setStatus(2);
|
}
|
}
|
}
|
|
if(dto.getUserCouponId()!=null){
|
XpAppUserCoupon coupon = couponList.get(0);
|
userCouponVo.setId(coupon.getId());
|
userCouponVo.setMoney(coupon.getMoney().doubleValue());
|
return R.ok(userCouponVo);
|
}else {
|
// 优先用满足条件且抵扣金额最大的
|
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 && 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<BigDecimal> 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<BigDecimal> 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<NavigationCouponPickerVo> 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<XpAppUserCouponVo> 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<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/mini-program/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");
|
// 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<List<String>> r = xpOpenCityClient.pageList(coupon.getOpenCityId());
|
if(r.getCode()==200){
|
vo.setApplicableCities(r.getData());
|
}
|
}
|
R<XpCoupon> 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<List<XpAppUserCoupon>> findListExpirationTime(HttpServletRequest request) {
|
String uid = request.getHeader("XP-Uid");
|
List<XpAppUserCoupon> 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<XpAppUserCouponTotalVo> 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<String> saveInfo_activity(@RequestBody UseUserCouponDto dto) {
|
xpAppUserCouponService.saveInfo_activity(dto);
|
return R.ok();
|
}
|
/**
|
* 发放优惠券
|
*/
|
@PostMapping("/api/v1/appUserCoupon/send")
|
@ApiOperation(value = "发放优惠券", tags = {"管理后台-发放优惠券"})
|
public R<String> send(@RequestBody SendCouponDto dto) {
|
xpAppUserCouponService.send(dto);
|
return R.ok();
|
}
|
|
|
@GetMapping("/logan/inner/appUserCoupon/holding")
|
@ApiOperation(value = "查询优惠券是否已有用户使用", tags = {"管理后台-优惠券是否占用"})
|
public R<Boolean> 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<Integer> 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<UserCouponListVo> 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<List<XpAppUserCoupon>> getXpAppUserCoupon(@RequestParam Long activityId){
|
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new QueryWrapper<XpAppUserCoupon>()
|
.eq("activity_id", activityId).eq("is_deleted", 0));
|
return R.ok(list);
|
}
|
|
|
|
|
|
@PostMapping("/api/v1/activity/getCouponReceiptRecord")
|
@ApiOperation(value = "获取活动领取记录", tags = {"管理后台-活动管理"})
|
public R<PageInfo<CouponReceiptRecordDto>> getCouponReceiptRecord(@RequestBody CouponReceiptRecordVo vo){
|
PageInfo<CouponReceiptRecordDto> pageInfo = new PageInfo<CouponReceiptRecordDto>(vo.getPageNum(), vo.getPageSize());
|
List<CouponReceiptRecordDto> couponReceiptRecord = xpAppUserCouponService.getCouponReceiptRecord(pageInfo, vo);
|
pageInfo.setRecords(couponReceiptRecord);
|
return R.ok(pageInfo);
|
}
|
|
|
/**
|
* 计算优惠金额
|
* @param vo
|
* @return
|
*/
|
@PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount")
|
public R<BigDecimal> calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo){
|
BigDecimal bigDecimal = xpAppUserCouponService.calculateDiscountAmount(vo);
|
return R.ok(bigDecimal);
|
}
|
|
|
/**
|
* 批量保存数据
|
* @param vo
|
* @return
|
*/
|
@PostMapping("/logan/inner/appUserCoupon/saveBatch")
|
public R<?> saveBatch(@RequestBody AppUserCouponSaveBatchVo vo){
|
xpAppUserCouponService.saveBatch(vo.getXpAppUserCoupons());
|
return R.ok();
|
}
|
}
|