水利普查档案数字化全流程指南:合规归档+效率提升实操方案
不少水利系统的朋友最近都在问,存量水利普查档案转数字化怎么才能符合归档要求,还能少踩坑?毕竟很多单位攒了十几年的普查档案,既有纸质的河湖勘测表、工程台账,也有老的光盘存储数据,整理起来头都大。这篇我就...
2026年08月22日 00:25:14
首先必须把纸面上的档案制度,转化为工具能实现的规则,避免技术和行政两张皮。
不管用什么工具,必须先把制度里的这4项抠出来:
选择「FileRun」作为核心工具,它是轻量级PHP+MySQL文件管理系统,完全满足档案管理需求,不需要服务器也能用本地部署(适合10-50人小团队)。
用「XAMPP 8.2.12」一键搭建PHP+MySQL+Apache环境,下载地址:
FileRun 2024免费社区版下载地址:

用Python写个轻量定时脚本,扫描未上传元数据的合同/文档,发送邮件提醒(假设用QQ邮箱)。
Python 3.10+下载地址:
打开CMD输入以下命令:
```bash pip install pymysql schedule yagmail ```在「D:\xampp\htdocs\filerun」创建「remind.py」,内容如下:
```python import pymysql import schedule import time import yagmail from datetime import datetime, timedelta 数据库配置(对应XAMPP和FileRun) DB_CONFIG = { "host": "localhost", "user": "root", "password": "", "db": "filerun_db", "charset": "utf8mb4" } 邮件配置(QQ邮箱需开启SMTP服务,获取授权码) EMAIL_CONFIG = { "user": "你的QQ邮箱@qq.com", "password": "你的QQ邮箱授权码", "smtp_host": "smtp.qq.com", "smtp_port": 465 } 待提醒事件(可按制度添加更多) REMIND_RULES = [ 规则:存储位置ID,子文件夹名称,事件字段,天数,提醒对象 (1, "合同协议", "fr_custom_field_1", 3, "研发部经理@qq.com;销售部经理@qq.com"), ] def get_storage_path_id(storage_name): 辅助函数:根据存储位置名称获取ID conn = pymysql.connect(DB_CONFIG) cursor = conn.cursor() cursor.execute("SELECT id FROM fr_storages WHERE name = %s", (storage_name,)) res = cursor.fetchone() conn.close() return res[0] if res else None def check_and_remind(): print(f"[{datetime.now()}] 开始检查归档提醒...") conn = pymysql.connect(DB_CONFIG) cursor = conn.cursor() 替换存储位置ID(这里假设公司档案库ID是1,可通过get_storage_path_id("公司档案库")获取) storage_id = 1 for rule in REMIND_RULES: subfolder, event_field, days, receivers = rule[1], rule[2], rule[3], rule[4].split(";") 查询路径ID cursor.execute("SELECT id FROM fr_files WHERE name = %s AND parent_id = (SELECT id FROM fr_files WHERE storage_id = %s AND parent_id IS NULL)", (subfolder, storage_id)) path_res = cursor.fetchone() if not path_res: continue path_id = path_res[0] 查询近X天未绑定元数据的文件 deadline = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d %H:%M:%S") cursor.execute("SELECT f.name, f.created_by, u.email, u.fullname FROM fr_files f LEFT JOIN fr_users u ON f.created_by = u.id WHERE f.parent_id = %s AND f.is_dir = 0 AND f.created_at >= %s AND f.id NOT IN (SELECT file_id FROM fr_custom_fields_values WHERE field_id = (SELECT id FROM fr_custom_fields WHERE name = %s))", (path_id, deadline, event_field)) files = cursor.fetchall() if files: 发送邮件 yag = yagmail.SMTP(EMAIL_CONFIG["user"], EMAIL_CONFIG["password"], EMAIL_CONFIG["smtp_host"], EMAIL_CONFIG["smtp_port"]) subject = f"【归档提醒】{subfolder}有{len(files)}个文件未及时归档" content = f"以下文件需在今日内完成归档(填写元数据):\n" for f in files: content += f"- 文件名:{f[0]},上传人:{f[3]}({f[2]}),上传时间:{f[4] if len(f)>=5 else '未知'}\n" yag.send(to=receivers, subject=subject, contents=content) print(f"[{datetime.now()}] 已向{receivers}发送{subfolder}归档提醒") conn.close() print(f"[{datetime.now()}] 检查完成") 每天9:00和14:00执行检查 schedule.every().day.at("09:00").do(check_and_remind) schedule.every().day.at("14:00").do(check_and_remind) while True: schedule.run_pending() time.sleep(60) ```FileRun后台支持直接导出元数据,配合制度核查即可: