本文档详细描述了引航计划管理和用户管理两个功能模块的需求、功能设计、接口规范和实现细节。
引航计划管理功能用于管理船舶的引航计划,包括引航计划的查询、导入、导出等操作。该功能支持从外部系统导入引航计划数据,并提供灵活的查询和导出功能。
引航计划页面提供以下查询条件:
| 查询条件 | 说明 | 数据类型 | 是否必填 |
|---|---|---|---|
| 作业时间 | 计划时间范围 | 日期范围 | 否 |
| 港区作业类型 | 本港计划/外港计划 | 下拉选择 | 否 |
| 港口 | 港口名称 | 下拉选择 | 否 |
| 英文船名 | 船舶英文名称 | 文本输入 | 否 |
| 状态 | 未调度/已调度 | 下拉选择 | 否 |
| 船公司 | 船舶所属公司 | 下拉选择 | 否 |
| 吃水 | 船舶吃水范围(最小值-最大值) | 数值范围 | 否 |
| 交通船 | 交通船名称 | 文本输入 | 否 |
引航计划列表以表格形式展示,包含以下字段:
| 字段名称 | 说明 | 数据来源 | 排序支持 |
|---|---|---|---|
| 序号 | 记录的顺序号 | 前端计算 | 否 |
| 计划时间 | 引航计划时间 | Disp_PilotPlan.PlanTime | 是 |
| 中文船名 | 船舶中文名称 | Bus_Ship.CnShipName | 是 |
| 英文船名 | 船舶英文名称 | Bus_Ship.EnShipName | 是 |
| 船公司 | 船舶所属公司 | Bus_CustomerCompany.CustomerName | 是 |
| 国籍 | 船舶国籍 | Bus_Ship.Nation | 是 |
| 船长 | 船舶长度(米) | Bus_Ship.ShipLength | 是 |
| 吃水 | 船舶吃水深度(米) | Disp_PilotPlan.Deep | 是 |
| 动态 | 引航动态类型 | Bus_PilotTypeSetting.PilotTypeName | 是 |
| 起点泊位 | 起始泊位名称 | Disp_Berthage.BerthageName | 是 |
| 终点泊位 | 终止泊位名称 | Disp_Berthage.BerthageName | 是 |
| 主引 | 主引航员姓名 | Disp_Pilot.Name | 是 |
| 交通船 | 交通船名称 | Disp_PilotPlan.Trafficboat | 是 |
| 代理 | 代理公司名称 | Bus_CustomerCompany.CustomerName | 是 |
| 港区作业类型 | 本港计划/外港计划 | 计算字段 | 是 |
| 航道 | 航道名称 | Disp_Waterway.WaterwayName | 是 |
| 状态 | 调度状态 | Disp_Dispatcher.RecordStatus | 是 |
在操作按钮区提供"导入引航计划"按钮,点击后弹出导入对话框。
导入对话框包含以下内容:
| 元素 | 说明 |
|---|---|
| 文本区域 | 用于粘贴引航计划数据,支持制表符分隔的格式 |
| 取消按钮 | 关闭导入对话框 |
| 解析数据按钮 | 解析粘贴的数据并显示预览 |
导入数据必须符合以下格式:
序号|计划时间|中文船名|英文船名|国籍(地区)|船长|吃水|动态|起点泊位|终点泊位|合作标记|引航机构|主引|主引2|副引|其它引水|代理|代理电话|交通船|航道|侧推|备注
yyyy-MM-dd HH:mm(支持24:00格式,自动转换为次日00:00)预览对话框包含以下内容:
| 元素 | 说明 |
|---|---|
| 记录数量 | 显示待导入的记录数量 |
| 搜索框 | 支持按多个字段搜索预览数据 |
| 数据表格 | 显示解析后的引航计划数据 |
| 取消按钮 | 取消导入操作 |
| 确认导入按钮 | 确认导入数据,显示导入记录数量 |
在操作按钮区提供"导出Excel"按钮,点击后导出当前查询条件的引航计划数据。
引航计划数据.xlsx以下港口属于本港计划:
除本港计划外的所有港口都属于外港计划。
| 字段名 | 类型 | 说明 |
|---|---|---|
| PilotPlanId | varchar(36) | 引航计划ID(主键) |
| PlanTime | datetime | 计划时间 |
| ShipId | varchar(36) | 船舶ID |
| PilotType | int | 引航类型ID |
| FromBerthageId | varchar(36) | 起始泊位ID |
| ToBerthageId | varchar(36) | 终止泊位ID |
| MainPilotId | varchar(36) | 主引航员ID |
| AssitPilotId | varchar(36) | 副引航员ID |
| WaterwayId | varchar(36) | 航道ID |
| AgencyId | varchar(36) | 代理ID |
| Trafficboat | varchar(100) | 交通船 |
| Deep | decimal(18,2) | 吃水 |
| SideThruster | varchar(500) | 侧推 |
| Remark | varchar(500) | 备注 |
| RecordStatus | int | 记录状态 |
| CreateTime | datetime | 创建时间 |
| CreateUserID | varchar(36) | 创建人ID |
| ModifyTime | datetime | 修改时间 |
| ModifyUserID | varchar(36) | 修改人ID |
| 字段名 | 类型 | 说明 |
|---|---|---|
| ShipId | varchar(36) | 船舶ID(主键) |
| CnShipName | varchar(100) | 船舶中文名称 |
| EnShipName | varchar(100) | 船舶英文名称 |
| Nation | varchar(50) | 国籍 |
| ShipLength | decimal(18,2) | 船长 |
| RecordStatus | int | 记录状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| BerthageId | varchar(36) | 泊位ID(主键) |
| BerthageName | varchar(100) | 泊位名称 |
| PortId | varchar(36) | 港口ID |
| RecordStatus | int | 记录状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| PilotId | varchar(36) | 引航员ID(主键) |
| Name | varchar(100) | 引航员姓名 |
| RecordStatus | int | 记录状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| WaterwayId | varchar(36) | 航道ID(主键) |
| WaterwayName | varchar(100) | 航道名称 |
| RecordStatus | int | 记录状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| CustomerCompanyId | varchar(36) | 客户公司ID(主键) |
| CustomerName | varchar(200) | 客户公司名称 |
| CustomerType | int | 客户类型(2=船公司) |
| RecordStatus | int | 记录状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| DispatcherId | varchar(36) | 调度ID(主键) |
| PilotPlanId | varchar(36) | 引航计划ID |
| WorkTime | datetime | 作业时间 |
| StartTime | datetime | 开始时间 |
| EndTime | datetime | 结束时间 |
| PortId | varchar(36) | 港口ID |
| FromBerthageId | varchar(36) | 起始泊位ID |
| ToBerthageId | varchar(36) | 终止泊位ID |
| ShipId | varchar(36) | 船舶ID |
| Deep | decimal(18,2) | 吃水 |
| AgencyId | varchar(36) | 代理ID |
| PilotTypeId | int | 引航类型ID |
| RecordStatus | int | 记录状态 |
| CreateTime | datetime | 创建时间 |
| CreateUserID | varchar(36) | 创建人ID |
| ModifyTime | datetime | 修改时间 |
| ModifyUserID | varchar(36) | 修改人ID |
| 字段名 | 类型 | 说明 |
|---|---|---|
| PilotTypeId | int | 引航类型ID(主键) |
| PilotTypeName | varchar(100) | 引航类型名称 |
| Hours | decimal(18,2) | 作业时长(小时) |
| RecordStatus | int | 记录状态 |
接口地址:GET /api/pilot-plan/list
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| planTimeStart | String | 否 | 计划时间开始(yyyy-MM-dd) |
| planTimeEnd | String | 否 | 计划时间结束(yyyy-MM-dd) |
| portAreaOperationType | String | 否 | 港区作业类型(本港计划/外港计划) |
| portId | String | 否 | 港口ID |
| englishShipName | String | 否 | 英文船名(模糊查询) |
| status | String | 否 | 状态(未调度/已调度) |
| shipownerId | String | 否 | 船公司ID |
| deepStart | Double | 否 | 吃水最小值 |
| deepEnd | Double | 否 | 吃水最大值 |
| trafficboat | String | 否 | 交通船(模糊查询) |
| page | Integer | 是 | 页码 |
| pageSize | Integer | 是 | 每页行数 |
| sortBy | String | 否 | 排序字段 |
| sortOrder | String | 否 | 排序方向(ASC/DESC) |
响应示例:
{
"content": [
{
"index": 1,
"pilotPlanId": "pilot-plan-id-1",
"planTime": "2026-03-03 10:30:00",
"deep": 8.5,
"trafficboat": "交通船A",
"pilotType": 1,
"pilotTypeName": "进港",
"fromBerthageId": "berthage-id-1",
"toBerthageId": "berthage-id-2",
"mainPilotId": "pilot-id-1",
"agencyId": "agency-id-1",
"waterwayId": "waterway-id-1",
"shipId": "ship-id-1",
"chineseShipName": "测试船1",
"englishShipName": "TEST SHIP1",
"nation": "中国",
"shipLength": 100.0,
"shipCompanyName": "船公司A",
"fromBerthName": "1号泊位",
"toBerthName": "2号泊位",
"mainPilotName": "张三",
"agencyName": "代理A",
"waterwayName": "主航道",
"portAreaOperationType": "本港计划",
"status": "未调度"
}
],
"totalElements": 100
}
接口地址:POST /api/pilot-plan/import
请求参数:
[
{
"serialNumber": "1",
"planTime": "2026-03-03 10:30",
"chineseShipName": "测试船1",
"englishShipName": "TEST SHIP1",
"nationality": "中国",
"shipLength": 100,
"draft": 8.5,
"dynamic": "进港",
"startBerth": "1号泊位",
"endBerth": "2号泊位",
"cooperationMark": "是",
"pilotAgency": "引航公司A",
"mainPilot": "张三",
"secondaryPilot": "李四",
"deputyPilot": "王五",
"otherPilots": "赵六",
"agent": "代理A",
"agentPhone": "13800138001",
"transportVessel": "交通船A",
"waterway": "主航道",
"sideThruster": "有",
"remark": "无备注"
}
]
响应示例:
{
"success": true,
"message": "导入成功",
"importedCount": 10
}
接口地址:GET /api/pilot-plan/export
请求参数:与查询引航计划列表相同
响应:Excel文件下载
接口地址:GET /api/port/list
响应示例:
[
{
"portId": "port-id-1",
"portName": "深圳港"
},
{
"portId": "port-id-2",
"portName": "蛇口港"
}
]
接口地址:GET /api/ship-company/list
响应示例:
[
{
"companyId": "company-id-1",
"companyName": "船公司A"
},
{
"companyId": "company-id-2",
"companyName": "船公司B"
}
]
| 功能 | 权限代码 |
|---|---|
| 查询引航计划列表 | 0104 |
| 导入引航计划 | 010401 |
| 导出引航计划 | 010403 |
calc(100vh - 469px)calc(100vw - 330px)用户管理功能用于管理系统中的用户信息,包括用户的查询、新增、编辑、删除和密码重置等操作。
用户管理页面提供以下查询条件:
| 查询条件 | 说明 | 数据类型 | 是否必填 |
|---|---|---|---|
| 用户名 | 用户的名称 | 文本输入 | 否 |
| 账号 | 用户的登录账号 | 文本输入 | 否 |
| 状态 | 用户的状态 | 下拉选择 | 否 |
用户列表以表格形式展示,包含以下字段:
| 字段名称 | 说明 | 数据来源 | 排序支持 |
|---|---|---|---|
| 勾选列 | 复选框,用于批量选择用户 | - | 否 |
| 序号 | 记录的顺序号,支持跨页顺序 | 前端计算 | 否 |
| 用户名 | 用户的名称 | Sys_User.Name | 是 |
| 账号 | 用户的登录账号 | Sys_User.LoginID | 是 |
| 用户角色 | 用户关联的角色 | 通过Sys_UserRole关联Sys_Role | 是 |
| 企业微信账号 | 用户的企业微信账号 | Sys_User.WeChatUserId | 是 |
| 状态 | 用户的状态 | Sys_User.RecordStatus | 是 |
| 操作 | 操作按钮列 | - | 否 |
在操作按钮区提供"新增"按钮,点击后弹出新增用户对话框。
新增用户对话框包含以下字段:
| 字段名称 | 是否必填 | 说明 | 验证规则 |
|---|---|---|---|
| 关联用户 | 否 | 关联的员工 | 从员工列表中选择 |
| 账号 | 是 | 用户的登录账号 | 不能为空 |
| 用户名 | 是 | 用户的名称 | 不能为空 |
| 状态 | 是 | 用户的状态 | 从字典表中选择 |
在操作列提供"编辑"按钮,点击后弹出编辑用户对话框。
编辑用户对话框包含以下字段:
| 字段名称 | 是否必填 | 说明 | 验证规则 |
|---|---|---|---|
| 关联用户 | 否 | 关联的员工 | 从员工列表中选择 |
| 账号 | 是 | 用户的登录账号 | 不能为空 |
| 用户名 | 是 | 用户的名称 | 不能为空 |
| 状态 | 是 | 用户的状态 | 从字典表中选择 |
在操作按钮区提供"删除"按钮,用于批量删除选中的用户。
在操作列提供"删除"按钮,用于删除当前行的用户。
在操作列提供"重置密码"按钮,点击后弹出重置密码对话框。
重置密码对话框包含以下字段:
| 字段名称 | 说明 |
|---|---|
| 用户名 | 显示用户的名称(只读) |
| 账号 | 显示用户的登录账号(只读) |
| 新密码 | 输入新的密码 |
| 确认密码 | 再次输入新密码 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| UserID | varchar(36) | 用户ID(主键) |
| LoginID | varchar(50) | 登录账号 |
| Name | varchar(100) | 用户名 |
| Password | varchar(100) | 密码(MD5加密) |
| WeChatUserId | varchar(100) | 企业微信账号 |
| EmployeeId | varchar(36) | 关联员工ID |
| RecordStatus | int | 状态 |
| CreateTime | datetime | 创建时间 |
| CreateUserID | varchar(36) | 创建人ID |
| ModifyTime | datetime | 修改时间 |
| ModifyUserID | varchar(36) | 修改人ID |
| 字段名 | 类型 | 说明 |
|---|---|---|
| RoleID | varchar(36) | 角色ID(主键) |
| RoleName | varchar(100) | 角色名称 |
| Description | varchar(500) | 角色描述 |
| IsSystemRole | bit | 是否系统角色 |
| RecordStatus | int | 状态 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| UserID | varchar(36) | 用户ID(主键) |
| RoleID | varchar(36) | 角色ID(主键) |
| 字段名 | 类型 | 说明 |
|---|---|---|
| DictionaryItemID | varchar(36) | 字典项ID(主键) |
| DictionaryCode | varchar(50) | 字典代码 |
| Value | int | 字典值 |
| Name | varchar(100) | 字典名称 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| EmployeeId | varchar(36) | 员工ID(主键) |
| Name | varchar(100) | 员工姓名 |
| RecordStatus | int | 状态 |
接口地址:GET /api/user/list
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 否 | 用户名(模糊查询) |
| loginId | String | 否 | 账号(模糊查询) |
| recordStatus | Integer | 否 | 状态 |
| page | Integer | 是 | 页码 |
| pageSize | Integer | 是 | 每页行数 |
| sortBy | String | 否 | 排序字段 |
| sortOrder | String | 否 | 排序方向(ASC/DESC) |
响应示例:
{
"success": true,
"data": {
"content": [
{
"id": "user-id-1",
"loginId": "admin",
"name": "管理员",
"roleName": "系统管理员",
"weChatUserId": "wx123456",
"recordStatus": 1,
"recordStatusName": "正常",
"createTime": "2026-01-01 10:00:00",
"modifyTime": "2026-01-01 10:00:00"
}
],
"totalElements": 100
}
}
接口地址:POST /api/user/save
请求参数:
{
"id": "user-id-1",
"employeeId": "employee-id-1",
"loginId": "testuser",
"name": "测试用户",
"recordStatus": 1
}
响应示例:
{
"success": true,
"message": "用户创建成功",
"data": {
"id": "new-user-id",
"loginId": "testuser",
"name": "测试用户",
"roleName": "系统管理员",
"weChatUserId": "wx789012",
"recordStatus": 1,
"recordStatusName": "正常",
"createTime": "2026-03-03 10:00:00",
"modifyTime": "2026-03-03 10:00:00"
}
}
接口地址:DELETE /api/user/delete
请求参数:
["user-id-1", "user-id-2"]
响应示例:
{
"success": true,
"message": "删除成功",
"deletedCount": 2
}
接口地址:POST /api/user/reset-password
请求参数:
{
"userId": "user-id-1",
"newPassword": "newpassword123"
}
响应示例:
{
"success": true,
"message": "密码重置成功"
}
接口地址:GET /api/user/record-status
响应示例:
[
{
"dictionaryItemId": "dict-id-1",
"dictionaryCode": "RecordStatus",
"value": 1,
"name": "正常"
},
{
"dictionaryItemId": "dict-id-2",
"dictionaryCode": "RecordStatus",
"value": 0,
"name": "禁用"
}
]
接口地址:GET /api/employee/list
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | Integer | 否 | 页码 |
| pageSize | Integer | 否 | 每页行数 |
响应示例:
{
"success": true,
"data": {
"content": [
{
"employeeId": "employee-id-1",
"name": "张三"
}
],
"totalElements": 50
}
}
| 功能 | 权限代码 |
|---|---|
| 查询用户列表 | 0101 |
| 删除用户 | 0102 |
| 重置密码 | 0103 |
| 新增/编辑用户 | 0104 |
calc(100vh - 395px)calc(100vw - 331px)原始数据:
1 2026-03-03 10:30 测试船1 TEST SHIP1 中国 100 8.5 进港 1号泊位 2号泊位 是 引航公司A 张三 李四 王五 赵六 代理A 13800138001 交通船A 主航道 有 无备注
解析结果:
{
"serialNumber": "1",
"planTime": "2026-03-03 10:30",
"chineseShipName": "测试船1",
"englishShipName": "TEST SHIP1",
"nationality": "中国",
"shipLength": 100,
"draft": 8.5,
"dynamic": "进港",
"startBerth": "1号泊位",
"endBerth": "2号泊位",
"cooperationMark": "是",
"pilotAgency": "引航公司A",
"mainPilot": "张三",
"secondaryPilot": "李四",
"deputyPilot": "王五",
"otherPilots": "赵六",
"agent": "代理A",
"agentPhone": "13800138001",
"transportVessel": "交通船A",
"waterway": "主航道",
"sideThruster": "有",
"remark": "无备注"
}
用户登录 → 进入用户管理页面 → 查询用户列表
↓
[新增用户] → 填写用户信息 → 提交 → 刷新列表
↓
[编辑用户] → 修改用户信息 → 提交 → 刷新列表
↓
[删除用户] → 确认删除 → 删除 → 刷新列表
↓
[重置密码] → 输入新密码 → 提交 → 刷新列表
点击导入按钮 → 打开导入对话框 → 粘贴数据 → 解析数据
↓
显示预览对话框 → 搜索/查看数据 → 确认导入
↓
数据验证 → 创建/更新关联数据 → 导入成功
↓
同步到调度表 → 刷新列表
文档版本:v1.0
创建日期:2026-03-03
最后更新:2026-03-03
文档作者:AI助手