Add product requirement and technical specification documents, and BLDI pressure gauge product selection catalog. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
172 lines
8.6 KiB
Markdown
172 lines
8.6 KiB
Markdown
**项目名称**:布莱迪压力表型号自动分类助手
|
||
|
||
**版本号**: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** | **喷涂产品** | **复合条件判断(满足任一即属于喷涂)**:<br><br> <br><br>1. **法兰段判定**:若存在法兰隔膜段(通常是最后一段),且该段代码**后缀**为 `P`(如 `FBP`)。<br><br> <br><br>2. **表头段判定**:表头中包含 `F6AP` 或 `F6BP`(即卫生型代码后带P)。 | **最高优先级**。<br><br> <br><br>确保无论是普通法兰还是卫生型,只要带喷涂工艺,均归为此类。 |
|
||
| **2** | **卫生型隔膜表** | **检查对象**:Head (表头部分)。<br><br> <br><br>**规则**:包含子字符串 `F6A` 或 `F6B`。<br><br> <br><br>**逻辑**:因 `F6AP/BP` 已在第1步被截获,此处只会捕获**非喷涂**的卫生型。 | 无法兰段结构。 |
|
||
| **3** | **隔膜表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `P` 开头。<br><br> <br><br>**示例**:`PYTHN...` 或 `PYX...`。 | 优先于电接点。`PYX` 归为此类。 |
|
||
| **4** | **差压表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `YC` 开头。 | |
|
||
| **5** | **膜盒压力表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `YE` 开头。 | |
|
||
| **6** | **精密压力表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `YB` 开头。 | |
|
||
| **7** | **电接点压力表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `YX` 开头。 | 此时已排除 `PYX`。 |
|
||
| **8** | **常规表** | **检查对象**:Head (表头部分)的主型号。<br><br> <br><br>**规则**:主型号以 `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 常规表
|
||
``` |