Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
14 kB
1
Indexable
Never
-----------------------
--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;
Leave a Comment