/* * 盘点回库库存追溯修复: * 1. 仅回填能够唯一关联到原库存归档的入库主单和入库类型; * 2. 完成入库时同时查询当前、历史入库主单和原库存归档。 */ SET NOCOUNT ON; GO IF OBJECT_ID(N'dbo.bas_stock', N'U') IS NOT NULL AND OBJECT_ID(N'dbo.mydo_job_finish', N'U') IS NOT NULL AND OBJECT_ID(N'dbo.mydo_job_detail_finish', N'U') IS NOT NULL AND OBJECT_ID(N'dbo.bas_stock_detail_finish', N'U') IS NOT NULL AND OBJECT_ID(N'dbo.bas_stock_finish', N'U') IS NOT NULL BEGIN ;WITH trace_candidates AS ( SELECT target.stock_id AS new_stock_id, COALESCE(NULLIF(inbound_detail.stockin_id, ''), archived_stock.stockin_id) AS traced_stockin_id, archived_stock.in_type AS archived_in_type, current_bill.in_type AS current_in_type, history_bill.in_type AS history_in_type FROM dbo.bas_stock target INNER JOIN dbo.mydo_job_finish inbound_job ON inbound_job.job_id = target.job_id AND inbound_job.in_or_out IN (10, 11) INNER JOIN dbo.mydo_job_detail_finish inbound_detail ON inbound_detail.job_id = inbound_job.job_id INNER JOIN dbo.bas_stock_detail_finish archived_detail ON archived_detail.detail_id = inbound_detail.stockin_detail_id INNER JOIN dbo.bas_stock_finish archived_stock ON archived_stock.stock_id = archived_detail.stock_id LEFT JOIN dbo.in_stockin current_bill ON current_bill.stockin_id = COALESCE(NULLIF(inbound_detail.stockin_id, ''), archived_stock.stockin_id) LEFT JOIN dbo.in_stockin_finish history_bill ON history_bill.stockin_id = COALESCE(NULLIF(inbound_detail.stockin_id, ''), archived_stock.stockin_id) ), unique_trace AS ( SELECT new_stock_id, MAX(traced_stockin_id) AS traced_stockin_id, MAX(COALESCE(current_in_type, history_in_type, archived_in_type)) AS traced_in_type FROM trace_candidates GROUP BY new_stock_id HAVING COUNT(DISTINCT ISNULL(traced_stockin_id, '')) <= 1 AND COUNT(DISTINCT ISNULL(COALESCE(current_in_type, history_in_type, archived_in_type), '')) <= 1 ) UPDATE target SET target.stockin_id = COALESCE(NULLIF(target.stockin_id, ''), unique_trace.traced_stockin_id), target.in_type = COALESCE(NULLIF(target.in_type, ''), unique_trace.traced_in_type) FROM dbo.bas_stock target INNER JOIN unique_trace ON unique_trace.new_stock_id = target.stock_id WHERE (target.stockin_id IS NULL OR target.stockin_id = '' OR target.in_type IS NULL OR target.in_type = '') AND (NULLIF(target.stockin_id, '') IS NULL OR NULLIF(target.stockin_id, '') = NULLIF(unique_trace.traced_stockin_id, '')) AND (NULLIF(target.in_type, '') IS NULL OR NULLIF(target.in_type, '') = NULLIF(unique_trace.traced_in_type, '')); END; GO CREATE OR ALTER 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 dbo.mydo_job WHERE job_id = @job_id) BEGIN SET @v_result = 0; SET @v_resultmsg = '错误:作业不存在'; RETURN; END; IF NOT EXISTS (SELECT 1 FROM dbo.mydo_job_detail WHERE job_id = @job_id) BEGIN SET @v_result = 0; SET @v_resultmsg = '错误:作业无明细'; RETURN; END; SELECT @cargo_space_id = job.cargo_space_id, @tray_code = job.tray_code, @warehouse_id = job.warehouse_id, @warehouse_name = ISNULL(NULLIF(job.warehouse_name, ''), ( SELECT TOP 1 warehouse.warehouse_name FROM dbo.bas_warehouse warehouse WHERE warehouse.warehouse_id = job.warehouse_id )) FROM dbo.mydo_job job WHERE job.job_id = @job_id; IF NOT EXISTS (SELECT 1 FROM dbo.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 dbo.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 dbo.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 dbo.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 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 ) 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 dbo.bas_cargo_space SET status = '2', tray_code = @tray_code WHERE cargo_space_id = @cargo_space_id; UPDATE stock SET stock.product_status = NULL, stock.lot_no = NULL, stock.product_id = NULL, stock.product_name = NULL, stock.quantity = ISNULL(summary.quantity, 0), stock.job_detail_id = NULL, stock.out_quantity = ISNULL(summary.out_quantity, 0), stock.stockin_detail_id = NULL FROM dbo.bas_stock stock LEFT 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 ) summary ON summary.stock_id = stock.stock_id WHERE stock.stock_id = @stock_id; UPDATE dbo.mydo_job SET status = '4', finish_time = GETDATE() WHERE job_id = @job_id; INSERT INTO dbo.mydo_job_finish SELECT * FROM dbo.mydo_job WHERE job_id = @job_id; INSERT INTO dbo.mydo_job_detail_finish SELECT * FROM dbo.mydo_job_detail WHERE job_id = @job_id; DELETE FROM dbo.mydo_job_detail WHERE job_id = @job_id; DELETE FROM dbo.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