Лучшая практика для написания системы POS - PullRequest
14 голосов
/ 15 марта 2010

Я собираю базовую систему POS в C #, которую нужно распечатать на чековом принтере и открыть кассовый ящик. Нужно ли использовать Microsoft Point of Service SDK?

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

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

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

Ответы [ 4 ]

6 голосов
/ 24 марта 2010

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

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

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

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);
}

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

  • Базовый принтер
  • Специализированный принтер этикеток
  • текстовый файл, который сохраняется в файл ...
* * +1036 например,
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>();

ПК: -)

1 голос
/ 24 марта 2010

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

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

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


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

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

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

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

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


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

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

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

0 голосов
/ 25 марта 2010

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

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

0 голосов
/ 17 марта 2010

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

...