Лучшая практика написания POS-системы

Я собираю базовую систему Point of Sale (POS) на С#, которая должна печатать на принтере квитанции и открывать денежный ящик. Должен ли я использовать Microsoft Point of Service SDK?

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

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

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

Ответы

Ответ 1

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

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

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

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. Со временем вы можете столкнуться с несколькими способами взаимодействия с различными внешними устройствами. Клиент может получить новую денежную наличность в день и т.д. И т.д.

Является ли это ясным, я могу понять, что я имею в виду, если вы хотите, но вы, вероятно, получите мой дрейф.

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

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

PK: -)

Ответ 2

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

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

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


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

  • Принтер чеков, который может печатать только текст (устаревший, но все же вокруг)
  • Принтер чеков, который может печатать графику
  • Стандартная печать принтера 8.5 "x 11" полностраничных счетов-фактур/кредитных авизо (легко, сказал Нуфф)

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

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

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


В кассовых ящиках я менее знаком, чем с принтерами, но я знаю два варианта, касающихся связи и аппаратного обеспечения:

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

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

Ответ 3

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

Ответ 4

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

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