# 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/)