Browse Source

fix: 创建营销阶段状态机

gufj 5 months ago
parent
commit
2943868e1e

+ 5 - 0
bound-link-api/blink-base/pom.xml

@@ -49,6 +49,11 @@
             </exclusions>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.statemachine</groupId>
+            <artifactId>spring-statemachine-core</artifactId>
+            <version>3.2.0</version>
+        </dependency>
         <!-- sa-token start -->
         <dependency>
             <groupId>cn.dev33</groupId>

+ 5 - 2
bound-link-api/blink-base/src/main/java/com/cloud/sa/base/common/domain/BaseEntity.java

@@ -2,8 +2,6 @@ package com.cloud.sa.base.common.domain;
 
 import com.cloud.sa.base.common.json.serializer.EmployeeLoginNameVoDeserializer;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.Data;
 
@@ -43,4 +41,9 @@ public class BaseEntity implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime updateTime;
 
+    /**
+     * 删除状态
+     */
+    private Integer deletedFlag;
+
 }

+ 5 - 1
bound-link-api/blink-base/src/main/java/com/cloud/sa/base/module/support/serialnumber/service/SerialNumberBaseService.java

@@ -9,6 +9,8 @@ import com.google.common.collect.Lists;
 import com.cloud.sa.base.module.support.serialnumber.dao.SerialNumberDao;
 import com.cloud.sa.base.module.support.serialnumber.dao.SerialNumberRecordDao;
 import org.apache.commons.lang3.RandomUtils;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
@@ -24,7 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
  * @Author 畅联云: admin
  * @Date 2022-03-25 21:46:07
 
- * 
+ *
  */
 public abstract class SerialNumberBaseService implements SerialNumberService {
 
@@ -91,6 +93,7 @@ public abstract class SerialNumberBaseService implements SerialNumberService {
     public abstract void initLastGenerateData(List<SerialNumberEntity> serialNumberEntityList);
 
     @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
     public String generate(SerialNumberIdEnum serialNumberIdEnum) {
         List<String> generateList = this.generate(serialNumberIdEnum, 1);
         if (generateList == null || generateList.isEmpty()) {
@@ -100,6 +103,7 @@ public abstract class SerialNumberBaseService implements SerialNumberService {
     }
 
     @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
     public List<String> generate(SerialNumberIdEnum serialNumberIdEnum, int count) {
         SerialNumberInfoBO serialNumberInfoBO = serialNumberMap.get(serialNumberIdEnum.getSerialNumberId());
         if (serialNumberInfoBO == null) {

+ 3 - 0
bound-link-api/blink-base/src/main/resources/dev/sa-base.yaml

@@ -129,6 +129,9 @@ logging:
     druid:
       sql:
         Statement: DEBUG
+    org:
+      springframework:
+        statemachine: DEBUG
 # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误)
 server:
   tomcat:

+ 14 - 0
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/constant/MarketStageEvents.java

@@ -0,0 +1,14 @@
+package com.cloud.sa.management.constant;
+
+public enum MarketStageEvents {
+
+    /**
+     * 线索备案
+     */
+    CLUEEVENTS,
+
+    /**
+     * 商机
+     */
+    RISKEVENTS,;
+}

+ 74 - 0
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/constant/MarketStageStates.java

@@ -0,0 +1,74 @@
+package com.cloud.sa.management.constant;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+public enum MarketStageStates {
+
+    CASE("10", "线索"),
+    RISK("20", "商机"),
+    PUBLISH("30", "立项"),
+    BID_ASSESS("40", "投标评审"),
+    BID_MANAGE("50", "投标管理"),
+    BID_WIN_NEWS("60", "中标"),
+    CONTRACT_SIGN("70", "合同签订"),
+    BID_FAILURE("80", "未中标"),
+    ABANDON("90", "放弃跟踪"),
+    ENTER_FAILURE("100", "未入围");
+
+
+    /**
+     * 状态编码
+     */
+    private String status;
+
+    /**
+     * 状态描述
+     */
+    private String desc;
+
+    MarketStageStates(String status, String desc) {
+        this.status = status;
+        this.desc = desc;
+    }
+
+    /**
+     * status是否合法
+     *
+     * @param status
+     * @return
+     */
+    public static boolean isIn(String status) {
+        return Arrays.asList(MarketStageStates.values()).parallelStream().
+                anyMatch(value -> StringUtils.equals(value.status, status));
+    }
+
+    /**
+     * 判断status是否相等
+     *
+     * @param status
+     * @param statusEnum
+     * @return
+     */
+    public static boolean equals(String status, MarketStageStates statusEnum) {
+        return StringUtils.equalsIgnoreCase(status, statusEnum.status);
+
+    }
+
+    /**
+     * status-->statusEnum
+     *
+     * @param status
+     * @return
+     */
+    public static MarketStageStates getEnumByStatus(String status) {
+        Optional<MarketStageStates> statusEnumOptional = Arrays.asList(MarketStageStates.values()).parallelStream()
+                .filter(statusEnum -> StringUtils.equalsIgnoreCase(status, statusEnum.status)).findAny();
+        if (statusEnumOptional.isPresent()) {
+            return statusEnumOptional.get();
+        }
+        return null;
+    }
+}

+ 23 - 4
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/controller/BlinkCustomerController.java

@@ -2,15 +2,15 @@ package com.cloud.sa.management.controller;
 
 import com.cloud.sa.base.common.domain.PageResult;
 import com.cloud.sa.base.common.domain.ResponseDTO;
+import com.cloud.sa.management.constant.MarketStageEvents;
 import com.cloud.sa.management.domain.dto.BlinkCustomerDTO;
 import com.cloud.sa.management.domain.qry.BlinkCustomerQry;
 import com.cloud.sa.management.service.IBlinkCustomerService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.statemachine.StateMachine;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -23,6 +23,8 @@ import javax.validation.Valid;
 @RestController
 @Tag(name = "客户管理")
 public class BlinkCustomerController {
+    @Autowired
+    private StateMachine orderSingleMachine;
 
     @Resource
     private IBlinkCustomerService customerService;
@@ -38,4 +40,21 @@ public class BlinkCustomerController {
     public ResponseDTO<PageResult<BlinkCustomerDTO>> supportsCustomerQueryPage(BlinkCustomerQry qry) {
         return ResponseDTO.ok(customerService.supportsCustomerQueryPage(qry));
     }
+
+    @RequestMapping("/testSingleOrderState")
+    public void testSingleOrderState() throws Exception {
+
+        // 创建流程
+        orderSingleMachine.start();
+
+        // 触发PAY事件
+        orderSingleMachine.sendEvent(MarketStageEvents.CLUEEVENTS);
+
+        // 触发RECEIVE事件
+        orderSingleMachine.sendEvent(MarketStageEvents.RISKEVENTS);
+
+        // 获取最终状态
+        System.out.println("最终状态:" + orderSingleMachine.getState().getId());
+    }
+
 }

+ 0 - 4
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/domain/dataobject/BlinkCustomerDO.java

@@ -178,9 +178,5 @@ public class BlinkCustomerDO extends BaseEntity {
      */
     private String attachment;
 
-    /**
-     * 删除状态
-     */
-    private Integer deletedFlag;
 
 }

+ 0 - 67
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/domain/dto/BlinkCustomerDTO.java

@@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -196,70 +195,4 @@ public class BlinkCustomerDTO extends BaseEntity {
     @JsonDeserialize(using = FileKeyVoDeserializer.class)
     @JsonSerialize(using = FileKeyVoSerializer.class)
     private String attachment;
-
-    /**
-     * 项目数量
-     */
-    private String itemQuantity;
-
-    /**
-     * 收款金额
-     */
-    private BigDecimal collectedAmount;
-
-    /**
-     * 开票金额
-     */
-    private BigDecimal invoiceAmount;
-
-    /**
-     * 合同数量
-     */
-    private Long contractQuantity;
-
-    /**
-     * 累计产值
-     */
-    private BigDecimal totalOutputValue;
-
-    /**
-     * 未开票金额
-     */
-    private BigDecimal unlicensedAmount;
-
-
-    public BigDecimal getCollectedAmount() {
-        if (collectedAmount == null) {
-            return BigDecimal.ZERO;
-        }
-        return collectedAmount;
-    }
-
-    public BigDecimal getInvoiceAmount() {
-        if (invoiceAmount == null) {
-            return BigDecimal.ZERO;
-        }
-        return invoiceAmount;
-    }
-
-    public BigDecimal getTotalOutputValue() {
-        if (totalOutputValue == null) {
-            return BigDecimal.ZERO;
-        }
-        return totalOutputValue;
-    }
-
-    public BigDecimal getUnlicensedAmount() {
-        if (unlicensedAmount == null) {
-            return BigDecimal.ZERO;
-        }
-        return unlicensedAmount;
-    }
-
-    public Long getContractQuantity() {
-        if (contractQuantity == null) {
-            return 0L;
-        }
-        return contractQuantity;
-    }
 }

+ 39 - 0
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/manager/MarketSingleEventListeners.java

@@ -0,0 +1,39 @@
+package com.cloud.sa.management.manager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.statemachine.annotation.OnTransition;
+import org.springframework.statemachine.annotation.WithStateMachine;
+
+/**
+ * 监听器
+ */
+@WithStateMachine
+public class MarketSingleEventListeners {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 当前状态CASE
+     */
+    @OnTransition(target = "CASE")
+    public void create() {
+        System.out.println("---订单创建,待支付---");
+    }
+
+    /**
+     * CASE->RISK 执行的动作
+     */
+    @OnTransition(source = "CASE", target = "RISK")
+    public void pay() {
+        System.out.println("---用户完成支付,待收货---");
+    }
+
+    /**
+     * RISK->PUBLISH 执行的动作
+     */
+    @OnTransition(source = "RISK", target = "PUBLISH")
+    public void receive() {
+        System.out.println("---用户已收货,订单完成---");
+    }
+
+}

+ 34 - 0
bound-link-api/blink-management/src/main/java/com/cloud/sa/management/manager/StateMachineConfig.java

@@ -0,0 +1,34 @@
+package com.cloud.sa.management.manager;
+
+import com.cloud.sa.management.constant.MarketStageEvents;
+import com.cloud.sa.management.constant.MarketStageStates;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.statemachine.config.EnableStateMachine;
+import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
+import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
+import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
+
+import java.util.EnumSet;
+
+@Configuration
+@EnableStateMachine
+public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<MarketStageStates, MarketStageEvents> {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void configure(StateMachineStateConfigurer<MarketStageStates, MarketStageEvents> states) throws Exception {
+        logger.info("开始进入配置文件");
+        states.withStates().initial(MarketStageStates.CASE).states(EnumSet.allOf(MarketStageStates.class));
+    }
+
+    @Override
+    public void configure(StateMachineTransitionConfigurer<MarketStageStates, MarketStageEvents> transitions) throws Exception {
+        logger.info("第二次进入配置文件");
+        transitions.withExternal().source(MarketStageStates.CASE).target(MarketStageStates.RISK).event(MarketStageEvents.CLUEEVENTS).and()
+                .withExternal().source(MarketStageStates.RISK).target(MarketStageStates.PUBLISH).event(MarketStageEvents.RISKEVENTS);
+    }
+}
+