-- 密集库出库、移库及 WCS 下发补偿 -- 目标库:FTC25009-WMS SET NOCOUNT ON; IF OBJECT_ID(N'dbo.wcs_job_dispatch', N'U') IS NULL BEGIN CREATE TABLE dbo.wcs_job_dispatch ( job_id nvarchar(255) NOT NULL, dispatch_status nvarchar(20) NOT NULL CONSTRAINT DF_wcs_job_dispatch_status DEFAULT N'PENDING', auto_retry_count int NOT NULL CONSTRAINT DF_wcs_job_dispatch_auto_retry DEFAULT 0, manual_retry_count int NOT NULL CONSTRAINT DF_wcs_job_dispatch_manual_retry DEFAULT 0, last_error nvarchar(1000) NULL, last_attempt_time datetime2 NULL, next_retry_time datetime2 NULL, success_time datetime2 NULL, version_no int NOT NULL CONSTRAINT DF_wcs_job_dispatch_version DEFAULT 0, create_time datetime2 NOT NULL CONSTRAINT DF_wcs_job_dispatch_create_time DEFAULT SYSDATETIME(), update_time datetime2 NOT NULL CONSTRAINT DF_wcs_job_dispatch_update_time DEFAULT SYSDATETIME(), CONSTRAINT PK_wcs_job_dispatch PRIMARY KEY CLUSTERED (job_id), CONSTRAINT CK_wcs_job_dispatch_status CHECK (dispatch_status IN (N'PENDING', N'SENDING', N'BLOCKED', N'RETRY_WAIT', N'SUCCESS', N'EXHAUSTED')), CONSTRAINT CK_wcs_job_dispatch_auto_retry CHECK (auto_retry_count BETWEEN 0 AND 5), CONSTRAINT CK_wcs_job_dispatch_manual_retry CHECK (manual_retry_count >= 0) ); END GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.wcs_job_dispatch') AND name = N'IX_wcs_job_dispatch_retry' ) BEGIN CREATE NONCLUSTERED INDEX IX_wcs_job_dispatch_retry ON dbo.wcs_job_dispatch (dispatch_status, next_retry_time, auto_retry_count, create_time) INCLUDE (version_no); END GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.mydo_job') AND name = N'IX_mydo_job_dense_dispatch' ) BEGIN CREATE NONCLUSTERED INDEX IX_mydo_job_dense_dispatch ON dbo.mydo_job (warehouse_id, cargo_space_id, in_or_out, status, execution_phase) INCLUDE (job_id, tray_code, task_no); END GO IF NOT EXISTS (SELECT 1 FROM dbo.bas_task_no WHERE id = N'23') BEGIN INSERT INTO dbo.bas_task_no (id, task_type, type_name, task_no, min_no, max_no) VALUES (N'23', N'23', N'移库', 90000, 90001, 99999); END ELSE BEGIN UPDATE dbo.bas_task_no SET task_type = N'23', type_name = N'移库' WHERE id = N'23'; END GO DECLARE @retryJobId bigint; DECLARE @retryJobIdIsIdentity bit = COLUMNPROPERTY(OBJECT_ID(N'dbo.sys_job'), 'job_id', 'IsIdentity'); SELECT TOP 1 @retryJobId = job_id FROM dbo.sys_job WHERE invoke_target = N'wcsOutboundRetryTask.retryFailedJobs()'; IF @retryJobId IS NULL BEGIN SELECT @retryJobId = ISNULL(MAX(job_id), 0) + 1 FROM dbo.sys_job; IF @retryJobIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_job ON; INSERT INTO dbo.sys_job ( job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark ) VALUES ( @retryJobId, N'WCS出库下发失败补偿', N'DEFAULT', N'wcsOutboundRetryTask.retryFailedJobs()', N'0 0/1 * * * ?', N'3', N'1', N'0', N'admin', GETDATE(), N'', NULL, N'每分钟补偿失败或被密集库遮挡的出库作业' ); IF @retryJobIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_job OFF; END ELSE BEGIN UPDATE dbo.sys_job SET job_name = N'WCS出库下发失败补偿', job_group = N'DEFAULT', cron_expression = N'0 0/1 * * * ?', misfire_policy = N'3', concurrent = N'1', status = N'0', update_by = N'admin', update_time = GETDATE(), remark = N'每分钟补偿失败或被密集库遮挡的出库作业' WHERE job_id = @retryJobId; END GO DECLARE @outMenuId bigint; DECLARE @denseMenuId bigint; DECLARE @previewMenuId bigint; DECLARE @generateMenuId bigint; DECLARE @outJobMenuId bigint; DECLARE @pushWcsMenuId bigint; DECLARE @menuIdIsIdentity bit = COLUMNPROPERTY(OBJECT_ID(N'dbo.sys_menu'), 'menu_id', 'IsIdentity'); SELECT TOP 1 @outMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'M' AND (path = N'out' OR menu_name = N'出库管理') ORDER BY CASE WHEN menu_id = 2001 THEN 0 ELSE 1 END, menu_id; IF @outMenuId IS NULL SET @outMenuId = 2001; SELECT TOP 1 @denseMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'C' AND (perms = N'out:denseLaneOutbound:list' OR (path = N'denseLaneOutbound' AND component = N'out/denseLaneOutbound/index')); IF @denseMenuId IS NULL BEGIN SELECT @denseMenuId = ISNULL(MAX(menu_id), 2200) + 1 FROM dbo.sys_menu; END SELECT TOP 1 @previewMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'F' AND perms = N'out:denseLaneOutbound:preview'; IF @previewMenuId IS NULL BEGIN SELECT @previewMenuId = ISNULL(MAX(menu_id), @denseMenuId) + 1 FROM dbo.sys_menu; WHILE @previewMenuId IN (@denseMenuId) OR EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @previewMenuId) SET @previewMenuId = @previewMenuId + 1; END SELECT TOP 1 @generateMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'F' AND perms = N'out:denseLaneOutbound:generate'; IF @generateMenuId IS NULL BEGIN SET @generateMenuId = @previewMenuId + 1; WHILE @generateMenuId IN (@denseMenuId, @previewMenuId) OR EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @generateMenuId) SET @generateMenuId = @generateMenuId + 1; END SELECT TOP 1 @outJobMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'C' AND perms = N'out:job:list' ORDER BY menu_id; SELECT TOP 1 @pushWcsMenuId = menu_id FROM dbo.sys_menu WHERE menu_type = N'F' AND perms = N'out:job:pushWcs'; IF @pushWcsMenuId IS NULL BEGIN SET @pushWcsMenuId = @generateMenuId + 1; WHILE @pushWcsMenuId IN (@denseMenuId, @previewMenuId, @generateMenuId) OR EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @pushWcsMenuId) SET @pushWcsMenuId = @pushWcsMenuId + 1; END IF @menuIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_menu ON; IF NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @denseMenuId) BEGIN INSERT INTO dbo.sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark ) VALUES ( @denseMenuId, N'指定通道出库', @outMenuId, 5, N'denseLaneOutbound', N'out/denseLaneOutbound/index', NULL, N'', 1, 0, N'C', N'0', N'0', N'out:denseLaneOutbound:list', N'table', N'admin', GETDATE(), N'', NULL, N'03仓密集库按通道生成端头托盘出库作业' ); END ELSE BEGIN UPDATE dbo.sys_menu SET menu_name = N'指定通道出库', parent_id = @outMenuId, order_num = 5, path = N'denseLaneOutbound', component = N'out/denseLaneOutbound/index', perms = N'out:denseLaneOutbound:list', icon = N'table', visible = N'0', status = N'0', update_by = N'admin', update_time = GETDATE() WHERE menu_id = @denseMenuId; END IF NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @previewMenuId) BEGIN INSERT INTO dbo.sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark ) VALUES ( @previewMenuId, N'预览通道出库', @denseMenuId, 1, N'#', N'', NULL, N'', 1, 0, N'F', N'0', N'0', N'out:denseLaneOutbound:preview', N'#', N'admin', GETDATE(), N'', NULL, N'' ); END IF NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @generateMenuId) BEGIN INSERT INTO dbo.sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark ) VALUES ( @generateMenuId, N'生成通道出库', @denseMenuId, 2, N'#', N'', NULL, N'', 1, 0, N'F', N'0', N'0', N'out:denseLaneOutbound:generate', N'#', N'admin', GETDATE(), N'', NULL, N'' ); END IF @outJobMenuId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @pushWcsMenuId) BEGIN INSERT INTO dbo.sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark ) VALUES ( @pushWcsMenuId, N'手动下发WCS', @outJobMenuId, 6, N'#', N'', NULL, N'', 1, 0, N'F', N'0', N'0', N'out:job:pushWcs', N'#', N'admin', GETDATE(), N'', NULL, N'' ); END IF @menuIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_menu OFF; IF OBJECT_ID(N'dbo.sys_role_menu', N'U') IS NOT NULL BEGIN INSERT INTO dbo.sys_role_menu (role_id, menu_id) SELECT DISTINCT rm.role_id, permission_menu.menu_id FROM dbo.sys_role_menu rm CROSS APPLY (VALUES (@denseMenuId), (@previewMenuId), (@generateMenuId)) permission_menu(menu_id) WHERE rm.menu_id = @outMenuId AND NOT EXISTS (SELECT 1 FROM dbo.sys_role_menu current_rm WHERE current_rm.role_id = rm.role_id AND current_rm.menu_id = permission_menu.menu_id); IF @outJobMenuId IS NOT NULL BEGIN INSERT INTO dbo.sys_role_menu (role_id, menu_id) SELECT DISTINCT rm.role_id, @pushWcsMenuId FROM dbo.sys_role_menu rm WHERE rm.menu_id = @outJobMenuId AND NOT EXISTS (SELECT 1 FROM dbo.sys_role_menu current_rm WHERE current_rm.role_id = rm.role_id AND current_rm.menu_id = @pushWcsMenuId); END END GO