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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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