代码迁移部分

This commit is contained in:
张家训
2026-04-29 17:53:56 +08:00
parent 9a72441447
commit bc045fbe58
14 changed files with 708 additions and 0 deletions
@@ -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);
}
}
@@ -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;
}
}
@@ -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;
}
@@ -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;
}
}
@@ -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;
}
@@ -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;
}
}
@@ -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;
}
@@ -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<StateTransitionRule> 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;
}
}
@@ -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();
}
@@ -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);
}
@@ -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();
}
}
@@ -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<DisburseStateEnum> 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();
}
}
@@ -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();
}
}
@@ -0,0 +1,2 @@
package com.example.workutils.demo;
// 非该项目代码,仅用于代码片段的编写和AI优化