初始化项目

This commit is contained in:
chenweilong 2022-12-01 15:55:13 +08:00
commit a9a2dc2ce2
18 changed files with 563 additions and 0 deletions

61
pom.xml Normal file
View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>liteflow-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<hutool.version>5.8.4</hutool.version>
<liteflow.version>2.9.3</liteflow.version>
<spring-boot.version>2.7.5</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-rule-sql</artifactId>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-groovy</artifactId>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,48 @@
package com.example.liteflow.mysql;
import cn.hutool.json.JSONUtil;
import com.example.liteflow.mysql.model.CostCenter;
import com.example.liteflow.mysql.model.CostCenterContext;
import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class LiteFlowCommand implements CommandLineRunner {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Resource
private FlowExecutor flowExecutor;
@Override
public void run(String... args) throws Exception {
// 事实对象
CostCenter costCenter = new CostCenter();
costCenter.setSectionClassification("成本科目");
costCenter.setBusinessType("货代");
costCenter.setSalesman("仓干配物流部(物流)");
costCenter.setBusinessCategory("全货船业务");
LiteflowResponse response = flowExecutor.execute2Resp("costCenter", costCenter, CostCenterContext.class);
CostCenterContext costCenterContext = response.getFirstContextBean();
String code = costCenterContext.getCode();
String name = costCenterContext.getName();
String generateCode = costCenterContext.getGenerateCode();
costCenter.setCode(code);
costCenter.setName(name);
costCenter.setGenerateCode(generateCode);
log.info(JSONUtil.toJsonStr(costCenter));
if (response.isSuccess()) {
log.info("执行成功");
} else {
log.info("执行失败");
}
}
}

View File

@ -0,0 +1,14 @@
package com.example.liteflow.mysql;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LiteflowMysqlApplication {
public static void main(String[] args) {
SpringApplication.run(LiteflowMysqlApplication.class, args);
System.out.println("启动成功");
}
}

View File

@ -0,0 +1,21 @@
package com.example.liteflow.mysql.bean;
import com.yomahub.liteflow.script.ScriptBean;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ScriptBean("businessCategory")
public class BusinessCategoryBean {
private List<String> globalBusinessCategoryList;
public void setGlobalBusinessCategoryList(List<String> globalBusinessCategoryList) {
this.globalBusinessCategoryList = globalBusinessCategoryList;
}
public List<String> getGlobalBusinessCategoryList() {
return this.globalBusinessCategoryList;
}
}

View File

@ -0,0 +1,21 @@
package com.example.liteflow.mysql.bean;
import com.yomahub.liteflow.script.ScriptBean;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ScriptBean("globalBusinessType")
public class BusinessTypeBean {
private List<String> globalBusinessTypeList;
public void setGlobalBusinessTypeList(List<String> globalBusinessTypeList) {
this.globalBusinessTypeList = globalBusinessTypeList;
}
public List<String> getGlobalBusinessTypeList() {
return this.globalBusinessTypeList;
}
}

View File

@ -0,0 +1,17 @@
package com.example.liteflow.mysql.bean;
import com.yomahub.liteflow.script.ScriptBean;
import lombok.Data;
import org.springframework.stereotype.Component;
@Component
@ScriptBean("costCenter")
@Data
public class CostCenterBean {
private String costCenter01Code;
private String costCenter01Name;
private String costCenter02Code;
private String costCenter02Name;
}

View File

@ -0,0 +1,21 @@
package com.example.liteflow.mysql.bean;
import com.yomahub.liteflow.script.ScriptBean;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ScriptBean("salesman")
public class SalesmanBean {
private List<String> globalSalesmanList;
public void setGlobalSalesmanList(List<String> globalSalesmanList) {
this.globalSalesmanList = globalSalesmanList;
}
public List<String> getGlobalSalesmanList() {
return this.globalSalesmanList;
}
}

View File

@ -0,0 +1,21 @@
package com.example.liteflow.mysql.bean;
import com.yomahub.liteflow.script.ScriptBean;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ScriptBean("globalSectionClassification")
public class SectionClassificationBean {
private List<String> globalSectionClassificationList;
public void setGlobalSectionClassificationList(List<String> globalSectionClassificationList) {
this.globalSectionClassificationList = globalSectionClassificationList;
}
public List<String> getGlobalSectionClassificationList() {
return this.globalSectionClassificationList;
}
}

View File

@ -0,0 +1,38 @@
package com.example.liteflow.mysql.cmp;
import com.example.liteflow.mysql.bean.BusinessCategoryBean;
import com.example.liteflow.mysql.model.CostCenter;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeIfComponent;
import javax.annotation.Resource;
import java.util.List;
@LiteflowComponent("businessCategory")
public class BusinessCategoryCmp extends NodeIfComponent {
@Resource
private BusinessCategoryBean businessCategoryBean;
// @Override
// public void process() {
// CostCenter requestData = this.getRequestData();
// System.out.println("sectionClassificationCmp executed! ===>>>" + JsonUtil.toJsonString(requestData));
//
// String sectionClassification = requestData.getSectionClassification();
// List<String> globalSectionClassificationList = sectionClassificationBean.getGlobalSectionClassificationList();
// if (globalSectionClassificationList.contains(sectionClassification)) {
//
// }
// }
@Override
public boolean processIf() throws Exception {
CostCenter requestData = this.getRequestData();
System.out.println("BusinessCategoryCmp executed!");
String businessCategory = requestData.getBusinessCategory();
List<String> globalBusinessCategoryList = businessCategoryBean.getGlobalBusinessCategoryList();
return globalBusinessCategoryList.contains(businessCategory);
}
}

View File

@ -0,0 +1,38 @@
package com.example.liteflow.mysql.cmp;
import com.example.liteflow.mysql.bean.BusinessTypeBean;
import com.example.liteflow.mysql.model.CostCenter;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeIfComponent;
import javax.annotation.Resource;
import java.util.List;
@LiteflowComponent("businessType")
public class BusinessTypeCmp extends NodeIfComponent {
@Resource
private BusinessTypeBean businessTypeBean;
// @Override
// public void process() {
// CostCenter requestData = this.getRequestData();
// System.out.println("sectionClassificationCmp executed! ===>>>" + JsonUtil.toJsonString(requestData));
//
// String sectionClassification = requestData.getSectionClassification();
// List<String> globalSectionClassificationList = sectionClassificationBean.getGlobalSectionClassificationList();
// if (globalSectionClassificationList.contains(sectionClassification)) {
//
// }
// }
@Override
public boolean processIf() throws Exception {
CostCenter requestData = this.getRequestData();
System.out.println("BusinessTypeCmp executed!");
String businessType = requestData.getBusinessType();
List<String> globalBusinessTypeList = businessTypeBean.getGlobalBusinessTypeList();
return globalBusinessTypeList.contains(businessType);
}
}

View File

@ -0,0 +1,44 @@
/**
* <p>Title: liteflow</p>
* <p>Description: 轻量级的组件式流程框架</p>
* @author Bryan.Zhang
* @email weenyc31@163.com
* @Date 2020/4/1
*/
package com.example.liteflow.mysql.cmp;
import com.example.liteflow.mysql.bean.SalesmanBean;
import com.example.liteflow.mysql.model.CostCenter;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeIfComponent;
import javax.annotation.Resource;
import java.util.List;
@LiteflowComponent("salesman")
public class SalesmanCmp extends NodeIfComponent {
@Resource
private SalesmanBean salesmanBean;
// @Override
// public void process() {
// CostCenter requestData = this.getRequestData();
// System.out.println("sectionClassificationCmp executed! ===>>>" + JsonUtil.toJsonString(requestData));
//
// String sectionClassification = requestData.getSectionClassification();
// List<String> globalSectionClassificationList = sectionClassificationBean.getGlobalSectionClassificationList();
// if (globalSectionClassificationList.contains(sectionClassification)) {
//
// }
// }
@Override
public boolean processIf() throws Exception {
CostCenter requestData = this.getRequestData();
System.out.println("SalesmanCmp executed!");
String salesman = requestData.getSalesman();
List<String> globalSalesmanList = salesmanBean.getGlobalSalesmanList();
return globalSalesmanList.contains(salesman);
}
}

View File

@ -0,0 +1,45 @@
/**
* <p>Title: liteflow</p>
* <p>Description: 轻量级的组件式流程框架</p>
* @author Bryan.Zhang
* @email weenyc31@163.com
* @Date 2020/4/1
*/
package com.example.liteflow.mysql.cmp;
import com.example.liteflow.mysql.bean.SectionClassificationBean;
import com.example.liteflow.mysql.model.CostCenter;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeIfComponent;
import javax.annotation.Resource;
import java.util.List;
@LiteflowComponent("sectionClassification")
public class SectionClassificationCmp extends NodeIfComponent {
@Resource
private SectionClassificationBean sectionClassificationBean;
// @Override
// public void process() {
// CostCenter requestData = this.getRequestData();
// System.out.println("sectionClassificationCmp executed! ===>>>" + JsonUtil.toJsonString(requestData));
//
// String sectionClassification = requestData.getSectionClassification();
// List<String> globalSectionClassificationList = sectionClassificationBean.getGlobalSectionClassificationList();
// if (globalSectionClassificationList.contains(sectionClassification)) {
//
// }
// }
@Override
public boolean processIf() throws Exception {
CostCenter requestData = this.getRequestData();
System.out.println("sectionClassificationCmp executed!");
String sectionClassification = requestData.getSectionClassification();
List<String> globalSectionClassificationList = sectionClassificationBean.getGlobalSectionClassificationList();
return globalSectionClassificationList.contains(sectionClassification);
}
}

View File

@ -0,0 +1,32 @@
package com.example.liteflow.mysql.cmp;
import cn.hutool.core.util.StrUtil;
import com.example.liteflow.mysql.model.CostCenter;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
@LiteflowComponent("sout")
public class SoutCmp extends NodeComponent {
@Override
public void process() {
CostCenter costCenter = this.getRequestData();
// LinkedHashMap<String, String> map = new LinkedHashMap<>();
// Field[] fields = ReflectUtil.getFields(CostCenter.class);
// for (Field field : fields) {
// Object fieldValue = ReflectUtil.getFieldValue(costCenter, field);
// String name = field.getName();
// map.put(name, fieldValue == null ? null : String.valueOf(fieldValue));
// }
// System.out.println(JsonUtil.toJsonString(map));
String code = costCenter.getCode();
String name = costCenter.getName();
String generateCode = costCenter.getGenerateCode();
if (StrUtil.isBlank(code) && StrUtil.isBlank(name) && StrUtil.isBlank(generateCode)) {
costCenter.setGenerateCode("无匹配项");
}
}
}

View File

@ -0,0 +1,32 @@
package com.example.liteflow.mysql.model;
import lombok.Data;
/**
* @author: 陈韦龙
* @date: 2022年07月06日 12:08
*/
@Data
public class CostCenter {
/**
* 业务类型
*/
private String businessType;
/**
* 业务员
*/
private String salesman;
/**
* 业务类别
*/
private String businessCategory;
/**
* 科目分类
*/
private String sectionClassification;
private String code;
private String name;
private String generateCode;
}

View File

@ -0,0 +1,32 @@
package com.example.liteflow.mysql.model;
import lombok.Data;
/**
* @author: 陈韦龙
* @date: 2022年07月06日 12:08
*/
@Data
public class CostCenterContext {
/**
* 业务类型
*/
private String businessType;
/**
* 业务员
*/
private String salesman;
/**
* 业务类别
*/
private String businessCategory;
/**
* 科目分类
*/
private String sectionClassification;
private String code;
private String name;
private String generateCode;
}

View File

@ -0,0 +1,18 @@
spring.application.name=liteflow-mysql
liteflow.rule-source-ext-data={\
"url":"jdbc:mysql://localhost:3306/test_db",\
"driverClassName":"com.mysql.cj.jdbc.Driver",\
"username":"root",\
"password":"123456",\
"applicationName": "demo",\
"chainTableName": "chain",\
"chainApplicationNameField": "application_name",\
"chainNameField": "chain_name",\
"elDataField": "el_data",\
"scriptTableName": "script",\
"scriptApplicationNameField": "application_name",\
"scriptIdField": "script_id",\
"scriptNameField": "script_name",\
"scriptDataField": "script_data",\
"scriptTypeField": "script_type"
}

View File

@ -0,0 +1,23 @@
spring:
application:
name: liteflow-mysql
liteflow:
rule-source-ext-data-map:
url: jdbc:mysql://localhost:3306/test_db
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 123456
applicationName: demo
#以下是chain表的配置这个一定得有
chainTableName: chain
chainApplicationNameField: application_name
chainNameField: chain_name
elDataField: el_data
#以下是script表的配置如果你没使用到脚本下面可以不配置
scriptTableName: script
scriptApplicationNameField: application_name
scriptIdField: script_id
scriptNameField: script_name
scriptDataField: script_data
scriptTypeField: script_type

37
src/main/resources/db.sql Normal file
View File

@ -0,0 +1,37 @@
create table chain
(
id bigint auto_increment
primary key,
application_name varchar(32) null,
chain_name varchar(32) null,
chain_desc varchar(64) null,
el_data text null,
create_time datetime null
);
create table script
(
id bigint auto_increment
primary key,
application_name varchar(32) null,
script_id varchar(32) null,
script_name varchar(64) null,
script_data text null,
script_type varchar(16) null
);
INSERT INTO `chain`(`id`, `application_name`, `chain_name`, `chain_desc`, `el_data`, `create_time`) VALUES (1, 'demo', 'chain1', '测试流程', 'THEN(s3, s4, s5, s6);', '2022-09-19 19:31:00');
INSERT INTO `chain`(`id`, `application_name`, `chain_name`, `chain_desc`, `el_data`, `create_time`) VALUES (2, 'demo', 'costCenter', '测试流程', 'THEN(s3, s4, s5, s6, IF(sectionClassification, IF(businessType, IF(salesman, IF(businessCategory, s7, s9), s9), s9), IF(businessType, IF(salesman, s8, s9), IF(businessType, s8, s9))));', '2022-11-29 14:58:00');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (1, 'demo', 's1', '脚本s1', 'import cn.hutool.core.date.DateUtil\r\n\r\ndef date = DateUtil.parse(\"2022-10-17 13:31:43\")\r\nprintln(date)\r\ndefaultContext.setData(\"demoDate\", date)\r\n\r\nclass Student {\r\n int studentID\r\n String studentName\r\n}\r\n\r\nStudent student = new Student()\r\nstudent.studentID = 100301\r\nstudent.studentName = \"张三\"\r\ndefaultContext.setData(\"student\",student)\r\n\r\ndef a=3\r\ndef b=2\r\ndefaultContext.setData(\"s1\",a*b)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (2, 'demo', 's2', '脚本s2', 'defaultContext.setData(\"s2\",\"hello\")', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (3, 'demo', 's3', 'sectionClassification', 'def globalSectionClassificationList = [\"汇差\",\"手续费\",\"成本科目\"]\r\nglobalSectionClassification.setGlobalSectionClassificationList(globalSectionClassificationList)\r\n', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (4, 'demo', 's4', 'globalBusinessType', 'def globalBusinessTypeList = [\"货代\",\"报关\",\"船代\",\"散杂货\"]\r\nglobalBusinessType.setGlobalBusinessTypeList(globalBusinessTypeList)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (5, 'demo', 's5', 'salesman', 'def globalSalesmanList = [\"仓干配物流部(物流)\"]\r\nsalesman.setGlobalSalesmanList(globalSalesmanList)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (6, 'demo', 's6', 'businessCategory', 'def globalBusinessCategoryList = [\"全货船业务\",\"进出岛仓干配\"]\r\nbusinessCategory.setGlobalBusinessCategoryList(globalBusinessCategoryList)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (7, 'demo', 's7', 'costCenter01', 'def costCenter01Code = \"P350401028\"\r\ncostCenterContext.setCode(costCenter01Code)\r\n\r\ndef costCenter01Name = \"仓干配物流部利润中心\"\r\ncostCenterContext.setName(costCenter01Name)\r\n\r\ncostCenterContext.setGenerateCode(costCenter01Code + costCenter01Name)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (8, 'demo', 's8', 'costCenter02', 'def costCenter02Code = \"P350401026\"\r\ncostCenterContext.setCode(costCenter02Code)\r\n\r\ndef costCenter02Name = \"商品车物流部利润中心\"\r\ncostCenterContext.setName(costCenter02Name)\r\n\r\ncostCenterContext.setGenerateCode(costCenter02Code + costCenter02Name)', 'script');
INSERT INTO `script`(`id`, `application_name`, `script_id`, `script_name`, `script_data`, `script_type`) VALUES (9, 'demo', 's9', 'sout', 'def defaultName = \"无匹配项\"\r\ncostCenterContext.setGenerateCode(defaultName)', 'script');