2024.10 - 2025.02 / 独立开发
RFID 固定资产管理系统
面向中学的固定资产管理平台,支持资产建档、RFID 标签打印、手持盘点与审计追溯。

业务范围与资产识别
系统覆盖采购建档、资产管理、维修、盘点、报废、耗材与报表等流程。每项固定资产同时保存业务数据、唯一 RFID EPC 及可扫描的 QR code,让后台建档、标签打印与现场盘点使用同一个资产识别码。

行级数据权限与部门树
系统将「可做什么」与「可操作哪些数据」分开处理。使用 Django 的 group / permission 管理各模块的 CRUD 权限;数据查询及写入则依用户被授权的部门集合过滤,形成行级数据权限(row-level security)。部门以树状结构表示,授权上层节点时会展开其下属部门,让管理人员可按组织范围管理资产,而非只依角色获取全校数据。
资产、采购单、盘点任务等主业务数据均带有部门与校部归属。建立盘点任务时,后端会验证所选资产是否位于用户可见的部门范围,并检查资产与目标部门的校部一致性;这些限制同时应用在 API,而不是只依赖前端隐藏按钮。

自动化审计链路
审计不由各个业务 service 手动插入日志,以免新功能或异常流程遗漏记录。数据库层使用 PostgreSQL pgaudit 保存数据库操作;业务模型则以 django-pghistory 生成 PostgreSQL trigger,在 INSERT、UPDATE、DELETE 时自动写入事件数据,并在事件的 context 中附带操作者、员工编号与 IP 地址。
两者分别处理数据库操作与业务数据版本;另外在 HTTP response 加入 username,让反向代理的 access log 也可关联到实际账号。这样可从 HTTP 请求、数据库审计到单笔资产的变更历史交叉追查,同时将记录责任从容易漏写的业务代码中抽离。
以任务保存盘点结果
盘点不是在扫描后直接改写资产主表,而是先建立有部门范围及起止日期的盘点任务,再将目标资产写入任务明细。扫描枪返回 EPC 后,前端将对应明细批量更新为正常、遗失或损坏,并记录盘点时间;任务本身再由待盘点进入进行中或完成。这使每次盘点都有独立的资产范围与结果:即使资产后续转移,既有任务的成员及盘点结果仍可回顾。
erDiagram
DEPARTMENT ||--o{ FIXED_ASSET : manages
DEPARTMENT ||--o{ INVENTORY_TASK : scopes
PURCHASE_ORDER ||--o{ FIXED_ASSET : source_of
INVENTORY_TASK ||--o{ INVENTORY_TASK_ASSET : records
FIXED_ASSET ||--o{ INVENTORY_TASK_ASSET : appears_in
DEPARTMENT {
}
PURCHASE_ORDER {
}
FIXED_ASSET {
string asset_code
string epc
}
INVENTORY_TASK {
string status
date start_date
date end_date
}
INVENTORY_TASK_ASSET {
string inventory_status
datetime inventory_time
}

RFID + QR code 标签打印
资产标签同时包含 RFID 与 QR code:RFID 适合以扫描枪在现场快速、非接触式盘点;QR code 则可由一般手机扫描,作为没有 RFID 扫描枪时的低门槛入口。Web 前端不直接处理打印机驱动,而是调用将厂商驱动封装成 HTTP API 的本地打印服务;流程会枚举及连接设备、检查打印机状态、加载标签模板,填入资产编号、名称、EPC 与 QR code 后逐张打印并写入 RFID。

Android 手持盘点 App
为配合 Android 手持 RFID 扫描枪,将 React 界面以 Tauri 打包成移动 App,并把厂商提供的 AAR 与 JNI native library 封装为 Tauri mobile plugin。前端只需调用 TypeScript API;Kotlin plugin 则负责连接扫描枪、开始/停止连续盘点及把扫描枪 callback 转为前端 event,使盘点界面可实时接收 EPC、RSSI 等数据。Android SDK、ABI library 打包与 callback-to-event 的实现细节整理于《在 Tauri Android App 中封装 RFID SDK》。
待补:Android RFID 扫描枪盘点界面截图