ActivityServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package com.kym.service.impl;
  2. import com.github.pagehelper.PageHelper;
  3. import com.kym.common.utils.CommUtil;
  4. import com.kym.common.utils.IDGenerator;
  5. import com.kym.entity.*;
  6. import com.kym.entity.queryParams.ActivityQueryParam;
  7. import com.kym.entity.vo.ActivityVo;
  8. import com.kym.entity.common.PageBean;
  9. import com.kym.entity.common.RedisKeys;
  10. import com.kym.entity.UserRechargeRights;
  11. import com.kym.mapper.ActivityMapper;
  12. import com.kym.service.*;
  13. import com.kym.service.UserRechargeRightsService;
  14. import com.kym.service.mybatisplus.MyBaseServiceImpl;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.BeanUtils;
  17. import org.springframework.data.redis.core.RedisTemplate;
  18. import org.springframework.scheduling.annotation.Async;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import java.time.LocalDateTime;
  22. import java.time.LocalTime;
  23. import java.util.List;
  24. import java.util.stream.Collectors;
  25. import static com.kym.entity.Activity.*;
  26. /**
  27. * <p>
  28. * 服务实现类
  29. * </p>
  30. *
  31. * @author skyline
  32. * @since 2023-10-18
  33. */
  34. @Service
  35. @Slf4j
  36. public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activity> implements ActivityService {
  37. private final ActivityStationService activityStationService;
  38. private final RechargeRightsService rechargeRightsService;
  39. private final UserRechargeRightsService userRechargeRightsService;
  40. private final BannerService bannerService;
  41. private final CouponService couponService;
  42. private final RedisTemplate<String, String> redisTemplate;
  43. public ActivityServiceImpl(ActivityStationService activityStationService, RechargeRightsService rechargeRightsService,
  44. UserRechargeRightsService userRechargeRightsService,
  45. BannerService bannerService, CouponService couponService, RedisTemplate<String, String> redisTemplate) {
  46. this.activityStationService = activityStationService;
  47. this.rechargeRightsService = rechargeRightsService;
  48. this.userRechargeRightsService = userRechargeRightsService;
  49. this.bannerService = bannerService;
  50. this.couponService = couponService;
  51. this.redisTemplate = redisTemplate;
  52. }
  53. /**
  54. * 新增活动
  55. *
  56. * @param activityVo
  57. * @return
  58. */
  59. @Override
  60. @Transactional(rollbackFor = Exception.class)
  61. public void createActivity(ActivityVo activityVo) {
  62. // 新增activity
  63. var activity = new Activity();
  64. BeanUtils.copyProperties(activityVo, activity);
  65. activity.setId(IDGenerator.INS().nextId());
  66. save(activity);
  67. // 新增activityStation 活动-站点关联
  68. if (activityVo.getApplyStation() == APPLY_STATION_部分站点 && !CommUtil.isEmptyOrNull(activityVo.getStationIds())) {
  69. var activityStationList = activityVo.getStationIds().stream().map(stationId -> new ActivityStation().setActivityId(activity.getId()).setStationId(stationId)).toList();
  70. activityStationService.saveBatch(activityStationList);
  71. }
  72. // 新增充值优惠活动
  73. if (activityVo.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益) && !CommUtil.isEmptyOrNull(activityVo.getRechargeRightsList())) {
  74. var rechargeRightsList = activityVo.getRechargeRightsList().stream().peek(rechargeRights -> {
  75. BeanUtils.copyProperties(activity, rechargeRights, "id");
  76. rechargeRights.setActivityId(activity.getId());
  77. }).toList();
  78. rechargeRightsService.saveBatch(rechargeRightsList);
  79. }
  80. // 新增优惠券活动
  81. if (activityVo.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券) && !CommUtil.isEmptyOrNull(activityVo.getCouponList())) {
  82. List<Coupon> couponList = activityVo.getCouponList().stream().peek(coupon -> {
  83. BeanUtils.copyProperties(activity, coupon, "id", "name");
  84. coupon.setActivityId(activity.getId());
  85. // coupon.setStatus(Coupon.STATUS_有效);
  86. }).collect(Collectors.toList());
  87. couponService.saveBatch(couponList);
  88. }
  89. // TODO 加入活动延迟启停队列
  90. }
  91. /**
  92. * 主活动列表
  93. *
  94. * @param params
  95. * @return
  96. */
  97. @Override
  98. public PageBean<Activity> listActivity(ActivityQueryParam params) {
  99. PageHelper.startPage(params.getPageNum(), params.getPageSize());
  100. var list = lambdaQuery()
  101. .like(!CommUtil.isEmptyOrNull(params.getName()), Activity::getName, params.getName())
  102. .eq(params.getStatus() != null, Activity::getStatus, params.getStatus())
  103. .eq(params.getDiscountType() != null, Activity::getDiscountType, params.getDiscountType())
  104. .gt(params.getStartTime() != null, Activity::getStartTime, params.getStartTime())
  105. .lt(params.getEndTime() != null, Activity::getEndTime, params.getEndTime())
  106. .orderByDesc(Activity::getId)
  107. .list();
  108. return new PageBean<>(list);
  109. }
  110. /**
  111. * 活动详情
  112. *
  113. * @param activityId
  114. * @return
  115. */
  116. @Override
  117. public ActivityVo activityDetail(String activityId) {
  118. var activity = lambdaQuery().eq(Activity::getId, activityId).one();
  119. var activityVo = new ActivityVo();
  120. BeanUtils.copyProperties(activity, activityVo);
  121. if (activity.getDiscountType().equals(DISCOUNT_TYPE_服务费折扣权益)) {
  122. var rechargeRightsList = rechargeRightsService.lambdaQuery().eq(RechargeRights::getActivityId, activityId).list();
  123. activityVo.setRechargeRightsList(rechargeRightsList);
  124. var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
  125. if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
  126. activityVo.setStationIds(activityStationIds);
  127. //var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
  128. //activityVo.setStationList(stationList);
  129. }
  130. } else if (activity.getDiscountType().equals(DISCOUNT_TYPE_优惠券)) {
  131. List<Coupon> couponList = couponService.lambdaQuery().eq(Coupon::getActivityId, activityId).list();
  132. activityVo.setCouponList(couponList);
  133. var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
  134. if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
  135. activityVo.setStationIds(activityStationIds);
  136. // var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
  137. // activityVo.setStationList(stationList);
  138. }
  139. }
  140. return activityVo;
  141. }
  142. /**
  143. * 终止活动
  144. *
  145. * @param activityId
  146. */
  147. @Override
  148. @Transactional(rollbackFor = Exception.class)
  149. public void terminateActivity(String activityId) {
  150. var activity = lambdaQuery().eq(Activity::getId, activityId).one();
  151. if (activity != null) {
  152. // 根据活动类型分别处理
  153. if (activity.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益)) {
  154. lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, activityId).update();
  155. rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, Activity.STATUS_已结束).eq(RechargeRights::getActivityId, activityId).update();
  156. // 修改banner状态为失效
  157. bannerService.lambdaUpdate().set(Banner::getStatus, Banner.STATUS_有效).eq(Banner::getActivityId, activityId).update();
  158. }
  159. if (activity.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券)) {
  160. var couponList = couponService.lambdaQuery().eq(Coupon::getActivityId, activityId).list();
  161. // 优惠券状态修改为已结束
  162. if (CommUtil.isNotEmptyAndNull(couponList)) {
  163. couponService.updateBatchById(couponList.stream().peek(coupon -> coupon.setStatus(Activity.STATUS_已结束)).toList());
  164. // redis 优惠券失效,删除数据
  165. var userCoupons = redisTemplate.opsForSet().members(RedisKeys.COUPON_ID_TO_USERS);
  166. if (userCoupons != null) {
  167. couponList.forEach(coupon -> {
  168. // 筛选出活动相关的数据
  169. var coupon2user = userCoupons.stream().filter(userCoupon -> userCoupon.startsWith(String.valueOf(coupon.getId()))).toArray();
  170. if (coupon2user.length > 0) {
  171. redisTemplate.opsForSet().remove(RedisKeys.COUPON_ID_TO_USERS, coupon2user);
  172. }
  173. });
  174. }
  175. }
  176. }
  177. // 修改活动状态
  178. lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, activityId).update();
  179. // 修改站点活动关联表状态
  180. activityStationService.lambdaUpdate().set(ActivityStation::getStatus, Activity.STATUS_已结束).eq(ActivityStation::getActivityId, activityId).update();
  181. }
  182. }
  183. /**
  184. * 异步处理充值活动
  185. *
  186. * @param userId
  187. * @param rechargeAmount
  188. */
  189. @Override
  190. @Async
  191. public void handleRechargeActivity(long userId, int rechargeAmount) {
  192. asyncHandleRechargeActivity(userId, rechargeAmount);
  193. }
  194. /**
  195. * 处理充值活动
  196. */
  197. @Transactional(rollbackFor = Exception.class)
  198. public void asyncHandleRechargeActivity(long userId, int rechargeAmount) {
  199. log.info("RechargeActivityTask run....");
  200. // 进行中的充值权益活动
  201. var activity = lambdaQuery().eq(Activity::getDiscountType, DISCOUNT_TYPE_服务费折扣权益).eq(Activity::getStatus, Activity.STATUS_进行中).one();
  202. // 充值金额,匹配到到具体的充值权益,生成用户权益
  203. if (activity != null) {
  204. var rechargeRights = rechargeRightsService.lambdaQuery().eq(RechargeRights::getActivityId, activity.getId())
  205. .le(RechargeRights::getAmountMin, rechargeAmount)
  206. .gt(RechargeRights::getAmountMax, rechargeAmount)
  207. .one();
  208. if (rechargeRights != null) {
  209. var userRechargeRights = new UserRechargeRights().setRightsId(rechargeRights.getId()).setUserId(userId).setRightsBalance(rechargeAmount);
  210. BeanUtils.copyProperties(rechargeRights, userRechargeRights, "id", "createTime", "updateTime");
  211. // 计算有效期
  212. var endTime = LocalDateTime.now().with(LocalTime.MAX).plusDays(rechargeRights.getValidity() - 1);
  213. userRechargeRightsService.save(userRechargeRights.setStartTime(LocalDateTime.now()).setEndTime(endTime));
  214. }
  215. } else {
  216. }
  217. log.info("RechargeActivityTask run end....");
  218. }
  219. }