using POSV.Bean; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POSV.Utils { public class GuestShowUtils { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static GuestShowUtils _instance; private static bool enableKx = false; private static GuestShowItem param; public static GuestShowUtils Instance { get { if(_instance == null) { RefreshInstance(); } if (!enableKx) { enableKx = false; _instance = new GuestShowUtils(); } return _instance; } } public static void RefreshInstance() { try { enableKx = false; _instance = null; var enable = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_GUESTSHOW_ENABLE); if (enable) { var kxName = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_GUESTSHOW_ENABLE); if (!string.IsNullOrEmpty(kxName) && kxName != "None") { var showStr = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_GUESTSHOW_PARAMETER); if (!string.IsNullOrEmpty(showStr)) { param = JsonUtils.Deserialize(showStr); if(param != null) { _instance = new GuestShowUtils(param.Port, param.Parameter.Baud, param.Parameter.StopNum.ToString(), param.Parameter.DataNum); enableKx = true; } } } } logger.Info(enableKx ? "启用客显" : "不启用客显"); } catch(Exception ex) { logger.Error(ex, "初始化客显异常"); } } #region 成员变量 public string spPortName; private int spBaudRate; private StopBits spStopBits; private int spDataBits; #endregion --成员变量 #region 构造函数 public GuestShowUtils() { } /// /// 构造函数 /// /// 端口名称(COM1,COM2,COM3...) /// 通信波特率(2400,9600....) /// 停止位 /// 数据位 public GuestShowUtils(string _spPortName, int _spBaudRate, string _spStopBits, int _spDataBits) { this.spBaudRate = _spBaudRate; this.spDataBits = _spDataBits; this.spPortName = _spPortName; this.spStopBits = (StopBits)(Enum.Parse(typeof(StopBits), _spStopBits)); } #endregion --构造函数 #region Method #region 公共方法 /// /// 数据信息展现 /// /// 发送的数据(清屏可以为null或者空) public void DisplayData(CustomerDisplayType displayType, string data) { Task.Factory.StartNew(() => { logger.Info("客显内容:{0}", data); if (!enableKx) return; SerialPort serialPort = new SerialPort(); try { serialPort.PortName = spPortName; serialPort.BaudRate = spBaudRate; serialPort.StopBits = spStopBits; serialPort.DataBits = spDataBits; serialPort.Open(); //先清屏 serialPort.WriteLine(((char)12).ToString()); //指示灯 (char)27=ESC (char)115=s var lightCmd = string.Empty; switch (displayType) { case CustomerDisplayType.Clear: lightCmd = param.Parameter.OffLightCmd; break; case CustomerDisplayType.Price: lightCmd = param.Parameter.PriceLightCmd; break; case CustomerDisplayType.Recive: lightCmd = param.Parameter.PaidLightCmd; break; case CustomerDisplayType.Total: lightCmd = param.Parameter.TotalLightCmd; break; case CustomerDisplayType.Change: lightCmd = param.Parameter.ChangeLightCmd; break; } serialPort.WriteLine(ParseEscPosCommand(lightCmd)); //发送数据 if (!string.IsNullOrEmpty(data)) { // (char)81=Q (char)65=A (char)13=CR if (!string.IsNullOrEmpty(param.Parameter.R1DisplayCmd)) { var dataSp = param.Parameter.R1DisplayCmd.Split('d'); if (dataSp.Count() == 2) { //送显指令 + 数据 + 指令 var dataStr = ParseEscPosCommand(dataSp[0]) + data + ParseEscPosCommand(dataSp[1]); serialPort.Write(dataStr); } } } serialPort.Close(); } catch (Exception ex) { logger.Error(ex, "客显显示异常"); } finally { if (serialPort != null) { serialPort.Close(); } } }); } #endregion --公共方法 #endregion --Method private string ParseEscPosCommand(string command) { if (string.IsNullOrEmpty(command)) return string.Empty; string[] array = command.Split(','); List bytList = new List(); foreach (var s in array) { if(s != null && !string.IsNullOrEmpty(s.Trim())) { bytList.Add(Convert.ToByte(s.Trim())); } } return Encoding.UTF8.GetString(bytList.ToArray()); } } /// /// 客显类型 /// public enum CustomerDisplayType { /// /// 清屏 /// Clear, /// /// 单价 /// Price, /// /// 总计 /// Total, /// /// 收款 /// Recive, /// /// 找零 /// Change } }