Untitled
unknown
plain_text
2 years ago
14 kB
3
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