diff --git a/src/main/java/com/cdzy/activity/component/ActivityManager.java b/src/main/java/com/cdzy/activity/component/ActivityManager.java deleted file mode 100644 index 049d97d..0000000 --- a/src/main/java/com/cdzy/activity/component/ActivityManager.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.cdzy.activity.component; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import com.cdzy.activity.model.Activity; - -/** - * 活动管理器 - */ -class ActivityManager { - private final ScheduledExecutorService scheduler; - private final List activities; - - public ActivityManager() { - this.scheduler = Executors.newScheduledThreadPool(1); - this.activities = new ArrayList<>(); - } - - // 添加活动到监控列表 - public void addActivity(Activity activity) { - activities.add(activity); - } - - // 从监控列表移除活动 - public void removeActivity(Long activityId) { - activities.removeIf(activity -> activity.getActivityId().equals(activityId)); - } - - // 开始监控所有活动状态 - public void startMonitoring() { - // 每分钟检查一次所有活动状态 - scheduler.scheduleAtFixedRate( - this::checkAllActivities, - 0, 1, TimeUnit.MINUTES - ); - } - - // 检查所有活动状态 - private void checkAllActivities() { - for (Activity activity : activities) { - activity.checkAndUpdateStatus(); - } - } - - // 停止监控 - public void stopMonitoring() { - scheduler.shutdown(); - try { - if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) { - scheduler.shutdownNow(); - } - } catch (InterruptedException e) { - scheduler.shutdownNow(); - Thread.currentThread().interrupt(); - } - System.out.println("活动监控已停止"); - } - - // 获取所有活动 - public List getActivities() { - return new ArrayList<>(activities); - } -} \ No newline at end of file diff --git a/src/main/java/com/cdzy/activity/component/ActivityStatusScheduler.java b/src/main/java/com/cdzy/activity/component/ActivityStatusScheduler.java new file mode 100644 index 0000000..cddc2ab --- /dev/null +++ b/src/main/java/com/cdzy/activity/component/ActivityStatusScheduler.java @@ -0,0 +1,24 @@ +package com.cdzy.activity.component; + +import com.cdzy.activity.service.ActivityService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +@Slf4j +@Configuration +@EnableScheduling +public class ActivityStatusScheduler { + + @Resource + private ActivityService activityService; + + @Scheduled(cron = "0 * * * * ?") // 每分钟触发 + public void checkActivityStatus() { + log.info("开始检查状态"); + activityService.checkStatus(); + log.info("结束检查状态"); + } +} diff --git a/src/main/java/com/cdzy/activity/config/MyBatisFlexConfiguration.java b/src/main/java/com/cdzy/activity/config/MyBatisFlexConfiguration.java index 4492d6c..712afa3 100644 --- a/src/main/java/com/cdzy/activity/config/MyBatisFlexConfiguration.java +++ b/src/main/java/com/cdzy/activity/config/MyBatisFlexConfiguration.java @@ -43,7 +43,7 @@ public class MyBatisFlexConfiguration { public FlexGlobalConfig flexGlobalConfig() { FlexGlobalConfig globalConfig = FlexGlobalConfig.getDefaultConfig(); //方言配置 - globalConfig.setDbType(DbType.POSTGRE_SQL); // 关键配置 + globalConfig.setDbType(DbType.MYSQL); // 关键配置 //设置数据库正常时的值 globalConfig.setNormalValueOfLogicDelete(Boolean.FALSE); diff --git a/src/main/java/com/cdzy/activity/enums/ActivityStatus.java b/src/main/java/com/cdzy/activity/enums/ActivityStatus.java index bc134c0..007cdf2 100644 --- a/src/main/java/com/cdzy/activity/enums/ActivityStatus.java +++ b/src/main/java/com/cdzy/activity/enums/ActivityStatus.java @@ -2,9 +2,9 @@ package com.cdzy.activity.enums; public interface ActivityStatus { int UN_START_REGISTERING = 1; - int REGISTERING = 1; - int STOP_REGISTER = 2; - int STARTED = 3; + int REGISTERING = 2; + int STOP_REGISTER = 3; + int STARTED = 4; int FINISHED = 5; } \ No newline at end of file diff --git a/src/main/java/com/cdzy/activity/model/Activity.java b/src/main/java/com/cdzy/activity/model/Activity.java index 9e70cde..43c7f52 100644 --- a/src/main/java/com/cdzy/activity/model/Activity.java +++ b/src/main/java/com/cdzy/activity/model/Activity.java @@ -80,19 +80,11 @@ public class Activity implements Serializable { private Integer status; + /** + * 是否限制报名人群(0:不限制,1:限制 + */ + private Integer limitRegister; - // 检查并更新状态 - public void checkAndUpdateStatus() { - LocalDateTime now = LocalDateTime.now(); - - if (now.isAfter(endTime) && status != ActivityStatus.FINISHED) { - status = ActivityStatus.FINISHED; - Activity.log.info("[{}] 活动 '{}' 已结束", now, activityName); - } else if (now.isAfter(registrationEndTime) && status == ActivityStatus.REGISTERING) { - status = ActivityStatus.STOP_REGISTER; - Activity.log.info("[{}] 活动 '{}' 停止报名", now, activityName); - } - } @Override public String toString() { diff --git a/src/main/java/com/cdzy/activity/model/vo/ActivityVo.java b/src/main/java/com/cdzy/activity/model/vo/ActivityVo.java index 0ce3982..9be2527 100644 --- a/src/main/java/com/cdzy/activity/model/vo/ActivityVo.java +++ b/src/main/java/com/cdzy/activity/model/vo/ActivityVo.java @@ -73,4 +73,10 @@ public class ActivityVo implements Serializable { */ private Integer limitPeople; + + /** + * 是否限制报名人群(0:不限制,1:限制 + */ + private Integer limitRegister; + } \ No newline at end of file diff --git a/src/main/java/com/cdzy/activity/service/ActivityService.java b/src/main/java/com/cdzy/activity/service/ActivityService.java index 770dd88..a38767d 100644 --- a/src/main/java/com/cdzy/activity/service/ActivityService.java +++ b/src/main/java/com/cdzy/activity/service/ActivityService.java @@ -15,4 +15,6 @@ public interface ActivityService extends IService { void saveActivity(ActivityVo activity); void updateActivity(ActivityVo activity); + + void checkStatus(); } diff --git a/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java b/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java index f17e0d5..37417e2 100644 --- a/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java +++ b/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java @@ -5,12 +5,18 @@ import com.cdzy.activity.mapper.ActivityMapper; import com.cdzy.activity.model.Activity; import com.cdzy.activity.model.vo.ActivityVo; import com.cdzy.activity.service.ActivityService; +import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; + +import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; + /** - * 服务层实现。 + * 活动状态检测变动。 * * @author attiya * @since 2025-09-17 @@ -60,4 +66,39 @@ public class ActivityServiceImpl extends ServiceImpl 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); + } + } } diff --git a/target/classes/com/cdzy/activity/component/ActivityManager.class b/target/classes/com/cdzy/activity/component/ActivityManager.class deleted file mode 100644 index ebd822b..0000000 Binary files a/target/classes/com/cdzy/activity/component/ActivityManager.class and /dev/null differ diff --git a/target/classes/com/cdzy/activity/config/MyBatisFlexConfiguration.class b/target/classes/com/cdzy/activity/config/MyBatisFlexConfiguration.class index 693c0a8..48098cf 100644 Binary files a/target/classes/com/cdzy/activity/config/MyBatisFlexConfiguration.class and b/target/classes/com/cdzy/activity/config/MyBatisFlexConfiguration.class differ diff --git a/target/classes/com/cdzy/activity/enums/ActivityStatus.class b/target/classes/com/cdzy/activity/enums/ActivityStatus.class index b3ed6c2..af4a4dd 100644 Binary files a/target/classes/com/cdzy/activity/enums/ActivityStatus.class and b/target/classes/com/cdzy/activity/enums/ActivityStatus.class differ diff --git a/target/classes/com/cdzy/activity/model/Activity$ActivityBuilder.class b/target/classes/com/cdzy/activity/model/Activity$ActivityBuilder.class index f8dd280..faedb55 100644 Binary files a/target/classes/com/cdzy/activity/model/Activity$ActivityBuilder.class and b/target/classes/com/cdzy/activity/model/Activity$ActivityBuilder.class differ diff --git a/target/classes/com/cdzy/activity/model/Activity.class b/target/classes/com/cdzy/activity/model/Activity.class index 43fae1a..7e41bf1 100644 Binary files a/target/classes/com/cdzy/activity/model/Activity.class and b/target/classes/com/cdzy/activity/model/Activity.class differ diff --git a/target/classes/com/cdzy/activity/model/table/ActivityTableDef.class b/target/classes/com/cdzy/activity/model/table/ActivityTableDef.class index 2a4edb7..ef83527 100644 Binary files a/target/classes/com/cdzy/activity/model/table/ActivityTableDef.class and b/target/classes/com/cdzy/activity/model/table/ActivityTableDef.class differ diff --git a/target/classes/com/cdzy/activity/model/vo/ActivityVo$ActivityVoBuilder.class b/target/classes/com/cdzy/activity/model/vo/ActivityVo$ActivityVoBuilder.class index 9b40392..c68493a 100644 Binary files a/target/classes/com/cdzy/activity/model/vo/ActivityVo$ActivityVoBuilder.class and b/target/classes/com/cdzy/activity/model/vo/ActivityVo$ActivityVoBuilder.class differ diff --git a/target/classes/com/cdzy/activity/model/vo/ActivityVo.class b/target/classes/com/cdzy/activity/model/vo/ActivityVo.class index c09666b..fe41a72 100644 Binary files a/target/classes/com/cdzy/activity/model/vo/ActivityVo.class and b/target/classes/com/cdzy/activity/model/vo/ActivityVo.class differ diff --git a/target/classes/com/cdzy/activity/service/ActivityService.class b/target/classes/com/cdzy/activity/service/ActivityService.class index 3f657fe..9c858b2 100644 Binary files a/target/classes/com/cdzy/activity/service/ActivityService.class and b/target/classes/com/cdzy/activity/service/ActivityService.class differ diff --git a/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class b/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class index 2a5c21c..472c2c8 100644 Binary files a/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class and b/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class differ diff --git a/target/classes/com/cdzy/activity/uitls/ImageToBase64Converter.class b/target/classes/com/cdzy/activity/uitls/ImageToBase64Converter.class index 22e5909..aac8a5a 100644 Binary files a/target/classes/com/cdzy/activity/uitls/ImageToBase64Converter.class and b/target/classes/com/cdzy/activity/uitls/ImageToBase64Converter.class differ diff --git a/target/classes/com/cdzy/activity/uitls/VerifyUtil.class b/target/classes/com/cdzy/activity/uitls/VerifyUtil.class index be2b5c3..caaf600 100644 Binary files a/target/classes/com/cdzy/activity/uitls/VerifyUtil.class and b/target/classes/com/cdzy/activity/uitls/VerifyUtil.class differ diff --git a/target/generated-sources/annotations/com/cdzy/activity/model/table/ActivityTableDef.java b/target/generated-sources/annotations/com/cdzy/activity/model/table/ActivityTableDef.java index 190116d..901b7df 100644 --- a/target/generated-sources/annotations/com/cdzy/activity/model/table/ActivityTableDef.java +++ b/target/generated-sources/annotations/com/cdzy/activity/model/table/ActivityTableDef.java @@ -9,17 +9,18 @@ public class ActivityTableDef extends TableDef{ public final QueryColumn ACTIVITY_LOCATION =new QueryColumn(this,"activityLocation"); public final QueryColumn ACTIVITY_NAME =new QueryColumn(this,"activityName"); - public final QueryColumn STATUS =new QueryColumn(this,"status"); public final QueryColumn START_TIME =new QueryColumn(this,"startTime"); + public final QueryColumn MAX_NUM =new QueryColumn(this,"maxNum"); + public final QueryColumn LIMIT_PEOPLE =new QueryColumn(this,"limitPeople"); + public final QueryColumn ACTIVITY_ID =new QueryColumn(this,"activityId"); + public final QueryColumn ACTIVITY_COVER =new QueryColumn(this,"activityCover"); + public final QueryColumn STATUS =new QueryColumn(this,"status"); public final QueryColumn REGISTRATION_START_TIME =new QueryColumn(this,"registrationStartTime"); public final QueryColumn END_TIME =new QueryColumn(this,"endTime"); - public final QueryColumn MAX_NUM =new QueryColumn(this,"maxNum"); public final QueryColumn ACTIVITY_DESCRIPTION =new QueryColumn(this,"activityDescription"); - public final QueryColumn LIMIT_PEOPLE =new QueryColumn(this,"limitPeople"); public final QueryColumn REGISTRATION_END_TIME =new QueryColumn(this,"registrationEndTime"); - public final QueryColumn ACTIVITY_ID =new QueryColumn(this,"activityId"); + public final QueryColumn LIMIT_REGISTER =new QueryColumn(this,"limitRegister"); public final QueryColumn ACTIVITY_SPONSOR =new QueryColumn(this,"activitySponsor"); - public final QueryColumn ACTIVITY_COVER =new QueryColumn(this,"activityCover"); /** * 所有字段。 */ @@ -28,7 +29,7 @@ public class ActivityTableDef extends TableDef{ /** * 默认字段,不包含逻辑删除或者 large 等字段。 */ - public final QueryColumn[]DEFAULT_COLUMNS=new QueryColumn[]{ ACTIVITY_LOCATION , ACTIVITY_NAME , STATUS , START_TIME , REGISTRATION_START_TIME , END_TIME , MAX_NUM , ACTIVITY_DESCRIPTION , LIMIT_PEOPLE , REGISTRATION_END_TIME , ACTIVITY_ID , ACTIVITY_SPONSOR , ACTIVITY_COVER }; + public final QueryColumn[]DEFAULT_COLUMNS=new QueryColumn[]{ ACTIVITY_LOCATION , ACTIVITY_NAME , START_TIME , MAX_NUM , LIMIT_PEOPLE , ACTIVITY_ID , ACTIVITY_COVER , STATUS , REGISTRATION_START_TIME , END_TIME , ACTIVITY_DESCRIPTION , REGISTRATION_END_TIME , LIMIT_REGISTER , ACTIVITY_SPONSOR }; public ActivityTableDef(){super("","activity");} private ActivityTableDef(String schema, String name, String alisa) { super(schema, name, alisa);