diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index b1fb48862..38bf980aa 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -5365,7 +5365,7 @@ CREATE TABLE IF NOT EXISTS fl_loading_pick_task ( container_booking_id BIGINT UNSIGNED NOT NULL COMMENT '稳定柜次ID', cabinet_no VARCHAR(64) NOT NULL COMMENT '稳定内部柜次号快照', container_no VARCHAR(64) NULL COMMENT '废弃兼容字段;不得作为任务身份或随运输号变更重写', - task_status VARCHAR(16) NOT NULL DEFAULT 'LOADING' COMMENT 'PDA任务状态:LOADING拣货装柜中、COMPLETED已完成', + task_status VARCHAR(24) NOT NULL DEFAULT 'LOADING' COMMENT 'PDA任务状态:LOADING、COMPLETING、COMPLETION_FAILED、COMPLETED', started_by BIGINT UNSIGNED NOT NULL COMMENT '开始装柜人', started_by_name VARCHAR(64) NULL COMMENT '开始装柜人名称', started_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '开始时间', @@ -5378,7 +5378,7 @@ CREATE TABLE IF NOT EXISTS fl_loading_pick_task ( UNIQUE KEY uk_loading_pick_task_booking (container_booking_id), KEY idx_loading_pick_container (container_no, task_status, started_at), CONSTRAINT fk_loading_pick_task_plan FOREIGN KEY (loading_plan_id) REFERENCES fl_loading_plan (id), - CONSTRAINT chk_loading_pick_task_status CHECK (task_status IN ('LOADING', 'COMPLETED')) + CONSTRAINT chk_loading_pick_task_status CHECK (task_status IN ('LOADING','COMPLETING','COMPLETION_FAILED','COMPLETED')) ) ENGINE=InnoDB COMMENT='PDA装柜拣货任务'; CREATE TABLE IF NOT EXISTS fl_loading_pick_item ( @@ -13768,7 +13768,7 @@ CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'loading_pl CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'started_at', '开始时间'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'started_by', '开始装柜人'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'started_by_name', '开始装柜人名称'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'task_status', 'PDA任务状态:LOADING拣货装柜中、COMPLETED已完成'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'task_status', 'PDA任务状态:LOADING、COMPLETING、COMPLETION_FAILED、COMPLETED'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_pick_task', 'version', '乐观锁版本号'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_plan', 'confirmed_at', '确认时间'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_plan', 'confirmed_by', '确认操作人ID'); @@ -16514,24 +16514,39 @@ ALTER TABLE fl_loading_pick_task ADD CONSTRAINT chk_loading_pick_task_status CHECK (task_status IN ('LOADING','COMPLETING','COMPLETION_FAILED','COMPLETED')); CREATE TABLE IF NOT EXISTS fl_loading_completion_command ( - id BIGINT UNSIGNED NOT NULL,pick_task_id BIGINT UNSIGNED NOT NULL,operation_id VARCHAR(128) NOT NULL, - request_hash CHAR(64) NOT NULL,command_status VARCHAR(16) NOT NULL,expected_task_version INT UNSIGNED NOT NULL, - remark VARCHAR(500) NULL,operator_id BIGINT UNSIGNED NOT NULL,operator_name VARCHAR(64) NULL, - attempt_count INT UNSIGNED NOT NULL DEFAULT 0,next_retry_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - lease_owner VARCHAR(128) NULL,lease_until DATETIME(3) NULL,failure_stage VARCHAR(40) NULL, - failure_code VARCHAR(32) NULL,failure_request_id VARCHAR(64) NULL,failure_trace_id VARCHAR(64) NULL, - created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),completed_at DATETIME(3) NULL, + id BIGINT UNSIGNED NOT NULL COMMENT '可靠装柜完成命令ID', + pick_task_id BIGINT UNSIGNED NOT NULL COMMENT '关联PDA任务ID', + operation_id VARCHAR(128) NOT NULL COMMENT '客户端全局幂等操作ID', + request_hash CHAR(64) NOT NULL COMMENT '规范化请求摘要', + command_status VARCHAR(16) NOT NULL COMMENT '命令状态', + expected_task_version INT UNSIGNED NOT NULL COMMENT '受理时客户端任务版本', + remark VARCHAR(500) NULL COMMENT '装柜完成备注', + operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', + operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', + attempt_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '后台认领次数', + next_retry_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '下次允许处理时间', + lease_owner VARCHAR(128) NULL COMMENT '后台租约持有者', + lease_until DATETIME(3) NULL COMMENT '后台租约截止时间', + failure_stage VARCHAR(40) NULL COMMENT '脱敏失败阶段', + failure_code VARCHAR(32) NULL COMMENT '业务或下游错误码', + failure_request_id VARCHAR(64) NULL COMMENT '下游请求ID', + failure_trace_id VARCHAR(64) NULL COMMENT '下游链路ID', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '命令创建时间', + updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '命令更新时间', + completed_at DATETIME(3) NULL COMMENT '命令完成时间', PRIMARY KEY(id),UNIQUE KEY uk_loading_completion_operation(operation_id), KEY idx_loading_completion_dispatch(command_status,next_retry_at,lease_until), CONSTRAINT fk_loading_completion_task FOREIGN KEY(pick_task_id) REFERENCES fl_loading_pick_task(id), CONSTRAINT chk_loading_completion_status CHECK(command_status IN ('PROCESSING','RETRYABLE','FAILED','COMPLETED')) ) ENGINE=InnoDB COMMENT='PDA装柜完成可靠异步命令'; CREATE TABLE IF NOT EXISTS fl_loading_completion_checkpoint ( - command_id BIGINT UNSIGNED NOT NULL,tenant_id BIGINT UNSIGNED NOT NULL,inbound_id BIGINT UNSIGNED NOT NULL, - owner_sequence INT UNSIGNED NOT NULL,checkpoint_stage VARCHAR(24) NOT NULL, - created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + command_id BIGINT UNSIGNED NOT NULL COMMENT '可靠装柜完成命令ID', + tenant_id BIGINT UNSIGNED NOT NULL COMMENT '入库单客户ID', + inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', + owner_sequence INT UNSIGNED NOT NULL COMMENT '稳定处理顺序', + checkpoint_stage VARCHAR(24) NOT NULL COMMENT '入库单处理检查点', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '检查点创建时间', + updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '检查点更新时间', PRIMARY KEY(command_id,tenant_id,inbound_id),KEY idx_loading_completion_owner(command_id,owner_sequence), CONSTRAINT fk_loading_completion_checkpoint_command FOREIGN KEY(command_id) REFERENCES fl_loading_completion_command(id), CONSTRAINT chk_loading_completion_checkpoint CHECK(checkpoint_stage IN ('READY','SETTLED','INBOUND_COMPLETED')) diff --git a/firstleg/src/test/java/com/baiyue/firstleg/controller/PdaConvergenceOpenApiContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/controller/PdaConvergenceOpenApiContractTest.java index 73c577614..8c12b1d03 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/controller/PdaConvergenceOpenApiContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/controller/PdaConvergenceOpenApiContractTest.java @@ -39,7 +39,8 @@ class PdaConvergenceOpenApiContractTest { .contains("sourceType", "recordStatus", "mergedIntoContainerBookingId") .contains("Task detail is served only from the ACTIVE container booking") .contains("Enforced by the server-side pending-task query") - .contains("assigned LOADING tasks with pendingItemCount=0 remain visible as AWAITING_REVIEW") + .contains("completion acceptance is returned immediately as PROCESSING") + .contains("taskStatus=COMPLETING且workflowStatus=PROCESSING") .contains("CompleteLoadingRequest"); String taskLookup = yaml.substring( diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickPdaTaskSqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickPdaTaskSqlContractTest.java index 91576c639..591eeefcc 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickPdaTaskSqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickPdaTaskSqlContractTest.java @@ -27,12 +27,14 @@ class LoadingPickPdaTaskSqlContractTest { .getAnnotation(Select.class).value()[0]; assertThat(sql) - .contains("task.task_status = 'LOADING'") + .contains("task.task_status IN ('LOADING','COMPLETING','COMPLETION_FAILED')") .contains("booking.record_status = 'ACTIVE'") .contains("booking.source_type AS sourceType") .contains("booking.record_status AS recordStatus") .contains("booking.merged_into_container_booking_id AS mergedIntoContainerBookingId") .contains("WHEN task.task_status = 'COMPLETED' THEN 'COMPLETED'") + .contains("WHEN task.task_status = 'COMPLETING' THEN 'PROCESSING'") + .contains("WHEN task.task_status = 'COMPLETION_FAILED' THEN 'COMPLETION_FAILED'") .contains("WHEN assignment.pick_task_id IS NULL THEN 'UNASSIGNED'") .contains("pick_item.item_status IN ('PENDING', 'PICKING')") .contains("THEN 'AWAITING_REVIEW'")