feat(fleet): integrate costs quotes operations and in-transit handovers

This commit is contained in:
2026-10-03 12:38:04 +08:00
parent 274ecac474
commit cb6c54ffe5
107 changed files with 7304 additions and 42 deletions
@@ -10,10 +10,70 @@ info:
照片最多20张,每张非空JPG/PNG且最多10MiB;File按平台0、FLEET_VEHICLE_RECORD_PHOTO和记录内部主键复合归属,验证内容签名。
维修和救援项目、地点独立保存;处理中或已完成须有处理人,异常须有明确分类。
费用只是运维申报金额,填金额则必须填有效币种;未填金额和零金额有区别,不生成应付或付款。
维修/救援paymentStatus当前固定UNLINKED表示未关联财务,不得由processingStatus推定为已付款,其他类型为空。
运维响应paymentStatus为空,不保存可变财务结论;维修/救援通过finance-status批量读取公司财务状态,不得由processingStatus推定付款。
显式提交公司成本时取已保存申报金额、服务端供应商与月份汇率,来源映射及Outbox同事务保存;不会自动入账或付款。
已提交费用须先在Finance作废才可修改费用项目/金额/币种或重新提交;处理进度、地点和处理人仍可独立更新。
不提供物理删除;编辑与上传历史同事务不可变保存。本接口不提供财务结算或车辆占用/状态自动变更。
security: [{bearerAuth: []}]
paths:
/api/platform/v1/last-leg/fleet/vehicles/{vehicleId}/records/finance-status:
parameters: [{$ref: '#/components/parameters/Vehicle'}]
post:
description: platform:overseas-master-data:vehicle:list;校验本车维修/救援记录,最多100条批量读取,不逐行调用Finance;依赖失败明确返回错误,不能伪造未关联或付款状态
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [recordNos]
properties:
recordNos: {type: array, minItems: 1, maxItems: 100, items: {type: string, minLength: 1, maxLength: 64}}
responses:
'200':
description: ApiResponse;data为每条请求记录的状态;Finance接收状态PENDING为待入账,APPROVED为已入账未付,不等于付款
content:
application/json:
schema:
type: object
properties:
code: {type: string}
data: {type: array, items: {$ref: '#/components/schemas/FinanceStatus'}}
/api/platform/v1/last-leg/fleet/vehicles/{vehicleId}/records/{recordNo}/finance:
parameters:
- {$ref: '#/components/parameters/Vehicle'}
- {name: recordNo, in: path, required: true, schema: {type: string}}
post:
description: platform:overseas-master-data:vehicle:record-finance-submit;不复用普通运维编辑权限。前端选择供应商候选另需platform:supplier:list。首次提交或Finance已作废后才可登记新来源版本,未知结果保留原键重试
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [recordVersion, supplierId, businessDate, idempotencyKey]
properties:
recordVersion: {type: integer, format: int64, minimum: 0}
supplierId: {type: integer, format: int64, minimum: 1}
businessDate: {type: string, format: date, description: 明确选择实际费用业务日期,用于获取业务月份有效汇率}
idempotencyKey: {type: string, minLength: 8, maxLength: 128}
responses:
'200':
description: ApiResponse;仅表示提交请求已登记,PENDING_FINANCE不是已入账或付款
content:
application/json:
schema:
type: object
properties:
code: {type: string}
data:
type: object
properties:
recordNo: {type: string}
sourceVersion: {type: integer, format: int64}
submittedRecordVersion: {type: integer, format: int64}
replayed: {type: boolean}
status: {type: string, enum: [PENDING_FINANCE]}
/api/platform/v1/last-leg/fleet/vehicles/{vehicleId}/records:
parameters: [{$ref: '#/components/parameters/Vehicle'}]
get:
@@ -172,4 +232,12 @@ components:
recordVersion: {type: integer, format: int64, minimum: 0}
updatedBy: {type: string}
updatedAt: {type: string, format: date-time}
paymentStatus: {type: string, nullable: true, readOnly: true, enum: [UNLINKED], description: 维修/救援未关联财务时为UNLINKED,其余为空;不可用处理完成推定已付款}
paymentStatus: {type: string, nullable: true, readOnly: true, description: 运维快照不记录可变财务状态,当前为空;读取finance-status获取财务事实}
FinanceStatus:
type: object
properties:
recordNo: {type: string}
status: {type: string, enum: [UNLINKED, PENDING_FINANCE, FINANCE_ATTENTION, PENDING, APPROVED, PARTIALLY_PAID, PAID, VOIDED]}
sourceVersion: {type: integer, format: int64, nullable: true}
submittedRecordVersion: {type: integer, format: int64, nullable: true}
finance: {type: object, nullable: true, description: Finance公司费用Cost完整只读快照;来源版本及内容须与本地提交一致;未接收不虚构金额,具体结构见finance-vehicle-costs-v1.yaml的Cost}