# 智能柜系统指南
## 概述
智能柜系统是本项目的重要功能模块,用于管理智能储物柜设备,支持企业微信集成、格口操作、状态监控等功能。
## 功能特性
- ✅ 智能柜设备管理
- ✅ 格口状态监控
- ✅ 企业微信集成(支持corpid)
- ✅ 格口操作(开锁、关锁、锁定)
- ✅ 使用记录管理
- ✅ 设备状态监控
## 数据库设计
### 智能柜表结构
#### smart_cabinet (智能柜表)
```sql
CREATE TABLE `smart_cabinet` (
`id` bigint NOT NULL AUTO_INCREMENT,
`cabinet_no` varchar(50) NOT NULL COMMENT '柜体编号',
`name` varchar(100) NOT NULL COMMENT '柜体名称',
`location` varchar(200) DEFAULT NULL COMMENT '安装位置',
`status` tinyint DEFAULT '1' COMMENT '状态:1-正常 0-停用',
`corpid` varchar(50) DEFAULT NULL COMMENT '企业微信id',
`ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',
`port` int DEFAULT NULL COMMENT '端口',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_cabinet_no` (`cabinet_no`)
);
```
#### cabinet_cell (柜体格口表)
```sql
CREATE TABLE `cabinet_cell` (
`id` bigint NOT NULL AUTO_INCREMENT,
`cabinet_id` bigint NOT NULL COMMENT '柜体ID',
`cell_no` varchar(20) NOT NULL COMMENT '格口编号',
`cell_type` varchar(20) DEFAULT 'SMALL' COMMENT '格口类型:SMALL-小格 LARGE-大格',
`status` tinyint DEFAULT '1' COMMENT '状态:1-空闲 2-占用 3-故障',
`current_order_id` bigint DEFAULT NULL COMMENT '当前订单ID',
`lock_status` tinyint DEFAULT '0' COMMENT '锁状态:0-关闭 1-开启',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_cabinet_id` (`cabinet_id`),
KEY `idx_cell_no` (`cell_no`)
);
```
#### cabinet_cell_operation (格口操作记录表)
```sql
CREATE TABLE `cabinet_cell_operation` (
`id` bigint NOT NULL AUTO_INCREMENT,
`cabinet_id` bigint NOT NULL COMMENT '柜体ID',
`cell_id` bigint NOT NULL COMMENT '格口ID',
`operation_type` varchar(20) NOT NULL COMMENT '操作类型:OPEN-开锁 CLOSE-关锁 LOCK-锁定',
`operator_id` bigint DEFAULT NULL COMMENT '操作员ID',
`operator_type` varchar(20) DEFAULT NULL COMMENT '操作员类型:USER-用户 ADMIN-管理员',
`result` tinyint DEFAULT '1' COMMENT '操作结果:1-成功 0-失败',
`error_msg` varchar(500) DEFAULT NULL COMMENT '错误信息',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_cabinet_cell` (`cabinet_id`, `cell_id`),
KEY `idx_create_time` (`create_time`)
);
```
## API接口
### 1. 柜体管理
#### 1.1 获取柜体列表
```bash
GET /cabinet/list?pageNum=1&pageSize=10
```
**响应**:
```json
{
"code": 200,
"msg": "success",
"data": {
"total": 5,
"rows": [
{
"id": 1,
"cabinetNo": "CAB001",
"name": "一号智能柜",
"location": "一楼大厅",
"status": 1,
"corpid": "ww1234567890abcdef",
"ipAddress": "192.168.1.100",
"port": 8080,
"totalCells": 24,
"freeCells": 18,
"createTime": "2025-03-08 10:00:00"
}
]
}
}
```
#### 1.2 新增柜体
```bash
POST /cabinet
Content-Type: application/json
{
"cabinetNo": "CAB002",
"name": "二号智能柜",
"location": "二楼走廊",
"corpid": "ww1234567890abcdef",
"ipAddress": "192.168.1.101",
"port": 8080
}
```
#### 1.3 修改柜体
```bash
PUT /cabinet/{cabinetId}
Content-Type: application/json
{
"name": "二号智能柜(更新)",
"location": "二楼东侧走廊",
"status": 1
}
```
### 2. 格口管理
#### 2.1 获取格口列表
```bash
GET /cabinet/{cabinetId}/cells?pageNum=1&pageSize=20
```
**响应**:
```json
{
"code": 200,
"msg": "success",
"data": {
"total": 24,
"rows": [
{
"id": 1,
"cellNo": "A01",
"cellType": "SMALL",
"status": 1,
"lockStatus": 0,
"currentOrderId": null,
"createTime": "2025-03-08 10:00:00"
}
]
}
}
```
#### 2.2 格口操作
```bash
POST /cabinet/cell/operate
Content-Type: application/json
{
"cabinetId": 1,
"cellId": 1,
"operation": "open",
"operatorId": 1001,
"operatorType": "USER"
}
```
**操作类型**:
- `open`: 开锁
- `close`: 关锁
- `lock`: 锁定
### 3. 操作记录
#### 3.1 获取操作记录
```bash
GET /cabinet/operation/logs?cabinetId=1&cellId=1&pageNum=1&pageSize=10
```
## 企业微信集成
### 1. corpid字段说明
`corpid`字段用于关联企业微信应用,支持以下功能:
- 企业微信用户身份验证
- 企业微信消息推送
- 企业微信扫码开柜
- 企业微信审批流程
### 2. 企业微信扫码开柜
#### 2.1 生成开柜二维码
```bash
GET /cabinet/{cabinetId}/qrcode
```
**响应**:
```json
{
"code": 200,
"msg": "success",
"data": {
"qrcodeUrl": "https://qyapi.weixin.qq.com/cgi-bin/qrcode?ticket=xxx",
"expireTime": "2025-03-08 11:00:00"
}
}
```
#### 2.2 企业微信回调处理
当用户扫描二维码后,企业微信会回调到配置的URL:
```bash
POST /qywx/cabinet/callback
Content-Type: application/xml
```
**回调数据**:
```xml
1348831860
```
## 设备通信协议
### 1. TCP通信协议
智能柜设备通过TCP协议与系统通信:
#### 1.1 开锁指令
```
指令格式: OPEN|{cabinetNo}|{cellNo}|{timestamp}|{sign}
示例: OPEN|CAB001|A01|1657794651|BDF0099C9FF443C4DC5C5D68C4B97C3F
```
#### 1.2 关锁指令
```
指令格式: CLOSE|{cabinetNo}|{cellNo}|{timestamp}|{sign}
```
#### 1.3 状态查询
```
指令格式: STATUS|{cabinetNo}|{timestamp}|{sign}
```
### 2. 签名算法
```java
public class CabinetSignUtils {
public static String generateSign(String cabinetNo, String cellNo, long timestamp, String secret) {
String content = cabinetNo + "|" + cellNo + "|" + timestamp + "|" + secret;
return DigestUtils.md5Hex(content).toUpperCase();
}
public static boolean verifySign(String cabinetNo, String cellNo, long timestamp, String sign, String secret) {
String expectedSign = generateSign(cabinetNo, cellNo, timestamp, secret);
return expectedSign.equals(sign);
}
}
```
## 业务逻辑
### 1. 开柜流程
```java
@Service
@RequiredArgsConstructor
public class CabinetService {
private final CabinetDeviceClient deviceClient;
private final CabinetCellOperationService operationService;
@Transactional
public void openCell(Long cabinetId, Long cellId, Long operatorId, String operatorType) {
// 1. 验证柜体和格口状态
CabinetCell cell = validateCellStatus(cabinetId, cellId);
// 2. 发送开锁指令
boolean success = deviceClient.sendOpenCommand(cell.getCabinetNo(), cell.getCellNo());
// 3. 记录操作日志
CabinetCellOperation operation = createOperationLog(
cabinetId, cellId, "OPEN", operatorId, operatorType, success
);
// 4. 更新格口状态
if (success) {
updateCellLockStatus(cellId, 1); // 锁开启
} else {
throw new ApiException("开锁失败,请重试");
}
}
}
```
### 2. 状态监控
```java
@Service
@RequiredArgsConstructor
public class CabinetMonitorService {
@Scheduled(fixedRate = 30000) // 每30秒执行一次
public void monitorCabinetStatus() {
List cabinets = cabinetService.getAllActiveCabinets();
for (SmartCabinet cabinet : cabinets) {
try {
// 查询设备状态
CabinetStatus status = deviceClient.queryStatus(cabinet.getCabinetNo());
// 更新数据库状态
updateCabinetStatus(cabinet.getId(), status);
// 记录监控日志
logMonitorResult(cabinet.getId(), status, true);
} catch (Exception e) {
// 设备连接失败
logMonitorResult(cabinet.getId(), null, false);
log.error("监控柜体{}状态失败: {}", cabinet.getCabinetNo(), e.getMessage());
}
}
}
}
```
## 配置管理
### 1. 设备配置
```yaml
cabinet:
device:
timeout: 5000
retry-count: 3
heartbeat-interval: 30000
reconnect-interval: 10000
```
### 2. 企业微信配置
```yaml
qywx:
cabinet:
enabled: true
callback-url: https://your-domain.com/qywx/cabinet/callback
qrcode-expire: 300
```
## 安全考虑
### 1. 通信安全
- TCP通信使用TLS加密
- 指令签名验证
- 防止重放攻击
- IP白名单控制
### 2. 业务安全
- 操作权限验证
- 操作频率限制
- 异常操作告警
- 操作日志审计
### 3. 数据安全
- 敏感数据加密存储
- 数据库访问权限控制
- 定期数据备份
- 操作日志保留
## 故障处理
### 1. 设备离线
- 自动重连机制
- 状态告警通知
- 手动干预流程
### 2. 通信异常
- 超时重试机制
- 异常日志记录
- 人工排查流程
### 3. 数据不一致
- 状态同步机制
- 数据修复工具
- 手动核对流程
## 监控告警
### 1. 监控指标
- 设备在线率
- 操作成功率
- 响应时间
- 错误率
### 2. 告警规则
- 设备离线超过5分钟
- 操作失败率超过10%
- 响应时间超过3秒
- 连续错误次数超过3次
### 3. 告警方式
- 企业微信消息
- 短信通知
- 邮件通知
- 系统日志