feat: complete overseas customer and PDA workflows
This commit is contained in:
@@ -75,33 +75,70 @@ paths:
|
||||
- { name: page, in: query, schema: { type: integer, minimum: 1, default: 1 } }
|
||||
- { name: size, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 20 } }
|
||||
- { name: status, in: query, schema: { type: string, enum: [IN_PROGRESS, SUBMITTED] } }
|
||||
responses: { '200': { description: 盘点任务分页 } }
|
||||
responses:
|
||||
'200': { description: 盘点任务分页, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeSummaryPageResponse' } } } }
|
||||
post:
|
||||
summary: 按库位或托盘创建盘点任务
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeCreate' } } } }
|
||||
responses: { '200': { description: 创建后的完整盘点任务 } }
|
||||
responses:
|
||||
'200': { description: 创建后的完整盘点任务, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeDetailResponse' } } } }
|
||||
/api/pda/v1/last-leg/stocktakes/{taskNo}:
|
||||
get:
|
||||
summary: 查询盘点任务详情
|
||||
parameters: [{ name: taskNo, in: path, required: true, schema: { type: string } }]
|
||||
responses: { '200': { description: 盘点任务及冻结库存位置 } }
|
||||
responses:
|
||||
'200': { description: 盘点任务及冻结库存位置, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeDetailResponse' } } } }
|
||||
/api/pda/v1/last-leg/stocktakes/{taskNo}/counts:
|
||||
post:
|
||||
summary: 提交一个库存位置的实盘箱数
|
||||
parameters: [{ name: taskNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeCount' } } } }
|
||||
responses: { '200': { description: 已计数明细 }, '409': { description: 版本或幂等冲突 } }
|
||||
responses:
|
||||
'200': { description: 已计数明细, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeItemResponse' } } } }
|
||||
'409': { description: 版本或幂等冲突 }
|
||||
/api/pda/v1/last-leg/stocktakes/{taskNo}/submit:
|
||||
post:
|
||||
summary: 提交盘点并按差异调整库存
|
||||
parameters: [{ name: taskNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeSubmit' } } } }
|
||||
responses: { '200': { description: 已提交盘点任务 }, '409': { description: 未全盘、库存版本变化或负库存风险 } }
|
||||
responses:
|
||||
'200': { description: 已提交盘点任务, content: { application/json: { schema: { $ref: '#/components/schemas/StocktakeDetailResponse' } } } }
|
||||
'409': { description: 未全盘、库存版本变化或负库存风险 }
|
||||
/api/pda/v1/last-leg/inventory-moves:
|
||||
post:
|
||||
summary: 同仓整托移库
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/InventoryMove' } } } }
|
||||
responses: { '200': { description: 移库结果 }, '409': { description: 跨仓、资源或库存版本冲突 } }
|
||||
responses:
|
||||
'200': { description: 移库结果, content: { application/json: { schema: { $ref: '#/components/schemas/InventoryMoveResponse' } } } }
|
||||
'409': { description: 跨仓、资源或库存版本冲突 }
|
||||
/api/pda/v1/last-leg/inventory/resolve:
|
||||
post:
|
||||
summary: 扫码查询Token绑定仓库存
|
||||
description: 支持箱唛、SKU、入仓码、托盘码或库位码;不接收customerId或warehouseId。
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/ScanCode' } } } }
|
||||
responses:
|
||||
'200': { description: 匹配的库存位置列表, content: { application/json: { schema: { $ref: '#/components/schemas/InventoryScanResponse' } } } }
|
||||
/api/pda/v1/last-leg/locations/resolve:
|
||||
post:
|
||||
summary: 扫码查询Token绑定仓库位
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/ScanCode' } } } }
|
||||
responses:
|
||||
'200': { description: 库位及占用摘要, content: { application/json: { schema: { $ref: '#/components/schemas/LocationResponse' } } } }
|
||||
/api/pda/v1/last-leg/pallets/resolve:
|
||||
post:
|
||||
summary: 扫码查询Token绑定仓托盘
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/ScanCode' } } } }
|
||||
responses:
|
||||
'200': { description: 托盘及其库存内容, content: { application/json: { schema: { $ref: '#/components/schemas/PalletResponse' } } } }
|
||||
/api/pda/v1/last-leg/operations:
|
||||
get:
|
||||
summary: 查询当前操作人的仓内操作历史
|
||||
parameters:
|
||||
- { name: page, in: query, schema: { type: integer, minimum: 1, default: 1 } }
|
||||
- { name: size, in: query, schema: { type: integer, minimum: 1, maximum: 200, default: 20 } }
|
||||
- { name: operationType, in: query, required: false, schema: { type: string } }
|
||||
responses:
|
||||
'200': { description: 当前Token绑定仓及操作人的历史分页, content: { application/json: { schema: { $ref: '#/components/schemas/OperationPageResponse' } } } }
|
||||
/api/pda/v1/last-leg/pallet-operations/pallets/resolve:
|
||||
post:
|
||||
summary: 扫码查询托盘及库存内容
|
||||
@@ -130,58 +167,355 @@ paths:
|
||||
/api/pda/v1/last-leg/relabel-tasks/candidates:
|
||||
get:
|
||||
summary: 查询Token绑定仓可执行换标任务
|
||||
responses: { '200': { description: 待认领、处理中或待复核换标任务 } }
|
||||
responses:
|
||||
'200': { description: 待认领、处理中或待复核换标任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelCandidatesResponse' } } } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}:
|
||||
get:
|
||||
summary: 查询换标现场任务详情
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
responses: { '200': { description: 申请明细、逐件事实、照片与历史 } }
|
||||
responses:
|
||||
'200': { description: 申请明细、逐件事实、照片与历史, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/claim:
|
||||
post:
|
||||
summary: 认领换标任务并推进申请至处理中
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/IdempotentAction' } } } }
|
||||
responses: { '200': { description: 已认领任务 }, '409': { description: 仓库、状态或幂等冲突 } }
|
||||
responses: { '200': { description: 已认领任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } }, '409': { description: 仓库、状态或幂等冲突 } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/units:
|
||||
post:
|
||||
summary: 登记一件正常换标事实
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelUnit' } } } }
|
||||
responses: { '200': { description: 更新后的任务 }, '409': { description: 旧标重复、新标不符或版本冲突 } }
|
||||
responses: { '200': { description: 更新后的任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } }, '409': { description: 旧标重复、新标不符或版本冲突 } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/units/skip:
|
||||
post:
|
||||
summary: 登记一件有原因的跳过事实
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelSkip' } } } }
|
||||
responses: { '200': { description: 更新后的任务 } }
|
||||
responses: { '200': { description: 更新后的任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/exceptions:
|
||||
post:
|
||||
summary: 登记一件换标异常事实
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelException' } } } }
|
||||
responses: { '200': { description: 更新后的任务 } }
|
||||
responses: { '200': { description: 更新后的任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/photos/files:
|
||||
post:
|
||||
summary: 上传换标完成现场照片
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { multipart/form-data: { schema: { type: object, required: [file], properties: { file: { type: string, format: binary } } } } } }
|
||||
responses: { '200': { description: OVERSEAS_RELABEL_PHOTO文件元数据 } }
|
||||
responses: { '200': { description: OVERSEAS_RELABEL_PHOTO文件元数据, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelPhotoResponse' } } } } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/complete:
|
||||
post:
|
||||
summary: 提交现场任务等待复核,不提前完成申请
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelComplete' } } } }
|
||||
responses: { '200': { description: WAIT_REVIEW任务 }, '409': { description: 箱数未核平、照片或版本冲突 } }
|
||||
responses: { '200': { description: WAIT_REVIEW任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } }, '409': { description: 箱数未核平、照片或版本冲突 } }
|
||||
/api/pda/v1/last-leg/relabel-tasks/{relabelNo}/review:
|
||||
post:
|
||||
summary: 现场复核;APPROVE才完成既有换标申请,REWORK退回处理
|
||||
parameters: [{ name: relabelNo, in: path, required: true, schema: { type: string } }]
|
||||
requestBody: { required: true, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelReview' } } } }
|
||||
responses: { '200': { description: COMPLETED或PROCESSING任务 }, '409': { description: 状态或版本冲突 } }
|
||||
responses: { '200': { description: COMPLETED或PROCESSING任务, content: { application/json: { schema: { $ref: '#/components/schemas/RelabelDetailResponse' } } } }, '409': { description: 状态或版本冲突 } }
|
||||
components:
|
||||
securitySchemes:
|
||||
bearerAuth: { type: http, scheme: bearer, bearerFormat: JWT }
|
||||
schemas:
|
||||
ApiResponse:
|
||||
type: object
|
||||
required: [code, data]
|
||||
properties:
|
||||
code: { type: string, example: '200' }
|
||||
message: { type: string, nullable: true }
|
||||
data: { nullable: true }
|
||||
requestId: { type: string, nullable: true }
|
||||
traceId: { type: string, nullable: true }
|
||||
timestamp: { type: string, format: date-time, nullable: true }
|
||||
StocktakeSummaryPageResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/StocktakeSummaryPage' } }
|
||||
StocktakeDetailResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/StocktakeDetail' } }
|
||||
StocktakeItemResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/StocktakeItem' } }
|
||||
InventoryMoveResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/InventoryMoveResult' } }
|
||||
InventoryScanResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/InventoryScan' } }
|
||||
LocationResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/WarehouseLocation' } }
|
||||
PalletResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/WarehousePallet' } }
|
||||
OperationPageResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/OperationPage' } }
|
||||
RelabelCandidatesResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties:
|
||||
data: { type: array, items: { $ref: '#/components/schemas/RelabelCandidate' } }
|
||||
RelabelDetailResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/RelabelDetail' } }
|
||||
RelabelPhotoResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiResponse' }
|
||||
- type: object
|
||||
properties: { data: { $ref: '#/components/schemas/RelabelPhoto' } }
|
||||
StocktakeSummaryPage:
|
||||
type: object
|
||||
required: [records, page, size, total, pages]
|
||||
properties:
|
||||
records: { type: array, items: { $ref: '#/components/schemas/StocktakeSummary' } }
|
||||
page: { type: integer, format: int64 }
|
||||
size: { type: integer, format: int64 }
|
||||
total: { type: integer, format: int64 }
|
||||
pages: { type: integer, format: int64 }
|
||||
StocktakeSummary:
|
||||
type: object
|
||||
required: [taskNo, scopeType, scopeCode, status, positionCount, countedCount, differenceCount, version, createdAt]
|
||||
properties:
|
||||
taskNo: { type: string }
|
||||
scopeType: { type: string, enum: [LOCATION, PALLET] }
|
||||
scopeCode: { type: string }
|
||||
status: { type: string, enum: [IN_PROGRESS, SUBMITTED] }
|
||||
positionCount: { type: integer }
|
||||
countedCount: { type: integer }
|
||||
differenceCount: { type: integer }
|
||||
version: { type: integer, format: int64 }
|
||||
createdAt: { type: string, format: date-time }
|
||||
submittedAt: { type: string, format: date-time, nullable: true }
|
||||
StocktakeItem:
|
||||
type: object
|
||||
required: [itemId, customerId, balanceId, positionId, skuCode, inboundCode, palletId, palletCode, locationId, locationCode, bookPackages, status, positionVersion, version]
|
||||
properties:
|
||||
itemId: { type: string, pattern: '^[0-9]+$' }
|
||||
customerId: { type: string }
|
||||
balanceId: { type: string, pattern: '^[0-9]+$' }
|
||||
positionId: { type: string, pattern: '^[0-9]+$' }
|
||||
skuCode: { type: string }
|
||||
productName: { type: string, nullable: true }
|
||||
inboundCode: { type: string }
|
||||
palletId: { type: string, pattern: '^[0-9]+$' }
|
||||
palletCode: { type: string }
|
||||
locationId: { type: string, pattern: '^[0-9]+$' }
|
||||
locationCode: { type: string }
|
||||
bookPackages: { type: integer, format: int64 }
|
||||
actualPackages: { type: integer, format: int64, nullable: true }
|
||||
differencePackages: { type: integer, format: int64, nullable: true }
|
||||
status: { type: string }
|
||||
positionVersion: { type: integer, format: int64 }
|
||||
version: { type: integer, format: int64 }
|
||||
StocktakeDetail:
|
||||
type: object
|
||||
required: [task, items]
|
||||
properties:
|
||||
task: { $ref: '#/components/schemas/StocktakeSummary' }
|
||||
items: { type: array, items: { $ref: '#/components/schemas/StocktakeItem' } }
|
||||
InventoryMoveResult:
|
||||
type: object
|
||||
required: [moveNo, palletId, palletCode, sourceLocationId, sourceLocationCode, targetLocationId, targetLocationCode, customerCount, positionCount, packageCount, palletVersion, status, completedAt, replayed]
|
||||
properties:
|
||||
moveNo: { type: string }
|
||||
palletId: { type: string, pattern: '^[0-9]+$' }
|
||||
palletCode: { type: string }
|
||||
sourceLocationId: { type: string, pattern: '^[0-9]+$' }
|
||||
sourceLocationCode: { type: string }
|
||||
targetLocationId: { type: string, pattern: '^[0-9]+$' }
|
||||
targetLocationCode: { type: string }
|
||||
customerCount: { type: integer }
|
||||
positionCount: { type: integer }
|
||||
packageCount: { type: integer, format: int64 }
|
||||
palletVersion: { type: integer }
|
||||
status: { type: string }
|
||||
completedAt: { type: string, format: date-time }
|
||||
replayed: { type: boolean }
|
||||
InventoryScan:
|
||||
type: object
|
||||
required: [queryCode, items]
|
||||
properties:
|
||||
queryCode: { type: string }
|
||||
items: { type: array, items: { $ref: '#/components/schemas/InventoryItem' } }
|
||||
InventoryItem:
|
||||
type: object
|
||||
required: [customerId, balanceId, positionId, skuCode, inboundCode, palletId, palletCode, availablePackages, holdPackages, receivingPackages, status, version]
|
||||
properties:
|
||||
customerId: { type: string }
|
||||
customerName: { type: string, nullable: true }
|
||||
balanceId: { type: string, pattern: '^[0-9]+$' }
|
||||
positionId: { type: string, pattern: '^[0-9]+$' }
|
||||
skuCode: { type: string }
|
||||
productName: { type: string, nullable: true }
|
||||
inboundCode: { type: string }
|
||||
cartonMark: { type: string, nullable: true }
|
||||
palletId: { type: string, pattern: '^[0-9]+$' }
|
||||
palletCode: { type: string }
|
||||
locationId: { type: string, pattern: '^[0-9]+$', nullable: true }
|
||||
locationCode: { type: string, nullable: true }
|
||||
availablePackages: { type: integer, format: int64 }
|
||||
holdPackages: { type: integer, format: int64 }
|
||||
receivingPackages: { type: integer, format: int64 }
|
||||
status: { type: string }
|
||||
version: { type: integer, format: int64 }
|
||||
WarehouseLocation:
|
||||
type: object
|
||||
required: [locationId, locationCode, locationType, status, occupiedPackages, inventoryPositionCount]
|
||||
properties:
|
||||
locationId: { type: string, pattern: '^[0-9]+$' }
|
||||
locationCode: { type: string }
|
||||
locationType: { type: string }
|
||||
maxLoadKg: { type: number, nullable: true }
|
||||
status: { type: string }
|
||||
occupiedPackages: { type: integer, format: int64 }
|
||||
inventoryPositionCount: { type: integer }
|
||||
WarehousePallet:
|
||||
type: object
|
||||
required: [palletId, palletCode, status, version, locationId, locationCode, occupiedPackages, inventoryPositionCount, inventory]
|
||||
properties:
|
||||
palletId: { type: string, pattern: '^[0-9]+$' }
|
||||
palletCode: { type: string }
|
||||
status: { type: string }
|
||||
version: { type: integer }
|
||||
locationId: { type: string, pattern: '^[0-9]+$' }
|
||||
locationCode: { type: string }
|
||||
occupiedPackages: { type: integer, format: int64 }
|
||||
inventoryPositionCount: { type: integer }
|
||||
inventory: { type: array, items: { $ref: '#/components/schemas/InventoryItem' } }
|
||||
OperationPage:
|
||||
type: object
|
||||
required: [records, page, size, total, pages]
|
||||
properties:
|
||||
records: { type: array, items: { $ref: '#/components/schemas/WarehouseOperation' } }
|
||||
page: { type: integer, format: int64 }
|
||||
size: { type: integer, format: int64 }
|
||||
total: { type: integer, format: int64 }
|
||||
pages: { type: integer, format: int64 }
|
||||
WarehouseOperation:
|
||||
type: object
|
||||
required: [operationId, operationType, businessKey, status, occurredAt]
|
||||
properties:
|
||||
operationId: { type: string, pattern: '^[0-9]+$' }
|
||||
operationType: { type: string }
|
||||
businessKey: { type: string }
|
||||
status: { type: string }
|
||||
summary: { type: string, nullable: true }
|
||||
customerId: { type: string, nullable: true }
|
||||
occurredAt: { type: string, format: date-time }
|
||||
RelabelCandidate:
|
||||
type: object
|
||||
required: [relabelNo, applicationStatus, taskStatus, itemCount, expectedPackages, relabelledPackages, skippedPackages, exceptionPackages, version, claimedByCurrentOperator]
|
||||
properties:
|
||||
relabelNo: { type: string }
|
||||
customerOrderNo: { type: string, nullable: true }
|
||||
labelDeadline: { type: string, format: date-time, nullable: true }
|
||||
applicationStatus: { type: string }
|
||||
taskStatus: { type: string }
|
||||
itemCount: { type: integer }
|
||||
expectedPackages: { type: integer }
|
||||
relabelledPackages: { type: integer }
|
||||
skippedPackages: { type: integer }
|
||||
exceptionPackages: { type: integer }
|
||||
version: { type: integer }
|
||||
claimedByCurrentOperator: { type: boolean }
|
||||
RelabelDetail:
|
||||
type: object
|
||||
required: [relabelNo, applicationStatus, taskStatus, expectedPackages, relabelledPackages, skippedPackages, exceptionPackages, version, completionPhotoFileIds, items, unitFacts, history]
|
||||
properties:
|
||||
relabelNo: { type: string }
|
||||
customerOrderNo: { type: string, nullable: true }
|
||||
labelDeadline: { type: string, format: date-time, nullable: true }
|
||||
contactName: { type: string, nullable: true }
|
||||
contactPhone: { type: string, nullable: true }
|
||||
applicationStatus: { type: string }
|
||||
taskStatus: { type: string }
|
||||
expectedPackages: { type: integer }
|
||||
relabelledPackages: { type: integer }
|
||||
skippedPackages: { type: integer }
|
||||
exceptionPackages: { type: integer }
|
||||
version: { type: integer }
|
||||
operatorName: { type: string, nullable: true }
|
||||
reviewerName: { type: string, nullable: true }
|
||||
completionPhotoFileIds: { type: array, items: { type: string, pattern: '^[0-9]+$' } }
|
||||
completionRemark: { type: string, nullable: true }
|
||||
reviewDecision: { type: string, nullable: true }
|
||||
reviewRemark: { type: string, nullable: true }
|
||||
claimedAt: { type: string, format: date-time, nullable: true }
|
||||
submittedAt: { type: string, format: date-time, nullable: true }
|
||||
reviewedAt: { type: string, format: date-time, nullable: true }
|
||||
items: { type: array, items: { $ref: '#/components/schemas/RelabelItem' } }
|
||||
unitFacts: { type: array, items: { $ref: '#/components/schemas/RelabelUnitFact' } }
|
||||
history: { type: array, items: { $ref: '#/components/schemas/RelabelHistory' } }
|
||||
RelabelItem:
|
||||
type: object
|
||||
properties:
|
||||
itemId: { type: string, pattern: '^[0-9]+$' }
|
||||
skuCode: { type: string, nullable: true }
|
||||
productNameZh: { type: string, nullable: true }
|
||||
shipmentNo: { type: string, nullable: true }
|
||||
trackingCode: { type: string, nullable: true }
|
||||
newSkuCode: { type: string, nullable: true }
|
||||
labelRequirement: { type: string, nullable: true }
|
||||
relabelFileId: { type: string, nullable: true }
|
||||
relabelFileName: { type: string, nullable: true }
|
||||
relabelFileUrl: { type: string, nullable: true }
|
||||
expectedPackages: { type: integer }
|
||||
relabelledPackages: { type: integer }
|
||||
skippedPackages: { type: integer }
|
||||
exceptionPackages: { type: integer }
|
||||
RelabelUnitFact:
|
||||
type: object
|
||||
properties:
|
||||
factId: { type: string, pattern: '^[0-9]+$' }
|
||||
itemId: { type: string, pattern: '^[0-9]+$' }
|
||||
oldLabel: { type: string, nullable: true }
|
||||
newLabel: { type: string, nullable: true }
|
||||
result: { type: string }
|
||||
exceptionCode: { type: string, nullable: true }
|
||||
reason: { type: string, nullable: true }
|
||||
operatorName: { type: string, nullable: true }
|
||||
occurredAt: { type: string, format: date-time }
|
||||
RelabelHistory:
|
||||
type: object
|
||||
properties:
|
||||
action: { type: string }
|
||||
fromStatus: { type: string, nullable: true }
|
||||
toStatus: { type: string, nullable: true }
|
||||
operatorName: { type: string, nullable: true }
|
||||
detail: { type: string, nullable: true }
|
||||
createdAt: { type: string, format: date-time }
|
||||
RelabelPhoto:
|
||||
type: object
|
||||
required: [fileId, fileName, contentType, sizeBytes]
|
||||
properties:
|
||||
fileId: { type: string, pattern: '^[0-9]+$' }
|
||||
fileName: { type: string }
|
||||
contentType: { type: string }
|
||||
sizeBytes: { type: integer, format: int64 }
|
||||
ScanCode:
|
||||
type: object
|
||||
required: [code]
|
||||
|
||||
Reference in New Issue
Block a user