Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

http://localhost:3000/sku_store_params

...

Подробнее про функционал “Параметры позиций“ можно узнать тут.
Основная таблица этой формы RPM_SKU_STORE_PARAMS
Таблица заполняется из базы клиента автоматически или через импорт файла csv

Info

IS_CROSS_DOCK, PICK_TO_ZERO, IS_MORNING - эти поля определяют, подтянет ли SKU из контракта диаграмма соответствующего типа.
Сама диаграмма в таблицу RPM_SKU_STORE_PARAMS изменения не вносит.

public\javascripts\rpm_sku_store_params\main.js
Фронтовой функционал собран в:
public\javascripts\rpm_sku_store_params\main.js
public\javascripts\rpm_sku_store_params\templates.js
Серверная часть в:
classes\controllers\rpm\skuStoreParams.js

rpm_get_sku_store_params_rows
Основной запрос страницы sku_store_params. Предназначен для извлечения данных отображаемых таблицей. Назначен на /api/rpm/sku_store_params_get_rows.
Фильтры SKU (сравнивается как с SKU_ID, так и на подстроку в PRODUCTS.ARTICLE_NAME или PRODUCTS.ITEM_CODE), магазин, договор, поставщик, менеджер и признаки sku-range и is-new.

rpm_get_sku_store_params_by_key
Предназначен для извлечения из RPM_SKU_STORE_PARAMS признака PICK_TO_ZERO по заданным SKU и магазину.
Используется в classes\controllers\rpm\dbServices.js и далее в getPickingFcstDetails из classes\controllers\rpm\orders.js, что выведено в /api/rpm/get_picking_fcst_details , а сам запрос вызывается из orders.

rpm_get_sku_store_params_by_pairs
Предназначен для извлечения из RPM_SKU_STORE_PARAMS минимального заказа, кратности и признака sku-range по заданным SKU и магазину.
Используется в checkSkuStoreParamsByPairs из classes\controllers\rpm\push\index.js , что выведено в /api/rpm/push_check_sku_store_params_by_pairs, а сам запрос вызывается из rpm_push.

rpm_sku_store_params_get_init_data
Предназначен для извлечения списка менеджеров, наполняющего выпадающий список фильтра. Используется в getInitialData из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_params_get_initial_data.

rpm_sku_store_params_get_contracts
Предназначен для извлечения списка договоров, наполняющего выпадающий список фильтра. Используется в getInitialData из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_params_get_initial_data.

rpm_sku_store_params_update_is_order
Предназначен для обновления поля IS_ORDER таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Сейчас не используется.

rpm_sku_store_params_update_is_production
Предназначен для обновления поля IS_PRODUCTION таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Сейчас не используется.

rpm_sku_store_params_update_is_shelf_limit
Предназначен для обновления поля IS_SHELF_LIMIT таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Сейчас не используется.

...

Code Block
languagesql
    select top 100000
        ssp.SKU_ID, ssp.STORE_ID, ssp.PARCEL, ssp.CAPACITY, ssp.MIN_ORDER_QTY, 
        ssc.CONTRACT_ID, c.CONTRACT_NAME, sup.SUPPLIER_ID, sup.SUPPLIER_NAME, s.STORE_NAME, 
        p.ARTICLE_NAME, ssm.EXT_MANAGER_ID, convert(varchar, ssp.UPDATED, 121) as UPDATED, 
        ssp.UPDATED_BY, me1.NAME as UPDATED_BY_NAME, me.NAME as MANAGER_NAME, 
        p.ITEM_CODE, ls.QUANTITY as LATEST_STOCK, ib.SUB_SKU_ID, ib1.MASTER_SKU_ID,
        ssp.IS_ORDER, ssp.IS_PRODUCTION, ssp.IS_SHELF_LIMIT, p.SHELF_DAYS,
        (coalesce(pr.PRESENTATION_1, 0) + coalesce(pr.PRESENTATION_2, 0)) as PRESENTATION,
        (select sum(RAPI.QUANTITY)
        from RPM_ADD_PRESENTATION AS AP
        JOIN RPM_ADD_PRESENTATION_ITEMS RAPI ON RAPI.ID=AP.ID
        WHERE AP.IS_ACTIVE=1
        AND RAPI.SKU_ID = ssp.SKU_ID
        AND RAPI.STORE_ID = ssp.STORE_ID
        AND getdate() BETWEEN AP.START_DATE AND AP.END_DATE) as ADD_PRESENTATION_NUM,
        ass.SALES_VOLUME as AVG_SALES, l7ds.SALES_VOLUME LAST_SALES,
        (select max(d.ID) from RPM_DIAGRAM d where d.SPECIFICATION_ID=ssc.CONTRACT_ID 
               and d.STORE_ID=ssp.STORE_ID
               and d.PUSH_ID is null and d.END_DATE is null) DIAGRAM_ID,
        ssp.GUARANTEED_ORDER, ssp.IS_CROSS_DOCK, ssp.PICK_TO_ZERO, ssp.IS_MORNING,
        case when src.SKU_ID is not null then 1 else 0 end as AM, ssp.ADD_CYCLE,
        ssp.PLUS_D1D2FCST, ssp.ROUND_FACTOR, ssp.WRITEOFF_LIMIT,
        ssp.SHELF_LIFE_PERC, ssp.MAX_INCREASE_PERC,
        case when fm.model like '%group_new%' then 1
             when fm.model like '%reg_alloc%' then 2
             else 0 end IS_NEW
    from RPM_SKU_STORE_PARAMS ssp with (nolock)
    inner join PRODUCTS p on ssp.SKU_ID = p.SKU_ID 
          and (upper(p.ARTICLE_NAME) like '%:sku_name%' or upper(p.ITEM_CODE)
             like '%:sku_name%')
    inner join STORES s on s.STORE_ID = ssp.STORE_ID
    left join SKU_STORE_CONTRACT_V ssc on ssc.SKU_ID = ssp.SKU_ID
          and ssc.STORE_ID = ssp.STORE_ID
    left join CONTRACTS c on c.CONTRACT_ID = ssc.CONTRACT_ID
    left join SUPPLIERS sup on sup.SUPPLIER_ID = c.SUPPLIER_ID
    left join SKU_STORE_MANAGER ssm on ssm.SKU_ID = ssp.SKU_ID 
          and ssm.STORE_ID = ssp.STORE_ID
    left join MANAGER_EXT me on me.ID = ssm.EXT_MANAGER_ID
    left join MANAGER_EXT me1 on me1.ID = ssp.UPDATED_BY
    left join LATEST_STOCK ls on ls.SKU_ID = ssp.SKU_ID and ls.STORE_ID = ssp.STORE_ID
    left join FCST_SKU_MEAS fm on ssp.SKU_ID=fm.SKU_ID and ssp.STORE_ID=fm.STORE_ID
               and fm.ID=(select max(id) from fcst where loaded is not null)
    left join RPM_PRESENTATION pr on pr.SKU_ID = ssp.SKU_ID and pr.STORE_ID = ssp.STORE_ID
    left join AVG_SALES_SKU ass on ass.SKU_ID = ssp.SKU_ID and ass.STORE_ID = ssp.STORE_ID
    left join (select distinct SUB_SKU_ID from IF_BOM) ib on ib.SUB_SKU_ID = ssp.SKU_ID
    left join (select distinct MASTER_SKU_ID from IF_BOM) ib1 
          on ib1.MASTER_SKU_ID = ssp.SKU_ID
    left join LAST_DAYS_SALES l7ds on l7ds.SKU_ID = ssp.SKU_ID 
          and l7ds.STORE_ID = ssp.STORE_ID
    left join SKU_RANGE_CURRENT src on src.SKU_ID = ssp.SKU_ID 
          and src.STORE_ID = ssp.STORE_ID
    where ssp.STORE_ID [store]
      and ssp.SKU_ID [skus]
      and (:manager = -999 or ssm.EXT_MANAGER_ID = :manager)
      and (c.SUPPLIER_ID [suppliers] or -10 [suppliers])
      and (c.CONTRACT_ID like ':contract' or upper(c.CONTRACT_NAME) 
          like ':contract' or ':contract' = '%')
      and (:is_in_range in (-999, 0, 2) or src.SKU_ID is not null)
      and (:is_in_range in (-999, 1, 2) or src.SKU_ID is null)
      and (:is_new = -999
           or (:is_new = 0 and fm.model not like '%group_new%' and fm.model 
              not like '%reg_alloc%')
           or (:is_new = 1 and fm.model like '%group_new%')
           or (:is_new = 2 and fm.model like '%reg_alloc%') )
      and (:is_in_range in (-999, 0, 1)
           or (src.SKU_ID is not null
               and not exists (select 1 from rpm_orders_v o
                   where o.order_date >= cast(getdate() as date) 
               and o.sku_id=ssp.SKU_ID)))

rpm_get_sku_store_params_by_key
Предназначен для извлечения из RPM_SKU_STORE_PARAMS признака PICK_TO_ZERO по заданным SKU и магазину.
Используется в classes\controllers\rpm\dbServices.js и далее в getPickingFcstDetails из classes\controllers\rpm\orders.js, что выведено в /api/rpm/get_picking_fcst_details , а сам запрос вызывается из orders.

Code Block
languagesql
    select PICK_TO_ZERO
    from RPM_SKU_STORE_PARAMS where sku_id=:sku_id and store_id=:store_id;

rpm_get_sku_store_params_by_pairs
Предназначен для извлечения из RPM_SKU_STORE_PARAMS минимального заказа, кратности и признака sku-range по заданным SKU и магазину.
Используется в checkSkuStoreParamsByPairs из classes\controllers\rpm\push\index.js , что выведено в /api/rpm/push_check_sku_store_params_by_pairs, а сам запрос вызывается из http://localhost:3000/rpm_push

Code Block
languagesql
    select SKU_ID, MIN_ORDER_QTY, PARCEL,
        (case
            when exists (select 1 from SKU_RANGE
                where STORE_ID = :store_id and SKU_ID = ssp.SKU_ID
                    and START_DATE <= cast(getdate() as date)
                    and (END_DATE >= cast(getdate() as date) or END_DATE is null))
            then 1 else 0
            end) as IS_IN_RANGE
    from RPM_SKU_STORE_PARAMS ssp where SKU_ID [skus] and STORE_ID=:store_id

rpm_sku_store_params_get_init_data

...


Предназначен для извлечения списка менеджеров, наполняющего выпадающий список фильтра. Используется в getInitialData из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_params_get_initial_data.

Code Block
languagesql
    select ID, NAME from MANAGER_EXT

rpm_sku_store_params_get_contracts
Предназначен для извлечения списка договоров, наполняющего выпадающий список фильтра. Используется в getInitialData из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_params_get_initial_data.

Code Block
   select CONTRACT_ID ID, CONTRACT_NAME NAME from CONTRACTS;

rpm_get_check_order
По заданному набору SKU и магазинов из вью SKU_STORE_CONTRACT_V извлекает договора, поставщиков и различные признаки для проверки возможности заказа.
Используется в checkPossibilityToOrder из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_store_params/check_order_possibility.
Это ключевой запрос модального окна "Проверка возможности заказа".

Code Block
languagesql
    select st.STORE_ID,st.STORE_NAME,
           p.SKU_ID, case when p.ITEM_CODE is null then p.ARTICLE_NAME 
           else concat('(', cast(p.ITEM_CODE as varchar), ') ', p.ARTICLE_NAME) end
           as ARTICLE_NAME,
        (case when
            exists(
                select 1 from SKU_RANGE
                where STORE_ID = st.STORE_ID and SKU_ID = p.SKU_ID
                    and START_DATE <= cast(getdate() as date)
                    and (END_DATE >= cast(getdate() as date) or END_DATE is null)
                )
        then 1 else 0 end) as IS_AM,
        ssc.CONTRACT_ID,
        ssc.PACKAGE_CONTENT,
        ssc.IS_ORDER,
        c.CONTRACT_NAME,
        s.SUPPLIER_ID,
        s.SUPPLIER_NAME
    from STORES st
    join PRODUCTS p on p.SKU_ID [skus]
      or p.ITEM_CODE '[item_codes]'
    left join SKU_STORE_CONTRACT_V ssc on ssc.SKU_ID = p.SKU_ID
        and ssc.STORE_ID = st.STORE_ID
    left join CONTRACTS c on c.CONTRACT_ID = ssc.CONTRACT_ID
    left join SUPPLIERS s on c.SUPPLIER_ID = s.SUPPLIER_ID
    where st.STORE_ID [stores]

rpm_get_diagram_and_cal_by_skus
По заданному набору SKU и магазинов извлекает диаграммы для проверки возможности заказа.
Используется в checkPossibilityToOrder из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_store_params/check_order_possibility.
Это ключевой запрос модального окна "Проверка возможности заказа".

Code Block
languagesql
    select d.ID as DIAGRAM_ID, coalesce(di.SKU_ID, 
        ssc.SKU_ID, ssc2.SKU_ID) as SKU_ID, d.STORE_ID,
        (select convert(varchar, min(ORDER_DATE), 121) from RPM_CALENDAR
         where DIAGRAM_ID = d.ID and IS_ACTIVE='1' and ORDER_DATE >= cast(getdate() as date)
        ) as CLOSEST_ORDER
    from RPM_DIAGRAM d
    left join RPM_DIAGRAM_ITEMS di on d.ID = di.DIAGRAM_ID
        and d.ALL_SKUS = '0'
    left join SKU_STORE_CONTRACT_V ssc on d.SPECIFICATION_ID = ssc.CONTRACT_ID
        and d.STORE_ID = ssc.STORE_ID
        and d.ALL_SKUS = '1'
        and coalesce(d.WAREHOUSE_TYPE, '0') != 'c'
    left join SKU_STORE_CONTRACT_V ssc2 on d.SPECIFICATION_ID = ssc2.CONTRACT_ID
        and d.STORE_ID = ssc2.STORE_ID
        and d.ALL_SKUS = '1'
        and d.WAREHOUSE_TYPE = 'c'
        and ssc2.IS_CROSSDOCK = 1
    join products p on coalesce(di.SKU_ID, ssc.SKU_ID, ssc2.SKU_ID) = p.SKU_ID
    where (coalesce(di.SKU_ID, ssc.SKU_ID, ssc2.SKU_ID) [skus]
           or p.ITEM_CODE '[item_codes]')
        and d.STORE_ID [stores]
        and d.START_DATE <= cast(getdate() as date)
        and (d.END_DATE >= cast(getdate() as date) or d.END_DATE is null)

rpm_check_sku_store_pairs_existence
Проверяет существование SKU и магазинов в таблице RPM_SKU_STORE_PARAMS. Используется в filterNonExistentPairs и далее importFromFile из classes\controllers\rpm\skuStoreParams.js
назначенном в /api/rpm/sku_store_params/import_items. Используется при импорте из csv.

Code Block
languagesql
    select ssp.SKU_ID, ssp.STORE_ID
    from RPM_SKU_STORE_PARAMS ssp
    where ssp.SKU_ID [skus] and ssp.STORE_ID [stores]

rpm_update_item_params_record
Предназначен для обновления полей таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Используется в updateParamsBySkuIdStoreId из classes\controllers\rpm\dbServices.js и далее в importFromFile, updateRecordIntoDb и bulkUpdateRecordsIntoDb выведенных соответственно в /api/rpm/sku_store_params/import_items , /api/rpm/sku_store_params/update_record и /api/rpm/sku_store_params/bulk_update_record.

Code Block
languagesql
    update ssp
    set PARCEL = :parcel, MIN_ORDER_QTY = :min_order_qty, UPDATED = getdate(),
        UPDATED_BY = :user_id, IS_ORDER = :is_order, IS_PRODUCTION = :is_production,
        IS_SHELF_LIMIT = :is_shelf_limit, GUARANTEED_ORDER = :guar_order,
        IS_CROSS_DOCK = :is_cross_dock, PICK_TO_ZERO = :pick_to_zero,
        IS_MORNING = :is_morning, ADD_CYCLE = :add_cycle, PLUS_D1D2FCST = :plus_d1d2_fcst,
        ROUND_FACTOR = :round_factor, WRITEOFF_LIMIT = :writeoff_limit,
                       SHELF_LIFE_PERC = :shelf_life_perc,
        MAX_INCREASE_PERC = :max_increase_perc, CAPACITY = :capacity
    from RPM_SKU_STORE_PARAMS ssp
    where ssp.SKU_ID = :sku_id and ssp.STORE_ID = :store_id

rpm_sku_store_params_import
Предназначен для вставки записи в таблицу RPM_SKU_STORE_PARAMS. Используется в updateParamsBySkuIdStoreId из classes\controllers\rpm\dbServices.js и далее в importFromFile, updateRecordIntoDb и bulkUpdateRecordsIntoDb выведенных соответственно в /api/rpm/sku_store_params/check_order_possibility.
Это ключевой запрос модального окна "Проверка возможности заказа".

...

import_items , /api/rpm/sku_store_params/update_record и /api/rpm/sku_store_params/bulk_update_record.

Code Block
languagesql
    merge select st.STORE_ID,st.STORE_NAME,
           p.SKU_ID, case when p.ITEM_CODE is null then p.ARTICLE_NAME 
  into RPM_SKU_STORE_PARAMS ssp
    using (select :sku_id SKU_ID, :store_id STORE_ID) src
        elseon concat('(', cast(p.ITEM_CODE as varchar), ') ', p.ARTICLE_NAME) end(ssp.SKU_ID = src.SKU_ID and ssp.STORE_ID = src.STORE_ID)
    when matched then
     as ARTICLE_NAME,  update set PARCEL = :parcel, MIN_ORDER_QTY  (case when
 = :min_order_qty, UPDATED = getdate(),
        UPDATED_BY  exists(
     = :user_id, IS_ORDER = :is_order, IS_PRODUCTION = :is_production,
        IS_SHELF_LIMIT  select 1 from SKU_RANGE
       = :is_shelf_limit, GUARANTEED_ORDER = :guar_order,
        where STORE_IDIS_CROSS_DOCK = st.STORE_ID and SKU_ID = p.SKU_ID:is_cross_dock, PICK_TO_ZERO = :pick_to_zero,
        IS_MORNING = :is_morning,
        ADD_CYCLE = and START_DATE <= cast(getdate() as date):add_cycle, PLUS_D1D2FCST = :plus_d1d2_fcst,
        ROUND_FACTOR = :round_factor,
        WRITEOFF_LIMIT =  and (END_DATE >= cast(getdate() as date) or END_DATE is null):writeoff_limit, SHELF_LIFE_PERC = :shelf_life_perc,
        MAX_INCREASE_PERC = :max_increase_perc, CAPACITY = :capacity
    when not )matched then
       then 1insert else(
0 end) as IS_AM,         ssc.CONTRACTSKU_ID, STORE_ID, PARCEL, MIN_ORDER_QTY, UPDATED, UPDATED_BY,
   ssc.PACKAGE_CONTENT,         ssc.IS_ORDER, IS_PRODUCTION, IS_SHELF_LIMIT, GUARANTEED_ORDER, IS_CROSS_DOCK,
    c.CONTRACT_NAME,         s.SUPPLIER_ID,
 PICK_TO_ZERO, IS_MORNING, ADD_CYCLE, PLUS_D1D2FCST, 
     s.SUPPLIER_NAME     from STORES st
ROUND_FACTOR, WRITEOFF_LIMIT,
   join PRODUCTS p on p.SKU_ID [skus]       or p.ITEM_CODE '[item_codes]'SHELF_LIFE_PERC, MAX_INCREASE_PERC, CAPACITY
    left join SKU_STORE_CONTRACT_V ssc on ssc.SKU_ID = p.SKU_ID )
       and ssc.STORE_ID = st.STORE_IDvalues (
     left join CONTRACTS c on c.CONTRACT_ID = ssc.CONTRACT_ID
    left join SUPPLIERS s on c.SUPPLIER_ID = s.SUPPLIER_ID:sku_id, :store_id, :parcel, :min_order_qty, getdate(), :user_id,
           where st.STORE_ID [stores]

rpm_get_diagram_and_cal_by_skus
По заданному набору SKU и магазинов извлекает диаграммы для проверки возможности заказа.
Используется в checkPossibilityToOrder из classes\controllers\rpm\skuStoreParams.js и выведен в /api/rpm/sku_store_params/check_order_possibility.
Это ключевой запрос модального окна "Проверка возможности заказа".

rpm_check_sku_store_pairs_existence
Проверяет существование SKU и магазинов в таблице RPM_SKU_STORE_PARAMS. Используется в filterNonExistentPairs и далее importFromFile из classes\controllers\rpm\skuStoreParams.js
назначенном в /api/rpm/sku_store_params/import_items. Используется при импорте из csv.

...

:is_order, :is_production, :is_shelf_limit, :guar_order, :is_cross_dock,
            :pick_to_zero, :is_morning, :add_cycle, :plus_d1d2_fcst, :round_factor,
            :writeoff_limit, :shelf_life_perc, :max_increase_perc, :capacity
            );

Сейчас (ноябрь 2022) не используется:

rpm_sku_store_params_update_is_order
Предназначен для обновления поля IS_ORDER таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Сейчас не используется.

rpm_sku_store_params_importupdate_is_production
Предназначен для вставки записи в таблицу обновления поля IS_PRODUCTION таблицы RPM_SKU_STORE_PARAMS . Используется в updateParamsBySkuIdStoreId из classes\controllers\rpm\dbServices.js и далее в importFromFile, updateRecordIntoDb и bulkUpdateRecordsIntoDb выведенных соответственно в /api/rpm/для заданных SKU и магазина. Сейчас не используется.

rpm_sku_store_params/import_items , /api/rpm/sku_store_params/update_record и /api/rpm/sku_store_params/bulk_update_record_update_is_shelf_limit
Предназначен для обновления поля IS_SHELF_LIMIT таблицы RPM_SKU_STORE_PARAMS для заданных SKU и магазина. Сейчас не используется.

Форма Дополнительная загрузка

rpm_get_promo_for_add_load

...