活动基础功能
This commit is contained in:
parent
0cb62d6231
commit
b8c8ef8441
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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("结束检查状态");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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() {
|
||||||
|
|||||||
@ -73,4 +73,10 @@ public class ActivityVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer limitPeople;
|
private Integer limitPeople;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否限制报名人群(0:不限制,1:限制
|
||||||
|
*/
|
||||||
|
private Integer limitRegister;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user