feat(wms): add controlled three-channel mixed-storage pilot

This commit is contained in:
zgw
2026-09-10 16:03:20 +08:00
parent 63ed8f72b1
commit ae7f8c08f4
11 changed files with 1001 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
SET NOCOUNT ON;
DECLARE @r int,@m varchar(255),@job varchar(255),@n int;
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r<>2 OR EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='IN-NEW' AND cargo_space_id IS NOT NULL)
THROW 51900,'Disabled pilot must preserve Legacy no-position behavior',1;
UPDATE mixed_pilot.control SET enabled=1,all_projects_may_mix=1 WHERE id=1;
UPDATE mixed_pilot.lane SET enabled=1,physical_fit_confirmed=1 WHERE lane_code='C1203';
-- An ordinary same-project position must win before mixed fallback.
INSERT dbo.bas_cargo_space(cargo_space_id,warehouse_id,the_floor,the_platoon,the_column,group_coding_no,group_coding,this_cargo_area,status,locked,tray_code)
VALUES('110801','01',1,11,8,'C1101','1','C','2','N','SAME'),('110701','01',1,11,7,'C1101','2','C','1','N',NULL);
INSERT dbo.bas_stock(stock_id,cargo_space_id,tray_code,spare4,spare1,spare2,spare3,quantity,out_quantity)
VALUES('SAME-S','110801','SAME','NEW','D','E','F',1,0);
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r<>10 OR NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='IN-NEW' AND cargo_space_id='110701')
THROW 51901,'Normal Legacy allocation must have priority',1;
UPDATE dbo.mydo_job SET cargo_space_id=NULL,status='1' WHERE job_id='IN-NEW';
DELETE dbo.bas_stock WHERE stock_id='SAME-S';
DELETE dbo.bas_cargo_space WHERE group_coding_no='C1101';
-- No physical confirmation, missing E capacity, ambiguity and common-project input fail closed.
UPDATE mixed_pilot.lane SET physical_fit_confirmed=0 WHERE lane_code='C1203';
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r=10 THROW 51902,'Unconfirmed physical fit must not admit mixed pallet',1;
UPDATE mixed_pilot.lane SET physical_fit_confirmed=1 WHERE lane_code='C1203';
UPDATE dbo.bas_cargo_space SET locked='Y' WHERE this_cargo_area='E';
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r=10 THROW 51903,'No same-floor E capacity must not admit mixed pallet',1;
UPDATE dbo.bas_cargo_space SET locked='N' WHERE this_cargo_area='E';
UPDATE dbo.mydo_job_detail SET spare4='WRONG' WHERE job_id='IN-NEW';
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r=10 THROW 51904,'Header/detail project mismatch must be rejected',1;
UPDATE dbo.mydo_job_detail SET spare4='NEW' WHERE job_id='IN-NEW';
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r<>10 OR NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='IN-NEW' AND cargo_space_id='120703' AND status='3')
THROW 51905,'Fallback must reserve only the designated outer position',1;
IF NOT EXISTS(SELECT 1 FROM dbo.bas_cargo_space WHERE cargo_space_id='120703' AND status='3')
THROW 51906,'Fallback must reserve slot and job together',1;
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r<>10 OR (SELECT COUNT(*) FROM mixed_pilot.admission)<>1
THROW 51907,'Repeated allocation must return same reservation without a second admission',1;
INSERT dbo.mydo_job(job_id,tray_code,warehouse_id,line_id,in_or_out,status,execution_phase,fault_flag)
VALUES('IN-THIRD','THIRD-TRAY','01','THIRD',1,'1','0','0');
INSERT dbo.mydo_job_detail(job_detail_id,job_id,spare4,spare1,spare2,spare3,in_quantity)
VALUES('IN-THIRD-1','IN-THIRD','THIRD','X','Y','Z',1);
EXEC dbo.proc_allot_space 'THIRD-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r=10 THROW 51908,'A third project or an already reserved front slot must be rejected',1;
-- Simulate a confirmed physical inbound completion (no WCS or HTTP is contacted).
INSERT dbo.bas_stock(stock_id,cargo_space_id,tray_code,spare4,spare1,spare2,spare3,quantity,out_quantity)
VALUES('GUEST-S','120703','NEW-TRAY','NEW','D','E','F',1,0);
UPDATE dbo.bas_cargo_space SET status='2',tray_code='NEW-TRAY' WHERE cargo_space_id='120703';
DELETE dbo.mydo_job WHERE job_id='IN-NEW';
-- Automatic allocation creates the blocker move before the rear job.
EXEC dbo.proc_yk_job_add '120703','130803','NEW-TRAY';
SELECT @job=job_id FROM dbo.mydo_job WHERE in_or_out=30 AND tray_code='NEW-TRAY';
UPDATE dbo.bas_cargo_space SET status='4' WHERE cargo_space_id='120803';
INSERT dbo.mydo_job(job_id,tray_code,cargo_space_id,class_id,in_or_out,status,execution_phase,task_no)
VALUES('OUT-REAR','RESIDENT','120803','3',21,'1','0',800001);
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR' AND status='8')
THROW 51909,'Blocked rear outbound must be held before the WMS scheduler can see it',1;
IF NOT EXISTS(SELECT 1 FROM mixed_pilot.dispatch_hold WHERE job_id='OUT-REAR' AND released_at IS NULL)
THROW 51910,'Held job must be diagnosable',1;
-- Occupied or wrong-floor destinations must not create a move or change inventory.
BEGIN TRY
EXEC dbo.proc_yk_job_add '120703','020704','NEW-TRAY';
THROW 51911,'Wrong-floor move was accepted',1;
END TRY BEGIN CATCH IF ERROR_NUMBER()=51911 THROW; END CATCH;
IF (SELECT COUNT(*) FROM dbo.mydo_job WHERE in_or_out=30)<>1
THROW 51912,'Rejected relocation must leave no partial task',1;
EXEC dbo.proc_yk_job_add '120703','130803','NEW-TRAY';
IF @job IS NULL OR NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id=@job AND status='1')
THROW 51913,'Outer relocation must remain dispatchable',1;
EXEC dbo.proc_yk_job_add '120703','130803','NEW-TRAY';
IF (SELECT COUNT(*) FROM dbo.mydo_job WHERE in_or_out=30)<>1
THROW 51914,'Repeated identical relocation must not duplicate tasks',1;
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR' AND status='8')
THROW 51915,'Creating a relocation is not physical completion',1;
-- Switch OFF while pallets are mixed: no new admissions, protection must remain.
UPDATE mixed_pilot.control SET enabled=0 WHERE id=1;
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR' AND status='8')
THROW 51916,'Disabling admission must not release blocked outbound',1;
EXEC dbo.proc_yk_complete @job,@r OUTPUT;
IF @r<>10 OR NOT EXISTS(SELECT 1 FROM dbo.bas_stock WHERE stock_id='GUEST-S' AND cargo_space_id='130803' AND spare4='NEW')
THROW 51917,'Move completion must preserve guest project ownership',1;
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR' AND status='1')
THROW 51918,'Rear outbound must be released only after confirmed front clearance',1;
SELECT @n=COUNT(*) FROM dbo.move_msg;
EXEC dbo.proc_yk_complete @job,@r OUTPUT;
IF @r<>10 OR (SELECT COUNT(*) FROM dbo.move_msg)<>@n
THROW 51919,'Duplicate move completion must not change stock or emit duplicate move messages',1;
-- Ordinary front outbound also blocks the rear until BOTH stock and job are cleared.
DELETE dbo.mydo_job WHERE job_id='OUT-REAR';
UPDATE dbo.bas_stock SET cargo_space_id='120703' WHERE stock_id='GUEST-S';
UPDATE dbo.bas_cargo_space SET status='2',tray_code='NEW-TRAY' WHERE cargo_space_id='120703';
INSERT dbo.mydo_job(job_id,tray_code,cargo_space_id,class_id,in_or_out,status,execution_phase,task_no)
VALUES('OUT-FRONT','NEW-TRAY','120703','3',21,'1','0',800002),('OUT-REAR2','RESIDENT','120803','3',21,'1','0',800003);
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-FRONT' AND status='1') OR NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR2' AND status='8')
THROW 51920,'Front may dispatch while blocked rear must wait',1;
UPDATE dbo.bas_cargo_space SET status='1',tray_code=NULL WHERE cargo_space_id='120703';
DELETE dbo.bas_stock WHERE stock_id='GUEST-S';
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR2' AND status='8')
THROW 51921,'An active front task must continue to block rear dispatch',1;
DELETE dbo.mydo_job WHERE job_id='OUT-FRONT';
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OUT-REAR2' AND status='1')
THROW 51922,'Final front task deletion must release waiting rear job',1;
-- Unlisted lanes must not be held by the pilot triggers.
INSERT dbo.mydo_job(job_id,tray_code,cargo_space_id,class_id,in_or_out,status,execution_phase,task_no)
VALUES('OTHER-OUT','OTHER-RESIDENT','080801','1',21,'1','0',800004);
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='OTHER-OUT' AND status='1')
THROW 51923,'Unlisted lanes must retain Legacy dispatch behavior',1;
-- Manual allocation must not strand a held task when no blocker move exists.
DELETE dbo.mydo_job WHERE job_id='OUT-REAR2';
UPDATE dbo.bas_cargo_space SET status='2',tray_code='NEW-TRAY' WHERE cargo_space_id='120703';
INSERT dbo.bas_stock(stock_id,cargo_space_id,tray_code,spare4,quantity,out_quantity)
VALUES('GUEST-AGAIN','120703','NEW-TRAY','NEW',1,0);
BEGIN TRY
INSERT dbo.mydo_job(job_id,tray_code,cargo_space_id,class_id,in_or_out,status,execution_phase,task_no)
VALUES('MANUAL-BLOCKED','RESIDENT','120803','3',21,'1','0',800005);
THROW 51924,'Manual blocked outbound was accepted without a blocker task',1;
END TRY BEGIN CATCH IF ERROR_NUMBER()=51924 THROW; END CATCH;
IF EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id='MANUAL-BLOCKED')
THROW 51925,'Rejected manual allocation must not leave a stranded held job',1;
BEGIN TRY
EXEC dbo.proc_yk_job_add '080801','130803','OTHER-RESIDENT';
THROW 51926,'Unlisted source overwrote a protected relocation destination',1;
END TRY BEGIN CATCH IF ERROR_NUMBER()=51926 THROW; END CATCH;
IF NOT EXISTS(SELECT 1 FROM dbo.bas_cargo_space WHERE cargo_space_id='130803' AND status='2' AND tray_code='NEW-TRAY')
THROW 51927,'Rejected stale relocation target must retain existing occupancy',1;
PRINT 'PASS: mixed-pilot sequential behavior assertions';

View File

@@ -0,0 +1,29 @@
SET NOCOUNT ON;
UPDATE mixed_pilot.control SET enabled=1,all_projects_may_mix=1;
UPDATE mixed_pilot.lane SET enabled=CASE WHEN lane_code='C1203' THEN 1 ELSE 0 END,protected=1,physical_fit_confirmed=1;
DECLARE @r int,@m varchar(255),@outResult varchar(100),@move varchar(255),@rear varchar(255);
EXEC dbo.proc_allot_space 'NEW-TRAY','TEST',@r OUTPUT,@m OUTPUT;
IF @r<>10 THROW 51930,'Failed to prepare genuine Legacy outbound fixture',1;
INSERT dbo.bas_stock(stock_id,cargo_space_id,tray_code,spare4,spare1,spare2,spare3,product_id,quantity,out_quantity,in_date)
VALUES('GUEST-S','120703','NEW-TRAY','NEW','D','E','F','P-GUEST',1,0,GETDATE());
UPDATE dbo.bas_cargo_space SET status='2',tray_code='NEW-TRAY' WHERE cargo_space_id='120703';
DELETE dbo.mydo_job WHERE job_id='IN-NEW';
UPDATE dbo.bas_stock SET product_id='P-REAR',in_date=GETDATE() WHERE stock_id='S1';
INSERT dbo.out_stockout(stockout_id,warehouse_id,stockout_source,fid,spare6,spare8,out_type)
VALUES('ORDER1','01','0','1','1','2','21');
INSERT dbo.out_stockout_detail(stockout_id,stockout_detail_id,product_id,spare1,spare2,spare3,spare4,quantity,allot_quantity)
VALUES('ORDER1','ORDER1-1','P-REAR','A','B','C','OLD',1,0);
EXEC dbo.proc_out_auto_allocation 'ORDER1-1',@outResult OUTPUT,@m OUTPUT;
IF @outResult<>'10' BEGIN DECLARE @failure nvarchar(2048)=N'Legacy auto allocation failed: '+ISNULL(@m,'NULL'); THROW 51931,@failure,1; END;
SELECT @move=job_id FROM dbo.mydo_job WHERE in_or_out=30 AND tray_code='NEW-TRAY';
SELECT @rear=job_id FROM dbo.mydo_job WHERE in_or_out=21 AND tray_code='RESIDENT';
IF @move IS NULL OR @rear IS NULL THROW 51932,'Actual Legacy must create both correct tray tasks',1;
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id=@move AND cargo_space_id='120703' AND status='1')
THROW 51933,'Legacy must move the outer guest, not the resident',1;
IF NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id=@rear AND cargo_space_id='120803' AND status='8')
THROW 51934,'Legacy rear task must be invisible to the status=1 dispatch scheduler',1;
EXEC dbo.proc_yk_complete @move,@r OUTPUT;
IF @r<>10 OR NOT EXISTS(SELECT 1 FROM dbo.mydo_job WHERE job_id=@rear AND status='1')
THROW 51935,'Actual Legacy relocation completion must release the rear task',1;
IF NOT EXISTS(SELECT 1 FROM dbo.bas_stock WHERE stock_id='S1' AND spare4='OLD' AND out_quantity=1)
THROW 51936,'Resident allocation and project must retain Legacy values',1;

View File

@@ -0,0 +1,22 @@
INSERT dbo.bas_cargo_space(cargo_space_id,warehouse_id,the_floor,the_platoon,the_column,group_coding_no,group_coding,this_cargo_area,status,locked,tray_code)
VALUES ('120803','01',3,12,8,'C1203','1','C','2','N','RESIDENT'),
('120703','01',3,12,7,'C1203','2','C','1','N',NULL),
('020804','01',4,2,8,'C0204','1','C','2','N','RESIDENT4'),
('020704','01',4,2,7,'C0204','2','C','1','N',NULL),
('020805','01',5,2,8,'C0205','1','C','2','N','RESIDENT5'),
('020705','01',5,2,7,'C0205','2','C','1','N',NULL),
('130803','01',3,13,8,'C1303','1','E','1','N',NULL),
('130703','01',3,13,7,'C1303','2','E','1','N',NULL),
('140803','01',3,14,8,'C1403','1','E','1','N',NULL),
('140703','01',3,14,7,'C1403','2','E','1','N',NULL),
('080801','01',1,8,8,'C0801','1','C','2','N','OTHER-RESIDENT'),
('080701','01',1,8,7,'C0801','2','C','1','N',NULL);
INSERT dbo.bas_stock(stock_id,cargo_space_id,tray_code,spare4,spare1,spare2,spare3,quantity,out_quantity)
VALUES ('S1','120803','RESIDENT','OLD','A','B','C',10,0),
('S4','020804','RESIDENT4','OLD4','A','B','C',10,0),
('S5','020805','RESIDENT5','OLD5','A','B','C',10,0),
('SX','080801','OTHER-RESIDENT','OLD-X','A','B','C',10,0);
INSERT dbo.mydo_job(job_id,tray_code,warehouse_id,line_id,in_or_out,status,execution_phase,fault_flag)
VALUES ('IN-NEW','NEW-TRAY','01','NEW',1,'1','0','0');
INSERT dbo.mydo_job_detail(job_detail_id,job_id,spare4,spare1,spare2,spare3,product_id,in_quantity)
VALUES ('IN-NEW-1','IN-NEW','NEW','D','E','F','P1',1);