lingmin_package@163.com aa58c429df feat(时效性):添加时效性测试 1 settimana fa
..
README.md aa58c429df feat(时效性):添加时效性测试 1 settimana fa
TEST_CASES.md aa58c429df feat(时效性):添加时效性测试 1 settimana fa
standard_dao.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
standard_service.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
standard_timeliness_new.md aa58c429df feat(时效性):添加时效性测试 1 settimana fa
test_app.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
test_standard_matching.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
test_standard_matching_rules.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
test_user_standards.py aa58c429df feat(时效性):添加时效性测试 1 settimana fa
施工方案审查流程图.svg aa58c429df feat(时效性):添加时效性测试 1 settimana fa

README.md

标准库匹配规则系统 - 内存处理版本

基于 standard_timeliness_new.md 文档实现的标准库时效性审查系统,采用内存数据处理架构。

架构设计

┌─────────────────────────────────────────────────────────────┐
│                    StandardMatchingService                   │
│                      (对外服务接口)                           │
└───────────────────────┬─────────────────────────────────────┘
                        │
        ┌───────────────┴───────────────┐
        │                               │
┌───────▼────────┐            ┌────────▼────────┐
│StandardRepository│          │ StandardMatcher │
│   (数据仓库)    │            │   (匹配逻辑)     │
└───────┬────────┘            └─────────────────┘
        │
┌───────▼────────┐
│   MySQL DAO    │
│  (一次性加载)   │
└────────────────┘

核心组件

组件 职责 说明
StandardRepository 内存数据存储和索引 加载数据后建立多索引加速查询
StandardMatcher 匹配规则逻辑 纯内存匹配,无数据库访问
StandardMatchingService 对外服务接口 统一入口,管理数据加载
StandardDAO 数据库访问 只负责一次性加载所有数据

文件结构

utils_test/standard_new_Test/
├── standard_dao.py              # 数据访问层(一次性加载)
├── standard_service.py          # 核心业务逻辑(内存处理)
│   ├── StandardRepository       # 数据仓库类
│   ├── StandardMatcher          # 匹配器类
│   └── StandardMatchingService  # 服务类
├── test_app.py                  # 实际调用测试
├── test_standard_matching.py    # 单元测试
└── README.md                    # 说明文档

标准库数据结构

字段 说明
id 序号
standard_number 标准号
standard_name (chinese_name) 标准名称
validity 时效性 (XH-现行, SX-试行, FZ-废止)

五种匹配结果状态

情况 条件 process_result status_code final_result
1 名称+标准号都匹配,现行/试行 状态正常 OK 无问题
2 名称+标准号都匹配,废止,有现行替代 状态被替代 SUBSTITUTED 《标准》(号)已废止,替代《标准》(号)
3 名称+标准号都匹配,废止,无替代 状态废止无现行 ABOLISHED 《标准》(号)已废止,无现行状态
4 名称或标准号只有一个匹配 不匹配 MISMATCH 《提取》(号)与实际《标准》(号)不匹配
5 都不匹配 标准库不存在 NOT_FOUND 《标准》(号)标准库不存在,请确认

使用方法

1. 初始化服务(一次性加载数据到内存)

from utils_test.standard_new_Test.standard_service import StandardMatchingService

# Mock 模式(无需数据库)
service = StandardMatchingService(db_pool=None)
await service.initialize()

# 真实数据库模式
from foundation.database.base.sql.async_mysql_conn_pool import AsyncMySQLPool
db_pool = AsyncMySQLPool()
await db_pool.initialize()
service = StandardMatchingService(db_pool=db_pool)
await service.initialize()  # 从MySQL加载所有数据到内存

2. 单个标准检查

result = service.check_single(
    seq_no=1,
    standard_name="铁路桥涵设计规范",
    standard_number="TB 10002-2017"
)

print(f"状态: {result.status_code}")  # OK
print(f"结果: {result.final_result}")  # 无问题

3. 批量检查

standards = [
    {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
    {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
]

results = service.check_standards(standards)

for r in results:
    print(f"{r.seq_no}. {r.original_name} ({r.original_number})")
    print(f"   状态: {r.status_code}")
    print(f"   结果: {r.final_result}")
    if r.substitute_number:
        print(f"   替代: {r.substitute_name} ({r.substitute_number})")

运行测试

# 运行实际调用测试
cd utils_test/standard_new_Test
python test_app.py

# 运行单元测试
python -m pytest test_standard_matching.py -v

代码设计特点

1. 内存数据处理

  • 服务初始化时一次性从MySQL加载所有数据到内存
  • 后续匹配操作完全在内存中进行,无数据库访问
  • 适合标准库数据量不大但需要高频查询的场景

2. 可维护性优化

  • 分层架构:Repository(数据)+ Matcher(逻辑)+ Service(接口)
  • 单一职责:每个方法只做一件事,如 _set_ok_result()_handle_abolished()
  • 索引优化:标准号、名称多索引加速内存查询

3. 匹配规则实现

匹配流程拆分为多个独立方法:

match()
├── _handle_number_matched()      # 标准号匹配
│   ├── _handle_full_match()      # 名称也匹配
│   │   ├── _set_ok_result()      # 现行/试行
│   │   └── _handle_abolished()   # 废止
│   └── _handle_name_mismatch()   # 名称不匹配
└── _handle_number_not_matched()  # 标准号不匹配
    ├── _check_name_in_records()
    └── _search_by_name_only()

数据表结构

CREATE TABLE t_samp_standard_base_info (
    id INT PRIMARY KEY AUTO_INCREMENT,
    chinese_name VARCHAR(500) COMMENT '标准名称',
    standard_number VARCHAR(100) COMMENT '标准编号',
    validity VARCHAR(10) COMMENT '时效性 (XH-现行, SX-试行, FZ-废止)',
    INDEX idx_number (standard_number),
    INDEX idx_name (chinese_name)
) COMMENT='标准库基础信息表';