openapi: 3.0.3 info: title: 平台自营出库销量库存及采集运行只读接口 version: 1.0.0 description: >- 全部GET要求PLATFORM身份、tenantId=0、非代登录及独立platform:self-operated-analytics:list权限。 来源及业务时区Asia/Shanghai,单位PCS,账号和仓库由服务端已配置范围校验。 经营查询首屏生成context,包含版本对、独立范围摘要、queryAsOf/queryExpiresAt。 后续列表、图表、榜单和库存复用完整上下文,版本0保持不可用,不偷偷补入新版本。 上下文最多30分钟且不超过旧销量版superseded_at_utc+7天;queryAsOf不得未来或早于所选版本发布时间。 过期/范围不符明确要求刷新整页,不能静默切版;各请求在同一REPEATABLE_READ快照内校验和读取。 五周期包含今日,CUSTOM两端包含且endDate不晚于anchorDate;只有CUSTOM接受startDate/endDate。 默认maxQueryDays366,粒度DAY。正式outboundQuantity与observedQuantity独立,全部未知仍为空。 每日COMPLETE仅证明全天覆盖及有效日行或可靠SKU存在;今日/部分日正式量空,观察量可用,未知日期保持空。 SKU区间正式量仅全部日完整才输出;observedQuantity为可靠点合计,完整/部分/未知日数独立。 热销榜跟随图表所选日期,以已采集有效出库量排序;覆盖不足标记PARTIAL,日均、库存分布及两库存榜使用同一所选区间的完整销量与自然日数;不触发领星请求。 运行接口不受经营context限制。动态库存时效、重建和修订待核对独立返回。 阶段进度区分ACCOUNT_SHARED/WAREHOUSE及TASK_CUMULATIVE/ATTEMPT_ONLY,不伪造总百分比。 total未知为空、计数不能跨PAGE/ORDER/INVENTORY_ROW/BUSINESS_KEY/SKU/BATCH单位求和,NONE为非计数阶段且completed/total为空、totalKnown=false;阶段检查点与心跳分开。 任务号稳定,内部诊断ID不作为业务编号回退。SKU订单数不可相加为仓总单数。 重试沿既有POST sync-tasks,action=RETRY/requestKey/warehouseCode/taskNo/reason,使用独立sync权限并最终复核资格。 security: [{bearerAuth: []}] paths: /api/platform/v1/last-leg/self-operated-analytics/inventory-flow-probe: post: summary: TEST单SKU库存流水有界诊断 description: >- 仅TEST、BUSINESS、执行开启及配置仓库;PLATFORM、tenantId=0、非代登录、独立platform:self-operated-analytics:sync权限。 每个requestKey最多一次供应商请求、第一页最多1000条、时间范围最多31天且不得未来。 复用现有账号lease/fence、1200ms间隔、permit和消费记录。占用时拒绝,由操作者另行发起,不自动重试。 同键成功重放读取保存结果;同键异参拒绝;失败或结果未知不得重发。任务类型INVENTORY_FLOW_PROBE,成功SAMPLE_DONE,失败DEAD。 complete仅证明本次分页记录已全部返回,不证明历史流水无缺失或库存可还原。只保存诊断结果,不发布销量、库存或日样本。 requestBody: required: true content: application/json: schema: type: object required: [requestKey, warehouseCode, customerCode, sku, startTime, endTime] properties: requestKey: {type: string, minLength: 1, maxLength: 80} warehouseCode: {type: string, minLength: 1, maxLength: 64} customerCode: {type: string, minLength: 1, maxLength: 64} sku: {type: string, minLength: 1, maxLength: 128} startTime: {type: string, description: 北京时间本地日期时间} endTime: {type: string, description: 北京时间本地日期时间} responses: '200': description: ApiResponse;成功data包含taskNo、complete与page(records、total、current、size、pages、observedAt、egress)。流水字段定义见Integration库存流水合同。业务失败保留错误码,不返回伪成功。 '403': description: 非平台或缺少采集权限 /api/platform/v1/last-leg/self-operated-analytics/owner-directory: get: summary: 完整资料批次中的客户名称与编码 description: 仅平台且须 platform:self-operated-analytics:list。按账号和 queryAsOf 选择最近完整发布的 MASTER_DATA 资料版本;不调用领星,不限制为当前仓有销量的客户。未同步返回空数组,缺失名称返回 null。 parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} responses: '200': description: 统一 ApiResponse content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/OwnerOption'}} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少只读权限} /api/platform/v1/last-leg/self-operated-analytics/dashboard: get: summary: 单仓固定版本经营总览 description: >- 平台独立只读权限platform:self-operated-analytics:list。一次一致快照固定销量和库存版本。 默认LAST_15_DAYS统一用于趋势、区间出库、日均、互斥分桶及三个Top10;热销按已采集有效量排序并标记覆盖状态,库存评估要求所选区间完整可信销量和有效库存;商品观察期仅提示。 不接受货主、SKU、分页、windowDays、topN或其他额外筛选。仓级趋势不套单SKU观察期。 库存严格下钻须携带原版本和drilldownFrom=DASHBOARD;截止时间由服务端根据库存真实观测重算。 parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/bucket'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} responses: '200': description: 统一ApiResponse;版本或参数错误为业务失败,不降级成空图。 content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/Dashboard'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sku-sales-summary: get: summary: SKU五周期或历史累计清单 description: '候选为两版profile并集,SQL按选定日期聚合后按salesSort指定observedQuantity升降序(默认降序)空值末尾、SKU及货主升序,再分页。未知日不填零。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/customerCode'} - {$ref: '#/components/parameters/sku'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/bucket'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} - name: salesSort in: query required: false description: 全量数量排序,默认降序;未知值始终末尾,同值按SKU及货主升序。 schema: {type: string, enum: [QUANTITY_ASC, QUANTITY_DESC], default: QUANTITY_DESC} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/SalesPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sku-daily-sales: get: summary: 精确单SKU日趋势 description: 'customerCode和sku必填,精确原始业务键匹配。最多366日且返回完整升序日期轴,不分页。无候选明确业务错误。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/customerCodeRequired'} - {$ref: '#/components/parameters/skuRequired'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/bucket'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/Trend'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/hot-skus: get: summary: 所选时段已采集热销Top100 description: '支持CUSTOM起止日期(含截止日),与总览所选时段一致;未传日期时仍使用windowDays的7/30日窗口。按已采集有效数量排序,覆盖不足由context及coverageStatus提示,不把未知当零。数量大于零,数量降序、SKU单数降序、SKU及货主升序,先Top100再分页;当前缺货仍可入榜。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/customerCode'} - {$ref: '#/components/parameters/sku'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/windowDays'} - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/MetricPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/slow-skus: get: summary: 所选完整时段有库存低出库Top100 description: '支持CUSTOM起止日期,1至366天,前端统一为截至昨日的3/7/15/30天或自定义;不接受windowDays。正品有效新鲜可售量大于零、完整窗口且起点前可靠存在。数量升序、可售量降序、SKU及货主升序。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/customerCode'} - {$ref: '#/components/parameters/sku'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/MetricPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/inventory-coverage: get: summary: 正品库存与所选窗口可售天数 description: '普通库存明细使用1至366个完整自然日,由最近3/7/15/30天或自定义区间计算;总览严格下钻须携带drilldownFrom=DASHBOARD及原图CUSTOM起止日期,不得同时携带salesWindowDays/salesWindowEndDate。可售仅品质0可用量,不扣冻结或加在途次品。先UNKNOWN/INVALID/STALE,再有效零库存为0,再校验正库存单位及完整可信窗口;观察期仅提示,不阻断统计;零销量天数为空。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/rangePreset'} - {$ref: '#/components/parameters/startDate'} - {$ref: '#/components/parameters/endDate'} - {$ref: '#/components/parameters/coverageBucket'} - {$ref: '#/components/parameters/bucketRuleVersion'} - {$ref: '#/components/parameters/coverageSelection'} - {$ref: '#/components/parameters/drilldownFrom'} - {$ref: '#/components/parameters/attention'} - {$ref: '#/components/parameters/sortBy'} - {$ref: '#/components/parameters/coverageDaysThreshold'} - {name: salesWindowDays, in: query, schema: {type: integer, minimum: 1, maximum: 366, default: 30}, description: 仅库存明细使用的完整自然日窗口} - {name: salesWindowEndDate, in: query, schema: {type: string, format: date}, description: 含当日的窗口截止日,默认固定查询基准的北京时间昨日;必须早于查询当日,分页须携带原窗口} - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/customerCode'} - {$ref: '#/components/parameters/sku'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/InventoryMetricPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sync-overview: get: summary: 各仓任务族运行概览 description: 'warehouseCode可选。轻量读取scope/task/run/账号保护。无发布版和OFF仍返回配置任务;无正式scope时可显示冻结唯一仓码的最近普通VALIDATION根,不计入正式同步成功、覆盖或发布。首采COMPLETE须正式发布覆盖且无rebuild或未闭合归并。共享上游明确账号共享范围。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCodeOptional'} - {$ref: '#/components/parameters/dataFamily'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/Overview'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sync-tasks: get: summary: 本仓逻辑采集任务 description: '任务按创建时间及稳定键倒序。首屏返回listUpperCreatedAt/listUpperId,后页完整重传;新插入不挤移页。普通VALIDATION根按冻结唯一仓码归属本仓,无需正式scope;仓库目录发现根不进入分仓视图。只读有限检查点,不展开stage或大manifest。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/dataFamily'} - {$ref: '#/components/parameters/taskType'} - {$ref: '#/components/parameters/status'} - {$ref: '#/components/parameters/taskNo'} - {$ref: '#/components/parameters/dateFrom'} - {$ref: '#/components/parameters/dateUntil'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} - {$ref: '#/components/parameters/listUpperCreatedAt'} - {$ref: '#/components/parameters/listUpperId'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/TaskPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sync-tasks/{taskNo}: get: summary: 本仓业务任务号详情 description: '路径taskNo为稳定业务任务号,实际归属与请求账号仓必须一致。不以内部ID回退。详情含最新尝试和关联共享上游;普通VALIDATION根以冻结唯一仓码匹配,可在无正式scope时读取。progress.stages保留实际阶段计数,HTTP次数和终态NONE不作为样本行数。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {name: taskNo, in: path, required: true, schema: {type: string, maxLength: 64}} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/TaskDetail'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/sync-runs: get: summary: 本仓或任务号的尝试历史 description: '纯运行元数据分页,包含冻结唯一仓码匹配本仓的普通VALIDATION根尝试,无需正式scope;目录发现根不进入分仓视图。当前尝试读同一attemptNo的task进度,终态尝试只读run冻结快照;心跳过期UNCONFIRMED,不自动改判成功失败。 权限platform:self-operated-analytics:list。' parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/dataFamily'} - {$ref: '#/components/parameters/taskType'} - {$ref: '#/components/parameters/status'} - {$ref: '#/components/parameters/taskNo'} - {$ref: '#/components/parameters/dateFrom'} - {$ref: '#/components/parameters/dateUntil'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} - {$ref: '#/components/parameters/listUpperCreatedAt'} - {$ref: '#/components/parameters/listUpperId'} responses: '200': description: '统一ApiResponse,业务失败HTTP200且code非200。' content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/AttemptPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/owners: get: summary: 已采集货主编码分页 description: 固定同屏版本,只读权限platform:self-operated-analytics:list。不调用外部API。概览不接受SKU/attention/sortBy/分页/图表范围,候选不存在data为空。 parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/keyword'} - {$ref: '#/components/parameters/current'} - {$ref: '#/components/parameters/size'} responses: '200': description: 统一ApiResponse content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/OwnerPage'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} /api/platform/v1/last-leg/self-operated-analytics/owner-overview: get: summary: 单货主完整候选30日经营概览 description: 固定同屏版本,只读权限platform:self-operated-analytics:list。不调用外部API。概览不接受SKU/attention/sortBy/分页/图表范围,候选不存在data为空。 parameters: - {$ref: '#/components/parameters/sourceAccount'} - {$ref: '#/components/parameters/warehouseCode'} - {$ref: '#/components/parameters/salesRunId'} - {$ref: '#/components/parameters/inventoryRunId'} - {$ref: '#/components/parameters/salesScopeHash'} - {$ref: '#/components/parameters/inventoryScopeHash'} - {$ref: '#/components/parameters/queryAsOf'} - {$ref: '#/components/parameters/customerCodeRequired'} - {$ref: '#/components/parameters/coverageDaysThreshold'} responses: '200': description: 统一ApiResponse content: application/json: schema: type: object properties: code: {type: string} message: {type: string} data: {$ref: '#/components/schemas/OwnerOverview'} '401': {description: 缺少可信认证身份} '403': {description: 非平台身份或缺少独立只读权限} components: securitySchemes: bearerAuth: {type: http, scheme: bearer, bearerFormat: JWT} parameters: coverageBucket: name: coverageBucket in: query description: 与非ALL attention和coverageSelection互斥,须配套固定规则版本;SQL分页前采用与总览相同互斥谓词。 schema: {type: string, enum: [DAYS_0_30, DAYS_30_60, DAYS_60_90, DAYS_GT_90, NO_OUTBOUND_IN_WINDOW, NO_AVAILABLE, UNKNOWN]} bucketRuleVersion: {name: bucketRuleVersion, in: query, description: 不带coverageBucket时禁止单独传入, schema: {type: string, enum: [COVERAGE_DISTRIBUTION_V1]}} coverageSelection: {name: coverageSelection, in: query, description: 正式有限正可售天数候选,在SQL分页前过滤,与非ALL attention及coverageBucket互斥, schema: {type: string, enum: [FINITE_POSITIVE]}} drilldownFrom: {name: drilldownFrom, in: query, description: 必须固定原版本,服务端在真实库存有效期与查询到期较早者阻断并要求刷新总览;不增加权限, schema: {type: string, enum: [DASHBOARD]}} keyword: {name: keyword, in: query, schema: {type: string, minLength: 1, maxLength: 64}, description: 区分大小写的货主编码字面前缀,先过滤去重再分页} attention: {name: attention, in: query, schema: {type: string, default: ALL, enum: [ALL, NO_OUTBOUND_IN_WINDOW, COVERAGE_GT_THRESHOLD, FROZEN_STOCK, DEFECTIVE_STOCK, UNASSESSABLE]}} sortBy: {name: sortBy, in: query, schema: {type: string, default: AVAILABLE_DESC, enum: [AVAILABLE_ASC, AVAILABLE_DESC, COVERAGE_DAYS_ASC, COVERAGE_DAYS_DESC, PHYSICAL_ASC, PHYSICAL_DESC, FROZEN_ASC, FROZEN_DESC, DEFECTIVE_ASC, DEFECTIVE_DESC, TRANSIT_ASC, TRANSIT_DESC, OUTBOUND_ASC, OUTBOUND_DESC, AVERAGE_DAILY_ASC, AVERAGE_DAILY_DESC]}, description: 完整候选先筛选后按正式未舍入值排序分页,未知末尾,同值SKU和货主升序;出库和日均按本次实际窗口,已采集小计不参与正式值排序} coverageDaysThreshold: {name: coverageDaysThreshold, in: query, schema: {type: integer, minimum: 1}, description: COVERAGE_GT_THRESHOLD必填,严格大于且未舍入比较,不设置默认经营政策} sourceAccount: {name: sourceAccount, in: query, required: true, schema: {type: string, minLength: 1, maxLength: 64}} warehouseCode: {name: warehouseCode, in: query, required: true, schema: {type: string, minLength: 1, maxLength: 64}} customerCode: {name: customerCode, in: query, required: false, schema: {type: string, minLength: 1, maxLength: 64}} sku: {name: sku, in: query, required: false, schema: {type: string, minLength: 1, maxLength: 128}} rangePreset: {name: rangePreset, in: query, required: false, schema: {type: string, enum: [TODAY, LAST_3_DAYS, THIS_WEEK, LAST_15_DAYS, THIS_MONTH, CUSTOM], default: TODAY}} startDate: {name: startDate, in: query, required: false, schema: {type: string, format: date}} endDate: {name: endDate, in: query, required: false, schema: {type: string, format: date}} bucket: {name: bucket, in: query, required: false, schema: {type: string, enum: [DAY], default: DAY}} windowDays: {name: windowDays, in: query, required: false, schema: {type: integer, enum: [7, 30], default: 30}} current: {name: current, in: query, required: false, schema: {type: integer, minimum: 1, default: 1}} size: {name: size, in: query, required: false, schema: {type: integer, minimum: 1, maximum: 100, default: 20}} salesRunId: {name: salesRunId, in: query, required: false, schema: {type: string, pattern: '^[0-9]+$'}} inventoryRunId: {name: inventoryRunId, in: query, required: false, schema: {type: string, pattern: '^[0-9]+$'}} salesScopeHash: {name: salesScopeHash, in: query, required: false, schema: {type: string, pattern: '^[0-9a-f]{64}$'}} inventoryScopeHash: {name: inventoryScopeHash, in: query, required: false, schema: {type: string, pattern: '^[0-9a-f]{64}$'}} queryAsOf: {name: queryAsOf, in: query, required: false, schema: {type: string, format: date-time}} dataFamily: {name: dataFamily, in: query, required: false, schema: {type: string, enum: [OUTBOUND, INVENTORY]}} taskType: {name: taskType, in: query, required: false, schema: {type: string}} status: {name: status, in: query, required: false, schema: {type: string}} taskNo: {name: taskNo, in: query, required: false, schema: {type: string, maxLength: 64}} dateFrom: {name: dateFrom, in: query, required: false, schema: {type: string, format: date}} dateUntil: {name: dateUntil, in: query, required: false, schema: {type: string, format: date}} listUpperCreatedAt: {name: listUpperCreatedAt, in: query, required: false, schema: {type: string, format: date-time}} listUpperId: {name: listUpperId, in: query, required: false, schema: {type: string, pattern: '^[0-9]+$'}} warehouseCodeOptional: {name: warehouseCode, in: query, schema: {type: string, minLength: 1, maxLength: 64}} customerCodeRequired: {name: customerCode, in: query, required: true, schema: {type: string, minLength: 1, maxLength: 64}} skuRequired: {name: sku, in: query, required: true, schema: {type: string, minLength: 1, maxLength: 128}} schemas: DashboardContext: allOf: - {$ref: '#/components/schemas/Context'} - type: object properties: inventoryFreshUntil: {type: string, format: date-time, nullable: true} inventoryDrilldownExpiresAt: {type: string, format: date-time, nullable: true} DashboardMetric: type: object properties: value: {type: number, nullable: true} knownSubtotal: {type: number, nullable: true} unit: {type: string, enum: [PCS, PCS_PER_DAY, SKU]} dataStatus: {type: string, enum: [COMPLETE, PARTIAL, UNKNOWN]} unknownSkuCount: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} outboundQuantity: {type: number, nullable: true} observedQuantity: {type: number, nullable: true} DashboardKpis: type: object properties: intervalOutboundQuantity: {$ref: '#/components/schemas/DashboardMetric'} averageDailyOutboundQuantity: {$ref: '#/components/schemas/DashboardMetric'} physicalQuantity: {$ref: '#/components/schemas/DashboardMetric'} availableQuantity: {$ref: '#/components/schemas/DashboardMetric'} physicalSkuCount: {$ref: '#/components/schemas/DashboardMetric'} noOutboundSkuCount: {$ref: '#/components/schemas/DashboardMetric'} CoverageDistribution: type: object description: 数值桶按未舍入交叉乘积判断;七桶互斥守恒。库存版未发布时计数为空,不把销量候选伪造成库存总量。 properties: bucketRuleVersion: {type: string, enum: [COVERAGE_DISTRIBUTION_V1]} candidateSkuCount: {type: string, nullable: true} excludedZeroPhysicalSkuCount: {type: string, nullable: true} dataStatus: {type: string, enum: [COMPLETE, PARTIAL, UNKNOWN]} reasonCodes: {type: array, items: {type: string}} unknownReasons: {type: object, additionalProperties: {type: string}} buckets: type: array minItems: 7 maxItems: 7 items: type: object properties: bucketCode: {type: string, enum: [DAYS_0_30, DAYS_30_60, DAYS_60_90, DAYS_GT_90, NO_OUTBOUND_IN_WINDOW, NO_AVAILABLE, UNKNOWN]} skuCount: {type: string, nullable: true} knownPhysicalQuantity: {type: number, nullable: true} unknownPhysicalSkuCount: {type: string, nullable: true} DashboardRankingItem: type: object properties: customerName: {type: string, nullable: true, description: queryAsOf 时可见的完整资料批次中的货主名称} customerCode: {type: string} sku: {type: string} productName: {type: string, nullable: true} value: {type: number} unit: {type: string, enum: [PCS, DAY]} windowOutboundQuantity: {type: number, nullable: true, description: 榜单实际窗口出库量;热销在部分覆盖时为已采集量} skuOutboundOrderCount: {type: string, nullable: true} physicalQuantity: {type: number, nullable: true} availableQuantity: {type: number, nullable: true} frozenQuantity: {type: number, nullable: true} defectivePhysicalQuantity: {type: number, nullable: true} averageDailyOutboundQuantity: {type: number, nullable: true} inventoryCoverageDays: {type: number, nullable: true} DashboardRanking: type: object description: eligibleCount来自完整候选;items最多10项,不用Top100数量冒充全量合格数。 properties: windowStartDate: {type: string, format: date} windowEndDateExclusive: {type: string, format: date} calculationWindowDays: {type: integer, minimum: 1, description: 三个榜单均为所选日期区间的自然日数} eligibleCount: {type: string, nullable: true} unassessableCount: {type: string, nullable: true} items: {type: array, maxItems: 10, items: {$ref: '#/components/schemas/DashboardRankingItem'}} dataStatus: {type: string, enum: [COMPLETE, PARTIAL, UNKNOWN]} reasonCodes: {type: array, items: {type: string}} Dashboard: type: object properties: context: {$ref: '#/components/schemas/DashboardContext'} kpis: {$ref: '#/components/schemas/DashboardKpis'} salesTrend: type: object properties: summary: {$ref: '#/components/schemas/SalesSummary'} points: {type: array, maxItems: 366, items: {$ref: '#/components/schemas/Point'}} coverageDistribution: {$ref: '#/components/schemas/CoverageDistribution'} hotSkus: {$ref: '#/components/schemas/DashboardRanking'} longCoverageSkus: {$ref: '#/components/schemas/DashboardRanking'} noOutboundSkus: {$ref: '#/components/schemas/DashboardRanking'} OwnerOption: type: object properties: customerCode: {type: string} customerName: {type: string, nullable: true} OwnerPage: type: object properties: context: {$ref: '#/components/schemas/Context'} records: {type: array, items: {$ref: '#/components/schemas/OwnerOption'}} current: {type: integer} size: {type: integer} total: {type: string} pages: {type: string} excludedReasons: {type: object, additionalProperties: {type: string}} QuantityTotal: type: object properties: overallTotal: {type: number, nullable: true} knownSubtotal: {type: number, nullable: true} unknownSkuCount: {type: string} dataStatus: {type: string, enum: [COMPLETE, PARTIAL, UNKNOWN]} reasonCodes: {type: array, items: {type: string}} RiskShare: type: object description: 分母为同一OwnerOverview的physicalQuantity。未知时正式命中与比例为空。未设置阈值返回THRESHOLD_NOT_SET。 properties: matchedSkuCount: {type: string, nullable: true} matchedPhysicalQuantity: {type: number, nullable: true} physicalQuantityRatio: {type: number, minimum: 0, maximum: 1, nullable: true} knownMatchedSkuCount: {type: string, nullable: true} knownMatchedPhysicalQuantity: {type: number, nullable: true} unassessableSkuCount: {type: string} unassessableKnownPhysicalQuantity: {type: number, nullable: true} reasonCodes: {type: array, items: {type: string}} OwnerOverview: type: object nullable: true properties: context: {$ref: '#/components/schemas/Context'} customerCode: {type: string} customerName: {type: string, nullable: true} skuCount: {type: string, nullable: true} physicalSkuCount: {$ref: '#/components/schemas/QuantityTotal'} physicalQuantity: {$ref: '#/components/schemas/QuantityTotal'} availableQuantity: {$ref: '#/components/schemas/QuantityTotal'} frozenQuantity: {$ref: '#/components/schemas/QuantityTotal'} defectivePhysicalQuantity: {$ref: '#/components/schemas/QuantityTotal'} transitQuantity: {$ref: '#/components/schemas/QuantityTotal'} outboundQuantity30d: {$ref: '#/components/schemas/QuantityTotal'} averageDailyOutboundQuantity: {$ref: '#/components/schemas/QuantityTotal'} noOutbound30d: {$ref: '#/components/schemas/RiskShare'} coverageAboveThreshold: {$ref: '#/components/schemas/RiskShare'} Context: type: object properties: salesRunId: {type: string, nullable: true} inventoryRunId: {type: string, nullable: true} salesScopeHash: {type: string, nullable: true} inventoryScopeHash: {type: string, nullable: true} queryAsOf: {type: string, format: date-time, nullable: true} queryExpiresAt: {type: string, format: date-time, nullable: true} businessTimezone: {type: string, nullable: true} anchorDate: {type: string, format: date, nullable: true} rangeStartDate: {type: string, format: date, nullable: true} rangeEndDateExclusive: {type: string, format: date, nullable: true} calculationWindowDays: {type: integer, nullable: true} completeDayFrom: {type: string, format: date, nullable: true} completeDayUntil: {type: string, format: date, nullable: true} salesCoveredFrom: {type: string, format: date-time, nullable: true} salesCoveredUntil: {type: string, format: date-time, nullable: true} salesPublishedAt: {type: string, format: date-time, nullable: true} inventoryObservedFrom: {type: string, format: date-time, nullable: true} inventoryObservedUntil: {type: string, format: date-time, nullable: true} salesStatus: {type: string, nullable: true} inventoryStatus: {type: string, nullable: true} rebuildRequired: {type: boolean, nullable: true} revisionReviewStatus: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} SalesSummary: type: object properties: customerName: {type: string, nullable: true, description: queryAsOf 时可见的完整资料批次中的货主名称} sourceAccount: {type: string, nullable: true} warehouseCode: {type: string, nullable: true} customerCode: {type: string, nullable: true} sku: {type: string, nullable: true} productName: {type: string, nullable: true} quantityUnit: {type: string, nullable: true} outboundQuantity: {type: number, nullable: true} observedQuantity: {type: number, nullable: true} dataStatus: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} completeDayCount: {type: integer, nullable: true} partialDayCount: {type: integer, nullable: true} unknownDayCount: {type: integer, nullable: true} Point: type: object properties: businessDate: {type: string, format: date, nullable: true} outboundQuantity: {type: number, nullable: true} observedQuantity: {type: number, nullable: true} dataStatus: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} quantityUnit: {type: string, nullable: true} coveredFrom: {type: string, format: date-time, nullable: true} coveredUntil: {type: string, format: date-time, nullable: true} Trend: type: object properties: context: {$ref: '#/components/schemas/Context'} summary: {$ref: '#/components/schemas/SalesSummary'} points: {type: array, items: {$ref: '#/components/schemas/Point'}} Metric: type: object properties: customerName: {type: string, nullable: true} defectivePhysicalQuantity: {type: number, nullable: true} outboundQuantity30d: {type: number, nullable: true} lastObservedOutboundDate: {type: string, format: date, nullable: true} observedHistoryStartDate: {type: string, format: date, nullable: true} attentionReasons: {type: array, items: {type: string}} quantityStatuses: {type: object, additionalProperties: {type: string, enum: [VALID, UNKNOWN, STALE]}} sourceAccount: {type: string, nullable: true} customerCode: {type: string, nullable: true} warehouseCode: {type: string, nullable: true} sku: {type: string, nullable: true} productName: {type: string, nullable: true} quantityUnit: {type: string, nullable: true} outboundQuantity: {type: number, nullable: true} skuOutboundOrderCount: {type: string, nullable: true} todayObservedQuantity: {type: number, nullable: true} physicalQuantity: {type: number, nullable: true} availableQuantity: {type: number, nullable: true} frozenQuantity: {type: number, nullable: true} transitQuantity: {type: number, nullable: true} inventoryObservedAt: {type: string, format: date-time, nullable: true} averageDailyOutboundQuantity: {type: number, nullable: true} inventoryCoverageDays: {type: number, nullable: true} inventoryQuality: {type: string, nullable: true} salesCoverage: {type: string, nullable: true} observationEligible: {type: boolean, nullable: true} earliestReliableEvidenceAt: {type: string, format: date-time, nullable: true} status: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} InventoryMetric: description: 库存窗口响应。windowOutboundQuantity为所选完整窗口销量:普通明细10或30日,总览严格下钻使用原图CUSTOM区间;未知保持null,零销量状态NO_OUTBOUND_IN_WINDOW不除零。无出库关注、出库排序及分组均使用实际窗口;商品观察期仅提示,不阻断完整窗口销量及可售天数。完整可信窗口中无出库行可记零,覆盖不足或数量异常不可补零。 type: object properties: customerName: {type: string, nullable: true} defectivePhysicalQuantity: {type: number, nullable: true} windowOutboundQuantity: {type: number, nullable: true} observedWindowOutboundQuantity: {type: number, nullable: true, description: 同一固定销量版及实际窗口中单位有效的已采集出库小计;不代替完整窗口出库,不用于推算日均或可售天数,未知不补零} lastObservedOutboundDate: {type: string, format: date, nullable: true} observedHistoryStartDate: {type: string, format: date, nullable: true} attentionReasons: {type: array, items: {type: string}} quantityStatuses: {type: object, additionalProperties: {type: string, enum: [VALID, UNKNOWN, STALE, UNIT_UNKNOWN_OR_CONFLICT, SALES_UNTRUSTED, COVERAGE_INSUFFICIENT]}} sourceAccount: {type: string, nullable: true} customerCode: {type: string, nullable: true} warehouseCode: {type: string, nullable: true} sku: {type: string, nullable: true} productName: {type: string, nullable: true} quantityUnit: {type: string, nullable: true} skuOutboundOrderCount: {type: string, nullable: true} physicalQuantity: {type: number, nullable: true} availableQuantity: {type: number, nullable: true} frozenQuantity: {type: number, nullable: true} transitQuantity: {type: number, nullable: true} inventoryObservedAt: {type: string, format: date-time, nullable: true} averageDailyOutboundQuantity: {type: number, nullable: true} inventoryCoverageDays: {type: number, nullable: true} inventoryQuality: {type: string, nullable: true} salesCoverage: {type: string, nullable: true} observationEligible: {type: boolean, nullable: true, description: 是否已有不晚于窗口起点的可靠商品记录;false仅用于观察提示,不阻断完整可信窗口出库、日均和可售天数} earliestReliableEvidenceAt: {type: string, format: date-time, nullable: true} status: {type: string, nullable: true} reasonCodes: {type: array, items: {type: string}} Protection: type: object properties: accountCooldownUntil: {type: string, format: date-time, nullable: true} accountPauseReason: {type: string, nullable: true} dailyRequestBudget: {type: integer, minimum: 0, nullable: true, description: "BUSINESS 为 0,表示不限制累计请求次数;VALIDATION 为每日请求上限。实际请求计数继续累计。"} reservedHttpRequests: {type: string, nullable: true} confirmedHttpRequests: {type: string, nullable: true} budgetDate: {type: string, format: date, nullable: true} Validation: type: object properties: validationSessionNo: {type: string, nullable: true} budgetLimits: {type: object, additionalProperties: {type: string, nullable: true}} budgetConsumed: {type: object, additionalProperties: {type: string, nullable: true}} deadlineAt: {type: string, format: date-time, nullable: true} stopReason: {type: string, nullable: true} Attempt: type: object properties: runId: {type: string, nullable: true} taskNo: {type: string, nullable: true} attemptNo: {type: integer, nullable: true} status: {type: string, nullable: true} phase: {type: string, nullable: true, description: 资料同步使用 CUSTOMERS / PRODUCTS;其他阶段不变} executionPurpose: {type: string, nullable: true} startedAt: {type: string, format: date-time, nullable: true} finishedAt: {type: string, format: date-time, nullable: true} phaseStartedAt: {type: string, format: date-time, nullable: true} progressUpdatedAt: {type: string, format: date-time, nullable: true} heartbeatAt: {type: string, format: date-time, nullable: true} executionHealth: {type: string, nullable: true} elapsedSeconds: {type: string, nullable: true} errorCode: {type: string, nullable: true} failureSummary: {type: string, nullable: true} retryable: {type: boolean, nullable: true} coverageStatus: {type: string, nullable: true} coveredFrom: {type: string, format: date-time, nullable: true} coveredUntil: {type: string, format: date-time, nullable: true} publishedAt: {type: string, format: date-time, nullable: true} progress: {$ref: '#/components/schemas/Progress'} Task: type: object properties: createdAt: {type: string, format: date-time, nullable: true, description: 当前任务创建时间,重试和阶段切换不重置} elapsedSeconds: {type: string, nullable: true, description: 自创建起的累计秒数,含排队和重试;活动任务截止本次读取,终态任务截止任务最后更新时间;不是单次执行耗时} taskNo: {type: string, nullable: true} taskType: {type: string, nullable: true} dataFamily: {type: string, nullable: true, description: OUTBOUND / INVENTORY / MASTER_DATA(账号资料)} warehouseCode: {type: string, nullable: true} taskRole: {type: string, nullable: true} executionPurpose: {type: string, nullable: true} queryFrom: {type: string, format: date-time, nullable: true} queryUntil: {type: string, format: date-time, nullable: true} taskStatus: {type: string, nullable: true} applyState: {type: string, nullable: true} attemptCount: {type: integer, nullable: true} latestAttemptNo: {type: integer, nullable: true} resultPublicationState: {type: string, nullable: true} resultPublishedRunId: {type: string, nullable: true} nextRetryAt: {type: string, format: date-time, nullable: true} allowedActions: {type: array, items: {type: string}} actionBlockReason: {type: string, nullable: true} progressUpdatedAt: {type: string, format: date-time, nullable: true} progress: {$ref: '#/components/schemas/Progress'} validation: {$ref: '#/components/schemas/Validation'} latestAttempt: {$ref: '#/components/schemas/Attempt'} dependencyState: type: string enum: [NONE, WAITING_CONFIRMED, WAITING_UNCONFIRMED, SATISFIED, FAILED] description: 仅直接upstreamTaskId且账号及用途一致证明依赖;时间窗口相交不构成依赖。 blockingReason: {type: string, nullable: true, description: 当前执行阻塞原因码,与恢复操作资格actionBlockReason分开} progressSourceTaskNo: {type: string, nullable: true, description: 确认等待时指向直接上游,否则指向本任务;计数仍保留在各自Task.progress,不复制到本仓} stageEstimate: {$ref: '#/components/schemas/StageEstimate'} StageEstimate: type: object description: 本任务当前阶段估算,不能当作全任务ETA;进度与估算整体按progressIdentity和validUntil接收。计数包含复用时测速基线重建,采样仅来自已提交检查点。 properties: status: {type: string, enum: [AVAILABLE, UNAVAILABLE, PAUSED]} progressIdentity: {type: string} completed: {type: string, nullable: true} total: {type: string, nullable: true} sampleFrom: {type: string, format: date-time, nullable: true} sampleUntil: {type: string, format: date-time, nullable: true} completedDelta: {type: string, nullable: true} ratePerSecond: {type: number, nullable: true} remainingSeconds: {type: string, nullable: true} estimatedAt: {type: string, format: date-time} validUntil: {type: string, format: date-time, nullable: true} unavailableReason: type: string nullable: true enum: [TERMINAL, PAUSED, HEALTH_UNCONFIRMED, TOTAL_UNKNOWN, INVALID_PROGRESS, STAGE_COMPLETE, SAMPLING, NO_RECENT_PROGRESS, SAMPLE_EXPIRED, INVALID_SAMPLE] TaskDetail: type: object properties: task: {$ref: '#/components/schemas/Task'} sharedUpstream: {$ref: '#/components/schemas/Task'} protection: {$ref: '#/components/schemas/Protection'} observedAt: {type: string, format: date-time, nullable: true} InventoryDailySamples: type: object nullable: true description: 仅库存任务族提供。北京时间近30个完整日的正式日代表积累;缺日不补零或沿用旧批次,不是周转率。 required: [windowFrom, windowUntil, expectedDays, sampleCount, missingDates] properties: windowFrom: {type: string, format: date, description: 包含起日} windowUntil: {type: string, format: date, description: 排他上界,即北京时间今日} expectedDays: {type: integer, enum: [30]} sampleCount: {type: integer, minimum: 0, maximum: 30} missingDates: {type: array, items: {type: string, format: date}} accumulationStartedOn: {type: string, format: date, nullable: true, description: 本仓最早正式日代表日期,无样本时为空} Warehouse: type: object properties: warehouseCode: {type: string, nullable: true} warehouseName: {type: string, nullable: true} dataFamily: {type: string, nullable: true, description: OUTBOUND / INVENTORY / MASTER_DATA(账号资料)} executionEnabled: {type: boolean, nullable: true} publicationEnabled: {type: boolean, nullable: true} disabledReason: {type: string, nullable: true} nextScheduledAt: {type: string, format: date-time, nullable: true, description: 自动采集下一计划时刻;显式连续BUSINESS模式下销量为下个北京时间00点05分,库存沿仓库计划;执行被禁用时为空,不代表当前任务预计完成时间} observedAt: {type: string, format: date-time, nullable: true} initialFrom: {type: string, format: date-time, nullable: true} initialUntil: {type: string, format: date-time, nullable: true} initialCoverageStatus: {type: string, nullable: true} salesCoveredFrom: {type: string, format: date-time, nullable: true} salesCoveredUntil: {type: string, format: date-time, nullable: true} lastSuccessfulTaskNo: {type: string, nullable: true} lastSucceededAt: {type: string, format: date-time, nullable: true} lastPublishedAt: {type: string, format: date-time, nullable: true} inventoryObservedFrom: {type: string, format: date-time, nullable: true} inventoryObservedUntil: {type: string, format: date-time, nullable: true} dataFreshness: {type: string, nullable: true} rebuildRequired: {type: boolean, nullable: true} revisionReviewStatus: {type: string, nullable: true} inventoryDailySamples: {$ref: '#/components/schemas/InventoryDailySamples'} currentTask: {$ref: '#/components/schemas/Task'} activeTasks: type: array maxItems: 8 description: 本仓本类型活动或等待任务,RUNNING优先,再按创建时间倒序;currentTask取活动首项,无活动时取最近任务。 items: {$ref: '#/components/schemas/Task'} sharedUpstream: {$ref: '#/components/schemas/Task'} protection: {$ref: '#/components/schemas/Protection'} Overview: type: object properties: sourceAccount: {type: string, nullable: true} environmentLabel: {type: string, nullable: true} collectionMode: {type: string, nullable: true} observedAt: {type: string, format: date-time, nullable: true} warehouses: {type: array, items: {$ref: '#/components/schemas/Warehouse'}} accountActivity: allOf: [{$ref: '#/components/schemas/Task'}] nullable: true description: 来源账号明确活动指针指向的正式采集任务,独立展示,不代表任一仓库的依赖或数量。 Progress: type: object properties: progressScope: {type: string, nullable: true} countBasis: {type: string, nullable: true} attemptNo: {type: string, nullable: true} scanRound: {type: string, nullable: true} phase: {type: string, nullable: true, description: 资料同步使用 CUSTOMERS / PRODUCTS;其他阶段不变} completed: {type: string, nullable: true} total: {type: string, nullable: true} totalKnown: {type: boolean, nullable: true} unit: {type: string, nullable: true} sliceFrom: {type: string, format: date-time, nullable: true} sliceUntil: {type: string, format: date-time, nullable: true} stageStartedAt: {type: string, format: date-time, nullable: true} stageFinishedAt: {type: string, format: date-time, nullable: true} validationState: {type: string, nullable: true} invalidCount: {type: string, nullable: true} unknownCount: {type: string, nullable: true} pendingReviewCount: {type: string, nullable: true} countUnit: {type: string, nullable: true} summaryAsOf: {type: string, format: date-time, nullable: true} directoryComplete: {type: boolean, nullable: true} stages: {type: array, items: {$ref: '#/components/schemas/Progress'}} SalesPage: type: object properties: context: {$ref: '#/components/schemas/Context'} records: {type: array, items: {$ref: '#/components/schemas/SalesSummary'}} current: {type: integer, nullable: true} size: {type: integer, nullable: true} total: {type: string, nullable: true} pages: {type: string, nullable: true} excludedReasons: {type: object, additionalProperties: {type: string, nullable: true}} MetricPage: type: object properties: context: {$ref: '#/components/schemas/Context'} records: {type: array, items: {$ref: '#/components/schemas/Metric'}} current: {type: integer, nullable: true} size: {type: integer, nullable: true} total: {type: string, nullable: true} pages: {type: string, nullable: true} excludedReasons: {type: object, additionalProperties: {type: string, nullable: true}} InventoryMetricPage: type: object properties: context: {$ref: '#/components/schemas/Context'} records: {type: array, items: {$ref: '#/components/schemas/InventoryMetric'}} current: {type: integer, nullable: true} size: {type: integer, nullable: true} total: {type: string, nullable: true} pages: {type: string, nullable: true} excludedReasons: {type: object, additionalProperties: {type: string, nullable: true}} TaskPage: type: object properties: records: {type: array, items: {$ref: '#/components/schemas/Task'}} current: {type: integer, nullable: true} size: {type: integer, nullable: true} total: {type: string, nullable: true} listUpperCreatedAt: {type: string, format: date-time, nullable: true} listUpperId: {type: string, nullable: true} observedAt: {type: string, format: date-time, nullable: true} AttemptPage: type: object properties: records: {type: array, items: {$ref: '#/components/schemas/Attempt'}} current: {type: integer, nullable: true} size: {type: integer, nullable: true} total: {type: string, nullable: true} listUpperCreatedAt: {type: string, format: date-time, nullable: true} listUpperId: {type: string, nullable: true} observedAt: {type: string, format: date-time, nullable: true}