|
|
@@ -5,29 +5,26 @@ import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.ylx.common.exception.base.BaseException;
|
|
|
import com.ylx.common.utils.DateUtils;
|
|
|
-import com.ylx.point.domain.PointActivity;
|
|
|
-import com.ylx.point.domain.PointActivityTask;
|
|
|
-import com.ylx.point.domain.PointSignReward;
|
|
|
-import com.ylx.point.domain.PointSignTask;
|
|
|
+import com.ylx.point.domain.*;
|
|
|
import com.ylx.point.domain.dto.*;
|
|
|
import com.ylx.point.domain.vo.*;
|
|
|
-import com.ylx.point.enums.PointActivityExpirePolicyEnum;
|
|
|
import com.ylx.point.enums.PointActivityStatusEnum;
|
|
|
import com.ylx.point.enums.PointActivityTypeEnum;
|
|
|
import com.ylx.point.mapper.PointActivityMapper;
|
|
|
import com.ylx.point.service.*;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.time.DateTimeException;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
-import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -39,9 +36,10 @@ import java.util.stream.Collectors;
|
|
|
* @author wzj
|
|
|
* @date 2026-03-25
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, PointActivity> implements IPointActivityService {
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
private PointActivityMapper pointActivityMapper;
|
|
|
@Autowired
|
|
|
private IPointActivityTaskService pointActivityTaskService;
|
|
|
@@ -51,6 +49,16 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
private IPointSignRewardService pointSignRewardService;
|
|
|
@Autowired
|
|
|
private IPointUserActivityTaskCompletionService pointUserActivityTaskCompletionService;
|
|
|
+ @Autowired
|
|
|
+ private IPointActivityExpirePolicyService pointActivityExpirePolicyService;
|
|
|
+
|
|
|
+ private static final int BATCH_SIZE = 1000;
|
|
|
+
|
|
|
+ private static final String INVALID_ARGUMENT_MESSAGE = "参数不能为空";
|
|
|
+ private static final String INVALID_EXPIRE_POLICY_TYPE_MESSAGE = "无效的过期策略类型";
|
|
|
+ private static final String EXPIRE_DAYS_REQUIRED_MESSAGE = "过期天数不能为空";
|
|
|
+ private static final String EXPIRE_YEAR_REQUIRED_MESSAGE = "过期年数不能为空";
|
|
|
+ private static final String UPDATE_FAILED_MESSAGE = "更新积分活动过期策略失败";
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@@ -155,25 +163,60 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
public void editValidity(PointActivityValidityDTO dto) {
|
|
|
|
|
|
// 根据dto中activityType获取全部的活动list
|
|
|
- LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
- queryWrapper.eq(PointActivity::getActivityType, dto.getActivityType());
|
|
|
PointActivity pointActivity = new PointActivity();
|
|
|
pointActivity.setActivityType(dto.getActivityType());
|
|
|
List<PointActivity> activityList = pointActivityMapper.selectPointActivityList(pointActivity);
|
|
|
+
|
|
|
+ // 根据类型获取积分活动过期策略表数据
|
|
|
+ PointActivityExpirePolicy expirePolicy = pointActivityExpirePolicyService.selectPointActivityExpirePolicyByActivityType(dto.getActivityType());
|
|
|
if (CollectionUtil.isEmpty(activityList)) {
|
|
|
- throw new BaseException("该类型的活动不存在,设置失败");
|
|
|
+ // 更新积分活动过期策略表
|
|
|
+ this.saveOrUpdatePointActivityExpirePolicy(expirePolicy, dto);
|
|
|
+ } else {
|
|
|
+ // 判断活动list中只要有活动的状态为"进行中",修改就失败
|
|
|
+ boolean hasOngoingActivity = activityList.stream()
|
|
|
+ .anyMatch(activity -> PointActivityStatusEnum.IN_PROGRESS.getCode().equals(activity.getStatus()));
|
|
|
+ if (hasOngoingActivity) {
|
|
|
+ throw new BaseException("存在进行中的活动,无法修改有效期");
|
|
|
+ }
|
|
|
+ // 更新积分活动过期策略表
|
|
|
+ this.saveOrUpdatePointActivityExpirePolicy(expirePolicy, dto);
|
|
|
+ // 批量更新活动的有效期策略
|
|
|
+ batchUpdateExpirePolicy(activityList, expirePolicy.getId());
|
|
|
}
|
|
|
|
|
|
- // 判断活动list中只要有活动的状态为"进行中",修改就失败
|
|
|
- boolean hasOngoingActivity = activityList.stream()
|
|
|
- .anyMatch(activity -> PointActivityStatusEnum.IN_PROGRESS.getCode().equals(activity.getStatus()));
|
|
|
- if (hasOngoingActivity) {
|
|
|
- throw new BaseException("存在进行中的活动,无法修改有效期");
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // 批量更新活动的有效期策略
|
|
|
- batchUpdateExpirePolicy(activityList, dto);
|
|
|
+ @Override
|
|
|
+ public List<PointActivityValidityVo> validityDetails() {
|
|
|
+ try {
|
|
|
+ // 查询所有过期策略
|
|
|
+ List<PointActivityExpirePolicy> expirePolicies = this.pointActivityExpirePolicyService.list();
|
|
|
+
|
|
|
+ // 如果没有数据,返回空列表
|
|
|
+ if (CollectionUtil.isEmpty(expirePolicies)) {
|
|
|
+ log.debug("没有查询到积分活动过期策略数据");
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转换为VO对象
|
|
|
+ List<PointActivityValidityVo> result = expirePolicies.stream()
|
|
|
+ .map(this::convertToVo)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ log.info("成功查询到 {} 条积分活动有效期详情", result.size());
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("查询积分活动有效期详情失败", e);
|
|
|
+ throw new BaseException("查询积分活动有效期详情失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ private PointActivityValidityVo convertToVo(PointActivityExpirePolicy policy) {
|
|
|
+ PointActivityValidityVo vo = new PointActivityValidityVo();
|
|
|
+ BeanUtil.copyProperties(policy, vo);
|
|
|
+ // 可以在这里添加额外的转换逻辑
|
|
|
+ return vo;
|
|
|
}
|
|
|
|
|
|
private void validateActivityDTO(PointActivityDTO dto) {
|
|
|
@@ -219,10 +262,71 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void updateActivity(PointActivity entity) {
|
|
|
- int affectedRows = pointActivityMapper.updatePointActivity(entity);
|
|
|
- if (affectedRows <= 0) {
|
|
|
- throw new BaseException("更新积分活动失败");
|
|
|
+ private void saveOrUpdatePointActivityExpirePolicy(PointActivityExpirePolicy expirePolicy, PointActivityValidityDTO dto) {
|
|
|
+
|
|
|
+ // 参数校验
|
|
|
+ if (ObjectUtil.isNull(dto)) {
|
|
|
+ throw new IllegalArgumentException("参数不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 根据expirePolicy类型设置对应的过期时间
|
|
|
+ Integer expirePolicyCode = dto.getExpirePolicy();
|
|
|
+ if (ObjectUtil.isNull(expirePolicyCode)) {
|
|
|
+ throw new IllegalArgumentException("过期策略类型不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 准备要保存或更新的实体
|
|
|
+ PointActivityExpirePolicy entity = expirePolicy != null ? expirePolicy : new PointActivityExpirePolicy();
|
|
|
+
|
|
|
+ // 设置基本信息
|
|
|
+ entity.setActivityType(dto.getActivityType());
|
|
|
+ entity.setExpirePolicy(dto.getExpirePolicy());
|
|
|
+
|
|
|
+ // 根据过期策略类型设置对应的过期时间
|
|
|
+ setExpireTimeByPolicyType(entity, dto, expirePolicyCode);
|
|
|
+
|
|
|
+ // 保存或更新
|
|
|
+ saveOrUpdateExpirePolicy(entity, dto.getActivityType());
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setExpireTimeByPolicyType(PointActivityExpirePolicy entity, PointActivityValidityDTO dto, Integer expirePolicyCode) {
|
|
|
+ // 先清空所有过期时间字段
|
|
|
+ entity.setExpireDays(null);
|
|
|
+ entity.setExpireYear(null);
|
|
|
+
|
|
|
+ // 根据策略类型设置对应的过期时间
|
|
|
+ switch (expirePolicyCode) {
|
|
|
+ case 1: // PERMANENT_VALID - 永久有效
|
|
|
+ // 已经清空了过期天数和年数,无需额外操作
|
|
|
+ break;
|
|
|
+ case 2: // TRANSACTION_EXPIRE - 按交易过期
|
|
|
+ if (dto.getExpireDays() == null) {
|
|
|
+ throw new IllegalArgumentException(EXPIRE_DAYS_REQUIRED_MESSAGE);
|
|
|
+ }
|
|
|
+ entity.setExpireDays(dto.getExpireDays());
|
|
|
+ break;
|
|
|
+ case 3: // YEARLY_EXPIRE - 按年过期
|
|
|
+ if (dto.getExpireYear() == null) {
|
|
|
+ throw new IllegalArgumentException(EXPIRE_YEAR_REQUIRED_MESSAGE);
|
|
|
+ }
|
|
|
+ entity.setExpireYear(dto.getExpireYear());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException(INVALID_EXPIRE_POLICY_TYPE_MESSAGE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveOrUpdateExpirePolicy(PointActivityExpirePolicy entity, Integer activityType) {
|
|
|
+ try {
|
|
|
+ boolean isSuccess = pointActivityExpirePolicyService.updateById(entity);
|
|
|
+ if (!isSuccess) {
|
|
|
+ log.error("保存或更新积分活动过期策略失败, activityType: {}", activityType);
|
|
|
+ throw new BaseException(UPDATE_FAILED_MESSAGE);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("保存或更新积分活动过期策略时发生异常, activityType: {}", activityType, e);
|
|
|
+ throw new BaseException(UPDATE_FAILED_MESSAGE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -242,6 +346,13 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void updateActivity(PointActivity entity) {
|
|
|
+ int affectedRows = pointActivityMapper.updatePointActivity(entity);
|
|
|
+ if (affectedRows <= 0) {
|
|
|
+ throw new BaseException("更新积分活动失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void saveSignTaskDetails(PointActivityDTO dto, Long activityId) {
|
|
|
PointSignTaskDTO signTaskDTO = dto.getSignTaskDTO();
|
|
|
if (ObjectUtil.isNull(signTaskDTO)) {
|
|
|
@@ -438,32 +549,35 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
pointActivityTaskService.batchInsertPointActivityTask(activityTasks);
|
|
|
}
|
|
|
|
|
|
- private void batchUpdateExpirePolicy(List<PointActivity> activityList, PointActivityValidityDTO dto) {
|
|
|
- Integer expirePolicy = dto.getExpirePolicy();
|
|
|
-
|
|
|
- // 使用Stream处理活动列表
|
|
|
- List<PointActivity> updateList = activityList.stream()
|
|
|
- .peek(activity -> {
|
|
|
- activity.setExpirePolicy(expirePolicy);
|
|
|
-
|
|
|
- // 根据策略设置不同的过期时间字段
|
|
|
- if (PointActivityExpirePolicyEnum.TRANSACTION_EXPIRE.getCode().equals(expirePolicy)) {
|
|
|
- activity.setExpireDays(dto.getExpireDays());
|
|
|
- activity.setExpireYear(null);
|
|
|
- } else if (PointActivityExpirePolicyEnum.YEARLY_EXPIRE.getCode().equals(expirePolicy)) {
|
|
|
- activity.setExpireYear(dto.getExpireYear());
|
|
|
- activity.setExpireDays(null);
|
|
|
- } else {
|
|
|
- activity.setExpireDays(null);
|
|
|
- activity.setExpireYear(null);
|
|
|
- }
|
|
|
- })
|
|
|
- .collect(Collectors.toList());
|
|
|
+ private void batchUpdateExpirePolicy(List<PointActivity> activityList, Long expirePolicyId) {
|
|
|
+ // 参数校验
|
|
|
+ if (CollectionUtil.isEmpty(activityList)) {
|
|
|
+ log.debug("活动列表为空,无需更新过期策略");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (expirePolicyId == null) {
|
|
|
+ throw new IllegalArgumentException("过期策略ID不能为空");
|
|
|
+ }
|
|
|
|
|
|
- // 批量更新数据库
|
|
|
- if (CollectionUtil.isNotEmpty(updateList)) {
|
|
|
- super.updateBatchById(updateList);
|
|
|
+ try {
|
|
|
+ // 使用Stream处理活动列表,设置过期策略ID
|
|
|
+ List<PointActivity> activitiesToUpdate = activityList.stream()
|
|
|
+ .map(activity -> {
|
|
|
+ activity.setExpirePolicyId(expirePolicyId);
|
|
|
+ return activity;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 批量更新数据库
|
|
|
+ super.updateBatchById(activitiesToUpdate, BATCH_SIZE);
|
|
|
+
|
|
|
+ log.info("成功更新 {} 个活动的过期策略为 {}", activitiesToUpdate.size(), expirePolicyId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量更新活动过期策略失败, expirePolicyId: {}", expirePolicyId, e);
|
|
|
+ throw new BaseException("批量更新活动过期策略失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|