|
@@ -0,0 +1,296 @@
|
|
|
|
|
+package com.sqx.modules.activity.service.impl;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import com.sqx.common.constant.MyConstant;
|
|
|
|
|
+import com.sqx.common.exception.SqxException;
|
|
|
|
|
+import com.sqx.common.utils.PageUtils;
|
|
|
|
|
+import com.sqx.modules.activity.dao.ActivityDao;
|
|
|
|
|
+import com.sqx.modules.activity.dto.ActivityDTO;
|
|
|
|
|
+import com.sqx.modules.activity.dto.ActivityOfFullReductionDTO;
|
|
|
|
|
+import com.sqx.modules.activity.dto.ActivityOfTimeIntervalDTO;
|
|
|
|
|
+import com.sqx.modules.activity.dto.ActivityQueryDTO;
|
|
|
|
|
+import com.sqx.modules.activity.dto.ActivityOfGlobalDiscountDTO;
|
|
|
|
|
+import com.sqx.modules.activity.entity.Activity;
|
|
|
|
|
+import com.sqx.modules.activity.entity.ActivityShop;
|
|
|
|
|
+import com.sqx.modules.activity.enums.ActivityTypeEnum;
|
|
|
|
|
+import com.sqx.modules.activity.enums.FullActivityTypeEnum;
|
|
|
|
|
+import com.sqx.modules.activity.service.ActivityService;
|
|
|
|
|
+import com.sqx.modules.activity.service.ActivityShopService;
|
|
|
|
|
+import com.sqx.modules.activity.vo.ActivityVO;
|
|
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 活动
|
|
|
|
|
+ * @author : codingliang
|
|
|
|
|
+ * @date : 2024-6-17
|
|
|
|
|
+ */
|
|
|
|
|
+@Service
|
|
|
|
|
+@RequiredArgsConstructor
|
|
|
|
|
+public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> implements ActivityService {
|
|
|
|
|
+
|
|
|
|
|
+ private final ActivityShopService activityShopService;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 时间格式 HH:mm
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final DateTimeFormatter TIME_DTF = DateTimeFormatter.ofPattern("HH:mm");
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ActivityVO getActivityById(Long id) {
|
|
|
|
|
+ Activity activity = this.findById(id);
|
|
|
|
|
+
|
|
|
|
|
+ return convertEntityToVO(activity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PageUtils pageActivity(ActivityQueryDTO queryDTO) {
|
|
|
|
|
+ Page<Activity> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<Activity> queryWrapper = Wrappers.lambdaQuery();
|
|
|
|
|
+ queryWrapper.like(StrUtil.isNotBlank(queryDTO.getTitle()), Activity::getTitle, queryDTO.getTitle());
|
|
|
|
|
+ queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getEnableFlag()), Activity::getEnableFlag, queryDTO.getEnableFlag());
|
|
|
|
|
+ queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getAllowShop()), Activity::getAllowShop, queryDTO.getAllowShop());
|
|
|
|
|
+ queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getType()), Activity::getType, queryDTO.getType());
|
|
|
|
|
+ queryWrapper.eq(ObjectUtil.isNotNull(queryDTO.getStartTime()), Activity::getStartTime, queryDTO.getStartTime());
|
|
|
|
|
+ queryWrapper.eq(ObjectUtil.isNotNull(queryDTO.getEndTime()), Activity::getEndTime, queryDTO.getEndTime());
|
|
|
|
|
+ queryWrapper.orderByDesc(Activity::getCreateTime);
|
|
|
|
|
+
|
|
|
|
|
+ IPage<Activity> page = this.page(pages, queryWrapper);
|
|
|
|
|
+ PageUtils pageUtils = new PageUtils(page);
|
|
|
|
|
+
|
|
|
|
|
+ List<ActivityVO> vos = pageUtils.getList().stream().map(e -> this.convertEntityToVO((Activity) e)).collect(Collectors.toList());
|
|
|
|
|
+ pageUtils.setList(vos);
|
|
|
|
|
+ return pageUtils;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void addActivity(ActivityDTO activityDTO) {
|
|
|
|
|
+ checkParam(activityDTO);
|
|
|
|
|
+
|
|
|
|
|
+ Activity activity = new Activity();
|
|
|
|
|
+ BeanUtils.copyProperties(activityDTO, activity);
|
|
|
|
|
+
|
|
|
|
|
+ String config = getActivityConfig(activityDTO);
|
|
|
|
|
+ activity.setConfig(config);
|
|
|
|
|
+ activity.setDelFlag(MyConstant.NO);
|
|
|
|
|
+
|
|
|
|
|
+ Date date = new Date();
|
|
|
|
|
+ activity.setCreateTime(date);
|
|
|
|
|
+ activity.setUpdateTime(date);
|
|
|
|
|
+
|
|
|
|
|
+ this.save(activity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void updateActivity(ActivityDTO activityDTO) {
|
|
|
|
|
+ Activity oldActivity = findById(activityDTO.getId());
|
|
|
|
|
+
|
|
|
|
|
+ if (!StrUtil.equals(oldActivity.getType(), activityDTO.getType())) {
|
|
|
|
|
+ throw new SqxException("活动类型不能修改");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ checkParam(activityDTO);
|
|
|
|
|
+ Activity newActivity = new Activity();
|
|
|
|
|
+ BeanUtils.copyProperties(activityDTO, newActivity);
|
|
|
|
|
+
|
|
|
|
|
+ newActivity.setId(activityDTO.getId());
|
|
|
|
|
+ newActivity.setConfig(getActivityConfig(activityDTO));
|
|
|
|
|
+ newActivity.setDelFlag(MyConstant.NO);
|
|
|
|
|
+ newActivity.setCreateTime(oldActivity.getCreateTime());
|
|
|
|
|
+ newActivity.setUpdateTime(new Date());
|
|
|
|
|
+
|
|
|
|
|
+ this.updateById(newActivity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void updateActivityStatus(Long id, String flag) {
|
|
|
|
|
+ findById(id);
|
|
|
|
|
+
|
|
|
|
|
+ Activity newActivity = new Activity();
|
|
|
|
|
+ newActivity.setId(id);
|
|
|
|
|
+ newActivity.setEnableFlag(flag);
|
|
|
|
|
+
|
|
|
|
|
+ this.updateById(newActivity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void updateActivityJoinMethod(Long id, String flag) {
|
|
|
|
|
+ findById(id);
|
|
|
|
|
+
|
|
|
|
|
+ Activity newActivity = new Activity();
|
|
|
|
|
+ newActivity.setId(id);
|
|
|
|
|
+ newActivity.setAllowShop(flag);
|
|
|
|
|
+
|
|
|
|
|
+ this.updateById(newActivity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deleteActivity(List<Long> activityIds) {
|
|
|
|
|
+ // 判断待删除活动是否还有商家未退出
|
|
|
|
|
+ List<ActivityShop> activityShops = activityShopService.getByActivityIds(activityIds);
|
|
|
|
|
+
|
|
|
|
|
+ List<Long> refuseDeleteIds = activityIds.stream().filter(e -> activityShops.contains(e)).collect(Collectors.toList());
|
|
|
|
|
+ if (refuseDeleteIds.size() > 0) {
|
|
|
|
|
+ String errorInfo = refuseDeleteIds.stream().map(e -> String.valueOf(activityIds.indexOf(e))).collect(Collectors.joining(","));
|
|
|
|
|
+
|
|
|
|
|
+ throw new SqxException("索引编号为【" + errorInfo + "】的活动下仍有商家,请退出后重试");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ removeByIds(activityIds);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 活动实体类转成vo类
|
|
|
|
|
+ * @param activity 活动实体
|
|
|
|
|
+ * @return vo
|
|
|
|
|
+ */
|
|
|
|
|
+ private ActivityVO convertEntityToVO(Activity activity) {
|
|
|
|
|
+ ActivityVO vo = new ActivityVO();
|
|
|
|
|
+ BeanUtils.copyProperties(activity, vo);
|
|
|
|
|
+
|
|
|
|
|
+ String type = activity.getType();
|
|
|
|
|
+ String config = activity.getConfig();
|
|
|
|
|
+
|
|
|
|
|
+ if (ActivityTypeEnum.TIME.getTypeCode().equals(type)) {
|
|
|
|
|
+ vo.setTimeIntervalInfos(JSONUtil.toList(JSONUtil.parseArray(config), ActivityOfTimeIntervalDTO.class));
|
|
|
|
|
+ } else if (ActivityTypeEnum.FULL.getTypeCode().equals(type)) {
|
|
|
|
|
+ vo.setFullReductionInfo(JSONUtil.toBean(config, ActivityOfFullReductionDTO.class));
|
|
|
|
|
+ } else if (ActivityTypeEnum.GLOBAL.getTypeCode().equals(type)) {
|
|
|
|
|
+ vo.setGlobalDiscountsInfo(JSONUtil.toBean(config, ActivityOfGlobalDiscountDTO.class));
|
|
|
|
|
+ }
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 根据id获取活动信息
|
|
|
|
|
+ * 如id对应记录不存在,则抛出数据不存在异常
|
|
|
|
|
+ * @param id 活动id
|
|
|
|
|
+ * @return activity
|
|
|
|
|
+ */
|
|
|
|
|
+ private Activity findById(Long id) {
|
|
|
|
|
+ Activity activity = this.getById(id);
|
|
|
|
|
+
|
|
|
|
|
+ if (ObjectUtil.isNull(activity)) {
|
|
|
|
|
+ throw new SqxException("无效的活动id");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return activity;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取活动配置
|
|
|
|
|
+ * @param activityDTO
|
|
|
|
|
+ * @return 活动config json串
|
|
|
|
|
+ */
|
|
|
|
|
+ private String getActivityConfig(ActivityDTO activityDTO) {
|
|
|
|
|
+ String config = null;
|
|
|
|
|
+ String type = activityDTO.getType();
|
|
|
|
|
+ if (ActivityTypeEnum.TIME.getTypeCode().equals(type)) {
|
|
|
|
|
+ config = JSONUtil.toJsonStr(activityDTO.getTimeIntervalInfos());
|
|
|
|
|
+ } else if (ActivityTypeEnum.FULL.getTypeCode().equals(type)) {
|
|
|
|
|
+ config = JSONUtil.toJsonStr(activityDTO.getFullReductionInfo());
|
|
|
|
|
+ } else if (ActivityTypeEnum.GLOBAL.getTypeCode().equals(type)) {
|
|
|
|
|
+ config = JSONUtil.toJsonStr(activityDTO.getGlobalDiscountsInfo());
|
|
|
|
|
+ }
|
|
|
|
|
+ return config;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验活动参数
|
|
|
|
|
+ * @param activityDTO activityDTO
|
|
|
|
|
+ */
|
|
|
|
|
+ private void checkParam(ActivityDTO activityDTO) {
|
|
|
|
|
+ checkActivityDate(activityDTO.getStartTime(), activityDTO.getEndTime());
|
|
|
|
|
+
|
|
|
|
|
+ String type = activityDTO.getType();
|
|
|
|
|
+ if (ActivityTypeEnum.TIME.getTypeCode().equals(type)) {
|
|
|
|
|
+ checkTimeActivityParam(activityDTO.getTimeIntervalInfos());
|
|
|
|
|
+ } else if (ActivityTypeEnum.FULL.getTypeCode().equals(type)) {
|
|
|
|
|
+ checkFullActivityParam(activityDTO.getFullReductionInfo());
|
|
|
|
|
+ } else if (ActivityTypeEnum.GLOBAL.getTypeCode().equals(type)) {
|
|
|
|
|
+ checkGlobalActivityParam(activityDTO.getGlobalDiscountsInfo());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验活动时间
|
|
|
|
|
+ * @param startTime 开始时间
|
|
|
|
|
+ * @param endTime 结束时间
|
|
|
|
|
+ */
|
|
|
|
|
+ private void checkActivityDate(Date startTime, Date endTime) {
|
|
|
|
|
+ // 结束时间必须在开始时间之后
|
|
|
|
|
+ if (endTime.compareTo(startTime) <= 0) {
|
|
|
|
|
+ throw new SqxException("活动结束时间必须在开始时间之后");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验全局优惠活动参数信息
|
|
|
|
|
+ * @param globalDiscountsInfo 全局优惠信息
|
|
|
|
|
+ */
|
|
|
|
|
+ private void checkGlobalActivityParam(ActivityOfGlobalDiscountDTO globalDiscountsInfo) {
|
|
|
|
|
+ if (ObjectUtil.isNull(globalDiscountsInfo)) {
|
|
|
|
|
+ throw new SqxException("全场优惠信息不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (globalDiscountsInfo.getDiscountRate().doubleValue() >= 10 || globalDiscountsInfo.getDiscountRate().doubleValue() <= 0) {
|
|
|
|
|
+ throw new SqxException("全场优惠折扣只能为(0, 10)");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验满减优惠活动参数信息
|
|
|
|
|
+ * @param fullReductionInfo 满减优惠信息
|
|
|
|
|
+ */
|
|
|
|
|
+ private void checkFullActivityParam(ActivityOfFullReductionDTO fullReductionInfo) {
|
|
|
|
|
+ if (ObjectUtil.isNull(fullReductionInfo)) {
|
|
|
|
|
+ throw new SqxException("满减优惠信息不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String type = fullReductionInfo.getType();
|
|
|
|
|
+ if (FullActivityTypeEnum.DISCOUNT.getTypeCode().equals(type)) {
|
|
|
|
|
+ Double discountContent = fullReductionInfo.getDiscountContent();
|
|
|
|
|
+ if (discountContent.doubleValue() >= 10 || discountContent.doubleValue() <= 0) {
|
|
|
|
|
+ throw new SqxException("满减优惠折扣只能为(0, 10)");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验时段优惠活动参数信息
|
|
|
|
|
+ * @param timeIntervalInfos 时段优惠信息
|
|
|
|
|
+ */
|
|
|
|
|
+ private void checkTimeActivityParam(List<ActivityOfTimeIntervalDTO> timeIntervalInfos) {
|
|
|
|
|
+ if (CollUtil.isEmpty(timeIntervalInfos)) {
|
|
|
|
|
+ throw new SqxException("时段优惠信息不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (ActivityOfTimeIntervalDTO timeIntervalInfo : timeIntervalInfos) {
|
|
|
|
|
+ if (timeIntervalInfo.getDiscountContent().doubleValue() == 0 || timeIntervalInfo.getDiscountContent().doubleValue() == 10) {
|
|
|
|
|
+ throw new SqxException("时段优惠信息折扣内容取值范围(0-10)");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ TIME_DTF.parse(timeIntervalInfo.getStartTime());
|
|
|
|
|
+ TIME_DTF.parse(timeIntervalInfo.getEndTime());
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ throw new SqxException("时间格式有误,startTime和endTime格式应为HH:mm");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|