feat: 打通出库作业链路

This commit is contained in:
zgw
2026-06-24 09:13:18 +08:00
parent a3c023a8d3
commit 1af5b3cbd3
141 changed files with 17337 additions and 1065 deletions

182
sql/bas_api_log.sql Normal file
View File

@@ -0,0 +1,182 @@
-- 外部接口日志表和 30 天保留策略
-- 目标库:FTC25009-WMS
IF OBJECT_ID(N'dbo.bas_api_log', N'U') IS NULL
BEGIN
CREATE TABLE dbo.bas_api_log (
id bigint IDENTITY(1,1) NOT NULL,
direction varchar(16) NOT NULL,
sys_code varchar(50) NULL,
interface_name nvarchar(100) NULL,
request_url nvarchar(500) NULL,
request_method varchar(20) NULL,
request_body nvarchar(max) NULL,
response_body nvarchar(max) NULL,
msg_type varchar(20) NULL,
http_status int NULL,
cost_ms bigint NULL,
status varchar(30) NULL,
error_msg nvarchar(2000) NULL,
source_ip varchar(80) NULL,
trace_id varchar(80) NULL,
create_time datetime2(7) NOT NULL CONSTRAINT DF_bas_api_log_create_time DEFAULT GETDATE(),
CONSTRAINT PK_bas_api_log PRIMARY KEY CLUSTERED(id)
);
END
GO
IF COL_LENGTH(N'dbo.bas_api_log', N'direction') IS NULL
BEGIN
ALTER TABLE dbo.bas_api_log ADD direction varchar(16) NULL;
EXEC(N'UPDATE dbo.bas_api_log SET direction = ''UNKNOWN'' WHERE direction IS NULL');
END
GO
IF COL_LENGTH(N'dbo.bas_api_log', N'request_method') IS NULL
BEGIN
ALTER TABLE dbo.bas_api_log ADD request_method varchar(20) NULL;
END
GO
IF COL_LENGTH(N'dbo.bas_api_log', N'source_ip') IS NULL
BEGIN
ALTER TABLE dbo.bas_api_log ADD source_ip varchar(80) NULL;
END
GO
IF COL_LENGTH(N'dbo.bas_api_log', N'trace_id') IS NULL
BEGIN
ALTER TABLE dbo.bas_api_log ADD trace_id varchar(80) NULL;
END
GO
IF COLUMNPROPERTY(OBJECT_ID(N'dbo.bas_api_log'), 'id', 'IsIdentity') = 0
AND NOT EXISTS (
SELECT 1
FROM sys.default_constraints dc
JOIN sys.columns c ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id
WHERE dc.parent_object_id = OBJECT_ID(N'dbo.bas_api_log') AND c.name = N'id'
)
BEGIN
DECLARE @apiLogStartId bigint;
SELECT @apiLogStartId = ISNULL(MAX(CAST(id AS bigint)), 0) + 1 FROM dbo.bas_api_log;
IF OBJECT_ID(N'dbo.seq_bas_api_log_id', N'SO') IS NULL
BEGIN
DECLARE @createSeqSql nvarchar(max) = N'CREATE SEQUENCE dbo.seq_bas_api_log_id AS bigint START WITH '
+ CAST(@apiLogStartId AS nvarchar(30)) + N' INCREMENT BY 1';
EXEC(@createSeqSql);
END;
ALTER TABLE dbo.bas_api_log ADD CONSTRAINT DF_bas_api_log_id DEFAULT (NEXT VALUE FOR dbo.seq_bas_api_log_id) FOR id;
END
GO
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.bas_api_log')
AND name = N'request_url'
AND max_length < 1000
)
BEGIN
ALTER TABLE dbo.bas_api_log ALTER COLUMN request_url nvarchar(500) NULL;
END
GO
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.bas_api_log')
AND name = N'request_body'
AND system_type_id IN (167, 231)
AND max_length <> -1
)
BEGIN
ALTER TABLE dbo.bas_api_log ALTER COLUMN request_body nvarchar(max) NULL;
END
GO
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.bas_api_log')
AND name = N'response_body'
AND system_type_id IN (167, 231)
AND max_length <> -1
)
BEGIN
ALTER TABLE dbo.bas_api_log ALTER COLUMN response_body nvarchar(max) NULL;
END
GO
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.bas_api_log')
AND name = N'error_msg'
AND system_type_id IN (167, 231)
AND max_length < 4000
)
BEGIN
ALTER TABLE dbo.bas_api_log ALTER COLUMN error_msg nvarchar(2000) NULL;
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'IX_bas_api_log_create_time')
BEGIN
EXEC(N'CREATE INDEX IX_bas_api_log_create_time ON dbo.bas_api_log(create_time)');
END
GO
IF COL_LENGTH(N'dbo.bas_api_log', N'direction') IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'IX_bas_api_log_direction_sys')
BEGIN
EXEC(N'CREATE INDEX IX_bas_api_log_direction_sys ON dbo.bas_api_log(direction, sys_code, create_time DESC)');
END
GO
IF OBJECT_ID(N'dbo.proc_clean_bas_api_log', N'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.proc_clean_bas_api_log;
END
GO
CREATE PROCEDURE dbo.proc_clean_bas_api_log
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM dbo.bas_api_log
WHERE create_time < DATEADD(DAY, -30, GETDATE());
END
GO
DECLARE @apiLogJobId bigint = 9010;
DECLARE @jobIdIsIdentity bit = COLUMNPROPERTY(OBJECT_ID(N'dbo.sys_job'), 'job_id', 'IsIdentity');
IF NOT EXISTS (SELECT 1 FROM dbo.sys_job WHERE invoke_target = N'apiLogCleanupTask.cleanExpiredApiLogs()')
BEGIN
IF @jobIdIsIdentity = 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 (
@apiLogJobId, N'外部接口日志30天清理', N'DEFAULT', N'apiLogCleanupTask.cleanExpiredApiLogs()', N'0 30 2 * * ?',
N'3', N'1', N'0', N'admin', GETDATE(), N'', NULL, N'清理 bas_api_log 中 30 天前的日志'
);
IF @jobIdIsIdentity = 1
SET IDENTITY_INSERT dbo.sys_job OFF;
END
ELSE
BEGIN
UPDATE dbo.sys_job
SET job_name = N'外部接口日志30天清理',
cron_expression = N'0 30 2 * * ?',
misfire_policy = N'3',
concurrent = N'1',
status = N'0',
update_time = GETDATE(),
remark = N'清理 bas_api_log 中 30 天前的日志'
WHERE invoke_target = N'apiLogCleanupTask.cleanExpiredApiLogs()';
END
GO

81
sql/bas_config_menus.sql Normal file
View File

@@ -0,0 +1,81 @@
-- 基础信息菜单接入:托盘规则、点位配置
-- 目标库:FTC25009-WMS
DECLARE @basMenuId bigint = 2004;
DECLARE @trayRuleMenuId bigint = 2190;
DECLARE @stationPointMenuId bigint = 2200;
DECLARE @menuIdIsIdentity bit = COLUMNPROPERTY(OBJECT_ID(N'dbo.sys_menu'), 'menu_id', 'IsIdentity');
IF @menuIdIsIdentity = 1
SET IDENTITY_INSERT dbo.sys_menu ON;
IF NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @trayRuleMenuId)
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 (
@trayRuleMenuId, N'托盘规则', @basMenuId, 6, N'trayRule', N'bas/trayRule/index', NULL, N'',
1, 0, N'C', N'0', N'0', N'bas:trayRule:list', N'list',
N'admin', GETDATE(), N'', NULL, N''
);
END
IF NOT EXISTS (SELECT 1 FROM dbo.sys_menu WHERE menu_id = @stationPointMenuId)
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 (
@stationPointMenuId, N'点位配置', @basMenuId, 7, N'stationpoint', N'bas/stationpoint/index', NULL, N'',
1, 0, N'C', N'0', N'0', N'bas:stationpoint:list', N'list',
N'admin', GETDATE(), N'', NULL, N''
);
END
ELSE
BEGIN
UPDATE dbo.sys_menu
SET menu_name = N'点位配置',
update_time = GETDATE()
WHERE menu_id = @stationPointMenuId;
END
DECLARE @button table(menu_id bigint, menu_name nvarchar(50), parent_id bigint, order_num int, perms nvarchar(100));
INSERT INTO @button(menu_id, menu_name, parent_id, order_num, perms)
VALUES
(2191, N'托盘规则查询', @trayRuleMenuId, 1, N'bas:trayRule:query'),
(2192, N'托盘规则新增', @trayRuleMenuId, 2, N'bas:trayRule:add'),
(2193, N'托盘规则修改', @trayRuleMenuId, 3, N'bas:trayRule:edit'),
(2194, N'托盘规则删除', @trayRuleMenuId, 4, N'bas:trayRule:remove'),
(2195, N'托盘规则导出', @trayRuleMenuId, 5, N'bas:trayRule:export'),
(2201, N'点位配置查询', @stationPointMenuId, 1, N'bas:stationpoint:query'),
(2202, N'点位配置新增', @stationPointMenuId, 2, N'bas:stationpoint:add'),
(2203, N'点位配置修改', @stationPointMenuId, 3, N'bas:stationpoint:edit'),
(2204, N'点位配置删除', @stationPointMenuId, 4, N'bas:stationpoint:remove'),
(2205, N'点位配置导出', @stationPointMenuId, 5, N'bas:stationpoint:export');
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
)
SELECT b.menu_id, b.menu_name, b.parent_id, b.order_num, N'#', N'', NULL, N'',
1, 0, N'F', N'0', N'0', b.perms, N'#',
N'admin', GETDATE(), N'', NULL, N''
FROM @button b
WHERE NOT EXISTS (SELECT 1 FROM dbo.sys_menu m WHERE m.menu_id = b.menu_id);
UPDATE m
SET m.menu_name = b.menu_name,
m.update_time = GETDATE()
FROM dbo.sys_menu m
INNER JOIN @button b ON b.menu_id = m.menu_id;
IF @menuIdIsIdentity = 1
SET IDENTITY_INSERT dbo.sys_menu OFF;
GO

77
sql/bas_station_point.sql Normal file
View File

@@ -0,0 +1,77 @@
IF NOT EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bas_station_point]') AND type IN ('U'))
BEGIN
CREATE TABLE [dbo].[bas_station_point] (
[id] bigint IDENTITY(1,1) NOT NULL,
[point_id] varchar(64) COLLATE Chinese_PRC_CI_AS NOT NULL,
[point_name] varchar(128) COLLATE Chinese_PRC_CI_AS NULL,
[warehouse_id] varchar(64) COLLATE Chinese_PRC_CI_AS NOT NULL,
[roadway_id] varchar(64) COLLATE Chinese_PRC_CI_AS NOT NULL,
[point_type] varchar(8) COLLATE Chinese_PRC_CI_AS NOT NULL,
[point_size] varchar(8) COLLATE Chinese_PRC_CI_AS NOT NULL DEFAULT '1',
[tray_type] varchar(128) COLLATE Chinese_PRC_CI_AS NOT NULL DEFAULT '',
[status] varchar(8) COLLATE Chinese_PRC_CI_AS NOT NULL DEFAULT '0',
[point_status] varchar(8) COLLATE Chinese_PRC_CI_AS NOT NULL DEFAULT '0',
[remark] varchar(500) COLLATE Chinese_PRC_CI_AS NULL,
[create_time] datetime2(7) NULL,
[update_time] datetime2(7) NULL,
CONSTRAINT [PK_bas_station_point] PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [UK_bas_station_point_point_id] UNIQUE ([point_id])
)
END
GO
IF COL_LENGTH('dbo.bas_station_point', 'point_name') IS NULL
ALTER TABLE dbo.bas_station_point ADD point_name varchar(128) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_station_point', 'warehouse_id') IS NULL
ALTER TABLE dbo.bas_station_point ADD warehouse_id varchar(64) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_station_point', 'roadway_id') IS NULL
ALTER TABLE dbo.bas_station_point ADD roadway_id varchar(64) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_station_point', 'point_type') IS NULL
ALTER TABLE dbo.bas_station_point ADD point_type varchar(8) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_station_point', 'point_size') IS NULL
ALTER TABLE dbo.bas_station_point ADD point_size varchar(8) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT DF_bas_station_point_point_size DEFAULT '1';
GO
IF COL_LENGTH('dbo.bas_station_point', 'tray_type') IS NULL
ALTER TABLE dbo.bas_station_point ADD tray_type varchar(128) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT DF_bas_station_point_tray_type DEFAULT '';
GO
IF COL_LENGTH('dbo.bas_station_point', 'status') IS NULL
ALTER TABLE dbo.bas_station_point ADD status varchar(8) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT DF_bas_station_point_status DEFAULT '0';
GO
IF COL_LENGTH('dbo.bas_station_point', 'point_status') IS NULL
ALTER TABLE dbo.bas_station_point ADD point_status varchar(8) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT DF_bas_station_point_point_status DEFAULT '0';
GO
UPDATE dbo.bas_station_point SET point_size = '1' WHERE point_size IS NULL OR point_size = '';
GO
UPDATE dbo.bas_station_point SET tray_type = '' WHERE tray_type IS NULL;
GO
UPDATE dbo.bas_station_point SET point_status = '0' WHERE point_status IS NULL OR point_status = '';
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_station_point_warehouse_type_status' AND object_id = OBJECT_ID(N'[dbo].[bas_station_point]'))
CREATE INDEX [IX_bas_station_point_warehouse_type_status] ON [dbo].[bas_station_point] ([warehouse_id], [point_type], [status]);
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_station_point_bind_filter' AND object_id = OBJECT_ID(N'[dbo].[bas_station_point]'))
CREATE INDEX [IX_bas_station_point_bind_filter] ON [dbo].[bas_station_point] ([warehouse_id], [status], [point_status], [point_type]) INCLUDE ([roadway_id], [tray_type]);
GO
IF NOT EXISTS (
SELECT 1
FROM sys.extended_properties
WHERE major_id = OBJECT_ID(N'[dbo].[bas_station_point]')
AND minor_id = 0
AND name = N'MS_Description'
)
BEGIN
EXEC sp_addextendedproperty 'MS_Description', N'点位配置', 'SCHEMA', N'dbo', 'TABLE', N'bas_station_point';
END
GO
-- 菜单建议:在系统菜单中新增“点位配置”,路由 path 为 stationpoint,组件路径为 bas/stationpoint/index。
-- 权限标识建议:bas:stationpoint:list/add/edit/remove/export/query。
-- 这里不直接写入 sys_menu,是为了避免不同环境菜单 ID、父级目录 ID 不一致导致冲突。

View File

@@ -0,0 +1,255 @@
IF OBJECT_ID(N'dbo.bas_stock_detail', N'U') IS NULL
BEGIN
CREATE TABLE dbo.bas_stock_detail (
detail_id nvarchar(32) NOT NULL,
stock_id nvarchar(32) NOT NULL,
product_status nvarchar(2) NULL,
lot_no nvarchar(80) NULL,
product_id nvarchar(80) NULL,
product_name nvarchar(255) NULL,
quantity decimal(18, 0) NULL,
out_quantity decimal(18, 0) NULL,
job_detail_id nvarchar(255) NULL,
stockin_detail_id nvarchar(80) NULL,
create_time datetime2(7) NULL,
update_time datetime2(7) NULL,
remark nvarchar(500) NULL,
CONSTRAINT PK_bas_stock_detail PRIMARY KEY CLUSTERED(detail_id)
);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_stock_detail_stock_id' AND object_id = OBJECT_ID(N'dbo.bas_stock_detail'))
BEGIN
CREATE INDEX IX_bas_stock_detail_stock_id ON dbo.bas_stock_detail(stock_id);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_stock_detail_product' AND object_id = OBJECT_ID(N'dbo.bas_stock_detail'))
BEGIN
CREATE INDEX IX_bas_stock_detail_product ON dbo.bas_stock_detail(product_id, lot_no);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_bas_stock_detail_stock')
BEGIN
ALTER TABLE dbo.bas_stock_detail WITH CHECK ADD CONSTRAINT FK_bas_stock_detail_stock
FOREIGN KEY(stock_id) REFERENCES dbo.bas_stock(stock_id);
END
GO
INSERT INTO dbo.bas_stock_detail (
detail_id, stock_id, product_status, lot_no, product_id, product_name,
quantity, out_quantity, job_detail_id, stockin_detail_id, create_time
)
SELECT
LEFT(REPLACE(CONVERT(varchar(36), NEWID()), '-', ''), 32),
bs.stock_id,
bs.product_status,
bs.lot_no,
bs.product_id,
bs.product_name,
bs.quantity,
bs.out_quantity,
bs.job_detail_id,
bs.stockin_detail_id,
GETDATE()
FROM dbo.bas_stock bs
WHERE NOT EXISTS (
SELECT 1 FROM dbo.bas_stock_detail bsd WHERE bsd.stock_id = bs.stock_id
)
AND (
bs.product_id IS NOT NULL OR bs.product_name IS NOT NULL OR bs.quantity IS NOT NULL
);
GO
UPDATE bs
SET bs.product_status = NULL,
bs.lot_no = NULL,
bs.product_id = NULL,
bs.product_name = NULL,
bs.quantity = ISNULL(bsa.quantity, 0),
bs.job_detail_id = NULL,
bs.out_quantity = ISNULL(bsa.out_quantity, 0),
bs.stockin_detail_id = NULL
FROM dbo.bas_stock bs
LEFT JOIN (
SELECT stock_id,
SUM(ISNULL(quantity, 0)) AS quantity,
SUM(ISNULL(out_quantity, 0)) AS out_quantity
FROM dbo.bas_stock_detail
GROUP BY stock_id
) bsa ON bsa.stock_id = bs.stock_id;
GO
IF OBJECT_ID(N'[dbo].[proc_complete_in_job]', N'P') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[proc_complete_in_job];
END
GO
CREATE PROCEDURE [dbo].[proc_complete_in_job]
@job_id NVARCHAR(80),
@user_id INT,
@dept_id INT,
@v_result INT OUTPUT,
@v_resultmsg VARCHAR(80) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@now DATETIME = GETDATE(),
@tray_code NVARCHAR(255),
@warehouse_id NVARCHAR(80),
@cargo_space_id NVARCHAR(80),
@stock_id NVARCHAR(32),
@detail_id NVARCHAR(32);
DECLARE
@job_detail_id NVARCHAR(80),
@product_id NVARCHAR(80),
@product_name NVARCHAR(80),
@lot_no NVARCHAR(80),
@in_quantity DECIMAL(18, 0),
@stockin_id NVARCHAR(80),
@stockin_detail_id NVARCHAR(255);
IF NOT EXISTS (SELECT 1 FROM mydo_job WHERE job_id = @job_id)
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '错误:作业不存在';
RETURN;
END;
IF NOT EXISTS (SELECT 1 FROM mydo_job_detail WHERE job_id = @job_id)
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '错误:作业无明细';
RETURN;
END;
SELECT
@cargo_space_id = cargo_space_id,
@tray_code = tray_code,
@warehouse_id = warehouse_id
FROM mydo_job WHERE job_id = @job_id;
IF NOT EXISTS (SELECT 1 FROM bas_cargo_space WHERE cargo_space_id = @cargo_space_id)
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '错误:货位不存在';
RETURN;
END;
BEGIN TRY
DECLARE cur_finish_job_detail CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT
job_detail_id, product_id, product_name, lot_no, in_quantity,
stockin_id, stockin_detail_id
FROM mydo_job_detail WHERE job_id = @job_id;
BEGIN TRANSACTION;
OPEN cur_finish_job_detail;
FETCH NEXT FROM cur_finish_job_detail INTO
@job_detail_id, @product_id, @product_name, @lot_no, @in_quantity,
@stockin_id, @stockin_detail_id;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE in_stockin_detail
SET assign_num = ISNULL(assign_num, 0) + @in_quantity
WHERE stockin_detail_id = @stockin_detail_id;
SET @detail_id = LEFT(REPLACE(CONVERT(varchar(36), NEWID()), '-', ''), 32);
IF @stock_id IS NULL
BEGIN
SET @stock_id = LEFT(REPLACE(CONVERT(varchar(36), NEWID()), '-', ''), 32);
INSERT INTO bas_stock (
stock_id, cargo_space_id, stock_status, in_date, quantity,
job_id, tray_code, out_quantity, stockin_id, warehouse_id
)
VALUES (
@stock_id, @cargo_space_id, '1', @now, 0,
@job_id, @tray_code, 0, @stockin_id, @warehouse_id
);
END;
INSERT INTO bas_stock_detail (
detail_id, stock_id, product_status, lot_no, product_id, product_name,
quantity, out_quantity, job_detail_id, stockin_detail_id, create_time
)
VALUES (
@detail_id, @stock_id, '1', @lot_no, @product_id, @product_name,
@in_quantity, 0, @job_detail_id, @stockin_detail_id, @now
);
FETCH NEXT FROM cur_finish_job_detail INTO
@job_detail_id, @product_id, @product_name, @lot_no, @in_quantity,
@stockin_id, @stockin_detail_id;
END;
CLOSE cur_finish_job_detail;
DEALLOCATE cur_finish_job_detail;
UPDATE bas_cargo_space
SET status = '2', tray_code = @tray_code, locked = 'N'
WHERE cargo_space_id = @cargo_space_id;
UPDATE bs
SET bs.product_status = NULL,
bs.lot_no = NULL,
bs.product_id = NULL,
bs.product_name = NULL,
bs.quantity = ISNULL(bsa.quantity, 0),
bs.job_detail_id = NULL,
bs.out_quantity = ISNULL(bsa.out_quantity, 0),
bs.stockin_detail_id = NULL
FROM bas_stock bs
LEFT JOIN (
SELECT stock_id,
SUM(ISNULL(quantity, 0)) AS quantity,
SUM(ISNULL(out_quantity, 0)) AS out_quantity
FROM bas_stock_detail
WHERE stock_id = @stock_id
GROUP BY stock_id
) bsa ON bsa.stock_id = bs.stock_id
WHERE bs.stock_id = @stock_id;
UPDATE mydo_job
SET status = '4', finish_time = GETDATE()
WHERE job_id = @job_id;
INSERT INTO mydo_job_finish
SELECT * FROM mydo_job WHERE job_id = @job_id;
INSERT INTO mydo_job_detail_finish
SELECT * FROM mydo_job_detail WHERE job_id = @job_id;
DELETE FROM mydo_job_detail WHERE job_id = @job_id;
DELETE FROM mydo_job WHERE job_id = @job_id;
COMMIT TRANSACTION;
SET @v_result = 1;
SET @v_resultmsg = '入库作业完成,库存主子表+货位已更新';
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
IF CURSOR_STATUS('local','cur_finish_job_detail') >= 0
BEGIN
CLOSE cur_finish_job_detail;
DEALLOCATE cur_finish_job_detail;
END;
SET @v_result = 0;
SET @v_resultmsg = LEFT(ERROR_MESSAGE(), 80);
END CATCH;
END
GO

71
sql/bas_tray_rule.sql Normal file
View File

@@ -0,0 +1,71 @@
IF OBJECT_ID(N'[dbo].[bas_tray_rule]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[bas_tray_rule] (
[id] bigint IDENTITY(1,1) NOT NULL,
[rule_name] varchar(128) COLLATE Chinese_PRC_CI_AS NULL,
[tray_type] varchar(16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[tray_length] int NULL,
[tray_width] int NULL,
[allowed_warehouses] varchar(500) COLLATE Chinese_PRC_CI_AS NOT NULL,
[allowed_warehouse_names] varchar(1000) COLLATE Chinese_PRC_CI_AS NULL,
[allowed_cargo_type] varchar(64) COLLATE Chinese_PRC_CI_AS NOT NULL,
[allowed_cargo_type_name] varchar(128) COLLATE Chinese_PRC_CI_AS NULL,
[remark] varchar(500) COLLATE Chinese_PRC_CI_AS NULL,
[create_by] varchar(64) COLLATE Chinese_PRC_CI_AS NULL,
[create_time] datetime2(7) NULL,
[update_by] varchar(64) COLLATE Chinese_PRC_CI_AS NULL,
[update_time] datetime2(7) NULL,
CONSTRAINT [PK_bas_tray_rule] PRIMARY KEY CLUSTERED ([id])
);
END
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'rule_name') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD rule_name varchar(128) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'tray_type') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD tray_type varchar(16) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'tray_length') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD tray_length int NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'tray_width') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD tray_width int NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'allowed_warehouses') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD allowed_warehouses varchar(500) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'allowed_warehouse_names') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD allowed_warehouse_names varchar(1000) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'allowed_cargo_type') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD allowed_cargo_type varchar(64) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'allowed_cargo_type_name') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD allowed_cargo_type_name varchar(128) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'remark') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD remark varchar(500) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'create_by') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD create_by varchar(64) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'create_time') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD create_time datetime2(7) NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'update_by') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD update_by varchar(64) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.bas_tray_rule', 'update_time') IS NULL
ALTER TABLE dbo.bas_tray_rule ADD update_time datetime2(7) NULL;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_tray_rule_tray_type' AND object_id = OBJECT_ID(N'[dbo].[bas_tray_rule]'))
CREATE INDEX [IX_bas_tray_rule_tray_type] ON [dbo].[bas_tray_rule] ([tray_type]);
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_bas_tray_rule_cargo_type' AND object_id = OBJECT_ID(N'[dbo].[bas_tray_rule]'))
CREATE INDEX [IX_bas_tray_rule_cargo_type] ON [dbo].[bas_tray_rule] ([allowed_cargo_type]);
GO
-- 注意:托盘规则需要按现场仓库/货位类型配置基础数据;无匹配规则时 PDA 绑盘会被拦截。

904
sql/out_stockout_flow.sql Normal file
View File

@@ -0,0 +1,904 @@
IF COL_LENGTH('dbo.out_stockout_detail', 'status') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail ADD status nvarchar(10) NULL;
END
GO
IF COL_LENGTH('dbo.out_stockout_detail_finish', 'status') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail_finish ADD status nvarchar(10) NULL;
END
GO
IF COL_LENGTH('dbo.out_stockout_detail', 'stock_id') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail ADD stock_id nvarchar(80) NULL;
END
GO
IF COL_LENGTH('dbo.out_stockout_detail_finish', 'stock_id') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail_finish ADD stock_id nvarchar(80) NULL;
END
GO
IF COL_LENGTH('dbo.out_stockout_detail', 'stock_detail_id') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail ADD stock_detail_id nvarchar(80) NULL;
END
GO
IF COL_LENGTH('dbo.out_stockout_detail_finish', 'stock_detail_id') IS NULL
BEGIN
ALTER TABLE dbo.out_stockout_detail_finish ADD stock_detail_id nvarchar(80) NULL;
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_out_stockout_detail_stock_detail' AND object_id = OBJECT_ID(N'dbo.out_stockout_detail'))
BEGIN
CREATE INDEX IX_out_stockout_detail_stock_detail ON dbo.out_stockout_detail(stock_detail_id);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_mydo_job_detail_out_bill' AND object_id = OBJECT_ID(N'dbo.mydo_job_detail'))
BEGIN
CREATE INDEX IX_mydo_job_detail_out_bill ON dbo.mydo_job_detail(in_or_out_id, in_or_out_d_id);
END
GO
IF OBJECT_ID(N'dbo.proc_update_outbill_status', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_update_outbill_status;
GO
CREATE PROCEDURE dbo.proc_update_outbill_status
@v_stockout_id varchar(50),
@v_status int,
@v_result int OUTPUT,
@v_resultString varchar(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @v_old_status int;
DECLARE @now datetime2(7) = SYSDATETIME();
SELECT @v_old_status = TRY_CONVERT(int, status)
FROM dbo.out_stockout
WHERE stockout_id = @v_stockout_id;
IF @v_old_status IS NULL
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库单据不存在';
RETURN;
END
BEGIN TRY
BEGIN TRANSACTION;
IF @v_status = 2
BEGIN
IF @v_old_status <> 1
BEGIN
SET @v_result = 2;
SET @v_resultString = '只有创建状态可以审核';
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE dbo.out_stockout
SET status = '2',
review_dat = COALESCE(review_dat, @now)
WHERE stockout_id = @v_stockout_id;
END
ELSE IF @v_status = 5
BEGIN
IF @v_old_status >= 3
BEGIN
SET @v_result = 2;
SET @v_resultString = '单据已执行,不能直接作废';
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE dbo.out_stockout
SET status = '5',
finish_date = @now
WHERE stockout_id = @v_stockout_id;
INSERT INTO dbo.out_stockout_detail_finish
SELECT * FROM dbo.out_stockout_detail WHERE stockout_id = @v_stockout_id;
INSERT INTO dbo.out_stockout_finish
SELECT * FROM dbo.out_stockout WHERE stockout_id = @v_stockout_id;
DELETE FROM dbo.out_stockout_detail WHERE stockout_id = @v_stockout_id;
DELETE FROM dbo.out_stockout WHERE stockout_id = @v_stockout_id;
END
ELSE IF @v_status = 4
BEGIN
IF @v_old_status <> 3
BEGIN
SET @v_result = 2;
SET @v_resultString = '只有执行状态可以完成';
ROLLBACK TRANSACTION;
RETURN;
END
IF EXISTS (
SELECT 1
FROM dbo.out_stockout_detail
WHERE stockout_id = @v_stockout_id
AND ISNULL(assign_num, 0) < ISNULL(quantity, 0)
)
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库明细未完成,不能完成单据';
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE dbo.out_stockout
SET status = '4',
finish_date = @now
WHERE stockout_id = @v_stockout_id;
INSERT INTO dbo.out_stockout_detail_finish
SELECT * FROM dbo.out_stockout_detail WHERE stockout_id = @v_stockout_id;
INSERT INTO dbo.out_stockout_finish
SELECT * FROM dbo.out_stockout WHERE stockout_id = @v_stockout_id;
DELETE FROM dbo.out_stockout_detail WHERE stockout_id = @v_stockout_id;
DELETE FROM dbo.out_stockout WHERE stockout_id = @v_stockout_id;
END
ELSE
BEGIN
SET @v_result = 2;
SET @v_resultString = '不支持的出库单据状态';
ROLLBACK TRANSACTION;
RETURN;
END
COMMIT TRANSACTION;
SET @v_result = 10;
SET @v_resultString = '操作成功';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @v_result = 2;
SET @v_resultString = LEFT(ERROR_MESSAGE(), 100);
END CATCH
END
GO
IF OBJECT_ID(N'dbo.proc_out_hand_allocation', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_out_hand_allocation;
GO
CREATE PROCEDURE dbo.proc_out_hand_allocation
@v_stockout_detail_id varchar(80),
@v_stock_id varchar(80),
@v_result int OUTPUT,
@v_resultString varchar(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@stockout_id nvarchar(80),
@stockout_status int,
@warehouse_id nvarchar(80),
@customer_id nvarchar(255),
@customer_name nvarchar(255),
@product_id nvarchar(255),
@product_name nvarchar(255),
@lot_no nvarchar(80),
@locatio nvarchar(255),
@preferred_stock_id nvarchar(80),
@preferred_detail_id nvarchar(80),
@bill_qty decimal(18, 0),
@allot_qty decimal(18, 0),
@remaining decimal(18, 0);
DECLARE
@detail_id nvarchar(80),
@stock_id nvarchar(80),
@available_qty decimal(18, 0),
@alloc_qty decimal(18, 0),
@job_id nvarchar(80),
@task_no nvarchar(80),
@job_detail_id nvarchar(80),
@row_idx int,
@tray_code nvarchar(255),
@cargo_space_id nvarchar(80),
@cargo_space_name nvarchar(255),
@roadway_id nvarchar(80),
@stock_warehouse_id nvarchar(80),
@stock_warehouse_name nvarchar(255),
@supplier_id nvarchar(255),
@supplier_name nvarchar(255),
@exit_id nvarchar(80),
@now datetime = GETDATE();
SELECT TOP 1
@stockout_id = d.stockout_id,
@product_id = d.product_id,
@product_name = d.product_name,
@lot_no = d.lot_no,
@bill_qty = ISNULL(d.quantity, 0),
@allot_qty = ISNULL(d.allot_num, 0),
@locatio = NULLIF(d.locatio, ''),
@preferred_stock_id = NULLIF(d.stock_id, ''),
@preferred_detail_id = NULLIF(d.stock_detail_id, ''),
@warehouse_id = o.warehouse_id,
@customer_id = o.customer_id,
@customer_name = o.customer_name,
@stockout_status = TRY_CONVERT(int, o.status)
FROM dbo.out_stockout_detail d WITH (UPDLOCK, HOLDLOCK)
INNER JOIN dbo.out_stockout o ON d.stockout_id = o.stockout_id
WHERE d.stockout_detail_id = @v_stockout_detail_id;
IF @stockout_id IS NULL
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库子单不存在';
RETURN;
END
IF @stockout_status NOT IN (2, 3)
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库单据未审核';
RETURN;
END
SET @remaining = @bill_qty - @allot_qty;
IF @remaining <= 0
BEGIN
SET @v_result = 10;
SET @v_resultString = '出库子单已分配完成';
RETURN;
END
IF EXISTS (SELECT 1 FROM dbo.bas_stock_detail WHERE detail_id = @v_stock_id)
BEGIN
SET @preferred_detail_id = @v_stock_id;
SET @preferred_stock_id = NULL;
END
ELSE IF EXISTS (SELECT 1 FROM dbo.bas_stock WHERE stock_id = @v_stock_id)
BEGIN
SET @preferred_stock_id = @v_stock_id;
SET @preferred_detail_id = NULL;
END
BEGIN TRY
BEGIN TRANSACTION;
SELECT TOP 1
@detail_id = bsd.detail_id,
@stock_id = bs.stock_id,
@available_qty = ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0),
@tray_code = bs.tray_code,
@cargo_space_id = bs.cargo_space_id,
@cargo_space_name = bcs.cargo_space_name,
@roadway_id = bcs.roadway_id,
@stock_warehouse_id = bs.warehouse_id,
@stock_warehouse_name = bs.warehouse_name,
@supplier_id = bs.supplier_id,
@supplier_name = bs.supplier_name
FROM dbo.bas_stock_detail bsd WITH (UPDLOCK, HOLDLOCK)
INNER JOIN dbo.bas_stock bs WITH (UPDLOCK, HOLDLOCK) ON bsd.stock_id = bs.stock_id
LEFT JOIN dbo.bas_cargo_space bcs WITH (UPDLOCK, HOLDLOCK) ON bs.cargo_space_id = bcs.cargo_space_id
WHERE bsd.product_id = @product_id
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
AND (bsd.job_detail_id IS NULL OR bsd.job_detail_id = '')
AND (@warehouse_id IS NULL OR @warehouse_id = '' OR bs.warehouse_id = @warehouse_id)
AND (@locatio IS NULL OR bs.cargo_space_id = @locatio OR bcs.cargo_space_name = @locatio)
AND (@preferred_detail_id IS NULL OR bsd.detail_id = @preferred_detail_id)
AND (@preferred_stock_id IS NULL OR bs.stock_id = @preferred_stock_id)
ORDER BY
CASE WHEN bsd.detail_id = @v_stock_id THEN 0 ELSE 1 END,
bs.in_date ASC,
bs.cargo_space_id ASC,
bsd.detail_id ASC;
IF @detail_id IS NULL
BEGIN
SET @v_result = 2;
SET @v_resultString = '没有可分配库存明细';
ROLLBACK TRANSACTION;
RETURN;
END
SET @alloc_qty = CASE WHEN @available_qty >= @remaining THEN @remaining ELSE @available_qty END;
IF @alloc_qty <= 0
BEGIN
SET @v_result = 2;
SET @v_resultString = '库存可用数量不足';
ROLLBACK TRANSACTION;
RETURN;
END
SELECT TOP 1 @exit_id = point_id
FROM dbo.bas_station_point
WHERE warehouse_id = @stock_warehouse_id
AND point_type IN ('2', '3')
AND status = '0'
ORDER BY point_type DESC, point_id;
EXEC dbo.util_serial_job 'CK', @job_id OUTPUT;
EXEC dbo.util_serial_task '20', @task_no OUTPUT;
INSERT INTO dbo.mydo_job (
job_id, status, task_no, in_or_out, execution_phase,
tray_code, warehouse_id, warehouse_name, roadway_id,
cargo_space_id, cargo_space_name, line_type, priority,
height, weight, create_time, exit_id, customer_id, customer_name
)
VALUES (
@job_id, '1', @task_no, 20, '4',
@tray_code, @stock_warehouse_id, @stock_warehouse_name, @roadway_id,
@cargo_space_id, @cargo_space_name, '1', 10,
0.00, 0.00, @now, @exit_id, @customer_id, @customer_name
);
SET @job_detail_id = @job_id + '-1';
INSERT INTO dbo.mydo_job_detail (
job_detail_id, job_id, stock_id, lot_no, in_date,
in_or_out_id, in_or_out_d_id, product_id, product_name,
stock_quantity, out_quantity, stockin_detail_id,
customer_id, customer_name, supplier_id, supplier_name
)
VALUES (
@job_detail_id, @job_id, @stock_id, @lot_no, CONVERT(varchar(19), @now, 120),
@stockout_id, @v_stockout_detail_id, @product_id, @product_name,
@available_qty, @alloc_qty, @detail_id,
@customer_id, @customer_name, @supplier_id, @supplier_name
);
UPDATE dbo.bas_stock_detail
SET out_quantity = ISNULL(out_quantity, 0) + @alloc_qty,
job_detail_id = @job_detail_id,
update_time = SYSDATETIME()
WHERE detail_id = @detail_id;
UPDATE bs
SET quantity = ISNULL(bsa.quantity, 0),
out_quantity = ISNULL(bsa.out_quantity, 0)
FROM dbo.bas_stock bs
INNER JOIN (
SELECT stock_id,
SUM(ISNULL(quantity, 0)) AS quantity,
SUM(ISNULL(out_quantity, 0)) AS out_quantity
FROM dbo.bas_stock_detail
WHERE stock_id = @stock_id
GROUP BY stock_id
) bsa ON bsa.stock_id = bs.stock_id
WHERE bs.stock_id = @stock_id;
UPDATE dbo.bas_cargo_space
SET status = '4',
locked = 'Y',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id;
UPDATE dbo.out_stockout_detail
SET allot_num = ISNULL(allot_num, 0) + @alloc_qty,
status = CASE WHEN ISNULL(allot_num, 0) + @alloc_qty >= ISNULL(quantity, 0) THEN '1' ELSE '0' END,
stock_id = COALESCE(NULLIF(stock_id, ''), @stock_id),
stock_detail_id = COALESCE(NULLIF(stock_detail_id, ''), @detail_id)
WHERE stockout_detail_id = @v_stockout_detail_id;
UPDATE dbo.out_stockout
SET status = '3',
start_date = COALESCE(start_date, SYSDATETIME())
WHERE stockout_id = @stockout_id;
COMMIT TRANSACTION;
SET @v_result = 10;
SET @v_resultString = '成功:生成出库作业' + @job_id;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @v_result = 2;
SET @v_resultString = LEFT(ERROR_MESSAGE(), 100);
END CATCH
END
GO
IF OBJECT_ID(N'dbo.proc_out_auto_allocation', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_out_auto_allocation;
GO
CREATE PROCEDURE dbo.proc_out_auto_allocation
@v_stockout_detail_id varchar(80),
@v_result int OUTPUT,
@v_resultString varchar(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@stockout_id nvarchar(80),
@warehouse_id nvarchar(80),
@product_id nvarchar(255),
@lot_no nvarchar(80),
@locatio nvarchar(255),
@preferred_stock_id nvarchar(80),
@preferred_detail_id nvarchar(80),
@remaining decimal(18, 0),
@detail_id nvarchar(80),
@child_result int,
@child_msg varchar(100);
SELECT TOP 1
@stockout_id = d.stockout_id,
@warehouse_id = o.warehouse_id,
@product_id = d.product_id,
@lot_no = d.lot_no,
@locatio = NULLIF(d.locatio, ''),
@preferred_stock_id = NULLIF(d.stock_id, ''),
@preferred_detail_id = NULLIF(d.stock_detail_id, '')
FROM dbo.out_stockout_detail d
INNER JOIN dbo.out_stockout o ON d.stockout_id = o.stockout_id
WHERE d.stockout_detail_id = @v_stockout_detail_id;
IF @stockout_id IS NULL
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库子单不存在';
RETURN;
END
DECLARE cur_auto_stock CURSOR LOCAL FAST_FORWARD FOR
SELECT bsd.detail_id
FROM dbo.bas_stock_detail bsd
INNER JOIN dbo.bas_stock bs ON bsd.stock_id = bs.stock_id
LEFT JOIN dbo.bas_cargo_space bcs ON bs.cargo_space_id = bcs.cargo_space_id
WHERE bsd.product_id = @product_id
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
AND (bsd.job_detail_id IS NULL OR bsd.job_detail_id = '')
AND (@warehouse_id IS NULL OR @warehouse_id = '' OR bs.warehouse_id = @warehouse_id)
AND (@locatio IS NULL OR bs.cargo_space_id = @locatio OR bcs.cargo_space_name = @locatio)
AND (@preferred_stock_id IS NULL OR bs.stock_id = @preferred_stock_id)
AND (@preferred_detail_id IS NULL OR bsd.detail_id = @preferred_detail_id)
ORDER BY bs.in_date ASC, bs.cargo_space_id ASC, bsd.detail_id ASC;
OPEN cur_auto_stock;
FETCH NEXT FROM cur_auto_stock INTO @detail_id;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @remaining = ISNULL(quantity, 0) - ISNULL(allot_num, 0)
FROM dbo.out_stockout_detail
WHERE stockout_detail_id = @v_stockout_detail_id;
IF @remaining <= 0
BREAK;
EXEC dbo.proc_out_hand_allocation
@v_stockout_detail_id = @v_stockout_detail_id,
@v_stock_id = @detail_id,
@v_result = @child_result OUTPUT,
@v_resultString = @child_msg OUTPUT;
FETCH NEXT FROM cur_auto_stock INTO @detail_id;
END
CLOSE cur_auto_stock;
DEALLOCATE cur_auto_stock;
SELECT @remaining = ISNULL(quantity, 0) - ISNULL(allot_num, 0)
FROM dbo.out_stockout_detail
WHERE stockout_detail_id = @v_stockout_detail_id;
IF @remaining <= 0
BEGIN
SET @v_result = 10;
SET @v_resultString = '自动分配完成';
END
ELSE
BEGIN
SET @v_result = 2;
SET @v_resultString = '自动分配库存不足';
END
END
GO
IF OBJECT_ID(N'dbo.proc_out_makesure', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_out_makesure;
GO
CREATE PROCEDURE dbo.proc_out_makesure
@v_job_id varchar(80),
@v_dept_id int,
@v_user_id int,
@v_result int OUTPUT,
@v_resultmsg varchar(500) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@now datetime = GETDATE(),
@stockout_id nvarchar(80),
@job_detail_id nvarchar(80),
@stock_id nvarchar(80),
@stock_detail_id nvarchar(80),
@stockout_detail_id nvarchar(80),
@out_qty decimal(18, 0),
@cargo_space_id nvarchar(80),
@tray_code nvarchar(255);
DECLARE @affected_stock TABLE(stock_id nvarchar(80) PRIMARY KEY);
IF NOT EXISTS (SELECT 1 FROM dbo.mydo_job WHERE job_id = @v_job_id AND in_or_out >= 20)
BEGIN
SET @v_result = 2;
SET @v_resultmsg = '未找到对应出库作业';
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM dbo.mydo_job_detail WHERE job_id = @v_job_id)
BEGIN
SET @v_result = 2;
SET @v_resultmsg = '出库作业无明细';
RETURN;
END
BEGIN TRY
DECLARE cur_out_job_detail CURSOR LOCAL FAST_FORWARD FOR
SELECT job_detail_id, stock_id, stockin_detail_id, in_or_out_id, in_or_out_d_id, ISNULL(out_quantity, 0)
FROM dbo.mydo_job_detail
WHERE job_id = @v_job_id;
BEGIN TRANSACTION;
OPEN cur_out_job_detail;
FETCH NEXT FROM cur_out_job_detail INTO
@job_detail_id, @stock_id, @stock_detail_id, @stockout_id, @stockout_detail_id, @out_qty;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @out_qty <= 0
BEGIN
SET @v_result = 2;
SET @v_resultmsg = '出库作业数量异常';
ROLLBACK TRANSACTION;
RETURN;
END
IF @stock_detail_id IS NULL OR @stock_detail_id = ''
BEGIN
SELECT TOP 1 @stock_detail_id = detail_id
FROM dbo.bas_stock_detail
WHERE job_detail_id = @job_detail_id;
END
IF NOT EXISTS (
SELECT 1
FROM dbo.bas_stock_detail WITH (UPDLOCK, HOLDLOCK)
WHERE detail_id = @stock_detail_id
AND stock_id = @stock_id
AND ISNULL(quantity, 0) >= @out_qty
)
BEGIN
SET @v_result = 2;
SET @v_resultmsg = '库存不足或库存明细不存在';
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE dbo.out_stockout_detail
SET assign_num = ISNULL(assign_num, 0) + @out_qty,
actual_qt = ISNULL(assign_num, 0) + @out_qty,
status = CASE WHEN ISNULL(assign_num, 0) + @out_qty >= ISNULL(quantity, 0) THEN '2' ELSE status END
WHERE stockout_detail_id = @stockout_detail_id;
UPDATE dbo.bas_stock_detail
SET quantity = ISNULL(quantity, 0) - @out_qty,
out_quantity = CASE WHEN ISNULL(out_quantity, 0) - @out_qty < 0 THEN 0 ELSE ISNULL(out_quantity, 0) - @out_qty END,
job_detail_id = CASE WHEN job_detail_id = @job_detail_id THEN NULL ELSE job_detail_id END,
update_time = SYSDATETIME()
WHERE detail_id = @stock_detail_id
AND stock_id = @stock_id;
DELETE FROM dbo.bas_stock_detail
WHERE detail_id = @stock_detail_id
AND ISNULL(quantity, 0) <= 0;
IF NOT EXISTS (SELECT 1 FROM @affected_stock WHERE stock_id = @stock_id)
INSERT INTO @affected_stock(stock_id) VALUES (@stock_id);
FETCH NEXT FROM cur_out_job_detail INTO
@job_detail_id, @stock_id, @stock_detail_id, @stockout_id, @stockout_detail_id, @out_qty;
END
CLOSE cur_out_job_detail;
DEALLOCATE cur_out_job_detail;
DECLARE cur_stock CURSOR LOCAL FAST_FORWARD FOR
SELECT stock_id FROM @affected_stock;
OPEN cur_stock;
FETCH NEXT FROM cur_stock INTO @stock_id;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cargo_space_id = cargo_space_id,
@tray_code = tray_code
FROM dbo.bas_stock
WHERE stock_id = @stock_id;
IF EXISTS (SELECT 1 FROM dbo.bas_stock_detail WHERE stock_id = @stock_id)
BEGIN
UPDATE bs
SET bs.quantity = ISNULL(bsa.quantity, 0),
bs.out_quantity = ISNULL(bsa.out_quantity, 0),
bs.product_status = NULL,
bs.lot_no = NULL,
bs.product_id = NULL,
bs.product_name = NULL,
bs.job_detail_id = NULL,
bs.stockin_detail_id = NULL
FROM dbo.bas_stock bs
INNER JOIN (
SELECT stock_id,
SUM(ISNULL(quantity, 0)) AS quantity,
SUM(ISNULL(out_quantity, 0)) AS out_quantity
FROM dbo.bas_stock_detail
WHERE stock_id = @stock_id
GROUP BY stock_id
) bsa ON bsa.stock_id = bs.stock_id
WHERE bs.stock_id = @stock_id;
UPDATE dbo.bas_cargo_space
SET status = '2',
locked = 'N',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id;
END
ELSE
BEGIN
UPDATE dbo.bas_cargo_space
SET status = '1',
locked = 'N',
tray_code = NULL
WHERE cargo_space_id = @cargo_space_id;
DELETE FROM dbo.bas_stock WHERE stock_id = @stock_id;
END
FETCH NEXT FROM cur_stock INTO @stock_id;
END
CLOSE cur_stock;
DEALLOCATE cur_stock;
UPDATE dbo.mydo_job
SET status = '4',
finish_time = @now
WHERE job_id = @v_job_id;
INSERT INTO dbo.mydo_job_finish
SELECT * FROM dbo.mydo_job WHERE job_id = @v_job_id;
INSERT INTO dbo.mydo_job_detail_finish
SELECT * FROM dbo.mydo_job_detail WHERE job_id = @v_job_id;
DELETE FROM dbo.mydo_job_detail WHERE job_id = @v_job_id;
DELETE FROM dbo.mydo_job WHERE job_id = @v_job_id;
IF @stockout_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM dbo.out_stockout_detail
WHERE stockout_id = @stockout_id
AND ISNULL(assign_num, 0) < ISNULL(quantity, 0)
)
BEGIN
UPDATE dbo.out_stockout
SET status = '4',
finish_date = SYSDATETIME()
WHERE stockout_id = @stockout_id;
INSERT INTO dbo.out_stockout_detail_finish
SELECT * FROM dbo.out_stockout_detail WHERE stockout_id = @stockout_id;
INSERT INTO dbo.out_stockout_finish
SELECT * FROM dbo.out_stockout WHERE stockout_id = @stockout_id;
DELETE FROM dbo.out_stockout_detail WHERE stockout_id = @stockout_id;
DELETE FROM dbo.out_stockout WHERE stockout_id = @stockout_id;
END
COMMIT TRANSACTION;
SET @v_result = 10;
SET @v_resultmsg = '出库作业完成';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
IF CURSOR_STATUS('local','cur_out_job_detail') >= 0
BEGIN
CLOSE cur_out_job_detail;
DEALLOCATE cur_out_job_detail;
END
IF CURSOR_STATUS('local','cur_stock') >= 0
BEGIN
CLOSE cur_stock;
DEALLOCATE cur_stock;
END
SET @v_result = 2;
SET @v_resultmsg = ERROR_MESSAGE();
END CATCH
END
GO
IF OBJECT_ID(N'dbo.proc_hand_delete_out_job', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_hand_delete_out_job;
GO
CREATE PROCEDURE dbo.proc_hand_delete_out_job
@v_job_id varchar(80),
@v_result int OUTPUT,
@v_resultmsg varchar(500) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@stockout_id nvarchar(80),
@job_detail_id nvarchar(80),
@stock_id nvarchar(80),
@stock_detail_id nvarchar(80),
@stockout_detail_id nvarchar(80),
@out_qty decimal(18, 0),
@cargo_space_id nvarchar(80),
@tray_code nvarchar(255);
DECLARE @affected_stock TABLE(stock_id nvarchar(80) PRIMARY KEY);
IF NOT EXISTS (SELECT 1 FROM dbo.mydo_job WHERE job_id = @v_job_id AND in_or_out >= 20)
BEGIN
SET @v_result = 2;
SET @v_resultmsg = '未找到对应出库作业';
RETURN;
END
BEGIN TRY
DECLARE cur_cancel_out CURSOR LOCAL FAST_FORWARD FOR
SELECT job_detail_id, stock_id, stockin_detail_id, in_or_out_id, in_or_out_d_id, ISNULL(out_quantity, 0)
FROM dbo.mydo_job_detail
WHERE job_id = @v_job_id;
BEGIN TRANSACTION;
OPEN cur_cancel_out;
FETCH NEXT FROM cur_cancel_out INTO
@job_detail_id, @stock_id, @stock_detail_id, @stockout_id, @stockout_detail_id, @out_qty;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE dbo.bas_stock_detail
SET out_quantity = CASE WHEN ISNULL(out_quantity, 0) - @out_qty < 0 THEN 0 ELSE ISNULL(out_quantity, 0) - @out_qty END,
job_detail_id = CASE WHEN job_detail_id = @job_detail_id THEN NULL ELSE job_detail_id END,
update_time = SYSDATETIME()
WHERE detail_id = @stock_detail_id
OR job_detail_id = @job_detail_id;
UPDATE dbo.out_stockout_detail
SET allot_num = CASE WHEN ISNULL(allot_num, 0) - @out_qty < 0 THEN 0 ELSE ISNULL(allot_num, 0) - @out_qty END,
status = CASE WHEN ISNULL(allot_num, 0) - @out_qty <= 0 THEN '0' ELSE status END
WHERE stockout_detail_id = @stockout_detail_id;
IF NOT EXISTS (SELECT 1 FROM @affected_stock WHERE stock_id = @stock_id)
INSERT INTO @affected_stock(stock_id) VALUES (@stock_id);
FETCH NEXT FROM cur_cancel_out INTO
@job_detail_id, @stock_id, @stock_detail_id, @stockout_id, @stockout_detail_id, @out_qty;
END
CLOSE cur_cancel_out;
DEALLOCATE cur_cancel_out;
DECLARE cur_cancel_stock CURSOR LOCAL FAST_FORWARD FOR
SELECT stock_id FROM @affected_stock;
OPEN cur_cancel_stock;
FETCH NEXT FROM cur_cancel_stock INTO @stock_id;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cargo_space_id = cargo_space_id,
@tray_code = tray_code
FROM dbo.bas_stock
WHERE stock_id = @stock_id;
UPDATE bs
SET quantity = ISNULL(bsa.quantity, 0),
out_quantity = ISNULL(bsa.out_quantity, 0)
FROM dbo.bas_stock bs
INNER JOIN (
SELECT stock_id,
SUM(ISNULL(quantity, 0)) AS quantity,
SUM(ISNULL(out_quantity, 0)) AS out_quantity
FROM dbo.bas_stock_detail
WHERE stock_id = @stock_id
GROUP BY stock_id
) bsa ON bsa.stock_id = bs.stock_id
WHERE bs.stock_id = @stock_id;
UPDATE dbo.bas_cargo_space
SET status = '2',
locked = 'N',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id
AND EXISTS (SELECT 1 FROM dbo.bas_stock WHERE stock_id = @stock_id);
FETCH NEXT FROM cur_cancel_stock INTO @stock_id;
END
CLOSE cur_cancel_stock;
DEALLOCATE cur_cancel_stock;
DELETE FROM dbo.mydo_job_detail WHERE job_id = @v_job_id;
DELETE FROM dbo.mydo_job WHERE job_id = @v_job_id;
IF @stockout_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM dbo.mydo_job_detail
WHERE in_or_out_id = @stockout_id
)
BEGIN
UPDATE dbo.out_stockout
SET status = '2',
start_date = NULL
WHERE stockout_id = @stockout_id
AND status = '3';
END
COMMIT TRANSACTION;
SET @v_result = 10;
SET @v_resultmsg = '出库作业已作废';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
IF CURSOR_STATUS('local','cur_cancel_out') >= 0
BEGIN
CLOSE cur_cancel_out;
DEALLOCATE cur_cancel_out;
END
IF CURSOR_STATUS('local','cur_cancel_stock') >= 0
BEGIN
CLOSE cur_cancel_stock;
DEALLOCATE cur_cancel_stock;
END
SET @v_result = 2;
SET @v_resultmsg = ERROR_MESSAGE();
END CATCH
END
GO

View File

@@ -0,0 +1,126 @@
IF OBJECT_ID(N'[dbo].[proc_add_in_job]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[proc_add_in_job]
GO
CREATE PROCEDURE [dbo].[proc_add_in_job]
@tray_code NVARCHAR(255),
@warehouse_id NVARCHAR(255),
@user_id INT,
@dept_id INT,
@v_result INT OUTPUT,
@v_resultmsg VARCHAR(80) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@task_no varchar(255),
@job_id varchar(255),
@now DATETIME = GETDATE();
DECLARE
@row_idx INT = 1,
@job_detail_id NVARCHAR(80),
@product_id NVARCHAR(255),
@product_name NVARCHAR(255),
@lot_no NVARCHAR(80),
@quantity DECIMAL(18),
@stockin_id NVARCHAR(80),
@stockin_detail_id NVARCHAR(255);
IF NOT EXISTS (SELECT 1 FROM dbo.in_tray_msg WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id)
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '错误:托盘无绑定数据';
RETURN;
END
IF EXISTS (SELECT 1 FROM dbo.mydo_job WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id)
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '错误:该托盘已生成作业';
RETURN;
END
BEGIN TRY
DECLARE cur_tray CURSOR LOCAL FAST_FORWARD FOR
SELECT
tm.product_id,
ISNULL(d.product_name, ''),
ISNULL(d.lot_no, ''),
tm.quantity,
ISNULL(d.stockin_id, ''),
tm.stockin_detail_id
FROM dbo.in_tray_msg tm
LEFT JOIN dbo.in_stockin_detail d ON tm.stockin_detail_id = d.stockin_detail_id
WHERE tm.tray_code = @tray_code
AND tm.warehouse_id = @warehouse_id;
BEGIN TRANSACTION;
EXEC dbo.util_serial_job 'RK', @job_id OUTPUT;
EXEC dbo.util_serial_task '1', @task_no OUTPUT;
INSERT INTO dbo.mydo_job (
job_id, status, task_no, in_or_out, execution_phase,
tray_code, warehouse_id, create_time,
user_id, dept_id, priority, height, weight
)
VALUES (
@job_id, '1', @task_no, 1, '0',
@tray_code, @warehouse_id, @now,
@user_id, @dept_id, 10, 0.00, 0.00
);
OPEN cur_tray;
FETCH NEXT FROM cur_tray INTO
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @job_detail_id = @job_id + '-' + CAST(@row_idx AS VARCHAR);
-- stockin_id/stockin_detail_id 为入库单追溯字段;in_or_out_id/in_or_out_d_id 为通用出入库追溯字段。
INSERT INTO dbo.mydo_job_detail (
job_detail_id, job_id, product_id, product_name,
lot_no, in_quantity, in_or_out_id, in_or_out_d_id,
stockin_id, stockin_detail_id
)
VALUES (
@job_detail_id, @job_id, @product_id, @product_name,
@lot_no, @quantity, @stockin_id, @stockin_detail_id,
@stockin_id, @stockin_detail_id
);
SET @row_idx += 1;
FETCH NEXT FROM cur_tray INTO
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id;
END
CLOSE cur_tray;
DEALLOCATE cur_tray;
DELETE FROM dbo.in_tray_msg
WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id;
COMMIT TRANSACTION;
SET @v_result = 1;
SET @v_resultmsg = '成功:入库作业生成完成';
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
IF CURSOR_STATUS('local','cur_tray') >= 0
BEGIN
CLOSE cur_tray;
DEALLOCATE cur_tray;
END
SET @v_result = 0;
SET @v_resultmsg = LEFT(ERROR_MESSAGE(), 80);
END CATCH
END
GO

View File

@@ -0,0 +1,164 @@
IF OBJECT_ID(N'[dbo].[in_tray_msg]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[in_tray_msg] (
[id] bigint IDENTITY(1,1) NOT NULL,
[tray_code] varchar(80) COLLATE Chinese_PRC_CI_AS NOT NULL,
[stockin_detail_id] varchar(80) COLLATE Chinese_PRC_CI_AS NOT NULL,
[product_Id] varchar(80) COLLATE Chinese_PRC_CI_AS NULL,
[quantity] decimal(18,4) NOT NULL,
[warehouse_id] varchar(80) COLLATE Chinese_PRC_CI_AS NOT NULL,
[user_id] bigint NULL,
[dept_id] bigint NULL,
[create_time] datetime2(7) NULL,
CONSTRAINT [PK_in_tray_msg] PRIMARY KEY CLUSTERED ([id])
);
END
GO
IF COL_LENGTH('dbo.in_tray_msg', 'warehouse_id') IS NULL
ALTER TABLE dbo.in_tray_msg ADD warehouse_id varchar(80) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF COL_LENGTH('dbo.in_tray_msg', 'user_id') IS NULL
ALTER TABLE dbo.in_tray_msg ADD user_id bigint NULL;
GO
IF COL_LENGTH('dbo.in_tray_msg', 'dept_id') IS NULL
ALTER TABLE dbo.in_tray_msg ADD dept_id bigint NULL;
GO
IF COL_LENGTH('dbo.in_tray_msg', 'product_Id') IS NULL AND COL_LENGTH('dbo.in_tray_msg', 'product_id') IS NULL
ALTER TABLE dbo.in_tray_msg ADD product_Id varchar(80) COLLATE Chinese_PRC_CI_AS NULL;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_in_tray_msg_tray_warehouse' AND object_id = OBJECT_ID(N'[dbo].[in_tray_msg]'))
CREATE INDEX [IX_in_tray_msg_tray_warehouse] ON [dbo].[in_tray_msg] ([tray_code], [warehouse_id]);
GO
IF OBJECT_ID(N'[dbo].[proc_bind_tray_msg]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[proc_bind_tray_msg]
GO
CREATE PROCEDURE [dbo].[proc_bind_tray_msg]
@v_stockin_detail_id varchar(80),
@v_tray_code varchar(80),
@v_warehouse_id varchar(80),
@v_quantity decimal(18,4),
@v_user_id bigint,
@v_dept_id bigint,
@v_result int OUTPUT,
@v_resultmsg varchar(500) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE
@v_product_id varchar(80),
@v_bill_quantity decimal(18,4),
@v_scan_num decimal(18,4);
BEGIN TRY
IF @v_stockin_detail_id IS NULL OR LTRIM(RTRIM(@v_stockin_detail_id)) = ''
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '入库子单ID不能为空';
RETURN;
END
IF @v_tray_code IS NULL OR LTRIM(RTRIM(@v_tray_code)) = ''
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '托盘号不能为空';
RETURN;
END
IF @v_warehouse_id IS NULL OR LTRIM(RTRIM(@v_warehouse_id)) = ''
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '仓库编码不能为空';
RETURN;
END
IF ISNULL(@v_quantity, 0) <= 0
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '绑定数量必须大于0';
RETURN;
END
SELECT TOP 1
@v_product_id = product_id,
@v_bill_quantity = ISNULL(quantity, 0),
@v_scan_num = ISNULL(scan_num, 0)
FROM dbo.in_stockin_detail WITH (UPDLOCK, HOLDLOCK)
WHERE stockin_detail_id = @v_stockin_detail_id;
IF @v_product_id IS NULL
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '入库子单不存在';
RETURN;
END
IF @v_scan_num + @v_quantity > @v_bill_quantity
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '绑定数量超过子单待绑数量';
RETURN;
END
BEGIN TRANSACTION;
UPDATE dbo.in_stockin_detail
SET scan_num = ISNULL(scan_num, 0) + @v_quantity
WHERE stockin_detail_id = @v_stockin_detail_id
AND ISNULL(scan_num, 0) + @v_quantity <= ISNULL(quantity, 0);
IF @@ROWCOUNT = 0
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '绑定数量超过子单待绑数量';
ROLLBACK TRANSACTION;
RETURN;
END
IF EXISTS (
SELECT 1 FROM dbo.in_tray_msg
WHERE tray_code = @v_tray_code
AND warehouse_id = @v_warehouse_id
AND stockin_detail_id = @v_stockin_detail_id
)
BEGIN
UPDATE dbo.in_tray_msg
SET quantity = ISNULL(quantity, 0) + @v_quantity,
product_Id = @v_product_id,
user_id = @v_user_id,
dept_id = @v_dept_id
WHERE tray_code = @v_tray_code
AND warehouse_id = @v_warehouse_id
AND stockin_detail_id = @v_stockin_detail_id;
END
ELSE
BEGIN
INSERT INTO dbo.in_tray_msg (
tray_code, stockin_detail_id, product_Id, quantity,
warehouse_id, user_id, dept_id, create_time
)
VALUES (
@v_tray_code, @v_stockin_detail_id, @v_product_id, @v_quantity,
@v_warehouse_id, @v_user_id, @v_dept_id, GETDATE()
);
END
COMMIT TRANSACTION;
SET @v_result = 1;
SET @v_resultmsg = '绑盘成功';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @v_result = 0;
SET @v_resultmsg = ERROR_MESSAGE();
END CATCH
END
GO

View File

@@ -0,0 +1,85 @@
IF OBJECT_ID(N'[dbo].[proc_hand_delete_in_job]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[proc_hand_delete_in_job]
GO
CREATE PROCEDURE [dbo].[proc_hand_delete_in_job]
@v_job_id varchar(80),
@v_result int OUTPUT,
@v_resultmsg varchar(500) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @v_tray_code varchar(255);
DECLARE @v_cargo_space_id varchar(80);
BEGIN TRY
IF @v_job_id IS NULL OR LTRIM(RTRIM(@v_job_id)) = ''
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '作业ID不能为空';
RETURN;
END
SELECT TOP 1
@v_tray_code = tray_code,
@v_cargo_space_id = cargo_space_id
FROM dbo.mydo_job
WHERE job_id = @v_job_id
AND in_or_out = 1;
IF @v_tray_code IS NULL AND @v_cargo_space_id IS NULL
BEGIN
SET @v_result = 0;
SET @v_resultmsg = '未找到对应入库作业';
RETURN;
END
BEGIN TRANSACTION;
;WITH detail_qty AS (
SELECT
COALESCE(NULLIF(stockin_detail_id, ''), NULLIF(in_or_out_d_id, '')) AS stockin_detail_id,
SUM(ISNULL(in_quantity, 0)) AS rollback_qty
FROM dbo.mydo_job_detail
WHERE job_id = @v_job_id
AND COALESCE(NULLIF(stockin_detail_id, ''), NULLIF(in_or_out_d_id, '')) IS NOT NULL
GROUP BY COALESCE(NULLIF(stockin_detail_id, ''), NULLIF(in_or_out_d_id, ''))
)
UPDATE d
SET d.scan_num = CASE
WHEN ISNULL(d.scan_num, 0) - q.rollback_qty < 0 THEN 0
ELSE ISNULL(d.scan_num, 0) - q.rollback_qty
END
FROM dbo.in_stockin_detail d
INNER JOIN detail_qty q ON d.stockin_detail_id = q.stockin_detail_id;
UPDATE dbo.bas_cargo_space
SET status = '1',
locked = 'N',
tray_code = NULL
WHERE cargo_space_id = @v_cargo_space_id
OR (tray_code = @v_tray_code AND status = '3' AND locked = 'Y');
DELETE FROM dbo.mydo_job_detail
WHERE job_id = @v_job_id;
DELETE FROM dbo.mydo_job
WHERE job_id = @v_job_id
AND in_or_out = 1;
COMMIT TRANSACTION;
SET @v_result = 10;
SET @v_resultmsg = '入库作业已作废';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @v_result = 0;
SET @v_resultmsg = ERROR_MESSAGE();
END CATCH
END
GO