254 lines
9.8 KiB
PL/PgSQL
254 lines
9.8 KiB
PL/PgSQL
/*
|
|
* 盘点回库库存追溯修复:
|
|
* 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
|