**项目名称**:布莱迪压力表型号自动分类助手
**版本号**:V1.4 (Final Revised for Sanitary-Spray)
**文档日期**:2026-02-11
## 1. 业务需求部分
### 1.1. 核心目标
通过VBA程序,读取Excel中的选型代码,解析字符串结构,输出对应的8大产品分类。
### 1.2. 关键业务逻辑修正
- **数据结构差异**:
- **普通法兰表**:`表头 | ... | 法兰隔膜` (喷涂标记 `P` 在法兰段末尾,如 `FBP`)。
- **卫生型表**:`表头 | ...` (无独立法兰段,型号 `F6A/F6B` 位于表头)。
- **卫生型喷涂规则**:由于卫生型没有独立的法兰段,其喷涂标记 `P` 会直接附着在卫生型代码上(即 `F6AP` 或 `F6BP`),出现在 **表头** 中。
### 1.3. 目标分类与优先级(逻辑判定漏斗)
程序必须严格按照以下顺序(1 -> 9)进行判断。
| **优先级** | **分类名称** | **判定逻辑 (Business Rules)** | **备注** |
| ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| **1** | **喷涂产品** | **复合条件判断(满足任一即属于喷涂)**:
1. **法兰段判定**:若存在法兰隔膜段(通常是最后一段),且该段代码**后缀**为 `P`(如 `FBP`)。
2. **表头段判定**:表头中包含 `F6AP` 或 `F6BP`(即卫生型代码后带P)。 | **最高优先级**。
确保无论是普通法兰还是卫生型,只要带喷涂工艺,均归为此类。 |
| **2** | **卫生型隔膜表** | **检查对象**:Head (表头部分)。
**规则**:包含子字符串 `F6A` 或 `F6B`。
**逻辑**:因 `F6AP/BP` 已在第1步被截获,此处只会捕获**非喷涂**的卫生型。 | 无法兰段结构。 |
| **3** | **隔膜表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `P` 开头。
**示例**:`PYTHN...` 或 `PYX...`。 | 优先于电接点。`PYX` 归为此类。 |
| **4** | **差压表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `YC` 开头。 | |
| **5** | **膜盒压力表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `YE` 开头。 | |
| **6** | **精密压力表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `YB` 开头。 | |
| **7** | **电接点压力表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `YX` 开头。 | 此时已排除 `PYX`。 |
| **8** | **常规表** | **检查对象**:Head (表头部分)的主型号。
**规则**:主型号以 `Y` 开头,且不匹配上述 YC/YE/YB/YX。 | |
| **9** | **其他** | **规则**:不满足以上任何条件(含 `B` 开头的膜片表)。 | |
---
## 2. 技术规格说明 (Technical Specifications)
### 2.1. 架构设计原则
- **解耦 (Decoupling)**:将“Excel操作”与“业务分类逻辑”完全分离。
- **Excel操作层**:负责读取数据、写入数据、界面交互。
- **业务逻辑层**:纯VBA类,不依赖任何 `Range` 或 `Worksheet` 对象,只接收字符串,返回分类结果。
- **性能优化 (Performance)**:
- 禁止在循环中读写单元格。
- 使用 `Variant` 数组一次性读取所有数据 (`Range.Value2`)。
- 在内存中进行数组循环处理。
- 一次性将结果数组写回 Excel (`Range.Resize(...).Value = resultArr`)。
### 2.2. 项目目录结构
```
Project Root
├── VBA
│ ├── Modules
│ │ ├── MainModule.bas ' 入口模块:负责调用、数组读写、性能计时
│ │ └── TestModule.bas ' 测试模块:负责对逻辑类进行单元测试
│ └── ClassModules
│ └── GaugeClassifier.cls ' 核心业务类:封装所有判定逻辑
```
### 2.3. 接口定义 (Interface Specifications)
#### A. 类模块:`GaugeClassifier`
该类只负责“给一个字符串,还一个分类名称”。
**Method: `Classify(modelString As String) As String`**
- **功能**:输入单个型号字符串,根据业务规则返回分类名称。
- **输入**:
- `modelString` (String): 完整的选型代码 (例如 `"PYTH-100...|..."`)。
- **输出**:
- (String): 分类名称 (例如 `"喷涂产品"`, `"常规表"` 等)。
- **内部逻辑**:实现上述 1-9 的判定漏斗。
- **辅助私有函数 (Private Helper Functions)**:
- `GetHead(fullString)`: 提取表头。
- `GetFlange(fullString)`: 提取法兰部分。
- `IdentifySpray(flangeString)`: 判定是否喷涂。
- `IdentifySanitary(headString)`: 判定是否卫生型。
#### B. 标准模块:`MainModule`
该模块负责与Excel交互。
**Sub: `RunClassification()`**
- **功能**:用户点击按钮后的主入口。
- **流程**:
1. 确定数据范围(假设数据在活动工作表的 A 列,从 A2 开始)。
2. 读取 `Range("A2:A" & lastRow).Value2` 到内存数组 `DataArr`。
3. 创建 `GaugeClassifier` 类的实例。
4. 声明结果数组 `ResultArr`。
5. **循环**遍历 `DataArr`:
- 调用 `GaugeClassifier.Classify(DataArr(i, 1))`。
- 将返回值存入 `ResultArr`。
6. 将 `ResultArr` 一次性写入 B 列。
7. 提示完成。
#### C. 标准模块:`TestModule`
该模块用于开发阶段的验证。
**Sub: `TestClassifierLogic()`**
- **功能**:不打开Excel也能验证逻辑是否正确。
- **实现**:
- 构造一组典型的测试用例(Dictionary 或 Array),包含【输入字符串】和【期望分类】。
- `TestCase 1`: 输入 `"PYTH...F6B...|FBP..."`, 期望 `"喷涂产品"` (验证优先级)。
- `TestCase 2`: 输入 `"PYTH...F6B..."`, 期望 `"卫生型隔膜表"`。
- `TestCase 3`: 输入 `"BF-100..."`, 期望 `"其他"`。
- `Assert` 实际输出是否等于期望输出,打印测试报告到立即窗口 (Immediate Window)。
---
### 3. 开发测试用例 (Test Cases)
```
输入型号 预期分类
PYTH-100.A0.531.M201.M02|BP-088.2312.M02.0A3|FBP-251040.RF1.049.13.M20F.B.DPA 喷涂产品
PYTH-063.A0.513.M05.U38.F6A.K15.1.1|BP-058.1509.M05.BB2.F6 卫生型隔膜表
PYTH-063.A0.513.M05.U38.F6BP.K15.1.1|BP-058.1509.M05.BB2.F6 喷涂产品
PYTH-063.A0.513.M201.M09|BP-058.1509.M09.0A2|FC-1520.RF1.033.1.M20F.B.DPA 隔膜表
PYXHN-100.A0.531.M201.M09.H4|BP-088.2518.M09.0A3.YXH|F5.M42M.M20F.030.3.033.1.B 隔膜表
YCSH-100.A0.531.M201.M07|BP-088.2312.M07.0A3.YCS 差压表
YE-070.A0.204.G144.K21|BP-058.1509.K21.0A2 膜盒压力表
YB-120.A0.407.Z144.M23|BP-110.5250.P60.0A5 精密压力表
YX-100.A0.200.M204.M16.H4|BP-098.0088.M16.0A3.YX 电接点压力表
Y-040.Z0.200.M104.M07|BP-037.1007.M07.0A2 常规表
Y-100.BT.200.M204.M12|BP-098.0088.B17.PA3 常规表
```