中控
获取盘型池数据
- 接口路径:
/centralControl/getTodoPalletList - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | query | String | 否 | 航次ID,不传则查询当前作业航次的数据 |
- 接口说明:返回指定航次的托盘数据;返回数据按
pinnedFlag置顶状态降序排列,置顶托盘按pinnedTime置顶时间升序排列,非置顶托盘按recordTime创建时间升序排列。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"palletTypeId": "2f50d4c1-8792-4b71-a1a3-7344327b6b7e",
"palletType": "20GP标准托盘",
"palletWorkType": "SUITCASE",
"palletSize": 20,
"workStatus": "PENDING",
"voyageId": "V2026050801",
"recordTime": "2026-05-08T10:30:00+08:00",
"sequence": 1,
"bindForkliftNo": "FORKLIFT-001",
"bindInternalTrailerFlag": "Y",
"bindInternalTrailerNo": "IT-001",
"bindContainerInfoFlag": "N",
"bindContainerInfoList": [],
"bindReachStackerNo": "RS-01",
"bindContainerInfoList": [
{
"id": "YARD-001",
"cntrIso": "MSCU1234567",
"workStatus": "NONE",
"voyageId": "V2026050801",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"laneNumber": 6,
"cntrType": "GP",
"cntrSize": 20,
"manifestWeight": 22000,
"bridgeWeight": 22350
}
],
"pinnedFlag": "Y",
"pinnedTime": "2026-05-09T14:30:00+08:00"
},
{
"palletTypeId": "3a7b8c9d-1234-5678-abcd-ef1234567890",
"palletType": "40HC标准托盘",
"palletWorkType": "SHIPMENT",
"palletSize": 40,
"workStatus": "NONE",
"voyageId": "V2026050801",
"recordTime": "2026-05-08T11:00:00+08:00",
"sequence": 2,
"bindForkliftNo": "",
"bindInternalTrailerFlag": "N",
"bindInternalTrailerNo": "",
"bindContainerInfoFlag": "N",
"bindContainerInfoList": [],
"bindReachStackerNo": "",
"bindContainerInfoList": [],
"pinnedFlag": "N",
"pinnedTime": null
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].palletTypeId | String | 盘型池记录唯一标识 |
| data[].palletType | String | 托盘类型名称(如:20GP标准托盘、40HC标准托盘) |
| data[].palletWorkType | String | 托盘作业类型,SHIPMENT 表示直接装船,SUITCASE 表示等待拉箱 |
| data[].palletSize | Integer | 托盘尺寸(柜型),对应 CPallet 表的 palletSize 字段,如 20、40 等 |
| data[].workStatus | String | 托盘池记录作业状态,常见值:NONE 待作业、PENDING 作业中、DONE 已完成 |
| data[].voyageId | String | 绑定的航次ID |
| data[].recordTime | Date/String | 盘型加入盘型池的时间 |
| data[].sequence | Integer | 盘型序号,同一托盘池中从1开始递增 |
| data[].bindForkliftNo | String | 签收该托盘的叉车终端号/编号,未签收时为空 |
| data[].bindInternalTrailerFlag | String | 是否已绑定内拖车,Y 表示已绑定,N 表示未绑定 |
| data[].bindInternalTrailerNo | String | 绑定的内拖车号,未绑定时为空 |
| data[].bindContainerInfoFlag | String | 是否已绑定箱信息(历史字段),Y 表示已绑定,N 表示未绑定 |
| data[].bindContainerInfoList | Array | 已绑定箱信息列表(历史字段),未绑定时为空数组 |
| data[].bindReachStackerNo | String | 绑定的正面吊名称/账号,未绑定时为空 |
| data[].bindContainerInfoList | Array | 已绑定的箱信息列表,未放箱时为空数组,元素结构同 CYardCntr 实体类 |
| data[].pinnedFlag | String | 是否置顶,Y 表示已置顶,N 表示未置顶 |
| data[].pinnedTime | Date/String | 置顶时间,未置顶时为 null |
取消添加盘型到盘型池中
- 接口路径:
/centralControl/cancelAddPalletToPool - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示删除成功 |
置顶托盘
- 接口路径:
/centralControl/pinPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 接口说明:置顶时会记录
pinnedTime(置顶时间),用于getTodoPalletList接口排序。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示置顶成功 |
取消置顶托盘
- 接口路径:
/centralControl/unpinPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示取消置顶成功 |
添加盘型到盘型池中
- 接口路径:
/centralControl/addPalletToPool - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletType | query | String | 是 | 盘型名称 |
| palletWorkType | query | String | 是 | 托盘作业类型,SHIPMENT 表示直接装船,SUITCASE 表示等待拉箱 |
- 备注:新增成功后会向所有叉车终端(
terminalType=FORKLIFT)推送一条 WebSocket 消息,提示刷新托盘池列表。新增时会自动绑定当前作业航次(通过agCommon.selectLatestWorkingVoyage获取)。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": "2f50d4c1-8792-4b71-a1a3-7344327b6b7e"
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | String | 新加入盘型池后生成的 palletTypeId |
批量添加盘型到盘型池中
- 接口路径:
/centralControl/batchAddPalletToPool - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletList | body | Array | 是 | 盘型列表 |
| palletList[].palletType | body | String | 是 | 盘型名称 |
| palletList[].palletWorkType | body | String | 是 | 托盘作业类型,SHIPMENT 表示直接装船,SUITCASE 表示等待拉箱 |
- 请求示例:
{
"palletList": [
{
"palletType": "20GP标准托盘",
"palletWorkType": "SHIPMENT"
},
{
"palletType": "40HC标准托盘",
"palletWorkType": "SUITCASE"
}
]
}- 备注:批量添加成功后会向所有叉车终端(
terminalType=FORKLIFT)推送 WebSocket 消息,提示刷新托盘池列表。每个盘型都会自动绑定当前作业航次。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
"2f50d4c1-8792-4b71-a1a3-7344327b6b7e",
"3a7b8c9d-1234-5678-abcd-ef1234567890"
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | Array<String> | 批量加入盘型池后生成的 palletTypeId 列表,顺序与请求一致 |
切换是否手动配载
- 接口路径:
/centralControl/toggleManualLoadingFlag - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| manualLoadingFlag | query | String | 是 | 手动配载开关,Y 表示开启,N 表示关闭 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示切换成功 |
中控手动配载完成接口
- 接口路径:
/centralControl/completeManualLoading - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | body | String | 是 | 托盘类型 ID |
| coordinateX | body | BigDecimal | 是 | 作业位置 X 坐标 |
| coordinateY | body | BigDecimal | 是 | 作业位置 Y 坐标 |
| coordinateZ | body | BigDecimal | 是 | 作业位置 Z 坐标 |
| length | body | BigDecimal | 是 | 长度 |
| width | body | BigDecimal | 是 | 宽度 |
| laneId | body | String | 是 | 车道 ID |
- 请求示例:
{
"palletTypeId": "PALLET-TYPE-001",
"coordinateX": 1.2,
"coordinateY": 3.4,
"coordinateZ": 1,
"length": 12.2,
"width": 2.44,
"laneId": "LANE-A01"
}- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"workStatus": "PENDING",
"palletTypeId": "PALLET-TYPE-001",
"length": 12.2,
"width": 2.44,
"containers": [...]
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | Array | 船上放箱详情列表,元素结构同 getShipPlacementDetailByDeck 接口响应 |
中控取消配载接口
- 接口路径:
/centralControl/cancelManualLoading - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 托盘池ID |
- 备注:
- 该接口是
completeManualLoading接口的逆向操作。 - 前置条件:托盘必须已完成配载(即存在对应的
C_LANE_CNTR记录),否则接口会直接报错:该托盘未进行配载,无法取消。 - 作业状态检查:如果配载数据的作业状态为
DONE(已完成),则无法取消配载,接口会报错:作业已完成,无法取消配载。 - 接口会删除配载时插入的
C_LANE_CNTR记录,恢复托盘池和内拖车的状态为WAITING_FOR_SHIPMENT(等待装船),并发送消息通知相关终端。
- 该接口是
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示取消配载成功 |
作业前配置修改
- 接口路径:
/centralControl/setConfiguration - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | body | String | 是 | 航次 ID |
| templateId | body | String | 是 | 模板 ID |
| minusoneTeu | body | String | 否 | 负一甲装箱量 |
| oneTeu | body | String | 否 | 一甲装箱量 |
| twoTeu | body | String | 否 | 二甲装箱量 |
| threeTeu | body | String | 否 | 三甲装箱量 |
| fourTeu | body | String | 否 | 四甲装箱量 |
| fiveTeu | body | String | 否 | 五甲装箱量 |
| minusoneTeuTruckNum | body | String | 否 | 负一甲作业车数 |
| oneTruckNum | body | String | 否 | 一甲作业车数 |
| twoTruckNum | body | String | 否 | 二甲作业车数 |
| threeTruckNum | body | String | 否 | 三甲作业车数 |
| fourTruckNum | body | String | 否 | 四甲作业车数 |
| fiveTruckNum | body | String | 否 | 五甲作业车数 |
| emptyPallet20 | body | String | 否 | 20尺空托盘 |
| emptyPallet40 | body | String | 否 | 40尺空托盘 |
| planTotlTeu | body | String | 否 | TEU计划总量 |
| planDc20 | body | String | 否 | 20尺干柜 |
| planLf20 | body | String | 否 | 20尺活鱼 |
| planRf20 | body | String | 否 | 20尺冷柜 |
| planOw20 | body | String | 否 | 20尺超重(铁件、石材) |
| planDc40 | body | String | 否 | 40尺干柜 |
| planRf40 | body | String | 否 | 40尺冷柜 |
| plan45 | body | String | 否 | 45尺 |
- 请求示例:
{
"voyageId": "V2026050801",
"templateId": "TEMPLATE-001",
"minusoneTeu": "10",
"oneTeu": "20",
"twoTeu": "25",
"threeTeu": "30",
"fourTeu": "25",
"fiveTeu": "20",
"minusoneTeuTruckNum": "2",
"oneTruckNum": "4",
"twoTruckNum": "5",
"threeTruckNum": "6",
"fourTruckNum": "5",
"fiveTruckNum": "4",
"emptyPallet20": "5",
"emptyPallet40": "3",
"planTotlTeu": "500",
"planDc20": "100",
"planLf20": "50",
"planRf20": "80",
"planOw20": "30",
"planDc40": "120",
"planRf40": "100",
"plan45": "20"
}接口说明:保存作业前配置,包含航次模板、各甲板装箱量、各甲板作业车数、空托盘数量及计划箱量信息。配置保存成功后,返回完整的配置信息(与
getConfiguration接口返回值结构一致)。响应示例:
{
"code": 0,
"message": "请求成功",
"data": {
"voyageId": "V2026050801",
"templateId": "TEMPLATE-001",
"vesselCode": "NGP",
"vesselName": "新金桥7",
"line": "威海-韩国",
"bVyg": "2026001E",
"ieType": "E",
"phase": "YDG",
"goal": "韩国仁川",
"isXc": "0",
"iscomfire": "1",
"eta": "2026-05-08 08:00:00",
"etd": "2026-05-08 18:00:00",
"ata": "2026-05-08 08:15:00",
"atd": null,
"etstartwork": "2026-05-08 09:00:00",
"etendwork": "2026-05-08 17:00:00",
"startwork": "2026-05-08 09:10:00",
"endwork": null,
"minusoneTeu": "10",
"oneTeu": "20",
"twoTeu": "25",
"threeTeu": "30",
"fourTeu": "25",
"fiveTeu": "20",
"minusoneTeuTruckNum": "2",
"oneTruckNum": "4",
"twoTruckNum": "5",
"threeTruckNum": "6",
"fourTruckNum": "5",
"fiveTruckNum": "4",
"emptyPallet20": "5",
"emptyPallet40": "3",
"planTotlTeu": "500",
"planDc20": "100",
"planLf20": "50",
"planRf20": "80",
"planOw20": "30",
"planDc40": "120",
"planRf40": "100",
"plan45": "20"
}
}- 响应字段说明:
返回的 data 字段为 SetConfigurationRespVO 对象,包含船舶航次信息和配置信息。字段说明与 getConfiguration 接口一致,具体如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| data.voyageId | String | 航次 ID |
| data.templateId | String | 模板 ID |
| 船舶航次信息 | ||
| data.vesselCode | String | 船舶编码 |
| data.vesselName | String | 船名 |
| data.line | String | 航线 |
| data.bVyg | String | 出口航次号 |
| data.ieType | String | 进出标志(E:出口 I:进口) |
| data.phase | String | 作业阶段 |
| data.goal | String | 目标港 |
| data.isXc | String | 是否卸箱(0:否 1:是) |
| data.iscomfire | String | 是否确认作业 |
| data.eta | String | 预计到港时间 |
| data.etd | String | 预计离港时间 |
| data.ata | String | 实际到港时间 |
| data.atd | String | 实际离港时间 |
| data.etstartwork | String | 计划开工时间 |
| data.etendwork | String | 计划完工时间 |
| data.startwork | String | 实际开工时间 |
| data.endwork | String | 实际完工时间 |
| data.xhd | String | 卸货港代码 |
| data.impMnftDate | String | 进口装船计划日期 |
| data.expMnftDate | String | 出口装船计划日期 |
| data.beginreceive | String | 进口入港凭单日期 |
| data.drycutoff | String | 干柜截止日期 |
| data.hazcutoff | String | 危险品截止日期 |
| data.reefcutoff | String | 冷藏截止日期 |
| data.pilotonboard | String | 引水员上船时间 |
| data.pilotoffboard | String | 引水员下船时间 |
| data.laboronboard | String | 劳工上船时间 |
| data.laboroffboard | String | 劳工下船时间 |
| data.opa | String | 实际开始靠泊时间 |
| data.opd | String | 实际离泊时间 |
| data.startdisc | String | 开始卸货时间 |
| data.completedisc | String | 完成卸货时间 |
| data.startload | String | 开始装货时间 |
| data.completeload | String | 完成装货时间 |
| data.loadNote | String | 装货备注 |
| data.discNote | String | 卸货备注 |
| data.restowNote | String | 移位备注 |
| data.shiftNote | String | 换船备注 |
| data.iShipNo | String | 内部船号 |
| data.foreBollard | String | 船首系缆柱 |
| data.aftBollard | String | 船尾系缆柱 |
| data.foreOffset | String | 船首偏移量 |
| data.aftOffset | String | 船尾偏移量 |
| data.notes | String | 备注 |
| data.isQg | String | 是否起隔 |
| data.isSd | String | 是否扫底 |
| data.isSb | String | 是否绑扎 |
| data.isPf | String | 是否配积 |
| data.inZl | String | 入闸方式 |
| data.inBz | String | 入闸备注 |
| data.inBj | String | 入闸标记 |
| data.workRoRo | String | 是否RoRo作业 |
| data.createdMan | String | 创建人 |
| data.createdOn | String | 创建时间 |
| data.updatedMan | String | 更新人 |
| data.updatedOn | String | 更新时间 |
| 配置信息 | ||
| data.minusoneTeu | String | 负一甲装箱量 |
| data.oneTeu | String | 一甲装箱量 |
| data.twoTeu | String | 二甲装箱量 |
| data.threeTeu | String | 三甲装箱量 |
| data.fourTeu | String | 四甲装箱量 |
| data.fiveTeu | String | 五甲装箱量 |
| data.minusoneTeuTruckNum | String | 负一甲作业车数 |
| data.oneTruckNum | String | 一甲作业车数 |
| data.twoTruckNum | String | 二甲作业车数 |
| data.threeTruckNum | String | 三甲作业车数 |
| data.fourTruckNum | String | 四甲作业车数 |
| data.fiveTruckNum | String | 五甲作业车数 |
| data.emptyPallet20 | String | 20尺空托盘 |
| data.emptyPallet40 | String | 40尺空托盘 |
| data.planTotlTeu | String | TEU计划总量 |
| data.planDc20 | String | 20尺干柜 |
| data.planLf20 | String | 20尺活鱼 |
| data.planRf20 | String | 20尺冷柜 |
| data.planOw20 | String | 20尺超重(铁件、石材) |
| data.planDc40 | String | 40尺干柜 |
| data.planRf40 | String | 40尺冷柜 |
| data.plan45 | String | 45尺 |
查询开工配置信息
- 接口路径:
/centralControl/getConfiguration - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | query | String | 否 | 航次ID,不传则查询当前开工航次 |
接口说明:根据航次ID查询开工配置信息;若不传
voyageId,则查询当前开工航次的配置信息。响应实体为SetConfigurationRespVO,包含船舶航次信息和配置信息。响应示例:
{
"code": 0,
"message": "请求成功",
"data": {
"voyageId": "V2026050801",
"templateId": "TEMPLATE-001",
"vesselCode": "NGP",
"vesselName": "新金桥7",
"line": "威海-韩国",
"bVyg": "2026001E",
"ieType": "E",
"phase": "YDG",
"goal": "韩国仁川",
"isXc": "0",
"iscomfire": "1",
"eta": "2026-05-08 08:00:00",
"etd": "2026-05-08 18:00:00",
"ata": "2026-05-08 08:15:00",
"atd": null,
"etstartwork": "2026-05-08 09:00:00",
"etendwork": "2026-05-08 17:00:00",
"startwork": "2026-05-08 09:10:00",
"endwork": null,
"minusoneTeu": "10",
"oneTeu": "20",
"twoTeu": "25",
"threeTeu": "30",
"fourTeu": "25",
"fiveTeu": "20",
"minusoneTeuTruckNum": "2",
"oneTruckNum": "4",
"twoTruckNum": "5",
"threeTruckNum": "6",
"fourTruckNum": "5",
"fiveTruckNum": "4",
"emptyPallet20": "5",
"emptyPallet40": "3",
"planTotlTeu": "500",
"planDc20": "100",
"planLf20": "50",
"planRf20": "80",
"planOw20": "30",
"planDc40": "120",
"planRf40": "100",
"plan45": "20"
}
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data.voyageId | String | 航次 ID |
| data.templateId | String | 模板 ID |
| 船舶航次信息 | ||
| data.vesselCode | String | 船舶编码 |
| data.vesselName | String | 船名 |
| data.line | String | 航线 |
| data.bVyg | String | 出口航次号 |
| data.ieType | String | 进出标志(E:出口 I:进口) |
| data.phase | String | 作业阶段 |
| data.goal | String | 目标港 |
| data.isXc | String | 是否卸箱(0:否 1:是) |
| data.iscomfire | String | 是否确认作业 |
| data.eta | String | 预计到港时间 |
| data.etd | String | 预计离港时间 |
| data.ata | String | 实际到港时间 |
| data.atd | String | 实际离港时间 |
| data.etstartwork | String | 计划开工时间 |
| data.etendwork | String | 计划完工时间 |
| data.startwork | String | 实际开工时间 |
| data.endwork | String | 实际完工时间 |
| data.xhd | String | 卸货港代码 |
| data.impMnftDate | String | 进口装船计划日期 |
| data.expMnftDate | String | 出口装船计划日期 |
| data.beginreceive | String | 进口入港凭单日期 |
| data.drycutoff | String | 干柜截止日期 |
| data.hazcutoff | String | 危险品截止日期 |
| data.reefcutoff | String | 冷藏截止日期 |
| data.pilotonboard | String | 引水员上船时间 |
| data.pilotoffboard | String | 引水员下船时间 |
| data.laboronboard | String | 劳工上船时间 |
| data.laboroffboard | String | 劳工下船时间 |
| data.opa | String | 实际开始靠泊时间 |
| data.opd | String | 实际离泊时间 |
| data.startdisc | String | 开始卸货时间 |
| data.completedisc | String | 完成卸货时间 |
| data.startload | String | 开始装货时间 |
| data.completeload | String | 完成装货时间 |
| data.loadNote | String | 装货备注 |
| data.discNote | String | 卸货备注 |
| data.restowNote | String | 移位备注 |
| data.shiftNote | String | 换船备注 |
| data.iShipNo | String | 内部船号 |
| data.foreBollard | String | 船首系缆柱 |
| data.aftBollard | String | 船尾系缆柱 |
| data.foreOffset | String | 船首偏移量 |
| data.aftOffset | String | 船尾偏移量 |
| data.notes | String | 备注 |
| data.isQg | String | 是否起隔 |
| data.isSd | String | 是否扫底 |
| data.isSb | String | 是否绑扎 |
| data.isPf | String | 是否配积 |
| data.inZl | String | 入闸方式 |
| data.inBz | String | 入闸备注 |
| data.inBj | String | 入闸标记 |
| data.workRoRo | String | 是否RoRo作业 |
| data.createdMan | String | 创建人 |
| data.createdOn | String | 创建时间 |
| data.updatedMan | String | 更新人 |
| data.updatedOn | String | 更新时间 |
| 配置信息 | ||
| data.minusoneTeu | String | 负一甲装箱量 |
| data.oneTeu | String | 一甲装箱量 |
| data.twoTeu | String | 二甲装箱量 |
| data.threeTeu | String | 三甲装箱量 |
| data.fourTeu | String | 四甲装箱量 |
| data.fiveTeu | String | 五甲装箱量 |
| data.minusoneTeuTruckNum | String | 负一甲作业车数 |
| data.oneTruckNum | String | 一甲作业车数 |
| data.twoTruckNum | String | 二甲作业车数 |
| data.threeTruckNum | String | 三甲作业车数 |
| data.fourTruckNum | String | 四甲作业车数 |
| data.fiveTruckNum | String | 五甲作业车数 |
| data.emptyPallet20 | String | 20尺空托盘 |
| data.emptyPallet40 | String | 40尺空托盘 |
| data.planTotlTeu | String | TEU计划总量 |
| data.planDc20 | String | 20尺干柜 |
| data.planLf20 | String | 20尺活鱼 |
| data.planRf20 | String | 20尺冷柜 |
| data.planOw20 | String | 20尺超重(铁件、石材) |
| data.planDc40 | String | 40尺干柜 |
| data.planRf40 | String | 40尺冷柜 |
| data.plan45 | String | 45尺 |
中控开工
- 接口路径:
/centralControl/beginWork - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| vesselVisitId | query | String | 是 | 航次 ID |
接口说明:
- 调用前会检查是否有其他船舶正在作业,若有则返回错误:
有船舶未作业完成,请先将其完船后再开工! - 成功后会更新航次状态为开工状态
- 调用前会检查是否有其他船舶正在作业,若有则返回错误:
响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示开工成功 |
中控开工取消
- 接口路径:
/centralControl/cancelBeginWork - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| vesselVisitId | query | String | 是 | 航次 ID |
接口说明:
- 若船舶已完工(
WORK_RO_RO=2),返回错误:选择的船舶已完工,无法进行取消! - 若船舶未开工(
WORK_RO_RO!=1),返回错误:选择的船舶未开工,无法进行取消!
- 若船舶已完工(
响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示开工取消成功 |
中控完工
- 接口路径:
/centralControl/endWork - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| vesselVisitId | query | String | 是 | 航次 ID |
接口说明:
- 若船舶未开工(
STARTWORK为空),返回错误:当前船舶未开工,无法设置为完工!
- 若船舶未开工(
响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示完工成功 |
中控完工取消
- 接口路径:
/centralControl/cancelEndWork - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| vesselVisitId | query | String | 是 | 航次 ID |
接口说明:
- 若船舶未完工(
WORK_RO_RO!=2),返回错误:选择的船舶未完工,无法进行取消!
- 若船舶未完工(
响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示完工取消成功 |
中控添加/修改计划
- 接口路径:
/centralControl/updatePlan - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | body | String | 是 | 航次 ID |
| templateId | body | String | 否 | 模板 ID |
| minusoneTeu | body | String | 否 | 负一甲装箱量 |
| oneTeu | body | String | 否 | 一甲装箱量 |
| twoTeu | body | String | 否 | 二甲装箱量 |
| threeTeu | body | String | 否 | 三甲装箱量 |
| fourTeu | body | String | 否 | 四甲装箱量 |
| fiveTeu | body | String | 否 | 五甲装箱量 |
| minusoneTeuTruckNum | body | String | 否 | 负一甲作业车数 |
| oneTruckNum | body | String | 否 | 一甲作业车数 |
| twoTruckNum | body | String | 否 | 二甲作业车数 |
| threeTruckNum | body | String | 否 | 三甲作业车数 |
| fourTruckNum | body | String | 否 | 四甲作业车数 |
| fiveTruckNum | body | String | 否 | 五甲作业车数 |
| emptyPallet20 | body | String | 否 | 20尺空托盘 |
| emptyPallet40 | body | String | 否 | 40尺空托盘 |
| planTotlTeu | body | String | 否 | TEU计划总量 |
| planDc20 | body | String | 否 | 20尺干柜 |
| planLf20 | body | String | 否 | 20尺活鱼 |
| planRf20 | body | String | 否 | 20尺冷柜 |
| planOw20 | body | String | 否 | 20尺超重(铁件、石材) |
| planDc40 | body | String | 否 | 40尺干柜 |
| planRf40 | body | String | 否 | 40尺冷柜 |
| plan45 | body | String | 否 | 45尺 |
- 请求示例:
{
"voyageId": "V2026050801",
"templateId": "TEMPLATE-001",
"minusoneTeu": "10",
"oneTeu": "20",
"twoTeu": "25",
"threeTeu": "30",
"fourTeu": "25",
"fiveTeu": "20",
"minusoneTeuTruckNum": "2",
"oneTruckNum": "4",
"twoTruckNum": "5",
"threeTruckNum": "6",
"fourTruckNum": "5",
"fiveTruckNum": "4",
"emptyPallet20": "5",
"emptyPallet40": "3",
"planTotlTeu": "500",
"planDc20": "100",
"planLf20": "50",
"planRf20": "80",
"planOw20": "30",
"planDc40": "120",
"planRf40": "100",
"plan45": "20"
}接口说明:
- 根据航次ID添加或修改计划信息、模板信息、各甲板装箱量、各甲板作业车数及空托盘数量
- 若该航次已存在计划记录,则更新;否则新增
响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示计划更新成功 |
查询航次列表
接口路径:
/centralControl/getVesselVisitListMethod:
GET请求参数:无
接口说明:查询出口航次列表,筛选条件为
IE_TYPE = 'E'且VESSEL_CODE IN ('NGP','NEW GOLDEN BRIDGVII'),按创建时间倒序排列。响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"id": "VID-001",
"vesselCode": "NGP",
"vesselName": "新金桥",
"voyageId": "V2026050801",
"eta": "2026-05-08 14:00:00",
"etd": "2026-05-09 10:00:00",
"createdOn": "2026-05-07 09:00:00",
"createdMan": "admin"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].id | String | 航次记录 ID |
| data[].vesselCode | String | 船舶代码 |
| data[].vesselName | String | 船舶名称 |
| data[].voyageId | String | 航次号 |
| data[].eta | String | 预计到港时间 |
| data[].etd | String | 预计离港时间 |
| data[].createdOn | Date/String | 创建时间 |
| data[].createdMan | String | 创建人 |
获取车道区域状态字典
接口路径:
/centralControl/getLaneAreaStatusDictMethod:
GET请求参数:无
接口说明:获取车道区域状态字典,共四个状态,未来会将这个状态设置到
C_LANE_CNTR表的workStatus字段中。响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"code": "PENDING",
"label": "作业中"
},
{
"code": "DONE",
"label": "已完成"
},
{
"code": "CARGO",
"label": "件货"
},
{
"code": "TEMP",
"label": "临时区域"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].code | String | 状态编码 |
| data[].label | String | 状态显示名称 |
- 状态说明:
| 编码 | 显示名称 | 说明 |
|---|---|---|
| PENDING | 作业中 | 正在进行作业的区域 |
| DONE | 已完成 | 作业已完成的区域 |
| CARGO | 件货 | 存放件货的区域 |
| TEMP | 临时区域 | 临时使用的区域 |
新增临时区域或件货区域
- 接口路径:
/centralControl/insertTemporaryArea - Method:
POST - 请求参数:请求体为单个
CLaneCntr对象
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| coordX | body | BigDecimal | 是 | X 坐标,对应 C_LANE_CNTR.COORD_X |
| coordY | body | BigDecimal | 是 | Y 坐标,对应 C_LANE_CNTR.COORD_Y |
| coordZ | body | BigDecimal | 是 | Z 坐标,对应 C_LANE_CNTR.COORD_Z |
| length | body | BigDecimal | 是 | 长度,对应 C_LANE_CNTR.LENGTH |
| width | body | BigDecimal | 是 | 宽度,对应 C_LANE_CNTR.WIDTH |
| workStatus | body | String | 是 | 作业状态,只允许 CARGO、TEMP,对应 C_LANE_CNTR.WORK_STATUS |
接口说明:插入单条临时区域或件货区域数据到
C_LANE_CNTR表,系统会自动生成主键并补充创建时间、更新时间、创建人、更新人和正常数据状态。请求示例:
{
"coordX": 1,
"coordY": 2,
"coordZ": 3,
"length": 12.2,
"width": 2.44,
"workStatus": "TEMP"
}- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示插入成功 |
删除临时区域或件货区域
- 接口路径:
/centralControl/deleteTemporaryArea - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | C_LANE_CNTR 表的主键 ID,临时区域未与托盘池数据绑定,在获取配载数据时,此表的 ID 会被赋值到 palletTypeId |
接口说明:根据
C_LANE_CNTR表的主键 ID 删除指定的临时区域或件货区域记录。响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示删除成功 |
中控移箱
- 接口路径:
/centralControl/moveContainer - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | body | String | 是 | 托盘池 ID,用于定位需要移位的托盘及其放箱记录 |
| coordinateX | body | BigDecimal | 是 | 目标位置 X 坐标 |
| coordinateY | body | BigDecimal | 是 | 目标位置 Y 坐标 |
| coordinateZ | body | BigDecimal | 是 | 目标位置 Z 坐标 |
| trailerNo | body | String | 否 | 拖车号,hasDone 为 true 时优先使用此字段通知拖车 |
| sendNotification | body | String | 否 | 是否发送通知,仅当值为 "Y" 时发送通知 |
| laneId | body | String | 是 | 车道 ID |
接口说明:
- 通过
palletTypeId获取托盘池信息,并根据当前最新作业航次定位该托盘对应的C_LANE_CNTR放箱记录。 - 当放箱记录为
workStatus=PENDING时,仅更新C_LANE_CNTR的目标坐标,并通知该记录绑定的内拖车作业位置已调整。 - 当放箱记录为
workStatus=DONE时:- 如果请求参数中提供了
trailerNo,则优先使用该拖车号进行通知; - 如果未提供
trailerNo,则使用托盘池已绑定的内拖车号(若托盘池未绑定内拖车则报错); - 系统会将放箱记录重置为
PENDING并绑定到指定的内拖车,同时按航次+箱号把C_YARD_CNTR.workStatus重置为PENDING,并通过 WebSocket 下发新的移箱任务。
- 如果请求参数中提供了
- 不支持同时移位
PENDING与DONE的记录(需要分批操作)。
- 通过
WebSocket 推送(内拖车,示例):
- 进行中移箱(记录含
workStatus=PENDING):description="作业位置已调整,请按新位置执行作业" - 已完成移箱(记录均为
workStatus=DONE,会下发移箱任务):description="中控已下发移箱任务,请按新位置执行作业"
- 进行中移箱(记录含
{
"eventType": "MOVE_CONTAINER",
"description": "作业位置已调整,请按新位置执行作业",
"data": {
"palletTypeId": "PALLET-TYPE-001",
"cLaneCntrIdList": ["f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df"],
"coordinateX": 2.5,
"coordinateY": 6.8,
"coordinateZ": 1
}
}- 请求示例:
{
"palletTypeId": "PALLET-TYPE-001",
"coordinateX": 2.5,
"coordinateY": 6.8,
"coordinateZ": 1,
"laneId": "LANE-A01"
}- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示移箱处理成功 |
按甲板查询船上放箱详情
- 接口路径:
/centralControl/getShipPlacementDetailByDeck - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| deckList | query | List | 否 | 甲板层级集合,常见值:1/3/5;不传、传 null 或空数组则查询所有甲板 |
| voyageId | query | String | 否 | 航次ID,不传则查询当前作业航次 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"workStatus": "PENDING",
"palletTypeId": "PALLET-TYPE-001",
"length": 12.2,
"width": 2.44,
"containers": [
{
"id": "f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df",
"laneId": "LANE-A01",
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"cntr": "MSCU1234567",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"actCoordX": null,
"actCoordY": null,
"actCoordZ": null,
"workMode": "DRIVER",
"voyage": "V2026050801",
"workStatus": "PENDING",
"status": "NORMAL",
"trailerNo": "IT-001",
"cntrType": "GP",
"cntrSize": 20,
"palletId": "PALLET-001",
"cntrWeight": 24.5
}
]
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].coordX | BigDecimal | X 坐标 |
| data[].coordY | BigDecimal | Y 坐标 |
| data[].coordZ | BigDecimal | Z 坐标/甲板层级 |
| data[].workStatus | String | 当前坐标分组的作业状态 |
| data[].palletTypeId | String | 托盘池 ID |
| data[].length | BigDecimal | 托盘长度 |
| data[].width | BigDecimal | 托盘宽度 |
| data[].containers | Array | 该坐标下存在箱号的放箱记录列表,元素字段结构同 C_LANE_CNTR |
按甲板查询船上放箱详情(含托盘信息)
- 接口路径:
/centralControl/getShipPlacementDetailWithPalletByDeck - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| deckList | query | List | 否 | 甲板层级集合,常见值:1/3/5;不传、传 null 或空数组则查询所有甲板 |
| voyageId | query | String | 否 | 航次ID,不传则查询当前作业航次 |
接口说明:该接口与
getShipPlacementDetailByDeck类似,但只查询非临时区域和件货区域的数据(即排除workStatus为CARGO和TEMP的记录),这类数据一定会有托盘信息,因此返回结果中会同步返回C_PALLET表的完整数据。C_LANE_CNTR表的palletId字段对应C_PALLET表的ID。响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"workStatus": "PENDING",
"palletTypeId": "PALLET-TYPE-001",
"length": 12.2,
"width": 2.44,
"containers": [
{
"id": "f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df",
"laneId": "LANE-A01",
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"cntr": "MSCU1234567",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"actCoordX": null,
"actCoordY": null,
"actCoordZ": null,
"workMode": "DRIVER",
"voyage": "V2026050801",
"workStatus": "PENDING",
"status": "NORMAL",
"trailerNo": "IT-001",
"cntrType": "GP",
"cntrSize": 20,
"palletId": "PALLET-001",
"cntrWeight": 24.5
}
],
"pallet": {
"id": "PALLET-001",
"name": "20GP标准托盘",
"length": 12.2,
"width": 2.44,
"height": 1.2,
"weight": 0.5,
"palletSize": 20,
"quantity": 100,
"createdOn": "2026-05-01T09:00:00+08:00",
"createdBy": "admin",
"updatedOn": "2026-05-08T10:00:00+08:00",
"updatedBy": "admin",
"remark": null
}
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].coordX | BigDecimal | X 坐标 |
| data[].coordY | BigDecimal | Y 坐标 |
| data[].coordZ | BigDecimal | Z 坐标/甲板层级 |
| data[].workStatus | String | 当前坐标分组的作业状态 |
| data[].palletTypeId | String | 托盘池 ID |
| data[].length | BigDecimal | 托盘长度 |
| data[].width | BigDecimal | 托盘宽度 |
| data[].containers | Array | 该坐标下存在箱号的放箱记录列表,元素字段结构同 C_LANE_CNTR |
| data[].pallet | Object | 托盘信息,字段结构同 C_PALLET 实体类 |
| data[].pallet.id | String | 托盘 ID(主键) |
| data[].pallet.name | String | 托盘名称 |
| data[].pallet.length | BigDecimal | 托盘长度 |
| data[].pallet.width | BigDecimal | 托盘宽度 |
| data[].pallet.height | BigDecimal | 托盘高度 |
| data[].pallet.weight | BigDecimal | 托盘重量 |
| data[].pallet.palletSize | Integer | 托盘尺寸(柜型) |
| data[].pallet.quantity | Integer | 托盘数量 |
| data[].pallet.createdOn | Date/String | 创建时间 |
| data[].pallet.createdBy | String | 创建人 |
| data[].pallet.updatedOn | Date/String | 更新时间 |
| data[].pallet.updatedBy | String | 更新人 |
| data[].pallet.remark | String | 备注 |
根据托盘池ID查询船上放箱详情
- 接口路径:
/centralControl/getShipPlacementDetailByPalletTypeId - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 托盘池 ID |
接口说明:根据托盘池ID查询该托盘在船上的放箱详情,返回单个放箱位置信息。
响应示例:
{
"code": 0,
"message": "请求成功",
"data": {
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"workStatus": "PENDING",
"palletTypeId": "PALLET-TYPE-001",
"length": 12.2,
"width": 2.44,
"containers": [
{
"id": "f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df",
"laneId": "LANE-A01",
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 1,
"cntr": "MSCU1234567",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"actCoordX": null,
"actCoordY": null,
"actCoordZ": null,
"workMode": "DRIVER",
"voyage": "V2026050801",
"workStatus": "PENDING",
"status": "NORMAL",
"trailerNo": "IT-001",
"cntrType": "GP",
"cntrSize": 20,
"palletId": "PALLET-001",
"cntrWeight": 24.5
}
]
}
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data.coordX | BigDecimal | X 坐标 |
| data.coordY | BigDecimal | Y 坐标 |
| data.coordZ | BigDecimal | Z 坐标/甲板层级 |
| data.workStatus | String | 当前坐标分组的作业状态 |
| data.palletTypeId | String | 托盘池 ID |
| data.length | BigDecimal | 托盘长度 |
| data.width | BigDecimal | 托盘宽度 |
| data.containers | Array | 该坐标下存在箱号的放箱记录列表,元素字段结构同 C_LANE_CNTR |
根据船舶代码关联查询甲板和车道信息
- 接口路径:
/centralControl/getDeckAndLaneByVesselCode - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| vesselCode | query | String | 是 | 船舶代码 |
接口说明:根据船舶代码关联查询
C_DECK和C_LANE表的数据,C_DECK的 ID 就是C_LANE表的deckId。返回每个甲板信息及其关联的车道列表。响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"id": "DECK-001",
"vesselCode": "NGP",
"deckNo": 1,
"width": 30,
"length": 100,
"offsetX": 0,
"offsetY": 0,
"url": null,
"roadList": [
{
"id": "LANE-001",
"deckId": "DECK-001",
"x": 10,
"y": 5,
"w": 5,
"h": 3,
"lineNo": "L01",
"description": "一号车道",
"remark": null,
"fillColor": "#FFFFFF",
"strokeColor": "#000000",
"strokeWidth": 1
},
{
"id": "LANE-002",
"deckId": "DECK-001",
"x": 10,
"y": 15,
"w": 5,
"h": 3,
"lineNo": "L02",
"description": "二号车道",
"remark": null,
"fillColor": "#FFFFFF",
"strokeColor": "#000000",
"strokeWidth": 1
}
]
},
{
"id": "DECK-002",
"vesselCode": "NGP",
"deckNo": 2,
"width": 30,
"length": 100,
"offsetX": 0,
"offsetY": 50,
"url": null,
"roadList": [
{
"id": "LANE-003",
"deckId": "DECK-002",
"x": 10,
"y": 5,
"w": 5,
"h": 3,
"lineNo": "L01",
"description": "一号车道",
"remark": null,
"fillColor": "#FFFFFF",
"strokeColor": "#000000",
"strokeWidth": 1
}
]
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].id | String | 甲板ID |
| data[].vesselCode | String | 船舶代码 |
| data[].deckNo | Integer | 甲板号 |
| data[].width | Integer | 甲板宽度 |
| data[].length | Integer | 甲板长度 |
| data[].offsetX | Integer | X偏移量 |
| data[].offsetY | Integer | Y偏移量 |
| data[].url | String | URL |
| data[].roadList | Array | 车道列表 |
| data[].roadList[].id | String | 车道ID |
| data[].roadList[].deckId | String | 所属甲板ID |
| data[].roadList[].x | Integer | X坐标 |
| data[].roadList[].y | Integer | Y坐标 |
| data[].roadList[].w | Integer | 宽度 |
| data[].roadList[].h | Integer | 高度 |
| data[].roadList[].lineNo | String | 车道号 |
| data[].roadList[].description | String | 描述 |
| data[].roadList[].remark | String | 备注 |
| data[].roadList[].fillColor | String | 填充颜色 |
| data[].roadList[].strokeColor | String | 描边颜色 |
| data[].roadList[].strokeWidth | Integer | 描边宽度 |
叉车
叉车叫车,让内拖前往托盘场地
- 接口路径:
/forklift/requireInternalTrailer - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| internalTrailerNo | query | String | 是 | 目标内拖车号 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 备注:接口会通过 WebSocket 向目标内拖车(
terminalName=internalTrailerNo)推送提示消息:叉车叫车,请前往托盘场地。 - 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 当前实现无业务返回值,仅返回成功包装 |
获取空拖头状态下的拖车列表
- 接口路径:
/forklift/getEmptyTrailerList - Method:
GET - 请求参数:无
- 接口说明:返回
workStatus=WAITING_FOR_PALLET的拖车会话信息,数据直接来自 Redis 会话存储。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"sessionId": "session-uuid-123",
"terminalName": "IT-001",
"terminalType": "DRIVER",
"workStatus": "WAITING_FOR_PALLET",
"connectTime": "2026-05-08T10:00:00"
},
{
"sessionId": "session-uuid-456",
"terminalName": "IT-003",
"terminalType": "DRIVERLESS",
"workStatus": "WAITING_FOR_PALLET",
"connectTime": "2026-05-08T10:15:00"
},
{
"sessionId": "session-uuid-789",
"terminalName": "IT-005",
"terminalType": "DRIVER",
"workStatus": "WAITING_FOR_PALLET",
"connectTime": "2026-05-08T10:30:00"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].sessionId | String | WebSocket 会话 ID |
| data[].terminalName | String | 内拖车号(终端名称) |
| data[].terminalType | String | 拖车类型:DRIVER(有人拖车)、DRIVERLESS(无人拖车) |
| data[].workStatus | String | 拖车作业状态,固定为 WAITING_FOR_PALLET |
| data[].connectTime | DateTime/String | 建连时间 |
取消绑定内拖车和托盘
- 接口路径:
/forklift/unbindInternalTrailerAndPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 备注:接口会重置托盘池绑定关系并更新内拖车在线会话
workStatus,同时通过 WebSocket 向目标内拖车推送提示:已解绑托盘,请等待叉车重新绑定托盘。 - 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示解绑成功 |
绑定内拖车和托盘
- 接口路径:
/forklift/bindInternalTrailerAndPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| internalTrailerNo | query | String | 是 | 内拖车号 |
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 备注:
- 接口会写托盘池绑定关系(
bindInternalTrailerFlag/bindInternalTrailerNo),并更新内拖车在线会话workStatus。 - 接口会通过 WebSocket 向目标内拖车推送
workStatus与提示文案:- 非直装船(
palletWorkType != SHIPMENT):已绑定托盘,请到等待区排队等待正面吊放箱 - 直装船(
palletWorkType = SHIPMENT):已绑定托盘,可直接装船
- 非直装船(
- 接口会写托盘池绑定关系(
- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示绑定成功 |
叉车签收托盘
- 接口路径:
/forklift/signPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
| forkliftNo | query | String | 是 | 叉车终端号/编号 |
- 备注:
- 同一叉车签收新托盘时,会自动取消其名下其他未完成且
bindInternalTrailerFlag为空或"N"的托盘的签收绑定(清空托盘的bindForkliftNo),避免重复作业;已绑定内拖车(bindInternalTrailerFlag="Y")的托盘不受影响。 - 接口采用分布式锁机制,避免多个叉车同时签收同一个托盘。若托盘正在被其他叉车操作,会返回错误:
当前托盘正在被其他叉车操作,请稍后重试。
- 同一叉车签收新托盘时,会自动取消其名下其他未完成且
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示签收成功 |
叉车取消签收托盘
- 接口路径:
/forklift/cancelSignPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示取消签收成功 |
船舶配载
获取当前航次在场箱
- 接口路径:
/cLaneCntr/list - Method:
GET - 请求参数:无
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"id": "f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df",
"laneId": "LANE-A01",
"coordX": 1.2,
"coordY": 3.4,
"coordZ": 0.8,
"cntr": "MSCU1234567",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"actCoordX": null,
"actCoordY": null,
"actCoordZ": null,
"workMode": "DRIVER",
"voyageId": "V2026050801",
"workStatus": "PENDING",
"status": "NORMAL",
"trailerNo": "IT-001",
"cntrType": "GP",
"cntrSize": 20,
"palletId": "PALLET-001",
"cntrWeight": 24.5
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].id | String | 车道箱作业记录 ID |
| data[].laneId | String | 车道 ID |
| data[].coordX | BigDecimal | 作业位置 X 坐标 |
| data[].coordY | BigDecimal | 作业位置 Y 坐标 |
| data[].coordZ | BigDecimal | 作业位置 Z 坐标 |
| data[].cntr | String | 箱号 |
| data[].updatedOn | Date | 更新时间 |
| data[].createdOn | Date | 创建时间 |
| data[].createdBy | String | 创建人 |
| data[].updatedBy | String | 更新人 |
| data[].remark | String | 备注 |
| data[].actCoordX | BigDecimal | 无人拖车作业回调 X 坐标 |
| data[].actCoordY | BigDecimal | 无人拖车作业回调 Y 坐标 |
| data[].actCoordZ | BigDecimal | 无人拖车作业回调 Z 坐标 |
| data[].workMode | String | 作业方式:DRIVER(内拖车)、DRIVERLESS(无人驾驶) |
| data[].voyageId | String | 当前作业航次 |
| data[].workStatus | String | 作业状态:PENDING(进行中)、DONE(已完成)、CANCELED(取消) |
| data[].status | String | 数据状态:NORMAL(正常)、DISABLED(作废) |
| data[].trailerNo | String | 拖车号(内拖车号) |
| data[].cntrType | String | 箱型 |
| data[].cntrSize | Integer | 箱尺寸,如 20、40 |
| data[].palletId | String | 关联托盘 ID |
| data[].cntrWeight | BigDecimal | 箱重,单位吨 |
堆场箱
置底在场箱
- 接口路径:
/yard/bottomContainer - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| containerNo | query | String | 是 | 箱号 |
- 接口说明:将指定箱号的在场箱置底,通过更新
updatedOn字段为当前时间实现。查询时按updatedOn升序排列,被置底的箱子会排在后面。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示置底成功 |
托盘
获取场内托盘
- 接口路径:
/cPallet/getAllPallets - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | query | String | 否 | 航次ID,不传则查询当前作业航次的数据 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"id": "PALLET-001",
"name": "20GP标准托盘",
"length": 12.5,
"width": 2.8,
"height": 1.6,
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"quantity": 3,
"remark": "标准作业托盘",
"weight": 2.3,
"palletSize": 20
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].id | String | 托盘主键 |
| data[].name | String | 托盘名称 |
| data[].length | BigDecimal | 托盘长度 |
| data[].width | BigDecimal | 托盘宽度 |
| data[].height | BigDecimal | 托盘高度 |
| data[].updatedOn | Date/String | 更新时间 |
| data[].createdOn | Date/String | 创建时间 |
| data[].createdBy | String | 创建人 |
| data[].updatedBy | String | 更新人 |
| data[].quantity | Integer | 托盘数量 |
| data[].remark | String | 备注 |
| data[].weight | BigDecimal | 托盘重量 |
| data[].palletSize | Integer | 托盘尺寸,主要用于前端校验是否允许放箱 |
正面吊
查询在线终端会话
- 接口路径:
/reachStacker/test - Method:
GET - 请求参数:无
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"sessionId": "ws-001",
"username": "admin",
"terminalType": "DRIVER",
"terminalName": "IT-001",
"workStatus": "WAITING_FOR_CONTAINER",
"connectTime": "2026-05-08T10:00:00",
"lastActiveTime": "2026-05-08T10:30:00"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].sessionId | String | WebSocket 会话 ID |
| data[].username | String | 登录用户名 |
| data[].terminalType | String | 终端类型,常见值:DRIVER、REACH_STACKER、FORKLIFT、CONTROL |
| data[].terminalName | String | 终端名称,如内拖车号或设备名 |
| data[].workStatus | String | 拖车当前作业状态;非拖车终端可能为空 |
| data[].connectTime | DateTime/String | 建连时间 |
| data[].lastActiveTime | DateTime/String | 最后活跃时间 |
取消正面吊叫车
- 接口路径:
/reachStacker/cancelRequireInternalTrailer - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| internalTrailerName | query | String | 是 | 被取消叫车的内拖车名称/车号 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示取消成功 |
- 备注:
- 接口会清空托盘池中目标内拖车绑定的
bindReachStackerNo。 - 内拖车在线时:通过 WebSocket 向该内拖车推送提示:
正面吊取消叫车,请回等待区等待。 - 内拖车离线时:消息会被压入延迟队列,后续补发。
- 接口会清空托盘池中目标内拖车绑定的
正面吊叫车
- 接口路径:
/reachStacker/requireInternalTrailer - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| reachStackerName | query | String | 是 | 发起叫车的正面吊名称 |
| internalTrailerName | query | String | 是 | 被叫的内拖车名称/车号 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示叫车请求已受理 |
- 备注:
- 接口采用分布式锁机制,避免多个正面吊同时叫一辆车。若拖车已被其他正面吊预约,会返回错误:
当前拖车已被其他正面吊预约,请稍后重试。 - 接口会更新托盘池中目标内拖车绑定的
bindReachStackerNo(记录哪个正面吊叫的车)。 - 内拖车在线时:通过 WebSocket 向该内拖车推送提示:
请到{reachStackerName}下等待作业。 - 内拖车离线时:消息会被压入延迟队列,后续补发。
- 接口采用分布式锁机制,避免多个正面吊同时叫一辆车。若拖车已被其他正面吊预约,会返回错误:
正面吊签收托盘
- 接口路径:
/reachStacker/signPallet - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
| reachStackerNo | query | String | 是 | 正面吊终端号/编号 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示签收成功 |
获取在场箱列表
- 接口路径:
/reachStacker/getYardContainerList - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| voyageId | query | String | 否 | 航次ID,不传则查询当前作业航次的数据 |
- 接口说明:返回数据按
updatedOn(更新时间)倒序排列。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"id": "YARD-001",
"cntrIso": "MSCU1234567",
"workStatus": "NONE",
"voyageId": "V2026050801",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"laneNumber": 6,
"cntrType": "GP",
"cntrSize": 20,
"manifestWeight": 22000,
"bridgeWeight": 22350,
"taskId": "TASK-001",
"passGateTime": "2026-05-08T09:15:00+08:00",
"passGateTruck": "TRUCK-001"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].id | String | 堆场箱记录主键 |
| data[].cntrIso | String | 箱号 |
| data[].workStatus | String | 作业状态,NONE 待作业,PENDING 作业中,DONE 已完成,DROP 甩箱 |
| data[].voyageId | String | 航次 |
| data[].updatedOn | Date/String | 更新时间 |
| data[].createdOn | Date/String | 创建时间 |
| data[].createdBy | String | 创建人 |
| data[].updatedBy | String | 更新人 |
| data[].remark | String | 备注 |
| data[].laneNumber | Integer | 车道号 |
| data[].cntrType | String | 箱型 |
| data[].cntrSize | Integer | 箱尺寸 |
| data[].manifestWeight | BigDecimal | 预配舱单重量 |
| data[].bridgeWeight | BigDecimal | 过磅重量(毛重) |
| data[].taskId | String | 关联任务 ID |
| data[].passGateTime | Date/String | 过闸时间 |
| data[].passGateTruck | String | 外集卡车号 |
获取内拖车列表
- 接口路径:
/reachStacker/getInternalTrailerList - Method:
GET - 请求参数:无
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": {
"idleList": [
{
"internalTrailerNo": "IT-001",
"terminalType": "DRIVER",
"palletInfo": {
"id": "PALLET-001",
"name": "20GP标准托盘",
"length": 12.5,
"width": 2.8,
"height": 1.6,
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"quantity": 3,
"remark": "标准作业托盘",
"weight": 2.3,
"palletSize": 20
},
"bindContainerInfoList": [],
"requester": "RS-01"
},
{
"internalTrailerNo": "IT-003",
"terminalType": "DRIVERLESS",
"palletInfo": {},
"bindContainerInfoList": [],
"requester": ""
}
],
"assembleList": [],
"workingList": [
{
"internalTrailerNo": "IT-002",
"terminalType": "DRIVERLESS",
"palletInfo": {
"id": "PALLET-002",
"name": "40HC标准托盘",
"length": 13.8,
"width": 2.8,
"height": 1.6,
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"quantity": 1,
"remark": null,
"weight": 2.8,
"palletSize": 40
},
"bindContainerInfoList": [
{
"id": "YARD-001",
"cntrIso": "MSCU1234567",
"workStatus": "NONE",
"voyageId": "V2026050801",
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": null,
"laneNumber": 6,
"cntrType": "GP",
"cntrSize": 20,
"manifestWeight": 22000,
"bridgeWeight": 22350
},
{
"id": "YARD-002",
"cntrIso": "MSCU7654321",
"workStatus": "PENDING",
"voyageId": "V2026050801",
"updatedOn": "2026-05-08T11:00:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"remark": "Second container",
"laneNumber": 6,
"cntrType": "HC",
"cntrSize": 40,
"manifestWeight": 28000,
"bridgeWeight": 28500
}
],
"requester": "RS-02"
}
]
}
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data.idleList | Array | 空闲拖车列表,包含未绑托盘或已绑托盘但未放箱的拖车 |
| data.assembleList | Array | 预留的“组装中”列表,当前实现始终为空数组 |
| data.workingList | Array | 作业中的拖车列表,通常已关联托盘和箱信息 |
| data.*[].internalTrailerNo | String | 内拖车号 |
| data.*[].terminalType | String | 拖车类型:DRIVER(有人拖车)、DRIVERLESS(无人拖车) |
| data.*[].palletInfo | Object | 关联托盘信息,字段结构同 CPallet 实体类 |
| data.*[].bindContainerInfoList | Array | 已关联箱信息列表,字段结构同 CYardCntr 实体类 |
| data.*[].requester | String | 当前叫车或预约该拖车的正面吊名称;无则为空 |
获取只拉取托盘没有拉集装箱的拖车列表
- 接口路径:
/reachStacker/getPalletOnlyTrailerList - Method:
GET - 请求参数:无
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"internalTrailerNo": "IT-001",
"terminalType": "DRIVER",
"palletInfo": {
"id": "PALLET-001",
"name": "20GP标准托盘",
"length": 12.5,
"width": 2.8,
"height": 1.6,
"updatedOn": "2026-05-08T10:30:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"quantity": 3,
"remark": "标准作业托盘",
"weight": 2.3,
"palletSize": 20
},
"bindContainerInfoList": [],
"requester": "RS-01",
"voyageId": "V2026050801"
},
{
"internalTrailerNo": "IT-004",
"terminalType": "DRIVERLESS",
"palletInfo": {
"id": "PALLET-003",
"name": "40GP标准托盘",
"length": 12.2,
"width": 2.8,
"height": 1.6,
"updatedOn": "2026-05-08T10:45:00+08:00",
"createdOn": "2026-05-08T10:00:00+08:00",
"createdBy": "admin",
"updatedBy": "admin",
"quantity": 2,
"remark": "无人拖车专用",
"weight": 3.0,
"palletSize": 40
},
"bindContainerInfoList": [],
"requester": "RS-03",
"voyageId": "V2026050801"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].internalTrailerNo | String | 内拖车号 |
| data[].terminalType | String | 拖车类型:DRIVER(有人拖车)、DRIVERLESS(无人拖车) |
| data[].palletInfo | Object | 关联托盘信息,字段结构同 CPallet 实体类 |
| data[].bindContainerInfoList | Array | 已关联箱信息列表,此接口固定为空数组 |
| data[].requester | String | 当前叫车或预约该拖车的正面吊名称;无则为空 |
| data[].voyageId | String | 当前作业航次 |
获取已拉取托盘但未放箱的拖车列表
- 接口路径:
/reachStacker/getEmptyTrailerList - Method:
GET - 请求参数:无
- 接口说明:返回
workStatus=WAITING_FOR_CONTAINER的拖车会话信息,数据直接来自 Redis 会话存储。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
{
"sessionId": "session-uuid-abc",
"terminalName": "IT-001",
"terminalType": "DRIVER",
"workStatus": "WAITING_FOR_CONTAINER",
"connectTime": "2026-05-08T10:00:00"
},
{
"sessionId": "session-uuid-def",
"terminalName": "IT-004",
"terminalType": "DRIVERLESS",
"workStatus": "WAITING_FOR_CONTAINER",
"connectTime": "2026-05-08T10:45:00"
}
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data[].sessionId | String | WebSocket 会话 ID |
| data[].terminalName | String | 内拖车号(终端名称) |
| data[].terminalType | String | 拖车类型:DRIVER(有人拖车)、DRIVERLESS(无人拖车) |
| data[].workStatus | String | 作业状态,固定为 WAITING_FOR_CONTAINER |
| data[].connectTime | DateTime/String | 建连时间 |
取消将集装箱放置到内拖车的操作
- 接口路径:
/reachStacker/cancelContainerPlacement - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 盘型池记录 ID |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示取消成功 |
- 备注:
- 接口通过
palletTypeId获取绑定的拖车号,然后取消相关的车道箱作业记录。 - 若存在任一作业记录已完成(
workStatus=DONE),则不允许取消,接口会直接报错:箱已完成作业,无法解除绑定。 - 取消成功后会将对应
CLaneCntr记录置为:workStatus=CANCELED且status=DISABLED,并清空托盘池中该拖车的bindContainerInfoList,同时更新拖车在线会话workStatus。 - 内拖车在线时:通过 WebSocket 推送提示:
取消放箱,请回等待区等待;离线时消息进入延迟队列补发。
- 接口通过
完成将集装箱放置到内拖车的操作
- 接口路径:
/reachStacker/completeContainerPlacement - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | body | String | 是 | 盘型池记录 ID |
| containerNoList | body | Array<String> | 是 | 箱号列表(已按前后顺序排列,最多2个,最少1个) |
- 请求示例:
{
"palletTypeId": "2f50d4c1-8792-4b71-a1a3-7344327b6b7e",
"containerNoList": ["MSCU1234567", "MSCU7654321"]
}- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": [
"f3e1b8f2-53b1-4b1f-a43f-72e2f7e7f6df"
]
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | Array<String> | 生成的车道箱作业记录 ID 列表 |
| data[] | String | 单个 CLaneCntr 作业记录主键 |
- 备注:
- 前置条件:托盘池记录必须存在,且已绑定内拖车,否则接口会直接报错:
托盘池记录不存在,请刷新后重试或当前托盘未绑定拖车,无法执行放箱。 - 接口会根据
palletTypeId查找绑定的托盘池信息,获取关联的内拖车号。 - 接口会写托盘池字段:
bindContainerInfoList(本次放箱的箱信息列表)、bindReachStackerNo(当前操作人/正面吊标识),并更新拖车在线会话workStatus。 - 若
manual_loading_flag=Y(开启手动配载):不会生成CLaneCntr作业记录,而是向中控终端(terminalType=CONTROL)推送“请手动配载”的 WebSocket 消息,此时接口返回的data通常为空数组。 - 若
manual_loading_flag!=Y:会生成CLaneCntr作业记录并返回cLaneCntrIdList;内拖车在线时通过 WebSocket 下发cLaneCntrIdList,离线则消息进入延迟队列补发。
- 前置条件:托盘池记录必须存在,且已绑定内拖车,否则接口会直接报错:
向叉车预约托盘
- 接口路径:
/reachStacker/requirePalletType - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| terminalName | query | String | 是 | 发起预约的终端名称,通常为正面吊名称 |
| palletType | query | String | 是 | 预约的盘型名称 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示预约通知已发出 |
修改箱信息
- 接口路径:
/reachStacker/updateContainerInfo - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| cYardCntr | body | CYardCntr | 是 | 堆场箱实体对象 |
- 请求示例:
{
"id": "YARD-001",
"cntrIso": "MSCU1234567",
"workStatus": "NONE",
"voyageId": "V2026050801",
"cntrType": "GP",
"cntrSize": 20,
"manifestWeight": 22000,
"bridgeWeight": 22350
}- 接口说明:此接口仅更新
C_YARD_CNTR表的数据,不涉及其他操作。传入的CYardCntr实体必须包含id字段用于标识要更新的记录。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示修改成功 |
添加箱信息
- 接口路径:
/reachStacker/addContainerInfo - Method:
POST - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| cYardCntr | body | CYardCntr | 是 | 堆场箱实体对象 |
- 请求示例:
{
"cntrIso": "MSCU1234567",
"cntrType": "GP",
"cntrSize": 20,
"manifestWeight": 22000,
"bridgeWeight": 22350
}- 接口说明:此接口用于新增堆场箱记录,仅操作
C_YARD_CNTR表。系统会自动生成id(UUID格式)、设置workStatus=NONE、绑定当前作业航次,并设置updatedOn时间。 - 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示添加成功 |
内拖车
获取内拖车作业状态
- 接口路径:
/internalTrailer/getWorkStatus - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| terminalName | query | String | 是 | 内拖车名称/车号 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": "WAITING_FOR_CONTAINER"
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | String | 当前内拖车作业状态,常见值:WAITING_FOR_PALLET 等待拉托盘、WAITING_FOR_CONTAINER 等待正面吊放箱、WAITING_FOR_SHIPMENT 等待装船、PENDING 作业中、DONE 已完成 |
更新内拖车作业状态
- 接口路径:
/internalTrailer/updateWorkStatus - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| terminalName | query | String | 是 | 内拖车名称/车号 |
| workStatus | query | String | 是 | 新的作业状态,取值见上一接口说明 |
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示状态更新成功 |
结束作业
- 接口路径:
/internalTrailer/endAssignment - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 托盘池ID |
| headOrientation | query | String | 否 | 车头朝向枚举(可选值:BOW-船头、STERN-船尾) |
- 备注:
- 前置条件:托盘必须存在于托盘池中,否则接口会直接报错:
托盘不存在,无法结束作业。 - 接口会根据
palletTypeId查询托盘池信息,批量更新作业相关记录为完成状态,并将托盘池记录workStatus更新为DONE。 - 如果托盘已绑定内拖车,内拖车在线会话
workStatus会被更新为WAITING_FOR_PALLET。 - 通知所有终端刷新船图数据和托盘列表。
- 前置条件:托盘必须存在于托盘池中,否则接口会直接报错:
- 响应示例:
{
"code": 0,
"message": "请求成功",
"data": null
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data | null | 无业务返回值,表示结束作业成功 |
查询内拖车当前目的地
- 接口路径:
/internalTrailer/getDestination - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| terminalName | query | String | 是 | 内拖车名称/车号 |
接口说明:根据内拖车的作业状态,结合Redis缓存和数据库数据,判断内拖车当前需要去往的目的地。响应中包含当前作业航次信息,便于终端展示完整的作业上下文。新增语音提示字段
voicePrompt,用于终端语音播报。响应示例(等待拉托盘):
{
"code": 0,
"message": "请求成功",
"data": {
"workStatus": "WAITING_FOR_PALLET",
"description": "等待拉托盘",
"voicePrompt": "等待拉托盘",
"terminalName": "IT-001",
"voyageInfo": {
"id": "V2026050801",
"vesselCode": "NGP",
"vesselName": "新金桥7",
"line": "威海-韩国",
"serviceName": "中韩航线",
"bVyg": "2026001E",
"lbVyg": "2026001I",
"eta": "2026-05-08 08:00:00",
"etd": "2026-05-08 18:00:00",
"ata": "2026-05-08 08:15:00",
"goal": "韩国仁川",
"ieType": "E",
"phase": "YDG",
"workRoRo": "1",
"startWork": "2026-05-08 09:10:00",
"etStartWork": "2026-05-08 09:00:00",
"etEndWork": "2026-05-08 17:00:00"
}
}
}- 响应示例(等待正面吊放箱,被正面吊呼叫):
{
"code": 0,
"message": "请求成功",
"data": {
"workStatus": "WAITING_FOR_CONTAINER",
"description": "请前往RS-01号正面吊前作业",
"voicePrompt": "请前往RS-01号正面吊前作业",
"terminalName": "IT-001",
"reachStackerName": "RS-01",
"palletInfo": {
"palletTypeId": "PALLET-001",
"palletType": "20GP标准托盘",
"palletWorkType": "SUITCASE",
"workStatus": "PENDING",
"voyageId": "V2026050801",
"bindInternalTrailerFlag": "Y",
"bindInternalTrailerNo": "IT-001",
"bindForkliftNo": "FORKLIFT-001",
"bindReachStackerNo": "RS-01",
"bindContainerInfoFlag": "N",
"bindContainerInfoList": [],
"pinnedFlag": "N",
"pinnedTime": null,
"recordTime": "2026-05-08T10:30:00+08:00",
"sequence": 1
},
"voyageInfo": {
"id": "V2026050801",
"vesselCode": "NGP",
"vesselName": "新金桥7",
"line": "威海-韩国",
"serviceName": "中韩航线",
"bVyg": "2026001E",
"lbVyg": "2026001I",
"eta": "2026-05-08 08:00:00",
"etd": "2026-05-08 18:00:00",
"ata": "2026-05-08 08:15:00",
"goal": "韩国仁川",
"ieType": "E",
"phase": "YDG",
"workRoRo": "1",
"startWork": "2026-05-08 09:10:00",
"etStartWork": "2026-05-08 09:00:00",
"etEndWork": "2026-05-08 17:00:00"
}
}
}- 响应示例(前往船舱装船):
{
"code": 0,
"message": "请求成功",
"data": {
"workStatus": "WAITING_FOR_SHIPMENT",
"description": "/MSCU1234567 20GP /MSCU1234568 20GP 1甲一号车道",
"terminalName": "IT-001",
"deck": "1甲",
"voyageInfo": {
"id": "V2026050801",
"vesselCode": "NGP",
"vesselName": "新金桥7",
"line": "威海-韩国",
"serviceName": "中韩航线",
"bVyg": "2026001E",
"lbVyg": "2026001I",
"eta": "2026-05-08 08:00:00",
"etd": "2026-05-08 18:00:00",
"ata": "2026-05-08 08:15:00",
"goal": "韩国仁川",
"ieType": "E",
"phase": "YDG",
"workRoRo": "1",
"startWork": "2026-05-08 09:10:00",
"etStartWork": "2026-05-08 09:00:00",
"etEndWork": "2026-05-08 17:00:00"
}
}
}- 响应示例(内拖车离线或状态未知):
{
"code": 0,
"message": "请求成功",
"data": {
"workStatus": "UNKNOWN",
"description": "内拖车离线或状态未知",
"terminalName": "IT-001"
}
}- 响应字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| data.workStatus | String | 作业状态,常见值:WAITING_FOR_PALLET 等待拉托盘、WAITING_FOR_CONTAINER 等待正面吊放箱、WAITING_FOR_SHIPMENT 装船作业中、LOADING_ASSIGNED 配载完成待上船、DONE 已完成、NONE 空闲、UNKNOWN 离线或状态未知 |
| data.description | String | 目的地描述,包含具体的作业指引信息;装船作业时格式为 /箱号1 尺寸类型/箱号2 尺寸类型 甲板号甲车道描述 |
| data.voicePrompt | String | 语音提示内容,用于终端语音播报,不同状态对应不同提示语 |
| data.terminalName | String | 内拖车名称/车号 |
| data.voyageInfo | Object | 当前作业航次信息,结构同 agCommon.selectVesselVisitByIdCamel 查询结果,包含完整的船舶航次数据 |
| data.voyageInfo.id | String | 航次记录ID |
| data.voyageInfo.vesselCode | String | 船舶代码 |
| data.voyageInfo.vesselName | String | 船舶名称 |
| data.voyageInfo.line | String | 航线 |
| data.voyageInfo.serviceName | String | 服务名称 |
| data.voyageInfo.bVyg | String | 出口航次号 |
| data.voyageInfo.lbVyg | String | 进口航次号 |
| data.voyageInfo.eta | String | 预计到港时间 |
| data.voyageInfo.etd | String | 预计离港时间 |
| data.voyageInfo.ata | String | 实际到港时间 |
| data.voyageInfo.atd | String | 实际离港时间 |
| data.voyageInfo.goal | String | 目标港 |
| data.voyageInfo.ieType | String | 进出标志(E:出口 I:进口) |
| data.voyageInfo.phase | String | 作业阶段 |
| data.voyageInfo.workRoRo | String | 作业状态(0:未开工 1:开工中 2:已完工) |
| data.voyageInfo.startWork | String | 实际开工时间 |
| data.voyageInfo.endWork | String | 实际完工时间 |
| data.voyageInfo.etStartWork | String | 计划开工时间 |
| data.voyageInfo.etEndWork | String | 计划完工时间 |
| data.reachStackerName | String | 正面吊名称,仅当被正面吊呼叫时返回(workStatus=WAITING_FOR_CONTAINER 且存在呼叫记录) |
| data.palletInfo | Object | 托盘池信息,当内拖车绑定托盘时返回,包含完整的托盘池数据 |
| data.palletInfo.palletTypeId | String | 托盘池记录唯一标识 |
| data.palletInfo.palletType | String | 托盘类型名称(如:20GP标准托盘、40HC标准托盘) |
| data.palletInfo.palletWorkType | String | 托盘作业类型,SHIPMENT 表示直接装船,SUITCASE 表示等待拉箱 |
| data.palletInfo.workStatus | String | 托盘池作业状态,常见值:NONE 待作业、PENDING 作业中、DONE 已完成 |
| data.palletInfo.voyageId | String | 绑定的航次ID |
| data.palletInfo.bindInternalTrailerFlag | String | 是否已绑定内拖车,Y 表示已绑定,N 表示未绑定 |
| data.palletInfo.bindInternalTrailerNo | String | 绑定的内拖车号,未绑定时为空 |
| data.palletInfo.bindForkliftNo | String | 签收该托盘的叉车终端号/编号,未签收时为空 |
| data.palletInfo.bindReachStackerNo | String | 绑定的正面吊名称/账号,未绑定时为空 |
| data.palletInfo.bindContainerInfoFlag | String | 是否已绑定箱信息,Y 表示已绑定,N 表示未绑定 |
| data.palletInfo.bindContainerInfoList | Array | 已绑定的箱信息列表,未绑定时为空数组 |
| data.palletInfo.bindContainerInfoList[].cntrIso | String | 集装箱ISO编号 |
| data.palletInfo.bindContainerInfoList[].cntrType | String | 箱型(如:GP、HC、RF等) |
| data.palletInfo.bindContainerInfoList[].cntrSize | Integer | 箱尺寸(如:20、40、45) |
| data.palletInfo.bindContainerInfoList[].manifestWeight | Integer | 申报重量 |
| data.palletInfo.pinnedFlag | String | 是否置顶,Y 表示已置顶,N 表示未置顶 |
| data.palletInfo.pinnedTime | Date/String | 置顶时间,未置顶时为 null |
| data.palletInfo.recordTime | Date/String | 盘型加入盘型池的时间 |
| data.palletInfo.sequence | Integer | 盘型序号,同一托盘池中从1开始递增 |
| data.deck | Integer | 目标甲板层级,仅当装船作业时返回,数值类型(如 1、3、5) |
手动终止任务(已作废)
- 接口已作废:请使用
/internalTrailer/endAssignment接口替代。 - 接口路径:
/centralControl/manualEndAssignment - Method:
GET - 请求参数:
| 参数名 | 位置 | 类型 | 必填 | 含义 |
|---|---|---|---|---|
| palletTypeId | query | String | 是 | 托盘池ID |
- 备注:
- 该接口已作废,内部会调用
endAssignment方法实现拖车、中控结束配载的逻辑。 - 建议前端直接调用
/internalTrailer/endAssignment接口。
- 该接口已作废,内部会调用
STOMP 消息通信
连接配置
- 连接端点:
ws://{host}:{port}/stomp - 协议: STOMP over WebSocket,使用 SockJS 降级
- 心跳: 客户端发送心跳间隔 10 秒,服务端发送心跳间隔 8 秒
- 连接参数: 连接时需在 header 中携带
terminalType(终端类型)和terminalName(终端名称)
终端类型说明
| 类型 | 值 | 说明 |
|---|---|---|
| 中控 | CONTROL | 中控终端 |
| 叉车 | FORKLIFT | 叉车终端 |
| 正面吊 | REACH_STACKER | 正面吊终端 |
| 有人拖车 | DRIVER | 有人内拖车 |
| 无人拖车 | DRIVERLESS | 无人拖车 |
连接示例代码
import SockJS from 'sockjs-client';
import Stomp from 'stompjs';
// 连接 STOMP
const socket = new SockJS('/stomp');
const stompClient = Stomp.over(socket);
// 配置心跳(可选,默认已配置)
stompClient.heartbeat.incoming = 10000;
stompClient.heartbeat.outgoing = 10000;
// 连接时携带身份信息(仅需 terminalType 和 terminalName)
const headers = {
terminalType: 'DRIVER',
terminalName: 'IT-001'
};
stompClient.connect(headers, function(frame) {
console.log('Connected: ' + frame);
// 订阅消息...
}, function(error) {
console.error('Connection error:', error);
});订阅地址列表及示例
| 订阅地址 | 说明 | 适用终端 | 订阅示例 |
|---|---|---|---|
/topic/all | 广播消息,所有终端都能收到 | 所有终端 | 见下方示例1 |
/topic/terminal.CONTROL | 中控终端消息 | 中控 | 见下方示例2 |
/topic/terminal.FORKLIFT | 叉车终端消息 | 叉车 | 见下方示例3 |
/topic/terminal.REACH_STACKER | 正面吊终端消息 | 正面吊 | 见下方示例4 |
/topic/terminal.DRIVER | 内拖车终端消息 | 有人拖车 | 见下方示例5 |
/topic/terminal.DRIVERLESS | 无人拖车终端消息 | 无人拖车 | 见下方示例6 |
/topic/terminal.name.{terminalName} | 指定终端名称的消息 | 所有终端 | 见下方示例7 |
/topic/user.{username} | 指定用户的消息 | 所有终端 | 见下方示例8 |
/topic/pong | 心跳响应消息 | 所有终端 | 见下方示例9 |
订阅示例1:广播消息
订阅地址: /topic/all
订阅代码:
stompClient.subscribe('/topic/all', function(message) {
const data = JSON.parse(message.body);
console.log('Broadcast message:', data);
});订阅示例2:中控终端消息
订阅地址: /topic/terminal.CONTROL
订阅代码:
stompClient.subscribe('/topic/terminal.CONTROL', function(message) {
const data = JSON.parse(message.body);
console.log('Control terminal message:', data);
});订阅示例3:叉车终端消息
订阅地址: /topic/terminal.FORKLIFT
订阅代码:
stompClient.subscribe('/topic/terminal.FORKLIFT', function(message) {
const data = JSON.parse(message.body);
console.log('Forklift message:', data);
});订阅示例4:正面吊终端消息
订阅地址: /topic/terminal.REACH_STACKER
订阅代码:
stompClient.subscribe('/topic/terminal.REACH_STACKER', function(message) {
const data = JSON.parse(message.body);
console.log('Reach stacker message:', data);
});订阅示例5:内拖车终端消息
订阅地址: /topic/terminal.DRIVER
订阅代码:
stompClient.subscribe('/topic/terminal.DRIVER', function(message) {
const data = JSON.parse(message.body);
console.log('Trailer message:', data);
});订阅示例6:无人拖车终端消息
订阅地址: /topic/terminal.DRIVERLESS
订阅代码:
stompClient.subscribe('/topic/terminal.DRIVERLESS', function(message) {
const data = JSON.parse(message.body);
console.log('Driverless trailer message:', data);
});订阅示例7:指定终端名称的消息
订阅地址: /topic/terminal.name.{terminalName}
订阅代码(以 IT-001 为例):
const terminalName = 'IT-001';
stompClient.subscribe('/topic/terminal.name.' + terminalName, function(message) {
const data = JSON.parse(message.body);
console.log('Terminal ' + terminalName + ' message:', data);
});订阅示例8:指定用户的消息
订阅地址: /topic/user.{username}
订阅代码(以 IT-001 为例):
const username = 'IT-001';
stompClient.subscribe('/topic/user.' + username, function(message) {
const data = JSON.parse(message.body);
console.log('User ' + username + ' message:', data);
});订阅示例9:心跳响应消息
订阅地址: /topic/pong
订阅代码:
stompClient.subscribe('/topic/pong', function(message) {
const data = JSON.parse(message.body);
console.log('Pong received:', data);
});消息格式
所有消息均为 JSON 格式,包含以下通用字段:
| 字段 | 类型 | 含义 |
|---|---|---|
| eventType | String | 事件类型(大写英文,下划线分隔),如 PALLET_POOL_ADD、TRAILER_REQUIRE |
| description | String | 事件描述 |
| data | Object | 事件数据,包含该事件需要的具体业务信息 |
| timestamp | Long | 消息时间戳(毫秒) |
消息类型说明
1. 刷新船图数据消息(SHIP_MAP_REFRESH)
订阅地址: /topic/all
触发场景: 中控手动配载成功或车辆作业完毕,刷新所有叉车和中控端的船图数据
消息示例:
{
"eventType": "SHIP_MAP_REFRESH",
"description": "刷新船图数据",
"data": {
"voyageId": "V2026050801",
"triggerType": "LOADING_COMPLETE"
},
"timestamp": 1715115000000
}data 字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| voyageId | String | 当前作业航次ID |
| triggerType | String | 触发类型:LOADING_COMPLETE/WORK_DONE |
2. 刷新可用拖车列表消息(TRAILER_LIST_REFRESH)
订阅地址: /topic/terminal.REACH_STACKER
触发场景: 叉车绑定内拖车和托盘后,通知正面吊刷新可用拖车列表
消息示例:
{
"eventType": "TRAILER_LIST_REFRESH",
"description": "刷新可用拖车列表",
"data": {
"internalTrailerNo": "IT-001",
"terminalType": "DRIVER",
"palletTypeId": "2f50d4c1-8792-4b71-a1a3-7344327b6b7e",
"palletType": "20GP标准托盘"
},
"timestamp": 1715115000000
}data 字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| internalTrailerNo | String | 内拖车号 |
| terminalType | String | 拖车类型:DRIVER/DRIVERLESS |
| palletTypeId | String | 绑定的托盘池记录 ID |
| palletType | String | 绑定的托盘类型名称 |
3. 刷新箱列表消息(CONTAINER_LIST_REFRESH)
订阅地址: /topic/all(广播)、/topic/terminal.CONTROL(中控)
触发场景:
- 正面吊新增箱信息
- 正面吊修改箱信息
- 预配舱单同步处理成功
消息示例:
{
"eventType": "CONTAINER_LIST_REFRESH",
"description": "刷新箱列表",
"data": {
"containerNo": "MSCU1234567"
},
"timestamp": 1715115000000
}data 字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| containerNo | String | 新增或修改的箱号(可选,预配舱单同步时可能为空) |
4. 刷新托盘池列表消息(PALLET_LIST_REFRESH)
订阅地址: /topic/all(广播)
触发场景:
- 叉车绑定/解绑内拖车和托盘
- 取消放箱操作
消息示例:
{
"eventType": "PALLET_LIST_REFRESH",
"description": "刷新托盘池列表",
"data": {},
"timestamp": 1715115000000
}data 字段说明: 无额外数据字段
5. 待配载列表刷新消息(PENDING_LOADING_LIST_REFRESH)
订阅地址: /topic/all(广播)
触发场景: 正面吊完成放箱(绑定箱和托盘)后,通知所有终端刷新待配载列表
消息示例:
{
"eventType": "PENDING_LOADING_LIST_REFRESH",
"description": "刷新待配载列表",
"data": {},
"timestamp": 1715115000000
}data 字段说明: 无额外数据字段
6. 场内托盘列表刷新消息(YARD_PALLET_REFRESH)
订阅地址: /topic/all(广播)
触发场景: 正面吊完成放箱或取消放箱操作后,通知所有终端刷新场内托盘列表
消息示例:
{
"eventType": "YARD_PALLET_REFRESH",
"description": "刷新场内托盘列表",
"data": {},
"timestamp": 1715115000000
}data 字段说明: 无额外数据字段
7. 内拖车消息通知(TRAILER_MESSAGE_NOTIFY)
订阅地址: /topic/terminal.name.{terminalName}
触发场景: 向内拖车终端发送通用消息通知
消息示例:
{
"eventType": "TRAILER_MESSAGE_NOTIFY",
"description": "内拖车消息通知",
"data": {},
"timestamp": 1715115000000
}data 字段说明: 无额外数据字段,消息内容通过 description 字段传递
7. 叉车消息通知(FORKLIFT_MESSAGE_NOTIFY)
订阅地址: /topic/terminal.FORKLIFT
触发场景: 向叉车终端发送通用消息通知
消息示例:
{
"eventType": "FORKLIFT_MESSAGE_NOTIFY",
"description": "叉车消息通知",
"data": {},
"timestamp": 1715115000000
}data 字段说明: 无额外数据字段,消息内容通过 description 字段传递
前端发送消息示例
发送心跳
// 发送 PING 心跳
stompClient.send('/app/ping', {
terminalType: 'DRIVER',
terminalName: 'IT-001'
}, JSON.stringify({ type: 'PING' }));发送其他消息
// 向服务端发送消息(需以 /app 开头)
stompClient.send('/app/message', {}, JSON.stringify({
terminalType: 'DRIVER',
action: 'STATUS_UPDATE',
workStatus: 'PENDING'
}));心跳检测机制
前端需要定期发送心跳消息给服务端,服务端返回 PONG 响应,并更新终端的活跃时间到 Redis。
发送心跳(前端 → 服务端):
// 发送 PING 心跳
stompClient.send('/app/ping', {
terminalType: 'DRIVER',
terminalName: 'IT-001'
}, JSON.stringify({ type: 'PING' }));接收响应(服务端 → 前端):
订阅地址:/topic/pong
响应格式:
{
"type": "PONG",
"timestamp": "2026-05-19T10:30:00",
"sessionId": "session-uuid-123",
"terminalType": "DRIVER",
"terminalName": "IT-001"
}会话管理说明
系统会将会话信息维护到 Redis 中,不依赖内存中的会话维持在线状态:
| Redis Key 前缀 | 说明 |
|---|---|
terminal:session:{sessionId} | 终端会话详情(JSON 格式) |
terminal:type:{terminalType} | 按终端类型分组的会话 ID 集合 |
terminal:name:{terminalName} | 终端名称到会话 ID 的映射 |
terminal:DRIVER:{terminalName} | 拖车终端专用映射 |
terminal:DRIVER_type:{terminalName} | 拖车类型标识(DRIVER/DRIVERLESS) |
terminal:all | 所有在线终端会话 ID 集合 |
会话数据结构:
{
"sessionId": "session-uuid-123",
"username": "IT-001",
"terminalType": "DRIVER",
"terminalName": "IT-001",
"workStatus": "WAITING_FOR_PALLET",
"connectTime": "2026-05-19T10:00:00",
"lastActiveTime": "2026-05-19T10:30:00"
}终端类型说明:
| 类型 | 值 | 说明 |
|---|---|---|
| 中控 | CONTROL | 中控终端 |
| 叉车 | FORKLIFT | 叉车终端 |
| 正面吊 | REACH_STACKER | 正面吊终端 |
| 有人拖车 | DRIVER | 有人内拖车 |
| 无人拖车 | DRIVERLESS | 无人拖车 |
无人拖车队列消息
队列配置
无人拖车系统会将状态信息推送到 RabbitMQ 队列中,系统监听该队列并同步会话状态到 Redis。
| 配置项 | 值 |
|---|---|
| Exchange | unmanned_trailer_exchange |
| Queue | unmanned_trailer_status_queue |
| Routing Key | unmanned.trailer.status.key |
消息格式
无人拖车系统推送的消息为 JSON 格式:
| 字段 | 类型 | 必填 | 含义 |
|---|---|---|---|
| terminalName | String | 是 | 无人拖车名称/车号 |
| username | String | 是 | 无人拖车系统用户名 |
| workStatus | String | 是 | 当前作业状态 |
消息示例:
{
"terminalName": "UT-001",
"username": "unmanned_system",
"workStatus": "WAITING_FOR_PALLET"
}状态值说明
| 状态值 | 含义 |
|---|---|
WAITING_FOR_PALLET | 等待拉托盘 |
WAITING_FOR_CONTAINER | 等待正面吊放箱 |
WAITING_FOR_SHIPMENT | 等待装船 |
PENDING | 作业中 |
DONE | 已完成 |
无人拖车会话标识
无人拖车的会话 ID 以 unmanned: 前缀开头,用于与有人拖车区分。
- 有人拖车会话 ID 示例:
session-uuid-123 - 无人拖车会话 ID 示例:
unmanned:UT-001
消息发送(后端 → 前端)
无人拖车的消息同样通过 STOMP 协议发送到前端,订阅地址与有人拖车一致:
| 订阅地址 | 说明 |
|---|---|
/topic/terminal/DRIVER | 所有内拖车(包含有人和无人) |
/topic/terminal/name/{terminalName} | 指定终端名称的消息 |