Лучшая практика для записи системы POS

Я соединяю основной пункт Sale (НА МЕСТЕ ПРОДАЖИ) система в C#, который должен распечатать к принтеру получения и открыть наличную секцию. Я должен использовать Microsoft Point of Service SDK?

Я играл вокруг с печатью к своему принтеру Samsung с помощью драйвера Windows, который шел с ним, и это, кажется, работает отлично. Я принимаю, хотя это, другие принтеры не могут идти с драйверами Windows и затем я застрял бы? Или я смог бы просто использовать Универсальный Драйвер / текстовый Драйвер для печати к какому-либо принтеру, который поддерживает его?

Для наличной секции я должен был бы отправить коды непосредственно в COM-порт, который меня устраивает, если это сохраняет меня стычка помощи клиентам установить драйверы OPOS в там системах.

Я спускаюсь по неправильному пути здесь?

14
задан Cœur 16 April 2017 в 07:23
поделиться

4 ответа

Если просто просмотреть, система точек продаж MS основана на Window Embedded, на самом деле это просто способ получить более низкую стоимость за единицу и меньшую лицензию на ОС Windows. Кажется, есть некоторые API-интерфейсы, специфичные для POS, но вы, похоже, хотите использовать свой собственный, вы все равно, вероятно, захотите каким-то образом использовать Windows Embedded. Скорее всего, безопасность будет заданием 1.

0
ответ дан 1 December 2019 в 16:24
поделиться

Чтобы напрямую управлять принтером чеков, прочтите команды ESC / POS . Эти команды позволят вам открывать кассовый ящик и печатать штрих-коды и изображения на квитанциях.

Однако, поскольку вы используете C #, возможно, будет проще использовать библиотеку классов Microsoft Point of Service .

0
ответ дан 1 December 2019 в 16:24
поделиться

Я никогда не занимался программным обеспечением того, о чем вы спрашиваете, но у меня есть некоторый опыт работы с POS-системами, который может вам помочь.

То, что вы делаете для печати и кассового ящика, сильно зависит от оборудования, с которым вы работаете. И существует широкий набор оборудования.

В каждой POS-системе, которую я видел, есть множество драйверов для каждого мыслимого принтера чеков и денежного ящика, поэтому, если вы не разрабатываете полноценную систему, просто сконцентрируйтесь на конкретном оборудовании, которым вы собираетесь пользоваться. работаю с. Даже в этом случае постарайтесь хорошо разложить свой код, чтобы получить максимальную пользу от шаблона стратегии. Если вы работаете с более чем одним типом устройств, позже вы будете благодарить себя за то, что реализовали его таким образом.


Для печати существует 3 основных типа принтеров, с которыми вы можете столкнуться:

  1. Чековый принтер, который может печатать только текст (устаревший, но все еще существует)
  2. Чековый принтер, который может печатать графику
  3. Стандартный принтер для печати Полностраничные счета / кредитовые авизо 8,5 "x 11" (легко, - сказал Нафф)

Я считаю, что большинство, если не все, современные принтеры чеков попадают в категорию № 2, но вы можете столкнуться с устаревшей системой, использующей принтер из категории №1.

Для категории № 2 вы должны иметь возможность использовать стандартный интерфейс печати .NET. Единственная проблема может заключаться в отправке управляющего кода для активации режущего механизма (если он есть) в соответствующее время (а); или драйвер принтера может сделать это автоматически в зависимости от длины бумаги, указанной в алгоритме печати. Опять же, я никогда не пробовал этого, но если у вас есть доступ к принтеру чеков, вы сможете быстро разобраться с этим.

Если вы имеете дело с одним клиентом, у которого есть принтер в категории №1, вы можете привести веский аргумент, что купить новый принтер в категории №2 будет дешевле, чем платить вам. разработать тупиковый драйвер для печати на имеющемся оборудовании.


Я менее знаком с денежными ящиками, чем с принтерами, но знаю два варианта в отношении связи и организации оборудования:

  1. Подключение через LPT-порт с через принтер. (Кабельная цепь: компьютер -> принтер -> денежный ящик)
  2. Подключается непосредственно к компьютеру, либо через порт COM / LPT, либо, вероятно, через USB в современном.

Первый тип работает, посылая управляющие коды в порт принтера (который принтер, надеюсь, проигнорирует и не выплюнет весь рулон чековой бумаги), в то время как для второго вам нужно будет выполнить связь через COM-порт. В любом случае управляющие коды зависят от оборудования. В большинстве случаев их можно найти в руководстве пользователя, но иногда технический писатель чувствовал себя особенно плохо в тот день, и вам придется копаться в Интернете.

1
ответ дан 1 December 2019 в 16:24
поделиться

Это, вероятно, немного другой ответ на то, что вы искали (!) ...

При работе с «внешними интерфейсами» (например, с принтерами, кассовыми аппаратами и т. Д.) Всегда абстрактные вещи. Вы, вероятно, захотите реализовать стратегии - Паттерн-стратегия .

Вы создаете интерфейс для розыгрыша денег:

public interface ICashDrawer
{
    void Open();
}

Реализации обеспечения:

  • одна стратегия - это класс, который использует COM для открытия розыгрыша
  • другой - что-то простое, как класс, который выполняет вызов Debug.WriteLine , поэтому вам не нужно подключать деньги к компьютеру во время разработки

, например

public class ComPortCashDrawer : ICashDrawer
{
    public void Open()
    {
        // open via COM port etc
    }
}

public class DebugWriterCashDrawer : ICashDrawer
{
    public void Open()
    {
        Debug.WriteLine("DebugWriterCashDrawer.Open() @ " + DateTime.Now);
    }
}

Опять же, для печати у вас есть интерфейс печати, который принимает данные:

public interface IRecieptPrinter
{
    bool Print(object someData);
}

затем вы выполняете одну или несколько реализаций.

  • Базовый принтер
  • Специализированный принтер этикеток
  • текстовый принтер, который сохраняет в файл ...

например.

public class BasicRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // format for a basic A4 print
        return true; // e.g. success etc
    }
}

public class SpecificXyzRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // format for a specific printer
        return true; // e.g. success etc
    }
}

public class PlainTextFileRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // Render the data as plain old text or something and save 
         // to a file for development or testing.
        return true; // e.g. success etc
    }
}

Что касается SDK, если в дальнейшем вы обнаружите, что он вам нужен по какой-то причине, вы пишете реализации с использованием SDK. Со временем у вас может появиться несколько способов взаимодействия с различными внешними устройствами. В один прекрасный день клиент может получить новый денежный розыгрыш и т.д. и т.п.

Ясно, я могу конкретизировать, что я имею в виду, если вы хотите, но вы, вероятно, уловили мою точку зрения.

Ваше приложение настраивается с соответствующими реализациями при запуске, вы можете также взглянуть на Внедрение зависимостей , и вам будет проще, если вы воспользуетесь контейнером для разрешения типов.

var printer = container.Resolve<IRecieptPrinter>();

PK: -)

6
ответ дан 1 December 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: