# membership-liteflow
**Repository Path**: ismartyx/membership-liteflow
## Basic Information
- **Project Name**: membership-liteflow
- **Description**: 本项目使用LiteFlow规则引擎实现会员管理系统的核心业务逻辑,通过组件化设计和XML规则配置,实现了**高度灵活、易于维护**的业务流程管理。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-12-04
- **Last Updated**: 2025-12-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 会员管理系统 - LiteFlow规则引擎设计
## 项目概述
本项目使用LiteFlow规则引擎实现会员管理系统的核心业务逻辑,通过组件化设计和XML规则配置,实现了**高度灵活、易于维护**的业务流程管理。
### 核心优势
✅ **规则与代码分离** - 业务规则在XML中配置,无需修改Java代码
✅ **组件可重写** - 每个组件都可以独立重写,不影响其他组件
✅ **流程可编排** - 通过修改XML即可调整业务流程顺序
✅ **热更新支持** - 规则文件修改后自动生效,无需重启应用
✅ **易于扩展** - 新增业务场景只需添加新组件和规则链
---
## 业务需求实现
### 1. 订单管理
#### 功能特性
- **订单状态**:未缴费(UNPAID)、已缴费(PAID)、已退费(REFUNDED)
- **查询条件**:订单时间、金额、会员信息(手机号、身份证号、姓名)
- **退费功能**:管理端按照订单金额进行退费
#### 相关组件
```
ValidateOrderComponent - 订单验证
QueryHistoryOrdersComponent - 查询历史订单
CalculateOrderAmountComponent - 计算订单金额
CreateOrderComponent - 创建订单
CheckRefundEligibilityComponent - 检查退费资格
CalculateRefundAmountComponent - 计算退费金额
ProcessRefundComponent - 处理退费
```
#### 规则链
```xml
```
---
### 2. 会龄计算
#### 功能特性
**累计会龄**:从今天往前推,所有会员类型总时长相加(月份)
**连续会龄**:从今天往前推,所有会员类型的不断的、连续的时长(月份)
#### 计算规则
- 按照交费时间的自然日计算月份
- 例如:2024年5月5日缴纳会员费
- 2024年6月4日:显示会龄为 **0个月**
- 2024年6月5日:显示会龄为 **1个月**
#### 相关组件
```
CalculateTotalTenureComponent - 计算累计会龄
CalculateContinuousTenureComponent - 计算连续会龄
UpdateMemberTenureComponent - 更新会员会龄
```
#### 规则链
```xml
```
---
### 3. 会员升级
#### 功能特性
- **升级定义**:非专科会员通过交费变成专科会员
- **补缴差额**:
- 学生会员 → 专科会员:补缴 **70元**
- 普通会员 → 专科会员:补缴 **50元**
- **时间延续**:补缴会改变当前订单时间范围内的会员身份,并延续该订单的会员时间周期
#### 业务规则
- 不存在会员降级降档
- 只能断交,断交期间丢失会员身份
#### 相关组件
```
CheckUpgradeEligibilityComponent - 检查升级资格
CalculateUpgradeDifferenceComponent - 计算升级差额
ProcessUpgradeComponent - 处理升级
```
#### 规则链
```xml
```
---
### 4. 委员费管理
#### 功能特性
**分支机构委员**【一届三年】标准:**300元**
**多学科分会委员**【一届四年】标准:**400元**
#### 业务规则
1. **缴纳条件**:当会员连续缴纳多次会员费,成为多年会员时,可点击《缴纳委员费》按钮
2. **时间计算**:
- 无论当前订单时间范围内还剩下多少时间
- 直接以交费时间为起点
- 计算三年/四年后的时间为终点
3. **费用抵扣**:
- 当前订单时间的费用减免掉【当前已计算好】
- 后续还没生效的订单,进行费用抵扣
4. **重复申请**:
- 成为委员后,**半年内**再次申请成为委员,**无需再次缴纳费用**
- 半年后,申请成为另一个分支机构的委员,需补缺漏年(待客户确认)
#### 相关组件
```
CheckCommitteeEligibilityComponent - 检查委员资格
CalculateCommitteeFeeComponent - 计算委员费
CalculateCommitteeDeductionComponent - 计算委员费抵扣
ProcessCommitteeFeeComponent - 处理委员费
```
#### 规则链
```xml
```
---
## 如何实现"只需重写组件规则"
### 设计理念
本系统采用**组件化 + 规则编排**的设计模式,实现了业务逻辑的高度解耦:
```
业务需求变更
↓
只需重写对应组件
↓
不影响其他组件
↓
不需要修改流程编排
```
### 实现方式
#### 1. 组件独立性
每个组件都是独立的Java类,继承自LiteFlow的`NodeComponent`:
```java
@Component("calculateOrderAmount")
public class CalculateOrderAmountComponent extends NodeComponent {
@Override
public void process() {
// 业务逻辑
}
}
```
**重写方式**:创建新类,使用相同的组件ID,Spring会自动替换
```java
@Component("calculateOrderAmount")
public class NewCalculateOrderAmountComponent extends NodeComponent {
@Override
public void process() {
// 新的业务逻辑
}
}
```
#### 2. 规则可配置
所有业务流程在`flow.xml`中配置,修改流程无需改代码:
```xml
```
#### 3. 上下文传递
使用`MembershipContext`在组件间传递数据,组件之间不直接依赖:
```java
public class MembershipContext {
private Member member;
private BigDecimal payableAmount;
private Integer totalTenureMonths;
// ... 更多字段
}
```
#### 4. 条件判断组件
使用IF组件实现条件分支,规则清晰可见:
```java
@Component("allowUpgradeCondition")
public class AllowUpgradeIfCondition extends NodeIfComponent {
@Override
public boolean processIf() throws Exception {
MembershipContext context = this.getContextBean(MembershipContext.class);
return Boolean.TRUE.equals(context.getAllowUpgrade());
}
}
```
---
## 修改示例
### 场景1:修改会员价格
**需求**:学生会员从100元改为80元
**修改方式**:只需重写`CalculateOrderAmountComponent`
```java
@Component("calculateOrderAmount")
public class NewCalculateOrderAmountComponent extends NodeComponent {
@Override
public void process() {
MembershipContext context = this.getContextBean(MembershipContext.class);
String memberType = context.getTargetMemberType();
BigDecimal amount = BigDecimal.ZERO;
switch (memberType) {
case "STUDENT":
amount = new BigDecimal("80"); // 修改这里
break;
case "NORMAL":
amount = new BigDecimal("120");
break;
case "SPECIALIST":
amount = new BigDecimal("170");
break;
}
context.setPayableAmount(amount);
context.setSuccess(true);
}
}
```
**影响范围**:仅此组件,其他组件不受影响
---
### 场景2:修改会龄计算规则
**需求**:只计算专科会员的会龄
**修改方式**:只需重写`CalculateTotalTenureComponent`
```java
@Component("calculateTotalTenure")
public class SpecialistTenureComponent extends NodeComponent {
@Override
public void process() {
MembershipContext context = this.getContextBean(MembershipContext.class);
List historyOrders = context.getHistoryOrders();
int totalMonths = 0;
for (MemberOrder order : historyOrders) {
// 只计算专科会员
if ("PAID".equals(order.getStatus())
&& "SPECIALIST".equals(order.getMemberType())) {
// 计算月份...
}
}
context.setTotalTenureMonths(totalMonths);
}
}
```
**影响范围**:仅此组件,流程编排不变
---
### 场景3:增加新的业务流程
**需求**:增加会员续费流程
**修改方式**:
1. 创建新组件
```java
@Component("renewMembership")
public class RenewMembershipComponent extends NodeComponent {
@Override
public void process() {
// 续费逻辑
}
}
```
2. 在`flow.xml`中添加新规则链
```xml
```
**影响范围**:完全独立,不影响现有流程
---
## 组件清单
### 订单管理组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| validateOrder | ValidateOrderComponent | 订单验证 | 验证逻辑、验证条件 |
| queryHistoryOrders | QueryHistoryOrdersComponent | 查询历史订单 | 查询条件、排序方式 |
| calculateOrderAmount | CalculateOrderAmountComponent | 计算订单金额 | 金额计算逻辑、会员类型价格 |
| createOrder | CreateOrderComponent | 创建订单 | 订单创建逻辑、订单编号生成规则 |
### 会龄计算组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| calculateTotalTenure | CalculateTotalTenureComponent | 计算累计会龄 | 计算逻辑、会员类型筛选条件 |
| calculateContinuousTenure | CalculateContinuousTenureComponent | 计算连续会龄 | 计算逻辑、连续性判断条件 |
| updateMemberTenure | UpdateMemberTenureComponent | 更新会员会龄 | 更新逻辑、存储方式 |
### 升级管理组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| checkUpgradeEligibility | CheckUpgradeEligibilityComponent | 检查升级资格 | 升级条件、会员类型限制 |
| calculateUpgradeDifference | CalculateUpgradeDifferenceComponent | 计算升级差额 | 差额计算逻辑、不同会员类型的差价 |
| processUpgrade | ProcessUpgradeComponent | 处理升级 | 升级处理逻辑、订单更新方式 |
### 委员费管理组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| checkCommitteeEligibility | CheckCommitteeEligibilityComponent | 检查委员资格 | 资格检查条件、时间限制 |
| calculateCommitteeFee | CalculateCommitteeFeeComponent | 计算委员费 | 费用标准、委员类型价格 |
| calculateCommitteeDeduction | CalculateCommitteeDeductionComponent | 计算委员费抵扣 | 抵扣计算逻辑、抵扣顺序 |
| processCommitteeFee | ProcessCommitteeFeeComponent | 处理委员费 | 委员记录创建逻辑、任期计算方式 |
### 退费管理组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| checkRefundEligibility | CheckRefundEligibilityComponent | 检查退费资格 | 退费条件、退费限制 |
| calculateRefundAmount | CalculateRefundAmountComponent | 计算退费金额 | 退费金额计算逻辑、退费比例 |
| processRefund | ProcessRefundComponent | 处理退费 | 退费处理逻辑、状态更新方式 |
### 条件判断组件
| 组件ID | 组件类 | 功能 | 可重写内容 |
|--------|--------|------|-----------|
| allowUpgradeCondition | AllowUpgradeIfCondition | 允许升级条件 | 升级条件判断逻辑 |
| allowCommitteeFeeCondition | AllowCommitteeFeeIfCondition | 允许缴纳委员费条件 | 委员费缴纳条件判断逻辑 |
| allowRefundCondition | AllowRefundIfCondition | 允许退费条件 | 退费条件判断逻辑 |
---
## 项目结构
```
liteFlow/
├── src/main/
│ ├── java/com/membership/
│ │ ├── component/ # LiteFlow组件
│ │ │ ├── order/ # 订单管理组件
│ │ │ ├── tenure/ # 会龄计算组件
│ │ │ ├── upgrade/ # 升级管理组件
│ │ │ ├── committee/ # 委员费管理组件
│ │ │ ├── refund/ # 退费管理组件
│ │ │ └── condition/ # 条件判断组件
│ │ ├── context/ # 上下文
│ │ │ └── MembershipContext.java
│ │ ├── entity/ # 实体类
│ │ │ ├── Member.java
│ │ │ ├── MemberOrder.java
│ │ │ └── CommitteeMember.java
│ │ ├── service/ # 服务层
│ │ │ └── MembershipFlowService.java
│ │ └── MembershipApplication.java
│ └── resources/
│ ├── config/
│ │ └── flow.xml # LiteFlow规则配置
│ └── application.yml # 应用配置
├── pom.xml # Maven依赖
└── README.md # 本文档
```
---
## 快速开始
### 1. 环境要求
- JDK 1.8+
- Maven 3.6+
- MySQL 5.7+
### 2. 配置数据库
修改`application.yml`中的数据库连接:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/membership
username: your_username
password: your_password
```
### 3. 启动应用
```bash
mvn clean install
mvn spring-boot:run
```
### 4. 使用示例
#### 4.1 服务层调用
```java
@Autowired
private MembershipFlowService flowService;
// 创建订单
Member member = new Member();
member.setId(1L);
MembershipContext context = flowService.createOrder(member, "STUDENT");
// 会员升级
context = flowService.upgradeMember(member, "SPECIALIST");
// 计算会龄
context = flowService.calculateTenure(member);
// 缴纳委员费
context = flowService.payCommitteeFee(member, "BRANCH", "心血管分会");
```
#### 4.2 REST API接口
已提供完整的Controller层,支持以下REST API:
**1. 创建订单**
```bash
POST http://localhost:19080/api/membership/order/create
参数: memberId=1&memberType=STUDENT
```
**2. 会员升级**
```bash
POST http://localhost:19080/api/membership/upgrade
参数: memberId=1&targetMemberType=SPECIALIST
```
**3. 计算会龄**
```bash
GET http://localhost:19080/api/membership/tenure/calculate
参数: memberId=1
```
**4. 缴纳委员费**
```bash
POST http://localhost:19080/api/membership/committee/pay
参数: memberId=1&committeeType=BRANCH&committeeName=心血管分会
```
**5. 测试演示(完整流程)**
```bash
GET http://localhost:19080/api/membership/test/demo
```
**响应格式**:
```json
{
"success": true,
"message": "操作成功",
"data": {
"member": {...},
"totalTenure": 12,
"continuousTenure": 12
}
}
```
---
## 待确认问题
以下问题需要与客户确认:
1. ❓ **是否需要开票功能?**
- 如需要,需要增加发票管理相关组件
2. ❓ **会龄计算范围**
- 是专科会员还是所有类型的会员?
- 当前实现:所有类型会员
3. ❓ **委员重复申请规则**
- 半年后申请成为另一个分支机构的委员,是补缺漏年还是重新计算?
- 当前实现:待确认后补充
---
## 扩展建议
### 1. 数据库集成
当前组件中的数据库操作使用TODO标记,需要:
- 实现Mapper接口
- 集成MyBatis Plus
- 添加事务管理
### 2. 接口层
✅ **已实现Controller层**:
- ✅ RESTful API设计
- ✅ 统一响应格式
- ⏳ 参数验证(建议添加@Valid注解)
- ⏳ 统一异常处理(建议添加@ControllerAdvice)
- ⏳ 接口文档(建议集成Swagger/Knife4j)
### 3. 监控与日志
- 添加LiteFlow执行监控
- 增强业务日志记录
- 集成链路追踪
### 4. 测试
- 单元测试(JUnit)
- 组件测试
- 流程测试
- 集成测试
---
## 总结
本系统通过LiteFlow规则引擎实现了:
✅ **业务规则外部化** - 规则在XML中配置,易于理解和修改
✅ **组件高度解耦** - 每个组件独立,互不影响
✅ **流程灵活编排** - 通过XML调整流程,无需改代码
✅ **易于维护扩展** - 新增或修改功能只需重写对应组件
✅ **支持热更新** - 规则修改后自动生效
**核心价值**:无论业务规则如何变化,您只需要重写对应的组件,而不需要修改整个系统架构和流程编排!
---
## 技术支持
如有问题,请参考:
- [LiteFlow官方文档](https://liteflow.yomahub.com/)
- [Spring Boot官方文档](https://spring.io/projects/spring-boot)
- [MyBatis Plus官方文档](https://baomidou.com/)