Untitled
unknown
plain_text
2 years ago
14 kB
6
Indexable
-----------------------
--dbo.IncomeJournalIDGenerateExemplars
--[EWMS-1471][EWMS-2531] В рамках 21 и 36 накладной, генерирует экземпляры для записи в Журнале Излишков
--Учитываются все проверки и логика работы с пакетами
--Основана на ExpressManifactureOverageJournalBatchIns
-----------------------
CREATE PROCEDURE dbo.IncomeJournalIDGenerateExemplars
@ConsigID dbo.bident,
@IncomeJournalID dbo.bident,
@CellID dbo.bident,
@ProduceDate datetime = null, --Дата производства
@GoodsReceipt dbo.bident = null, -- Приемный СГ в сек
@ExpirationDateOff datetime = null, -- Срок годности для списания
@ExpirationDateControl datetime = null, -- Контроль срока годности товара
@ExpirationDate datetime = null, -- Срок годности
@GoodsReceiptRuleID int = null,
@WriteOffRuleID int = null,
@Silent int = 0 -- 1 если нужно без вывода
as
begin
set nocount on;
set xact_abort on;
----ПЕРЕМЕННЫЕ----
declare
@CurrentExemplar int,
@PackageMaxNum int,
@SerialNumber string,
@ConsigTypeID int,
@ItemID dbo.BIDENT,
@PhysicalStoreID dbo.bident,
@ReqQty bigint,
@FactQty bigint,
@InsertQty bigint,
--обход экземпляров/serialnumbers
@pointer int,
@max_pointer int,
@err_msg nvarchar(max),
@PackageCellID dbo.BIDENT = dbo.GetCellIDForPackage(@CellID), -- функция позвращающая ID ячейки с пакетами
@NoExemplarTagID int, --ID тега безэкземплярки
@IsPackageGeneration bit = 0,
--[EWMS-1850] Автоматический перевод накадной в Обработано после Генерации Экземпляров для склада
@CloseConsigAfterExemplarGenerationForPhysicalStore int,
@ManifactureMaxQty int = dbo.SysConfigGetInt('ConsigItemUpdMaxManifactureItemQty');
select top(1) @NoExemplarTagID = T.ID
from dbo.Tag T with(nolock)
where T.EamsTagID = 59 --Безэкземплярка
--если накладная содержит пакеты
if exists ( select 1
from dbo.ConsigItem ci
inner join dbo.ExpressItemInPackage ep on ep.ItemID = ci.ItemID
where ci.ConsigID = @ConsigID)
begin
--если пакеты размещают не на ту ячейку, на которой уже лежит большинство пакетов склада
if @CellID != isnull(@PackageCellID,0)
begin
declare @CellName dbo.BNAME = 'На складе не найдена ячейка с пакетами!'; --если вдруг запрос ниже не найдёт @PackageCellID
select @CellName = isnull(c.Name, @CellName)
from dbo.Cell c
where c.ID = @PackageCellID;
exec dbo.Abort @Code = @@procid
,@Message = 'Для начисления пакетов выберите ячейку "%s"! Начисление пакетов на другие ячейки невозможно!'
,@p1 = @CellName;
end;
end;
drop table if exists #tmpItemExSerialNumbers
create table #tmpItemExSerialNumbers
(
ID bigint identity(1,1) NOT NULL primary key,
ExSerialNumber nvarchar(50) NOT NULL
)
--Проверка типа накладной
if not exists(select 1 from dbo.Consig C where C.ID = @ConsigID and C.ConsigTypeID in (21,36))
begin
exec dbo.Abort @Code = @@procid, @Message = 'Неверный тип накладной, требуется накладная Приход из производства (36) или Начисление излишков (21)';
end
--Проверка что накладная содержит позиции
if not exists(select 1 from dbo.ConsigItem CI where CI.ConsigID = @ConsigID)
begin
exec dbo.Abort @Code = @@procid, @Message = 'Накладная не содержит позиций';
end
--Проверям, есть ли в накладной SKU с пустыми тегами: Производство, Пластиковый Пакет, Безэкземплярка
--Если хотябы один тег есть - условие не выполняется
if exists(
select 1
from dbo.ConsigItem CI
where not exists(select 1 from dbo.ExpressItemInPackage EIIP
where CI.ItemID = EIIP.ItemID)
and not exists(select 1 from dbo.ExpressItemInManufacture EIIM
where CI.ItemID = EIIM.ItemID)
and not exists(select 1 from dbo.ItemTag ITT
where CI.ItemID = ITT.ItemID and ITT.TagID = @NoExemplarTagID)
and CI.ConsigID = @ConsigID)
begin
exec dbo.Abort @@ProcID, 'Генерация ШК доступна только для Готовой Продукции, Пакетов и Безэкземплярки';
end
select @PackageMaxNum = try_cast(SC.[Value] as int)
from dbo.SysConfig SC
where SC.Name = 'PackageMaxReqNum';
if @PackageMaxNum is null or @PackageMaxNum <= 0
begin
exec dbo.Abort @Code = @@procid
,@Message = 'Некорректно задана настройка PackageMaxReqNum в SysConfig'
end
if (select sum(ci.ReqQty)
from dbo.ExpressItemInPackage eiip
join dbo.ConsigItem ci on ci.ConsigID = @ConsigID
and ci.ItemID = eiip.ItemID ) > @PackageMaxNum
begin
exec dbo.Abort @Code = @@procid
,@Message = 'Требуемое количество не должно превышать %s! Измените количество в накладной ID: %s'
,@p1 = @PackageMaxNum
,@p2 = @ConsigID;
end
-- Из-за того, что в обмене с 1С максимально допустимый размер одного сообщения в 1 МБ, запретим создавать накладные с большим количеством экземпляров,
-- иначе при переводе накладной в конечный статус мы не сможем передать сообщение(смотри ConsigStatusDispatcher и ExpressManifactureProcessAddJsonQueue)
if (select sum(ci.ReqQty)
from dbo.Consig c
join dbo.ConsigItem ci on ci.ConsigID = c.ID
join dbo.ExpressItemInManufacture eiim on eiim.ItemID = ci.ItemID
join dbo.ExpressManifacturePhysicalStore emps on emps.PhysicalStoreID = c.DestinationPhysicalStoreID
where c.ID = @ConsigID) > @ManifactureMaxQty
begin
if not exists (select 1
from dbo.ConsigItem ci
join dbo.ExpressItemInPackage eiip on eiip.ItemID = ci.ItemID
where ci.ConsigID = @ConsigID
)
begin
exec dbo.Abort @Code = @@procid
,@Message = 'Указанное требуемое количество экземпляров превышает допустимую сумму по накладной в %s экземпляров! Измените количество в накладной (ConsigID = %s)'
,@p1 = @ManifactureMaxQty
,@p2 = @ConsigID;
end;
end;
select
@ConsigTypeID = C.ConsigTypeID,
@PhysicalStoreID = C.DestinationPhysicalStoreID,
@ItemID = CI.ItemID,
@ReqQty = CI.ReqQty,
@FactQty = isnull(IJ.Qty,0)
from dbo.Consig C
inner join dbo.ConsigItem CI
on C.ID = CI.ConsigID
left join dbo.IncomeJournal IJ
on CI.ID = IJ.ConsigItemID
where C.ID = @ConsigID
and IJ.ID = @IncomeJournalID
select @CloseConsigAfterExemplarGenerationForPhysicalStore = dbo.GetFeatureForPhysicalStoreEnabled('CloseConsigAfterExemplarGeneration',@PhysicalStoreID)
set @InsertQty = ISNULL(@ReqQty-@FactQty,0);
if (@InsertQty>0)
begin
begin tran; --TRANSACTION START
truncate table #tmpItemExSerialNumbers;
insert into #tmpItemExSerialNumbers
(
ExSerialNumber
)
exec dbo.SerialNumberGenerate
@Amount=@InsertQty,
@Prefix='EAN_';
if (@ConsigTypeID in (21,36)) and --Начисление излишков, Приход из производства
--Если обрабатываем позицию с пакетом
exists(select 1 from dbo.ExpressItemInPackage eiip where eiip.ItemId = @ItemID) and
--Берем только те накладные, в которых только пакеты. Иначе - обработаем поштучно
not exists(select 1 from dbo.ConsigItem ci
left join dbo.ExpressItemInPackage eiip on eiip.ItemID = ci.ItemID
where ci.ConsigID = @ConsigID
and eiip.ItemID is null
)
begin
exec dbo.IncomeJournalPackageExemplarBatchIns @IncomeJournalID = @IncomeJournalID
,@CellID = @CellID;
--Генерируем только пакеты
set @IsPackageGeneration = iif(@ConsigTypeID = 36, 1, 0);
end
else
begin
set @pointer = 1;
select @max_pointer = count(1)
from #tmpItemExSerialNumbers tIEN
--Обходим табличку, вставляем экз в журнал
while (@pointer <= @max_pointer)
BEGIN
begin try --try/catch добавления экземпляра
select top (1)
@SerialNumber = tIE.ExSerialNumber
from #tmpItemExSerialNumbers tIE
where tIE.ID = @pointer
exec dbo.IncomeJournalExemplarIns
@SerialNumber =@SerialNumber,
@IncomeJournalID =@IncomeJournalID,
@CellID =@CellID,
@ExpirationDate =@ExpirationDate,
@GoodsReceipt =@GoodsReceipt,
@ProduceDate =@ProduceDate,
@ExpirationDateOff =@ExpirationDateOff,
@ExpirationDateControl =@ExpirationDateControl,
@GoodsReceiptRuleID =@GoodsReceiptRuleID,
@WriteOffRuleID =@WriteOffRuleID
@Silent =@Silent
end try --try/catch добавления экземпляра
begin catch
set @err_msg = 'Ошибка добавления экземпляра.ErrorMessage = ' + isnull(convert(nvarchar(4000) , error_message()) , 'null');
exec dbo.Abort @Code = @@procid, @Message = @err_msg;
end catch
set @pointer = @pointer + 1;
END
end
--Перевод позиции Журнала в статус ОжПров
exec dbo.IncomeJournalReady
@IncomeJournalID = @IncomeJournalID
--автоматически переведём накладную в "Обработано":
--Если генерируем только пакеты в рамках 36 накладной,
--Либо если включена настройка 'Автоматический перевод накадной в Обработано' для склада
if @IsPackageGeneration = 1 or @CloseConsigAfterExemplarGenerationForPhysicalStore = 1
begin
--Если все позиции в журнале начисления в ОжПров
if not exists (select 1
from dbo.ConsigItem CI
join dbo.IncomeJournal IJ on IJ.ConsigItemID = CI.ID
and IJ.IncomeJournalStatusID != 3 --Ожидает проведения
where CI.ConsigID = @ConsigID)
begin
if (@ConsigTypeID = 36) --Приход их производства
begin
exec dbo.ConsigStatusDispatcher @ConsigID = @ConsigID
,@DestinationStatusID = 135; --Обработано
end
if (@ConsigTypeID = 21) --Начисление излишков
begin
exec dbo.ConsigStatusDispatcher @ConsigID = @ConsigID
,@DestinationStatusID = 70; --Обработано
end
end
end
commit tran;
end;
end;
Editor is loading...
Leave a Comment