package com.xiaopeng.operation.controller;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.model.operation.XpActicityCoupon;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.model.operation.XpCoupon;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.api.vo.account.CouponVo;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import com.xiaopeng.operation.service.*;
import com.xiaopeng.operation.service.IXpActicityCouponService;
import com.xiaopeng.operation.service.IXpActicityService;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import com.xiaopeng.operation.service.IXpCouponService;
import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
*
* 活动管理 前端控制器
*
*
* @author mitao
* @since 2026-02-03
*/
@Api(tags = "活动管理")
@RestController
@RequestMapping("")
@Slf4j
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpActicityController {
@Resource
private IXpActicityService service;
@Resource
private IXpActicityCouponService xpActicityCouponService;
@Resource
private IXpActicityStrategyService xpActicityStrategyService;
@Resource
private IXpCouponService xpCouponService;
@Resource
private XpAppUserCouponClient appUserCouponClient;
/**
* 获取所有白名单手机号
*
* @return
*/
@PostMapping("/logan/inner/acticity/findListToIds")
@ApiOperation(value = "获取活动信息ids", tags = {"管理后台-获取活动信息ids"})
public R> findListToIds(@RequestParam String acticityName) {
if (acticityName == null) {
return R.ok();
}
return R.ok(service.findListToIds(acticityName));
}
@Resource
RedisTemplate redisTemplate;
/**
* 是否第一次进入某活动
*
* @return 活动信息,id 和 img
*/
@GetMapping("/api/v1/mini-program/acticity/firstEnter")
@ApiOperation(value = "获取是否第一次推送活动", tags = {"小程序-首页活动"})
@XpClientCheck(checkToken = false, checkOtpToken = true)
public R firstEnter(HttpServletRequest request) {
String uid = request.getHeader("XP-Uid");
ValueOperations ops = redisTemplate.opsForValue();
List activityList = service.activiting(Long.valueOf(uid));
for (XpActivity activity : activityList) {
Duration duration = Duration.between(LocalDateTime.now(), activity.getEndTime());
Boolean isFirst = ops.setIfAbsent(CacheConstants.firstEnterActivity(String.valueOf(activity.getId()), uid), "1", duration);
if(isFirst){
List couponList = appUserCouponClient.getXpAppUserCoupon(activity.getId()).getData();
Set longSet = couponList.stream().map(XpAppUserCoupon::getCouponId).collect(Collectors.toSet());
if (longSet.isEmpty()) {
return R.ok();
}
List xpCoupons1 = xpCouponService.listByIds(longSet);
List couponVos = new ArrayList<>();
for (XpCoupon xpCoupon : xpCoupons1) {
XpAppUserCoupon xpAppUserCoupon = couponList.stream().filter(s -> s.getCouponId().equals(xpCoupon.getId())).findFirst().get();
CouponVo vo = new CouponVo();
vo.setId(xpCoupon.getId());
vo.setConditionalAmount(xpCoupon.getConditionalAmount());
vo.setAmount(xpCoupon.getAmount());
vo.setCouponType(xpCoupon.getCouponType());
vo.setCouponName(xpCoupon.getCouponName());
vo.setCouponDesc(xpCoupon.getCouponDescription());
vo.setEndTime(xpAppUserCoupon.getExpirationTime().toString());
long count = couponList.stream().filter(s -> s.getCouponId().equals(xpCoupon.getId())).count();
vo.setQuantity(count);
couponVos.add(vo);
}
activity.setIsFirst(isFirst);
activity.setCoupons(couponVos);
return R.ok(activity);
}
}
return R.ok();
}
/**
* 是否第一次进入某活动
*
* @return 活动信息,id 和 img
*/
@GetMapping("/api/v1/mini-program/acticity/getFloatActicity")
@ApiOperation(value = "获取首页活动悬浮图标数据", tags = {"小程序-首页活动"})
@XpClientCheck(checkToken = false, checkOtpToken = true)
public R getFloatActicity(HttpServletRequest request) {
String uid = request.getHeader("XP-Uid");
XpActivity activity = service.getFloatActicity(Long.valueOf(uid));
return R.ok(activity);
}
@Resource
IXpActicityStrategyService strategyService;
@Resource
IXpActicityUserService userService;
@Resource
IXpActivityNoticeService noticeService;
@PostMapping("/v1/api/appUserCoupon/pageList")
@ApiOperation(value = "活动列表", tags = {"管理后台-活动管理"}, response = XpActivity.class)
public R> pageList(@RequestBody XpActivityPageListQuery query) {
PageInfo pageList = service.pageList(query);
for (XpActivityDto dto : pageList.getRecords()) {
List strategies = strategyService.lambdaQuery().eq(XpActicityStrategy::getActitcityId, dto.getId()).list();
dto.setStrategy(strategies);
dto.setActivityUser(userService.lambdaQuery().eq(XpActicityUser::getActitcityId, dto.getId()).list());
}
return R.ok(pageList);
}
@PostMapping("/v1/api/appUserCoupon/add")
@ApiOperation(value = "添加活动", tags = {"管理后台-活动管理"}, response = XpCoupon.class)
@AdminOperationLog(
businessType = AdminBusinessType.ACTIVITY_MANAGEMENT,
operationType = AdminOperationType.ADD,
content = "添加活动",
appendRequestData = true
)
public R> add(@RequestBody XpActivityDto dto) {
service.save(dto);
return R.ok();
}
@PostMapping("/v1/api/appUserCoupon/{op}")
@ApiOperation(value = "修改活动状态,release,pause,resume,stop,del", tags = {"管理后台-活动管理"}, response = XpCoupon.class)
@AdminOperationLog(
businessType = AdminBusinessType.ACTIVITY_MANAGEMENT,
operationTypeExpression = "#p0 == 'release' ? T(com.xiaopeng.common.log.enums.AdminOperationType).RELEASE : (#p0 == 'del' ? T(com.xiaopeng.common.log.enums.AdminOperationType).DELETE : T(com.xiaopeng.common.log.enums.AdminOperationType).EDIT)",
contentExpression = "'修改活动状态:' + #p0 + ',id=' + #p1",
appendRequestData = true
)
public R updateById(@PathVariable String op, @RequestParam Long id) {
XpActivity activity = service.getById(id);
switch (op) {
case "release":
activity.setStatus(2);
break;
case "pause":
activity.setStatus(4);
break;
case "resume":
activity.setStatus(1);
break;
case "stop":
activity.setStatus(3);
break;
case "del":
activity.setDeleted(true);
break;
default:
throw new UnsupportedOperationException("Unsupported" + op);
}
service.updateById(activity);
log.info("修改活动状态:{}", activity);
return R.ok();
}
@GetMapping("/v1/api/appUserCoupon/detail")
@ApiOperation(value = "活动详情", tags = {"管理后台-活动管理"}, response = XpCoupon.class)
public R queryById(@RequestParam Long id) {
return R.ok(service.detail(id));
}
/**
* 根据活动id和优惠券id获取活动策略
*
* @param activityId
* @param couponId
* @return
*/
@PostMapping("/logan/inner/acticity/getXpActicityStrategy")
public R getXpActicityStrategy(@RequestParam("activityId") Long activityId, @RequestParam("couponId") Long couponId) {
XpActicityCoupon one = xpActicityCouponService.lambdaQuery().eq(XpActicityCoupon::getActivityId, activityId).eq(XpActicityCoupon::getCouponId, couponId).one();
if (one == null) {
return R.ok();
}
return R.ok(xpActicityStrategyService.getById(one.getActicityStrategyId()));
}
/**
* 获取当前所有有效活动
* @return
*/
@GetMapping("/logan/inner/acticity/getAllEffectiveActivity")
R> getAllEffectiveActivity(){
List list = service.lambdaQuery().eq(XpActivity::getStatus, 2).list();
return R.ok(list);
}
}