所有项目

2024.10 - 2025.02 / 独立开发

RFID 固定资产管理系统

面向中学的固定资产管理平台,支持资产建档、RFID 标签打印、手持盘点与审计追溯。

ReactDjangoPostgreSQLTauriAndroid JNI
RFID 固定资产管理系统 预览

业务范围与资产识别

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

固定资产列表,包含筛选条件、资产编号、部门、存放地点及采购单关联

行级数据权限与部门树

系统将「可做什么」与「可操作哪些数据」分开处理。使用 Django 的 group / permission 管理各模块的 CRUD 权限;数据查询及写入则依用户被授权的部门集合过滤,形成行级数据权限(row-level security)。部门以树状结构表示,授权上层节点时会展开其下属部门,让管理人员可按组织范围管理资产,而非只依角色获取全校数据。

资产、采购单、盘点任务等主业务数据均带有部门与校部归属。建立盘点任务时,后端会验证所选资产是否位于用户可见的部门范围,并检查资产与目标部门的校部一致性;这些限制同时应用在 API,而不是只依赖前端隐藏按钮。

单笔固定资产详情,包含 RFID EPC、部门、保管人及采购关联

自动化审计链路

审计不由各个业务 service 手动插入日志,以免新功能或异常流程遗漏记录。数据库层使用 PostgreSQL pgaudit 保存数据库操作;业务模型则以 django-pghistory 生成 PostgreSQL trigger,在 INSERTUPDATEDELETE 时自动写入事件数据,并在事件的 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 扫描枪盘点界面截图