377 lines
10 KiB
Markdown
377 lines
10 KiB
Markdown
# 模板更新脚本使用说明
|
||
|
||
## 一、脚本概述
|
||
|
||
`update_templates_custom.py` 是一个灵活的模板更新脚本,支持:
|
||
|
||
1. **自定义数据库连接配置**(不从.env文件读取)
|
||
2. **自定义租户ID(tenant_id)配置**
|
||
3. **更新模板层级结构**(根据`template_finish/`目录结构)
|
||
4. **更新字段关联关系**(输入字段和输出字段)
|
||
|
||
## 二、功能说明
|
||
|
||
### 2.1 更新模板层级结构
|
||
|
||
根据本地 `template_finish/` 目录结构更新数据库中的模板层级关系:
|
||
|
||
- 扫描目录结构,识别所有目录和文件
|
||
- 创建或更新目录节点(`f_polic_file_config`表中`file_path=NULL`的记录)
|
||
- 创建或更新文件节点(`f_polic_file_config`表中`file_path`不为空的记录)
|
||
- 建立正确的`parent_id`层级关系
|
||
|
||
### 2.2 更新字段关联关系
|
||
|
||
自动为所有模板建立字段关联关系:
|
||
|
||
- **输入字段**:所有模板都关联 `clue_info` 和 `target_basic_info_clue`
|
||
- **输出字段**:根据模板文件中的占位符(`{{field_code}}`)自动关联对应的输出字段
|
||
- **自动创建字段**:如果占位符对应的字段不存在,自动创建该字段
|
||
|
||
## 三、使用方法
|
||
|
||
### 3.1 命令行参数方式
|
||
|
||
```bash
|
||
python update_templates_custom.py --host <主机> --port <端口> --user <用户名> --password <密码> --database <数据库名> --tenant-id <租户ID>
|
||
```
|
||
|
||
**完整示例**:
|
||
|
||
```bash
|
||
# 基本使用
|
||
python update_templates_custom.py --host 192.168.1.100 --port 3306 --user root --password 123456 --database finyx --tenant-id 1
|
||
|
||
# 预览模式(不实际更新数据库)
|
||
python update_templates_custom.py --host 192.168.1.100 --port 3306 --user root --password 123456 --database finyx --tenant-id 1 --dry-run
|
||
|
||
# 只更新层级结构,不更新字段关联
|
||
python update_templates_custom.py --host 192.168.1.100 --port 3306 --user root --password 123456 --database finyx --tenant-id 1 --update-hierarchy --no-update-fields
|
||
|
||
# 只更新字段关联,不更新层级结构
|
||
python update_templates_custom.py --host 192.168.1.100 --port 3306 --user root --password 123456 --database finyx --tenant-id 1 --update-fields --no-update-hierarchy
|
||
```
|
||
|
||
**参数说明**:
|
||
|
||
| 参数 | 说明 | 必填 |
|
||
|------|------|------|
|
||
| `--host` | MySQL服务器地址 | 是 |
|
||
| `--port` | MySQL服务器端口 | 是 |
|
||
| `--user` | MySQL用户名 | 是 |
|
||
| `--password` | MySQL密码 | 是 |
|
||
| `--database` | 数据库名称 | 是 |
|
||
| `--tenant-id` | 租户ID | 是 |
|
||
| `--dry-run` | 预览模式(不实际更新) | 否 |
|
||
| `--update-hierarchy` | 更新模板层级结构(默认启用) | 否 |
|
||
| `--update-fields` | 更新字段关联关系(默认启用) | 否 |
|
||
|
||
### 3.2 交互式输入方式
|
||
|
||
如果命令行参数不完整,脚本会自动进入交互式输入模式:
|
||
|
||
```bash
|
||
python update_templates_custom.py
|
||
```
|
||
|
||
交互式输入示例:
|
||
|
||
```
|
||
======================================================================
|
||
数据库连接配置
|
||
======================================================================
|
||
请输入数据库连接信息(直接回车使用默认值):
|
||
|
||
MySQL服务器地址 [152.136.177.240]: 192.168.1.100
|
||
MySQL服务器端口 [5012]: 3306
|
||
MySQL用户名 [finyx]: root
|
||
MySQL密码 [留空使用默认]: ********
|
||
数据库名称 [finyx]: finyx
|
||
|
||
租户配置:
|
||
租户ID (tenant_id) [必填]: 1
|
||
|
||
更新选项:
|
||
更新模板层级结构?[Y/n]: y
|
||
更新字段关联关系?[Y/n]: y
|
||
预览模式(不实际更新)?[y/N]: n
|
||
|
||
确认执行更新?[y/N]: y
|
||
```
|
||
|
||
### 3.3 查看帮助信息
|
||
|
||
```bash
|
||
python update_templates_custom.py --help
|
||
```
|
||
|
||
## 四、使用场景
|
||
|
||
### 4.1 首次部署
|
||
|
||
首次部署时,需要将本地模板同步到数据库:
|
||
|
||
```bash
|
||
python update_templates_custom.py \
|
||
--host 192.168.1.100 \
|
||
--port 3306 \
|
||
--user root \
|
||
--password your_password \
|
||
--database finyx \
|
||
--tenant-id 1
|
||
```
|
||
|
||
### 4.2 多租户环境
|
||
|
||
在不同租户下更新模板:
|
||
|
||
```bash
|
||
# 租户1
|
||
python update_templates_custom.py --host ... --tenant-id 1
|
||
|
||
# 租户2
|
||
python update_templates_custom.py --host ... --tenant-id 2
|
||
```
|
||
|
||
### 4.3 预览更新内容
|
||
|
||
在正式更新前,先预览会执行哪些操作:
|
||
|
||
```bash
|
||
python update_templates_custom.py --host ... --tenant-id 1 --dry-run
|
||
```
|
||
|
||
### 4.4 增量更新
|
||
|
||
只更新层级结构或只更新字段关联:
|
||
|
||
```bash
|
||
# 只更新层级结构
|
||
python update_templates_custom.py --host ... --tenant-id 1 --update-hierarchy --no-update-fields
|
||
|
||
# 只更新字段关联
|
||
python update_templates_custom.py --host ... --tenant-id 1 --update-fields --no-update-hierarchy
|
||
```
|
||
|
||
## 五、输出说明
|
||
|
||
### 5.1 正常输出示例
|
||
|
||
```
|
||
======================================================================
|
||
模板更新脚本
|
||
======================================================================
|
||
支持自定义数据库连接和租户ID配置
|
||
|
||
======================================================================
|
||
配置信息
|
||
======================================================================
|
||
数据库服务器: 192.168.1.100:3306
|
||
数据库名称: finyx
|
||
用户名: root
|
||
租户ID: 1
|
||
预览模式: 否
|
||
更新层级结构: 是
|
||
更新字段关联: 是
|
||
|
||
确认执行更新?[y/N]: y
|
||
|
||
======================================================================
|
||
连接数据库
|
||
======================================================================
|
||
[OK] 数据库连接成功
|
||
|
||
======================================================================
|
||
更新模板层级结构
|
||
======================================================================
|
||
1. 扫描目录结构...
|
||
[OK] 找到 33 个目录,122 个文件
|
||
|
||
2. 获取现有模板...
|
||
[OK] 找到 122 个文件模板,28 个目录模板
|
||
|
||
3. 创建/更新目录节点...
|
||
[创建目录] 1-谈话函询模板 (ID: 1766711031977435)
|
||
[更新目录] 2-初核模版 (ID: 1766711031977436)
|
||
...
|
||
[OK] 创建 5 个目录,更新 28 个目录
|
||
|
||
4. 创建/更新文件节点...
|
||
[创建文件] 请示报告卡(XXX).docx (ID: 1766711031977437)
|
||
[更新文件] 谈话通知书第一联.docx (ID: 1766711031977438)
|
||
...
|
||
[OK] 创建 2 个文件,更新 120 个文件
|
||
|
||
======================================================================
|
||
更新字段关联关系
|
||
======================================================================
|
||
1. 获取输入字段...
|
||
[OK] 找到 2 个输入字段
|
||
|
||
2. 获取输出字段...
|
||
[OK] 找到 72 个输出字段
|
||
|
||
3. 获取所有模板...
|
||
[OK] 找到 122 个模板
|
||
|
||
4. 扫描模板占位符并更新关联关系...
|
||
处理进度: 20/122
|
||
处理进度: 40/122
|
||
...
|
||
|
||
======================================================================
|
||
字段关联更新结果
|
||
======================================================================
|
||
总模板数: 122
|
||
已更新: 93 个
|
||
保持不变: 29 个
|
||
错误: 0 个
|
||
发现的占位符总数: 35 个
|
||
创建的字段数: 0 个
|
||
|
||
======================================================================
|
||
更新完成
|
||
======================================================================
|
||
数据库已更新
|
||
|
||
层级结构:
|
||
- 创建目录: 5 个
|
||
- 更新目录: 28 个
|
||
- 创建文件: 2 个
|
||
- 更新文件: 120 个
|
||
|
||
字段关联:
|
||
- 总模板数: 122 个
|
||
- 已更新: 93 个
|
||
- 保持不变: 29 个
|
||
- 发现的占位符: 35 个
|
||
- 创建的字段: 0 个
|
||
|
||
[OK] 数据库连接已关闭
|
||
```
|
||
|
||
### 5.2 预览模式输出
|
||
|
||
预览模式下,会显示将要执行的操作,但不会实际更新数据库:
|
||
|
||
```
|
||
[注意] 当前为预览模式,不会实际更新数据库
|
||
|
||
...
|
||
|
||
[OK] 预览模式,未实际更新数据库
|
||
```
|
||
|
||
## 六、注意事项
|
||
|
||
### 6.1 数据库连接
|
||
|
||
- 确保数据库服务器可访问
|
||
- 确保用户有足够的权限(SELECT, INSERT, UPDATE, DELETE)
|
||
- 确保数据库名称正确
|
||
|
||
### 6.2 租户ID
|
||
|
||
- **tenant_id是必填项**,不能为空
|
||
- 确保tenant_id在数据库中存在或需要创建
|
||
- 不同租户的数据是隔离的,更新时请确认tenant_id正确
|
||
|
||
### 6.3 模板文件
|
||
|
||
- 脚本会扫描 `template_finish/` 目录下的所有 `.docx` 和 `.doc` 文件
|
||
- 确保模板文件路径与数据库中的`file_path`字段匹配
|
||
- 如果模板文件不存在,会跳过该模板的字段关联更新
|
||
|
||
### 6.4 字段创建
|
||
|
||
- 如果模板中的占位符对应的字段不存在,脚本会自动创建该字段
|
||
- 创建的字段类型为输出字段(`field_type=2`)
|
||
- 字段名称会根据`field_code`自动生成(将下划线替换为空格)
|
||
|
||
### 6.5 数据安全
|
||
|
||
- **建议先使用预览模式(--dry-run)**查看将要执行的操作
|
||
- 在生产环境执行前,建议先备份数据库
|
||
- 确保有足够的磁盘空间和数据库连接数
|
||
|
||
## 七、常见问题
|
||
|
||
### 7.1 连接失败
|
||
|
||
**问题**:数据库连接失败
|
||
|
||
**解决方案**:
|
||
- 检查数据库服务器地址和端口是否正确
|
||
- 检查用户名和密码是否正确
|
||
- 检查网络连接是否正常
|
||
- 检查防火墙设置
|
||
|
||
### 7.2 权限不足
|
||
|
||
**问题**:执行更新时提示权限不足
|
||
|
||
**解决方案**:
|
||
- 确保数据库用户有足够的权限
|
||
- 需要以下权限:SELECT, INSERT, UPDATE, DELETE
|
||
|
||
### 7.3 模板文件不存在
|
||
|
||
**问题**:部分模板的字段关联更新失败,提示文件不存在
|
||
|
||
**解决方案**:
|
||
- 检查数据库中的`file_path`是否正确
|
||
- 确保模板文件存在于`template_finish/`目录下
|
||
- 检查文件路径中的斜杠方向(Windows使用反斜杠,脚本会自动处理)
|
||
|
||
### 7.4 占位符识别错误
|
||
|
||
**问题**:模板中的占位符没有被正确识别
|
||
|
||
**解决方案**:
|
||
- 确保占位符格式正确:`{{field_code}}`
|
||
- 占位符中的`field_code`不能包含空格
|
||
- 检查模板文件是否损坏
|
||
|
||
## 八、技术细节
|
||
|
||
### 8.1 占位符提取
|
||
|
||
脚本使用正则表达式 `\{\{([^}]+)\}\}` 从Word文档中提取占位符:
|
||
|
||
- 扫描所有段落(paragraphs)
|
||
- 扫描所有表格单元格(table cells)
|
||
- 提取所有匹配的占位符
|
||
|
||
### 8.2 ID生成
|
||
|
||
使用时间戳生成唯一ID:
|
||
|
||
```python
|
||
def generate_id():
|
||
import time
|
||
return int(time.time() * 1000000)
|
||
```
|
||
|
||
### 8.3 层级结构处理
|
||
|
||
- 按目录层级顺序处理(先处理父目录,再处理子目录)
|
||
- 使用路径映射表(`path_to_id`)维护目录ID关系
|
||
- 文件节点的`parent_id`指向其所在目录的ID
|
||
|
||
### 8.4 字段关联处理
|
||
|
||
- 先获取现有关联关系
|
||
- 计算需要添加和删除的关联
|
||
- 批量更新关联关系
|
||
- 自动创建缺失的字段
|
||
|
||
## 九、更新历史
|
||
|
||
- **2025-12-16**: 创建脚本,支持自定义数据库连接和租户ID配置
|
||
|
||
---
|
||
|
||
**脚本路径**: `update_templates_custom.py`
|
||
**文档版本**: 1.0
|
||
**最后更新**: 2025-12-16
|