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

1274 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 口门信息管理 - 后端需求文档
## 一、模块概述
### 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