基于Python实现跨部门档案协作系统实操指南
一、技术栈选型与环境初始化
为了解决档案管理中各部门数据孤岛、流转审批繁琐、制度落地难的问题,本文将构建一个轻量级的“跨部门档案协作系统”。我们将使用Python作为后端语言,Flask作为Web框架,SQLite作为数据库。这套组合无需复杂的运维配置,代码可直接运行,非常适合作为企业内部协作工具的原型或生产环境基础。
请确保你的电脑上安装了Python 3.8及以上版本。打开终端或命令行工具,执行以下命令安装核心依赖库:
pip install flask flask-sqlalchemy flask-cors
安装完成后,在本地创建一个项目文件夹,例如archive_system,并在其中创建app.py作为主程序文件。我们将在这个文件中完成所有的后端逻辑,包括数据库模型定义、API接口开发以及协作流程控制。
二、数据库模型映射档案制度
档案制度的核心在于“管什么”、“谁来管”、“流向哪”。在技术实现上,我们需要设计三张核心表:部门表、档案表和协作日志表。这种设计能强制执行档案归属权,并记录每一次跨部门的交互行为,满足制度留痕的要求。
在app.py中写入以下数据库配置与模型代码:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive_collaboration.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
1. 部门表:定义组织架构
class Department(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
档案与部门是一对多关系
archives = db.relationship('Archive', backref='department', lazy=True)
2. 档案表:核心数据实体
class Archive(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
status = db.Column(db.String(20), default='draft') draft, submitted, approved, rejected
current_dept_id = db.Column(db.Integer, db.ForeignKey('department.id'), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
3. 协作日志表:记录跨部门流转全链路
class CollaborationLog(db.Model):
id = db.Column(db.Integer, primary_key=True)
archive_id = db.Column(db.Integer, db.ForeignKey('archive.id'), nullable=False)
from_dept_id = db.Column(db.Integer, db.ForeignKey('department.id'))
to_dept_id = db.Column(db.Integer, db.ForeignKey('department.id'))
action = db.Column(db.String(50)) submit, approve, reject
comment = db.Column(db.String(200))
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
初始化数据库
with app.app_context():
db.create_all()
这段代码通过ORM(对象关系映射)将抽象的“制度”转化为具体的数据库结构。注意,CollaborationLog表是协作的关键,它记录了档案从哪个部门流向了哪个部门,以及具体的操作动作,这是审计和追溯的唯一数据源。
三、核心协作接口开发
接下来,我们需要开发三个核心接口来实现部门间的协作:档案提交接口、跨部门审批接口和协作记录查询接口。这些接口将直接对应业务流程中的动作。
继续在app.py中添加以下路由代码:
接口1:部门内部创建并提交档案
@app.route('/api/archives', methods=['POST'])
def create_archive():
data = request.json
dept_name = data.get('dept_name')
title = data.get('title')
content = data.get('content')
查找或创建部门(模拟组织架构自动适配)
dept = Department.query.filter_by(name=dept_name).first()
if not dept:
dept = Department(name=dept_name)
db.session.add(dept)
db.session.commit()
创建档案
new_archive = Archive(title=title, content=content, current_dept_id=dept.id, status='submitted')
db.session.add(new_archive)
db.session.commit()
记录提交日志
log = CollaborationLog(archive_id=new_archive.id, from_dept_id=dept.id,
to_dept_id=dept.id, action='submit', comment='初始提交')
db.session.add(log)
db.session.commit()
return jsonify({'msg': '档案提交成功', 'archive_id': new_archive.id}), 201
接口2:跨部门协作审批
@app.route('/api/archives//collaborate', methods=['POST'])
def collaborate_archive(archive_id):
data = request.json
action = data.get('action') 'approve' or 'reject'
target_dept_name = data.get('target_dept_name') 档案流向的部门
operator_dept_name = data.get('operator_dept_name') 当前操作部门
comment = data.get('comment', '')
archive = Archive.query.get_or_404(archive_id)
operator_dept = Department.query.filter_by(name=operator_dept_name).first()
target_dept = Department.query.filter_by(name=target_dept_name).first()
权限校验:只有当前持有档案的部门才能操作
if archive.current_dept_id != operator_dept.id:
return jsonify({'error': '权限不足:当前部门不持有该档案'}), 403
状态流转逻辑
if action == 'approve':
审批通过,档案流向目标部门
archive.status = 'approved'
archive.current_dept_id = target_dept.id
log_action = f'流转至 {target_dept_name}'
elif action == 'reject':
驳回,档案停留在当前部门或退回上一级(此处简化为停留在当前)
archive.status = 'rejected'
log_action = '驳回'
else:
return jsonify({'error': '无效的操作类型'}), 400
记录协作日志
log = CollaborationLog(
archive_id=archive.id,
from_dept_id=operator_dept.id,
to_dept_id=target_dept.id if action == 'approve' else operator_dept.id,
action=log_action,
comment=comment
)
db.session.add(log)
db.session.commit()
return jsonify({'msg': '操作成功', 'current_status': archive.status}), 200
接口3:查询协作全链路
@app.route('/api/archives//logs', methods=['GET'])
def get_archive_logs(archive_id):
logs = CollaborationLog.query.filter_by(archive_id=archive_id).order_by(CollaborationLog.timestamp.desc()).all()
result = []
for log in logs:
result.append({
'action': log.action,
'from': Department.query.get(log.from_dept_id).name,
'to': Department.query.get(log.to_dept_id).name,
'comment': log.comment,
'time': log.timestamp.strftime('%Y-%m-%d %H:%M:%S')
})
return jsonify(result), 200
if __name__ == '__main__':
app.run(debug=True, port=5000)
上述代码中,collaborate_archive函数是最核心的协作点。它实现了业务规则:只有当前持有档案的部门(archive.current_dept_id)才能对档案进行操作。如果审批通过,档案的归属权会转移到target_dept_id,从而在技术底层强制实现了部门间的交接。
四、前端操作界面实现
为了方便非技术人员直接上手操作,我们编写一个简单的HTML页面作为控制台。在项目文件夹下创建templates文件夹,并在其中创建index.html。这个页面将包含“提交档案”和“审批流转”两个功能模块。
档案协作控制台
档案协作控制台
1. 提交新档案
2. 跨部门协作审批
确保在app.py顶部添加渲染模板的支持:

from flask import render_template
... 其他代码 ...
@app.route('/')
def index():
return render_template('index.html')
五、全流程实操验证
现在,所有代码已经准备就绪。我们将通过一个具体的业务场景来验证这套系统是否真正解决了“部门协作”的问题。场景设定为:财务部产生一份档案,需要流转到档案馆归档。
步骤1:启动系统
在终端运行启动命令:
python app.py
看到输出Running on http://127.0.0.1:5000后,打开浏览器访问该地址。
步骤2:财务部提交档案
在网页“提交新档案”区域,输入以下信息:
- 所属部门: 财务部
- 档案 2023年Q4资金流水
- 档案内容: 涉密文件,包含所有转账记录...
点击提交档案按钮。系统会返回JSON数据,例如{"archive_id": 1}。请记住这个ID,这里是1。
步骤3:档案馆进行审批协作
此时档案状态在数据库中属于“财务部”。现在模拟档案馆人员进行审批。在网页“跨部门协作审批”区域输入:
- 档案ID: 1
- 当前操作部门: 财务部(注意:这里必须填写当前持有档案的部门,否则会报错,这是制度约束的体现)
- 目标部门: 档案馆
- 操作类型: 审批通过并流转
- 审批意见: 资料齐全,同意归档
点击执行协作。如果成功,会弹出“操作成功”提示。
步骤4:查看协作全链路
点击查看流转日志按钮。页面下方将显示该档案从产生到归档的所有操作记录:
[2023-10-27 10:00:00] submit | 从: 财务部 -> 到: 财务部 | 备注: 初始提交
[2023-10-27 10:05:00] 流转至 档案馆 | 从: 财务部 -> 到: 档案馆 | 备注: 资料齐全,同意归档
通过日志可以清晰地看到,档案的物理位置(或逻辑归属权)已经从“财务部”转移到了“档案馆”。如果此时再次尝试以“财务部”身份对该档案进行操作,系统会返回403权限错误。这就在技术层面强制保证了档案流转的严肃性,杜绝了越权操作。