Files
FTC25009/sql/20260716_dense_outbound_relocation_dispatch.sql

288 lines
9.9 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 密集库出库、移库及 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;
UPDATE dbo.sys_menu
SET route_name = N'PlanKpi',
update_by = N'admin',
update_time = GETDATE()
WHERE component = N'kpi/plan/index'
AND ISNULL(route_name, N'') != N'PlanKpi';
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