31.01.2013 17:23
А есть у кого описание классов, доступных в pch_serv.lua для v49 ?
На wiki C+ нет ничего, в файле "Общие правила работы и написания скриптов.doc" с ftp кое что устаревшее.

Например:
- item.var (ШК) падает в ошибку
- есть ли способ получить цену из определенного прайслиста
- как пройтись по списку скидок и взять сумму определенной (как пройти по mark_effort_map и далее, если оно вообще работает)
31.01.2013 23:02
Прайс-листы недоступны в модуле сервера прайсчекера.
Класс item сервера прайсчекеров и класс item модуля печати чеков - совершенно разные классы! Хотя у них есть схожие методы и свойства. Но есть вероятность 90%, что если в исходном скрипте pch_serv.lua (то есть при чистой установке сервера УКМ) они не используются, то они и не реализованы. В лучшем случае значение свойства будет nil, в худшем - ошибка при любой попытке обращения. Пару лет назад мы хотели остатки выводить, но свойство quantity содержало всегда 0. Требовалась доработка => теряли время.

Сервер прайсчекеров не готов, я считаю. Помимо вышеописанного, имеются так же следующие проблемы:

- сервер прайсчекеров не способен обслуживать более одного магазина - он жёстко привязан к одному магазину, поэтому в схеме "СГО - кассы" (без СМ) необходимо для данного магазина куда-нибудь ещё ставить сервер прайсчекеров с его отдельной БД;
- не реализовано обновление сервера прайсчекеров: при обновлении УКМ до новой версии или сервис-пака необходимо удалить файл pcserver.exe, удалить настройку из УКМ (но тут имеется ошибка № 3520 "При удалении прайсчекера на СГО он не удаляется с СМ" - не исправлена), удалить БД сервера прайсчекеров, создать БД новой версии, подложить файл pcserver.exe новой версии, настроить новый сервер прайсчекеров (но тут имеется ошибка № 3358 "Тиражирование ненужных копий прайсчекера в случаях разрыва связи серверов УКМ и прайсчекеров по тайм-ауту" - не исправлена). И это надо сделать на каждом СМе. И когда на горизонте замаячило обновление СГО и 75 СМов на новую версию УКМ, а у руководства возникло решение о сокращении расходов и переходе на безСМную схему, было принято радикальное решение - я написал собственный сервер прайсчекеров.

Он способен работать в единственном экземпляре с БД СГО, успешно обслуживая одновременно 69 магазинов (как показало самое тяжёлое нагрузочное тестирование в последних числах декабря-2012), в некоторых из которых по два прайсчекера, и в каждом магазине отображаются конкретно его цены с учётом автоматических безусловных скидок. Сервер прайсчекеров работает с теми же типами прайсчекеров, что и сервисплюсовский - Штрих-М и Shuttle SG-15, однако теоретически может работать с любым прайсчекером в режиме "запрос - ответ" (SG-15) или "запрос-ответ1-задержка-ответ2" (Штрих-М). Что же касается выводимой информации, то ответ прайсчекеру формируется непосредственно в хранимой процедуре БД ukmserver. Поэтому выводить можно таким образом любую информацию, например, действующие и потенциальные скидки на товар, баланс и историю операций по подарочной карте или карте клиента, или сроки действия купона на скидку. Достаточно только нужным образом отредактировать хранимую процедуру.

Добавлено через 6 минут 41 секунду
Впрочем, вот функция для Shuttle SG-15 и сервисплюсовского сервера прайсчекеров. Функция выводит артикул товара, его наименование и стоимость с учётом автоматической безусловной скидки "Распродажа", величина в процентах которой так же отображается в последней строке:

Код:
function form_discount_info_shuttle(item)
    local text = "";
    local str = item.name;
    local i = 1;
  
    text = text .. hw_pch_command_clear_screen;
    text = text .. hw_pch_command_small_font;
    text = text .. hw_pch_command_align_l_t .. "артикул: " .. hw_pch_command_end_text;
    text = text .. hw_pch_command_align_r_t .. item.item .. hw_pch_command_end_text;
 
    while ukm.str_len(str) > 20 and i < 3 do
        text = text .. hw_pch_cursor_pos(0,i);
        text = text .. hw_pch_command_align_l_cur_y .. ukm.str_sub(str, 1, 20) .. hw_pch_command_end_text;
	str = ukm.str_sub(str, 20, ukm.str_len(str));
	i = i + 1;
    end;
    text = text .. hw_pch_cursor_pos(0,i);
    text = text .. hw_pch_command_align_l_cur_y .. str .. hw_pch_command_end_text;
 
ukm.debug("item.remain: "..tostring(item.remain));
 
    local discount_text="";
    local disc_val="";
 
    for i=1,item.discount_list:size()-1 do
      local __discount = item.discount_list:at(i);
      local discount_name=ukm.trim(__discount.first);
      if discount_name=="Распродажа" then
        disc_val=__discount.second;
        if ukm.str_len(disc_val)>0 then
          disc_val=string.gsub(ukm.trim(ukm.str_sub(disc_val,1,string.find(tostring(disc_val),",")-1)),"-","");
          if ukm.str_len(disc_val)>0 then
            local procento=(ukm.str_sub(disc_val,-1)=="%");
            local discount_val=ukm.currency(string.gsub(disc_val,"%%","")*1.0);
            if not procento then
              disc_val=disc_val.." р.";
            end;
            if disc_val~="" then
              disc_val="(со скидкой "..disc_val..")";
            end;
            discount_text=tostring(item.price-item.price*discount_val/ukm.currency(100)*ukm.currency(procento and 1 or 0)-discount_val*ukm.currency(not procento and 1 or 0));
          end;
        end;
      end;
    end;
 
    local price_text="";
    if discount_text=="" then
      price_text=tostring(item.price);
    else
      price_text=discount_text;
    end;

    text = text .. hw_pch_cursor_pos(0,3)..hw_pch_command_align_l_cur_y .. " цена: " .. hw_pch_command_end_text .. hw_pch_command_align_r_cur_y .. price_text .. " р." .. hw_pch_command_end_text;
    text = text .. hw_pch_command_next_line .. hw_pch_command_align_c_b .. disc_val .. hw_pch_command_end_text;



ukm.debug("Shuttle SG-15 scanning: "..item.item .. " \""..item.name.."\", цена: " .. price_text.. "р. "..disc_val);

    return text;
end
Добавлено через 2 минуты 46 секунд
А вот то же самое для Штрих-М, только в бегущих строках и в два экрана:

Код:
function form_discount_info_shtrih(item)
    local discount_val="";
    local discount_price="";
    local discount_text="";
    local disc_val="";

    for i=1,item.discount_list:size()-1 do
      local __discount = item.discount_list:at(i);
      local discount_name=ukm.trim(__discount.first);
      if discount_name=="Распродажа" then
        disc_val=__discount.second;
        if ukm.str_len(disc_val)>0 then
          disc_val=string.gsub(ukm.trim(ukm.str_sub(disc_val,1,string.find(tostring(disc_val),",")-1)),"-","");
          if ukm.str_len(disc_val)>0 then
            local procento=(ukm.str_sub(disc_val,-1)=="%");
            local discount_val=ukm.currency(string.gsub(disc_val,"%%","")*1.0);
            if not procento then
              disc_val=disc_val.." р.";
            end;
            if disc_val~="" then
              disc_val="(со скидкой "..disc_val..")";
            end;
            discount_text=tostring(item.price-item.price*discount_val/ukm.currency(100)*ukm.currency(procento and 1 or 0)-discount_val*ukm.currency(not procento and 1 or 0));
          end;
        end;
      end;
    end;

    local price_text="";
    if discount_text=="" then
      price_text=tostring(item.price);
    else
      price_text=discount_text;
    end;

    local text = item.name .. "\n"
        .. "цена: " .. price_text .. "р.";


ukm.debug("Shtrih-M scanning: "..item.item .. " \""..item.name.."\", цена: " .. price_text.. "р. "..disc_val);
    return text;
end
01.02.2013 09:37
Спасибо.

Насчет var разобрался - его нужно использовать в таком виде:
item.var:get()

discount_list также прошел самостоятельно, но с ним проблема - мне нужна скидка для зарегистрированного клиента, а таких в этом списке нет.

Одна надежда осталась на mark_effort_map -> pch_discount, но чем разложить map - не представляю.

В местных условиях обслуживание нескольких магазинов и автообновление не критично, но если не получится со скидкой - придется смотреть в сторону самописного (хотя с моими прог. способностями и это маловероятно).
06.02.2013 21:29
Итого.

mark_effort_map победить не удалось, а ТП посчитала мой запрос слишком сложным - "в документации не описано, тут программировать нужно, пишите ТЗ"

Выкрутился обходным путем.

Сделал дополнительную фиктивную скидку (все дни отключены) с нужным прайслистом.
Скидка появилась в discount_list.

И что важно - скидка с типом "На чек по времени и сумме" не появлялась, сработала "На классификатор и артикул".
23.06.2016 17:24
Подниму тему.

В актуальных версиях прайсчекер доломали в части вывода скидочной цены прайслиста, скидка в списке discount_list есть, но ее интервал сумм discount.second пустой.

Ни у кого не появилось новой инфы по рабочим lua функциям сервера прайсчекера?
Часовой пояс GMT +3, время: 17:37.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.