184 lines
7.6 KiB
YAML
184 lines
7.6 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: 车次直接运营成本
|
|
version: 1.0.0
|
|
description: 运营登记与分摊,不生成客户账单、财务应付或付款事实。不同币种分别汇总;仅从不可变DEPART实物装载和BOUND外接实收形成权重。DRAFT/CANCELLED预订不参与,其他未完成关联的有效预订阻止自动分摊,不得归为自有货。
|
|
security:
|
|
- bearerAuth: []
|
|
paths:
|
|
/api/platform/v1/last-leg/fleet/trips/{tripNo}/costs:
|
|
parameters:
|
|
- $ref: '#/components/parameters/TripNo'
|
|
get:
|
|
description: platform:fleet:trip:list;分页记录和整趟汇总使用同一只读快照。没有登记成本时totals为空,不显示为已知零成本。
|
|
parameters:
|
|
- $ref: '#/components/parameters/Page'
|
|
- $ref: '#/components/parameters/Size'
|
|
responses:
|
|
'200':
|
|
description: 业务响应,成功code为200
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/components/schemas/Envelope'
|
|
- type: object
|
|
properties:
|
|
data: { $ref: '#/components/schemas/Listing' }
|
|
post:
|
|
description: platform:fleet:trip:cost-create;按车次和操作人锁定创建幂等键,异载荷同键拒绝。金额末尾零与空白备注按同一内容核对;成本与当时汇总历史同事务保存。
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [idempotencyKey, details]
|
|
properties:
|
|
idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
|
|
details: { $ref: '#/components/schemas/Draft' }
|
|
responses:
|
|
'200': { $ref: '#/components/responses/Cost' }
|
|
/api/platform/v1/last-leg/fleet/trips/{tripNo}/costs/{costNo}:
|
|
parameters:
|
|
- $ref: '#/components/parameters/TripNo'
|
|
- $ref: '#/components/parameters/CostNo'
|
|
put:
|
|
description: platform:fleet:trip:cost-edit;核对成本版本与车次归属,更正保留旧记录及当时分摊快照。原因选填,缺省使用标准动作说明。内容未变化返回原版本,不追加历史;旧版本即使内容相同仍拒绝。
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [recordVersion, details]
|
|
properties:
|
|
recordVersion: { type: integer, format: int64, minimum: 0 }
|
|
details: { $ref: '#/components/schemas/Draft' }
|
|
reason: { type: string, maxLength: 1000 }
|
|
responses:
|
|
'200': { $ref: '#/components/responses/Cost' }
|
|
/api/platform/v1/last-leg/fleet/trips/{tripNo}/costs/{costNo}/history:
|
|
parameters:
|
|
- $ref: '#/components/parameters/TripNo'
|
|
- $ref: '#/components/parameters/CostNo'
|
|
get:
|
|
description: platform:fleet:trip:list;只返回指定车次成本的不可变更正历史,金额为当时原始币种。
|
|
parameters:
|
|
- $ref: '#/components/parameters/Page'
|
|
- $ref: '#/components/parameters/Size'
|
|
responses:
|
|
'200':
|
|
description: 历史分页,data包含records/page/size/total/pages
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/components/schemas/Envelope'
|
|
- type: object
|
|
properties:
|
|
data:
|
|
allOf:
|
|
- $ref: '#/components/schemas/Page'
|
|
- type: object
|
|
properties:
|
|
records: { type: array, items: { $ref: '#/components/schemas/History' } }
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth: { type: http, scheme: bearer, bearerFormat: JWT }
|
|
parameters:
|
|
TripNo: { name: tripNo, in: path, required: true, schema: { type: string } }
|
|
CostNo: { name: costNo, in: path, required: true, schema: { type: string } }
|
|
Page: { name: page, in: query, schema: { type: integer, minimum: 1, default: 1 } }
|
|
Size: { name: size, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 10 } }
|
|
responses:
|
|
Cost:
|
|
description: 业务响应;A0404归属不存在,A0409版本或幂等冲突,A0422输入校验,实际发生时间不可为将来
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/components/schemas/Envelope'
|
|
- type: object
|
|
properties:
|
|
data: { $ref: '#/components/schemas/Cost' }
|
|
schemas:
|
|
Envelope:
|
|
type: object
|
|
properties:
|
|
code: { type: string }
|
|
message: { type: string }
|
|
requestId: { type: string }
|
|
traceId: { type: string }
|
|
Page:
|
|
type: object
|
|
properties:
|
|
page: { type: integer, format: int64 }
|
|
size: { type: integer, format: int64 }
|
|
total: { type: integer, format: int64 }
|
|
pages: { type: integer, format: int64 }
|
|
Draft:
|
|
type: object
|
|
required: [category, currency, amount, incurredAt]
|
|
properties:
|
|
category: { type: string, enum: [FUEL, DRIVER, TOLL, PARKING, OTHER] }
|
|
currency: { type: string, enum: [CNY, USD] }
|
|
amount: { type: number, minimum: 0, maximum: 999999999999.99, multipleOf: 0.01 }
|
|
incurredAt: { type: string, format: date-time, description: 实际发生时间,统一按毫秒精度保存和核对 }
|
|
remark: { type: string, nullable: true, maxLength: 1000 }
|
|
Cost:
|
|
type: object
|
|
properties:
|
|
costNo: { type: string }
|
|
tripNo: { type: string }
|
|
details: { $ref: '#/components/schemas/Draft' }
|
|
recordVersion: { type: integer, format: int64 }
|
|
updatedAt: { type: string, format: date-time }
|
|
Allocation:
|
|
type: object
|
|
properties:
|
|
businessNo: { type: string, description: 自有货排车单号或外接预订业务号 }
|
|
sourceType: { type: string, enum: [OWN, EXTERNAL] }
|
|
dispatchNo: { type: string }
|
|
palletSpaces: { type: integer, format: int64 }
|
|
amount: { type: number }
|
|
Total:
|
|
type: object
|
|
properties:
|
|
currency: { type: string }
|
|
directCost: { type: number }
|
|
allocations: { type: array, items: { $ref: '#/components/schemas/Allocation' } }
|
|
ownCost: { type: number, nullable: true }
|
|
externalCost: { type: number, nullable: true }
|
|
Summary:
|
|
type: object
|
|
properties:
|
|
departureVersion: { type: integer, format: int64, nullable: true }
|
|
manifestHash: { type: string, nullable: true }
|
|
allocationMethod: { type: string, nullable: true, enum: [SAME_ROUTE_PALLET_SPACES] }
|
|
allocationBlockReason: { type: string, nullable: true }
|
|
totals: { type: array, items: { $ref: '#/components/schemas/Total' } }
|
|
Listing:
|
|
type: object
|
|
properties:
|
|
page:
|
|
allOf:
|
|
- $ref: '#/components/schemas/Page'
|
|
- type: object
|
|
properties:
|
|
records: { type: array, items: { $ref: '#/components/schemas/Cost' } }
|
|
summary: { $ref: '#/components/schemas/Summary' }
|
|
Snapshot:
|
|
type: object
|
|
properties:
|
|
cost: { $ref: '#/components/schemas/Cost' }
|
|
summary: { $ref: '#/components/schemas/Summary' }
|
|
History:
|
|
type: object
|
|
properties:
|
|
recordVersion: { type: integer, format: int64 }
|
|
action: { type: string, enum: [CREATE, UPDATE] }
|
|
reason: { type: string }
|
|
occurredAt: { type: string, format: date-time }
|
|
snapshot: { $ref: '#/components/schemas/Snapshot' }
|