openapi: "3.0.3" info: title: "预约工作事项" version: "1.0.0" description: "工作事项只保存需求、路线、责任、跟进及影响基线。提柜/还空、预约、PDA和Fleet计划与执行事实由原业务提供。独立DDL仍需总控集成。" security: - bearerAuth: [] paths: /api/platform/v1/last-leg/appointment-work/items/resolve: get: operationId: appointmentWorkResolveBatch summary: 按当前权威批次精确进入送仓事项 description: "要求platform:appointment:list及原来源读取资格。batchKey使用原业务返回的完整稳定键;customerId来自所选客户货源。精确匹配返回detail,未传客户且存在多个客户时detail为空并返回candidates,必须选择后重新解析;不得选首项或回退已替代旧批次。需求关系未同步返回409,未生成返回404。" parameters: - name: batchKey in: query required: true schema: type: string pattern: '^(FBA_APPOINTMENT|DISPATCH):[1-9][0-9]*$' - name: customerId in: query required: false schema: {type: string, minLength: 1} responses: 200: description: data为客户送仓精确解析结果或可见客户候选 content: application/json: schema: type: object required: [code, data] properties: code: {type: string} message: {type: string, nullable: true} data: $ref: '#/components/schemas/BatchWorkResolution' 400: description: 批次键无效 403: description: 缺少平台或原来源读取资格 404: description: 当前批次未生成活动送仓事项 409: description: 需求关系尚未同步或存在不唯一的事项关系 /api/platform/v1/last-leg/appointment-work/calendar: get: operationId: "appointmentWorkCalendar" summary: "完整日期区间的工作聚合" description: "platform:appointment:list并逐事项核验来源读取资格;最大62个当地日期;五个桶互斥;到港参考不计工作量。完整扫描未就绪、scopeVersion变化或任一权威事实失败均拒绝伪造统计。" parameters: - name: "from" in: "query" required: true schema: type: "string" format: "date" - name: "to" in: "query" required: true schema: type: "string" format: "date" - name: "flow" in: "query" required: false schema: "$ref": "#/components/schemas/Flow" - name: "types" in: "query" required: false schema: type: "array" items: type: "string" enum: - "PICKUP" - "WAREHOUSE_RECEIPT" - "DELIVERY" - "TRANSPORT" - "EMPTY_RETURN" responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/CalendarResult" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /api/platform/v1/last-leg/appointment-work/summary: get: operationId: "appointmentWorkSummary" summary: "全部活动事项全局统计" description: "不接收月份/流程/类型条件。集合可重叠;无日期有跟进日仍是未定日期。未知地点提醒按America/Los_Angeles业务默认时区判断并在missingFields说明。" responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/Summary" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /api/platform/v1/last-leg/appointment-work/items: get: operationId: "appointmentWorkItems" summary: "工作明细" description: "ALL不传date时排除已完成;传date时包含当日已完成。共享车次按稳定车次键仅一项,containers中任一柜均可命中。" parameters: - name: "view" in: "query" required: false schema: type: "string" enum: - "ALL" - "FOLLOW_TODAY" - "OVERDUE" - "UNDATED" - "REVIEW" default: "ALL" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 - name: "size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 - name: "date" in: "query" required: false schema: type: "string" format: "date" - name: "flow" in: "query" required: false schema: "$ref": "#/components/schemas/Flow" - name: "types" in: "query" required: false schema: type: "array" items: "$ref": "#/components/schemas/Type" - name: "containerBookingId" in: "query" required: false schema: type: "string" - name: "bucket" in: "query" required: false schema: type: "string" enum: - "PENDING" - "CONFIRMED" - "NO_BOOKING_REQUIRED" - "REVIEW" - "COMPLETED" - name: "keyword" in: "query" required: false schema: type: "string" maxLength: 128 responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/Page" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /api/platform/v1/last-leg/appointment-work/items/{workItemKey}: parameters: - name: "workItemKey" in: "path" required: true schema: type: "string" get: operationId: "appointmentWorkDetail" summary: "事项、业务引用、关联与历史" responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/WorkDetail" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /api/platform/v1/last-leg/appointment-work/items/{workItemKey}/commands: parameters: - name: "workItemKey" in: "path" required: true schema: type: "string" post: operationId: "appointmentWorkCommand" summary: "执行事项自有数据命令" description: "SAVE_FOLLOWUP/RESOLVE_REVIEW要求platform:appointment:followup;其他命令要求platform:appointment:manage-work,同时核验list与来源资格。USER本人接手;外部责任方须运营记录明确反馈。只确认责任,不写实际还空。事务幂等键按事项唯一,同操作者同内容重放原响应;未知字段拒绝;不支持标为完成。" requestBody: required: true content: application/json: schema: "$ref": "#/components/schemas/CommandRequest" responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/CommandResult" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /internal/lastleg/appointment-work/synchronize: post: operationId: "synchronizeAppointmentWork" summary: "服务端分页同步完整已开船事项" description: "仅X-Internal-Service-Token,不经公网Gateway。由后台编排分页调用;GET不写库。afterContainerBookingId为空开始完整扫描,逐页回传nextCursor直到complete。跨页scopeVersion漂移拒绝;首次完整扫描前查询拒绝零值。未出现在新候选页的旧未还空工作保留。" security: - internalToken: [] requestBody: required: true content: application/json: schema: "$ref": "#/components/schemas/SyncRequest" responses: 200: description: "code为字符串200时成功;data为业务结果" content: application/json: schema: type: "object" additionalProperties: false required: - "code" - "data" properties: code: type: "string" message: type: "string" nullable: true data: "$ref": "#/components/schemas/SyncResult" 400: description: "参数、时区或判别式payload不合法" 403: description: "非平台或缺少关联来源/命令权限" 404: description: "事项不存在" 409: description: "版本、来源集合、影响版本或并发冲突;必须刷新" 503: description: "权威来源/原域适配/目录未就绪;不得显示零值或假成功" /internal/lastleg/appointment-work/containers/{id}/route: get: operationId: readAppointmentWorkContainerRoute summary: 读取本地已确认路线,不锁工作守卫或回调Firstleg security: [{internalToken: []}] parameters: - {name: id, in: path, required: true, schema: {type: string}} responses: '200': description: ApiResponse包装的本地持久路线 content: application/json: schema: type: object properties: code: {type: string} message: {type: string, nullable: true} data: type: object required: [flow] properties: flow: {type: string, enum: [TRANSFER, DIRECT, UNKNOWN]} '403': {description: 内部身份无效} '409': {description: 当前有效事项路线冲突} /api/platform/v1/last-leg/appointment-planning/batches/{batchKey}/dispatch-candidates: get: operationId: appointmentWorkBatchDispatchCandidates summary: 按不可变FBA预约批次读取逐票实物排车候选 description: 客户仓使用原排车单批次键DISPATCH:,逐票实物由原排车事务生成;按工作项batchNo进入原排车单并关联车次,不调用本FBA候选接口。平台主体且同时具有platform:appointment:list、platform:overseas-warehouse:last-mile-order:list、platform:overseas-warehouse:inbound-order:list。候选不足不补造数量;超过500托拒绝截断。写入沿用dispatches/pre-arrange及drafts/pre-arrange的batchAllocations,跨客户分别生成排车单后绑定同一车次。 security: [{bearerAuth: []}] parameters: - {name: batchKey, in: path, required: true, schema: {type: string}} responses: '200': description: ApiResponse包装的完整候选及阻断原因 content: application/json: schema: type: object properties: code: {type: string} message: {type: string, nullable: true} data: {$ref: '#/components/schemas/BatchDispatchCandidates'} '403': {description: 非平台主体或无来源读取权限} '409': {description: 批次或实物范围不能完整读取} '503': {description: 原来源目录不可用} components: securitySchemes: bearerAuth: type: "http" scheme: "bearer" bearerFormat: "JWT" internalToken: type: "apiKey" in: "header" name: "X-Internal-Service-Token" schemas: Flow: type: "string" enum: - "TRANSFER" - "DIRECT" - "UNKNOWN" Type: type: "string" enum: - "ROUTE" - "PICKUP" - "WAREHOUSE_RECEIPT" - "DELIVERY" - "TRANSPORT" - "EMPTY_RETURN" Command: type: "string" enum: - "CONFIRM_ROUTE" - "SAVE_FOLLOWUP" - "RESOLVE_REVIEW" - "SAVE_REQUIREMENT" - "HANDOFF_RETURN" - "ACCEPT_RETURN" ActionCode: type: "string" enum: - "VIEW_DETAIL" - "SAVE_PLAN" - "REQUEST_BOOKING" - "RECORD_CONFIRMATION" - "CHANGE_BOOKING" - "CANCEL_BOOKING" - "VERIFY_CARGO" - "EDIT_BATCH" - "ARRANGE_TRANSPORT" - "RECORD_EXECUTION" - "CONFIRM_ROUTE" - "SAVE_FOLLOWUP" - "RESOLVE_REVIEW" - "SAVE_REQUIREMENT" - "HANDOFF_RETURN" - "ACCEPT_RETURN" - "VIEW_HISTORY" Slot: type: "object" additionalProperties: false required: - "date" - "startTime" - "endDate" - "endTime" - "timezone" properties: date: type: "string" format: "date" startTime: type: "string" pattern: "^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?$" nullable: true endDate: type: "string" format: "date" nullable: true description: "与endTime同时为空或同时填写;不推断次日" endTime: type: "string" pattern: "^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?$" nullable: true timezone: type: "string" nullable: true description: "原业务缺失时区可为空并标SOURCE_TIMEZONE;SAVE_REQUIREMENT写入仍须有效IANA时区" Actual: type: "object" additionalProperties: false description: "occurredAt与localOccurredAt至少一个非空;未知时区按原始当地日期展示,不推断UTC" required: - "occurredAt" - "localOccurredAt" - "timezone" properties: occurredAt: type: "string" format: "date-time" nullable: true localOccurredAt: type: "string" description: "无偏移的原始当地日期时间" nullable: true timezone: type: "string" nullable: true Owner: type: "object" additionalProperties: false required: - "id" - "name" properties: id: type: "string" name: type: "string" ContainerReference: type: "object" additionalProperties: false required: - "containerBookingId" - "bookingNo" - "containerNo" properties: containerBookingId: type: "string" bookingNo: type: "string" nullable: true containerNo: type: "string" nullable: true SourceReference: type: "object" additionalProperties: false required: - "customerId" - "sourceKey" - "destinationKey" properties: customerId: type: "string" sourceKey: type: "string" pattern: "^(ORDER|BOOKING):.+$" destinationKey: type: "string" nullable: true BusinessReference: type: "object" additionalProperties: false required: - "kind" - "key" - "businessNo" - "label" properties: kind: type: "string" key: type: "string" businessNo: type: "string" nullable: true label: type: "string" Responsibility: type: "object" additionalProperties: false required: - "kind" - "id" - "name" properties: kind: type: "string" enum: - "USER" - "SUPPLIER" - "EXTERNAL" id: type: "string" nullable: true name: type: "string" minLength: 1 maxLength: 200 WorkTarget: type: "object" additionalProperties: false required: - "kind" - "command" properties: kind: type: "string" enum: - "WORK_COMMAND" command: "$ref": "#/components/schemas/Command" CargoTarget: type: "object" additionalProperties: false required: - "kind" - "source" properties: kind: type: "string" enum: - "CARGO_VERIFICATION" source: "$ref": "#/components/schemas/SourceReference" AppointmentTarget: type: "object" additionalProperties: false required: - "kind" - "appointmentId" - "batchKey" - "sources" properties: kind: type: "string" enum: - "FBA_APPOINTMENT" appointmentId: type: "string" nullable: true batchKey: type: "string" nullable: true sources: type: "array" items: "$ref": "#/components/schemas/SourceReference" ContainerTarget: type: "object" additionalProperties: false required: - "kind" - "containerBookingId" properties: kind: type: "string" enum: - "FIRSTLEG_CONTAINER" containerBookingId: type: "string" TripTarget: type: "object" description: FLEET_TRIP动作。tripId存在时维护原车次,业务车次号取工作项businessNo。未绑定车次的客户仓批次以DISPATCH:<原排车单不可变ID>放入batchKeys,原排车业务号取工作项batchNo;直接进入该原排车单关联车次,不能解析为FBA预约或再建立排车。FBA批次仍通过实物候选及batchAllocations安排。 additionalProperties: false required: - "kind" - "tripId" - "batchKeys" properties: kind: type: "string" enum: - "FLEET_TRIP" tripId: type: "string" nullable: true batchKeys: type: "array" items: type: "string" ReceiptTarget: type: "object" additionalProperties: false required: - "kind" - "inboundPlanId" - "inboundPlanNo" - "customerId" - "containerBookingId" properties: kind: type: "string" enum: - "WAREHOUSE_RECEIPT" inboundPlanId: type: "string" nullable: true inboundPlanNo: type: "string" nullable: true customerId: type: "string" nullable: true containerBookingId: type: "string" ReadTarget: type: "object" description: 原业务只读入口。客户仓派送使用DELIVERY引用(key与businessNo均为派送业务号);DISPATCH引用的key为DISPATCH:<原排车单ID>,businessNo为原排车单号。仅供导航,不代表已经执行写入动作。 additionalProperties: false required: - "kind" - "references" properties: kind: type: "string" enum: - "READ_ONLY" references: type: "array" items: "$ref": "#/components/schemas/BusinessReference" ActionTarget: oneOf: - "$ref": "#/components/schemas/WorkTarget" - "$ref": "#/components/schemas/CargoTarget" - "$ref": "#/components/schemas/AppointmentTarget" - "$ref": "#/components/schemas/ContainerTarget" - "$ref": "#/components/schemas/TripTarget" - "$ref": "#/components/schemas/ReceiptTarget" - "$ref": "#/components/schemas/ReadTarget" discriminator: propertyName: "kind" mapping: WORK_COMMAND: "#/components/schemas/WorkTarget" CARGO_VERIFICATION: "#/components/schemas/CargoTarget" FBA_APPOINTMENT: "#/components/schemas/AppointmentTarget" FIRSTLEG_CONTAINER: "#/components/schemas/ContainerTarget" FLEET_TRIP: "#/components/schemas/TripTarget" WAREHOUSE_RECEIPT: "#/components/schemas/ReceiptTarget" READ_ONLY: "#/components/schemas/ReadTarget" Action: type: "object" additionalProperties: false required: - "code" - "label" - "targetWorkItemKey" - "target" properties: code: "$ref": "#/components/schemas/ActionCode" label: type: "string" targetWorkItemKey: type: "string" nullable: true target: "$ref": "#/components/schemas/ActionTarget" WorkItem: type: "object" additionalProperties: false required: - "workItemKey" - "version" - "type" - "flow" - "title" - "businessNo" - "containers" - "requirementKey" - "batchKey" - "batchNo" - "originName" - "destinationName" - "planStatus" - "executionStatus" - "reviewRequired" - "target" - "confirmed" - "actual" - "calendarDate" - "dateBasis" - "timezone" - "owner" - "followupDate" - "overdueReasons" - "allowedActions" - "nextAction" - "blockReasons" - "missingFields" properties: workItemKey: type: "string" version: type: "integer" minimum: 0 type: "$ref": "#/components/schemas/Type" flow: "$ref": "#/components/schemas/Flow" title: type: "string" businessNo: type: "string" nullable: true containers: type: "array" items: "$ref": "#/components/schemas/ContainerReference" requirementKey: type: "string" nullable: true batchKey: type: "string" nullable: true batchNo: type: "string" nullable: true originName: type: "string" nullable: true destinationName: type: "string" nullable: true planStatus: type: "string" enum: - "UNPLANNED" - "TARGET_SET" - "AWAITING_REPLY" - "CONFIRMED" - "NOT_REQUIRED" executionStatus: type: "string" enum: - "PENDING" - "IN_PROGRESS" - "COMPLETED" reviewRequired: type: "boolean" target: "$ref": "#/components/schemas/Slot" nullable: true confirmed: "$ref": "#/components/schemas/Slot" nullable: true actual: "$ref": "#/components/schemas/Actual" nullable: true calendarDate: type: "string" format: "date" nullable: true dateBasis: type: "string" enum: - "ACTUAL" - "CONFIRMED" - "TARGET" - "NONE" timezone: type: "string" nullable: true owner: "$ref": "#/components/schemas/Owner" nullable: true followupDate: type: "string" format: "date" nullable: true overdueReasons: type: "array" items: type: "string" allowedActions: type: "array" items: "$ref": "#/components/schemas/Action" nextAction: "$ref": "#/components/schemas/Action" nullable: true description: "按当前权限和白名单目标引导;已确认送仓预约可指向本批车辆安排或本车复核,不代表授权发车。取消预约沿原批次重新预约,不恢复旧确认。" blockReasons: type: "array" items: type: "string" missingFields: type: "array" description: "未完成事项分别提示负责人、下次跟进日期和作业日期等缺口;跟进日期不能作为作业日历日期。" items: type: "string" Review: type: "object" additionalProperties: false required: - "version" - "reasons" properties: version: type: "integer" minimum: 0 reasons: type: "array" items: type: "string" RequirementDetails: type: "object" additionalProperties: false required: - "bookingRequired" - "receivingRequirements" - "reason" properties: bookingRequired: type: "boolean" receivingRequirements: type: "string" reason: type: "string" nullable: true ReturnHandoff: type: "object" additionalProperties: false required: - "version" - "from" - "to" - "status" - "reason" properties: version: type: "integer" minimum: 0 from: "$ref": "#/components/schemas/Responsibility" to: "$ref": "#/components/schemas/Responsibility" status: type: "string" enum: - "PENDING_ACCEPTANCE" - "ACCEPTED" reason: type: "string" HistoryEntry: type: "object" additionalProperties: false required: - "occurredAt" - "operatorName" - "action" - "summary" properties: occurredAt: type: "string" format: "date-time" operatorName: type: "string" nullable: true action: type: "string" summary: type: "string" BatchWorkResolution: type: object required: [batchKey, candidates] properties: batchKey: {type: string} customerId: {type: string, nullable: true} detail: nullable: true allOf: - $ref: '#/components/schemas/WorkDetail' candidates: type: array items: type: object required: [customerId, workItemKey] properties: customerId: {type: string} workItemKey: {type: string} batchNo: {type: string, nullable: true} WorkDetail: type: "object" additionalProperties: false required: - "item" - "relatedItems" - "references" - "history" - "review" - "requirement" - "returnHandoff" properties: item: "$ref": "#/components/schemas/WorkItem" relatedItems: type: "array" items: "$ref": "#/components/schemas/WorkItem" references: type: "array" items: "$ref": "#/components/schemas/BusinessReference" history: type: "array" items: "$ref": "#/components/schemas/HistoryEntry" review: "$ref": "#/components/schemas/Review" nullable: true requirement: "$ref": "#/components/schemas/RequirementDetails" nullable: true returnHandoff: "$ref": "#/components/schemas/ReturnHandoff" nullable: true Summary: type: "object" additionalProperties: false required: - "all" - "followToday" - "overdue" - "undated" - "review" properties: all: type: "integer" minimum: 0 followToday: type: "integer" minimum: 0 overdue: type: "integer" minimum: 0 undated: type: "integer" minimum: 0 review: type: "integer" minimum: 0 BucketCounts: type: "object" additionalProperties: false required: - "pending" - "confirmed" - "noBookingRequired" - "review" - "completed" properties: pending: type: "integer" minimum: 0 confirmed: type: "integer" minimum: 0 noBookingRequired: type: "integer" minimum: 0 review: type: "integer" minimum: 0 completed: type: "integer" minimum: 0 DayAggregate: type: "object" additionalProperties: false required: - "date" - "total" - "typeCounts" - "counts" properties: date: type: "string" format: "date" total: type: "integer" minimum: 0 typeCounts: type: "object" additionalProperties: type: "integer" minimum: 0 counts: "$ref": "#/components/schemas/BucketCounts" CalendarResult: type: "object" additionalProperties: false required: - "from" - "to" - "total" - "counts" - "days" properties: from: type: "string" format: "date" to: type: "string" format: "date" total: type: "integer" minimum: 0 counts: "$ref": "#/components/schemas/BucketCounts" days: type: "array" items: "$ref": "#/components/schemas/DayAggregate" Page: type: "object" additionalProperties: false required: - "records" - "page" - "size" - "total" - "pages" properties: records: type: "array" items: "$ref": "#/components/schemas/WorkItem" page: type: "integer" minimum: 1 size: type: "integer" minimum: 1 maximum: 100 total: type: "integer" minimum: 0 pages: type: "integer" minimum: 0 CommandResult: type: "object" additionalProperties: false required: - "item" - "affectedWorkItemKeys" properties: item: "$ref": "#/components/schemas/WorkItem" affectedWorkItemKeys: type: "array" items: type: "string" SyncRequest: type: "object" additionalProperties: false required: - "size" properties: afterContainerBookingId: type: "string" nullable: true maxLength: 128 size: type: "integer" minimum: 1 maximum: 100 SyncResult: type: "object" additionalProperties: false required: - "sources" - "created" - "nextCursor" - "complete" properties: sources: type: "integer" minimum: 0 created: type: "integer" minimum: 0 nextCursor: type: "string" nullable: true complete: type: "boolean" CONFIRM_ROUTERequest: type: "object" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "CONFIRM_ROUTE" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "flow" properties: flow: type: "string" enum: - "TRANSFER" - "DIRECT" reason: type: "string" nullable: true maxLength: 1000 SAVE_FOLLOWUPRequest: type: "object" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "SAVE_FOLLOWUP" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "ownerId" - "followupDate" - "note" properties: ownerId: type: "string" minLength: 1 maxLength: 64 followupDate: type: "string" format: "date" nullable: true note: type: "string" minLength: 1 maxLength: 1000 RESOLVE_REVIEWRequest: type: "object" description: "须匹配当前影响版本,并核对本事项及关联安排的最新权威影响;需求关系未同步或出现新影响时拒绝清除。车次货物成员变化仅要求相关客户及车辆核对,未变化客户预约不连带复核;车辆、司机、时间变化影响当前关联预约。复核不恢复取消的确认、不修改原预约和车辆,也不制造新的业务影响。" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "RESOLVE_REVIEW" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "reviewVersion" - "note" properties: reviewVersion: type: "integer" minimum: 0 note: type: "string" minLength: 1 maxLength: 1000 SAVE_REQUIREMENTRequest: type: "object" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "SAVE_REQUIREMENT" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "target" - "bookingRequired" - "receivingRequirements" - "reason" properties: target: "$ref": "#/components/schemas/Slot" nullable: true bookingRequired: type: "boolean" receivingRequirements: type: "string" nullable: true maxLength: 1000 reason: type: "string" minLength: 1 maxLength: 1000 HANDOFF_RETURNRequest: type: "object" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "HANDOFF_RETURN" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "recipient" - "reason" properties: recipient: "$ref": "#/components/schemas/Responsibility" reason: type: "string" minLength: 1 maxLength: 1000 ACCEPT_RETURNRequest: type: "object" additionalProperties: false required: - "command" - "expectedVersion" - "idempotencyKey" - "payload" properties: command: type: "string" enum: - "ACCEPT_RETURN" expectedVersion: type: "integer" minimum: 0 idempotencyKey: type: "string" minLength: 1 maxLength: 64 payload: type: "object" additionalProperties: false required: - "handoffVersion" - "note" properties: handoffVersion: type: "integer" minimum: 0 note: type: "string" nullable: true maxLength: 1000 CommandRequest: description: SAVE_REQUIREMENT新增目标须为分钟精度且有IANA时区;原业务Slot允许保留秒、纳秒及未知时区。 oneOf: - "$ref": "#/components/schemas/CONFIRM_ROUTERequest" - "$ref": "#/components/schemas/SAVE_FOLLOWUPRequest" - "$ref": "#/components/schemas/RESOLVE_REVIEWRequest" - "$ref": "#/components/schemas/SAVE_REQUIREMENTRequest" - "$ref": "#/components/schemas/HANDOFF_RETURNRequest" - "$ref": "#/components/schemas/ACCEPT_RETURNRequest" discriminator: propertyName: "command" mapping: CONFIRM_ROUTE: "#/components/schemas/CONFIRM_ROUTERequest" SAVE_FOLLOWUP: "#/components/schemas/SAVE_FOLLOWUPRequest" RESOLVE_REVIEW: "#/components/schemas/RESOLVE_REVIEWRequest" SAVE_REQUIREMENT: "#/components/schemas/SAVE_REQUIREMENTRequest" HANDOFF_RETURN: "#/components/schemas/HANDOFF_RETURNRequest" ACCEPT_RETURN: "#/components/schemas/ACCEPT_RETURNRequest" DispatchBatchAllocation: type: object additionalProperties: false required: [planPalletId, batchKey, customerId, sourceKey, destinationKey, packageCount] properties: planPalletId: {type: integer, format: int64} batchKey: {type: string, pattern: '^FBA_APPOINTMENT:[1-9][0-9]*$'} customerId: {type: string} sourceKey: {type: string} destinationKey: {type: string} packageCount: {type: integer, minimum: 1} BatchDispatchCandidates: type: object required: [batchKey, version, candidates, blockReasons] properties: batchKey: {type: string} version: {type: integer} blockReasons: {type: array, items: {type: string}} candidates: type: array items: type: object required: [planPalletId, palletNo, planId, planNo, customerId, sourceStage, packageCount, allocations, blockReasons] properties: planPalletId: {type: integer, format: int64} palletNo: {type: string} planId: {type: integer, format: int64} planNo: {type: string} customerId: {type: string} sourceStage: {type: string, enum: [PLAN, RECEIVED]} packageCount: {type: integer, nullable: true} allocations: {type: array, items: {$ref: '#/components/schemas/DispatchBatchAllocation'}} blockReasons: {type: array, items: {type: string}}