@@ -0,0 +1,58 @@ | |||||
package com.hz.pm.api.common.statemachine.action; | |||||
import cn.hutool.core.lang.Assert; | |||||
import com.hz.pm.api.common.statemachine.builder.impl.TestValidStateMachineBuilderImpl; | |||||
import com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.AdaptStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.statemachine.annotation.OnTransition; | |||||
import org.springframework.statemachine.annotation.WithStateMachine; | |||||
/** | |||||
* <p> | |||||
* 测试验证状态机action集合类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:08 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@WithStateMachine(id = TestValidStateMachineBuilderImpl.MACHINE_ID) | |||||
public class AdaptAction { | |||||
private Purchase getPurchaseInfo(Message<AdaptStateChangeEvent> message) { | |||||
Purchase purchase = (Purchase) message.getHeaders().get(TenderStateMachineUtil.PURCHASE); | |||||
Assert.notNull(purchase, "未获取到需要状态变更的标段信息"); | |||||
return purchase; | |||||
} | |||||
@OnTransition(source = "WITHOUT_ADAPT_INFO", target = "ADAPT_INFO_AUDIT") | |||||
public void SUBMIT_ADAPT_INFO(Message<AdaptStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setAdaptStatus(AdaptStatusEnum.ADAPT_INFO_AUDIT.getCode()); | |||||
} | |||||
@OnTransition(source = "ADAPT_INFO_AUDIT", target = "ADAPT_INFO_PASSED") | |||||
public void ADAPT_INFO_PASSED(Message<AdaptStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setAdaptStatus(AdaptStatusEnum.ADAPT_INFO_PASSED.getCode()); | |||||
} | |||||
@OnTransition(source = "ADAPT_INFO_AUDIT", target = "ADAPT_INFO_FAILED") | |||||
public void ADAPT_INFO_FAILED(Message<AdaptStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setAdaptStatus(AdaptStatusEnum.ADAPT_INFO_FAILED.getCode()); | |||||
} | |||||
@OnTransition(source = "ADAPT_INFO_FAILED", target = "ADAPT_INFO_AUDIT") | |||||
public void RESUBMIT_ADAPT_INFO(Message<AdaptStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setAdaptStatus(AdaptStatusEnum.ADAPT_INFO_AUDIT.getCode()); | |||||
} | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package com.hz.pm.api.common.statemachine.action; | |||||
import cn.hutool.core.lang.Assert; | |||||
import com.hz.pm.api.common.statemachine.builder.impl.TestValidStateMachineBuilderImpl; | |||||
import com.hz.pm.api.common.statemachine.event.SelfTestStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.SelfTestStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.statemachine.annotation.OnTransition; | |||||
import org.springframework.statemachine.annotation.WithStateMachine; | |||||
/** | |||||
* <p> | |||||
* 系统自测状态机action集合类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:08 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@WithStateMachine(id = TestValidStateMachineBuilderImpl.MACHINE_ID) | |||||
public class SelfTestAction { | |||||
private Purchase getPurchaseInfo(Message<SelfTestStateChangeEvent> message) { | |||||
Purchase purchase = (Purchase) message.getHeaders().get(TenderStateMachineUtil.PURCHASE); | |||||
Assert.notNull(purchase, "未获取到需要状态变更的标段信息"); | |||||
return purchase; | |||||
} | |||||
@OnTransition(source = "WITHOUT_SELF_TEST_INFO", target = "TEST_VALID_INFO_AUDIT") | |||||
public void SUBMIT_SELF_TEST_INFO(Message<SelfTestStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setSelfTestStatus(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT.getCode()); | |||||
} | |||||
@OnTransition(source = "SELF_TEST_INFO_AUDIT", target = "SELF_TEST_INFO_PASSED") | |||||
public void SELF_TEST_INFO_PASSED(Message<SelfTestStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setSelfTestStatus(SelfTestStatusEnum.SELF_TEST_INFO_PASSED.getCode()); | |||||
} | |||||
@OnTransition(source = "SELF_TEST_INFO_AUDIT", target = "SELF_TEST_INFO_FAILED") | |||||
public void SELF_TEST_INFO_FAILED(Message<SelfTestStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setSelfTestStatus(SelfTestStatusEnum.SELF_TEST_INFO_FAILED.getCode()); | |||||
} | |||||
@OnTransition(source = "SELF_TEST_INFO_FAILED", target = "TEST_VALID_INFO_AUDIT") | |||||
public void RESUBMIT_SELF_TEST_INFO(Message<SelfTestStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setSelfTestStatus(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT.getCode()); | |||||
} | |||||
} |
@@ -0,0 +1,56 @@ | |||||
package com.hz.pm.api.common.statemachine.action; | |||||
import cn.hutool.core.lang.Assert; | |||||
import com.hz.pm.api.common.statemachine.builder.impl.TestValidStateMachineBuilderImpl; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.statemachine.annotation.OnTransition; | |||||
import org.springframework.statemachine.annotation.WithStateMachine; | |||||
/** | |||||
* <p> | |||||
* 测试验证状态机action集合类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:08 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@WithStateMachine(id = TestValidStateMachineBuilderImpl.MACHINE_ID) | |||||
public class TestValidAction { | |||||
private Purchase getPurchaseInfo(Message<TestValidStateChangeEvent> message) { | |||||
Purchase purchase = (Purchase) message.getHeaders().get(TenderStateMachineUtil.PURCHASE); | |||||
Assert.notNull(purchase, "未获取到需要状态变更的标段信息"); | |||||
return purchase; | |||||
} | |||||
@OnTransition(source = "WITHOUT_TEST_VALID_INFO", target = "TEST_VALID_INFO_AUDIT") | |||||
public void SUBMIT_TEST_VALID_INFO(Message<TestValidStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setTestValidStatus(TestValidStatusEnum.TEST_VALID_INFO_AUDIT.getCode()); | |||||
} | |||||
@OnTransition(source = "TEST_VALID_INFO_AUDIT", target = "TEST_VALID_INFO_PASSED") | |||||
public void TEST_VALID_INFO_PASSED(Message<TestValidStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setTestValidStatus(TestValidStatusEnum.TEST_VALID_INFO_PASSED.getCode()); | |||||
} | |||||
@OnTransition(source = "TEST_VALID_INFO_AUDIT", target = "TEST_VALID_INFO_FAILED") | |||||
public void TEST_VALID_INFO_FAILED(Message<TestValidStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setTestValidStatus(TestValidStatusEnum.TEST_VALID_INFO_FAILED.getCode()); | |||||
} | |||||
@OnTransition(source = "TEST_VALID_INFO_FAILED", target = "TEST_VALID_INFO_AUDIT") | |||||
public void RESUBMIT_TEST_VALID_INFO(Message<TestValidStateChangeEvent> message) { | |||||
Purchase purchase = getPurchaseInfo(message); | |||||
purchase.setTestValidStatus(TestValidStatusEnum.TEST_VALID_INFO_AUDIT.getCode()); | |||||
} | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package com.hz.pm.api.common.statemachine.builder; | |||||
import com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.AdaptStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
/** | |||||
* 项目申报状态机 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 15:56 | |||||
*/ | |||||
public interface AdaptStateMachineBuilder { | |||||
StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> build() throws StateMachineException; | |||||
/** | |||||
* 构建状态机 | |||||
* | |||||
* @param beanFactory \ | |||||
*/ | |||||
StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException; | |||||
/** | |||||
* 持久化配置 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 16:22 | |||||
*/ | |||||
StateMachinePersister<AdaptStatusEnum, AdaptStateChangeEvent, Purchase> stateMachinePersister(); | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package com.hz.pm.api.common.statemachine.builder; | |||||
import com.hz.pm.api.common.statemachine.event.SelfTestStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.SelfTestStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
/** | |||||
* 项目申报状态机 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 15:56 | |||||
*/ | |||||
public interface SelfTestStateMachineBuilder { | |||||
StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> build() throws StateMachineException; | |||||
/** | |||||
* 构建状态机 | |||||
* | |||||
* @param beanFactory \ | |||||
*/ | |||||
StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException; | |||||
/** | |||||
* 持久化配置 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 16:22 | |||||
*/ | |||||
StateMachinePersister<SelfTestStatusEnum, SelfTestStateChangeEvent, Purchase> stateMachinePersister(); | |||||
} |
@@ -0,0 +1,38 @@ | |||||
package com.hz.pm.api.common.statemachine.builder; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
/** | |||||
* 项目申报状态机 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 15:56 | |||||
*/ | |||||
public interface TestValidStateMachineBuilder { | |||||
StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> build() throws StateMachineException; | |||||
/** | |||||
* 构建状态机 | |||||
* | |||||
* @param beanFactory \ | |||||
*/ | |||||
StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException; | |||||
/** | |||||
* 持久化配置 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/07 16:22 | |||||
*/ | |||||
StateMachinePersister<TestValidStatusEnum, TestValidStateChangeEvent, Purchase> stateMachinePersister(); | |||||
} |
@@ -0,0 +1,114 @@ | |||||
package com.hz.pm.api.common.statemachine.builder.impl; | |||||
import com.hz.pm.api.common.statemachine.builder.AdaptStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.AdaptStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineContext; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.StateMachinePersist; | |||||
import org.springframework.statemachine.config.EnableStateMachine; | |||||
import org.springframework.statemachine.config.StateMachineBuilder; | |||||
import org.springframework.statemachine.persist.DefaultStateMachinePersister; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.statemachine.support.DefaultStateMachineContext; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.EnumSet; | |||||
/** | |||||
* <p> | |||||
* 标段状态机 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:38 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@EnableStateMachine(name = AdaptStateMachineBuilderImpl.MACHINE_ID) | |||||
@RequiredArgsConstructor | |||||
public class AdaptStateMachineBuilderImpl implements AdaptStateMachineBuilder { | |||||
public static final String MACHINE_ID = "adaptStateMachine"; | |||||
private final BeanFactory beanFactory; | |||||
@Override | |||||
public StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> build() throws StateMachineException { | |||||
StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> stateMachine = build(beanFactory); | |||||
log.info("状态机ID:" + stateMachine.getId()); | |||||
stateMachine.start(); | |||||
return stateMachine; | |||||
} | |||||
@Override | |||||
public StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException { | |||||
try { | |||||
return buildStateMachine(beanFactory); | |||||
} catch (Exception e) { | |||||
throw new StateMachineException("状态机构件失败", e); | |||||
} | |||||
} | |||||
private StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> buildStateMachine(BeanFactory factory) throws Exception { | |||||
StateMachineBuilder.Builder<AdaptStatusEnum, AdaptStateChangeEvent> builder = StateMachineBuilder.builder(); | |||||
builder.configureConfiguration() | |||||
.withConfiguration() | |||||
.machineId(MACHINE_ID) | |||||
.beanFactory(factory); | |||||
builder.configureStates() | |||||
.withStates() | |||||
.initial(AdaptStatusEnum.WITHOUT_ADAPT_INFO) | |||||
.states(EnumSet.allOf(AdaptStatusEnum.class)); | |||||
builder.configureTransitions() | |||||
.withExternal() | |||||
.source(AdaptStatusEnum.WITHOUT_ADAPT_INFO) | |||||
.target(AdaptStatusEnum.ADAPT_INFO_AUDIT) | |||||
.event(AdaptStateChangeEvent.SUBMIT_ADAPT_INFO) | |||||
.and() | |||||
.withExternal() | |||||
.source(AdaptStatusEnum.ADAPT_INFO_AUDIT) | |||||
.target(AdaptStatusEnum.ADAPT_INFO_PASSED) | |||||
.event(AdaptStateChangeEvent.ADAPT_INFO_PASSED) | |||||
.and() | |||||
.withExternal() | |||||
.source(AdaptStatusEnum.ADAPT_INFO_AUDIT) | |||||
.target(AdaptStatusEnum.ADAPT_INFO_FAILED) | |||||
.event(AdaptStateChangeEvent.ADAPT_INFO_FAILED) | |||||
.and() | |||||
.withExternal() | |||||
.source(AdaptStatusEnum.ADAPT_INFO_FAILED) | |||||
.target(AdaptStatusEnum.ADAPT_INFO_AUDIT) | |||||
.event(AdaptStateChangeEvent.RESUBMIT_ADAPT_INFO) | |||||
.and(); | |||||
return builder.build(); | |||||
} | |||||
@Override | |||||
@Bean(name = "adaptStatePersister") | |||||
public StateMachinePersister<AdaptStatusEnum, AdaptStateChangeEvent, Purchase> stateMachinePersister() { | |||||
return new DefaultStateMachinePersister<>(new StateMachinePersist<AdaptStatusEnum, AdaptStateChangeEvent, Purchase>() { | |||||
@Override | |||||
public void write(StateMachineContext<AdaptStatusEnum, AdaptStateChangeEvent> context, Purchase contextObj) { | |||||
log.info("当前项目为:{}", contextObj); | |||||
} | |||||
@Override | |||||
public StateMachineContext<AdaptStatusEnum, AdaptStateChangeEvent> read(Purchase contextObj) { | |||||
AdaptStatusEnum status = AdaptStatusEnum.get(contextObj.getAdaptStatus()) | |||||
.orElseThrow(() -> BizException.wrap("系统自测状态无效")); | |||||
return new DefaultStateMachineContext<>(status, null, null, null, null, MACHINE_ID); | |||||
} | |||||
}); | |||||
} | |||||
} |
@@ -0,0 +1,114 @@ | |||||
package com.hz.pm.api.common.statemachine.builder.impl; | |||||
import com.hz.pm.api.common.statemachine.builder.SelfTestStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.SelfTestStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.SelfTestStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineContext; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.StateMachinePersist; | |||||
import org.springframework.statemachine.config.EnableStateMachine; | |||||
import org.springframework.statemachine.config.StateMachineBuilder; | |||||
import org.springframework.statemachine.persist.DefaultStateMachinePersister; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.statemachine.support.DefaultStateMachineContext; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.EnumSet; | |||||
/** | |||||
* <p> | |||||
* 标段状态机 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:38 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@EnableStateMachine(name = SelfTestStateMachineBuilderImpl.MACHINE_ID) | |||||
@RequiredArgsConstructor | |||||
public class SelfTestStateMachineBuilderImpl implements SelfTestStateMachineBuilder { | |||||
public static final String MACHINE_ID = "selfTestStateMachine"; | |||||
private final BeanFactory beanFactory; | |||||
@Override | |||||
public StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> build() throws StateMachineException { | |||||
StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> stateMachine = build(beanFactory); | |||||
log.info("状态机ID:" + stateMachine.getId()); | |||||
stateMachine.start(); | |||||
return stateMachine; | |||||
} | |||||
@Override | |||||
public StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException { | |||||
try { | |||||
return buildStateMachine(beanFactory); | |||||
} catch (Exception e) { | |||||
throw new StateMachineException("状态机构件失败", e); | |||||
} | |||||
} | |||||
private StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> buildStateMachine(BeanFactory factory) throws Exception { | |||||
StateMachineBuilder.Builder<SelfTestStatusEnum, SelfTestStateChangeEvent> builder = StateMachineBuilder.builder(); | |||||
builder.configureConfiguration() | |||||
.withConfiguration() | |||||
.machineId(MACHINE_ID) | |||||
.beanFactory(factory); | |||||
builder.configureStates() | |||||
.withStates() | |||||
.initial(SelfTestStatusEnum.WITHOUT_SELF_TEST_INFO) | |||||
.states(EnumSet.allOf(SelfTestStatusEnum.class)); | |||||
builder.configureTransitions() | |||||
.withExternal() | |||||
.source(SelfTestStatusEnum.WITHOUT_SELF_TEST_INFO) | |||||
.target(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT) | |||||
.event(SelfTestStateChangeEvent.SUBMIT_SELF_TEST_INFO) | |||||
.and() | |||||
.withExternal() | |||||
.source(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT) | |||||
.target(SelfTestStatusEnum.SELF_TEST_INFO_PASSED) | |||||
.event(SelfTestStateChangeEvent.SELF_TEST_PASSED) | |||||
.and() | |||||
.withExternal() | |||||
.source(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT) | |||||
.target(SelfTestStatusEnum.SELF_TEST_INFO_FAILED) | |||||
.event(SelfTestStateChangeEvent.SELF_TEST_FAILED) | |||||
.and() | |||||
.withExternal() | |||||
.source(SelfTestStatusEnum.SELF_TEST_INFO_FAILED) | |||||
.target(SelfTestStatusEnum.SELF_TEST_INFO_AUDIT) | |||||
.event(SelfTestStateChangeEvent.RESUBMIT_SELF_TEST) | |||||
.and(); | |||||
return builder.build(); | |||||
} | |||||
@Override | |||||
@Bean(name = "selfTestStatePersister") | |||||
public StateMachinePersister<SelfTestStatusEnum, SelfTestStateChangeEvent, Purchase> stateMachinePersister() { | |||||
return new DefaultStateMachinePersister<>(new StateMachinePersist<SelfTestStatusEnum, SelfTestStateChangeEvent, Purchase>() { | |||||
@Override | |||||
public void write(StateMachineContext<SelfTestStatusEnum, SelfTestStateChangeEvent> context, Purchase contextObj) { | |||||
log.info("当前项目为:{}", contextObj); | |||||
} | |||||
@Override | |||||
public StateMachineContext<SelfTestStatusEnum, SelfTestStateChangeEvent> read(Purchase contextObj) { | |||||
SelfTestStatusEnum status = SelfTestStatusEnum.get(contextObj.getSelfTestStatus()) | |||||
.orElseThrow(() -> BizException.wrap("系统自测状态无效")); | |||||
return new DefaultStateMachineContext<>(status, null, null, null, null, MACHINE_ID); | |||||
} | |||||
}); | |||||
} | |||||
} |
@@ -0,0 +1,114 @@ | |||||
package com.hz.pm.api.common.statemachine.builder.impl; | |||||
import com.hz.pm.api.common.statemachine.builder.TestValidStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.BeanFactory; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.StateMachineContext; | |||||
import org.springframework.statemachine.StateMachineException; | |||||
import org.springframework.statemachine.StateMachinePersist; | |||||
import org.springframework.statemachine.config.EnableStateMachine; | |||||
import org.springframework.statemachine.config.StateMachineBuilder; | |||||
import org.springframework.statemachine.persist.DefaultStateMachinePersister; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.statemachine.support.DefaultStateMachineContext; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.EnumSet; | |||||
/** | |||||
* <p> | |||||
* 标段状态机 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:38 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@EnableStateMachine(name = TestValidStateMachineBuilderImpl.MACHINE_ID) | |||||
@RequiredArgsConstructor | |||||
public class TestValidStateMachineBuilderImpl implements TestValidStateMachineBuilder { | |||||
public static final String MACHINE_ID = "testValidStateMachine"; | |||||
private final BeanFactory beanFactory; | |||||
@Override | |||||
public StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> build() throws StateMachineException { | |||||
StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> stateMachine = build(beanFactory); | |||||
log.info("状态机ID:" + stateMachine.getId()); | |||||
stateMachine.start(); | |||||
return stateMachine; | |||||
} | |||||
@Override | |||||
public StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> build(BeanFactory beanFactory) throws StateMachineException { | |||||
try { | |||||
return buildStateMachine(beanFactory); | |||||
} catch (Exception e) { | |||||
throw new StateMachineException("状态机构件失败", e); | |||||
} | |||||
} | |||||
private StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> buildStateMachine(BeanFactory factory) throws Exception { | |||||
StateMachineBuilder.Builder<TestValidStatusEnum, TestValidStateChangeEvent> builder = StateMachineBuilder.builder(); | |||||
builder.configureConfiguration() | |||||
.withConfiguration() | |||||
.machineId(MACHINE_ID) | |||||
.beanFactory(factory); | |||||
builder.configureStates() | |||||
.withStates() | |||||
.initial(TestValidStatusEnum.WITHOUT_TEST_VALID_INFO) | |||||
.states(EnumSet.allOf(TestValidStatusEnum.class)); | |||||
builder.configureTransitions() | |||||
.withExternal() | |||||
.source(TestValidStatusEnum.WITHOUT_TEST_VALID_INFO) | |||||
.target(TestValidStatusEnum.TEST_VALID_INFO_AUDIT) | |||||
.event(TestValidStateChangeEvent.SUBMIT_TEST_VALID_INFO) | |||||
.and() | |||||
.withExternal() | |||||
.source(TestValidStatusEnum.TEST_VALID_INFO_AUDIT) | |||||
.target(TestValidStatusEnum.TEST_VALID_INFO_PASSED) | |||||
.event(TestValidStateChangeEvent.TEST_VALID_INFO_PASSED) | |||||
.and() | |||||
.withExternal() | |||||
.source(TestValidStatusEnum.TEST_VALID_INFO_AUDIT) | |||||
.target(TestValidStatusEnum.TEST_VALID_INFO_FAILED) | |||||
.event(TestValidStateChangeEvent.TEST_VALID_INFO_FAILED) | |||||
.and() | |||||
.withExternal() | |||||
.source(TestValidStatusEnum.TEST_VALID_INFO_FAILED) | |||||
.target(TestValidStatusEnum.TEST_VALID_INFO_AUDIT) | |||||
.event(TestValidStateChangeEvent.RESUBMIT_TEST_VALID_INFO) | |||||
.and(); | |||||
return builder.build(); | |||||
} | |||||
@Override | |||||
@Bean(name = "testValidStatePersister") | |||||
public StateMachinePersister<TestValidStatusEnum, TestValidStateChangeEvent, Purchase> stateMachinePersister() { | |||||
return new DefaultStateMachinePersister<>(new StateMachinePersist<TestValidStatusEnum, TestValidStateChangeEvent, Purchase>() { | |||||
@Override | |||||
public void write(StateMachineContext<TestValidStatusEnum, TestValidStateChangeEvent> context, Purchase contextObj) { | |||||
log.info("当前项目为:{}", contextObj); | |||||
} | |||||
@Override | |||||
public StateMachineContext<TestValidStatusEnum, TestValidStateChangeEvent> read(Purchase contextObj) { | |||||
TestValidStatusEnum testValidStatus = TestValidStatusEnum.get(contextObj.getTestValidStatus()) | |||||
.orElseThrow(() -> BizException.wrap("测试验证状态无效")); | |||||
return new DefaultStateMachineContext<>(testValidStatus, null, null, null, null, MACHINE_ID); | |||||
} | |||||
}); | |||||
} | |||||
} |
@@ -0,0 +1,66 @@ | |||||
package com.hz.pm.api.common.statemachine.event; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* TenderStatusChangeEvent | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 00:14 2024/2/24 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum AdaptStateChangeEvent { | |||||
SUBMIT_ADAPT_INFO(100, null, null), | |||||
ADAPT_INFO_PASSED(101, null, null), | |||||
ADAPT_INFO_FAILED(null, 101, null), | |||||
RESUBMIT_ADAPT_INFO(102, null, null); | |||||
private final Integer passStatusCode; | |||||
private final Integer rejectStatusCode; | |||||
private final Integer withdrawStatusCode; | |||||
public static AdaptStateChangeEvent getPassValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (AdaptStateChangeEvent t : AdaptStateChangeEvent.values()) { | |||||
if (code.equals(t.getPassStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static AdaptStateChangeEvent getRejectValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (AdaptStateChangeEvent t : AdaptStateChangeEvent.values()) { | |||||
if (code.equals(t.getRejectStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static AdaptStateChangeEvent getWithdrawValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (AdaptStateChangeEvent t : AdaptStateChangeEvent.values()) { | |||||
if (code.equals(t.getWithdrawStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,66 @@ | |||||
package com.hz.pm.api.common.statemachine.event; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* SelfTestStateChangeEvent | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 00:14 2024/2/24 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum SelfTestStateChangeEvent { | |||||
SUBMIT_SELF_TEST_INFO(100, null, null), | |||||
SELF_TEST_PASSED(101, null, null), | |||||
SELF_TEST_FAILED(null, 101, null), | |||||
RESUBMIT_SELF_TEST(102, null, null); | |||||
private final Integer passStatusCode; | |||||
private final Integer rejectStatusCode; | |||||
private final Integer withdrawStatusCode; | |||||
public static SelfTestStateChangeEvent getPassValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (SelfTestStateChangeEvent t : SelfTestStateChangeEvent.values()) { | |||||
if (code.equals(t.getPassStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static SelfTestStateChangeEvent getRejectValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (SelfTestStateChangeEvent t : SelfTestStateChangeEvent.values()) { | |||||
if (code.equals(t.getRejectStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static SelfTestStateChangeEvent getWithdrawValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (SelfTestStateChangeEvent t : SelfTestStateChangeEvent.values()) { | |||||
if (code.equals(t.getWithdrawStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,78 @@ | |||||
package com.hz.pm.api.common.statemachine.event; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* TenderStatusChangeEvent | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 00:14 2024/2/24 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum TestValidStateChangeEvent { | |||||
/** | |||||
* 填写测试验证信息 | |||||
*/ | |||||
SUBMIT_TEST_VALID_INFO(100, null, null), | |||||
/** | |||||
* 测试验证信息审核通过 | |||||
*/ | |||||
TEST_VALID_INFO_PASSED(101, null, null), | |||||
/** | |||||
* 测试验证信息审核不通过 | |||||
*/ | |||||
TEST_VALID_INFO_FAILED(null, 101, null), | |||||
/** | |||||
* 重新填写测试验证信息 | |||||
*/ | |||||
RESUBMIT_TEST_VALID_INFO(102, null, null); | |||||
private final Integer passStatusCode; | |||||
private final Integer rejectStatusCode; | |||||
private final Integer withdrawStatusCode; | |||||
public static TestValidStateChangeEvent getPassValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (TestValidStateChangeEvent t : TestValidStateChangeEvent.values()) { | |||||
if (code.equals(t.getPassStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static TestValidStateChangeEvent getRejectValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (TestValidStateChangeEvent t : TestValidStateChangeEvent.values()) { | |||||
if (code.equals(t.getRejectStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
public static TestValidStateChangeEvent getWithdrawValueByCode(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return null; | |||||
} | |||||
for (TestValidStateChangeEvent t : TestValidStateChangeEvent.values()) { | |||||
if (code.equals(t.getWithdrawStatusCode())) { | |||||
return t; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,107 @@ | |||||
package com.hz.pm.api.common.statemachine.util; | |||||
import com.hz.pm.api.common.statemachine.builder.AdaptStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.AdaptStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.wflow.exception.BusinessException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.messaging.support.MessageBuilder; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* 标段状态机工具类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:06 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class AdaptStateMachineUtil { | |||||
public static final String PURCHASE = "purchaseInfo"; | |||||
//================================================================================================================== | |||||
private final AdaptStateMachineBuilder adaptStateMachineBuilder; | |||||
//通过审核 | |||||
public void pass(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getPassEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 通过失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 通过失败: " + e); | |||||
} | |||||
} | |||||
//拒绝 | |||||
public void reject(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getRejectEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 拒绝失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 拒绝失败: " + e); | |||||
} | |||||
} | |||||
//撤回 | |||||
public void withDraw(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getWithdrawEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 撤回失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 撤回失败: " + e); | |||||
} | |||||
} | |||||
public void execute(Purchase purchase, AdaptStateChangeEvent event) throws Exception { | |||||
log.info("调用状态机前的标段状态为:{}", purchase.getStatus()); | |||||
// 获取TO状态机 | |||||
StateMachine<AdaptStatusEnum, AdaptStateChangeEvent> stateMachine = adaptStateMachineBuilder.build(); | |||||
Message<AdaptStateChangeEvent> message = MessageBuilder.withPayload(event) | |||||
.setHeader(PURCHASE, purchase) | |||||
.build(); | |||||
//初始化状态机 | |||||
StateMachinePersister<AdaptStatusEnum, AdaptStateChangeEvent, Purchase> stateMachinePersister = adaptStateMachineBuilder.stateMachinePersister(); | |||||
stateMachinePersister.restore(stateMachine, purchase); | |||||
stateMachine.sendEvent(message); | |||||
log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | |||||
} | |||||
public AdaptStateChangeEvent getPassEvent(Integer status) { | |||||
AdaptStateChangeEvent event = AdaptStateChangeEvent.getPassValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的通过操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public AdaptStateChangeEvent getRejectEvent(Integer status) { | |||||
AdaptStateChangeEvent event = AdaptStateChangeEvent.getRejectValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的驳回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public AdaptStateChangeEvent getWithdrawEvent(Integer status) { | |||||
AdaptStateChangeEvent event = AdaptStateChangeEvent.getWithdrawValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的撤回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
} |
@@ -0,0 +1,107 @@ | |||||
package com.hz.pm.api.common.statemachine.util; | |||||
import com.hz.pm.api.common.statemachine.builder.SelfTestStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.SelfTestStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.SelfTestStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.wflow.exception.BusinessException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.messaging.support.MessageBuilder; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* 标段状态机工具类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:06 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class SelfTestStateMachineUtil { | |||||
public static final String PURCHASE = "purchaseInfo"; | |||||
//================================================================================================================== | |||||
private final SelfTestStateMachineBuilder selfTestStateMachineBuilder; | |||||
//通过审核 | |||||
public void pass(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getPassEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 通过失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 通过失败: " + e); | |||||
} | |||||
} | |||||
//拒绝 | |||||
public void reject(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getRejectEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 拒绝失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 拒绝失败: " + e); | |||||
} | |||||
} | |||||
//撤回 | |||||
public void withDraw(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getWithdrawEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 撤回失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 撤回失败: " + e); | |||||
} | |||||
} | |||||
public void execute(Purchase purchase, SelfTestStateChangeEvent event) throws Exception { | |||||
log.info("调用状态机前的标段状态为:{}", purchase.getStatus()); | |||||
// 获取TO状态机 | |||||
StateMachine<SelfTestStatusEnum, SelfTestStateChangeEvent> stateMachine = selfTestStateMachineBuilder.build(); | |||||
Message<SelfTestStateChangeEvent> message = MessageBuilder.withPayload(event) | |||||
.setHeader(PURCHASE, purchase) | |||||
.build(); | |||||
//初始化状态机 | |||||
StateMachinePersister<SelfTestStatusEnum, SelfTestStateChangeEvent, Purchase> stateMachinePersister = selfTestStateMachineBuilder.stateMachinePersister(); | |||||
stateMachinePersister.restore(stateMachine, purchase); | |||||
stateMachine.sendEvent(message); | |||||
log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | |||||
} | |||||
public SelfTestStateChangeEvent getPassEvent(Integer status) { | |||||
SelfTestStateChangeEvent event = SelfTestStateChangeEvent.getPassValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的通过操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public SelfTestStateChangeEvent getRejectEvent(Integer status) { | |||||
SelfTestStateChangeEvent event = SelfTestStateChangeEvent.getRejectValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的驳回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public SelfTestStateChangeEvent getWithdrawEvent(Integer status) { | |||||
SelfTestStateChangeEvent event = SelfTestStateChangeEvent.getWithdrawValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的撤回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
} |
@@ -0,0 +1,107 @@ | |||||
package com.hz.pm.api.common.statemachine.util; | |||||
import com.hz.pm.api.common.statemachine.builder.TestValidStateMachineBuilder; | |||||
import com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.wflow.exception.BusinessException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.messaging.Message; | |||||
import org.springframework.messaging.support.MessageBuilder; | |||||
import org.springframework.statemachine.StateMachine; | |||||
import org.springframework.statemachine.persist.StateMachinePersister; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* 标段状态机工具类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:06 2024/2/24 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class TestValidStateMachineUtil { | |||||
public static final String PURCHASE = "purchaseInfo"; | |||||
//================================================================================================================== | |||||
private final TestValidStateMachineBuilder testValidStateMachineBuilder; | |||||
//通过审核 | |||||
public void pass(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getPassEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 通过失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 通过失败: " + e); | |||||
} | |||||
} | |||||
//拒绝 | |||||
public void reject(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getRejectEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 拒绝失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 拒绝失败: " + e); | |||||
} | |||||
} | |||||
//撤回 | |||||
public void withDraw(Purchase purchase) { | |||||
try { | |||||
execute(purchase, getWithdrawEvent(purchase.getStatus())); | |||||
} catch (Exception e) { | |||||
log.info("状态机 撤回失败 :{}", e.getMessage()); | |||||
throw new BusinessException("状态机 撤回失败: " + e); | |||||
} | |||||
} | |||||
public void execute(Purchase purchase, TestValidStateChangeEvent event) throws Exception { | |||||
log.info("调用状态机前的标段状态为:{}", purchase.getStatus()); | |||||
// 获取TO状态机 | |||||
StateMachine<TestValidStatusEnum, TestValidStateChangeEvent> stateMachine = testValidStateMachineBuilder.build(); | |||||
Message<TestValidStateChangeEvent> message = MessageBuilder.withPayload(event) | |||||
.setHeader(PURCHASE, purchase) | |||||
.build(); | |||||
//初始化状态机 | |||||
StateMachinePersister<TestValidStatusEnum, TestValidStateChangeEvent, Purchase> stateMachinePersister = testValidStateMachineBuilder.stateMachinePersister(); | |||||
stateMachinePersister.restore(stateMachine, purchase); | |||||
stateMachine.sendEvent(message); | |||||
log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | |||||
} | |||||
public TestValidStateChangeEvent getPassEvent(Integer status) { | |||||
TestValidStateChangeEvent event = TestValidStateChangeEvent.getPassValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的通过操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public TestValidStateChangeEvent getRejectEvent(Integer status) { | |||||
TestValidStateChangeEvent event = TestValidStateChangeEvent.getRejectValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的驳回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
public TestValidStateChangeEvent getWithdrawEvent(Integer status) { | |||||
TestValidStateChangeEvent event = TestValidStateChangeEvent.getWithdrawValueByCode(status); | |||||
if (Objects.isNull(event)) { | |||||
throw new BizException("该状态下没有对应的撤回操作!"); | |||||
} | |||||
return event; | |||||
} | |||||
} |
@@ -3,7 +3,6 @@ package com.hz.pm.api.projectdeclared.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import com.baomidou.mybatisplus.core.toolkit.Assert; | import com.baomidou.mybatisplus.core.toolkit.Assert; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | ||||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | ||||
import com.hz.pm.api.projectdeclared.model.dto.OperationReq; | import com.hz.pm.api.projectdeclared.model.dto.OperationReq; | ||||
@@ -13,7 +12,10 @@ import com.hz.pm.api.projectdeclared.model.vo.OperationVO; | |||||
import com.hz.pm.api.projectdeclared.service.IOperationService; | import com.hz.pm.api.projectdeclared.service.IOperationService; | ||||
import com.hz.pm.api.projectdeclared.service.IPurchaseService; | import com.hz.pm.api.projectdeclared.service.IPurchaseService; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.enumeration.AdaptStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.SelfTestStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.TestValidStatusEnum; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.user.security.model.UserInfoDetails; | import com.hz.pm.api.user.security.model.UserInfoDetails; | ||||
import com.hz.pm.api.user.util.LoginUserUtil; | import com.hz.pm.api.user.util.LoginUserUtil; | ||||
@@ -94,6 +96,9 @@ public class OperationManage { | |||||
} | } | ||||
// 修改标段状态 | // 修改标段状态 | ||||
tenderStateMachineUtil.pass(purchase); | tenderStateMachineUtil.pass(purchase); | ||||
purchase.setSelfTestStatus(SelfTestStatusEnum.WITHOUT_SELF_TEST_INFO.getCode()); | |||||
purchase.setTestValidStatus(TestValidStatusEnum.WITHOUT_TEST_VALID_INFO.getCode()); | |||||
purchase.setAdaptStatus(AdaptStatusEnum.WITHOUT_ADAPT_INFO.getCode()); | |||||
purchaseService.updateById(purchase); | purchaseService.updateById(purchase); | ||||
return curr.getProjectCode(); | return curr.getProjectCode(); | ||||
} | } | ||||
@@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.date.DateUtil; | import cn.hutool.core.date.DateUtil; | ||||
import cn.hutool.core.io.FileUtil; | import cn.hutool.core.io.FileUtil; | ||||
import cn.hutool.core.lang.Assert; | import cn.hutool.core.lang.Assert; | ||||
import cn.hutool.core.util.URLUtil; | |||||
import cn.hutool.http.HttpUtil; | import cn.hutool.http.HttpUtil; | ||||
import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||
import com.alibaba.excel.EasyExcel; | import com.alibaba.excel.EasyExcel; | ||||
@@ -53,18 +52,12 @@ import com.ningdatech.file.service.FileService; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||
import org.springframework.mock.web.MockMultipartFile; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
import org.springframework.web.multipart.MultipartFile; | |||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.net.URL; | |||||
import java.nio.file.Files; | |||||
import java.nio.file.Path; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.time.format.DateTimeFormatter; | import java.time.format.DateTimeFormatter; | ||||
import java.util.*; | import java.util.*; | ||||
@@ -146,5 +146,13 @@ public class Purchase { | |||||
@ApiModelProperty("信创报告") | @ApiModelProperty("信创报告") | ||||
private String xcfhxReportFiles; | private String xcfhxReportFiles; | ||||
@ApiModelProperty("适配改造状态") | |||||
private Integer adaptStatus; | |||||
@ApiModelProperty("系统自测状态") | |||||
private Integer selfTestStatus; | |||||
@ApiModelProperty("测试验证状态") | |||||
private Integer testValidStatus; | |||||
} | } |
@@ -0,0 +1,43 @@ | |||||
package com.hz.pm.api.projectlib.model.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Arrays; | |||||
import java.util.Optional; | |||||
/** | |||||
* <p> | |||||
* SelfTestStatusEnum | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 10:16 2024/3/27 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum AdaptStatusEnum { | |||||
WITHOUT_ADAPT_INFO(100, "待填写适配改造信息"), | |||||
ADAPT_INFO_AUDIT(101, "适配改造信息审核中"), | |||||
ADAPT_INFO_FAILED(102, "适配改造信息审核失败"), | |||||
ADAPT_INFO_PASSED(103, "适配改造信息审核通过"); | |||||
private final Integer code; | |||||
private final String val; | |||||
public boolean eq(Integer code) { | |||||
return this.code.equals(code); | |||||
} | |||||
public static Optional<AdaptStatusEnum> get(Integer code) { | |||||
return Arrays.stream(values()) | |||||
.filter(w -> w.getCode().equals(code)) | |||||
.findFirst(); | |||||
} | |||||
public static String getVal(Integer code) { | |||||
return get(code).flatMap(w -> Optional.of(w.getVal())).orElse(""); | |||||
} | |||||
} |
@@ -0,0 +1,43 @@ | |||||
package com.hz.pm.api.projectlib.model.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Arrays; | |||||
import java.util.Optional; | |||||
/** | |||||
* <p> | |||||
* SelfTestStatusEnum | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 10:16 2024/3/27 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum SelfTestStatusEnum { | |||||
WITHOUT_SELF_TEST_INFO(100, "待填写系统自测信息"), | |||||
SELF_TEST_INFO_AUDIT(101, "系统自测信息审核中"), | |||||
SELF_TEST_INFO_FAILED(102, "系统自测信息审核失败"), | |||||
SELF_TEST_INFO_PASSED(103, "系统自测信息审核通过"); | |||||
private final Integer code; | |||||
private final String val; | |||||
public boolean eq(Integer code) { | |||||
return this.code.equals(code); | |||||
} | |||||
public static Optional<SelfTestStatusEnum> get(Integer code) { | |||||
return Arrays.stream(values()) | |||||
.filter(w -> w.getCode().equals(code)) | |||||
.findFirst(); | |||||
} | |||||
public static String getVal(Integer code) { | |||||
return get(code).flatMap(w -> Optional.of(w.getVal())).orElse(""); | |||||
} | |||||
} |
@@ -0,0 +1,43 @@ | |||||
package com.hz.pm.api.projectlib.model.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import java.util.Arrays; | |||||
import java.util.Optional; | |||||
/** | |||||
* <p> | |||||
* SelfTestStatusEnum | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 10:16 2024/3/27 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
public enum TestValidStatusEnum { | |||||
WITHOUT_TEST_VALID_INFO(100, "待填写测试验证信息"), | |||||
TEST_VALID_INFO_AUDIT(101, "测试验证信息审核中"), | |||||
TEST_VALID_INFO_FAILED(102, "测试验证信息审核失败"), | |||||
TEST_VALID_INFO_PASSED(103, "测试验证信息审核通过"); | |||||
private final Integer code; | |||||
private final String val; | |||||
public boolean eq(Integer code) { | |||||
return this.code.equals(code); | |||||
} | |||||
public static Optional<TestValidStatusEnum> get(Integer code) { | |||||
return Arrays.stream(values()) | |||||
.filter(w -> w.getCode().equals(code)) | |||||
.findFirst(); | |||||
} | |||||
public static String getVal(Integer code) { | |||||
return get(code).flatMap(w -> Optional.of(w.getVal())).orElse(""); | |||||
} | |||||
} |