## 情报收集系统设计

### 参考文档
https://alidocs.dingtalk.com/i/nodes/NZQYprEoWoexdo1ohPdxXvDbJ1waOeDk?utm_scene=team_space

### 程序框架（当前实现）
```angular2html
intelligence_system/
├── collectors/                            # 数据采集层
│   ├── complaint_spider.py               # 投诉信息爬虫（结构化入库/附件走MinIO）
│   ├── rss_subscriptions.py              # RSS 订阅抓取
│   └── internal/                         # 内部数据收集（保留）
│       └── jian_dao_cloud.py            # 简道云表单收集器（示例/占位）
│
├── processors/                            # 数据处理层
│   ├── processor_rss_data.py             # RSS数据清洗、分词、过滤与入库
│   ├── keywords.txt                      # 行业关键词（用于分词/过滤）
│   ├── stopwords.txt                     # 停用词
│   └── ai_engine/
│       └── ai_proessor_rss_data          # 预留（AI分析扩展占位）
│
├── services/                              # 应用服务层（保留）
│   ├── monitoring/                       # 舆情监控
│   │   ├── opinion_monitor.py            # 实时舆情追踪（占位）
│   │   └── brand_reputation.py           # 品牌口碑分析（占位）
│   ├── analysis/                         # 竞品分析
│   │   ├── competitor_tracker.py         # 竞品动态监控（占位）
│   │   └── swot_generator.py             # SWOT分析报告（占位）
│   ├── reporting/                        # 报告服务
│   │   ├── daily_reporter.py             # 自动化日报生成（占位）
│   │   └── weekly_digest.py              # 周报汇编系统（占位）
│   └── alert/                            # 预警服务
│       ├── alert_trigger.py              # 动态阈值告警（占位）
│       └── notification_center.py        # 邮件/短信通知（占位）
│
├── applications/                          # 应用层
│   ├── alert.py                          # 告警触发/通知（占位/实现中）
│   └── reporter/
│       ├── daily.py                      # 日报生成
│       └── monthly.py                    # 月报生成
│
├── system_management/                     # 系统管理层
│   ├── scheduler/
│   │   ├── task_scheduler.py             # 任务调度器（Cron表达式 + 线程池）
│   │   └── task_management.py            # 任务管理辅助
│   └── monitor/                          # 系统监控（目录占位）
│
├── utils/                                 # 工具库
│   ├── file_handler.py                   # 通用文件操作
│   ├── logger.py                         # 跨平台日志系统（Loguru）
│   ├── mysql_agent.py                    # MySQL读写管理器
│   └── minio_agent.py                    # MinIO对象存储客户端
│
├── config.py                              # 配置加载与管理（含数据库/存储配置）
├── main.py                                # 系统入口（Cron轮询 + 调度执行）
└── requirements.txt                       # 依赖清单
```

### 程序设计原则
1. 所有程序尽可能在py文件中运行，尽量避免使用命令行执行
2. 配置需要在配置类中定义
3. 密钥等信息直接放在配置类中
4. 数据存储遵循"结构化存MySQL，非结构化存MinIO"原则，通过元数据关联

### 主程序与调度设计（已实现）
主程序以长运行进程方式启动，进入轻量轮询循环（每10秒）。调度器按Cron表达式在`main_task`表中拉取到期任务，使用线程池异步执行，并在每分钟输出运行状态、每小时汇总统计。

- 调度器能力：
  - 基于`croniter`解析Cron表达式，支持时区（默认`Asia/Shanghai`）
  - 线程池并发执行，信号量限制最大并发（与`max_workers`一致）
  - 任务入口动态解析：支持`package.module`、`package.module.ClassName.main`、`package.module.func` 等形式
  - 成功/失败后自动计算`next_run_time`或设置15分钟后重试
  - 关键字段自动更新：`is_running`、`last_run_time`、`last_run_status`、`run_count`、`next_run_time`

- 主循环：
  - 每10秒检查一次待运行任务
  - 每分钟打印当前周期统计；每小时写入累计统计日志
  - 支持`SIGINT/SIGTERM`优雅关闭，等待正在运行的任务完成

### 日志设计（已实现）
跨平台日志系统（Loguru）输出至`logs/`目录：

- application.log：主日志，`rotation = 20MB`，达到阈值后压缩为`application.log.YYYYMMDD.zip`，`retention = 30天`
- errors.log：错误日志（ERROR及以上），`rotation = 10MB`，`retention = 90天`
- 结构化扩展字段：日志支持`extra`键值对，自动美化并对长字段（如`sql`、`params`）截断

建议记录的业务事件：
- MySQL读写操作要点（表名、影响行数、事务状态）
- MinIO对象操作（对象路径、大小、耗时、状态）
- 任务执行上下文（task_id、task_name、module_path、耗时、状态）

### 存储系统设计（MinIO+MySQL）
#### 核心存储分工
| 存储类型 | 适用数据 | 核心作用 |
|----------|----------|----------|
| MySQL | 结构化数据、元数据、关系型数据 | 存储业务逻辑数据、非结构化数据的索引信息、任务调度信息等 |
| MinIO | 非结构化数据 | 存储图片、视频、PDF文档、原始爬取文件等二进制/大文件数据 |


#### 核心存储配置
1. **MySQL配置**
   - 数据库名称：`intelligence_system`
   - 连接管理：通过`utils/mysql_agent.py`封装线程安全的连接池，提供结构化数据的增删改查及SQL执行能力
   - 适配特性：支持多平台（Windows/macOS/Linux）的超时配置和批处理优化

2. **MinIO配置**
   - 存储桶命名规则：按数据类型划分，如`collector-images`（采集层图片）、`processor-videos`（处理层视频）
   - 连接管理：通过`utils/minio_agent.py`封装客户端，提供对象上传、下载、删除、查询URL等能力
   - 路径规则：`{数据层}/{来源}/{时间戳}_{唯一ID}.{后缀}`（例：`collector/weibo_spider/20240520_12345.jpg`）


#### 表命名规则（扩展）
- 数据采集类：以`collector_`为前缀（存储采集到的结构化数据及MinIO对象元数据）
- 数据处理类：以`processor_`为前缀（存储处理结果的结构化数据及MinIO处理后对象的元数据）
- 数据存储类：以`storage_`为前缀（存储MinIO对象的索引信息，如哈希、大小、访问权限等）
- 应用层类：以`application_`为前缀（对应业务应用数据）
- 系统类：如任务调度表等采用功能命名（如`main_task`）


#### 核心表结构（当前落地）
1. `main_task`：任务调度表（`task_name`、`task_type`、`module_path`、`cron_expression`、`time_zone`、`run_count`、`is_running`、`last_run_time`、`last_run_status`、`next_run_time`、`is_active` 等）
2. `collector_rss_subscriptions`：RSS源采集数据（`文章标题`、`文章摘要`、`发布时间`、`来源URL`、`文章链接`、`是否已处理` 等）
3. `processed_rss_data`：RSS处理结果（`分词结果`、`是否汽车相关`、`处理时间` 等）
4. `collector_complaint_spider`：投诉信息爬虫数据（含文本与附件MinIO路径`attachment_minio_path`等）
5. 可选：`storage_object_index`（建议用于统一索引MinIO对象元数据）

### 数据采集设计
1. 结构化数据（RSS、投诉文本）：写入`collector_`前缀表
2. 非结构化数据（附件/图片等）：
   - 使用`utils/minio_agent.py`上传至对应存储桶
   - 将对象路径与元数据写入业务表或`storage_object_index`
3. 采集模块需同时处理MySQL与MinIO交互，确保关联完整

### 数据处理设计（RSS流程已实现）
`processors/processor_rss_data.py`流程：
- 从`collector_rss_subscriptions`加载未处理数据（可配置`limit`）
- 加载停用词与行业关键词（`stopwords.txt` / `keywords.txt`），并动态注入`jieba`词典
- 标注词性并过滤停用词，仅保留与汽车后市场相关的词汇
- 标记与过滤：出现任一行业关键词即视为相关，进入保存
- 将结果写入`processed_rss_data`，并回写源表`是否已处理 = 1`
- 输出处理统计（总量、命中量、命中率、时间）

### 依赖与运行
- 依赖：见`requirements.txt`（pandas、SQLAlchemy、PyMySQL、croniter、pytz、loguru、jieba、feedparser、beautifulsoup4、minio 等）
- 配置：在`config.py`中设置`MYSQL_CONFIG`与MinIO参数
- 运行：
  - 启动主程序：`python main.py`
  - 添加任务：向`main_task`插入记录，`module_path`可指向如`processors.processor_rss_data.main`
