2025-09-22 16:22:44 +08:00

170 lines
7.3 KiB
Java

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<ActivityMapper, Activity> 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<Long> userIds = activity.getUserIds();
if (userIds != null && !userIds.isEmpty()) {
List<ActivityUser> 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<Long> userIds = activity.getUserIds();
if (userIds != null && !userIds.isEmpty()) {
List<ActivityUser> 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<Activity> 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);
}
}
}