using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Runtime.Serialization; using System.Collections.Concurrent; using System.ServiceModel; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net; using NLog; using NLog.Config; using NLog.Targets; using GZ.DB.Map.OIDATABASE; using GZ.DB.App.OIDATABASE; using GZ.DB.Repository.OIDATABASE; using GZ.DB.IRepository.OIDATABASE; using GZ.DB.Entity.OIDATABASE; namespace GZ.Projects.AuxAllWCS { public class Settings { #region [自定义类][20250323144531864][Settings] public static bool FirstG { get; set; } = false; public static string HostToAgvServerUrl { get; set; } public static List deviceInfos { get; set; } = new List(); public static List RunProcs { get; set; } = new List(); public static string HKbaseUrl { get; set; } public static string MESbaseUrl { get; set; } public static string WMSbaseUrl { get; set; } public static readonly HttpHelper apiHelper = new HttpHelper(); public static string GetTimeStamp(DateTime? time = null) { TimeSpan ts = DateTime.UtcNow - (time ?? new DateTime(1970, 1, 1, 0, 0, 0, 0)); return Convert.ToInt64(ts.TotalMilliseconds).ToString(); } #endregion [自定义类][20250323144531864][Settings] } public class LogHelper { #region [自定义类][20250323145442478][LogHelper] public static Dictionary loggers = new Dictionary(); public static void Debug(string message, string name = "") { ILogger logger = null; if (loggers.Keys.Contains(name)) { logger = loggers[name]; } else { logger = LogFactory.CreateLogger(name); if (logger != null) { loggers.Add(name, logger); } else { logger = LogFactory.CreateLogger("console"); } } if (logger != null) { logger.Debug(message); } } public static void Info(string message, string name = "") { //logger.Info(message); ILogger logger = null; if (loggers.Keys.Contains(name)) { logger = loggers[name]; } else { logger = LogFactory.CreateLogger(name); if (logger != null) { loggers.Add(name, logger); } else { logger = LogFactory.CreateLogger("infoFile"); } } if (logger != null) { logger.Info(message); } } public static void Error(string message, Exception ex, string name = "") { //logger.Error(ex, message); ILogger logger = null; if (loggers.Keys.Contains(name)) { logger = loggers[name]; } else { logger = LogFactory.CreateLogger(name); if (logger != null && !loggers.Keys.Contains(name)) { loggers.Add(name, logger); } else { logger = LogFactory.CreateLogger("errorFile"); } } if (logger != null) { logger.Error($"{message}{ex.StackTrace}"); } } #endregion [自定义类][20250323145442478][LogHelper] } public class LogFactory { #region [自定义类][20250323145505759][LogFactory] /// /// 通过配置文件配置日志 /// static LogFactory() { var loggerNames = new List() { "HosttoagvTask", "HosttoagvCar", "NDC", "杭奥" }; LogManager.Configuration = DefaultConfig(loggerNames); } public static ILogger CreateLogger(string name) { var logger = LogManager.GetLogger(name); return logger; } public static LoggingConfiguration DefaultConfig(List loggerNames) { var config = new LoggingConfiguration(); loggerNames.ForEach(a => { var target = new FileTarget(); target.ArchiveAboveSize = 1024 * 1024 * 5;//每个文件最大5M target.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence; target.ArchiveFileName = @"${basedir}/Logs/" + a + "/{####}.txt"; target.FileName = @"${basedir}/Logs/" + a + "/${shortdate}.txt";//当前文件路径 target.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"; config.AddTarget(a, target); config.AddRuleForOneLevel(LogLevel.Info, target, a); }); // 添加target-console var consoleTarget = new ColoredConsoleTarget(); consoleTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"; config.AddTarget("console", consoleTarget); config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget); //添加target-info var infoFileTarget = new FileTarget(); infoFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//每个文件最大5M infoFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence; infoFileTarget.ArchiveFileName = @"${basedir}/Logs/Info/{####}.txt"; infoFileTarget.FileName = @"${basedir}/Logs/Info/${shortdate}.txt";//当前文件路径 infoFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"; config.AddTarget("infoFile", infoFileTarget); config.AddRuleForOneLevel(LogLevel.Info, infoFileTarget);//INFO写在Info文件 //添加target-err var errorFileTarget = new FileTarget(); errorFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//每个文件最大5M errorFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence; errorFileTarget.ArchiveFileName = @"${basedir}/Logs/Error/{####}.txt"; errorFileTarget.FileName = @"${basedir}/Logs/Error/${shortdate}.txt"; errorFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"; config.AddTarget("errorFile", errorFileTarget); config.AddRule(LogLevel.Error, LogLevel.Fatal, errorFileTarget); return config; } #endregion [自定义类][20250323145505759][LogFactory] } public class HaiKangOrderInfo { #region [自定义类][20250324165635320][HaiKangOrderInfo] /// /// 请求编号(编号唯一) /// public string reqCode { get; set; } /// /// 请求时间 /// public string reqTime { get; set; } /// /// 客户端编号(如PDA、HCWMS等) /// public string clientCode { get; set; } /// /// 令牌号 /// public string tokenCode { get; set; } /// /// 任务类型 /// public string taskTyp { get; set; } /// /// 容器类型(叉车项目必传) /// (叉车/CTU 专用) /// public string ctnrTyp { get; set; } /// /// 容器编号(叉车/CTU 专用) /// public string ctnrCode { get; set; } /// /// 任务模式(0-普通、1-出库、2-入库、3-移库 ) /// public string taskMode { get; set; } /// /// 工作位 /// public string wbCode { get; set; } /// /// 货架编号 /// public string podCode { get; set; } /// /// 方向(180:左、0:右、90:上、-90:下 ) /// public string podDir { get; set; } /// /// 货架类型 /// public string podTyp { get; set; } /// /// 物料批次或货架上的物料唯一编码 /// public string materialLot { get; set; } /// /// 优先级 /// public string priority { get; set; } /// /// 组编号 /// public string groupId { get; set; } /// /// 自定义字段.JSON 格式 /// public string data { get; set; } /// /// 取消类型 /// public string forceCancel { get; set; } /// /// 回库区域编码 /// public string matterArea { get; set; } /// /// 取消该AGV正在执行的任务单 /// public string agvCode { get; set; } /// /// 任务单编号 /// public string taskCode { get; set; } /// /// 地码 X 坐标 /// public string cooX { get; set; } /// /// 地码 Y 坐标 /// public string cooY { get; set; } /// /// 当前位置编号 /// public string currentPositionCode { get; set; } /// /// 地图编号 /// public string mapCode { get; set; } /// /// 地码编号 /// public string mapDataCode { get; set; } /// /// 仓位编号 /// public string stgBinCode { get; set; } /// /// 方法名 /// public string method { get; set; } /// /// AGV 编号 /// public string robotCode { get; set; } /// /// 容器类型 /// public string ctnrType { get; set; } /// /// 巷道编号 /// public string roadWayCode { get; set; } /// /// 巷道内顺序号 /// public string seq { get; set; } /// /// 设备编号 /// public string eqpCode { get; set; } /// /// 任务路径集合 /// public List positionCodePath { get; set; } #endregion [自定义类][20250324165635320][HaiKangOrderInfo] } public class positionCodePath { #region [自定义类][20250324165724429][positionCodePath] /// /// 任务编号 /// public string positionCode { get; set; } /// /// 类型 /// public string Type { get; set; } #endregion [自定义类][20250324165724429][positionCodePath] } public class HkReturnResult { #region [自定义类][20250324171912560][HkReturnResult] /// /// 返回状态码 /// public int code { get; set; } /// /// 返回说明 /// public string message { get; set; } /// /// 任务号 /// public string reqCode { get; set; } #endregion [自定义类][20250324171912560][HkReturnResult] } public class deviceInfo { #region [自定义类][20250325083629462][deviceInfo] public string address { get; set; } public string deviceName { get; set; } public string FuLeLineNo { get; set; } public string[] deviceNo { get; set; } /// /// 对应线体 -优先级 /// public string[] areaPriy { get; set; } public string[] location { get; set; } /// /// 1 维希尔机械臂 /// 2 捷瞬机械臂臂 /// 3 捷瞬输送线 /// public int deviceType { get; set; } public int enable { get; set; } /// /// 任务权重。 /// public int taskPri { get; set; } = 60; #endregion [自定义类][20250325083629462][deviceInfo] } public class HttpHelper { #region [自定义类][20250325095622918][HttpHelper] public string Post(string url, string postData, string contentType = "application/json", string sessionId = "") { LogHelper.Info(url + "+" + postData); WebRequest request = WebRequest.Create(url); request.Method = "POST"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = contentType; request.ContentLength = byteArray.Length; request.Timeout = 15000; if (sessionId != "") { request.Headers.Set("ASP.NET_SessionId", sessionId); } //Authorization: UApGP6WW9FsBUqAlzxRGOw == request.Headers.Set("Authorization", "UApGP6WW9FsBUqAlzxRGOw=="); StreamReader reader = null; Stream stream = null; WebResponse rsp = null; try { stream = request.GetRequestStream(); stream.Write(byteArray, 0, byteArray.Length); stream.Close(); rsp = request.GetResponse(); stream = rsp.GetResponseStream(); reader = new StreamReader(stream); string rrend = reader.ReadToEnd(); LogHelper.Info($"{url} response={rrend}"); return rrend; } catch (Exception ex) { LogHelper.Info($"{url} err={ex.Message}"); return ""; } finally { // 释放资源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } #endregion [自定义类][20250325095622918][HttpHelper] } public class HKResult { #region [自定义类][20250325095900399][HKResult] /// /// 返回编码 /// public string code { get; set; } /// /// 返回消息 /// public string message { get; set; } /// /// 请求编号 /// public string reqCode { get; set; } /// /// 自定义返回(返回任务单号) /// public string data { get; set; } #endregion [自定义类][20250325095900399][HKResult] } public class SYSHelper { #region [自定义类][20250325131633664][SYSHelper] private static object locker = new object(); internal static int GetSerialNumber(string snType, string prefix, string Vend = "0") { if (Vend == "1") Vend = DateTime.Now.ToString("yyMMdd"); int result = 0; lock (locker) { SYSRepository sysservice = new SYSRepository(); var sId = sysservice.FindEntity(a => a.CN_S_TYPE.Trim() == snType && a.CN_S_PRE.Trim() == prefix + Vend); if (sId != null) { sId.CN_N_MAX++; sId.CN_T_LAST = DateTime.Now; //sysservice.Update(sId); sysservice.dbcontext.Set().Attach(sId); sysservice.dbcontext.Entry(sId).Property(x => x.CN_N_MAX).CurrentValue = sId.CN_N_MAX; sysservice.dbcontext.Entry(sId).Property(x => x.CN_N_MAX).IsModified = true; sysservice.dbcontext.Entry(sId).Property(x => x.CN_T_LAST).CurrentValue = sId.CN_T_LAST; sysservice.dbcontext.Entry(sId).Property(x => x.CN_T_LAST).IsModified = true; sysservice.dbcontext.SaveChanges(); result = sId.CN_N_MAX; } else { sId = new SYSEntity { CN_S_TYPE = snType, CN_T_LAST = DateTime.Now, CN_S_PRE = prefix + Vend, CN_N_MAX = 0, CN_S_APP_TYPE = "WCS" }; sysservice.Insert(sId); } } return result; } #endregion [自定义类][20250325131633664][SYSHelper] } public class TaskProcess { #region [自定义类][20250325152141671][TaskProcess] internal static bool CreateTask(string no, string from, string to, string taskType, int pri, List cntrs, string workMode = "AGV", int cntrCount = 1, int startLayer = 1, int endLayer = 1) { LogHelper.Info($"创建任务 from:{from}>to {to}开始创建>"); var cntrInfo = string.Join(",", cntrs); ILocRepository locc = new LocRepository(); var fromLoc = locc.FindEntity(x => x.S_LOC_CODE == from); var endLoc = locc.FindEntity(x => x.S_LOC_CODE == to); var s = Settings.deviceInfos.Find(x => x.location.Contains(from)) != null; var e = Settings.deviceInfos.Find(x => x.location.Contains(to)) != null; string t = ""; if (workMode == "AGV") { t = "F01"; if (s && !e) t = "A002"; if (!s && e) t = "A003"; if (s && e) t = "A004"; } try { TaskEntity wmsTask = new TaskEntity() { S_ID = Guid.NewGuid().ToString(), S_STATE = "编辑", T_CREATE = DateTime.Now, T_MODIFY = DateTime.Now, S_TASK_NO = GenerateTaskNo(), S_START_LAREA = fromLoc.S_AREA_CODE, S_END_LAREA = endLoc.S_AREA_CODE, S_DEPART_NAME = "", S_START_LOC = from, S_END_LOC = to, S_TYPE = taskType, S_SRC_NO = no,// N_PRIORITY = pri, S_WORK_MODE = workMode, S_B_STATE = "未执行", S_CNTRS = cntrInfo, N_START_LAYER = startLayer, N_END_LAYER = endLayer, N_CNTR_COUNT = cntrCount, S_INDEX = t, }; ITaskRepository taskserice = new TaskRepository(); taskserice.Insert(wmsTask); if (workMode == "AGV") { fromLoc.S_LOCK_STATE = "出库锁"; endLoc.S_LOCK_STATE = "入库锁"; locc.Update(fromLoc); locc.Update(endLoc); } LogHelper.Info($"创建任务 from:{from}>to {to} 创建{wmsTask.S_TASK_NO}成功"); return true; } catch (Exception ex) { LogHelper.Error("CreateTask" + ex.Message, ex); return false; } } internal static void AddActionRecord(string no, string state, string forkliftNo, string extData, string strloc, string endloc) { var action = new TaskActEntity() { S_ID = Guid.NewGuid().ToString(), S_STATE = "编辑", T_CREATE = DateTime.Now, T_MODIFY = DateTime.Now, S_START_LOC = strloc, S_END_LOC = endloc, S_ACTION_CODE = state, S_TASK_NO = no, S_EQ_NO = forkliftNo, S_EQ_TYPE = "agv", S_DATA = extData, N_CREATEMETHOD = 0 }; TaskActRepository taskserice = new TaskActRepository(); taskserice.Insert(action); } public static System.String GenerateTaskNo() { var id = SYSHelper.GetSerialNumber("任务号", "TN", "1"); var date = DateTime.Now.ToString("yyMMdd"); return $"TN{date}{id.ToString().PadLeft(4, '0')}"; } #endregion [自定义类][20250325152141671][TaskProcess] } public class Utils { #region [自定义类][20250417094750211][Utils] #endregion [自定义类][20250417094750211][Utils] } public class ToWMSMES { #region [自定义类][20250531152402452][ToWMSMES] //2 wms mes public class CreateTask { public string taskType { get; set; } public string startBit { get; set; } public string endBit { get; set; } public string reqCode { get; set; } public string cntrCode { get; set; } public string materialCode { get; set; } internal static ReturnMsg CreatemesTask(CreateTask model) { ITaskRepository taskservice = new TaskRepository(); var task = taskservice.FindEntity(x => x.S_TASK_NO == model.reqCode); if (task == null) { //var i = TaskProcess.CreateTask("", model.startBit, model.endBit, string.IsNullOrEmpty(model.taskType) ? "Mes下发" : model.taskType, 5, new List { model.cntrCode }); TaskEntity wmsTask = new TaskEntity() { S_ID = Guid.NewGuid().ToString(), S_STATE = "编辑", T_CREATE = DateTime.Now, T_MODIFY = DateTime.Now, S_TASK_NO = model.reqCode, S_START_LAREA = "", S_END_LAREA = "", S_DEPART_NAME = "", S_START_LOC = model.startBit, S_END_LOC = model.endBit, S_TYPE = model.taskType, S_SRC_NO = "",// N_PRIORITY = -88, S_WORK_MODE = "agv", S_B_STATE = "MES", S_CNTRS = model.cntrCode, S_INDEX = model.materialCode,//mes任务中 S_INDEX是 物料编码。 agv任务中是 agv任务类型 N_START_LAYER = 1, N_END_LAYER = 1, N_CNTR_COUNT = 1 }; ITaskRepository taskserice = new TaskRepository(); var i = taskserice.Insert(wmsTask) > 0; return new ReturnMsg { resultCode = (i ? 0 : -1), resultMsg = i ? "" : "任务生成失败。" }; } else { return new ReturnMsg { resultCode = -1, resultMsg = "任务重复下发。" }; } } public class ReturnMsg { public int resultCode { get; set; } public string resultMsg { get; set; } } internal static ReturnMsg CreatePointTask(CreateTask model) { ITaskRepository taskservice = new TaskRepository(); var task = taskservice.FindEntity(x => x.S_TASK_NO == model.reqCode); if (task == null) { //var i = TaskProcess.CreateTask("", model.startBit, model.endBit, string.IsNullOrEmpty(model.taskType) ? "Mes下发" : model.taskType, 5, new List { model.cntrCode }); TaskEntity wmsTask = new TaskEntity() { S_ID = Guid.NewGuid().ToString(), S_STATE = "编辑", T_CREATE = DateTime.Now, T_MODIFY = DateTime.Now, S_TASK_NO = model.reqCode, S_START_LAREA = "", S_END_LAREA = "", S_DEPART_NAME = "", S_START_LOC = model.startBit, S_END_LOC = model.endBit, S_TYPE = model.reqCode, S_SRC_NO = "",// N_PRIORITY = -88, S_WORK_MODE = "agv", S_B_STATE = "People", S_CNTRS = model.cntrCode, N_START_LAYER = 1, N_END_LAYER = 1, N_CNTR_COUNT = 1 }; ITaskRepository taskserice = new TaskRepository(); var i = taskserice.Insert(wmsTask) > 0; return new ReturnMsg { resultCode = (i ? 0 : -1), resultMsg = i ? "" : "任务生成失败。" }; } else { return new ReturnMsg { resultCode = -1, resultMsg = "任务重复下发。" }; } } } public static void ResMesTask(Tag tag) { ///1. AutoThread.InvokeMethod(AutoThread.Instance, "ResolveMesTask", new object[] { tag }); //var VERX = Settings.deviceInfos?.FindAll(x => x.deviceName.Contains("捷瞬抓臂")); //if () ///2 看缓存区。 没满的。 } #endregion [自定义类][20250531152402452][ToWMSMES] } public class ConsoleInterceptor : TextWriter { #region [自定义类][20250702112833751][ConsoleInterceptor] private readonly TextWriter _originalOut; public ConsoleInterceptor() { _originalOut = Console.Out; } public override Encoding Encoding => Encoding.UTF8; public override void WriteLine(string value = "") { string values = (string)AutoThread.InvokeMethod(AutoThread.Instance, "WriteLine", new object[] { value }); //// 可以选择继续输出到原控制台 if (!string.IsNullOrEmpty(values)) _originalOut.WriteLine(values); } #endregion [自定义类][20250702112833751][ConsoleInterceptor] } }