222 lines
6.5 KiB
Markdown
222 lines
6.5 KiB
Markdown
# 初始化模板树状结构 - 使用说明
|
||
|
||
## 概述
|
||
|
||
`init_template_tree_from_directory.py` 脚本用于**完全重置** `f_polic_file_config` 表中的模板数据,根据 `template_finish` 目录结构重新创建所有记录,建立正确的树状层级关系。
|
||
|
||
## ⚠️ 重要警告
|
||
|
||
**此操作会删除当前租户的所有模板数据!**
|
||
|
||
包括:
|
||
- `f_polic_file_config` 表中的所有记录
|
||
- `f_polic_file_field` 表中的相关关联记录
|
||
|
||
然后根据 `template_finish` 目录结构完全重建。
|
||
|
||
**执行前请务必备份数据库!**
|
||
|
||
## 功能特点
|
||
|
||
1. **完全重建**: 删除旧数据,根据目录结构重新创建
|
||
2. **树状结构**: 自动建立正确的 parent_id 层级关系
|
||
3. **文件上传**: 可选择是否上传文件到 MinIO
|
||
4. **安全确认**: 多重确认机制,防止误操作
|
||
5. **模拟模式**: 先预览再执行,确保安全
|
||
|
||
## 目录结构要求
|
||
|
||
脚本会扫描 `template_finish` 目录,期望的结构如下:
|
||
|
||
```
|
||
template_finish/
|
||
└── 2-初核模版/ (一级目录)
|
||
├── 1.初核请示/ (二级目录)
|
||
│ ├── 1.请示报告卡(XXX).docx
|
||
│ ├── 2.初步核实审批表(XXX).docx
|
||
│ └── 3.附件初核方案(XXX).docx
|
||
├── 2.谈话审批/ (二级目录)
|
||
│ ├── 谈话通知书/ (三级目录)
|
||
│ │ ├── 谈话通知书第一联.docx
|
||
│ │ ├── 谈话通知书第二联.docx
|
||
│ │ └── 谈话通知书第三联.docx
|
||
│ ├── 走读式谈话审批/ (三级目录)
|
||
│ │ ├── 1.请示报告卡(初核谈话).docx
|
||
│ │ ├── 2谈话审批表.docx
|
||
│ │ └── ...
|
||
│ └── 走读式谈话流程/ (三级目录)
|
||
│ ├── 1.谈话笔录.docx
|
||
│ └── ...
|
||
└── 3.初核结论/ (二级目录)
|
||
├── 8-1请示报告卡(初核报告结论) .docx
|
||
└── 8.XXX初核情况报告.docx
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
### 基本使用
|
||
|
||
```bash
|
||
python init_template_tree_from_directory.py
|
||
```
|
||
|
||
### 执行流程
|
||
|
||
1. **警告提示**: 显示操作警告
|
||
2. **第一次确认**: 输入 `yes` 继续
|
||
3. **扫描目录**: 自动扫描 `template_finish` 目录
|
||
4. **显示预览**: 显示目录结构预览
|
||
5. **选择上传**: 选择是否上传文件到 MinIO
|
||
6. **模拟删除**: 显示将删除的数据
|
||
7. **模拟创建**: 显示将创建的节点
|
||
8. **最终确认**: 再次输入 `yes` 执行实际更新
|
||
9. **执行删除**: 删除旧数据
|
||
10. **执行创建**: 创建新数据
|
||
|
||
### 交互式提示
|
||
|
||
```
|
||
确认继续?(yes/no,默认no): yes
|
||
是否上传文件到MinIO?(yes/no,默认yes): yes
|
||
确认执行实际更新?(yes/no,默认no): yes
|
||
```
|
||
|
||
## 处理逻辑
|
||
|
||
### 1. 删除旧数据
|
||
|
||
- 先删除 `f_polic_file_field` 表中的关联记录
|
||
- 再删除 `f_polic_file_config` 表中的配置记录
|
||
- 只删除当前租户(`tenant_id = 615873064429507639`)的数据
|
||
|
||
### 2. 创建新数据
|
||
|
||
按层级顺序创建:
|
||
|
||
1. **目录节点**:
|
||
- 不包含 `template_code` 字段
|
||
- `input_data` 为 NULL
|
||
- `file_path` 为 NULL
|
||
|
||
2. **文件节点**:
|
||
- 包含 `template_code`(从 `DOCUMENT_TYPE_MAPPING` 获取)
|
||
- `input_data` 包含 JSON 格式的配置
|
||
- `file_path` 为 MinIO 路径(如果上传了文件)
|
||
|
||
### 3. 树状关系
|
||
|
||
- 一级目录: `parent_id = NULL`
|
||
- 二级目录: `parent_id = 一级目录的ID`
|
||
- 三级目录: `parent_id = 二级目录的ID`
|
||
- 文件: `parent_id = 所在目录的ID`
|
||
|
||
## 模板识别
|
||
|
||
脚本通过 `DOCUMENT_TYPE_MAPPING` 字典识别文件类型:
|
||
|
||
- 匹配文件名(不含扩展名)
|
||
- 提取 `template_code` 和 `business_type`
|
||
- 如果无法识别,`template_code` 为空字符串
|
||
|
||
## 文件上传
|
||
|
||
如果选择上传文件到 MinIO:
|
||
|
||
- 文件路径格式: `/{tenant_id}/TEMPLATE/{year}/{month}/{filename}`
|
||
- 例如: `/615873064429507639/TEMPLATE/2025/12/1.请示报告卡(XXX).docx`
|
||
- 上传失败不会中断流程,但 `file_path` 将为 NULL
|
||
|
||
## 输出示例
|
||
|
||
```
|
||
================================================================================
|
||
初始化模板树状结构(从目录结构完全重建)
|
||
================================================================================
|
||
|
||
⚠️ 警告:此操作将删除当前租户的所有模板数据!
|
||
|
||
确认继续?(yes/no,默认no): yes
|
||
✓ 数据库连接成功
|
||
|
||
扫描目录结构...
|
||
找到 28 个节点
|
||
其中目录: 7 个
|
||
其中文件: 21 个
|
||
|
||
执行模拟删除...
|
||
[模拟] 将删除 113 条关联记录
|
||
[模拟] 将删除 34 条配置记录
|
||
|
||
执行模拟创建...
|
||
✓ [模拟]创建目录: 2-初核模版 (ID: ...)
|
||
✓ [模拟]创建文件: 1.请示报告卡(XXX) (ID: ...) [父: ...] [code: REPORT_CARD]
|
||
...
|
||
|
||
确认执行实际更新?(yes/no,默认no): yes
|
||
|
||
执行实际删除...
|
||
✓ 删除了 113 条关联记录
|
||
✓ 删除了 34 条配置记录
|
||
|
||
执行实际创建...
|
||
✓ 创建目录: 2-初核模版 (ID: ...)
|
||
✓ 创建文件: 1.请示报告卡(XXX) (ID: ...) [父: ...] [code: REPORT_CARD]
|
||
...
|
||
|
||
✓ 创建完成!共创建 28 个节点
|
||
```
|
||
|
||
## 验证结果
|
||
|
||
执行完成后,可以使用验证脚本检查结果:
|
||
|
||
```bash
|
||
python verify_tree_structure.py
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **备份数据库**: 执行前务必备份数据库
|
||
2. **确认目录结构**: 确保 `template_finish` 目录结构正确
|
||
3. **文件存在**: 确保所有 `.docx` 文件都存在
|
||
4. **MinIO 连接**: 如果选择上传文件,确保 MinIO 连接正常
|
||
5. **不可逆操作**: 删除操作不可逆,请谨慎执行
|
||
|
||
## 故障排查
|
||
|
||
### 问题1: template_code 不能为 NULL
|
||
|
||
**原因**: 数据库表结构要求 template_code 不能为 NULL
|
||
|
||
**解决**: 脚本已处理,目录节点不插入 template_code,文件节点使用空字符串
|
||
|
||
### 问题2: 文件上传失败
|
||
|
||
**原因**: MinIO 连接问题或文件不存在
|
||
|
||
**解决**:
|
||
- 检查 MinIO 配置
|
||
- 检查文件是否存在
|
||
- 上传失败不会中断流程,可以后续手动上传
|
||
|
||
### 问题3: 父子关系错误
|
||
|
||
**原因**: 目录结构扫描顺序问题
|
||
|
||
**解决**: 脚本已按层级顺序处理,确保父节点先于子节点创建
|
||
|
||
## 相关脚本
|
||
|
||
- `update_template_tree.py` - 更新现有数据的 parent_id(不删除数据)
|
||
- `verify_tree_structure.py` - 验证树状结构
|
||
- `check_existing_data.py` - 检查现有数据
|
||
|
||
## 联系信息
|
||
|
||
如有问题,请检查:
|
||
1. 数据库连接配置
|
||
2. 目录结构是否正确
|
||
3. 文件是否都存在
|
||
4. MinIO 配置是否正确
|
||
|