【问题标题】:Best Practice for Writing a POS System编写 POS 系统的最佳实践
【发布时间】:2011-01-27 18:32:10
【问题描述】:

我正在用 C# 编写一个基本的销售点 (POS) 系统,该系统需要打印到收据打印机并打开现金抽屉。我是否必须使用 Microsoft Point of Service SDK?

我一直在尝试使用随附的 Windows 驱动程序打印到我的三星打印机,它似乎工作得很好。我假设其他打印机可​​能不附带 Windows 驱动程序,然后我会被卡住?或者我可以简单地使用通用/文本驱动程序打印到任何支持它的打印机吗?

对于收银机,我需要将代码直接发送到 COM 端口,这对我来说很好,如果这样可以省去帮助客户在系统上设置 OPOS 驱动程序的麻烦。

我是不是走错了路?

【问题讨论】:

  • 我每天都使用很多 POS 系统!
  • 最近 5 年发布的打印机没有 Windows 驱动程序?

标签: .net printing point-of-sale


【解决方案1】:

这可能与您正在寻找的答案略有不同(!)...

在使用“外部接口”(例如打印机、现金提取等)时,总是要抽象一些东西。您可能想要实施策略 - Pattern Strategy

你为抽奖制作了一个界面

public interface ICashDrawer
{
    void Open();
}

提供的实现:

  • 一个策略是一个类,使用 COM 打开抽奖
  • 另一个是简单的类,比如调用 Debug.WriteLine 的类,因此您在开发过程中不需要将现金提取连接到您的 PC

例如

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 编写实现。随着时间的推移,您最终可能会通过多种方式与不同的外部设备进行交互。客户可能有一天会获得新的现金提款等。

这清楚吗,如果你愿意,我可以充实我的意思,但你可能明白我的意思。

您的应用在启动时设置了各自的实现,您可能还想看看Dependency injection,如果您使用container 来解析类型,您会发现事情更容易。

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

PK :-)

【讨论】:

    【解决方案2】:

    我从未以编程方式处理过您的问题,但我确实有一些可能对您有所帮助的 POS 系统的经验。

    您为打印和收银机所做的工作在很大程度上取决于您使用的硬件。并且有各种各样的硬件。

    在我见过的每个 POS 系统中,每个可能的收据打印机和钱箱都有大量驱动程序,因此除非您正在开发一个成熟的系统,否则只需专注于您将要成为的特定硬件一起工作。即使这样,也要尝试很好地分解您的代码,以便最大限度地利用策略模式的好处。如果您正在使用不止一种类型的设备,您稍后会感谢自己以这种方式实现它。


    对于打印,您可能会遇到 3 种基本类型的打印机:

    1. 只能打印文本的收据打印机(过时,但仍然存在)
    2. 可以打印图形的收据打印机
    3. 标准打印机打印 8.5" x 11" 整页发票/贷项通知单(简单,'nuff 说)

    我相信大多数(如果不是全部)现代收据打印机都属于第 2 类,但您可能会使用第 1 类的打印机遇到旧系统。

    对于第 2 类,您应该能够使用标准的 .NET 打印界面。唯一的问题可能是在适当的时间发送控制代码以激活切割机构(如果配备);或者,打印机驱动程序可以根据打印算法中指定的纸张长度自动执行此操作。再说一次,我从来没有试过这个,但如果你可以使用收据打印机,你应该能很快弄清楚这些东西。

    如果您正在与一个拥有第 1 类打印机的客户打交道,您可以提出一个很好的论点,即购买第 2 类新打印机的成本会低于支付给您的费用开发一个死路驱动程序以在他们现有的硬件上打印。


    对于现金抽屉,我对打印机的熟悉程度不如打印机,但就通信和硬件布置而言,我知道两种选择:

    1. 通过 LPT 端口通过打印机连接。 (电缆链:电脑 --> 打印机 --> 钱箱)
    2. 通过 COM/LPT 端口或现代端口中的 USB 直接连接到计算机。

    第一种操作通过向打印机端口发送控制代码(打印机希望忽略并且不会吐出一整卷收据纸)来操作,而第二种则需要进行 COM 端口通信。在任何一种情况下,控制代码都是依赖于硬件的。大部分时间都可以在用户手册中找到,但有时技术编写者那天心情特别糟糕,你得去网上挖掘。

    【讨论】:

    • 有些商户也会使用单据打印机来完成一些任务。单据打印机通常是具有附加单据打印站的收据打印机。 POS 请求插入单据,查找已插入单据的指示,打印要打印的内容,然后释放单据。
    【解决方案3】:

    快速浏览一下,MS 销售点系统是基于 Window Embedded 的,这实际上只是一种获得更低单位成本和更小的 Windows 操作系统许可证的方法。似乎有一些特定于 POS 的 API,但您似乎想推出自己的 API,您可能仍然希望以某种方式使用 Windows Embedded。安全可能是工作 1。

    【讨论】:

      【解决方案4】:

      要直接控制收据打印机,请阅读ESC/POS commands。这些命令将允许您打开钱箱并在收据上打印条形码和图像。

      但是,当您使用 C# 时,使用 Microsoft Point of Service class library 可能更容易。

      【讨论】:

        猜你喜欢
        • 2011-04-23
        • 2014-01-25
        • 1970-01-01
        • 2010-09-22
        • 2012-05-19
        • 2012-04-28
        • 2012-06-09
        • 1970-01-01
        • 2014-05-31
        相关资源
        最近更新 更多