feat: 完善WCS调度、库存追溯和出库分配

This commit is contained in:
zgw
2026-07-15 16:24:07 +08:00
parent 9d3aa7a3bd
commit 66ac268524
101 changed files with 12596 additions and 669 deletions

View File

@@ -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')

View 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

View 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;

View 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;

View 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;

View 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

View 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';

View 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;

View 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;

View 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;

View 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;

View 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

View 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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;