|
|
|
|
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<GuestShowItem>(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()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 构造函数
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="_spPortName">端口名称(COM1,COM2,COM3...)</param>
|
|
|
|
|
/// <param name="_spBaudRate">通信波特率(2400,9600....)</param>
|
|
|
|
|
/// <param name="_spStopBits">停止位</param>
|
|
|
|
|
/// <param name="_spDataBits">数据位</param>
|
|
|
|
|
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 公共方法
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 数据信息展现
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="data">发送的数据(清屏可以为null或者空)</param>
|
|
|
|
|
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<byte> bytList = new List<byte>();
|
|
|
|
|
foreach (var s in array)
|
|
|
|
|
{
|
|
|
|
|
if(s != null && !string.IsNullOrEmpty(s.Trim()))
|
|
|
|
|
{
|
|
|
|
|
bytList.Add(Convert.ToByte(s.Trim()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Encoding.UTF8.GetString(bytList.ToArray());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 客显类型
|
|
|
|
|
/// </summary>
|
|
|
|
|
public enum CustomerDisplayType
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 清屏
|
|
|
|
|
/// </summary>
|
|
|
|
|
Clear,
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 单价
|
|
|
|
|
/// </summary>
|
|
|
|
|
Price,
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 总计
|
|
|
|
|
/// </summary>
|
|
|
|
|
Total,
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 收款
|
|
|
|
|
/// </summary>
|
|
|
|
|
Recive,
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 找零
|
|
|
|
|
/// </summary>
|
|
|
|
|
Change
|
|
|
|
|
}
|
|
|
|
|
}
|