| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package com.kym.service.impl;
- import com.github.pagehelper.PageHelper;
- import com.kym.common.utils.CommUtil;
- import com.kym.common.utils.IDGenerator;
- import com.kym.entity.*;
- import com.kym.entity.queryParams.ActivityQueryParam;
- import com.kym.entity.vo.ActivityVo;
- import com.kym.entity.common.PageBean;
- import com.kym.entity.common.RedisKeys;
- import com.kym.entity.UserRechargeRights;
- import com.kym.mapper.ActivityMapper;
- import com.kym.service.*;
- import com.kym.service.UserRechargeRightsService;
- import com.kym.service.mybatisplus.MyBaseServiceImpl;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.BeanUtils;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import java.time.LocalDateTime;
- import java.time.LocalTime;
- import java.util.List;
- import java.util.stream.Collectors;
- import static com.kym.entity.Activity.*;
- /**
- * <p>
- * 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-10-18
- */
- @Service
- @Slf4j
- public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activity> implements ActivityService {
- private final ActivityStationService activityStationService;
- private final RechargeRightsService rechargeRightsService;
- private final UserRechargeRightsService userRechargeRightsService;
- private final BannerService bannerService;
- private final CouponService couponService;
- private final RedisTemplate<String, String> redisTemplate;
- public ActivityServiceImpl(ActivityStationService activityStationService, RechargeRightsService rechargeRightsService,
- UserRechargeRightsService userRechargeRightsService,
- BannerService bannerService, CouponService couponService, RedisTemplate<String, String> redisTemplate) {
- this.activityStationService = activityStationService;
- this.rechargeRightsService = rechargeRightsService;
- this.userRechargeRightsService = userRechargeRightsService;
- this.bannerService = bannerService;
- this.couponService = couponService;
- this.redisTemplate = redisTemplate;
- }
- /**
- * 新增活动
- *
- * @param activityVo
- * @return
- */
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void createActivity(ActivityVo activityVo) {
- // 新增activity
- var activity = new Activity();
- BeanUtils.copyProperties(activityVo, activity);
- activity.setId(IDGenerator.INS().nextId());
- save(activity);
- // 新增activityStation 活动-站点关联
- if (activityVo.getApplyStation() == APPLY_STATION_部分站点 && !CommUtil.isEmptyOrNull(activityVo.getStationIds())) {
- var activityStationList = activityVo.getStationIds().stream().map(stationId -> new ActivityStation().setActivityId(activity.getId()).setStationId(stationId)).toList();
- activityStationService.saveBatch(activityStationList);
- }
- // 新增充值优惠活动
- if (activityVo.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益) && !CommUtil.isEmptyOrNull(activityVo.getRechargeRightsList())) {
- var rechargeRightsList = activityVo.getRechargeRightsList().stream().peek(rechargeRights -> {
- BeanUtils.copyProperties(activity, rechargeRights, "id");
- rechargeRights.setActivityId(activity.getId());
- }).toList();
- rechargeRightsService.saveBatch(rechargeRightsList);
- }
- // 新增优惠券活动
- if (activityVo.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券) && !CommUtil.isEmptyOrNull(activityVo.getCouponList())) {
- List<Coupon> couponList = activityVo.getCouponList().stream().peek(coupon -> {
- BeanUtils.copyProperties(activity, coupon, "id", "name");
- coupon.setActivityId(activity.getId());
- // coupon.setStatus(Coupon.STATUS_有效);
- }).collect(Collectors.toList());
- couponService.saveBatch(couponList);
- }
- // TODO 加入活动延迟启停队列
- }
- /**
- * 主活动列表
- *
- * @param params
- * @return
- */
- @Override
- public PageBean<Activity> listActivity(ActivityQueryParam params) {
- PageHelper.startPage(params.getPageNum(), params.getPageSize());
- var list = lambdaQuery()
- .like(!CommUtil.isEmptyOrNull(params.getName()), Activity::getName, params.getName())
- .eq(params.getStatus() != null, Activity::getStatus, params.getStatus())
- .eq(params.getDiscountType() != null, Activity::getDiscountType, params.getDiscountType())
- .gt(params.getStartTime() != null, Activity::getStartTime, params.getStartTime())
- .lt(params.getEndTime() != null, Activity::getEndTime, params.getEndTime())
- .orderByDesc(Activity::getId)
- .list();
- return new PageBean<>(list);
- }
- /**
- * 活动详情
- *
- * @param activityId
- * @return
- */
- @Override
- public ActivityVo activityDetail(String activityId) {
- var activity = lambdaQuery().eq(Activity::getId, activityId).one();
- var activityVo = new ActivityVo();
- BeanUtils.copyProperties(activity, activityVo);
- if (activity.getDiscountType().equals(DISCOUNT_TYPE_服务费折扣权益)) {
- var rechargeRightsList = rechargeRightsService.lambdaQuery().eq(RechargeRights::getActivityId, activityId).list();
- activityVo.setRechargeRightsList(rechargeRightsList);
- var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
- if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
- activityVo.setStationIds(activityStationIds);
- //var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
- //activityVo.setStationList(stationList);
- }
- } else if (activity.getDiscountType().equals(DISCOUNT_TYPE_优惠券)) {
- List<Coupon> couponList = couponService.lambdaQuery().eq(Coupon::getActivityId, activityId).list();
- activityVo.setCouponList(couponList);
- var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
- if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
- activityVo.setStationIds(activityStationIds);
- // var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
- // activityVo.setStationList(stationList);
- }
- }
- return activityVo;
- }
- /**
- * 终止活动
- *
- * @param activityId
- */
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void terminateActivity(String activityId) {
- var activity = lambdaQuery().eq(Activity::getId, activityId).one();
- if (activity != null) {
- // 根据活动类型分别处理
- if (activity.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益)) {
- lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, activityId).update();
- rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, Activity.STATUS_已结束).eq(RechargeRights::getActivityId, activityId).update();
- // 修改banner状态为失效
- bannerService.lambdaUpdate().set(Banner::getStatus, Banner.STATUS_有效).eq(Banner::getActivityId, activityId).update();
- }
- if (activity.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券)) {
- var couponList = couponService.lambdaQuery().eq(Coupon::getActivityId, activityId).list();
- // 优惠券状态修改为已结束
- if (CommUtil.isNotEmptyAndNull(couponList)) {
- couponService.updateBatchById(couponList.stream().peek(coupon -> coupon.setStatus(Activity.STATUS_已结束)).toList());
- // redis 优惠券失效,删除数据
- var userCoupons = redisTemplate.opsForSet().members(RedisKeys.COUPON_ID_TO_USERS);
- if (userCoupons != null) {
- couponList.forEach(coupon -> {
- // 筛选出活动相关的数据
- var coupon2user = userCoupons.stream().filter(userCoupon -> userCoupon.startsWith(String.valueOf(coupon.getId()))).toArray();
- if (coupon2user.length > 0) {
- redisTemplate.opsForSet().remove(RedisKeys.COUPON_ID_TO_USERS, coupon2user);
- }
- });
- }
- }
- }
- // 修改活动状态
- lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, activityId).update();
- // 修改站点活动关联表状态
- activityStationService.lambdaUpdate().set(ActivityStation::getStatus, Activity.STATUS_已结束).eq(ActivityStation::getActivityId, activityId).update();
- }
- }
- /**
- * 异步处理充值活动
- *
- * @param userId
- * @param rechargeAmount
- */
- @Override
- @Async
- public void handleRechargeActivity(long userId, int rechargeAmount) {
- asyncHandleRechargeActivity(userId, rechargeAmount);
- }
- /**
- * 处理充值活动
- */
- @Transactional(rollbackFor = Exception.class)
- public void asyncHandleRechargeActivity(long userId, int rechargeAmount) {
- log.info("RechargeActivityTask run....");
- // 进行中的充值权益活动
- var activity = lambdaQuery().eq(Activity::getDiscountType, DISCOUNT_TYPE_服务费折扣权益).eq(Activity::getStatus, Activity.STATUS_进行中).one();
- // 充值金额,匹配到到具体的充值权益,生成用户权益
- if (activity != null) {
- var rechargeRights = rechargeRightsService.lambdaQuery().eq(RechargeRights::getActivityId, activity.getId())
- .le(RechargeRights::getAmountMin, rechargeAmount)
- .gt(RechargeRights::getAmountMax, rechargeAmount)
- .one();
- if (rechargeRights != null) {
- var userRechargeRights = new UserRechargeRights().setRightsId(rechargeRights.getId()).setUserId(userId).setRightsBalance(rechargeAmount);
- BeanUtils.copyProperties(rechargeRights, userRechargeRights, "id", "createTime", "updateTime");
- // 计算有效期
- var endTime = LocalDateTime.now().with(LocalTime.MAX).plusDays(rechargeRights.getValidity() - 1);
- userRechargeRightsService.save(userRechargeRights.setStartTime(LocalDateTime.now()).setEndTime(endTime));
- }
- } else {
- }
- log.info("RechargeActivityTask run end....");
- }
- }
|