# 模板更新脚本使用说明 ## 一、脚本概述 `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