活动基础功能

This commit is contained in:
attiya 2025-09-17 17:16:35 +08:00
parent 0cb62d6231
commit b8c8ef8441
21 changed files with 89 additions and 89 deletions

View File

@ -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<Activity> 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<Activity> getActivities() {
return new ArrayList<>(activities);
}
}

View File

@ -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("结束检查状态");
}
}

View File

@ -43,7 +43,7 @@ public class MyBatisFlexConfiguration {
public FlexGlobalConfig flexGlobalConfig() { public FlexGlobalConfig flexGlobalConfig() {
FlexGlobalConfig globalConfig = FlexGlobalConfig.getDefaultConfig(); FlexGlobalConfig globalConfig = FlexGlobalConfig.getDefaultConfig();
//方言配置 //方言配置
globalConfig.setDbType(DbType.POSTGRE_SQL); // 关键配置 globalConfig.setDbType(DbType.MYSQL); // 关键配置
//设置数据库正常时的值 //设置数据库正常时的值
globalConfig.setNormalValueOfLogicDelete(Boolean.FALSE); globalConfig.setNormalValueOfLogicDelete(Boolean.FALSE);

View File

@ -2,9 +2,9 @@ package com.cdzy.activity.enums;
public interface ActivityStatus { public interface ActivityStatus {
int UN_START_REGISTERING = 1; int UN_START_REGISTERING = 1;
int REGISTERING = 1; int REGISTERING = 2;
int STOP_REGISTER = 2; int STOP_REGISTER = 3;
int STARTED = 3; int STARTED = 4;
int FINISHED = 5; int FINISHED = 5;
} }

View File

@ -80,19 +80,11 @@ public class Activity implements Serializable {
private Integer status; 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 @Override
public String toString() { public String toString() {

View File

@ -73,4 +73,10 @@ public class ActivityVo implements Serializable {
*/ */
private Integer limitPeople; private Integer limitPeople;
/**
* 是否限制报名人群0不限制1限制
*/
private Integer limitRegister;
} }

View File

@ -15,4 +15,6 @@ public interface ActivityService extends IService<Activity> {
void saveActivity(ActivityVo activity); void saveActivity(ActivityVo activity);
void updateActivity(ActivityVo activity); void updateActivity(ActivityVo activity);
void checkStatus();
} }

View File

@ -5,12 +5,18 @@ import com.cdzy.activity.mapper.ActivityMapper;
import com.cdzy.activity.model.Activity; import com.cdzy.activity.model.Activity;
import com.cdzy.activity.model.vo.ActivityVo; import com.cdzy.activity.model.vo.ActivityVo;
import com.cdzy.activity.service.ActivityService; import com.cdzy.activity.service.ActivityService;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl; import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY;
/** /**
* 服务层实现 * 活动状态检测变动
* *
* @author attiya * @author attiya
* @since 2025-09-17 * @since 2025-09-17
@ -60,4 +66,39 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity>
throw new RuntimeException("该活动不存在"); 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);
}
}
} }

View File

@ -9,17 +9,18 @@ public class ActivityTableDef extends TableDef{
public final QueryColumn ACTIVITY_LOCATION =new QueryColumn(this,"activityLocation"); public final QueryColumn ACTIVITY_LOCATION =new QueryColumn(this,"activityLocation");
public final QueryColumn ACTIVITY_NAME =new QueryColumn(this,"activityName"); 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 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 REGISTRATION_START_TIME =new QueryColumn(this,"registrationStartTime");
public final QueryColumn END_TIME =new QueryColumn(this,"endTime"); 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 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 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_SPONSOR =new QueryColumn(this,"activitySponsor");
public final QueryColumn ACTIVITY_COVER =new QueryColumn(this,"activityCover");
/** /**
* 所有字段 * 所有字段
*/ */
@ -28,7 +29,7 @@ public class ActivityTableDef extends TableDef{
/** /**
* 默认字段不包含逻辑删除或者 large 等字段 * 默认字段不包含逻辑删除或者 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");} public ActivityTableDef(){super("","activity");}
private ActivityTableDef(String schema, String name, String alisa) { private ActivityTableDef(String schema, String name, String alisa) {
super(schema, name, alisa); super(schema, name, alisa);