后端:状态变换示例
master
xs 1 month ago
parent 92f08c8a85
commit f5429fd58c

@ -0,0 +1,92 @@
package org.dromara.mes.config;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.enums.PlanStatusEnum;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.guard.Guard;
import org.springframework.statemachine.action.Action;
import java.util.EnumSet;
@Configuration
@EnableStateMachineFactory
public class PlanStatusMachineConfig extends StateMachineConfigurerAdapter<PlanStatusEnum, PlanEventEnum> {
@Override
public void configure(StateMachineStateConfigurer<PlanStatusEnum, PlanEventEnum> states) throws Exception {
states
.withStates()
.initial(PlanStatusEnum.CREATED)
.states(EnumSet.allOf(PlanStatusEnum.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<PlanStatusEnum, PlanEventEnum> transitions) throws Exception {
transitions
.withExternal()
.source(PlanStatusEnum.CREATED)
.target(PlanStatusEnum.PLANNED)
.event(PlanEventEnum.PLAN)
.and()
.withExternal()
.source(PlanStatusEnum.PLANNED)
.target(PlanStatusEnum.IN_PROGRESS)
.event(PlanEventEnum.START)
.action(startAction())
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.PAUSED)
.event(PlanEventEnum.PAUSE)
.and()
.withExternal()
.source(PlanStatusEnum.PAUSED)
.target(PlanStatusEnum.IN_PROGRESS)
.event(PlanEventEnum.RESUME)
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.COMPLETED)
.event(PlanEventEnum.COMPLETE)
.guard(completionGuard())
.and()
.withExternal()
.source(PlanStatusEnum.CREATED)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL)
.and()
.withExternal()
.source(PlanStatusEnum.PLANNED)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL)
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL);
}
@Bean
public Action<PlanStatusEnum, PlanEventEnum> startAction() {
return context -> {
System.out.println("工单启动,准备资源...");
// 可注入其他Service
};
}
@Bean
public Guard<PlanStatusEnum, PlanEventEnum> completionGuard() {
return context -> {
// 检查是否允许完成
System.out.println("检查是否允许完成");
return true; // 示例:始终允许
};
}
}

@ -0,0 +1,16 @@
package org.dromara.mes.enums;
/**
* @description pro_plan_info
* 0 1 2 3 4
* @author xins
* @date 2025/4/15 9:28
*/
public enum PlanEventEnum {
PLAN, // 计划
START, // 开始
PAUSE, // 暂停
RESUME, // 恢复
COMPLETE, // 完成
CANCEL // 取消
}

@ -0,0 +1,41 @@
package org.dromara.mes.enums;
/**
* @description pro_plan_info
* 0 1 2 3 4
* @author xins
* @date 2025/4/15 9:28
*/
public enum PlanStatusEnum {
CREATED("0", "已创建"),
PLANNED("1", "已计划"),
IN_PROGRESS("2", "进行中"),
PAUSED("3", "已暂停"),
COMPLETED("4", "已完成"),
CANCELLED("5", "已取消");
private final String code;
private final String description;
PlanStatusEnum(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
public static PlanStatusEnum fromCode(String code) {
for (PlanStatusEnum status : PlanStatusEnum.values()) {
if (status.getCode().equals(code)) {
return status;
}
}
throw new IllegalArgumentException("Invalid status code: " + code);
}
}

@ -0,0 +1,39 @@
package org.dromara.mes.listeners;
import lombok.extern.slf4j.Slf4j;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.enums.PlanStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.listener.StateMachineListener;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.state.State;
import org.springframework.stereotype.Component;
/**
* @Author xins
* @Date 2025/4/15 14:07
* @Description:
*/
@Slf4j
@Component
public class StatusMachineListeners extends StateMachineListenerAdapter<String, String>{
@Override
public void stateChanged(State<String, String> from, State<String, String> to) {
System.out.println("State changed from " + (from != null ? from.getId() : "null")
+ " to " + to.getId());
}
@Override
public void stateEntered(State<String, String> state) {
System.out.println("Entered state: " + state.getId());
}
@Override
public void stateExited(State<String, String> state) {
System.out.println("Exited state: " + state.getId());
}
}
Loading…
Cancel
Save