diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/config/PlanStatusMachineConfig.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/config/PlanStatusMachineConfig.java new file mode 100644 index 0000000..da9de6b --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/config/PlanStatusMachineConfig.java @@ -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 { + + @Override + public void configure(StateMachineStateConfigurer states) throws Exception { + states + .withStates() + .initial(PlanStatusEnum.CREATED) + .states(EnumSet.allOf(PlanStatusEnum.class)); + } + + @Override + public void configure(StateMachineTransitionConfigurer 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 startAction() { + return context -> { + System.out.println("工单启动,准备资源..."); + // 可注入其他Service + }; + } + + @Bean + public Guard completionGuard() { + return context -> { + // 检查是否允许完成 + System.out.println("检查是否允许完成"); + return true; // 示例:始终允许 + }; + } + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanEventEnum.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanEventEnum.java new file mode 100644 index 0000000..89ffda3 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanEventEnum.java @@ -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 // 取消 +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanStatusEnum.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanStatusEnum.java new file mode 100644 index 0000000..ec36cb6 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/enums/PlanStatusEnum.java @@ -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); + } +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/listeners/StatusMachineListeners.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/listeners/StatusMachineListeners.java new file mode 100644 index 0000000..243636d --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/listeners/StatusMachineListeners.java @@ -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{ + + @Override + public void stateChanged(State from, State to) { + System.out.println("State changed from " + (from != null ? from.getId() : "null") + + " to " + to.getId()); + } + + @Override + public void stateEntered(State state) { + System.out.println("Entered state: " + state.getId()); + } + + @Override + public void stateExited(State state) { + System.out.println("Exited state: " + state.getId()); + } +}