C# 收银机顾显(客显)及打印小票(58热敏打印机)

最近做winform收银机,设计顾显及打印小票总结。

1、顾显(串口COM1)

只涉及到总计,所以只是简单的功能。

public static ClientDisplayResult Display(decimal total, bool isClear=false)
        {
            var result = new ClientDisplayResult();
            string[] ports = SerialPort.GetPortNames();
            if (ports.Length == 0)
            {
                result.Result = false;
                result.Message = "未检测到串行通信接口";
                Logger.Error(result.Message);
                return result;
            }

            SerialPort serialPort = new SerialPort();
            try
            {
                // 串行端口 Windows:COM1
                serialPort.PortName = "COM1";
                //串口波特率 默认:2400
                serialPort.BaudRate = 2400;
                //停止位 默认
                serialPort.StopBits = StopBits.One;
                //数据位 默认
                serialPort.DataBits = 8;

                if (!serialPort.IsOpen)
                {
                    serialPort.Open();
                }
                //清空接收缓冲区数据
                serialPort.DiscardInBuffer();

                if (isClear)
                {
                    //清屏\f
                    serialPort.WriteLine(((char)12).ToString());
                }
                else
                {
                    //状态,合计提示灯亮(ESCs2)
                    var text = ((char)27).ToString() + ((char)115).ToString() + ((char)50).ToString();
                    serialPort.Write(text);
                    //显示收款金额(EscQA金额CR)
                    text = ((char)27).ToString() + ((char)81).ToString() + ((char)65).ToString() + total.ToString() + ((char)13).ToString();
                    serialPort.Write(text);
                }
                result.Result = true;
                return result;
            }
            catch (Exception ex)
            {
                Logger.Error("顾显异常",ex);
                result.Result = false;
                result.Message = ex.Message;
                return result;
            }
            finally
            {
                serialPort.Close();
                serialPort.Dispose();
            }
        }

2、打印小票(并口打印)及打开钱箱(OpenDrawer方法)

通过Windows API接口

public class LPTControl
    {
        #region API函数

        [StructLayout(LayoutKind.Sequential)]
        private struct OVERLAPPED
        {
            int Internal;
            int InternalHigh;
            int Offset;
            int OffSetHigh;
            int hEvent;
        }
        [DllImport("kernel32.dll")]
        private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

        [DllImport("kernel32.dll")]
        private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, out int lpNumberOfBytesWritten, out OVERLAPPED lpOverlapped);

        [DllImport("kernel32.dll")]
        private static extern bool CloseHandle(int hObject);

        #endregion

        public enum PrintPosition { Left, Center, Right }

        private int iHandle;

        private const int ColWidth = 32;

        private bool Write(string data)
        {
            if (iHandle != -1)
            {
                int i;
                OVERLAPPED x;
                byte[] byteData = System.Text.Encoding.Default.GetBytes(data);
                return WriteFile(iHandle, byteData, byteData.Length, out i, out x);
            }
            else
            {
                return false;
            }
        }
        private bool Write(byte[] data)
        {
            if (iHandle != -1 && data.Length > 0)
            {
                int i;
                OVERLAPPED x;
                return WriteFile(iHandle, data, data.Length, out i, out x);
            }
            else
            {
                return false;
            }
        }

        public bool OpenPort()
        {
            iHandle = CreateFile("LPT1", 0x40000000, 0, 0, 3, 0, 0);
            if (iHandle != -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public bool Close()
        {
            return CloseHandle(iHandle);
        }

        public bool WriteLine(string data, PrintPosition position = PrintPosition.Left)
        {
            int length = Encoding.Default.GetBytes(data).Length;

            if (length < ColWidth)
            {
                if (position == PrintPosition.Right)
                {
                    data = data.PadLeft(ColWidth - (length - data.Length), ‘ ‘);
                }
                else if (position == PrintPosition.Center)
                {
                    data = data.PadLeft(length + (ColWidth - length) / 2 - (length - data.Length), ‘ ‘);
                }
            }

            bool result = Write(data);
            if (result)
            {
                result = NewRow();
            }
            return result;
        }
        private bool NewRow()
        {
            bool result = false;
            var byteData = new byte[] { 27, 10, 13 };
            return result = Write(byteData);
        }

        public bool PrintEmptyRow(int rowCount = 1)
        {
            bool result = false;
            string data = string.Empty.PadLeft(ColWidth, ‘ ‘);

            for (int i = 0; i < rowCount; i++)
            {
                result = WriteLine(data);
                if (!result) break;
            }
            return result;
        }

        public bool PrintLine(bool isDoubleLine = false)
        {
            if (isDoubleLine)
            {
                return WriteLine("================================");
            }
            else
            {
                return WriteLine("--------------------------------");
            }
        }

        public bool OpenDrawer()
        {
            bool result = Write(((char)27).ToString() + "p" + ((char)0).ToString() + ((char)60).ToString() + ((char)255).ToString());
            return result;
        }

    }

调用:

public static void Print(OrderInfo orderInfo)
        {
            try
            {
                if (orderInfo != null)
                {
                    var orderDetailList = GetOrderDetail(orderInfo.OrderId);
                    if (orderDetailList.IsNullOrEmpty())
                    {
                        Logger.Error("订单详情获取异常:OrderId" + orderInfo.OrderId);
                        return;
                    }
                    LPTControl control = new LPTControl();
                    var result = control.OpenPort();
                    if (!result)
                    {
                        Logger.Error("LPT1端口打开失败");
                        return;
                    }
                    control.WriteLine(orderInfo.SupermarketName, LPTControl.PrintPosition.Center);
                    control.PrintEmptyRow();
                    control.WriteLine($"订单号:{orderInfo.OrderId}");
                    control.WriteLine($"时间:{orderInfo.PayTime}");
                    control.WriteLine($"收银员:{orderInfo.AccountName}");
                    control.PrintLine(true);
                    int i = 1;
                    foreach (var item in orderDetailList)
                    {
                        control.WriteLine($"{i}、{item.GoodsName}");

                        var price = (decimal)item.Price;
                        var num = $"{item.GoodsCount}*{price.ToString("#0.00")}".PadLeft(13, ‘ ‘);
                        var total = (price * item.GoodsCount).ToString("#0.00").PadLeft(10, ‘ ‘);

                        var text = $"   {item.SKUID}{num}{total}";
                        control.WriteLine(text);
                        i++;
                    }
                    control.PrintLine();
                    if (orderInfo.OrderType == OrderType.Dispatching)
                    {
                        control.WriteLine($"配送费:{orderInfo.DeliveryAmount.ToString("#0.00")}元");
                    }

                    if (orderInfo.UsedScoreAmount > 0)
                    {
                        control.WriteLine($"积分抵扣:{ orderInfo.UsedScoreAmount}元");
                    }
                    var payType = orderInfo.PayWay.GetDescription();
                    if (orderInfo.OrderBusinessType == OrderBuyType.ToShop)
                    {
                        payType = OrderPayWay.CashPay.GetDescription();
                    }
                    control.WriteLine($"支付方式:{payType}");
                    control.WriteLine($"合计:{orderInfo.Total.ToString("#0.00")}元");
                    control.WriteLine($"应付:{ orderInfo.PayedAmount.ToString("#0.00")}元");
                    if (orderInfo.UserTotal > 0)
                    {
                        control.WriteLine($"赠送积分:{ orderInfo.UserTotal}");
                    }
                    if (orderInfo.OrderType == OrderType.Dispatching)
                    {
                        control.PrintLine(true);
                        control.WriteLine($"联系人:{orderInfo.TrueName}");
                        control.WriteLine($"手机号:{ orderInfo.DisplayMobile}");
                        control.WriteLine($"地址:{orderInfo.Address}");
                        control.WriteLine($"配送时间:{orderInfo.ExpectDispatchTimeText}");
                    }
                    control.PrintLine();
                    control.WriteLine("谢谢惠顾,欢迎下次光临!");
                    control.PrintEmptyRow(5);
                    control.OpenDrawer();
                    control.Close();
                    System.Threading.Thread.Sleep(500);
                }
                else
                {
                    Logger.Error("订单异常");
                }
            }
            catch (Exception ex)
            {
                Logger.Error("打印小票异常", ex);
            }
        }

原文地址:https://www.cnblogs.com/flywing/p/8426690.html

时间: 2024-11-11 07:40:47

C# 收银机顾显(客显)及打印小票(58热敏打印机)的相关文章

iOS Bluetooth 打印小票(二)

在上一篇中介绍了打印小票所需要的命令,这一篇介绍Bluetooth连接蓝牙和打印小票的全过程. CoreBluetooth的封装 因为CoreBluetooth中的代理太多,而每一次操作又比较依赖上一次操作的结果,方法又比较零散,所以我做了粗略封装,把代理改成了block方式回调. 1.获取蓝牙管理单例 HLBLEManager *manager = [HLBLEManager sharedInstance]; __weak HLBLEManager *weakManager = manager

winform 打印小票

后台代码 1 panPrintContent.Visible = true; 2 var strlPrinterMode = ""; 3 4 this.pageSetupDialog1.PageSettings.Margins.Left = 1; 5 this.pageSetupDialog1.PageSettings.Margins.Top = 1; 6 this.pageSetupDialog1.PageSettings.Margins.Right = 21; 7 this.pag

打印小票

准备: 1.Lodop6.203_CLodop 2.pdffactory pro 3.谷歌浏览器 <script> $(document).ready(function(){ $("#print").click(function(){ var value=<?=$_GET['id']?>; /* $.ajax({ url:'__PUBLIC__/getid.php', type:'get', dataType:'json', data:{value:value}

模拟打印小票(支持暂停功能)

public class MainFrame extends JFrame { private JButton printButton = new JButton("打印"); private JButton suspendButton = new JButton("暂停"); private JLabel printText = new JLabel("模拟小票打印"); private JTextArea printTextArea = ne

“小票打印”功能来了!酷客多带你玩转小程序

酷客多(http://www.kukeduo.cn)最近给小程序推出了一个新功能,小票打印功能,可以说这是众多运营者期待已久的功能,这次终于等到了.对于餐饮业运营者来说,这次新功能的推出更加给予了他们极大的便利.现在马上带你感受感受这次酷客多推出的重磅功能! 一.打印准备 1. 打开包装 2. 装入打印纸 移除 二.打印本机信息(用于商家后台配置) 1. 接通打印机电源 2. 长按左键开启打印机 移除 3. 初次开机会自动打印提示 4. 按右键进入菜单 移除 5. 按右键,打印本机信息 移除 三

关于显卡的显存

显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据.如同计算机的内存一样,显存是用来存储要处理的图形信息的部件. 作用 显存 如同计算机的内存一样,显存是用来存储要处理的图形信息的部件.我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点都以4至32甚至64位的数据来控制它的亮度和色彩,这些数据必须通过显存来保存,再交由显示芯片和CPU调配,最后把运算结果转化为图形输出到显示器上.显存和主板内存一样,执行存贮的功能,但它存贮的对像是显卡输出到显示器上的每个像素

酷客多小程序新版发布:与微信卡券、小票打印等无缝对接

酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!重要的事情说3遍!这一次我们对原有版本做了全方位体验优化,从UI UE等方面对商家后台进行了体验式改善,使商家后台变得更加美观和易用.除此之外,还推出了"微信优惠券"和"小票打印"两个重要功能 ,已实现与微信卡券和小票打印机无缝对接,更便于品牌传播.具体的功能说明请见下文. 一.左侧导航菜单优化 1,调整了左侧栏目的显示顺序,显示顺序改为"店铺管理"-"

Django bootstrap-select 多选框显示以及回显

初始化 function showUserList(param) { $.ajax({ url: "user/detail/0/", type: 'get', success: function (data) { $('#' + param).empty(); for (var i = 0; i < data.length; i++) { op = "<option value=" + data[i].id + ">" + da

58安居客 真能逆袭房地产市场吗?

还没好好享受MWC大会上最新科技产品带来的震撼,就这么duang的一下,安居客拜倒在58同城的"支票大棒"下,成为互联网房地产行业新年的一场大地震.既然地震已经发生,趁余波尚未散尽的情况下,不妨看看它们二者在一系列资本运作,最终携手之后,究竟会遇到怎样的现实挑战和问题. 1+1与2之间扑朔迷离 安居客或缓慢消融 每次收购交易的发生,最常见的官方宣传语就是相信二者的融合能发挥出1+1>2的能量.话说多了,似乎连自己都骗到了.可是看看之前在国内发生的收购.并购案例,几乎鲜有成功的--