diff --git a/src/main/java/com/example/workutils/demo/disburse/bo/StateTransitionResult.java b/src/main/java/com/example/workutils/demo/disburse/bo/StateTransitionResult.java new file mode 100644 index 0000000..1cd69a8 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/bo/StateTransitionResult.java @@ -0,0 +1,62 @@ +package com.example.workutils.demo.disburse.bo; + + +import com.example.workutils.demo.disburse.enums.DisburseStateEnum; +import lombok.Data; + +/** + * @desc: 状态机流转结果 + * @author: zhaoyuhang + * @date: 2026-04-28 10:01:13 + */ +@Data +public class StateTransitionResult { + + /** + * 状态流转是否成功 + */ + public final boolean success; + + /** + * 流转后的放款状态 + */ + public final DisburseStateEnum transitionAfterState; + + /** + * 挂起标识 + * false:未挂起,true:已挂起 + */ + public final Boolean suspendedFlag; + + /** + * 撤销标识 + * false:未撤销,true:已撤销 + */ + public final Boolean revokeFlag; + + /** + * 操作拒绝原因 + */ + public final String failReason; + + + private StateTransitionResult(boolean success, DisburseStateEnum transitionAfterState, + Boolean suspendedFlag, Boolean revokeFlag, String failReason) { + this.success = success; + this.transitionAfterState = transitionAfterState; + this.suspendedFlag = suspendedFlag; + this.revokeFlag = revokeFlag; + this.failReason = failReason; + } + + public static StateTransitionResult allow(DisburseStateEnum transitionAfterState, + Boolean suspended, + Boolean canceled) { + return new StateTransitionResult(true, transitionAfterState, suspended, canceled, null); + } + + public static StateTransitionResult deny(String reason) { + return new StateTransitionResult(false, null, null, null, reason); + } + +} diff --git a/src/main/java/com/example/workutils/demo/disburse/context/DisburseStatusTransitionContext.java b/src/main/java/com/example/workutils/demo/disburse/context/DisburseStatusTransitionContext.java new file mode 100644 index 0000000..564aff1 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/context/DisburseStatusTransitionContext.java @@ -0,0 +1,64 @@ +package com.example.workutils.demo.disburse.context; + +import com.example.workutils.demo.disburse.enums.DisburseStateEnum; +import lombok.Data; + +/** + * @desc: 放款状态流转上下文类 + * @author: zhaoyuhang + * @date: 2026-04-28 10:06:37 + */ +@Data +public class DisburseStatusTransitionContext { + + /** + * 放款状态枚举 + */ + public DisburseStateEnum currentDisburseState; + + /** + * 挂起标识 + * false:未挂起,true:已挂起 + */ + public boolean suspendedFlag; + + /** + * 撤销标识 + * false:未撤销,true:已撤销 + */ + public boolean revokeFlag; + + /** + * 达到冷静期标识 + * false:未达到冷静期,true:已达到冷静期 + */ + public boolean coolingReachedFlag; + + /** + * 自动确认标识 + * false:不自动确认,true:自动确认 + */ + public boolean autoConfirmFlag; + + /** + * 自动审核标识 + * false:不自动审核,true:自动审核 + */ + public boolean autoAuditFlag; + + + public DisburseStatusTransitionContext(DisburseStateEnum currentDisburseState, + boolean suspendedFlag, + boolean revokeFlag, + boolean coolingReachedFlag, + boolean autoConfirmFlag, + boolean autoAuditFlag) { + this.currentDisburseState = currentDisburseState; + this.suspendedFlag = suspendedFlag; + this.revokeFlag = revokeFlag; + this.coolingReachedFlag = coolingReachedFlag; + this.autoConfirmFlag = autoConfirmFlag; + this.autoAuditFlag = autoAuditFlag; + } + +} diff --git a/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionEnum.java b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionEnum.java new file mode 100644 index 0000000..2e46184 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionEnum.java @@ -0,0 +1,59 @@ +package com.example.workutils.demo.disburse.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Description: 放款操作枚举 + * @Author:zhaoyuhang + * @Date: 2026/4/28 + **/ +@Getter +@AllArgsConstructor +public enum DisburseActionEnum { + + /** + * 提交 + */ + COMMIT("提交"), + + /** + * 确认 + */ + CONFIRM("确认"), + + /** + * 审核 + */ + AUDIT("审核"), + + /** + * 放款成功 + */ + DISBURSE_SUCCESS("放款成功"), + + /** + * 放款失败 + */ + DISBURSE_FAIL("放款失败"), + + /** + * 挂起 + */ + SUSPEND("挂起"), + + /** + * 挂起恢复 + */ + SUSPEND_RESUME("挂起恢复"), + + /** + * 撤销 + */ + REVOKE("撤销"); + + /** + * 描述 + */ + private String desc; +} diff --git a/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionRuleEnum.java b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionRuleEnum.java new file mode 100644 index 0000000..d64b5a8 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseActionRuleEnum.java @@ -0,0 +1,95 @@ +package com.example.workutils.demo.disburse.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Description: 放款操作规则枚举 + * @Author:zhaoyuhang + * @Date: 2026/4/28 + **/ +@Getter +@AllArgsConstructor +public enum DisburseActionRuleEnum { + + /** + * 提交 + */ + COMMIT(DisburseActionEnum.COMMIT, StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY, false, false, true), + + /** + * 确认 + */ + CONFIRM(DisburseActionEnum.CONFIRM, StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY, false, false, null), + + /** + * 审核 + */ + AUDIT(DisburseActionEnum.AUDIT, StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY, false, false, null), + + /** + * 放款成功 + */ + DISBURSE_SUCCESS(DisburseActionEnum.DISBURSE_SUCCESS, StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY, + null, null, null), + + /** + * 放款失败 + */ + DISBURSE_FAIL(DisburseActionEnum.DISBURSE_FAIL, StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY, + null, null, null), + + /** + * 挂起 + */ + SUSPEND(DisburseActionEnum.SUSPEND, StateTransitionStrategyEnum.SUSPEND_TRANSITION_STRATEGY, false, null, null), + + /** + * 挂起恢复 + */ + SUSPEND_RESUME(DisburseActionEnum.SUSPEND_RESUME, StateTransitionStrategyEnum.SUSPEND_TRANSITION_STRATEGY, + true, null, null), + + /** + * 撤销 + */ + REVOKE(DisburseActionEnum.REVOKE, StateTransitionStrategyEnum.REVOKE_TRANSITION_STRATEGY, null, false, null); + + /** + * 放款操作枚举 + */ + private DisburseActionEnum disburseActionEnum; + + /** + * 状态流转策略枚举 + */ + private StateTransitionStrategyEnum stateTransitionStrategy; + + /** + * 要求挂起状态标识 + * false:未挂起,true:已挂起 + */ + public Boolean requireSuspendFlag; + + /** + * 要求撤销状态标识 + * false:未撤销,true:已撤销 + */ + public Boolean requireRevokeFlag; + + /** + * 要求达到冷静期标识 + * false:未达到冷静期,true:已达到冷静期 + */ + public Boolean requireCoolingReachedFlag; + + + public static DisburseActionRuleEnum getDisburseActionValidateEnum(DisburseActionEnum disburseActionEnum){ + for (DisburseActionRuleEnum ruleEnum : DisburseActionRuleEnum.values()) { + if (ruleEnum.getDisburseActionEnum().equals(disburseActionEnum)){ + return ruleEnum; + } + } + return null; + } +} diff --git a/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateEnum.java b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateEnum.java new file mode 100644 index 0000000..1605c82 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateEnum.java @@ -0,0 +1,52 @@ +package com.example.workutils.demo.disburse.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * @Description: 放款状态枚举 + * @Author:zhaoyuhang + * @Date: 2026/4/28 + **/ +@Getter +@AllArgsConstructor +public enum DisburseStateEnum { + + /** + * 初始化 + */ + INIT("初始化"), + + /** + * 待确认 + */ + PENDING_CONFIRM("待确认"), + + /** + * 待审核 + */ + PENDING_AUDIT("待审核"), + + /** + * 放款中 + */ + DISBURSING("放款中"), + + /** + * 放款成功 + */ + DISBURSE_SUCCESS("放款成功"), + + /** + * 放款失败 + */ + DISBURSE_FAILED("放款失败"), + ; + + /** + * 描述 + */ + private String desc; + +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateTransitionRuleEnum.java b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateTransitionRuleEnum.java new file mode 100644 index 0000000..86e48c8 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/enums/DisburseStateTransitionRuleEnum.java @@ -0,0 +1,69 @@ +package com.example.workutils.demo.disburse.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Description:放款状态流转规则枚举 + * @Author:zhaoyuhang + * @Date: 2026/4/28 + **/ +@Getter +@AllArgsConstructor +public enum DisburseStateTransitionRuleEnum { + + /** + * 提交操作状态流转规则 + */ + COMMIT_STATE_TRANSITION_RULE(DisburseActionEnum.COMMIT, DisburseStateEnum.INIT, DisburseStateEnum.PENDING_CONFIRM), + + /** + * 确认操作状态流转规则 + */ + CONFIRM_STATE_TRANSITION_RULE(DisburseActionEnum.CONFIRM, DisburseStateEnum.PENDING_CONFIRM, + DisburseStateEnum.PENDING_AUDIT), + + /** + * 审核操作状态流转规则 + */ + AUDIT_STATE_TRANSITION_RULE(DisburseActionEnum.AUDIT,DisburseStateEnum.PENDING_AUDIT, DisburseStateEnum.DISBURSING), + + /** + * 放款成功操作状态流转规则 + */ + DISBURSE_SUCCESS_STATE_TRANSITION_RULE(DisburseActionEnum.DISBURSE_SUCCESS, DisburseStateEnum.DISBURSING, + DisburseStateEnum.DISBURSE_SUCCESS), + + /** + * 放款失败操作状态流转规则 + */ + DISBURSE_FAIL_STATE_TRANSITION_RULE(DisburseActionEnum.DISBURSE_FAIL, DisburseStateEnum.DISBURSING, + DisburseStateEnum.DISBURSE_FAILED), + ; + + /** + * 放款操作枚举 + */ + private DisburseActionEnum disburseActionEnum; + + /** + * 允许放款状态 + */ + private DisburseStateEnum allowDisburseState; + + /** + * 目标放款状态 + */ + private DisburseStateEnum targetDisburseState; + + + public static DisburseStateTransitionRuleEnum getDisburseActionRule(DisburseActionEnum disburseActionEnum){ + for (DisburseStateTransitionRuleEnum ruleEnum : DisburseStateTransitionRuleEnum.values()) { + if (ruleEnum.getDisburseActionEnum().equals(disburseActionEnum)){ + return ruleEnum; + } + } + return null; + } + +} diff --git a/src/main/java/com/example/workutils/demo/disburse/enums/StateTransitionStrategyEnum.java b/src/main/java/com/example/workutils/demo/disburse/enums/StateTransitionStrategyEnum.java new file mode 100644 index 0000000..751d242 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/enums/StateTransitionStrategyEnum.java @@ -0,0 +1,24 @@ +package com.example.workutils.demo.disburse.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Description: 状态流转策略枚举 + * @Author:zhaoyuhang + * @Date: 2026/4/29 + **/ +@Getter +@AllArgsConstructor +public enum StateTransitionStrategyEnum { + + DISBURSE_TRANSITION_STRATEGY("放款状态流转规则策略"), + + SUSPEND_TRANSITION_STRATEGY("挂起状态流转规则策略"), + + REVOKE_TRANSITION_STRATEGY("撤销状态流转规则策略"), + ; + + private String desc; + +} diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/StateTransitionExecutor.java b/src/main/java/com/example/workutils/demo/disburse/executor/StateTransitionExecutor.java new file mode 100644 index 0000000..05c55bf --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/StateTransitionExecutor.java @@ -0,0 +1,58 @@ +package com.example.workutils.demo.disburse.executor; + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionEnum; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; +import com.example.workutils.demo.disburse.executor.service.StateTransitionRule; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @desc: 状态机流转执行器 + * @author: zhaoyuhang + * @date: 2026-04-28 10:01:13 + */ +@Slf4j +@Component +public class StateTransitionExecutor { + + @Resource + private List stateTransitionRules; + + + public StateTransitionResult transitionState(DisburseStatusTransitionContext context, DisburseActionEnum action) { + //根据操作匹配处理规则 + DisburseActionRuleEnum disburseActionRuleEnum = DisburseActionRuleEnum.getDisburseActionValidateEnum(action); + if (disburseActionRuleEnum == null){ + log.error("放款操作未命中任何决策规则,放款操作:{}不合法!", action.name()); + return StateTransitionResult.deny("放款操作未命中任何决策规则!"); + } + + //根据处理规则匹配处理策略 + StateTransitionRule decisionRule = stateTransitionRules.stream() + .filter(filter -> filter.getStateDecisionRule().equals( + disburseActionRuleEnum.getStateTransitionStrategy().name())) + .findFirst().orElse(null); + if (decisionRule == null) { + log.error("操作处理规则未命中任何决策处理策略,操作规则:{}不合理!", + disburseActionRuleEnum.getStateTransitionStrategy().name()); + return StateTransitionResult.deny("操作处理规则未命中任何决策处理策略"); + } + + //执行处理策略 + StateTransitionResult result = decisionRule.execute(context, disburseActionRuleEnum); + if (result == null) { + log.error("执行操作决策结果为空!"); + return StateTransitionResult.deny("执行操作决策结果为空"); + } + + //TODO 是否修改Context参数 + context.setCurrentDisburseState(result.getTransitionAfterState()); + return result; + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/service/StateTransitionRule.java b/src/main/java/com/example/workutils/demo/disburse/executor/service/StateTransitionRule.java new file mode 100644 index 0000000..e156c38 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/service/StateTransitionRule.java @@ -0,0 +1,28 @@ +package com.example.workutils.demo.disburse.executor.service; + + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; + +/** + * @desc: 状态决策规则接口 + * @author: zhaoyuhang + * @date: 2026-04-28 10:03:32 + */ +public interface StateTransitionRule { + + /** + * 决策接口 + * @param context + * @param ruleEnum + * @return + */ + StateTransitionResult execute(DisburseStatusTransitionContext context, DisburseActionRuleEnum ruleEnum); + + /** + * 获取状态决策规则 + * @return + */ + String getStateDecisionRule(); +} diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/AbstractStateTransitionRule.java b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/AbstractStateTransitionRule.java new file mode 100644 index 0000000..a118bd3 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/AbstractStateTransitionRule.java @@ -0,0 +1,51 @@ +package com.example.workutils.demo.disburse.executor.service.impl; + + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; +import com.example.workutils.demo.disburse.executor.service.StateTransitionRule; +import lombok.extern.slf4j.Slf4j; + + +/** + * @desc: 抽象状态流转规则类 + * @author: zhaoyuhang + * @date: 2026-04-28 15:12:24 + */ +@Slf4j +public abstract class AbstractStateTransitionRule implements StateTransitionRule { + + + @Override + public final StateTransitionResult execute(DisburseStatusTransitionContext context, + DisburseActionRuleEnum ruleEnum) { + //挂起状态检查 + if (ruleEnum.getRequireSuspendFlag() != null && + !ruleEnum.getRequireSuspendFlag().equals(context.suspendedFlag)){ + log.info("目标挂起状态:{},实际挂起状态:{},状态不可推进!",ruleEnum.getRequireSuspendFlag(),context.suspendedFlag); + return StateTransitionResult.deny("挂起时不可推进"); + } + + //撤销状态检查 + if (ruleEnum.getRequireRevokeFlag() != null && + !ruleEnum.getRequireRevokeFlag().equals(context.revokeFlag)) { + log.info("目标撤销状态:{}实际撤销状态:{},状态不可推进!", ruleEnum.getRequireRevokeFlag(), context.revokeFlag); + return StateTransitionResult.deny("撤销后不可推进"); + } + + //冷静期检查 + if (ruleEnum.getRequireCoolingReachedFlag() != null && + !ruleEnum.getRequireCoolingReachedFlag().equals(context.coolingReachedFlag)) { + log.info("目标达到冷静期标识:{},实际达到冷静期状态:{},冷静期未到!", + ruleEnum.getRequireCoolingReachedFlag(), context.coolingReachedFlag); + return StateTransitionResult.deny("冷静期未到"); + } + + return doEvaluate(context, ruleEnum); + } + + + protected abstract StateTransitionResult doEvaluate(DisburseStatusTransitionContext context, + DisburseActionRuleEnum action); +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/DisburseStateTransitionRuleStrategy.java b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/DisburseStateTransitionRuleStrategy.java new file mode 100644 index 0000000..91beb49 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/DisburseStateTransitionRuleStrategy.java @@ -0,0 +1,49 @@ +package com.example.workutils.demo.disburse.executor.service.impl; + + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; +import com.example.workutils.demo.disburse.enums.DisburseStateTransitionRuleEnum; +import com.example.workutils.demo.disburse.enums.StateTransitionStrategyEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @desc: 放款状态操作处理器 + * @author: zhaoyuhang + * @date: 2026-04-29 10:39:40 + */ +@Slf4j +@Component +public class DisburseStateTransitionRuleStrategy extends AbstractStateTransitionRule { + + + @Override + public StateTransitionResult doEvaluate(DisburseStatusTransitionContext context, + DisburseActionRuleEnum actionRuleEnum) { + DisburseStateTransitionRuleEnum ruleEnum = + DisburseStateTransitionRuleEnum.getDisburseActionRule(actionRuleEnum.getDisburseActionEnum()); + if (ruleEnum == null){ + log.error("放款操作未匹配到放款状态流转规则!放款类型:{}", actionRuleEnum.getDisburseActionEnum().getDesc()); + return StateTransitionResult.deny("放款操作未匹配到放款状态流转规则"); + } + + if (ruleEnum.getAllowDisburseState() != context.getCurrentDisburseState()){ + log.error("当前放款状态与要求放款状态不匹配,无法流转状态!放款操作:{}当前放款状态:{},要求放款状态:{}", + actionRuleEnum.getDisburseActionEnum().getDesc(), context.getCurrentDisburseState(), + ruleEnum.getAllowDisburseState()); + return StateTransitionResult.deny("当前放款状态与要求放款状态不匹配,当前放款状态:"+ context.getCurrentDisburseState() + + "不可推进为:" + ruleEnum.getTargetDisburseState()); + } + + return StateTransitionResult.allow(ruleEnum.getTargetDisburseState(), + context.isSuspendedFlag(), context.isRevokeFlag()); + } + + @Override + public String getStateDecisionRule() { + return StateTransitionStrategyEnum.DISBURSE_TRANSITION_STRATEGY.name(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/RevokeStateTransitionTransitionRuleStrategy.java b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/RevokeStateTransitionTransitionRuleStrategy.java new file mode 100644 index 0000000..c0700bd --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/RevokeStateTransitionTransitionRuleStrategy.java @@ -0,0 +1,56 @@ +package com.example.workutils.demo.disburse.executor.service.impl; + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; +import com.example.workutils.demo.disburse.enums.DisburseStateEnum; +import com.example.workutils.demo.disburse.enums.StateTransitionStrategyEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +/** + * @desc: 撤销状态操作处理器 + * @author: zhaoyuhang + * @date: 2026-04-29 10:36:34 + */ +@Slf4j +@Component +public class RevokeStateTransitionTransitionRuleStrategy extends AbstractStateTransitionRule { + + + private static final List BEFORE_DISBURSE_STATE = Arrays.asList( + DisburseStateEnum.INIT, + DisburseStateEnum.PENDING_CONFIRM, + DisburseStateEnum.PENDING_AUDIT + ); + + /** + * 执行决策接口 + * + * @param context + * @param ruleEnum + * @return + */ + @Override + public StateTransitionResult doEvaluate(DisburseStatusTransitionContext context, + DisburseActionRuleEnum ruleEnum) { + if (DisburseStateEnum.DISBURSE_FAILED.name().equals(context.getCurrentDisburseState())){ + log.info("放款状态:{}已经放款失败,无需撤销!"); + return StateTransitionResult.deny("放款状态已经为放款失败,无需撤销"); + } + + DisburseStateEnum newStatus = BEFORE_DISBURSE_STATE.contains(context.getCurrentDisburseState()) + ? DisburseStateEnum.DISBURSE_FAILED + : context.getCurrentDisburseState(); + + return StateTransitionResult.allow(newStatus, context.isSuspendedFlag(), true); + } + + @Override + public String getStateDecisionRule() { + return StateTransitionStrategyEnum.REVOKE_TRANSITION_STRATEGY.name(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/SuspendStateTransitionTransitionRuleStrategy.java b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/SuspendStateTransitionTransitionRuleStrategy.java new file mode 100644 index 0000000..73d9ff1 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/disburse/executor/service/impl/SuspendStateTransitionTransitionRuleStrategy.java @@ -0,0 +1,39 @@ +package com.example.workutils.demo.disburse.executor.service.impl; + + +import com.example.workutils.demo.disburse.bo.StateTransitionResult; +import com.example.workutils.demo.disburse.context.DisburseStatusTransitionContext; +import com.example.workutils.demo.disburse.enums.DisburseActionEnum; +import com.example.workutils.demo.disburse.enums.DisburseActionRuleEnum; +import com.example.workutils.demo.disburse.enums.StateTransitionStrategyEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @desc: 挂起状态操作处理器 + * @author: zhaoyuhang + * @date: 2026-04-29 10:28:00 + */ +@Slf4j +@Component +public class SuspendStateTransitionTransitionRuleStrategy extends AbstractStateTransitionRule { + + /** + * 决策接口 + * + * @param context + * @param ruleEnum + * @return + */ + @Override + public StateTransitionResult doEvaluate(DisburseStatusTransitionContext context, DisburseActionRuleEnum ruleEnum) { + boolean newSuspended = ruleEnum.getDisburseActionEnum() == DisburseActionEnum.SUSPEND; + + return StateTransitionResult.allow(context.getCurrentDisburseState(), newSuspended, context.isRevokeFlag()); + } + + @Override + public String getStateDecisionRule() { + return StateTransitionStrategyEnum.SUSPEND_TRANSITION_STRATEGY.name(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/demo/package-info.java b/src/main/java/com/example/workutils/demo/package-info.java new file mode 100644 index 0000000..732b079 --- /dev/null +++ b/src/main/java/com/example/workutils/demo/package-info.java @@ -0,0 +1,2 @@ +package com.example.workutils.demo; +// 非该项目代码,仅用于代码片段的编写和AI优化 \ No newline at end of file