You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
7.4 KiB
C#

9 months ago
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,COM2COM3...</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
}
}