feat: 完善WCS调度、库存追溯和出库分配
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
-- Align job status/type display dictionaries for inbound job workflow.
|
||||
-- status: 1=未执行, 2=正执行, 4=已完成, 5=已作废
|
||||
-- status: 1=未执行, 2=待执行, 3=执行中, 4=已完成, 5=已作废
|
||||
-- execution_phase: 0=生成作业, 1=下发到WCS, 5=等待扫码确认
|
||||
|
||||
SET NOCOUNT ON;
|
||||
@@ -23,7 +23,7 @@ END
|
||||
IF EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = N'mydo_job_status' AND dict_value = N'2')
|
||||
BEGIN
|
||||
UPDATE sys_dict_data
|
||||
SET dict_label = N'正执行',
|
||||
SET dict_label = N'待执行',
|
||||
dict_sort = 1,
|
||||
list_class = N'primary',
|
||||
status = N'0'
|
||||
@@ -33,7 +33,7 @@ END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, list_class, is_default, status, create_by, create_time)
|
||||
VALUES (1, N'正执行', N'2', N'mydo_job_status', N'primary', N'N', N'0', N'admin', GETDATE());
|
||||
VALUES (1, N'待执行', N'2', N'mydo_job_status', N'primary', N'N', N'0', N'admin', GETDATE());
|
||||
END
|
||||
|
||||
IF EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = N'mydo_job_status' AND dict_value = N'4')
|
||||
|
||||
161
sql/20260626_inventory_status_proc.sql
Normal file
161
sql/20260626_inventory_status_proc.sql
Normal file
@@ -0,0 +1,161 @@
|
||||
IF OBJECT_ID(N'dbo.proc_update_pdbill_status', N'P') IS NOT NULL
|
||||
DROP PROCEDURE dbo.proc_update_pdbill_status
|
||||
GO
|
||||
|
||||
CREATE PROCEDURE dbo.proc_update_pdbill_status
|
||||
@v_stockpd_id VARCHAR(80),
|
||||
@v_status INT,
|
||||
@v_result INT OUTPUT,
|
||||
@v_resultString VARCHAR(500) OUTPUT
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE @target_status NVARCHAR(5) = CONVERT(NVARCHAR(5), @v_status);
|
||||
DECLARE @now DATETIME2 = SYSDATETIME();
|
||||
|
||||
BEGIN TRY
|
||||
SET @v_result = 0;
|
||||
SET @v_resultString = '';
|
||||
|
||||
IF @v_stockpd_id IS NULL OR LTRIM(RTRIM(@v_stockpd_id)) = ''
|
||||
BEGIN
|
||||
SET @v_resultString = N'盘点单号不能为空';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF @target_status NOT IN (N'2', N'4', N'5')
|
||||
BEGIN
|
||||
SET @v_resultString = N'不支持的盘点状态';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.pd_stockpd WHERE stockpd_id = @v_stockpd_id)
|
||||
BEGIN
|
||||
IF @target_status IN (N'4', N'5') AND EXISTS (SELECT 1 FROM dbo.pd_stockpd_finish WHERE stockpd_id = @v_stockpd_id)
|
||||
BEGIN
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = CASE WHEN @target_status = N'5' THEN N'盘点单据已作废' ELSE N'盘点单据已完成' END;
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SET @v_resultString = N'盘点单据不存在';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF @target_status = N'2'
|
||||
BEGIN
|
||||
UPDATE dbo.pd_stockpd
|
||||
SET status = N'2',
|
||||
start_date = CASE WHEN start_date IS NULL THEN @now ELSE start_date END
|
||||
WHERE stockpd_id = @v_stockpd_id;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = N'审核成功';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF @target_status = N'5'
|
||||
BEGIN
|
||||
INSERT INTO dbo.pd_stockpd_finish (
|
||||
stockpd_id, pd_type, stock_source, status, create_date, start_date, finish_date,
|
||||
erp_bill, warehouse_id, warehouse_name, user_id, user_name, dept_id, dept_name
|
||||
)
|
||||
SELECT
|
||||
p.stockpd_id, p.pd_type, p.stock_source, N'5', p.create_date,
|
||||
p.start_date,
|
||||
CASE WHEN p.finish_date IS NULL THEN @now ELSE p.finish_date END,
|
||||
p.erp_bill, p.warehouse_id, p.warehouse_name, p.user_id, p.user_name, p.dept_id, p.dept_name
|
||||
FROM dbo.pd_stockpd p
|
||||
WHERE p.stockpd_id = @v_stockpd_id
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM dbo.pd_stockpd_finish f
|
||||
WHERE f.stockpd_id = p.stockpd_id
|
||||
);
|
||||
|
||||
INSERT INTO dbo.pd_stockpd_detail_finish (
|
||||
stockpd_detail_id, stockpd_id, tray_code, product_id, product_name, quantity,
|
||||
allot_num, assign_num, remark, stock_id, stock_detail_id, cargo_space_id,
|
||||
cargo_space_name, warehouse_id, warehouse_name
|
||||
)
|
||||
SELECT
|
||||
d.stockpd_detail_id, d.stockpd_id, d.tray_code, d.product_id, d.product_name, d.quantity,
|
||||
d.allot_num, d.assign_num, d.remark, d.stock_id, d.stock_detail_id, d.cargo_space_id,
|
||||
d.cargo_space_name, d.warehouse_id, d.warehouse_name
|
||||
FROM dbo.pd_stockpd_detail d
|
||||
WHERE d.stockpd_id = @v_stockpd_id
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM dbo.pd_stockpd_detail_finish f
|
||||
WHERE f.stockpd_detail_id = d.stockpd_detail_id
|
||||
);
|
||||
|
||||
DELETE FROM dbo.pd_stockpd_detail
|
||||
WHERE stockpd_id = @v_stockpd_id;
|
||||
|
||||
DELETE FROM dbo.pd_stockpd
|
||||
WHERE stockpd_id = @v_stockpd_id;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = N'作废成功';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
INSERT INTO dbo.pd_stockpd_finish (
|
||||
stockpd_id, pd_type, stock_source, status, create_date, start_date, finish_date,
|
||||
erp_bill, warehouse_id, warehouse_name, user_id, user_name, dept_id, dept_name
|
||||
)
|
||||
SELECT
|
||||
p.stockpd_id, p.pd_type, p.stock_source, N'4', p.create_date,
|
||||
CASE WHEN p.start_date IS NULL THEN @now ELSE p.start_date END,
|
||||
CASE WHEN p.finish_date IS NULL THEN @now ELSE p.finish_date END,
|
||||
p.erp_bill, p.warehouse_id, p.warehouse_name, p.user_id, p.user_name, p.dept_id, p.dept_name
|
||||
FROM dbo.pd_stockpd p
|
||||
WHERE p.stockpd_id = @v_stockpd_id
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM dbo.pd_stockpd_finish f
|
||||
WHERE f.stockpd_id = p.stockpd_id
|
||||
);
|
||||
|
||||
INSERT INTO dbo.pd_stockpd_detail_finish (
|
||||
stockpd_detail_id, stockpd_id, tray_code, product_id, product_name, quantity,
|
||||
allot_num, assign_num, remark, stock_id, stock_detail_id, cargo_space_id,
|
||||
cargo_space_name, warehouse_id, warehouse_name
|
||||
)
|
||||
SELECT
|
||||
d.stockpd_detail_id, d.stockpd_id, d.tray_code, d.product_id, d.product_name, d.quantity,
|
||||
d.allot_num, d.assign_num, d.remark, d.stock_id, d.stock_detail_id, d.cargo_space_id,
|
||||
d.cargo_space_name, d.warehouse_id, d.warehouse_name
|
||||
FROM dbo.pd_stockpd_detail d
|
||||
WHERE d.stockpd_id = @v_stockpd_id
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM dbo.pd_stockpd_detail_finish f
|
||||
WHERE f.stockpd_detail_id = d.stockpd_detail_id
|
||||
);
|
||||
|
||||
DELETE FROM dbo.pd_stockpd_detail
|
||||
WHERE stockpd_id = @v_stockpd_id;
|
||||
|
||||
DELETE FROM dbo.pd_stockpd
|
||||
WHERE stockpd_id = @v_stockpd_id;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = N'完成成功';
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
|
||||
SET @v_result = 0;
|
||||
SET @v_resultString = LEFT(ERROR_MESSAGE(), 500);
|
||||
END CATCH
|
||||
END
|
||||
80
sql/20260710_cargo_space_height.sql
Normal file
80
sql/20260710_cargo_space_height.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
set nocount on;
|
||||
set xact_abort on;
|
||||
|
||||
begin try
|
||||
begin transaction;
|
||||
|
||||
declare @target_count int;
|
||||
declare @high_count int;
|
||||
declare @normal_count int;
|
||||
declare @updated_rows int;
|
||||
|
||||
select @target_count = count(*)
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id in ('01', '02');
|
||||
|
||||
select @high_count = count(*)
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id in ('01', '02')
|
||||
and the_floor in (1, 5);
|
||||
|
||||
select @normal_count = count(*)
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id in ('01', '02')
|
||||
and the_floor not in (1, 5);
|
||||
|
||||
if @target_count <> 340
|
||||
begin
|
||||
;throw 51001, 'Unexpected 01/02 cargo-space count; no changes committed.', 1;
|
||||
end;
|
||||
|
||||
if @high_count <> 136
|
||||
begin
|
||||
;throw 51002, 'Unexpected high cargo-space count; no changes committed.', 1;
|
||||
end;
|
||||
|
||||
if @normal_count <> 204
|
||||
begin
|
||||
;throw 51003, 'Unexpected normal cargo-space count; no changes committed.', 1;
|
||||
end;
|
||||
|
||||
update dbo.bas_cargo_space
|
||||
set the_height = case when the_floor in (1, 5) then 2 else 1 end
|
||||
where warehouse_id in ('01', '02');
|
||||
|
||||
set @updated_rows = @@rowcount;
|
||||
|
||||
if @updated_rows <> @target_count
|
||||
begin
|
||||
;throw 51004, 'Not all 01/02 cargo spaces were updated; no changes committed.', 1;
|
||||
end;
|
||||
|
||||
if exists (
|
||||
select 1
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id in ('01', '02')
|
||||
and (
|
||||
the_height is null
|
||||
or the_height <> case when the_floor in (1, 5) then 2 else 1 end
|
||||
)
|
||||
)
|
||||
begin
|
||||
;throw 51005, 'Cargo-space height verification failed; no changes committed.', 1;
|
||||
end;
|
||||
|
||||
commit transaction;
|
||||
|
||||
select warehouse_id,
|
||||
the_floor,
|
||||
the_height,
|
||||
count(*) as cargo_space_count
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id in ('01', '02')
|
||||
group by warehouse_id, the_floor, the_height
|
||||
order by warehouse_id, the_floor, the_height;
|
||||
end try
|
||||
begin catch
|
||||
if @@trancount > 0
|
||||
rollback transaction;
|
||||
throw;
|
||||
end catch;
|
||||
144
sql/20260714_cargo_area_direction.sql
Normal file
144
sql/20260714_cargo_area_direction.sql
Normal file
@@ -0,0 +1,144 @@
|
||||
set nocount on;
|
||||
set xact_abort on;
|
||||
|
||||
/*
|
||||
货区出入库方向:
|
||||
1 从小到大
|
||||
2 从大到小
|
||||
3 两端均可
|
||||
*/
|
||||
begin try
|
||||
begin transaction;
|
||||
|
||||
if object_id(N'dbo.bas_cargo_area_config', N'U') is null
|
||||
begin
|
||||
create table dbo.bas_cargo_area_config
|
||||
(
|
||||
id bigint identity(1, 1) not null,
|
||||
warehouse_id nvarchar(80) not null,
|
||||
cargo_area_code nvarchar(10) not null,
|
||||
cargo_area_name nvarchar(80) not null,
|
||||
direction_type nvarchar(2) not null,
|
||||
is_active nchar(1) not null
|
||||
constraint DF_bas_cargo_area_config_active default N'1',
|
||||
create_by nvarchar(64) null,
|
||||
create_time datetime2(3) null,
|
||||
update_by nvarchar(64) null,
|
||||
update_time datetime2(3) null,
|
||||
remark nvarchar(500) null,
|
||||
constraint PK_bas_cargo_area_config primary key clustered (id),
|
||||
constraint UQ_bas_cargo_area_config unique (warehouse_id, cargo_area_code),
|
||||
constraint CK_bas_cargo_area_config_direction
|
||||
check (direction_type in (N'1', N'2', N'3')),
|
||||
constraint CK_bas_cargo_area_config_active
|
||||
check (is_active in (N'0', N'1'))
|
||||
);
|
||||
|
||||
alter table dbo.bas_cargo_area_config with check
|
||||
add constraint FK_bas_cargo_area_config_warehouse
|
||||
foreign key (warehouse_id) references dbo.bas_warehouse(warehouse_id);
|
||||
end;
|
||||
|
||||
update dbo.bas_cargo_space
|
||||
set this_cargo_area = nchar(unicode(N'A') + try_convert(int, this_cargo_area) - 1)
|
||||
where warehouse_id = N'03'
|
||||
and try_convert(int, this_cargo_area) between 1 and 8;
|
||||
|
||||
declare @area table
|
||||
(
|
||||
cargo_area_code nvarchar(10) not null primary key,
|
||||
direction_type nvarchar(2) not null
|
||||
);
|
||||
|
||||
insert into @area(cargo_area_code, direction_type)
|
||||
values (N'A', N'1'),(N'B', N'1'),(N'C', N'1'),(N'D', N'2'),
|
||||
(N'E', N'1'),(N'F', N'2'),(N'G', N'2'),(N'H', N'2');
|
||||
|
||||
update target
|
||||
set target.direction_type = source.direction_type,
|
||||
target.is_active = N'1',
|
||||
target.update_by = N'admin',
|
||||
target.update_time = sysdatetime(),
|
||||
target.remark = N'03密集库固定方向;A/B/C/E小到大,D/F/G/H大到小'
|
||||
from dbo.bas_cargo_area_config target
|
||||
inner join @area source on source.cargo_area_code = target.cargo_area_code
|
||||
where target.warehouse_id = N'03';
|
||||
|
||||
insert into dbo.bas_cargo_area_config
|
||||
(
|
||||
warehouse_id, cargo_area_code, cargo_area_name,
|
||||
direction_type, is_active,
|
||||
create_by, create_time, remark
|
||||
)
|
||||
select
|
||||
N'03', a.cargo_area_code, a.cargo_area_code + N'货区',
|
||||
a.direction_type, N'1',
|
||||
N'admin', sysdatetime(), N'03密集库固定方向;A/B/C/E小到大,D/F/G/H大到小'
|
||||
from @area a
|
||||
where not exists
|
||||
(
|
||||
select 1
|
||||
from dbo.bas_cargo_area_config c
|
||||
where c.warehouse_id = N'03'
|
||||
and c.cargo_area_code = a.cargo_area_code
|
||||
);
|
||||
|
||||
declare @letter_area_count int =
|
||||
(
|
||||
select count(*)
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03'
|
||||
and this_cargo_area between N'A' and N'H'
|
||||
);
|
||||
|
||||
if @letter_area_count <> 1028
|
||||
throw 51030, N'03仓A-H货区货位数量异常,预期1028。', 1;
|
||||
|
||||
if exists
|
||||
(
|
||||
select 1
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03'
|
||||
and this_cargo_area is not null
|
||||
and this_cargo_area not in (N'A', N'B', N'C', N'D', N'E', N'F', N'G', N'H')
|
||||
)
|
||||
throw 51031, N'03仓仍存在非A-H货区编码。', 1;
|
||||
|
||||
declare @config_count int =
|
||||
(
|
||||
select count(*)
|
||||
from dbo.bas_cargo_area_config
|
||||
where warehouse_id = N'03'
|
||||
and cargo_area_code in (N'A', N'B', N'C', N'D', N'E', N'F', N'G', N'H')
|
||||
);
|
||||
|
||||
if @config_count <> 8
|
||||
throw 51032, N'03仓货区方向配置数量异常,预期8。', 1;
|
||||
|
||||
commit transaction;
|
||||
end try
|
||||
begin catch
|
||||
if xact_state() <> 0
|
||||
rollback transaction;
|
||||
throw;
|
||||
end catch;
|
||||
|
||||
select
|
||||
c.warehouse_id,
|
||||
c.cargo_area_code,
|
||||
c.cargo_area_name,
|
||||
c.direction_type,
|
||||
case c.direction_type
|
||||
when N'1' then N'从小到大'
|
||||
when N'2' then N'从大到小'
|
||||
when N'3' then N'两端均可'
|
||||
end as direction_name,
|
||||
c.is_active,
|
||||
count(bcs.cargo_space_id) as cargo_space_count
|
||||
from dbo.bas_cargo_area_config c
|
||||
left join dbo.bas_cargo_space bcs
|
||||
on bcs.warehouse_id = c.warehouse_id
|
||||
and bcs.this_cargo_area = c.cargo_area_code
|
||||
where c.warehouse_id = N'03'
|
||||
group by c.warehouse_id, c.cargo_area_code, c.cargo_area_name, c.direction_type, c.is_active
|
||||
order by c.cargo_area_code;
|
||||
49
sql/20260714_mydo_job_tray_unique_and_wcs_pull.sql
Normal file
49
sql/20260714_mydo_job_tray_unique_and_wcs_pull.sql
Normal file
@@ -0,0 +1,49 @@
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF EXISTS (
|
||||
SELECT tray_code
|
||||
FROM dbo.mydo_job
|
||||
WHERE tray_code IS NOT NULL
|
||||
GROUP BY tray_code
|
||||
HAVING COUNT_BIG(*) > 1
|
||||
)
|
||||
BEGIN
|
||||
THROW 51000, N'mydo_job存在重复托盘条码,请清理后重试', 1;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID(N'dbo.mydo_job')
|
||||
AND name = N'UX_mydo_job_tray_code'
|
||||
)
|
||||
BEGIN
|
||||
CREATE UNIQUE NONCLUSTERED INDEX UX_mydo_job_tray_code
|
||||
ON dbo.mydo_job(tray_code)
|
||||
WHERE tray_code IS NOT NULL;
|
||||
END;
|
||||
|
||||
-- 将升级前尚未真正下发的03仓入库作业统一转为WCS待领取状态。
|
||||
UPDATE dbo.mydo_job
|
||||
SET status = N'2', execution_phase = N'0'
|
||||
WHERE warehouse_id = N'03'
|
||||
AND in_or_out < 20
|
||||
AND status = N'1'
|
||||
AND execution_phase = N'0';
|
||||
|
||||
UPDATE dbo.sys_dict_data
|
||||
SET dict_label = N'待执行', list_class = N'warning'
|
||||
WHERE dict_type = N'mydo_job_status'
|
||||
AND dict_value = N'2';
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
THROW;
|
||||
END CATCH;
|
||||
460
sql/20260714_project_no_traceability.sql
Normal file
460
sql/20260714_project_no_traceability.sql
Normal file
@@ -0,0 +1,460 @@
|
||||
/*
|
||||
* 项目号全链路追溯:入库主/子单 -> 作业子表 -> 库存主/子表。
|
||||
* SQL Server,可重复执行。
|
||||
*/
|
||||
|
||||
IF OBJECT_ID(N'dbo.in_stockin', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.in_stockin', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.in_stockin ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.in_stockin_detail', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.in_stockin_detail', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.in_stockin_detail ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.in_stockin_finish', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.in_stockin_finish', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.in_stockin_finish ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.in_stockin_detail_finish', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.in_stockin_detail_finish', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.in_stockin_detail_finish ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.mydo_job_detail', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.mydo_job_detail', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.mydo_job_detail ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.mydo_job_detail_finish', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.mydo_job_detail_finish', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.mydo_job_detail_finish ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_stock', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.bas_stock', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.bas_stock ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_stock_detail', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.bas_stock_detail', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.bas_stock_detail ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_stock_finish', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.bas_stock_finish', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.bas_stock_finish ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_stock_detail_finish', N'U') IS NOT NULL
|
||||
AND COL_LENGTH(N'dbo.bas_stock_detail_finish', N'project_no') IS NULL
|
||||
ALTER TABLE dbo.bas_stock_detail_finish ADD project_no nvarchar(80) NULL;
|
||||
GO
|
||||
|
||||
/* 已有数据只按明确的主子关系回填,不把旧的“项目号/项目名称”混合字段强行当作项目号。 */
|
||||
UPDATE d
|
||||
SET d.project_no = h.project_no
|
||||
FROM dbo.in_stockin_detail d
|
||||
INNER JOIN dbo.in_stockin h ON h.stockin_id = d.stockin_id
|
||||
WHERE d.project_no IS NULL
|
||||
AND h.project_no IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE d
|
||||
SET d.project_no = h.project_no
|
||||
FROM dbo.in_stockin_detail_finish d
|
||||
INNER JOIN dbo.in_stockin_finish h ON h.stockin_id = d.stockin_id
|
||||
WHERE d.project_no IS NULL
|
||||
AND h.project_no IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE jd
|
||||
SET jd.project_no = COALESCE(d.project_no, df.project_no)
|
||||
FROM dbo.mydo_job_detail jd
|
||||
LEFT JOIN dbo.in_stockin_detail d ON d.stockin_detail_id = jd.stockin_detail_id
|
||||
LEFT JOIN dbo.in_stockin_detail_finish df ON df.stockin_detail_id = jd.stockin_detail_id
|
||||
WHERE jd.project_no IS NULL
|
||||
AND COALESCE(d.project_no, df.project_no) IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE jd
|
||||
SET jd.project_no = COALESCE(d.project_no, df.project_no)
|
||||
FROM dbo.mydo_job_detail_finish jd
|
||||
LEFT JOIN dbo.in_stockin_detail d ON d.stockin_detail_id = jd.stockin_detail_id
|
||||
LEFT JOIN dbo.in_stockin_detail_finish df ON df.stockin_detail_id = jd.stockin_detail_id
|
||||
WHERE jd.project_no IS NULL
|
||||
AND COALESCE(d.project_no, df.project_no) IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE bsd
|
||||
SET bsd.project_no = COALESCE(jd.project_no, jdf.project_no, d.project_no, df.project_no)
|
||||
FROM dbo.bas_stock_detail bsd
|
||||
LEFT JOIN dbo.mydo_job_detail jd ON jd.job_detail_id = bsd.job_detail_id
|
||||
LEFT JOIN dbo.mydo_job_detail_finish jdf ON jdf.job_detail_id = bsd.job_detail_id
|
||||
LEFT JOIN dbo.in_stockin_detail d ON d.stockin_detail_id = bsd.stockin_detail_id
|
||||
LEFT JOIN dbo.in_stockin_detail_finish df ON df.stockin_detail_id = bsd.stockin_detail_id
|
||||
WHERE bsd.project_no IS NULL
|
||||
AND COALESCE(jd.project_no, jdf.project_no, d.project_no, df.project_no) IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE bs
|
||||
SET bs.project_no = x.project_no
|
||||
FROM dbo.bas_stock bs
|
||||
CROSS APPLY (
|
||||
SELECT TOP (1) bsd.project_no
|
||||
FROM dbo.bas_stock_detail bsd
|
||||
WHERE bsd.stock_id = bs.stock_id
|
||||
AND bsd.project_no IS NOT NULL
|
||||
ORDER BY bsd.detail_id
|
||||
) x
|
||||
WHERE bs.project_no IS NULL;
|
||||
GO
|
||||
|
||||
UPDATE bsd
|
||||
SET bsd.project_no = COALESCE(d.project_no, df.project_no)
|
||||
FROM dbo.bas_stock_detail_finish bsd
|
||||
LEFT JOIN dbo.in_stockin_detail d ON d.stockin_detail_id = bsd.stockin_detail_id
|
||||
LEFT JOIN dbo.in_stockin_detail_finish df ON df.stockin_detail_id = bsd.stockin_detail_id
|
||||
WHERE bsd.project_no IS NULL
|
||||
AND COALESCE(d.project_no, df.project_no) IS NOT NULL;
|
||||
GO
|
||||
|
||||
UPDATE bs
|
||||
SET bs.project_no = x.project_no
|
||||
FROM dbo.bas_stock_finish bs
|
||||
CROSS APPLY (
|
||||
SELECT TOP (1) bsd.project_no
|
||||
FROM dbo.bas_stock_detail_finish bsd
|
||||
WHERE bsd.stock_id = bs.stock_id
|
||||
AND bsd.project_no IS NOT NULL
|
||||
ORDER BY bsd.detail_id
|
||||
) x
|
||||
WHERE bs.project_no IS NULL;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.proc_add_in_job', N'P') IS NOT NULL
|
||||
DROP PROCEDURE dbo.proc_add_in_job;
|
||||
GO
|
||||
|
||||
CREATE PROCEDURE [dbo].[proc_add_in_job]
|
||||
@tray_code NVARCHAR(255),
|
||||
@warehouse_id NVARCHAR(255),
|
||||
@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
|
||||
@task_no varchar(255),
|
||||
@job_id varchar(255),
|
||||
@now DATETIME = GETDATE();
|
||||
|
||||
DECLARE
|
||||
@row_idx INT = 1,
|
||||
@job_detail_id NVARCHAR(80),
|
||||
@product_id NVARCHAR(255),
|
||||
@product_name NVARCHAR(255),
|
||||
@lot_no NVARCHAR(80),
|
||||
@quantity DECIMAL(18),
|
||||
@stockin_id NVARCHAR(80),
|
||||
@stockin_detail_id NVARCHAR(255),
|
||||
@project_no NVARCHAR(80);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.in_tray_msg WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id)
|
||||
BEGIN
|
||||
SET @v_result = 0;
|
||||
SET @v_resultmsg = '错误:托盘无绑定数据';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF EXISTS (SELECT 1 FROM dbo.mydo_job WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id)
|
||||
BEGIN
|
||||
SET @v_result = 0;
|
||||
SET @v_resultmsg = '错误:该托盘已生成作业';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
BEGIN TRY
|
||||
DECLARE cur_tray CURSOR LOCAL FAST_FORWARD FOR
|
||||
SELECT
|
||||
tm.product_id,
|
||||
ISNULL(d.product_name, ''),
|
||||
ISNULL(d.lot_no, ''),
|
||||
tm.quantity,
|
||||
ISNULL(d.stockin_id, ''),
|
||||
tm.stockin_detail_id,
|
||||
d.project_no
|
||||
FROM dbo.in_tray_msg tm
|
||||
LEFT JOIN dbo.in_stockin_detail d ON tm.stockin_detail_id = d.stockin_detail_id
|
||||
WHERE tm.tray_code = @tray_code
|
||||
AND tm.warehouse_id = @warehouse_id;
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
EXEC dbo.util_serial_job 'RK', @job_id OUTPUT;
|
||||
EXEC dbo.util_serial_task '1', @task_no OUTPUT;
|
||||
|
||||
INSERT INTO dbo.mydo_job (
|
||||
job_id, status, task_no, in_or_out, execution_phase,
|
||||
tray_code, warehouse_id, create_time,
|
||||
user_id, dept_id, priority, height, weight
|
||||
)
|
||||
VALUES (
|
||||
@job_id, '1', @task_no, 1, '0',
|
||||
@tray_code, @warehouse_id, @now,
|
||||
@user_id, @dept_id, 10, 0.00, 0.00
|
||||
);
|
||||
|
||||
OPEN cur_tray;
|
||||
FETCH NEXT FROM cur_tray INTO
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id, @project_no;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
SET @job_detail_id = @job_id + '-' + CAST(@row_idx AS VARCHAR);
|
||||
|
||||
INSERT INTO dbo.mydo_job_detail (
|
||||
job_detail_id, job_id, product_id, product_name,
|
||||
lot_no, in_quantity, in_or_out_id, in_or_out_d_id,
|
||||
stockin_id, stockin_detail_id, project_no
|
||||
)
|
||||
VALUES (
|
||||
@job_detail_id, @job_id, @product_id, @product_name,
|
||||
@lot_no, @quantity, @stockin_id, @stockin_detail_id,
|
||||
@stockin_id, @stockin_detail_id, @project_no
|
||||
);
|
||||
|
||||
SET @row_idx += 1;
|
||||
FETCH NEXT FROM cur_tray INTO
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id, @project_no;
|
||||
END
|
||||
|
||||
CLOSE cur_tray;
|
||||
DEALLOCATE cur_tray;
|
||||
|
||||
DELETE FROM dbo.in_tray_msg
|
||||
WHERE tray_code = @tray_code AND warehouse_id = @warehouse_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_tray') >= 0
|
||||
BEGIN
|
||||
CLOSE cur_tray;
|
||||
DEALLOCATE cur_tray;
|
||||
END
|
||||
|
||||
SET @v_result = 0;
|
||||
SET @v_resultmsg = LEFT(ERROR_MESSAGE(), 80);
|
||||
END CATCH
|
||||
END
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.proc_complete_in_job', N'P') IS NOT NULL
|
||||
DROP PROCEDURE dbo.proc_complete_in_job;
|
||||
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 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 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,
|
||||
@warehouse_name = ISNULL(NULLIF(warehouse_name, ''), (
|
||||
SELECT TOP 1 bw.warehouse_name
|
||||
FROM bas_warehouse bw
|
||||
WHERE bw.warehouse_id = mydo_job.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, project_no
|
||||
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, @project_no;
|
||||
|
||||
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;
|
||||
|
||||
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 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 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 bas_cargo_space
|
||||
SET status = '2', tray_code = @tray_code
|
||||
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
|
||||
380
sql/20260714_warehouse_03_cargo_spaces.sql
Normal file
380
sql/20260714_warehouse_03_cargo_spaces.sql
Normal file
@@ -0,0 +1,380 @@
|
||||
set nocount on;
|
||||
set xact_abort on;
|
||||
|
||||
/*
|
||||
03仓密集库货位初始化
|
||||
|
||||
cargo_space_id: 仓库(2位) + 排(2位) + 列(2位) + 层(2位)
|
||||
status:
|
||||
1 普通空货位
|
||||
7 提升机
|
||||
8 输送机
|
||||
9 母通道
|
||||
10 充电桩
|
||||
|
||||
group_coding:
|
||||
同一排、同一层、同一连续存储通道使用该通道最小货位编码。
|
||||
例如 03010101~03010601 的 group_coding 均为 03010101。
|
||||
*/
|
||||
|
||||
if exists (select 1 from dbo.bas_cargo_space where warehouse_id = N'03')
|
||||
begin
|
||||
throw 51000, N'03仓已经存在货位数据,脚本拒绝覆盖。', 1;
|
||||
end;
|
||||
|
||||
declare @footprint table
|
||||
(
|
||||
the_column int not null,
|
||||
platoon_from int not null,
|
||||
platoon_to int not null
|
||||
);
|
||||
|
||||
-- 按平面图录入实际存在的坐标范围;列25无节点。
|
||||
insert into @footprint(the_column, platoon_from, platoon_to)
|
||||
values
|
||||
(1, 1, 3), (2, 1, 3), (3, 1, 3),
|
||||
(4, 1, 5), (4, 9, 13),
|
||||
(5, 1, 7), (5, 9, 13),
|
||||
(6, 1, 13),
|
||||
(7, 1, 13), (8, 1, 13), (9, 1, 13),
|
||||
(10, 1, 13), (11, 1, 13), (12, 1, 13),
|
||||
(13, 1, 13), (14, 1, 13), (15, 1, 13),
|
||||
(16, 1, 13), (17, 1, 13), (18, 1, 13),
|
||||
(19, 1, 13), (20, 1, 13), (21, 1, 13),
|
||||
(22, 1, 5), (22, 9, 13),
|
||||
(23, 9, 13), (24, 9, 13);
|
||||
|
||||
declare @numbers table (number_value int not null primary key);
|
||||
insert into @numbers(number_value)
|
||||
values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),
|
||||
(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25);
|
||||
|
||||
declare @generated table
|
||||
(
|
||||
cargo_space_id nvarchar(80) not null primary key,
|
||||
warehouse_id nvarchar(80) not null,
|
||||
roadway_id nvarchar(80) not null,
|
||||
cargo_area_id nvarchar(80) null,
|
||||
the_type nvarchar(5) null,
|
||||
the_type_name nvarchar(80) null,
|
||||
cargo_space_name nvarchar(80) not null,
|
||||
the_platoon int not null,
|
||||
the_column int not null,
|
||||
the_floor int not null,
|
||||
status nvarchar(5) not null,
|
||||
locked nvarchar(5) not null,
|
||||
tray_code nvarchar(255) null,
|
||||
iss_double nvarchar(2) null,
|
||||
group_coding_no nvarchar(80) null,
|
||||
group_coding nvarchar(80) null,
|
||||
cargo_space_logo nvarchar(2) null,
|
||||
this_cargo_area nvarchar(10) null,
|
||||
channel_band int null,
|
||||
dept_id int null,
|
||||
dept_name nvarchar(255) null,
|
||||
the_weight float null,
|
||||
the_height float null
|
||||
);
|
||||
|
||||
;with coordinates as
|
||||
(
|
||||
select
|
||||
p.number_value as the_platoon,
|
||||
f.the_column,
|
||||
fl.number_value as the_floor
|
||||
from @footprint f
|
||||
inner join @numbers p
|
||||
on p.number_value between f.platoon_from and f.platoon_to
|
||||
inner join @numbers fl
|
||||
on fl.number_value between 1 and 5
|
||||
), classified as
|
||||
(
|
||||
select
|
||||
c.*,
|
||||
case
|
||||
when c.the_platoon = 6 and c.the_column = 5 and c.the_floor in (1, 2) then N'10'
|
||||
when c.the_platoon = 7 and c.the_column in (5, 21) then N'7'
|
||||
when c.the_platoon = 7 and c.the_column in (6, 20) then N'8'
|
||||
when c.the_column in (7, 13, 19)
|
||||
or (c.the_platoon = 7 and c.the_column between 7 and 19) then N'9'
|
||||
else N'1'
|
||||
end as status,
|
||||
case
|
||||
when c.the_column between 1 and 6 then 1
|
||||
when c.the_column between 8 and 12 then 2
|
||||
when c.the_column between 14 and 18 then 3
|
||||
when c.the_column between 20 and 25 then 4
|
||||
end as channel_band
|
||||
from coordinates c
|
||||
)
|
||||
insert into @generated
|
||||
(
|
||||
cargo_space_id, warehouse_id, roadway_id, cargo_area_id,
|
||||
the_type, the_type_name, cargo_space_name,
|
||||
the_platoon, the_column, the_floor, status, locked,
|
||||
tray_code, iss_double, group_coding_no, group_coding,
|
||||
cargo_space_logo, this_cargo_area, channel_band,
|
||||
dept_id, dept_name, the_weight, the_height
|
||||
)
|
||||
select
|
||||
concat(
|
||||
N'03',
|
||||
right(N'00' + convert(nvarchar(2), the_platoon), 2),
|
||||
right(N'00' + convert(nvarchar(2), the_column), 2),
|
||||
right(N'00' + convert(nvarchar(2), the_floor), 2)
|
||||
),
|
||||
N'03',
|
||||
N'1',
|
||||
null,
|
||||
N'1',
|
||||
case status when N'1' then N'普通货位' when N'7' then N'提升机' when N'8' then N'输送机' when N'9' then N'母通道' when N'10' then N'充电桩' end,
|
||||
concat(
|
||||
right(N'00' + convert(nvarchar(2), the_platoon), 2), N'排',
|
||||
right(N'00' + convert(nvarchar(2), the_column), 2), N'列',
|
||||
right(N'00' + convert(nvarchar(2), the_floor), 2), N'层',
|
||||
case status when N'7' then N'-提升机' when N'8' then N'-输送机' when N'9' then N'-母通道' when N'10' then N'-充电桩' else N'' end
|
||||
),
|
||||
the_platoon,
|
||||
the_column,
|
||||
the_floor,
|
||||
status,
|
||||
N'N',
|
||||
null,
|
||||
N'N',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
case
|
||||
when status <> N'1' then null
|
||||
when the_platoon between 1 and 6 then nchar(unicode(N'A') + (channel_band - 1) * 2)
|
||||
when the_platoon between 8 and 13 then nchar(unicode(N'A') + (channel_band - 1) * 2 + 1)
|
||||
end,
|
||||
channel_band,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
from classified;
|
||||
|
||||
-- 普通货位以每条通道的最小货位编码作为统一分组编码。
|
||||
;with lane_groups as
|
||||
(
|
||||
select
|
||||
cargo_space_id,
|
||||
min(cargo_space_id) over
|
||||
(
|
||||
partition by the_platoon, the_floor, channel_band
|
||||
) as lane_group_coding
|
||||
from @generated
|
||||
where status = N'1'
|
||||
)
|
||||
update g
|
||||
set g.group_coding = lg.lane_group_coding
|
||||
from @generated g
|
||||
inner join lane_groups lg on lg.cargo_space_id = g.cargo_space_id;
|
||||
|
||||
-- 写库前完整性校验。
|
||||
if (select count(*) from @generated) <> 1295
|
||||
throw 51001, N'03仓生成总数异常,预期1295。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'1') <> 1028
|
||||
throw 51002, N'03仓普通货位数量异常,预期1028。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'7') <> 10
|
||||
throw 51003, N'03仓提升机节点数量异常,预期10。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'8') <> 10
|
||||
throw 51004, N'03仓输送机节点数量异常,预期10。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'9') <> 245
|
||||
throw 51005, N'03仓母通道节点数量异常,预期245。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'10') <> 2
|
||||
throw 51010, N'03仓充电桩节点数量异常,预期2。', 1;
|
||||
|
||||
if (select count(distinct group_coding) from @generated where status = N'1') <> 240
|
||||
throw 51006, N'03仓通道分组数量异常,预期240。', 1;
|
||||
|
||||
if (select count(*) from @generated where status = N'1' and this_cargo_area between N'A' and N'H') <> 1028
|
||||
throw 51011, N'03仓A-H货区编码数量异常,预期1028。', 1;
|
||||
|
||||
if (select count(distinct this_cargo_area) from @generated where status = N'1') <> 8
|
||||
throw 51012, N'03仓货区编码数量异常,预期A-H共8个。', 1;
|
||||
|
||||
if exists
|
||||
(
|
||||
select 1
|
||||
from @generated
|
||||
where (status = N'1' and group_coding is null)
|
||||
or (status <> N'1' and group_coding is not null)
|
||||
)
|
||||
throw 51007, N'03仓group_coding分配异常。', 1;
|
||||
|
||||
if
|
||||
(
|
||||
select count(*)
|
||||
from @generated
|
||||
where cargo_space_id in (N'03010101', N'03010201', N'03010301', N'03010401', N'03010501', N'03010601')
|
||||
and group_coding = N'03010101'
|
||||
) <> 6
|
||||
throw 51008, N'示例通道03010101-03010601分组异常。', 1;
|
||||
|
||||
begin try
|
||||
begin transaction;
|
||||
|
||||
if not exists (select 1 from dbo.bas_warehouse with (updlock, holdlock) where warehouse_id = N'03')
|
||||
begin
|
||||
insert into dbo.bas_warehouse
|
||||
(
|
||||
warehouse_id, warehouse_name, address, c_desc,
|
||||
warehouse_kind, warehouse_type, is_active
|
||||
)
|
||||
values
|
||||
(
|
||||
N'03', N'密集库', null, N'四向穿梭车密集库',
|
||||
null, N'1', N'1'
|
||||
);
|
||||
end;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1
|
||||
from dbo.bas_roadway with (updlock, holdlock)
|
||||
where warehouse_id = N'03' and roadway_id = N'1'
|
||||
)
|
||||
begin
|
||||
insert into dbo.bas_roadway
|
||||
(
|
||||
roadway_id, warehouse_id, roadway_name,
|
||||
device_id, in_locked, out_locked
|
||||
)
|
||||
values
|
||||
(
|
||||
N'1', N'03', N'密集库巷道',
|
||||
null, N'N', N'N'
|
||||
);
|
||||
end;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1 from dbo.sys_dict_data
|
||||
where dict_type = N'bas_cargo_space_status' and dict_value = N'7'
|
||||
)
|
||||
begin
|
||||
insert into dbo.sys_dict_data
|
||||
(
|
||||
dict_sort, dict_label, dict_value, dict_type,
|
||||
css_class, list_class, is_default, status,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
values
|
||||
(
|
||||
7, N'提升机', N'7', N'bas_cargo_space_status',
|
||||
null, N'info', N'N', N'0',
|
||||
N'admin', getdate(), N'', null, N'03仓提升机节点'
|
||||
);
|
||||
end;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1 from dbo.sys_dict_data
|
||||
where dict_type = N'bas_cargo_space_status' and dict_value = N'10'
|
||||
)
|
||||
begin
|
||||
insert into dbo.sys_dict_data
|
||||
(
|
||||
dict_sort, dict_label, dict_value, dict_type,
|
||||
css_class, list_class, is_default, status,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
values
|
||||
(
|
||||
10, N'充电桩', N'10', N'bas_cargo_space_status',
|
||||
null, N'info', N'N', N'0',
|
||||
N'admin', getdate(), N'', null, N'03仓充电桩节点'
|
||||
);
|
||||
end;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1 from dbo.sys_dict_data
|
||||
where dict_type = N'bas_cargo_space_status' and dict_value = N'8'
|
||||
)
|
||||
begin
|
||||
insert into dbo.sys_dict_data
|
||||
(
|
||||
dict_sort, dict_label, dict_value, dict_type,
|
||||
css_class, list_class, is_default, status,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
values
|
||||
(
|
||||
8, N'输送机', N'8', N'bas_cargo_space_status',
|
||||
null, N'warning', N'N', N'0',
|
||||
N'admin', getdate(), N'', null, N'03仓输送机节点'
|
||||
);
|
||||
end;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1 from dbo.sys_dict_data
|
||||
where dict_type = N'bas_cargo_space_status' and dict_value = N'9'
|
||||
)
|
||||
begin
|
||||
insert into dbo.sys_dict_data
|
||||
(
|
||||
dict_sort, dict_label, dict_value, dict_type,
|
||||
css_class, list_class, is_default, status,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
values
|
||||
(
|
||||
9, N'母通道', N'9', N'bas_cargo_space_status',
|
||||
null, N'success', N'N', N'0',
|
||||
N'admin', getdate(), N'', null, N'03仓母通道节点'
|
||||
);
|
||||
end;
|
||||
|
||||
insert into dbo.bas_cargo_space
|
||||
(
|
||||
cargo_space_id, warehouse_id, roadway_id, cargo_area_id,
|
||||
the_type, the_type_name, cargo_space_name,
|
||||
the_platoon, the_column, the_floor, status, locked,
|
||||
tray_code, iss_double, group_coding_no, group_coding,
|
||||
cargo_space_logo, this_cargo_area,
|
||||
dept_id, dept_name, the_weight, the_height
|
||||
)
|
||||
select
|
||||
cargo_space_id, warehouse_id, roadway_id, cargo_area_id,
|
||||
the_type, the_type_name, cargo_space_name,
|
||||
the_platoon, the_column, the_floor, status, locked,
|
||||
tray_code, iss_double, group_coding_no, group_coding,
|
||||
cargo_space_logo, this_cargo_area,
|
||||
dept_id, dept_name, the_weight, the_height
|
||||
from @generated;
|
||||
|
||||
if (select count(*) from dbo.bas_cargo_space where warehouse_id = N'03') <> 1295
|
||||
throw 51009, N'03仓写入后数量校验失败。', 1;
|
||||
|
||||
commit transaction;
|
||||
end try
|
||||
begin catch
|
||||
if xact_state() <> 0
|
||||
rollback transaction;
|
||||
throw;
|
||||
end catch;
|
||||
|
||||
select
|
||||
status,
|
||||
count(*) as cargo_space_count
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03'
|
||||
group by status
|
||||
order by status;
|
||||
|
||||
select
|
||||
count(*) as total_count,
|
||||
count(distinct case when status = N'1' then group_coding end) as lane_group_count,
|
||||
count(distinct the_floor) as floor_count
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03';
|
||||
35
sql/20260714_warehouse_03_cargo_type.sql
Normal file
35
sql/20260714_warehouse_03_cargo_type.sql
Normal file
@@ -0,0 +1,35 @@
|
||||
set nocount on;
|
||||
set xact_abort on;
|
||||
|
||||
begin try
|
||||
begin transaction;
|
||||
|
||||
if (select count(*) from dbo.bas_cargo_space where warehouse_id = N'03') <> 1295
|
||||
throw 51100, N'03仓货位数量不是1295,拒绝更新货位类型。', 1;
|
||||
|
||||
update dbo.bas_cargo_space
|
||||
set the_type = N'1'
|
||||
where warehouse_id = N'03'
|
||||
and isnull(the_type, N'') <> N'1';
|
||||
|
||||
if exists
|
||||
(
|
||||
select 1
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03'
|
||||
and isnull(the_type, N'') <> N'1'
|
||||
)
|
||||
throw 51101, N'03仓货位类型校验失败。', 1;
|
||||
|
||||
commit transaction;
|
||||
end try
|
||||
begin catch
|
||||
if xact_state() <> 0
|
||||
rollback transaction;
|
||||
throw;
|
||||
end catch;
|
||||
|
||||
select warehouse_id, the_type, count(*) as cargo_space_count
|
||||
from dbo.bas_cargo_space
|
||||
where warehouse_id = N'03'
|
||||
group by warehouse_id, the_type;
|
||||
95
sql/20260714_warehouse_03_charging_stations.sql
Normal file
95
sql/20260714_warehouse_03_charging_stations.sql
Normal file
@@ -0,0 +1,95 @@
|
||||
set nocount on;
|
||||
set xact_abort on;
|
||||
|
||||
/* 03仓充电桩:仅允许更新指定的两个货位节点。 */
|
||||
begin try
|
||||
begin transaction;
|
||||
|
||||
if
|
||||
(
|
||||
select count(*)
|
||||
from dbo.bas_cargo_space with (updlock, holdlock)
|
||||
where warehouse_id = N'03'
|
||||
and cargo_space_id in (N'03060501', N'03060502')
|
||||
) <> 2
|
||||
throw 51020, N'03仓充电桩货位不存在或数量异常。', 1;
|
||||
|
||||
update dbo.bas_cargo_space
|
||||
set status = N'10',
|
||||
the_type_name = N'充电桩',
|
||||
cargo_space_name = concat(
|
||||
right(N'00' + convert(nvarchar(2), the_platoon), 2), N'排',
|
||||
right(N'00' + convert(nvarchar(2), the_column), 2), N'列',
|
||||
right(N'00' + convert(nvarchar(2), the_floor), 2), N'层-充电桩'
|
||||
),
|
||||
group_coding_no = null,
|
||||
group_coding = null,
|
||||
this_cargo_area = null
|
||||
where warehouse_id = N'03'
|
||||
and cargo_space_id in (N'03060501', N'03060502');
|
||||
|
||||
declare @updated_count int = @@rowcount;
|
||||
if @updated_count <> 2
|
||||
throw 51021, N'03仓充电桩更新数量异常。', 1;
|
||||
|
||||
if not exists
|
||||
(
|
||||
select 1
|
||||
from dbo.sys_dict_data
|
||||
where dict_type = N'bas_cargo_space_status'
|
||||
and dict_value = N'10'
|
||||
)
|
||||
begin
|
||||
insert into dbo.sys_dict_data
|
||||
(
|
||||
dict_sort, dict_label, dict_value, dict_type,
|
||||
css_class, list_class, is_default, status,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
values
|
||||
(
|
||||
10, N'充电桩', N'10', N'bas_cargo_space_status',
|
||||
null, N'info', N'N', N'0',
|
||||
N'admin', getdate(), N'', null, N'03仓充电桩节点'
|
||||
);
|
||||
end
|
||||
else
|
||||
begin
|
||||
update dbo.sys_dict_data
|
||||
set dict_label = N'充电桩',
|
||||
dict_sort = 10,
|
||||
status = N'0',
|
||||
remark = N'03仓充电桩节点',
|
||||
update_by = N'admin',
|
||||
update_time = getdate()
|
||||
where dict_type = N'bas_cargo_space_status'
|
||||
and dict_value = N'10';
|
||||
end;
|
||||
|
||||
if exists
|
||||
(
|
||||
select 1
|
||||
from dbo.bas_cargo_space
|
||||
where cargo_space_id in (N'03060501', N'03060502')
|
||||
and
|
||||
(
|
||||
warehouse_id <> N'03'
|
||||
or status <> N'10'
|
||||
or the_type_name <> N'充电桩'
|
||||
or group_coding is not null
|
||||
)
|
||||
)
|
||||
throw 51022, N'03仓充电桩结果校验失败。', 1;
|
||||
|
||||
commit transaction;
|
||||
end try
|
||||
begin catch
|
||||
if xact_state() <> 0
|
||||
rollback transaction;
|
||||
throw;
|
||||
end catch;
|
||||
|
||||
select cargo_space_id, cargo_space_name, status, the_type_name, group_coding
|
||||
from dbo.bas_cargo_space
|
||||
where cargo_space_id in (N'03060501', N'03060502')
|
||||
order by cargo_space_id;
|
||||
117
sql/20260714_warehouse_03_inbound_lane_allocation.sql
Normal file
117
sql/20260714_warehouse_03_inbound_lane_allocation.sql
Normal file
@@ -0,0 +1,117 @@
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_cargo_area_config', N'U') IS NULL
|
||||
THROW 51100, N'缺少bas_cargo_area_config,请先执行货区方向迁移。', 1;
|
||||
|
||||
DECLARE @direction TABLE
|
||||
(
|
||||
warehouse_id nvarchar(80) NOT NULL,
|
||||
cargo_area_code nvarchar(10) NOT NULL,
|
||||
direction_type nvarchar(2) NOT NULL,
|
||||
PRIMARY KEY (warehouse_id, cargo_area_code)
|
||||
);
|
||||
|
||||
INSERT INTO @direction(warehouse_id, cargo_area_code, direction_type)
|
||||
VALUES
|
||||
(N'03', N'A', N'1'),
|
||||
(N'03', N'B', N'1'),
|
||||
(N'03', N'C', N'1'),
|
||||
(N'03', N'D', N'2'),
|
||||
(N'03', N'E', N'1'),
|
||||
(N'03', N'F', N'2'),
|
||||
(N'03', N'G', N'2'),
|
||||
(N'03', N'H', N'2');
|
||||
|
||||
MERGE dbo.bas_cargo_area_config AS target
|
||||
USING @direction AS source
|
||||
ON target.warehouse_id = source.warehouse_id
|
||||
AND target.cargo_area_code = source.cargo_area_code
|
||||
WHEN MATCHED THEN UPDATE
|
||||
SET direction_type = source.direction_type,
|
||||
is_active = N'1',
|
||||
update_by = N'admin',
|
||||
update_time = SYSDATETIME(),
|
||||
remark = N'03密集库固定方向;A/B/C/E小到大,D/F/G/H大到小'
|
||||
WHEN NOT MATCHED THEN INSERT
|
||||
(warehouse_id, cargo_area_code, cargo_area_name, direction_type, is_active,
|
||||
create_by, create_time, remark)
|
||||
VALUES
|
||||
(source.warehouse_id, source.cargo_area_code, source.cargo_area_code + N'货区',
|
||||
source.direction_type, N'1', N'admin', SYSDATETIME(),
|
||||
N'03密集库固定方向;A/B/C/E小到大,D/F/G/H大到小');
|
||||
|
||||
UPDATE dbo.bas_cargo_space
|
||||
SET the_height = CASE WHEN the_floor = 1 THEN 2 ELSE 1 END
|
||||
WHERE warehouse_id = N'03'
|
||||
AND status = N'1'
|
||||
AND (the_height IS NULL
|
||||
OR the_height != CASE WHEN the_floor = 1 THEN 2 ELSE 1 END);
|
||||
|
||||
IF (SELECT COUNT(*) FROM dbo.bas_cargo_space
|
||||
WHERE warehouse_id = N'03' AND status = N'1') != 1028
|
||||
THROW 51102, N'03仓普通货位数量异常,拒绝配置高度。', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.bas_cargo_space
|
||||
WHERE warehouse_id = N'03'
|
||||
AND status = N'1'
|
||||
AND (the_height IS NULL
|
||||
OR the_height != CASE WHEN the_floor = 1 THEN 2 ELSE 1 END)
|
||||
)
|
||||
THROW 51103, N'03仓普通货位高度配置失败。', 1;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID(N'dbo.bas_cargo_space')
|
||||
AND name = N'IX_bas_cargo_space_dense_lane'
|
||||
)
|
||||
CREATE NONCLUSTERED INDEX IX_bas_cargo_space_dense_lane
|
||||
ON dbo.bas_cargo_space(warehouse_id, roadway_id, group_coding, status)
|
||||
INCLUDE(cargo_space_id, this_cargo_area, the_type, the_height, the_column,
|
||||
the_floor, the_platoon, locked, tray_code);
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID(N'dbo.bas_stock')
|
||||
AND name = N'IX_bas_stock_cargo_space_id'
|
||||
)
|
||||
CREATE NONCLUSTERED INDEX IX_bas_stock_cargo_space_id
|
||||
ON dbo.bas_stock(cargo_space_id)
|
||||
INCLUDE(stock_id, warehouse_id, in_type, project_no);
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID(N'dbo.mydo_job')
|
||||
AND name = N'IX_mydo_job_dense_reservation'
|
||||
)
|
||||
CREATE NONCLUSTERED INDEX IX_mydo_job_dense_reservation
|
||||
ON dbo.mydo_job(warehouse_id, tray_code, status, in_or_out)
|
||||
INCLUDE(job_id, cargo_space_id, roadway_id);
|
||||
|
||||
IF (SELECT COUNT(*) FROM dbo.bas_cargo_area_config
|
||||
WHERE warehouse_id = N'03' AND cargo_area_code BETWEEN N'A' AND N'H'
|
||||
AND is_active = N'1') != 8
|
||||
THROW 51101, N'03仓A-H货区方向配置数量异常。', 1;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF XACT_STATE() != 0
|
||||
ROLLBACK TRANSACTION;
|
||||
THROW;
|
||||
END CATCH;
|
||||
|
||||
SELECT warehouse_id, cargo_area_code, direction_type, is_active
|
||||
FROM dbo.bas_cargo_area_config
|
||||
WHERE warehouse_id = N'03'
|
||||
AND cargo_area_code BETWEEN N'A' AND N'H'
|
||||
ORDER BY cargo_area_code;
|
||||
40
sql/20260714_warehouse_03_two_stage_layer_allocation.sql
Normal file
40
sql/20260714_warehouse_03_two_stage_layer_allocation.sql
Normal file
@@ -0,0 +1,40 @@
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
UPDATE dbo.mydo_job
|
||||
SET roadway_id = NULL
|
||||
WHERE warehouse_id = N'03'
|
||||
AND in_or_out < 20
|
||||
AND status IN (N'1', N'2', N'3')
|
||||
AND (cargo_space_id IS NULL OR LTRIM(RTRIM(cargo_space_id)) = N'');
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.mydo_job
|
||||
WHERE warehouse_id = N'03'
|
||||
AND in_or_out < 20
|
||||
AND status IN (N'1', N'2', N'3')
|
||||
AND (cargo_space_id IS NULL OR LTRIM(RTRIM(cargo_space_id)) = N'')
|
||||
AND roadway_id IS NOT NULL
|
||||
AND LTRIM(RTRIM(roadway_id)) != N''
|
||||
)
|
||||
THROW 51120, N'03仓未分配货位作业的旧巷道值清理失败。', 1;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF XACT_STATE() != 0
|
||||
ROLLBACK TRANSACTION;
|
||||
THROW;
|
||||
END CATCH;
|
||||
|
||||
SELECT job_id, roadway_id, cargo_space_id
|
||||
FROM dbo.mydo_job
|
||||
WHERE warehouse_id = N'03'
|
||||
AND in_or_out < 20
|
||||
AND status IN (N'1', N'2', N'3')
|
||||
ORDER BY job_id;
|
||||
253
sql/20260715_inventory_inbound_trace.sql
Normal file
253
sql/20260715_inventory_inbound_trace.sql
Normal file
@@ -0,0 +1,253 @@
|
||||
/*
|
||||
* 盘点回库库存追溯修复:
|
||||
* 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
|
||||
524
sql/20260715_outbound_normal_stock_filter.sql
Normal file
524
sql/20260715_outbound_normal_stock_filter.sql
Normal file
@@ -0,0 +1,524 @@
|
||||
-- 出库分配仅允许库存状态和物料状态均为正常的增量迁移。
|
||||
-- 本文件完整重建手动、自动分配过程,可重复执行。
|
||||
|
||||
CREATE OR ALTER 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
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE
|
||||
@stockout_id nvarchar(80),
|
||||
@stockout_status int,
|
||||
@warehouse_id nvarchar(80),
|
||||
@customer_id nvarchar(255),
|
||||
@customer_name nvarchar(255),
|
||||
@product_id nvarchar(255),
|
||||
@product_name nvarchar(255),
|
||||
@lot_no nvarchar(80),
|
||||
@locatio nvarchar(255),
|
||||
@preferred_stock_id nvarchar(80),
|
||||
@preferred_detail_id nvarchar(80),
|
||||
@bill_qty decimal(18, 0),
|
||||
@allot_qty decimal(18, 0),
|
||||
@remaining decimal(18, 0);
|
||||
|
||||
DECLARE
|
||||
@detail_id nvarchar(80),
|
||||
@stock_id nvarchar(80),
|
||||
@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),
|
||||
@stock_warehouse_id nvarchar(80),
|
||||
@stock_warehouse_name nvarchar(255),
|
||||
@supplier_id nvarchar(255),
|
||||
@supplier_name nvarchar(255),
|
||||
@project_no nvarchar(80),
|
||||
@exit_id nvarchar(80),
|
||||
@existing_job_id nvarchar(80),
|
||||
@now datetime = GETDATE();
|
||||
|
||||
SELECT TOP 1
|
||||
@stockout_id = d.stockout_id,
|
||||
@product_id = d.product_id,
|
||||
@product_name = d.product_name,
|
||||
@lot_no = d.lot_no,
|
||||
@bill_qty = ISNULL(d.quantity, 0),
|
||||
@allot_qty = ISNULL(d.allot_num, 0),
|
||||
@locatio = NULLIF(d.locatio, ''),
|
||||
@preferred_stock_id = NULLIF(d.stock_id, ''),
|
||||
@preferred_detail_id = NULLIF(d.stock_detail_id, ''),
|
||||
@warehouse_id = o.warehouse_id,
|
||||
@customer_id = o.customer_id,
|
||||
@customer_name = o.customer_name,
|
||||
@stockout_status = TRY_CONVERT(int, o.status)
|
||||
FROM dbo.out_stockout_detail d WITH (UPDLOCK, HOLDLOCK)
|
||||
INNER JOIN dbo.out_stockout o ON d.stockout_id = o.stockout_id
|
||||
WHERE d.stockout_detail_id = @v_stockout_detail_id;
|
||||
|
||||
IF @stockout_id IS NULL
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = '出库子单不存在';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF @stockout_status NOT IN (2, 3)
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = '出库单据未审核';
|
||||
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
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = '出库子单已分配完成';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF EXISTS (SELECT 1 FROM dbo.bas_stock_detail WHERE detail_id = @v_stock_id)
|
||||
BEGIN
|
||||
SET @preferred_detail_id = @v_stock_id;
|
||||
SET @preferred_stock_id = NULL;
|
||||
END
|
||||
ELSE IF EXISTS (SELECT 1 FROM dbo.bas_stock WHERE stock_id = @v_stock_id)
|
||||
BEGIN
|
||||
SET @preferred_stock_id = @v_stock_id;
|
||||
SET @preferred_detail_id = NULL;
|
||||
END
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
SELECT TOP 1
|
||||
@detail_id = bsd.detail_id,
|
||||
@stock_id = bs.stock_id,
|
||||
@available_qty = ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0),
|
||||
@tray_code = bs.tray_code,
|
||||
@cargo_space_id = bs.cargo_space_id,
|
||||
@cargo_space_name = bcs.cargo_space_name,
|
||||
@roadway_id = bcs.roadway_id,
|
||||
@stock_warehouse_id = bs.warehouse_id,
|
||||
@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,
|
||||
@project_no = bsd.project_no
|
||||
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
|
||||
LEFT JOIN dbo.bas_cargo_area_config cac
|
||||
ON cac.warehouse_id = bs.warehouse_id
|
||||
AND cac.cargo_area_code = bcs.this_cargo_area
|
||||
AND cac.is_active = N'1'
|
||||
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
|
||||
OUTER APPLY (
|
||||
SELECT MIN(area_space.the_column) AS area_min_column,
|
||||
MAX(area_space.the_column) AS area_max_column
|
||||
FROM dbo.bas_cargo_space area_space
|
||||
WHERE area_space.warehouse_id = bcs.warehouse_id
|
||||
AND area_space.this_cargo_area = bcs.this_cargo_area
|
||||
) area_bounds
|
||||
WHERE bsd.product_id = @product_id
|
||||
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
|
||||
AND bs.stock_status = '1'
|
||||
AND bsd.product_status = '1'
|
||||
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
|
||||
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)
|
||||
AND (@preferred_stock_id IS NULL OR bs.stock_id = @preferred_stock_id)
|
||||
ORDER BY
|
||||
CASE WHEN bsd.detail_id = @v_stock_id THEN 0 ELSE 1 END,
|
||||
CASE COALESCE(cac.direction_type, N'1') WHEN N'1' THEN bcs.the_column END ASC,
|
||||
CASE WHEN cac.direction_type = N'2' THEN bcs.the_column END DESC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN
|
||||
CASE
|
||||
WHEN bcs.the_column - area_bounds.area_min_column
|
||||
<= area_bounds.area_max_column - bcs.the_column
|
||||
THEN bcs.the_column - area_bounds.area_min_column
|
||||
ELSE area_bounds.area_max_column - bcs.the_column
|
||||
END
|
||||
END ASC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN bcs.the_column END ASC,
|
||||
bs.in_date ASC,
|
||||
bs.cargo_space_id ASC,
|
||||
bsd.detail_id ASC;
|
||||
|
||||
IF @detail_id IS NULL
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = '没有可分配库存明细';
|
||||
ROLLBACK TRANSACTION;
|
||||
RETURN;
|
||||
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;
|
||||
SET @v_resultString = '库存可用数量不足';
|
||||
ROLLBACK TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
|
||||
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'
|
||||
)
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = '出库口不存在、禁用或已占用';
|
||||
ROLLBACK TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
|
||||
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,
|
||||
in_or_out_id, in_or_out_d_id, product_id, product_name,
|
||||
stock_quantity, out_quantity, stockin_detail_id,
|
||||
customer_id, customer_name, supplier_id, supplier_name, project_no
|
||||
)
|
||||
VALUES (
|
||||
@job_detail_id, @job_id, @stock_id, @lot_no, CONVERT(varchar(19), @now, 120),
|
||||
@stockout_id, @v_stockout_detail_id, @product_id, @product_name,
|
||||
@available_qty, @alloc_qty, @detail_id,
|
||||
@customer_id, @customer_name, @supplier_id, @supplier_name, @project_no
|
||||
);
|
||||
|
||||
UPDATE dbo.bas_stock_detail
|
||||
SET out_quantity = ISNULL(out_quantity, 0) + @alloc_qty,
|
||||
job_detail_id = @job_detail_id,
|
||||
update_time = SYSDATETIME()
|
||||
WHERE detail_id = @detail_id;
|
||||
|
||||
UPDATE bs
|
||||
SET quantity = ISNULL(bsa.quantity, 0),
|
||||
out_quantity = ISNULL(bsa.out_quantity, 0)
|
||||
FROM dbo.bas_stock bs
|
||||
INNER 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
|
||||
) bsa ON bsa.stock_id = bs.stock_id
|
||||
WHERE bs.stock_id = @stock_id;
|
||||
|
||||
UPDATE dbo.bas_cargo_space
|
||||
SET status = '4',
|
||||
tray_code = @tray_code
|
||||
WHERE cargo_space_id = @cargo_space_id;
|
||||
|
||||
UPDATE dbo.out_stockout_detail
|
||||
SET allot_num = ISNULL(allot_num, 0) + @alloc_qty,
|
||||
status = CASE WHEN ISNULL(allot_num, 0) + @alloc_qty >= ISNULL(quantity, 0) THEN '1' ELSE '0' END,
|
||||
stock_id = COALESCE(NULLIF(stock_id, ''), @stock_id),
|
||||
stock_detail_id = COALESCE(NULLIF(stock_detail_id, ''), @detail_id)
|
||||
WHERE stockout_detail_id = @v_stockout_detail_id;
|
||||
|
||||
UPDATE dbo.out_stockout
|
||||
SET status = '3',
|
||||
start_date = COALESCE(start_date, SYSDATETIME())
|
||||
WHERE stockout_id = @stockout_id;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = '成功:生成出库作业' + @job_id;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = LEFT(ERROR_MESSAGE(), 100);
|
||||
END CATCH
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE OR ALTER 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
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE
|
||||
@stockout_id nvarchar(80),
|
||||
@warehouse_id nvarchar(80),
|
||||
@product_id nvarchar(255),
|
||||
@lot_no nvarchar(80),
|
||||
@locatio nvarchar(255),
|
||||
@preferred_stock_id nvarchar(80),
|
||||
@preferred_detail_id nvarchar(80),
|
||||
@remaining decimal(18, 0),
|
||||
@detail_id nvarchar(80),
|
||||
@child_result int,
|
||||
@child_msg varchar(100),
|
||||
@last_error varchar(100);
|
||||
|
||||
SELECT TOP 1
|
||||
@stockout_id = d.stockout_id,
|
||||
@warehouse_id = o.warehouse_id,
|
||||
@product_id = d.product_id,
|
||||
@lot_no = d.lot_no,
|
||||
@locatio = NULLIF(d.locatio, ''),
|
||||
@preferred_stock_id = NULLIF(d.stock_id, ''),
|
||||
@preferred_detail_id = NULLIF(d.stock_detail_id, '')
|
||||
FROM dbo.out_stockout_detail d
|
||||
INNER JOIN dbo.out_stockout o ON d.stockout_id = o.stockout_id
|
||||
WHERE d.stockout_detail_id = @v_stockout_detail_id;
|
||||
|
||||
IF @stockout_id IS NULL
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = '出库子单不存在';
|
||||
RETURN;
|
||||
END
|
||||
|
||||
DECLARE cur_auto_stock CURSOR LOCAL FAST_FORWARD FOR
|
||||
SELECT bsd.detail_id
|
||||
FROM dbo.bas_stock_detail bsd
|
||||
INNER JOIN dbo.bas_stock bs ON bsd.stock_id = bs.stock_id
|
||||
LEFT JOIN dbo.bas_cargo_space bcs ON bs.cargo_space_id = bcs.cargo_space_id
|
||||
LEFT JOIN dbo.bas_cargo_area_config cac
|
||||
ON cac.warehouse_id = bs.warehouse_id
|
||||
AND cac.cargo_area_code = bcs.this_cargo_area
|
||||
AND cac.is_active = N'1'
|
||||
OUTER APPLY (
|
||||
SELECT MIN(area_space.the_column) AS area_min_column,
|
||||
MAX(area_space.the_column) AS area_max_column
|
||||
FROM dbo.bas_cargo_space area_space
|
||||
WHERE area_space.warehouse_id = bcs.warehouse_id
|
||||
AND area_space.this_cargo_area = bcs.this_cargo_area
|
||||
) area_bounds
|
||||
WHERE bsd.product_id = @product_id
|
||||
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
|
||||
AND bs.stock_status = '1'
|
||||
AND bsd.product_status = '1'
|
||||
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
|
||||
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)
|
||||
AND (@preferred_detail_id IS NULL OR bsd.detail_id = @preferred_detail_id)
|
||||
ORDER BY
|
||||
CASE COALESCE(cac.direction_type, N'1') WHEN N'1' THEN bcs.the_column END ASC,
|
||||
CASE WHEN cac.direction_type = N'2' THEN bcs.the_column END DESC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN
|
||||
CASE
|
||||
WHEN bcs.the_column - area_bounds.area_min_column
|
||||
<= area_bounds.area_max_column - bcs.the_column
|
||||
THEN bcs.the_column - area_bounds.area_min_column
|
||||
ELSE area_bounds.area_max_column - bcs.the_column
|
||||
END
|
||||
END ASC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN bcs.the_column END ASC,
|
||||
bs.in_date ASC, bs.cargo_space_id ASC, bsd.detail_id ASC;
|
||||
|
||||
OPEN cur_auto_stock;
|
||||
FETCH NEXT FROM cur_auto_stock INTO @detail_id;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
SELECT @remaining = ISNULL(quantity, 0) - ISNULL(allot_num, 0)
|
||||
FROM dbo.out_stockout_detail
|
||||
WHERE stockout_detail_id = @v_stockout_detail_id;
|
||||
|
||||
IF @remaining <= 0
|
||||
BREAK;
|
||||
|
||||
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
|
||||
|
||||
CLOSE cur_auto_stock;
|
||||
DEALLOCATE cur_auto_stock;
|
||||
|
||||
SELECT @remaining = ISNULL(quantity, 0) - ISNULL(allot_num, 0)
|
||||
FROM dbo.out_stockout_detail
|
||||
WHERE stockout_detail_id = @v_stockout_detail_id;
|
||||
|
||||
IF @remaining <= 0
|
||||
BEGIN
|
||||
SET @v_result = 10;
|
||||
SET @v_resultString = '自动分配完成';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
SET @v_result = 2;
|
||||
SET @v_resultString = COALESCE(@last_error, '自动分配库存不足');
|
||||
END
|
||||
END
|
||||
GO
|
||||
@@ -11,6 +11,7 @@ BEGIN
|
||||
out_quantity decimal(18, 0) NULL,
|
||||
job_detail_id nvarchar(255) NULL,
|
||||
stockin_detail_id nvarchar(80) NULL,
|
||||
project_no nvarchar(80) NULL,
|
||||
create_time datetime2(7) NULL,
|
||||
update_time datetime2(7) NULL,
|
||||
remark nvarchar(500) NULL,
|
||||
@@ -19,6 +20,18 @@ BEGIN
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.bas_stock', 'project_no') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.bas_stock ADD project_no nvarchar(80) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.bas_stock_detail', 'project_no') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.bas_stock_detail ADD project_no nvarchar(80) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.bas_stock_detail', 'detail_id') < 160
|
||||
BEGIN
|
||||
ALTER TABLE dbo.bas_stock_detail ALTER COLUMN detail_id nvarchar(80) NOT NULL;
|
||||
@@ -46,7 +59,7 @@ 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
|
||||
quantity, out_quantity, job_detail_id, stockin_detail_id, project_no, create_time
|
||||
)
|
||||
SELECT
|
||||
bs.stock_id + N'-1',
|
||||
@@ -59,6 +72,7 @@ SELECT
|
||||
bs.out_quantity,
|
||||
bs.job_detail_id,
|
||||
bs.stockin_detail_id,
|
||||
bs.project_no,
|
||||
GETDATE()
|
||||
FROM dbo.bas_stock bs
|
||||
WHERE NOT EXISTS (
|
||||
@@ -131,7 +145,8 @@ BEGIN
|
||||
@lot_no NVARCHAR(80),
|
||||
@in_quantity DECIMAL(18, 0),
|
||||
@stockin_id NVARCHAR(80),
|
||||
@stockin_detail_id NVARCHAR(255);
|
||||
@stockin_detail_id NVARCHAR(255),
|
||||
@project_no NVARCHAR(80);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM mydo_job WHERE job_id = @job_id)
|
||||
BEGIN
|
||||
@@ -169,7 +184,7 @@ BEGIN
|
||||
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
|
||||
stockin_id, stockin_detail_id, project_no
|
||||
FROM mydo_job_detail WHERE job_id = @job_id;
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
@@ -177,7 +192,7 @@ BEGIN
|
||||
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;
|
||||
@stockin_id, @stockin_detail_id, @project_no;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
@@ -187,19 +202,34 @@ BEGIN
|
||||
|
||||
IF @stock_id IS NULL
|
||||
BEGIN
|
||||
SELECT TOP 1 @in_type = in_type
|
||||
FROM in_stockin
|
||||
WHERE stockin_id = @stockin_id;
|
||||
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 bas_stock (
|
||||
stock_id, cargo_space_id, stock_status, in_date, quantity,
|
||||
job_id, tray_code, out_quantity, stockin_id, in_type, warehouse_id, warehouse_name
|
||||
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, @in_type, @warehouse_id, @warehouse_name
|
||||
@job_id, @tray_code, 0, @stockin_id, @project_no, @in_type, @warehouse_id, @warehouse_name
|
||||
);
|
||||
END;
|
||||
|
||||
@@ -208,16 +238,16 @@ BEGIN
|
||||
|
||||
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
|
||||
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, @now
|
||||
@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;
|
||||
@stockin_id, @stockin_detail_id, @project_no;
|
||||
END;
|
||||
|
||||
CLOSE cur_finish_job_detail;
|
||||
|
||||
@@ -65,6 +65,7 @@ BEGIN
|
||||
out_quantity decimal(18, 0) NULL,
|
||||
stockin_detail_id nvarchar(80) NULL,
|
||||
stockin_id nvarchar(80) NULL,
|
||||
project_no nvarchar(80) NULL,
|
||||
in_type nvarchar(5) NULL,
|
||||
warehouse_id nvarchar(80) NULL,
|
||||
warehouse_name nvarchar(255) NULL,
|
||||
@@ -85,6 +86,12 @@ BEGIN
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.bas_stock_finish', 'project_no') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.bas_stock_finish ADD project_no nvarchar(80) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.bas_stock_detail_finish', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.bas_stock_detail_finish (
|
||||
@@ -98,6 +105,7 @@ BEGIN
|
||||
out_quantity decimal(18, 0) NULL,
|
||||
job_detail_id nvarchar(255) NULL,
|
||||
stockin_detail_id nvarchar(80) NULL,
|
||||
project_no nvarchar(80) NULL,
|
||||
create_time datetime2(7) NULL,
|
||||
update_time datetime2(7) NULL,
|
||||
remark nvarchar(500) NULL,
|
||||
@@ -112,6 +120,12 @@ BEGIN
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.bas_stock_detail_finish', 'project_no') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.bas_stock_detail_finish ADD project_no nvarchar(80) 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;
|
||||
@@ -297,6 +311,7 @@ BEGIN
|
||||
@stock_warehouse_name nvarchar(255),
|
||||
@supplier_id nvarchar(255),
|
||||
@supplier_name nvarchar(255),
|
||||
@project_no nvarchar(80),
|
||||
@exit_id nvarchar(80),
|
||||
@existing_job_id nvarchar(80),
|
||||
@now datetime = GETDATE();
|
||||
@@ -374,11 +389,16 @@ BEGIN
|
||||
@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
|
||||
@supplier_name = bs.supplier_name,
|
||||
@project_no = bsd.project_no
|
||||
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
|
||||
LEFT JOIN dbo.bas_cargo_area_config cac
|
||||
ON cac.warehouse_id = bs.warehouse_id
|
||||
AND cac.cargo_area_code = bcs.this_cargo_area
|
||||
AND cac.is_active = N'1'
|
||||
OUTER APPLY (
|
||||
SELECT TOP 1 prefix AS tray_type
|
||||
FROM dbo.bas_barcode_format bbf
|
||||
@@ -388,8 +408,17 @@ BEGIN
|
||||
AND LEFT(bs.tray_code, LEN(bbf.prefix)) = bbf.prefix
|
||||
ORDER BY LEN(bbf.prefix) DESC
|
||||
) bbf
|
||||
OUTER APPLY (
|
||||
SELECT MIN(area_space.the_column) AS area_min_column,
|
||||
MAX(area_space.the_column) AS area_max_column
|
||||
FROM dbo.bas_cargo_space area_space
|
||||
WHERE area_space.warehouse_id = bcs.warehouse_id
|
||||
AND area_space.this_cargo_area = bcs.this_cargo_area
|
||||
) area_bounds
|
||||
WHERE bsd.product_id = @product_id
|
||||
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
|
||||
AND bs.stock_status = '1'
|
||||
AND bsd.product_status = '1'
|
||||
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
|
||||
AND (
|
||||
bsd.job_detail_id IS NULL OR bsd.job_detail_id = ''
|
||||
@@ -423,6 +452,17 @@ BEGIN
|
||||
AND (@preferred_stock_id IS NULL OR bs.stock_id = @preferred_stock_id)
|
||||
ORDER BY
|
||||
CASE WHEN bsd.detail_id = @v_stock_id THEN 0 ELSE 1 END,
|
||||
CASE COALESCE(cac.direction_type, N'1') WHEN N'1' THEN bcs.the_column END ASC,
|
||||
CASE WHEN cac.direction_type = N'2' THEN bcs.the_column END DESC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN
|
||||
CASE
|
||||
WHEN bcs.the_column - area_bounds.area_min_column
|
||||
<= area_bounds.area_max_column - bcs.the_column
|
||||
THEN bcs.the_column - area_bounds.area_min_column
|
||||
ELSE area_bounds.area_max_column - bcs.the_column
|
||||
END
|
||||
END ASC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN bcs.the_column END ASC,
|
||||
bs.in_date ASC,
|
||||
bs.cargo_space_id ASC,
|
||||
bsd.detail_id ASC;
|
||||
@@ -534,13 +574,13 @@ BEGIN
|
||||
job_detail_id, job_id, stock_id, lot_no, in_date,
|
||||
in_or_out_id, in_or_out_d_id, product_id, product_name,
|
||||
stock_quantity, out_quantity, stockin_detail_id,
|
||||
customer_id, customer_name, supplier_id, supplier_name
|
||||
customer_id, customer_name, supplier_id, supplier_name, project_no
|
||||
)
|
||||
VALUES (
|
||||
@job_detail_id, @job_id, @stock_id, @lot_no, CONVERT(varchar(19), @now, 120),
|
||||
@stockout_id, @v_stockout_detail_id, @product_id, @product_name,
|
||||
@available_qty, @alloc_qty, @detail_id,
|
||||
@customer_id, @customer_name, @supplier_id, @supplier_name
|
||||
@customer_id, @customer_name, @supplier_id, @supplier_name, @project_no
|
||||
);
|
||||
|
||||
UPDATE dbo.bas_stock_detail
|
||||
@@ -646,8 +686,21 @@ BEGIN
|
||||
FROM dbo.bas_stock_detail bsd
|
||||
INNER JOIN dbo.bas_stock bs ON bsd.stock_id = bs.stock_id
|
||||
LEFT JOIN dbo.bas_cargo_space bcs ON bs.cargo_space_id = bcs.cargo_space_id
|
||||
LEFT JOIN dbo.bas_cargo_area_config cac
|
||||
ON cac.warehouse_id = bs.warehouse_id
|
||||
AND cac.cargo_area_code = bcs.this_cargo_area
|
||||
AND cac.is_active = N'1'
|
||||
OUTER APPLY (
|
||||
SELECT MIN(area_space.the_column) AS area_min_column,
|
||||
MAX(area_space.the_column) AS area_max_column
|
||||
FROM dbo.bas_cargo_space area_space
|
||||
WHERE area_space.warehouse_id = bcs.warehouse_id
|
||||
AND area_space.this_cargo_area = bcs.this_cargo_area
|
||||
) area_bounds
|
||||
WHERE bsd.product_id = @product_id
|
||||
AND (ISNULL(@lot_no, '') = '' OR ISNULL(bsd.lot_no, '') = ISNULL(@lot_no, ''))
|
||||
AND bs.stock_status = '1'
|
||||
AND bsd.product_status = '1'
|
||||
AND ISNULL(bsd.quantity, 0) - ISNULL(bsd.out_quantity, 0) > 0
|
||||
AND (
|
||||
bsd.job_detail_id IS NULL OR bsd.job_detail_id = ''
|
||||
@@ -679,7 +732,19 @@ BEGIN
|
||||
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)
|
||||
AND (@preferred_detail_id IS NULL OR bsd.detail_id = @preferred_detail_id)
|
||||
ORDER BY bs.in_date ASC, bs.cargo_space_id ASC, bsd.detail_id ASC;
|
||||
ORDER BY
|
||||
CASE COALESCE(cac.direction_type, N'1') WHEN N'1' THEN bcs.the_column END ASC,
|
||||
CASE WHEN cac.direction_type = N'2' THEN bcs.the_column END DESC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN
|
||||
CASE
|
||||
WHEN bcs.the_column - area_bounds.area_min_column
|
||||
<= area_bounds.area_max_column - bcs.the_column
|
||||
THEN bcs.the_column - area_bounds.area_min_column
|
||||
ELSE area_bounds.area_max_column - bcs.the_column
|
||||
END
|
||||
END ASC,
|
||||
CASE WHEN cac.direction_type = N'3' THEN bcs.the_column END ASC,
|
||||
bs.in_date ASC, bs.cargo_space_id ASC, bsd.detail_id ASC;
|
||||
|
||||
OPEN cur_auto_stock;
|
||||
FETCH NEXT FROM cur_auto_stock INTO @detail_id;
|
||||
@@ -827,11 +892,11 @@ BEGIN
|
||||
|
||||
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,
|
||||
quantity, out_quantity, job_detail_id, stockin_detail_id, project_no, 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,
|
||||
quantity, out_quantity, job_detail_id, stockin_detail_id, project_no, create_time,
|
||||
update_time, remark, SYSDATETIME() AS delete_time
|
||||
FROM dbo.bas_stock_detail
|
||||
WHERE detail_id = @stock_detail_id
|
||||
@@ -894,13 +959,13 @@ BEGIN
|
||||
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,
|
||||
project_no, 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,
|
||||
project_no, 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;
|
||||
|
||||
@@ -27,7 +27,8 @@ BEGIN
|
||||
@lot_no NVARCHAR(80),
|
||||
@quantity DECIMAL(18),
|
||||
@stockin_id NVARCHAR(80),
|
||||
@stockin_detail_id NVARCHAR(255);
|
||||
@stockin_detail_id NVARCHAR(255),
|
||||
@project_no NVARCHAR(80);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.in_tray_msg WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id)
|
||||
BEGIN
|
||||
@@ -51,7 +52,8 @@ BEGIN
|
||||
ISNULL(d.lot_no, ''),
|
||||
tm.quantity,
|
||||
ISNULL(d.stockin_id, ''),
|
||||
tm.stockin_detail_id
|
||||
tm.stockin_detail_id,
|
||||
d.project_no
|
||||
FROM dbo.in_tray_msg tm
|
||||
LEFT JOIN dbo.in_stockin_detail d ON tm.stockin_detail_id = d.stockin_detail_id
|
||||
WHERE tm.tray_code = @tray_code
|
||||
@@ -75,7 +77,7 @@ BEGIN
|
||||
|
||||
OPEN cur_tray;
|
||||
FETCH NEXT FROM cur_tray INTO
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id;
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id, @project_no;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
@@ -85,17 +87,17 @@ BEGIN
|
||||
INSERT INTO dbo.mydo_job_detail (
|
||||
job_detail_id, job_id, product_id, product_name,
|
||||
lot_no, in_quantity, in_or_out_id, in_or_out_d_id,
|
||||
stockin_id, stockin_detail_id
|
||||
stockin_id, stockin_detail_id, project_no
|
||||
)
|
||||
VALUES (
|
||||
@job_detail_id, @job_id, @product_id, @product_name,
|
||||
@lot_no, @quantity, @stockin_id, @stockin_detail_id,
|
||||
@stockin_id, @stockin_detail_id
|
||||
@stockin_id, @stockin_detail_id, @project_no
|
||||
);
|
||||
|
||||
SET @row_idx += 1;
|
||||
FETCH NEXT FROM cur_tray INTO
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id;
|
||||
@product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id, @project_no;
|
||||
END
|
||||
|
||||
CLOSE cur_tray;
|
||||
|
||||
Reference in New Issue
Block a user