chore: 保存盘点开发前改动

This commit is contained in:
zgw
2026-06-25 17:42:39 +08:00
parent 1af5b3cbd3
commit 4b8bc03343
114 changed files with 10005 additions and 1392 deletions

View File

@@ -46,6 +46,78 @@ BEGIN
END
GO
IF OBJECT_ID(N'dbo.bas_stock_finish', N'U') IS NULL
BEGIN
CREATE TABLE dbo.bas_stock_finish (
stock_id nvarchar(32) NOT NULL,
cargo_space_id nvarchar(80) NULL,
stock_status nvarchar(2) NULL,
product_status nvarchar(2) NULL,
lot_no nvarchar(80) NULL,
in_date datetime2(7) NULL,
back_date datetime2(7) NULL,
product_id nvarchar(80) NULL,
product_name nvarchar(255) NULL,
quantity decimal(18, 0) NULL,
job_id nvarchar(80) NULL,
job_detail_id nvarchar(255) NULL,
tray_code nvarchar(225) NULL,
out_quantity decimal(18, 0) NULL,
stockin_detail_id nvarchar(80) NULL,
stockin_id nvarchar(80) NULL,
in_type nvarchar(5) NULL,
warehouse_id nvarchar(80) NULL,
warehouse_name nvarchar(255) NULL,
user_id int NULL,
user_name nvarchar(255) NULL,
dept_id int NULL,
dept_name nvarchar(255) NULL,
supplier_id nvarchar(255) NULL,
supplier_name nvarchar(255) NULL,
delete_time datetime2(7) NULL
);
END
GO
IF COL_LENGTH('dbo.bas_stock_finish', 'delete_time') IS NULL
BEGIN
ALTER TABLE dbo.bas_stock_finish ADD delete_time datetime2(7) NULL;
END
GO
IF OBJECT_ID(N'dbo.bas_stock_detail_finish', N'U') IS NULL
BEGIN
CREATE TABLE dbo.bas_stock_detail_finish (
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,
create_time datetime2(7) NULL,
update_time datetime2(7) NULL,
remark nvarchar(500) NULL,
delete_time datetime2(7) NULL
);
END
GO
IF COL_LENGTH('dbo.bas_stock_detail_finish', 'delete_time') IS NULL
BEGIN
ALTER TABLE dbo.bas_stock_detail_finish ADD delete_time datetime2(7) NULL;
END
GO
IF COL_LENGTH('dbo.bas_stock_detail_finish', 'detail_id') < 160
BEGIN
ALTER TABLE dbo.bas_stock_detail_finish ALTER COLUMN detail_id nvarchar(80) NOT NULL;
END
GO
IF OBJECT_ID(N'dbo.proc_update_outbill_status', N'P') IS NOT NULL
DROP PROCEDURE dbo.proc_update_outbill_status;
GO
@@ -182,6 +254,7 @@ GO
CREATE PROCEDURE dbo.proc_out_hand_allocation
@v_stockout_detail_id varchar(80),
@v_stock_id varchar(80),
@v_exit_id varchar(80),
@v_result int OUTPUT,
@v_resultString varchar(100) OUTPUT
AS
@@ -211,10 +284,12 @@ BEGIN
@available_qty decimal(18, 0),
@alloc_qty decimal(18, 0),
@job_id nvarchar(80),
@job_type int,
@task_no nvarchar(80),
@job_detail_id nvarchar(80),
@row_idx int,
@tray_code nvarchar(255),
@tray_type nvarchar(80),
@cargo_space_id nvarchar(80),
@cargo_space_name nvarchar(255),
@roadway_id nvarchar(80),
@@ -223,6 +298,7 @@ BEGIN
@supplier_id nvarchar(255),
@supplier_name nvarchar(255),
@exit_id nvarchar(80),
@existing_job_id nvarchar(80),
@now datetime = GETDATE();
SELECT TOP 1
@@ -257,6 +333,13 @@ BEGIN
RETURN;
END
IF @v_exit_id IS NULL OR LTRIM(RTRIM(@v_exit_id)) = ''
BEGIN
SET @v_result = 2;
SET @v_resultString = '请选择出库口';
RETURN;
END
SET @remaining = @bill_qty - @allot_qty;
IF @remaining <= 0
BEGIN
@@ -288,16 +371,52 @@ BEGIN
@cargo_space_name = bcs.cargo_space_name,
@roadway_id = bcs.roadway_id,
@stock_warehouse_id = bs.warehouse_id,
@stock_warehouse_name = bs.warehouse_name,
@stock_warehouse_name = ISNULL(NULLIF(bs.warehouse_name, ''), bw.warehouse_name),
@tray_type = bbf.tray_type,
@supplier_id = bs.supplier_id,
@supplier_name = bs.supplier_name
FROM dbo.bas_stock_detail bsd WITH (UPDLOCK, HOLDLOCK)
INNER JOIN dbo.bas_stock bs WITH (UPDLOCK, HOLDLOCK) ON bsd.stock_id = bs.stock_id
LEFT JOIN dbo.bas_cargo_space bcs WITH (UPDLOCK, HOLDLOCK) ON bs.cargo_space_id = bcs.cargo_space_id
LEFT JOIN dbo.bas_warehouse bw ON bs.warehouse_id = bw.warehouse_id
OUTER APPLY (
SELECT TOP 1 prefix AS tray_type
FROM dbo.bas_barcode_format bbf
WHERE bbf.prefix IS NOT NULL
AND bbf.prefix != ''
AND bs.tray_code IS NOT NULL
AND LEFT(bs.tray_code, LEN(bbf.prefix)) = bbf.prefix
ORDER BY LEN(bbf.prefix) DESC
) bbf
WHERE bsd.product_id = @product_id
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
AND (bsd.job_detail_id IS NULL OR bsd.job_detail_id = '')
AND (
bsd.job_detail_id IS NULL OR bsd.job_detail_id = ''
OR NOT EXISTS (
SELECT 1
FROM dbo.mydo_job_detail lock_jd
INNER JOIN dbo.mydo_job lock_j ON lock_j.job_id = lock_jd.job_id
WHERE lock_jd.job_detail_id = bsd.job_detail_id
AND lock_j.in_or_out >= 20
AND lock_j.status IN ('1', '2', '3')
)
)
AND (
bcs.status = '2'
OR EXISTS (
SELECT 1
FROM dbo.mydo_job ej
INNER JOIN dbo.mydo_job_detail ejd ON ej.job_id = ejd.job_id
WHERE ej.in_or_out >= 20
AND ej.status IN ('1', '2', '3')
AND ej.cargo_space_id = bs.cargo_space_id
AND ISNULL(ej.tray_code, '') = ISNULL(bs.tray_code, '')
AND ISNULL(ej.exit_id, '') = ISNULL(@v_exit_id, '')
AND ejd.in_or_out_id = @stockout_id
AND ejd.stock_id = bs.stock_id
)
)
AND (@warehouse_id IS NULL OR @warehouse_id = '' OR bs.warehouse_id = @warehouse_id)
AND (@locatio IS NULL OR bs.cargo_space_id = @locatio OR bcs.cargo_space_name = @locatio)
AND (@preferred_detail_id IS NULL OR bsd.detail_id = @preferred_detail_id)
@@ -317,6 +436,7 @@ BEGIN
END
SET @alloc_qty = CASE WHEN @available_qty >= @remaining THEN @remaining ELSE @available_qty END;
SET @job_type = CASE WHEN @alloc_qty < @available_qty THEN 21 ELSE 20 END;
IF @alloc_qty <= 0
BEGIN
SET @v_result = 2;
@@ -325,30 +445,90 @@ BEGIN
RETURN;
END
SELECT TOP 1 @exit_id = point_id
FROM dbo.bas_station_point
WHERE warehouse_id = @stock_warehouse_id
AND point_type IN ('2', '3')
AND status = '0'
ORDER BY point_type DESC, point_id;
EXEC dbo.util_serial_job 'CK', @job_id OUTPUT;
EXEC dbo.util_serial_task '20', @task_no OUTPUT;
INSERT INTO dbo.mydo_job (
job_id, status, task_no, in_or_out, execution_phase,
tray_code, warehouse_id, warehouse_name, roadway_id,
cargo_space_id, cargo_space_name, line_type, priority,
height, weight, create_time, exit_id, customer_id, customer_name
IF NOT EXISTS (
SELECT 1
FROM dbo.bas_station_point sp
WHERE sp.point_id = @v_exit_id
AND sp.warehouse_id = @stock_warehouse_id
AND sp.point_type IN ('2', '3')
AND sp.status = '0'
AND ISNULL(sp.point_status, '0') = '0'
)
VALUES (
@job_id, '1', @task_no, 20, '4',
@tray_code, @stock_warehouse_id, @stock_warehouse_name, @roadway_id,
@cargo_space_id, @cargo_space_name, '1', 10,
0.00, 0.00, @now, @exit_id, @customer_id, @customer_name
);
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库口不存在、禁用或已占用';
ROLLBACK TRANSACTION;
RETURN;
END
SET @job_detail_id = @job_id + '-1';
IF @tray_type IS NOT NULL
AND @tray_type != ''
AND NOT EXISTS (
SELECT 1
FROM dbo.bas_station_point sp
WHERE point_id = @v_exit_id
AND warehouse_id = @stock_warehouse_id
AND point_type IN ('2', '3')
AND status = '0'
AND ISNULL(point_status, '0') = '0'
AND charindex(',' + @tray_type + ',', ',' + sp.tray_type + ',') > 0
)
BEGIN
SET @v_result = 2;
SET @v_resultString = '出库口不支持当前托盘类型';
ROLLBACK TRANSACTION;
RETURN;
END
SET @exit_id = @v_exit_id;
SELECT TOP 1
@existing_job_id = ej.job_id,
@task_no = ej.task_no
FROM dbo.mydo_job ej
INNER JOIN dbo.mydo_job_detail ejd ON ej.job_id = ejd.job_id
WHERE ej.in_or_out >= 20
AND ej.status IN ('1', '2', '3')
AND ej.cargo_space_id = @cargo_space_id
AND ISNULL(ej.tray_code, '') = ISNULL(@tray_code, '')
AND ISNULL(ej.exit_id, '') = ISNULL(@exit_id, '')
AND ejd.in_or_out_id = @stockout_id
AND ejd.stock_id = @stock_id
ORDER BY ej.create_time DESC, ej.job_id DESC;
IF @existing_job_id IS NULL
BEGIN
EXEC dbo.util_serial_job 'CK', @job_id OUTPUT;
EXEC dbo.util_serial_task '20', @task_no OUTPUT;
INSERT INTO dbo.mydo_job (
job_id, status, task_no, in_or_out, execution_phase,
tray_code, warehouse_id, warehouse_name, roadway_id,
cargo_space_id, cargo_space_name, line_type, priority,
height, weight, create_time, exit_id, customer_id, customer_name
)
VALUES (
@job_id, '1', @task_no, @job_type, '4',
@tray_code, @stock_warehouse_id, @stock_warehouse_name, @roadway_id,
@cargo_space_id, @cargo_space_name, '1', 10,
0.00, 0.00, @now, @exit_id, @customer_id, @customer_name
);
SET @row_idx = 1;
END
ELSE
BEGIN
SET @job_id = @existing_job_id;
SELECT @row_idx = COUNT(1) + 1
FROM dbo.mydo_job_detail
WHERE job_id = @job_id;
END
UPDATE dbo.mydo_job
SET in_or_out = CASE WHEN @job_type = 21 THEN 21 ELSE in_or_out END
WHERE job_id = @job_id;
SET @job_detail_id = @job_id + '-' + CONVERT(nvarchar(10), @row_idx);
INSERT INTO dbo.mydo_job_detail (
job_detail_id, job_id, stock_id, lot_no, in_date,
@@ -385,7 +565,6 @@ BEGIN
UPDATE dbo.bas_cargo_space
SET status = '4',
locked = 'Y',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id;
@@ -422,6 +601,7 @@ GO
CREATE PROCEDURE dbo.proc_out_auto_allocation
@v_stockout_detail_id varchar(80),
@v_exit_id varchar(80),
@v_result int OUTPUT,
@v_resultString varchar(100) OUTPUT
AS
@@ -439,7 +619,8 @@ BEGIN
@remaining decimal(18, 0),
@detail_id nvarchar(80),
@child_result int,
@child_msg varchar(100);
@child_msg varchar(100),
@last_error varchar(100);
SELECT TOP 1
@stockout_id = d.stockout_id,
@@ -468,7 +649,32 @@ BEGIN
WHERE bsd.product_id = @product_id
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
AND (bsd.job_detail_id IS NULL OR bsd.job_detail_id = '')
AND (
bsd.job_detail_id IS NULL OR bsd.job_detail_id = ''
OR NOT EXISTS (
SELECT 1
FROM dbo.mydo_job_detail lock_jd
INNER JOIN dbo.mydo_job lock_j ON lock_j.job_id = lock_jd.job_id
WHERE lock_jd.job_detail_id = bsd.job_detail_id
AND lock_j.in_or_out >= 20
AND lock_j.status IN ('1', '2', '3')
)
)
AND (
bcs.status = '2'
OR EXISTS (
SELECT 1
FROM dbo.mydo_job ej
INNER JOIN dbo.mydo_job_detail ejd ON ej.job_id = ejd.job_id
WHERE ej.in_or_out >= 20
AND ej.status IN ('1', '2', '3')
AND ej.cargo_space_id = bs.cargo_space_id
AND ISNULL(ej.tray_code, '') = ISNULL(bs.tray_code, '')
AND ISNULL(ej.exit_id, '') = ISNULL(@v_exit_id, '')
AND ejd.in_or_out_id = @stockout_id
AND ejd.stock_id = bs.stock_id
)
)
AND (@warehouse_id IS NULL OR @warehouse_id = '' OR bs.warehouse_id = @warehouse_id)
AND (@locatio IS NULL OR bs.cargo_space_id = @locatio OR bcs.cargo_space_name = @locatio)
AND (@preferred_stock_id IS NULL OR bs.stock_id = @preferred_stock_id)
@@ -490,9 +696,13 @@ BEGIN
EXEC dbo.proc_out_hand_allocation
@v_stockout_detail_id = @v_stockout_detail_id,
@v_stock_id = @detail_id,
@v_exit_id = @v_exit_id,
@v_result = @child_result OUTPUT,
@v_resultString = @child_msg OUTPUT;
IF @child_result <> 10
SET @last_error = @child_msg;
FETCH NEXT FROM cur_auto_stock INTO @detail_id;
END
@@ -511,7 +721,7 @@ BEGIN
ELSE
BEGIN
SET @v_result = 2;
SET @v_resultString = '自动分配库存不足';
SET @v_resultString = COALESCE(@last_error, '自动分配库存不足');
END
END
GO
@@ -615,6 +825,19 @@ BEGIN
WHERE detail_id = @stock_detail_id
AND stock_id = @stock_id;
INSERT INTO dbo.bas_stock_detail_finish (
detail_id, stock_id, product_status, lot_no, product_id, product_name,
quantity, out_quantity, job_detail_id, stockin_detail_id, create_time,
update_time, remark, delete_time
)
SELECT detail_id, stock_id, product_status, lot_no, product_id, product_name,
quantity, out_quantity, job_detail_id, stockin_detail_id, create_time,
update_time, remark, SYSDATETIME() AS delete_time
FROM dbo.bas_stock_detail
WHERE detail_id = @stock_detail_id
AND stock_id = @stock_id
AND ISNULL(quantity, 0) <= 0;
DELETE FROM dbo.bas_stock_detail
WHERE detail_id = @stock_detail_id
AND ISNULL(quantity, 0) <= 0;
@@ -664,19 +887,23 @@ BEGIN
) bsa ON bsa.stock_id = bs.stock_id
WHERE bs.stock_id = @stock_id;
UPDATE dbo.bas_cargo_space
SET status = '2',
locked = 'N',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id;
END
ELSE
BEGIN
UPDATE dbo.bas_cargo_space
SET status = '1',
locked = 'N',
tray_code = NULL
WHERE cargo_space_id = @cargo_space_id;
INSERT INTO dbo.bas_stock_finish (
stock_id, cargo_space_id, stock_status, product_status, lot_no,
in_date, back_date, product_id, product_name, quantity, job_id,
job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id,
in_type, warehouse_id, warehouse_name, user_id, user_name, dept_id,
dept_name, supplier_id, supplier_name, delete_time
)
SELECT stock_id, cargo_space_id, stock_status, product_status, lot_no,
in_date, back_date, product_id, product_name, quantity, job_id,
job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id,
in_type, warehouse_id, warehouse_name, user_id, user_name, dept_id,
dept_name, supplier_id, supplier_name, SYSDATETIME() AS delete_time
FROM dbo.bas_stock
WHERE stock_id = @stock_id;
DELETE FROM dbo.bas_stock WHERE stock_id = @stock_id;
END
@@ -848,7 +1075,6 @@ BEGIN
UPDATE dbo.bas_cargo_space
SET status = '2',
locked = 'N',
tray_code = @tray_code
WHERE cargo_space_id = @cargo_space_id
AND EXISTS (SELECT 1 FROM dbo.bas_stock WHERE stock_id = @stock_id);