一扫即达,万物互联
ScanPlatform 是 sanMuSoft 平台生态中的智能扫描场景编排引擎。它将传统的"扫描-查询-展示"流程升级为脚本驱动的动态交互体验——同一次扫码,可以根据业务场景呈现完全不同的界面和操作流。无论是仓库盘点、药品追溯、物流签收还是票务验证,一套平台,千面场景。
传统扫描系统:界面写死,改一个按钮就要重新发版。
ScanPlatform:C# 脚本动态生成界面。扫描后的页面布局、按钮、表单、颜色主题全部由脚本实时编排。新增一个业务场景?写一段脚本,即刻生效,无需重新编译前端。
// 一段脚本,就是一个完整场景
return new ScanResponse {
View = new ViewConfiguration { ViewName = "CardView", Title = "药品信息" },
Content = Util.UI
.Alert("药品在有效期内", "success")
.Text(drugName, "h1")
.KeyValue(new[] { ... })
.Form("Dispense", new[] { ... }) // 嵌入出库表单
.Build()
};
扫描不是终点,而是业务流程的起点。
ScanPlatform 支持完整的二次交互:用户点击按钮、填写表单、提交确认——所有操作都会触发同一段脚本的二次执行,实现真正的扫描即操作。
| 场景 | 首次扫描 | 二次交互 |
|---|---|---|
| 资产盘点 | 显示资产信息 | 填写盘点状态 → 更新数据库 |
| 药品管理 | 显示药品详情 | 输入出库数量 → 扣减库存 |
| 物流追踪 | 显示物流轨迹 | 确认签收 / 异常上报 |
| 票务验证 | 显示票券信息 | 确认入场 → 更新票券状态 |
无缝接入 sanMuSoft.Data 数据访问层,支持 **SQLite / SQL Server / MySQL / Oracle / PostgreSQL 五大数据库。
脚本中一键切换数据源:
var asset = await Util.QueryFirstAsync("SELECT * FROM Assets WHERE...", ..., "UserDB");
var order = await Util.QueryFirstAsync("SELECT * FROM Orders WHERE...", ..., "MainDB");
无需预先定义实体类,查询结果直接以字典形式返回,字段访问灵活自由:
var drug = await Util.QueryFirstAsync("SELECT * FROM Drugs WHERE DrugCode = @code", ...);
var name = drug["Name"]?.ToString(); // 大小写不敏感
var price = Convert.ToDecimal(drug["Price"] ?? 0);
有实体类时也可使用强类型模式,兼顾灵活性与类型安全。
内置 20+ 种 UI 组件,通过链式调用快速构建专业界面:
| 视图 | 特点 | 适用场景 |
|---|---|---|
| CardView | 居中卡片,信息层次清晰 | 商品详情、资产信息 |
| FullScreenView | 沉浸式全屏 | 票务验证、安检通关 |
| FormView | 表单输入为主 | 盘点确认、数据录入 |
| TableView | 多行数据列表 | 维护记录、库存分布 |
| MessageView | 简洁消息提示 | 操作结果、错误提示 |
基于 Roslyn C# Scripting 引擎,脚本在受限沙箱中运行:
支持主流一维码/二维码格式:QR、Code128、Code39、EAN-13、EAN-8、UPC-A、DataMatrix……每个场景可独立配置支持的码制。
扫描资产条码 → 显示资产信息 → 选择盘点状态 → 提交更新 → 查看维护记录。全流程数字化,盘点效率提升 3 倍。
扫描药品追溯码 → 显示有效期/库存 → 自动过期预警 → 一键出库 → 库存实时扣减。保障用药安全,杜绝过期药品流出。
扫描商品条码 → 显示价格/促销/库存 → 查看各门店库存分布 → 加入购物车。店员手持设备即可完成全链路操作。
扫描快递单号 → 显示完整物流轨迹 → 确认签收 / 异常上报。签收数据实时回传,异常处理留痕可追溯。
扫描电子票二维码 → 全屏显示验证结果 → 语音播报座位信息 → 确认入场 → 票券状态更新。入场验证仅需 2 秒。
┌─────────────────────────────────────────┐
│ 前端层 (React 19 + Vite) │
│ 扫码引擎 ──→ DynamicRenderer ──→ UI │
│ ↓ ↑ │
│ 调用 /api/scan/process /api/scan/action│
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ 服务层 (ASP.NET Core) │
│ ScanController ──→ RoslynScriptEngine │
│ ↓ ↑ │
│ CompositeSceneRepository (DB + Memory) │
│ ↓ │
│ ScriptGlobals: Context + Util │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ 数据层 (sanMuSoft.Data) │
│ SQLite / SQL Server / MySQL / Oracle │
│ PostgreSQL │
└─────────────────────────────────────────┘
| 特性 | 说明 |
|---|---|
| 脚本引擎 | Roslyn C# Scripting,实时编译执行 |
| 开发模式 | C# 文本脚本 / 编译 DLL / 远程 URL 三种来源 |
| 数据访问 | Dictionary / 强类型实体 / DataTableHelp 三种方式 |
| 数据库支持 | SQLite、SQL Server、MySQL、Oracle、PostgreSQL、Access |
| UI 组件 | 20+ 内置组件,链式调用构建 |
| 视图模板 | CardView、FullScreenView、FormView、TableView、MessageView |
| 交互能力 | 按钮点击、表单提交、二次确认、语音播报 |
| 扫描模式 | 单次 / 连续 / 批量 / 验证 |
| 码制支持 | QR、Code128、Code39、EAN-13/8、UPC-A、DataMatrix |
| 安全机制 | 沙箱执行、5秒超时、操作白名单 |
| 管理界面 | Blazor 管理页面,在线编辑脚本、实时预览 |
在管理页面中新建场景,配置名称、支持的码制、默认视图:
场景ID: asset_inventory
名称: 资产盘点
支持码制: Code128, Code39, QR
默认视图: CardView
在脚本编辑器中编写 C# 处理逻辑:
// 首次扫描:查询资产信息
var asset = await Util.QueryFirstAsync(
"SELECT * FROM Assets WHERE AssetNo = @no",
new { no = Context.Request.BarcodeData }, "UserDB");
// 返回卡片界面 + 盘点表单
return new ScanResponse {
Content = Util.UI
.KeyValue(new[] { ... })
.Form("ConfirmInventory", new[] { ... })
.Build()
};
前端打开扫描页面,选择场景,扫码即可看到动态渲染的界面。
ScanPlatform 并非孤立产品,而是 sanMuSoft 低代码平台生态的有机组成部分:
ScanPlatform v2.0 让扫描从"读取条码"进化为"驱动业务流程"。
一段脚本,千面场景。一扫即达,万物互联。
扫码,从未如此强大。