288 lines
9.9 KiB
Transact-SQL
288 lines
9.9 KiB
Transact-SQL
-- 密集库出库、移库及 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
|