编写POS系统的最佳实践

时间:2010-03-15 16:35:04

标签: .net printing point-of-sale

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

我一直在使用随附的Windows驱动程序打印到我的三星打印机,它看起来效果很好。我认为虽然其他打印机可​​能没有Windows驱动程序,然后我会卡住?或者我可以简单地使用通用/文本驱动程序打印到支持它的任何打印机?

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

我在这里走错路吗?

4 个答案:

答案 0 :(得分:6)

这可能与你要找的东西(!)......

略有不同

使用“外部接口”(例如打印机,现金抽奖等)时,总是抽象事物。您可能想要实施策略 - Pattern Strategy

您为现金抽奖制作界面

public interface ICashDrawer
{
    void Open();
}

提供实施:

  • 一个策略是使用COM打开绘图的类
  • 另一个就像进行Debug.WriteLine调用的类一样简单,因此您在开发过程中不需要连接到PC的现金抽奖

e.g。

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

然后你做一个或多个实现。

  • 基本打印机
  • 专业标签打印机
  • 基于文本的文件保存到文件...

e.g。

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: - )

答案 1 :(得分:1)

我从来没有以编程方式处理你所问的问题,但我确实有一些POS系统的经验可以帮助你。

您为打印和现金抽屉所做的工作高度依赖于您正在使用的硬件。并且有一个种类的硬件。

在我看过的每个POS系统中,每个可以想象的收据打印机和现金抽屉都有很多驱动程序,因此,除非您正在开发一个完整的系统,否则只需专注于您将要成为的特定硬件。与...合作。即使这样,也要尽量使代码得到充分考虑,以便最大限度地发挥策略模式的优势。如果你正在使用多种类型的设备,那么以后你会感谢你以这种方式实现它。


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

  1. 只能打印文本的收据打印机(陈旧但仍然存在)
  2. 可以打印图形的收据打印机
  3. 标准打印机打印8.5“x 11”整页发票/贷项通知单(简单,'nuff说)
  4. 我相信大部分(如果不是全部)现代收据打印机属于第2类,但您可能会使用#1类型的打印机进入旧系统。

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

    如果您正在与一个拥有#1类别打印机的客户打交道,那么您可以提出一个好的论据,即购买第2类新打印机的成本会低于向您付款的费用。开发一个在现有硬件上打印的无端驱动程序。


    对于现金抽屉,我不太熟悉打印机,但我知道有两种选择,就通信和硬件安排而言:

    1. 通过LPT端口连接到打印机。 (电缆链:电脑 - &gt;打印机 - &gt;现金抽屉)
    2. 直接连接到计算机,可以是COM / LPT端口,也可能是现代USB端口。
    3. 第一种操作方法是将控制代码发送到打印机端口(打印机希望忽略它并且不会吐出整卷收据纸),而第二种则需要进行COM端口通信。在任何一种情况下,控制代码都是硬件相关的。大部分时间都是在用户手册中找到的,但有时技术作者当天感觉特别邪恶,你必须在网上挖掘。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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