package com.cdzy.activity.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.UUID; import com.cdzy.activity.component.ImageConfig; import com.cdzy.activity.enums.ActivityStatus; import com.cdzy.activity.mapper.ActivityMapper; import com.cdzy.activity.mapper.ActivityUserMapper; import com.cdzy.activity.model.Activity; import com.cdzy.activity.model.ActivityUser; import com.cdzy.activity.model.vo.ActivityVo; import com.cdzy.activity.service.ActivityService; import com.cdzy.activity.uitls.FileUtils; import com.cdzy.activity.uitls.ImageToBase64Converter; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; /** * 活动状态检测变动。 * * @author attiya * @since 2025-09-17 */ @Service public class ActivityServiceImpl extends ServiceImpl implements ActivityService { @Resource private ActivityMapper activityMapper; @Resource private ActivityUserMapper activityUserMapper; @Resource private ImageConfig imageConfig; @Override @Transactional(rollbackFor = Exception.class) public void saveActivity(ActivityVo activity) throws IOException { MultipartFile activityCover = activity.getActivityCover(); String convert = null; if (activityCover != null) { String uuid = UUID.randomUUID().toString(); String fileExtension = FileUtils.getFileExtension(activityCover); String destPath = imageConfig.getActivityUrl() + "/" + uuid + fileExtension; FileUtils.copyMultipartFile(activityCover, destPath, true); convert = uuid + fileExtension; } Activity entity = Activity.builder() .activityName(activity.getActivityName()) .activityCover(convert) .activitySponsor(activity.getActivitySponsor()) .activityDescription(activity.getActivityDescription()) .activityLocation(activity.getActivityLocation()) .registrationStartTime(activity.getRegistrationStartTime()) .registrationEndTime(activity.getRegistrationEndTime()) .startTime(activity.getStartTime()) .endTime(activity.getEndTime()) .maxNum(activity.getMaxNum()) .limitPeople(activity.getLimitPeople()) .limitRegister(activity.getLimitRegister()) .status(ActivityStatus.UN_START_REGISTERING) .activityType(activity.getActivityType()) .build(); activityMapper.insert(entity); List userIds = activity.getUserIds(); if (userIds != null && !userIds.isEmpty()) { List list = new ArrayList<>(); for (Long userId : userIds) { list.add(new ActivityUser(entity.getActivityId(), userId)); } activityUserMapper.insertBatch(list); } } @Override @Transactional(rollbackFor = Exception.class) public void updateActivity(ActivityVo activity) throws IOException { Activity entity = activityMapper.selectOneById(activity.getActivityId()); if (entity != null) { entity.setActivityName(activity.getActivityName()); MultipartFile activityCover = activity.getActivityCover(); String convert = entity.getActivityCover(); if (activityCover != null) { String uuid = UUID.randomUUID().toString(); String fileExtension = FileUtils.getFileExtension(activityCover); String destPath = imageConfig.getActivityUrl() + "/" + uuid + fileExtension; FileUtils.copyMultipartFile(activityCover, destPath, true); FileUtil.del(imageConfig.getActivityUrl() + "/" + convert); convert = uuid + fileExtension; } entity.setActivityCover(convert); entity.setActivitySponsor(activity.getActivitySponsor()); entity.setActivityDescription(activity.getActivityDescription()); entity.setActivityLocation(activity.getActivityLocation()); entity.setRegistrationStartTime(activity.getRegistrationStartTime()); entity.setRegistrationEndTime(activity.getRegistrationEndTime()); entity.setStartTime(activity.getStartTime()); entity.setEndTime(activity.getEndTime()); entity.setMaxNum(activity.getMaxNum()); entity.setLimitPeople(activity.getLimitPeople()); entity.setLimitRegister(activity.getLimitRegister()); entity.setActivityType(activity.getActivityType()); activityMapper.update(entity); QueryWrapper activityUserQueryWrapper = new QueryWrapper() .eq(ActivityUser::getActivityId, activity.getActivityId()); activityUserMapper.deleteByQuery(activityUserQueryWrapper); List userIds = activity.getUserIds(); if (userIds != null && !userIds.isEmpty()) { List list = new ArrayList<>(); for (Long userId : userIds) { list.add(new ActivityUser(entity.getActivityId(), userId)); } activityUserMapper.insertBatch(list); } } else { throw new RuntimeException("该活动不存在"); } } @Override public void checkStatus() { LocalDateTime now = LocalDateTime.now(); QueryWrapper queryWrapper = QueryWrapper.create() .where(ACTIVITY.STATUS.ne(ActivityStatus.FINISHED)); List activities = activityMapper.selectListByQuery(queryWrapper); if (activities != null && !activities.isEmpty()) { for (Activity activity : activities) { switch (activity.getStatus()) { case ActivityStatus.UN_START_REGISTERING: if (now.isAfter(activity.getRegistrationStartTime())) { activity.setStatus(ActivityStatus.REGISTERING); } break; case ActivityStatus.REGISTERING: if (now.isAfter(activity.getRegistrationEndTime())) { activity.setStatus(ActivityStatus.STOP_REGISTER); } break; case ActivityStatus.STOP_REGISTER: if (now.isAfter(activity.getStartTime())) { activity.setStatus(ActivityStatus.STARTED); } break; case ActivityStatus.STARTED: if (now.isAfter(activity.getStartTime())) { activity.setStatus(ActivityStatus.FINISHED); } break; } } updateBatch(activities); } } }