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