feat: 打通出库作业链路
This commit is contained in:
255
sql/bas_stock_master_detail.sql
Normal file
255
sql/bas_stock_master_detail.sql
Normal 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
|
||||
Reference in New Issue
Block a user