using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Curtain.Core; using Curtain.DataAccess; using Curtain.Framework.Json; using Curtain.Helpers; using Curtain.Log; using Curtain.Net.Sockets.PLC; using Curtain.Net.Sockets.PLC.Model; using Curtain.Net.Sockets.PLC.Model.Melsec; using Curtain.Net.Sockets.PLC.Model.Siemens; namespace PLC_S.ServerModel { /// /// 返回产品型号等信息 /// public class GoodsCode : SocketServer, IShowFormLog, IWindowsServer { public Dictionary PLC_FLAGS = new Dictionary(); public const string M_NAME = "GC"; private readonly Logger logger = Logger.CreateLogger(M_NAME); private readonly LogInfo logger_t = new LogInfo(); private readonly LogInfo logger_e = new LogInfo(); public GoodsCode() { logger.FileExistDays = 30; logger.FilePrefix = ""; logger.FileSuffix = M_NAME; logger.LevelOneFile = true; logger.FileNameWithoutDate = true; logger_t.SubFolderFormat = ""; logger_t.FileExistDays = 30; logger_t.LevelOneFile = true; logger_e.FileExistDays = 0; this.Model.FormatType = CommandFormatType.StartStopChar; this.ServerStarting += ServerSocket_ServerStarting; this.ServerStarted += ServerSocket_ServerStarted; this.ServerStoping += ServerSocket_ServerStoping; this.ServerStoped += ServerSocket_ServerStoped; this.ServerMessage += ServerSocket_ServerMessage; this.Received += ServerSocket_Received; } #region Server public IFormLogShow FormLogShow { get; set; } private void ServerSocket_ServerStarting(object sender, CancelEventArgs e) { try { logger.OutputTrace($"{M_NAME}_ServerStarting"); } catch { } } private void ServerSocket_ServerStarted(object sender, EventArgs e) { try { logger.OutputTrace($"{M_NAME}_ServerStarted"); } catch { } } private void ServerSocket_ServerStoping(object sender, CancelEventArgs e) { try { logger.OutputTrace($"{M_NAME}_ServerStoping"); } catch { } } private void ServerSocket_ServerStoped(object sender, EventArgs e) { try { logger.OutputTrace($"{M_NAME}_ServerStoped"); } catch { } } private void ServerSocket_ServerMessage(object sender, ServerMessageEventArgs e) { try { string message = e.ToString(); string cip = e?.Client?.IP; if (e.Type == ServerMessageType.Debug) { Logger.Debug(message, $"{M_NAME}-T[{cip}]", logger_t); } if (e.Type == ServerMessageType.Error) { Logger.Error(e.Exception, message, $"{M_NAME}-E[{cip}]", logger_e); } if (e.Type == ServerMessageType.Trace) { Logger.Trace(message, $"{M_NAME}-T[{cip}]", logger_t); } if (e.Type == ServerMessageType.Warning) { Logger.Warn(message, $"{M_NAME}-E[{cip}]", logger_e); } FormLogShow?.ShowLog("ServerMessage=" + message); } catch { } } #endregion /// /// 返回产品型号 /// /// /// private void ServerSocket_Received(object sender, ReceiveSession e) { PLC_S_GC plc_s = null; string cIP = e?.Client?.IP; string logKeyT = $"{M_NAME}-T[{cIP}]"; string logKeyE = $"{M_NAME}-E[{cIP}]"; try { string outputMessage = e.ToString(); Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(e.Content)) { outputMessage = "接收数据为空"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } outputMessage = e.Content; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); string[] c = e.Content.Split('#'); string flag = null; if (c.Length > 0) { flag = c[0]; } string barcode = null; if (c.Length > 1) { barcode = c[1]; } if (string.IsNullOrWhiteSpace(flag)) { outputMessage = $"[{e.Content}]接收设备代码为空"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } plc_s = GetPLC_S_GC(flag, e, logKeyE); if (plc_s == null) { outputMessage = $"[{e.Content}]设备代码[{flag}]未找到ini配置或有错误"; Logger.Error(null, outputMessage, logKeyT, logger_t); Logger.Error(null, outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } outputMessage = $"[{e.Content}]{JsonHelper.FromObject(plc_s)}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(barcode) || barcode == "0") { outputMessage = $"[{e.Content}]接收条码为空"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyE); return; } DataRow codeRow = GetGoodsCode(barcode, e, logKeyE); if (codeRow == null) { outputMessage = $"[{e.Content}]此条码[{barcode}]不存在"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyE); return; } string code = codeRow["goodscode"].ToString(); string intcode = codeRow["seatcovercode"].ToString(); outputMessage = $"[{e.Content}]产品型号={code}[{intcode}]"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(intcode)) { outputMessage = $"[{e.Content}]此条码[{barcode}]未设置型号代码"; Logger.Error(null, outputMessage, logKeyT, logger_t); Logger.Error(null, outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyE); return; } //using (SocketClient plc = new SocketClient()) //{ // plc.Connect(plc_s.IP, plc_s.Port); // plc.Write(plc_s.Add_Code, plc_s.Add_CodeNum, intcode.ToInt32()); // plc.Write(plc_s.Add_BarCode, plc_s.Add_BarCodeNum, barcode); //} } catch (Exception ex) { FormLogShow?.ShowLog($"[{e.Content}]ERROR={ex.Message}"); if (plc_s != null) { Logger.Error(ex, $"ERROR[{e.Content}]", logKeyE, logger_e); SendError(plc_s, e, logKeyE); } else { Logger.Error(ex, $"ERROR-NOFLAG[{e.Content}]", logKeyE, logger_e); } } finally { e.ReturnMessage("0000"); } } private void SendError(PLC_S_GC plc_s, ReceiveSession e, string loggerName) { try { //using (SocketClient plc = new SocketClient()) //{ // plc.Connect(plc_s.IP, plc_s.Port); // plc.Write(plc_s.Add_Error, plc_s.Add_ErrorNum, 1); //} } catch (Exception ex) { //Logger.Error(ex, $"ERROR[{e.Content}]", $"{M_NAME}-E[{e?.Client?.IP}]", logger_e); Logger.Error(ex, $"ERROR[{e.Content}]", loggerName, logger_e); FormLogShow?.ShowLog("SendError=" + ex.Message); } } private DataRow GetGoodsCode(string barcode, ReceiveSession e, string loggerName) { IDataAccess dataAccess = null; try { dataAccess = PLC_S_DataAccess.GetDataAccess(e); string sqlString = "select g.goodscode, g.seatcovercode\n" + " from tp_pm_groutingdailydetail gdd\n" + " inner join tp_mst_goods g\n" + " on g.goodsid = gdd.goodsid\n" + " where gdd.barcode = :barcode"; DataTable dataTable = dataAccess.ExecuteDatatable(sqlString, new CDAParameter(":barcode", barcode)); if (dataTable.HasData()) { return dataTable.Rows[0]; } return null; } catch (Exception ex) { //Logger.Error(ex, $"ERROR[{e.Content}]", $"{M_NAME}-E[{e?.Client?.IP}]", logger_e); Logger.Error(ex, $"ERROR[{e.Content}]", loggerName, logger_e); FormLogShow?.ShowLog("GetGoodsCode=" + ex.Message); return null; } finally { dataAccess?.Close(); } } private PLC_S_GC GetPLC_S_GC(string flag, ReceiveSession e, string loggerName) { try { flag = "GC" + flag; if (PLC_FLAGS.ContainsKey(flag)) { return PLC_FLAGS[flag]; } else { PLC_S_GC plc_s = new PLC_S_GC(); INIHelper ini = INIHelper.IniFile($@"PLC_S_INI\PLC_S_{M_NAME}.ini"); plc_s.IP = ini.Read(flag, "IP"); plc_s.Port = ini.Read(flag, "Port").ToInt32(); plc_s.Add_Code = ini.Read(flag, "Add_Code"); plc_s.Add_CodeNum = ini.Read(flag, "Add_CodeNum"); plc_s.Add_BarCode = ini.Read(flag, "Add_BarCode"); plc_s.Add_BarCodeNum = ini.Read(flag, "Add_BarCodeNum"); plc_s.Add_Error = ini.Read(flag, "Add_Error"); plc_s.Add_ErrorNum = ini.Read(flag, "Add_ErrorNum"); PLC_FLAGS.Add(flag, plc_s); return plc_s; } } catch (Exception ex) { //Logger.Error(ex, $"ERROR[{e.Content}]", $"{M_NAME}-E[{e?.Client?.IP}]", logger_e); Logger.Error(ex, $"ERROR[{e.Content}]", loggerName, logger_e); FormLogShow?.ShowLog("GetPLC_S_GC=" + ex.Message); return null; } } } }