Files
FTC25009/sql/bas_stock_master_detail.sql

313 lines
10 KiB
Transact-SQL

IF OBJECT_ID(N'dbo.bas_stock_detail', N'U') IS NULL
BEGIN
CREATE TABLE dbo.bas_stock_detail (
detail_id nvarchar(80) 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,
project_no 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 COL_LENGTH('dbo.bas_stock', 'project_no') IS NULL
BEGIN
ALTER TABLE dbo.bas_stock ADD project_no nvarchar(80) NULL;
END
GO
IF COL_LENGTH('dbo.bas_stock_detail', 'project_no') IS NULL
BEGIN
ALTER TABLE dbo.bas_stock_detail ADD project_no nvarchar(80) NULL;
END
GO
IF COL_LENGTH('dbo.bas_stock_detail', 'detail_id') < 160
BEGIN
ALTER TABLE dbo.bas_stock_detail ALTER COLUMN detail_id nvarchar(80) NOT NULL;
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, project_no, create_time
)
SELECT
bs.stock_id + N'-1',
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,
bs.project_no,
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
UPDATE bs
SET bs.warehouse_name = bw.warehouse_name
FROM dbo.bas_stock bs
INNER JOIN dbo.bas_warehouse bw ON bs.warehouse_id = bw.warehouse_id
WHERE (bs.warehouse_name IS NULL OR bs.warehouse_name = '')
AND bw.warehouse_name IS NOT NULL;
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 DATETIME2(3) = SYSDATETIME(),
@tray_code NVARCHAR(255),
@warehouse_id NVARCHAR(80),
@warehouse_name NVARCHAR(255),
@cargo_space_id NVARCHAR(80),
@stock_id NVARCHAR(32),
@detail_id NVARCHAR(80),
@detail_index INT = 0,
@in_type NVARCHAR(5);
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),
@project_no NVARCHAR(80);
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,
@warehouse_name = ISNULL(NULLIF(warehouse_name, ''), (
SELECT TOP 1 bw.warehouse_name
FROM bas_warehouse bw
WHERE bw.warehouse_id = mydo_job.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, project_no
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, @project_no;
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;
IF @stock_id IS NULL
BEGIN
SELECT TOP 1 @in_type = source.in_type
FROM (
SELECT 1 AS source_order, current_bill.in_type
FROM dbo.in_stockin current_bill
WHERE current_bill.stockin_id = @stockin_id
UNION ALL
SELECT 2 AS source_order, history_bill.in_type
FROM dbo.in_stockin_finish history_bill
WHERE history_bill.stockin_id = @stockin_id
UNION ALL
SELECT 3 AS source_order, archived_stock.in_type
FROM dbo.bas_stock_detail_finish archived_detail
INNER JOIN dbo.bas_stock_finish archived_stock
ON archived_stock.stock_id = archived_detail.stock_id
WHERE archived_detail.detail_id = @stockin_detail_id
) source
WHERE NULLIF(LTRIM(RTRIM(source.in_type)), '') IS NOT NULL
ORDER BY source.source_order;
SET @stock_id = 'KC' + FORMAT(@now, 'yyyyMMddHHmmssfff');
INSERT INTO bas_stock (
stock_id, cargo_space_id, stock_status, in_date, quantity,
job_id, tray_code, out_quantity, stockin_id, project_no, in_type, warehouse_id, warehouse_name
)
VALUES (
@stock_id, @cargo_space_id, '1', @now, 0,
@job_id, @tray_code, 0, @stockin_id, @project_no, @in_type, @warehouse_id, @warehouse_name
);
END;
SET @detail_index = @detail_index + 1;
SET @detail_id = @stock_id + N'-' + CONVERT(NVARCHAR(10), @detail_index);
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, project_no, create_time
)
VALUES (
@detail_id, @stock_id, '1', @lot_no, @product_id, @product_name,
@in_quantity, 0, @job_detail_id, @stockin_detail_id, @project_no, @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, @project_no;
END;
CLOSE cur_finish_job_detail;
DEALLOCATE cur_finish_job_detail;
UPDATE bas_cargo_space
SET status = '2', tray_code = @tray_code
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