zcloud-gbs-primeport/口门信息管理 - 后端需求文档.md

1274 lines
28 KiB
Markdown
Raw Normal View History

# 口门信息管理 - 后端需求文档
## 一、模块概述
### 1.1 模块名称
口门信息管理(后端)
### 1.2 所属模块
监管端 → 一级口门管理
### 1.3 功能描述
管理口门的基础信息,包括口门的增删改查、口门属性配置,以及口门关联的通道、闸机、摄像头设备的管理功能。
### 1.4 用户角色
- 监管端超级管理员
- 监管端系统管理员
### 1.5 数据表
| 表名 | 说明 |
|------|------|
| `mkmj` | 门口信息管理表(主表) |
| `mkmj_passage` | 口门门禁通道表 |
| `mkmj_gate` | 门口闸机表 |
| `video` | 摄像头表 |
---
## 二、数据字典(前端静态配置)
以下数据字典由前端静态配置,无需后端提供接口:
### 2.1 口门级别 (mkmj_level)
| 值 | 名称 |
|----|------|
| 1 | 一级 |
| 2 | 二级 |
### 2.2 口门类型 (mkmj_type)
| 值 | 名称 |
|----|------|
| 1 | 人行 |
| 2 | 车行 |
| 3 | 综合 |
### 2.3 口门状态 (mkmj_status)
| 值 | 名称 |
|----|------|
| 1 | 停用 |
| 2 | 正常 |
| 3 | 暂时管理 |
### 2.4 所属港区 (hg_auth_area)
| 值 | 名称 |
|----|------|
| qianwan | 前湾港区 |
| dongjiakou | 董家口港区 |
| huangdao | 黄岛港区 |
| other | 其他港区 |
### 2.5 闸机状态 (gate_status)
| 值 | 名称 |
|----|------|
| 1 | 停用 |
| 2 | 正常 |
### 2.6 通道类型 (passage_type)
| 值 | 名称 |
|----|------|
| 1 | 人行 |
| 2 | 车行 |
| 3 | 综合 |
### 2.7 通道状态 (passage_status)
| 值 | 名称 |
|----|------|
| 1 | 停用 |
| 2 | 正常 |
### 2.8 摄像头类型 (video_type)
| 值 | 名称 |
|----|------|
| 1 | 移动 |
| 2 | 平台 |
### 2.9 设备类型 (device_type)
| 值 | 名称 |
|----|------|
| 1 | 口门 |
| 2 | 闸机 |
---
## 三、口门管理接口
### 3.1 查询口门列表
**接口:** `GET /api/mkmj/list`
**描述:** 分页查询口门列表,支持条件筛选
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | int | 是 | 页码,默认 1 |
| pageSize | int | 是 | 每页条数,默认 20最大 100 |
| mkmjName | String | 否 | 口门名称,模糊查询 |
| hgAuthArea | String | 否 | 所属港区编码 |
| mkmjStatus | Integer | 否 | 口门状态 |
| mkmjLevel | Integer | 否 | 口门级别 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"list": [
{
"id": 101,
"mkmjName": "一号口门",
"hgAuthArea": "qianwan",
"hgAuthAreaName": "前湾港区",
"mkmjLevel": 1,
"mkmjType": "3",
"mkmjTypeName": "综合",
"mkmjStatus": 2,
"mkmjStatusName": "正常",
"longitude": "120.123456",
"latitude": "36.123456",
"passageCount": 5,
"gateCount": 10,
"videoCount": 8
}
],
"total": 50,
"page": 1,
"pageSize": 20
}
}
```
**实现逻辑:**
1. 根据条件动态构建查询语句
2. `hgAuthAreaName`、`mkmjTypeName`、`mkmjStatusName` 根据数据字典转换
3. 仅查询 `delete_enum = 'FALSE'` 的记录
4. passageCount、gateCount、videoCount 是统计的相关联的表统计出来的。
---
### 3.2 获取口门详情
**接口:** `GET /api/mkmj/detail/{id}`
**描述:** 获取口门详细信息及关联设备统计
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 口门 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 101,
"mkmjName": "一号口门",
"hgAuthArea": "qianwan",
"hgAuthAreaName": "前湾港区",
"mkmjLevel": 1,
"mkmjLevelName": "一级",
"mkmjType": "3",
"mkmjTypeName": "综合",
"mkmjStatus": 2,
"mkmjStatusName": "正常",
"inDirectionArea": null,
"inDirectionAreaName": null,
"outDirectionArea": null,
"outDirectionAreaName": null,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00",
"updateName": "管理员",
"updateTime": "2026-03-05 14:30:00"
}
}
```
**实现逻辑:**
1. 查询口门基本信息
2. 统计关联的通道、闸机、摄像头数量(`delete_enum = 'FALSE'`
3. 数据字典字段转换名称
---
### 3.3 新增口门
**接口:** `POST /api/mkmj/add`
**描述:** 新增口门信息
**请求参数:**
```json
{
"mkmjName": "一号口门",
"hgAuthArea": "qianwan",
"hgAuthAreaName": "前湾港区",
"mkmjLevel": 1,
"mkmjType": "3",
"mkmjStatus": 2,
"inDirectionArea": null,
"inDirectionAreaName": null,
"outDirectionArea": null,
"outDirectionAreaName": null,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息"
}
```
**请求参数说明:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| mkmjName | String | 是 | 口门名称2-50 字符 |
| hgAuthArea | String | 是 | 所属港区编码 |
| hgAuthAreaName | String | 是 | 所属港区名称 |
| mkmjLevel | Integer | 是 | 口门级别1-一级2-二级 |
| mkmjType | String | 是 | 口门类型1-人行2-车行3-综合 |
| mkmjStatus | Integer | 是 | 口门状态1-停用2-正常3-暂时管理 |
| inDirectionArea | Long | 否 | 入方向区域 ID |
| inDirectionAreaName | String | 否 | 入方向区域名称 |
| outDirectionArea | Long | 否 | 出方向区域 ID |
| outDirectionAreaName | String | 否 | 出方向区域名称 |
| longitude | String | 是 | 经度,-180~180 |
| latitude | String | 是 | 纬度,-90~90 |
| remarks | String | 否 | 备注≤255 字符 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 101
}
}
```
**实现逻辑:**
1. 校验必填参数
---
### 3.4 编辑口门
**接口:** `PUT /api/mkmj/update`
**描述:** 编辑口门信息
**请求参数:**
```json
{
"id": 101,
"mkmjName": "一号口门",
"hgAuthArea": "qianwan",
"hgAuthAreaName": "前湾港区",
"mkmjLevel": 1,
"mkmjType": "3",
"mkmjStatus": 2,
"inDirectionArea": null,
"inDirectionAreaName": null,
"outDirectionArea": null,
"outDirectionAreaName": null,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "更新备注"
}
```
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
**实现逻辑:**
1. 校验 ID 存在性
2. 校验口门名称唯一性(排除当前记录)
3. 校验经度、纬度范围
4. 填充更新字段:
- `update_time` = 当前时间
- `update_id` = 当前用户 ID
- `update_name` = 当前用户姓名
5. 更新数据库
---
### 3.5 删除口门
**接口:** `DELETE /api/mkmj/delete/{id}`
**描述:** 删除口门(软删除),同步停用关联设备
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 口门 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
**实现逻辑:**
1. 校验 ID 存在性
2. 检查关联数据:
- 查询关联通道数量(`mkmj_passage``mkmj_id = id``delete_enum = 'FALSE'`
- 查询关联闸机数量(`mkmj_gate``mkmj_id = id``delete_enum = 'FALSE'`
- 查询关联摄像头数量(`video``foreign_id = id``device_type = 1``delete_enum = 'FALSE'`
- 查询关联审批人数量(`mkmj_approval_user``mkmj_id = id``delete_enum = 'FALSE'`
3. 如存在关联数据,返回错误码 `2002` 及关联详情
4. 执行软删除:`update mkmj set delete_enum = 'TRUE' where id = ?`
5. 同步停用关联的通道、闸机、摄像头(更新 `delete_enum = 'TRUE'`
6. 记录操作日志
**错误响应(有关联数据时):**
```json
{
"code": 2002,
"message": "该口门下有关联数据,无法删除",
"data": {
"passageCount": 5,
"gateCount": 10,
"videoCount": 8,
"approvalUserCount": 3
}
}
```
---
### 3.6 口门名称唯一性校验
**接口:** `GET /api/mkmj/check-name`
**描述:** 校验口门名称是否重复
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| mkmjName | String | 是 | 口门名称 |
| id | Long | 否 | 当前口门 ID编辑时传 |
**响应数据:**
```json
{
"code": 200,
"data": {
"available": true
}
}
```
**实现逻辑:**
1. 查询 `mkmj` 表,条件:`mkmjName = ?` AND `delete_enum = 'FALSE'`
2. 如传入 `id`,则排除该记录:`AND id != ?`
3. 查询结果为空则 `available = true`,否则 `available = false`
---
## 四、通道管理接口
### 4.1 查询通道列表
**接口:** `GET /api/mkmj/passage/list`
**描述:** 分页查询通道列表,支持按口门筛选
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | int | 是 | 页码,默认 1 |
| pageSize | int | 是 | 每页条数,默认 20 |
| mkmjId | Long | 否 | 口门 ID |
| passageName | String | 否 | 通道名称,模糊查询 |
| passageType | Integer | 否 | 通道类型 |
| passageStatus | Integer | 否 | 通道状态 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"list": [
{
"id": 1001,
"mkmjId": 101,
"mkmjName": "一号口门",
"passageName": "A 通道",
"passageType": 1,
"passageTypeName": "人行",
"passageStatus": 2,
"passageStatusName": "正常",
"longitude": "120.123456",
"latitude": "36.123456",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00"
}
],
"total": 50,
"page": 1,
"pageSize": 20
}
}
```
---
### 4.2 获取通道详情
**接口:** `GET /api/mkmj/passage/detail/{id}`
**描述:** 获取通道详细信息
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 通道 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1001,
"mkmjId": 101,
"mkmjName": "一号口门",
"passageName": "A 通道",
"passageType": 1,
"passageTypeName": "人行",
"passageStatus": 2,
"passageStatusName": "正常",
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00",
"updateName": "管理员",
"updateTime": "2026-03-05 14:30:00"
}
}
```
---
### 4.3 新增通道
**接口:** `POST /api/mkmj/passage/add`
**描述:** 新增通道信息
**请求参数:**
```json
{
"mkmjId": 101,
"passageName": "A 通道",
"passageType": 1,
"passageStatus": 2,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息"
}
```
**请求参数说明:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| mkmjId | Long | 是 | 所属口门 ID |
| passageName | String | 是 | 通道名称2-50 字符 |
| passageType | Integer | 是 | 通道类型1-人行2-车行3-综合 |
| passageStatus | Integer | 是 | 通道状态1-停用2-正常 |
| longitude | String | 否 | 经度 |
| latitude | String | 否 | 纬度 |
| remarks | String | 否 | 备注≤255 字符 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1001
}
}
```
**实现逻辑:**
1. 校验必填参数
2. 校验口门 ID 存在性(`mkmj` 表,`delete_enum = 'FALSE'`
3. 校验通道名称在同一口门下唯一
4. 填充公共字段
5. 插入数据库
---
### 4.4 编辑通道
**接口:** `PUT /api/mkmj/passage/update`
**描述:** 编辑通道信息
**请求参数:**
```json
{
"id": 1001,
"mkmjId": 101,
"passageName": "A 通道",
"passageType": 1,
"passageStatus": 2,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "更新备注"
}
```
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
---
### 4.5 删除通道
**接口:** `DELETE /api/mkmj/passage/delete/{id}`
**描述:** 删除通道(软删除),同步停用关联闸机
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 通道 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
**实现逻辑:**
1. 校验 ID 存在性
2. 检查关联的闸机数量(`mkmj_gate``passage_id = id``delete_enum = 'FALSE'`
3. 如存在关联闸机,返回错误
4. 执行软删除
5. 同步停用关联的闸机
---
### 4.6 按口门查询通道列表(简化版)
**接口:** `GET /api/mkmj/passage/by-mkmj/{mkmjId}`
**描述:** 获取指定口门下的所有通道(用于下拉选择)
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| mkmjId | Long | 口门 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 1001,
"passageName": "A 通道",
"passageType": 1,
"passageTypeName": "人行"
},
{
"id": 1002,
"passageName": "B 通道",
"passageType": 2,
"passageTypeName": "车行"
}
]
}
```
---
## 五、闸机管理接口
### 5.1 查询闸机列表
**接口:** `GET /api/mkmj/gate/list`
**描述:** 分页查询闸机列表,支持按口门、通道筛选
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | int | 是 | 页码,默认 1 |
| pageSize | int | 是 | 每页条数,默认 20 |
| mkmjId | Long | 否 | 口门 ID |
| passageId | String | 否 | 通道 ID |
| gateName | String | 否 | 闸机名称,模糊查询 |
| gateType | String | 否 | 闸机类型 |
| gateStatus | Integer | 否 | 闸机状态 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"list": [
{
"id": 2001,
"mkmjId": 101,
"mkmjName": "一号口门",
"passageId": "1001",
"passageName": "A 通道",
"gateNumber": "GATE-001",
"gateName": "1 号闸机",
"gateType": "1",
"gateTypeName": "人行闸机",
"gateStatus": 2,
"gateStatusName": "正常",
"gateCategory": "tripod",
"gateCategoryName": "三辊闸",
"gateModel": "ZK-100",
"gatePosition": "入口处",
"longitude": "120.123456",
"latitude": "36.123456",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00"
}
],
"total": 100,
"page": 1,
"pageSize": 20
}
}
```
---
### 5.2 获取闸机详情
**接口:** `GET /api/mkmj/gate/detail/{id}`
**描述:** 获取闸机详细信息
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 闸机 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 2001,
"mkmjId": 101,
"mkmjName": "一号口门",
"passageId": "1001",
"passageName": "A 通道",
"gateNumber": "GATE-001",
"gateName": "1 号闸机",
"gateType": "1",
"gateTypeName": "人行闸机",
"gateStatus": 2,
"gateStatusName": "正常",
"gateCategory": "tripod",
"gateCategoryName": "三辊闸",
"gateModel": "ZK-100",
"gatePosition": "入口处",
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00",
"updateName": "管理员",
"updateTime": "2026-03-05 14:30:00"
}
}
```
---
### 5.3 新增闸机
**接口:** `POST /api/mkmj/gate/add`
**描述:** 新增闸机信息
**请求参数:**
```json
{
"mkmjId": 101,
"passageId": "1001",
"gateNumber": "GATE-001",
"gateName": "1 号闸机",
"gateType": "1",
"gateStatus": 2,
"gateCategory": "tripod",
"gateCategoryName": "三辊闸",
"gateModel": "ZK-100",
"gatePosition": "入口处",
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息"
}
```
**请求参数说明:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| mkmjId | Long | 是 | 所属口门 ID |
| passageId | String | 是 | 所属通道 ID |
| gateNumber | String | 是 | 闸机标识,唯一 |
| gateName | String | 是 | 闸机名称2-50 字符 |
| gateType | String | 是 | 闸机类型 |
| gateStatus | Integer | 是 | 闸机状态1-停用2-正常 |
| gateCategory | String | 否 | 闸机类别编码 |
| gateCategoryName | String | 否 | 闸机类别名称 |
| gateModel | String | 否 | 闸机型号≤255 字符 |
| gatePosition | String | 否 | 闸机位置≤255 字符 |
| longitude | String | 否 | 经度 |
| latitude | String | 否 | 纬度 |
| remarks | String | 否 | 备注≤255 字符 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 2001
}
}
```
**实现逻辑:**
1. 校验必填参数
2. 校验口门 ID 存在性
3. 校验通道 ID 存在性(且属于该口门)
4. 校验闸机标识唯一性(`gateNumber`
5. 填充公共字段
6. 插入数据库
---
### 5.4 编辑闸机
**接口:** `PUT /api/mkmj/gate/update`
**描述:** 编辑闸机信息
**请求参数:**
```json
{
"id": 2001,
"mkmjId": 101,
"passageId": "1001",
"gateNumber": "GATE-001",
"gateName": "1 号闸机",
"gateType": "1",
"gateStatus": 2,
"gateCategory": "tripod",
"gateCategoryName": "三辊闸",
"gateModel": "ZK-100",
"gatePosition": "入口处",
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "更新备注"
}
```
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
---
### 5.5 删除闸机
**接口:** `DELETE /api/mkmj/gate/delete/{id}`
**描述:** 删除闸机(软删除),同步停用关联摄像头
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 闸机 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
**实现逻辑:**
1. 校验 ID 存在性
2. 检查关联的摄像头数量(`video``foreign_id = id``device_type = 2``delete_enum = 'FALSE'`
3. 如存在关联摄像头,返回错误
4. 执行软删除
5. 同步停用关联的摄像头
---
### 5.6 闸机标识唯一性校验
**接口:** `GET /api/mkmj/gate/check-number`
**描述:** 校验闸机标识是否重复
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| gateNumber | String | 是 | 闸机标识 |
| id | Long | 否 | 当前闸机 ID编辑时传 |
**响应数据:**
```json
{
"code": 200,
"data": {
"available": true
}
}
```
---
### 5.7 按口门/通道查询闸机列表(简化版)
**接口:** `GET /api/mkmj/gate/by-passage`
**描述:** 获取指定通道下的所有闸机(用于下拉选择)
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| passageId | String | 是 | 通道 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 2001,
"gateNumber": "GATE-001",
"gateName": "1 号闸机",
"gateType": "1",
"gateTypeName": "人行闸机"
},
{
"id": 2002,
"gateNumber": "GATE-002",
"gateName": "2 号闸机",
"gateType": "1",
"gateTypeName": "人行闸机"
}
]
}
```
---
## 六、摄像头管理接口
### 6.1 查询摄像头列表
**接口:** `GET /api/mkmj/video/list`
**描述:** 分页查询摄像头列表,支持按口门、闸机筛选
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | int | 是 | 页码,默认 1 |
| pageSize | int | 是 | 每页条数,默认 20 |
| foreignId | Long | 否 | 关联 ID口门 ID 或闸机 ID |
| deviceType | Integer | 否 | 设备类型1-口门2-闸机 |
| videoResourceName | String | 否 | 摄像头名称,模糊查询 |
| videoType | Integer | 否 | 摄像头类型 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"list": [
{
"id": 3001,
"foreignId": 101,
"deviceType": 1,
"deviceTypeName": "口门",
"videoResourceId": "CAM-001",
"videoResourceName": "1 号口门摄像头",
"videoType": 2,
"videoTypeName": "平台",
"longitude": "120.123456",
"latitude": "36.123456",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00"
}
],
"total": 200,
"page": 1,
"pageSize": 20
}
}
```
---
### 6.2 获取摄像头详情
**接口:** `GET /api/mkmj/video/detail/{id}`
**描述:** 获取摄像头详细信息
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 摄像头 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 3001,
"foreignId": 101,
"deviceType": 1,
"deviceTypeName": "口门",
"mkmjName": "一号口门",
"gateName": null,
"videoResourceId": "CAM-001",
"videoResourceName": "1 号口门摄像头",
"videoType": 2,
"videoTypeName": "平台",
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息",
"createName": "管理员",
"createTime": "2026-03-01 10:00:00",
"updateName": "管理员",
"updateTime": "2026-03-05 14:30:00"
}
}
```
---
### 6.3 新增摄像头
**接口:** `POST /api/mkmj/video/add`
**描述:** 新增摄像头信息
**请求参数:**
```json
{
"foreignId": 101,
"deviceType": 1,
"videoResourceId": "CAM-001",
"videoResourceName": "1 号口门摄像头",
"videoType": 2,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "备注信息"
}
```
**请求参数说明:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| foreignId | Long | 是 | 关联 ID口门 ID 或闸机 ID |
| deviceType | Integer | 是 | 设备类型1-口门2-闸机 |
| videoResourceId | String | 是 | 摄像头 ID唯一 |
| videoResourceName | String | 是 | 摄像头名称2-50 字符 |
| videoType | Integer | 是 | 摄像头类型1-移动2-平台 |
| longitude | String | 否 | 经度 |
| latitude | String | 否 | 纬度 |
| remarks | String | 否 | 备注≤255 字符 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 3001
}
}
```
**实现逻辑:**
1. 校验必填参数
2. 校验关联 ID 存在性(根据 `deviceType` 查询 `mkmj``mkmj_gate` 表)
3. 校验摄像头 ID 唯一性(`videoResourceId`
4. 填充公共字段
5. 插入数据库
---
### 6.4 编辑摄像头
**接口:** `PUT /api/mkmj/video/update`
**描述:** 编辑摄像头信息
**请求参数:**
```json
{
"id": 3001,
"foreignId": 101,
"deviceType": 1,
"videoResourceId": "CAM-001",
"videoResourceName": "1 号口门摄像头",
"videoType": 2,
"longitude": "120.123456",
"latitude": "36.123456",
"remarks": "更新备注"
}
```
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
---
### 6.5 删除摄像头
**接口:** `DELETE /api/mkmj/video/delete/{id}`
**描述:** 删除摄像头(软删除)
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | Long | 摄像头 ID |
**响应数据:**
```json
{
"code": 200,
"message": "success"
}
```
**实现逻辑:**
1. 校验 ID 存在性
2. 执行软删除:`update video set delete_enum = 'TRUE' where id = ?`
---
### 6.6 摄像头 ID 唯一性校验
**接口:** `GET /api/mkmj/video/check-id`
**描述:** 校验摄像头 ID 是否重复
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| videoResourceId | String | 是 | 摄像头 ID |
| id | Long | 否 | 当前摄像头 ID编辑时传 |
**响应数据:**
```json
{
"code": 200,
"data": {
"available": true
}
}
```
---
### 6.7 按设备查询摄像头列表(简化版)
**接口:** `GET /api/mkmj/video/by-device`
**描述:** 获取指定设备下的所有摄像头(用于展示或下拉选择)
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| foreignId | Long | 是 | 关联 ID口门 ID 或闸机 ID |
| deviceType | Integer | 是 | 设备类型1-口门2-闸机 |
**响应数据:**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 3001,
"videoResourceId": "CAM-001",
"videoResourceName": "1 号摄像头",
"videoType": 2,
"videoTypeName": "平台"
},
{
"id": 3002,
"videoResourceId": "CAM-002",
"videoResourceName": "2 号摄像头",
"videoType": 2,
"videoTypeName": "平台"
}
]
}
```
---
## 七、数据校验规则
### 7.1 通用校验
| 字段 | 规则 | 错误码 | 错误提示 |
|------|------|--------|----------|
| 名称类字段 | 必填2-50 字符 | 400 | 名称长度为 2-50 个字符 |
| 备注 | ≤255 字符 | 400 | 备注长度不能超过 255 字符 |
| 经度 | -180~180支持小数 | 400 | 请输入有效的经度(-180~180 |
| 纬度 | -90~90支持小数 | 400 | 请输入有效的纬度(-90~90 |
### 7.2 口门校验
| 字段 | 规则 | 错误码 | 错误提示 |
|------|------|--------|----------|
| mkmjName | 唯一性 | 2001 | 该口门名称已存在 |
| mkmjLevel | 固定值校验 | 400 | 口门级别无效 |
| hgAuthArea | 有效性 | 400 | 所属港区无效 |
### 7.3 通道校验
| 字段 | 规则 | 错误码 | 错误提示 |
|------|------|--------|----------|
| mkmjId | 存在性 | 2003 | 所属口门不存在 |
| passageName | 同口门下唯一 | 2004 | 该口门下通道名称已存在 |
### 7.4 闸机校验
| 字段 | 规则 | 错误码 | 错误提示 |
|------|------|--------|----------|
| mkmjId | 存在性 | 2003 | 所属口门不存在 |
| passageId | 存在性且属于该口门 | 2005 | 所属通道不存在或不属于该口门 |
| gateNumber | 唯一性 | 2006 | 该闸机标识已存在 |
### 7.5 摄像头校验
| 字段 | 规则 | 错误码 | 错误提示 |
|------|------|--------|----------|
| foreignId | 存在性(根据 deviceType | 2007 | 关联设备不存在 |
| videoResourceId | 唯一性 | 2008 | 该摄像头 ID 已存在 |
---
## 八、删除关联检查逻辑
### 8.1 删除口门检查
```sql
-- 检查关联通道
SELECT COUNT(*) FROM mkmj_passage WHERE mkmj_id = ? AND delete_enum = 'FALSE';
-- 检查关联闸机
SELECT COUNT(*) FROM mkmj_gate WHERE mkmj_id = ? AND delete_enum = 'FALSE';
-- 检查关联摄像头(口门类)
SELECT COUNT(*) FROM video WHERE foreign_id = ? AND device_type = 1 AND delete_enum = 'FALSE';
-- 检查关联审批人
SELECT COUNT(*) FROM mkmj_approval_user WHERE mkmj_id = ? AND delete_enum = 'FALSE';
```
### 8.2 删除通道检查
```sql
-- 检查关联闸机
SELECT COUNT(*) FROM mkmj_gate WHERE passage_id = ? AND delete_enum = 'FALSE';
```
### 8.3 删除闸机检查
```sql
-- 检查关联摄像头(闸机类)
SELECT COUNT(*) FROM video WHERE foreign_id = ? AND device_type = 2 AND delete_enum = 'FALSE';
```
---
## 九、错误码定义
---
## 十、公共字段处理
### 10.1 查询条件
所有列表查询必须附加条件:`delete_enum = 'FALSE'`
---
## 十一、实现注意事项
### 11.1 事务处理
- 新增、编辑、删除操作需使用事务
- 删除口门时,同步停用关联数据需在同一事务中完成
### 11.2 级联删除
- 删除口门 → 停用通道、闸机、摄像头、审批人
- 删除通道 → 停用闸机
- 删除闸机 → 停用摄像头
### 11.4 性能优化
- 列表查询使用分页
### 11.5 日志记录
- 关键操作(新增、编辑、删除)记录操作日志
- 日志内容:操作人、操作时间、操作类型、操作对象 ID、变更内容
---
## 十二、附录
### 12.1 相关文档
### 12.2 表结构参考
- `mkmj` - 门口信息管理表
- `mkmj_passage` - 口门门禁通道表
- `mkmj_gate` - 门口闸机表
- `video` - 摄像头表
---
**文档版本:** V1.0
**最后更新:** 2026-03-09