在档案管理系统中,保管期限鉴定是核心逻辑。传统的手工鉴定容易出错,我们需要将《机关文件材料归档范围和文书档案保管期限规定》转化为机器可读的配置规则。我们采用JSON格式构建规则库,以便于程序读取和扩展。
我们需要明确三个核心期限及其对应的代码:
请在项目根目录下创建一个名为 archive_rules.json 的文件,并直接复制以下完整配置。该配置预设了常见的职能、人事、财务等关键分类规则。
```json { "rules": [ { "category": "人事管理", "retention_code": "Y", "retention_period": "永久", "keywords": ["干部任免", "职工录用", "职称评定", "劳资关系", "党团组织建设", "死亡抚恤"], "description": "涉及人员切身权益及单位核心组织架构" }, { "category": "行政管理", "retention_code": "Y", "retention_period": "永久", "keywords": ["本单位大事记", "组织沿革", "年度工作总结", "年度工作计划", "规章制度"], "description": "反映单位主要职能活动和历史面貌" }, { "category": "行政管理", "retention_code": "C30", "retention_period": "30年", "keywords": ["会议纪要", "会议记录", "请示", "批复", "函", "通知", "通报"], "description": "一般性行政事务处理文件" }, { "category": "财务管理", "retention_code": "Y", "retention_period": "永久", "keywords": ["年度财务决算", "年度财务报告", "审计报告"], "description": "核心财务数据" }, { "category": "财务管理", "retention_code": "C30", "retention_period": "30年", "keywords": ["会计凭证", "会计账簿", "月度财务报表"], "description": "日常财务核算记录" }, { "category": "业务经营", "retention_code": "C30", "retention_period": "30年", "keywords": ["合同", "协议", "项目验收报告", "招投标文件"], "description": "重要业务凭证" }, { "category": "辅助事务", "retention_code": "C10", "retention_period": "10年", "keywords": ["事务性通知", "一般性简报", "参考资料", "介绍信"], "description": "临时性、事务性文件" } ] } ```本指南使用 Python 3.x 作为开发语言,利用其强大的字符串处理能力实现自动鉴定。请确保你的环境已准备就绪。
1. 安装 Python:如果尚未安装,请访问 Python 官网下载 3.9 或更高版本安装包,或使用包管理器安装。
2. 验证环境:打开终端(Terminal 或 CMD),输入以下命令确认版本:
python --version
3. 安装依赖库:本脚本仅使用标准库,无需安装第三方包,直接进入代码编写阶段即可。
在同级目录下创建 archive_evaluator.py 文件。该脚本将加载 JSON 规则,并根据输入的文件标题或内容摘要自动匹配保管期限。为了确保零门槛落地,代码中包含了详细的中文注释和异常处理。
```python import json import os import datetime class ArchiveEvaluator: def __init__(self, rule_file_path): self.rules = [] self.load_rules(rule_file_path) def load_rules(self, rule_file_path): """加载JSON规则文件""" if not os.path.exists(rule_file_path): raise FileNotFoundError(f"规则文件未找到: {rule_file_path}") with open(rule_file_path, 'r', encoding='utf-8') as f: data = json.load(f) self.rules = data.get('rules', []) print(f"成功加载 {len(self.rules)} 条鉴定规则。") def evaluate(self, file_title): """ 核心鉴定逻辑 :param file_title: 文件标题或题名 :return: 鉴定结果字典 """ if not file_title: return self._default_result("未知文件") 预处理:去除首尾空格,统一转小写(虽然规则是中文,但防止混合输入) file_title_clean = file_title.strip() 优先级逻辑:按规则顺序匹配,通常将永久规则放在JSON前面 这里实现的是“命中即停止”策略,若需多规则命中可修改此处逻辑 for rule in self.rules: keywords = rule.get('keywords', []) for keyword in keywords: if keyword in file_title_clean: return { "title": file_title, "category": rule.get('category'), "retention_code": rule.get('retention_code'), "retention_period": rule.get('retention_period'), "matched_keyword": keyword, "status": "鉴定成功" } 未匹配到任何规则,归入默认短期或待人工审核 return self._default_result(file_title) def _default_result(self, title): """处理未匹配情况,默认归为短期或待定""" return { "title": title, "category": "待定/其他", "retention_code": "C10", "retention_period": "10年", "matched_keyword": "无", "status": "未匹配规则,请人工复核" } def calculate_expiry_date(self, retention_period, start_date_str=None): """ 计算到期时间(实操辅助功能) :param retention_period: 期限字符串,如 '永久', '30年', '10年' :param start_date_str: 归档日期,格式 YYYY-MM-DD,默认为今天 :return: 到期日期字符串 """ if "永久" in retention_period: return "9999-12-31" try: years = int(retention_period.replace("年", "")) except ValueError: return "无法解析期限" if start_date_str: start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d") else: start_date = datetime.datetime.now() 简单计算年数,实际业务中可能需要精确到日 end_date = start_date + datetime.timedelta(days=years 365) return end_date.strftime("%Y-%m-%d") 批量处理演示函数 def batch_process_demo(evaluator, file_list): results = [] print(f"\n开始批量鉴定 {len(file_list)} 个文件...") print("-" 80) for title in file_list: result = evaluator.evaluate(title) 计算到期日 expiry = evaluator.calculate_expiry_date(result['retention_period']) result['expiry_date'] = expiry results.append(result) 格式化输出 print(f"文件: {result['title']}") print(f" -> 期限: [{result['retention_code']}] {result['retention_period']} | " f"分类: {result['category']} | 到期日: {expiry}") if result['status'] != "鉴定成功": print(f" -> 警告: {result['status']}") print("-" 80) return results if __name__ == "__main__": 初始化鉴定器 evaluator = ArchiveEvaluator("archive_rules.json") 模拟一批待整理的档案文件标题 test_files = [ "2023年度公司财务决算报告.pdf", "关于张三同志职务任免的通知.doc", "2023年12月水电费缴纳通知单.xlsx", "与XX科技公司的战略合作协议书.pdf", "2023年度部门工作总结.doc", "第5次总经理办公会议纪要.docx", "关于购买办公打印机的请示.pdf" ] 执行批量鉴定 batch_process_demo(evaluator, test_files) ```代码编写完成后,我们直接运行脚本进行验证。请确保 archive_rules.json 和 archive_evaluator.py 在同一目录下。
步骤 1:执行脚本
在终端中执行以下命令:
python archive_evaluator.py

步骤 2:观察输出结果
终端将显示详细的鉴定过程。以下是预期的输出结果分析:
步骤 3:结果导出(扩展实操)
如果需要将结果导出为 Excel 以供后续归档操作,可以在 archive_evaluator.py 底部添加以下代码片段(需安装 pandas 和 openpyxl:`pip install pandas openpyxl`):
```python 将结果导出为Excel try: import pandas as pd df = pd.DataFrame(results) output_file = "鉴定结果导出.xlsx" df.to_excel(output_file, index=False) print(f"\n结果已导出至: {output_file}") except ImportError: print("\n提示:安装 pandas 库可自动导出Excel结果") ```在实际落地过程中,可能会遇到以下具体问题,请参考对应解决方案:
1. 编码报错
现象:运行脚本时提示 `UnicodeDecodeError`。
解决:确保 archive_rules.json 文件保存格式为 UTF-8。在 Windows 记事本中保存时,请选择“UTF-8”编码而非 ANSI。
2. 关键词冲突
现象:某些文件总是被错误分类,例如“重要的会议通知”被归为短期。
解决:调整 JSON 规则的顺序。将更具体、更重要的规则(如包含“重要”、“核心”字样的规则)移动到 JSON 数组的更前面,因为算法采用“命中即停止”的策略。
3. 日期计算精度
现象:计算的到期日期不够精确(未考虑闰年)。
解决:在 `calculate_expiry_date` 方法中引入 `dateutil.relativedelta` 替代 `timedelta`,它能准确处理年份的跨年和闰年逻辑。修改代码如下:
```python from dateutil.relativedelta import relativedelta 替换原来的计算逻辑 end_date = start_date + relativedelta(years=years) ```