This commit is contained in:
2026-09-09 10:18:07 +08:00
parent d3d1ba88db
commit a18775b261
6 changed files with 2530 additions and 5619 deletions
@@ -28,7 +28,7 @@
| CT-D07 | 装柜清单进行中/已完成 | CT-D04 | 装载明细、数量、状态与预装来源一致 | 装柜清单列表/详情可点击 | 待契约 |
| CT-D08 | PDA 领取、拣货、复核、异常摘要 | CT-D04 | overview 分别返回 `taskStatus`、`workflowStatus`、任务 ID、版本、计数、`photoCounts`、`photos`、`downloadPath` 和异常原因;逐照片代理下载成功 | PDA 可完成主流程;Admin 入口待回传 | 服务端已冻结;人工入口待定 |
| CT-D09 | 报关/清关资料及有效回执 | CT-D06 | 目的港清关走货柜 `/clearance`;出口报关走 loading-list `/customs`;分别验证上传、完成和完成后替换锁定 | 报关协同入口待回传 | 服务端已冻结;人工入口待定 |
| CT-D10 | DO/PU 未齐、部分完成、全部完成 | 柜次与运输协同已建立 | `DELIVERY_ORDER`、`PICKUP_ORDER` 可独立查询、上传和鉴权下载,版本与幂等有效 | 柜次详情入口待回传 | 服务端已冻结;人工入口待定 |
| CT-D10 | DO 附件与 PU 码未填、部分完成、全部完成 | 柜次与运输协同已建立 | `DELIVERY_ORDER` 可独立查询、上传和鉴权下载;PU 资料通过 `/pickup-code` 保存 1–64 位数字字符串并保留前导零,均使用版本校验 | 货柜详情在“报关清关信息”一级区块内直接展示 DO 附件与 PU 码输入 | 已按最新确认收敛;待人工截图确认 |
| CT-D11 | 正常、异常、取消异常 | 任意有效柜次及显式货柜版本 | 标记/取消使用版本和必填原因;overview 保留 `MARK`/`CANCEL` 全部历史 | 货柜详情入口待回传 | 服务端已冻结;人工入口待定 |
| CT-D12 | 多节点运输轨迹与操作日志 | CT-D10 | overview 时间线含运输更新、异常和 PDA 事件,按发生时间升序 | 详情时间线入口待回传 | 服务端聚合已冻结;人工入口待定 |
| CT-D13 | PDA 确认装柜并推进 `LOADED` | inbound `LOADING`、bridge、订舱 `RELEASED`、PDA 全拣和五类 ACTIVE 证据齐备;拖车允许缺失、未完成或存在多条 | PDA `complete` 的主事务不以拖车数量/状态为阻断;提交后才在独立事务 best-effort 同步唯一同柜有效拖车。零条直接跳过,一条可推进 `COMPLETED`,多条或拖车并发只隔离记录同步失败,task/plan/inbound 仍保持 `LOADED` | 订单/柜次详情显示完成且编辑锁定;拖车同步失败单独呈现 | `LANDED_STATIC`:OpenAPI、Service、提交后同步隔离与结算版本回归已冻结;待部署后 HTTP 复核 |
@@ -131,16 +131,16 @@
| `container-overview` | `GET /api/platform/v1/containers/{id}/overview`;聚合 container、loadingPlanId、PDA 摘要、documents、exception/history、timeline | `platform:firstleg:container:list`;旧 `container:view` 已移除 | 已冻结 |
| `pda-progress-exception-summary` | PDA `taskStatus/workflowStatus`、任务 ID/版本、明细计数、`photoCounts`、`photos`(含 fileId/status/downloadPath)及异常原因;照片下载为 `GET /api/platform/v1/containers/{id}/pda/photos/{fileId}/download` | 随 overview 查看权限;下载复核柜次、计划、入库单与文件归属 | 已冻结 |
| `container-abnormal-history` | `POST/DELETE /api/platform/v1/containers/{id}/exception`;请求使用 overview 返回的 container.version、必填原因和幂等键 | `platform:firstleg:container:edit`;版本冲突 fail-closed | 已冻结 |
| `container-documents` | 通用查询、multipart 上传和受控文件下载仅支持 DO/PU;下载透传已校验 Content-Type,非法类型回退 `application/octet-stream`,并返回 UTF-8 文件名、`no-store` 和内容长度 | 查询/下载用 `platform:firstleg:container:list`,上传用 `platform:firstleg:container:edit`;旧 `container:view` 已移除;下载校验柜次、类型、文件 ID 及文件服务 tenant/business 归属 | 已冻结 |
| `do-pu` | `DELIVERY_ORDER`、`PICKUP_ORDER` 通用查询/上传/下载 | 同 `container-documents` | 已冻结 |
| `container-documents` | 通用查询、multipart 上传和受控文件下载仅支持 DO;下载透传已校验 Content-Type,非法类型回退 `application/octet-stream`,并返回 UTF-8 文件名、`no-store` 和内容长度 | 查询/下载用 `platform:firstleg:container:list`,上传用 `platform:firstleg:container:edit`;旧 `container:view` 已移除;下载校验柜次、类型、文件 ID 及文件服务 tenant/business 归属 | 已冻结 |
| `do-pu` | `DELIVERY_ORDER` 使用通用附件查询/上传/下载;PU 资料使用 `PUT /api/platform/v1/containers/{id}/pickup-code` 保存数字码 | `platform:firstleg:container:edit`;两者均使用服务端版本校验 | 已冻结 |
| `transport-trajectory-log` | overview timeline 的事件类型、详情、操作者、发生时间;服务端升序 | 随 overview 查看权限 | 已冻结 |
### 最终安全分流
1. overview 与通用 documents 只覆盖 `DELIVERY_ORDER`、`PICKUP_ORDER`,不得向通用路径传清关或报关类型。
1. overview 的 documents 与通用文件接口只覆盖 `DELIVERY_ORDER`;PU 数字码位于 overview.container,不得向通用文件路径传 PU、清关或报关类型。
2. 目的港清关使用 `/api/platform/v1/containers/{id}/clearance` 及其专用上传、完成动作,权限为 `platform:firstleg:customs:manage`。
3. 出口报关使用 `/api/platform/v1/first-leg/loading-lists/{planId}/customs` 及其专用上传、完成动作;查询使用 `platform:firstleg:loading-list:list`,旧 `loading-list:view` 已移除,写入使用 `platform:firstleg:customs:manage`。
4. 清关和出口报关分别验证完成态禁止替换,不能用 DO/PU 通用上传替代。
4. 清关和出口报关分别验证完成态禁止替换,不能用 DO 通用上传或 PU 码入口替代。
5. 下载允许透传经校验的 Content-Type,非法值回退二进制类型;同时必须保留 UTF-8 文件名、`no-store`、内容长度及资源归属复核。
## 自动化落地门禁
File diff suppressed because one or more lines are too long
+2 -1
View File
@@ -8571,7 +8571,7 @@ function saveLastMileInboundPlan(){
const now=lmoNow();
order.pallets=pallets;order.isConsolidated=isConsolidated;order.inboundPlan={warehouse,eta,inboundCode,pallets,palletType,isOutsourced,isUrgent,remark,createdAt:order.inboundPlan&&order.inboundPlan.createdAt||now};
let linked=order.inboundNo&&fbaInboundOrderData.find(item=>item.inboundNo===order.inboundNo);
if(!linked){if(!order.inboundNo)order.inboundNo='FBI'+now.slice(0,10).replace(/-/g,'')+String(fbaInboundOrderData.length+1).padStart(3,'0');fbaInboundOrderData.unshift({inboundNo:order.inboundNo,bolNo:order.firstLegNo,type:'海外订单',wh:warehouse,owner:order.owner,totalBoxes:order.boxes,chargeVol:order.volume,palletTotal:order.pallets,palletType,isOutsourced,isUrgent,status:'待审核',warehouseCode:inboundCode,eta,containerNo:order.containerNo,createdDate:now.slice(0,10)});}else{Object.assign(linked,{wh:warehouse,warehouseCode:inboundCode,eta,totalBoxes:order.boxes,chargeVol:order.volume,palletTotal:order.pallets,palletType,isOutsourced,isUrgent});}
if(!linked){if(!order.inboundNo)order.inboundNo='FBI'+now.slice(0,10).replace(/-/g,'')+String(fbaInboundOrderData.length+1).padStart(3,'0');fbaInboundOrderData.unshift({inboundNo:order.inboundNo,bolNo:order.firstLegNo,type:'海外订单',wh:warehouse,owner:order.owner,totalBoxes:order.boxes,chargeVol:order.volume,palletTotal:order.pallets,palletType,isOutsourced,isConsolidated,isUrgent,status:'待审核',warehouseCode:inboundCode,eta,containerNo:order.containerNo,createdDate:now.slice(0,10)});}else{Object.assign(linked,{wh:warehouse,warehouseCode:inboundCode,eta,totalBoxes:order.boxes,chargeVol:order.volume,palletTotal:order.pallets,palletType,isOutsourced,isConsolidated,isUrgent});}
order.logs.push({time:now,node:'入库计划',operator:'张经理',result:'已保存并关联入库单 '+order.inboundNo});hideModal('modal-lmo-inbound-plan');refreshLastMileViews(order);showToast('入库计划已保存,已生成入库单 '+order.inboundNo,'success');
}
function getSelectedLastMileOrders(){return [...selectedLastMileOrderNos].map(no=>lastMileOrderData.find(order=>order.no===no)).filter(Boolean);}
@@ -8665,6 +8665,7 @@ function renderFbaInboundOrder(list){
<td style="padding:9px 10px;text-align:right">${d.palletTotal}</td>
<td style="padding:9px 10px;white-space:nowrap">${lmoEsc(getInboundPalletType(d))}</td>
<td style="padding:9px 10px;text-align:center"><span class="tag ${isInboundOutsourced(d)?'tag-blue':'tag-gray'}">${formatInboundOutsourced(d)}</span></td>
<td style="padding:9px 10px;text-align:center"><span class="tag ${d.isConsolidated?'tag-blue':'tag-gray'}">${d.isConsolidated?'可合托':'不合托'}</span></td>
<td style="padding:9px 10px;text-align:center"><span class="tag ${isInboundUrgent(d)?'tag-red':'tag-gray'}">${formatInboundUrgent(d)}</span></td>
<td style="padding:9px 10px;text-align:center"><span class="tag ${d.status==='已入库'?'tag-green':d.status==='已审核'?'tag-blue':'tag-orange'}">${d.status}</span></td>
<td style="padding:9px 10px;text-align:center"><span class="tag ${d.appointmentStatus==='预约成功'?'tag-green':d.appointmentStatus==='预约中'?'tag-blue':'tag-gray'}">${lmoEsc(d.appointmentStatus||'未预约')}</span></td>
@@ -533,7 +533,8 @@
<th style="padding:9px 10px;text-align:right;white-space:nowrap">计费体积(m³)</th>
<th style="padding:9px 10px;text-align:right;white-space:nowrap">总托盘数</th>
<th style="padding:9px 10px;text-align:left;white-space:nowrap">托盘类型</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">是否外配</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">分配</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">合托</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">是否加急</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">状态</th>
<th style="padding:9px 10px;text-align:center;white-space:nowrap">FBA预约</th>
@@ -940,7 +941,7 @@ FORM: 采用现有后台的列表加标准详情结构,保持高信息密度
<div class="modal-overlay" id="modal-lmo-manual-nodes" role="dialog" aria-modal="true" aria-labelledby="lmo-manual-nodes-title"><div class="modal" style="max-width:700px"><div class="modal-header"><span id="lmo-manual-nodes-title">人工修改节点</span><button type="button" aria-label="关闭" onclick="hideModal('modal-lmo-manual-nodes')" style="display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;font-size:22px;cursor:pointer">&times;</button></div><div class="modal-body"><div class="lmo-manual-node-order"><span>尾程单号</span><strong id="lmo-manual-nodes-order">—</strong></div><div class="lmo-manual-node-wrap"><table class="lmo-manual-node-table"><thead><tr><th style="width:42%">节点</th><th>节点时间</th></tr></thead><tbody id="tbody-lmo-manual-nodes"></tbody></table></div></div><div class="modal-footer"><button type="button" class="btn btn-default" onclick="hideModal('modal-lmo-manual-nodes')">取消</button><button type="button" class="btn btn-primary" onclick="saveLastMileManualNodes()">保存</button></div></div></div>
<!-- 尾程订单 - 入库计划 -->
<div class="modal-overlay" id="modal-lmo-inbound-plan"><div class="modal" style="max-width:720px"><div class="modal-header"><span>入库计划</span><span onclick="hideModal('modal-lmo-inbound-plan')" style="cursor:pointer;font-size:20px">&times;</span></div><div class="modal-body"><div class="lmo-modal-note">保存后生成入库单;清关完成后入库计划不可更改。</div><div class="form-row"><div class="form-group"><label>计划入库仓 *</label><select id="lmo-inbound-warehouse"><option>洛杉矶长滩海外仓</option><option>纽约海外仓</option><option>汉堡海外仓</option></select></div><div class="form-group"><label>预计到仓日期 *</label><input id="lmo-inbound-eta" type="date"/></div></div><div class="form-row"><div class="form-group"><label>入仓码 *</label><input id="lmo-inbound-code" placeholder="请输入入仓码"/></div><div class="form-group"><label>托数 *</label><input id="lmo-inbound-pallets" type="number" min="1" step="1" placeholder="请输入托数"/></div></div><div class="form-row"><div class="form-group"><label for="lmo-inbound-pallet-type">托盘类型</label><select id="lmo-inbound-pallet-type"><option value="标准托盘" selected>标准托盘</option><option value="木托盘">木托盘</option><option value="纸托盘">纸托盘</option></select></div><div class="form-group"><label for="lmo-inbound-outsourced">是否外配</label><label class="lmo-checkbox-option"><input id="lmo-inbound-outsourced" type="checkbox"/> 是</label></div></div><div class="form-row"><div class="form-group"><label for="lmo-inbound-consolidated">是否合托</label><label class="lmo-checkbox-option"><input id="lmo-inbound-consolidated" type="checkbox"/> 是</label></div><div class="form-group"><label for="lmo-inbound-urgent">是否加急</label><label class="lmo-checkbox-option"><input id="lmo-inbound-urgent" type="checkbox"/> 是</label></div></div><div class="form-row single"><div class="form-group"><label>备注</label><textarea id="lmo-inbound-remark" rows="3" placeholder="请输入备注"></textarea></div></div></div><div class="modal-footer"><button class="btn btn-default" onclick="hideModal('modal-lmo-inbound-plan')">取消</button><button class="btn btn-primary" onclick="saveLastMileInboundPlan()">保存并生成入库单</button></div></div></div>
<div class="modal-overlay" id="modal-lmo-inbound-plan"><div class="modal" style="max-width:720px"><div class="modal-header"><span>入库计划</span><span onclick="hideModal('modal-lmo-inbound-plan')" style="cursor:pointer;font-size:20px">&times;</span></div><div class="modal-body"><div class="lmo-modal-note">保存后生成入库单;清关完成后入库计划不可更改。</div><div class="form-row"><div class="form-group"><label>计划入库仓 *</label><select id="lmo-inbound-warehouse"><option>洛杉矶长滩海外仓</option><option>纽约海外仓</option><option>汉堡海外仓</option></select></div><div class="form-group"><label>预计到仓日期 *</label><input id="lmo-inbound-eta" type="date"/></div></div><div class="form-row"><div class="form-group"><label>入仓码 *</label><input id="lmo-inbound-code" placeholder="请输入入仓码"/></div><div class="form-group"><label>托数 *</label><input id="lmo-inbound-pallets" type="number" min="1" step="1" placeholder="请输入托数"/></div></div><div class="form-row"><div class="form-group"><label for="lmo-inbound-pallet-type">托盘类型</label><select id="lmo-inbound-pallet-type"><option value="标准托盘" selected>标准托盘</option><option value="木托盘">木托盘</option><option value="纸托盘">纸托盘</option></select></div><div class="form-group"><label for="lmo-inbound-outsourced">是否分配</label><label class="lmo-checkbox-option"><input id="lmo-inbound-outsourced" type="checkbox"/> 是</label></div></div><div class="form-row"><div class="form-group"><label for="lmo-inbound-consolidated">允许合托</label><label class="lmo-checkbox-option"><input id="lmo-inbound-consolidated" type="checkbox"/> 是</label><small>现场可选择合托或独立收货,不强制合托。</small></div><div class="form-group"><label for="lmo-inbound-urgent">是否加急</label><label class="lmo-checkbox-option"><input id="lmo-inbound-urgent" type="checkbox"/> 是</label></div></div><div class="form-row single"><div class="form-group"><label>备注</label><textarea id="lmo-inbound-remark" rows="3" placeholder="请输入备注"></textarea></div></div></div><div class="modal-footer"><button class="btn btn-default" onclick="hideModal('modal-lmo-inbound-plan')">取消</button><button class="btn btn-primary" onclick="saveLastMileInboundPlan()">保存并生成入库单</button></div></div></div>
<!-- 尾程订单 - 合托 -->
<div class="modal-overlay" id="modal-lmo-consolidate"><div class="modal" style="max-width:680px"><div class="modal-header"><span>合托</span><span onclick="hideModal('modal-lmo-consolidate')" style="cursor:pointer;font-size:20px">&times;</span></div><div class="modal-body"><div class="form-row"><div class="form-group"><label>合托批次 *</label><input id="lmo-consolidate-batch" placeholder="如 CT20260810001"/></div><div class="form-group"><label>合托后托数 *</label><input id="lmo-consolidate-pallets" type="number" min="1"/></div></div><div class="form-row single"><div class="form-group"><label>备注</label><textarea id="lmo-consolidate-remark" rows="3" placeholder="请输入合托说明"></textarea></div></div></div><div class="modal-footer"><button class="btn btn-default" onclick="hideModal('modal-lmo-consolidate')">取消</button><button class="btn btn-primary" onclick="saveLastMileConsolidate()">保存</button></div></div></div>
+1 -1
View File
@@ -80,7 +80,7 @@
- 海外库存、库内作业和海外本土业务已有明确服务入口:`gateway-overseas/` 是海外 API 网关,`lastleg-service/` 拥有尾程订单、入仓计划、换标、库存业务、采购和本土卡车;国内 `warehouse-service` 是仓库主数据唯一权威,`warehouse-overseas-service/` 只拥有库位、托盘及资源锁并引用国内 `warehouseId`。不得把海外库存业务塞入国内 `firstleg/` 或 `warehouse/`。
- 国内装柜完成事件只在海外生成 `PENDING_ASSIGNMENT` 尾程订单、冻结快照和 `FIRST_LEG` 在途库存,不自动生成入仓计划。平台通过 `GET /api/platform/v1/last-leg/orders/container-summaries` 按稳定 `sourceContainerBookingId` 服务端聚合全柜订单、入仓码、计划数、未操作数和 `allPlansReady`,在分页前排除全部入仓码均已生成有效独立计划的柜,仅返回仍有入仓码待生成计划的柜;详情 `/{sourceContainerBookingId}` 返回柜内全部订单与计划且不受订单分页截断。`plannedArrivalAt` 只来自装柜完成事件 `estimatedWarehouseArrivalAt` 冻结到 Lastleg `ll_order.estimated_warehouse_at` 的计划到仓事实,不得使用创建时间、预计到港或当前时间替代,并按该时间升序、空值最后排序。确认后调用 `POST /api/platform/v1/last-leg/inbound-plans/convert-container`;服务端一次锁定整柜、每票独立生成一个计划,整批原子且幂等。转换成功才将尾程订单推进为 `INBOUND_PLANNED`,并把库存余额的来源入仓码展示快照替换为各自 `planNo`。
- 尾程订单的 `inboundCode` 只保存并展示真实来源入仓码;换标申请、本土散板等没有入仓关系的海外本土业务保持为空,由页面显示 `—`,不得用换标单号、本土散板单号或内部 ID 冒充入仓码。
- 平台可按单票尾程订单填写完整入库计划(入库仓、预计到仓日期、入仓码、托数、托盘类型、分配/合托/加急和备注),写入时校验订单版本、客户归属、仓库主档和幂等键;暂扣也只作用于该票,暂扣期间该票不得进入排车或出库计划,同柜其他订单不受影响。
- 平台可按单票尾程订单填写完整入库计划(入库仓、预计到仓日期、入仓码、托数、托盘类型、分配/可合托/加急和备注),写入时校验订单版本、客户归属、仓库主档和幂等键;分配、可合托、加急必须随入库单列表和海外 PDA 入仓码作业返回并展示,其中“可合托”只向现场提供选择:合托时扫描同目的仓已使用的托盘码,独立收货时扫描新托盘码,不作为实收或完成门禁。暂扣也只作用于该票,暂扣期间该票不得进入排车或出库计划,同柜其他订单不受影响。
- 尾程订单人工节点固定为国内报关完成、预计/实际开船、预计到港、国外清关完成、实际到港等待卸船、预约提柜和卸柜八行完整快照。第一次保存后该订单永久使用 `MANUAL` 来源,读取和页面展示不得再回退柜级节点,也不得反向修改货柜船节点。
- 目的港码头拖车归 Firstleg 货柜聚合:平台从 Warehouse `ACTIVE + TRUCKING` 供应商中选择车队,依次记录预约提柜、实际提柜和实际还柜;实际提柜/还柜同时复用标准船节点服务写入 `PICKED_UP`/`EMPTY_RETURNED`。海外卸柜完成后由服务端以 `unloadingCompletedAt + 72h` 计算还柜截止时间和超时天/小时,Admin 只展示服务端预警,不在浏览器重复计算。
- 船节点是头程海运在途事实与海外接柜之间的衔接能力,业务聚合继续由 Firstleg 持有;到港/可提柜结果通过明确契约或跨区域事件提供给海外区域,不复制第二套轮询任务。
+92 -1
View File
@@ -1,7 +1,7 @@
openapi: 3.0.3
info:
title: Finance F1 Manual AR API
version: 1.2.0
version: 1.3.0
description: >-
F1 人工账单、收款和成本目标契约。仅 CNY;平台财务可写;客户只读且仅可见
ISSUED、PARTIALLY_PAID、PAID 账单。整柜成本由 Finance 根据 containerId 调用
@@ -239,6 +239,32 @@ paths:
$ref: '#/components/responses/CostResponse'
'409':
$ref: '#/components/responses/IdempotencyConflict'
/platform/finance/v1/container-settlement-details:
get:
summary: 按客户和柜次查询已结算柜费及成本分摊
description: >-
为装柜清单柜费页提供固定请求量聚合。服务端校验柜次在 Finance 快照中的客户归属,
以集合查询一次返回已进入 PAID 正式结算或 FIRSTLEG_DIRECT_PAID 已确认成本的
CONTAINER_FEE 来源 ID,以及该客户在该柜下的全部成本及不可变分摊明细。
不返回整张结算单、其他客户数据或平台凭证。
x-permissions-all-of:
- platform:finance:cost:view
- platform:finance:settlement-ar:list
- platform:finance:settlement-ap:list
x-query-count: 3 fixed set-based SQL statements
x-customer-isolation: customerId 与 containerBookingId 必须在 Finance 费用来源或成本快照中存在真实归属关系。
security:
- platformFinance: []
parameters:
- $ref: '#/components/parameters/RequiredCustomerId'
- $ref: '#/components/parameters/ContainerBookingId'
responses:
'200':
$ref: '#/components/responses/ContainerSettlementDetailsResponse'
'403':
$ref: '#/components/responses/BusinessError'
'404':
$ref: '#/components/responses/BusinessError'
/platform/finance/v1/vouchers:
post:
summary: 上传财务凭证图片
@@ -334,6 +360,13 @@ components:
required: false
schema:
$ref: '#/components/schemas/Id'
ContainerBookingId:
name: containerBookingId
in: query
required: true
description: Firstleg 真实货柜 containerBookingId,不是装柜计划 loadingPlanId。
schema:
$ref: '#/components/schemas/Id'
IdempotencyKey:
name: Idempotency-Key
in: header
@@ -930,6 +963,50 @@ components:
createdAt:
type: string
format: date-time
ContainerSettlementDetails:
type: object
required: [customerId, containerBookingId, settledSourceFeeIds, costs]
properties:
customerId: {$ref: '#/components/schemas/Id'}
containerBookingId: {$ref: '#/components/schemas/Id'}
settledSourceFeeIds:
type: array
uniqueItems: true
items: {$ref: '#/components/schemas/Id'}
costs:
type: array
items: {$ref: '#/components/schemas/ContainerSettlementCost'}
ContainerSettlementCost:
type: object
required: [costId, costNo, costType, costOrigin, containerBookingId, feeItemName, amount, currency, status, allocations]
properties:
costId: {$ref: '#/components/schemas/Id'}
costNo: {type: string}
costType: {type: string, enum: [SINGLE_ORDER, CONTAINER_SHARED, SOURCE_DIRECT_PAID]}
costOrigin: {type: string, enum: [MANUAL, FIRSTLEG_DIRECT_PAID, BUSINESS_DIRECT_PAID]}
sourceFeeId: {$ref: '#/components/schemas/Id'}
sourceFeeVersion: {type: integer, minimum: 1}
containerBookingId: {$ref: '#/components/schemas/Id'}
supplierName: {type: string}
feeItemName: {type: string}
amount: {$ref: '#/components/schemas/Money'}
currency: {type: string, enum: [CNY]}
status: {type: string, enum: [DRAFT, CONFIRMED, VOIDED]}
allocations:
type: array
items: {$ref: '#/components/schemas/ContainerSettlementCostAllocation'}
ContainerSettlementCostAllocation:
type: object
required: [allocationId, orderId, volumeCbm, totalVolumeCbm, allocationRate, allocatedAmount, roundingAdjustment]
properties:
allocationId: {$ref: '#/components/schemas/Id'}
orderId: {$ref: '#/components/schemas/Id'}
inboundId: {$ref: '#/components/schemas/Id'}
volumeCbm: {$ref: '#/components/schemas/Money'}
totalVolumeCbm: {$ref: '#/components/schemas/Money'}
allocationRate: {type: string, pattern: '^(0|1|0\.[0-9]{1,10})$'}
allocatedAmount: {$ref: '#/components/schemas/Money'}
roundingAdjustment: {type: boolean}
CustomerTerms:
type: object
required:
@@ -1122,6 +1199,15 @@ components:
data:
type: array
items: {$ref: '#/components/schemas/Cost'}
ContainerSettlementDetailsEnvelope:
allOf:
- $ref: '#/components/schemas/ResponseMeta'
- type: object
required: [code, message, data]
properties:
code: {type: string, example: '200'}
message: {type: string}
data: {$ref: '#/components/schemas/ContainerSettlementDetails'}
CustomerTermsEnvelope:
allOf:
- $ref: '#/components/schemas/ResponseMeta'
@@ -1191,6 +1277,11 @@ components:
content:
application/json:
schema: {$ref: '#/components/schemas/CostListEnvelope'}
ContainerSettlementDetailsResponse:
description: 柜级已结算来源与成本分摊聚合结果。
content:
application/json:
schema: {$ref: '#/components/schemas/ContainerSettlementDetailsEnvelope'}
CustomerTermsResponse:
description: 客户账期结果。
content: