using DbCommon.BusinessCore.BaseCore; using DbCommon.Enties.DbModels; using ProjectManagementSystem.Common.Config; using ProjectManagementSystem.Common.Extenions; using ProjectManagementSystem.Common.Function; using ProjectManagementSystem.Common.Logger; using ProjectManagementSystem.Common.Models.Crms; using ProjectManagementSystem.Common.Service; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace ProjectManagementSystem.Common.Core { public class SystemInitialize { public static ConcurrentDictionary MapStationDictionary { get; set; } = new ConcurrentDictionary(); public static void SystemStarted() { var firstLoop = true; while (true) { try { var result = Crms.PmsApi.GetPmsBehavior(); if (result != null) { if (!firstLoop) { System.Threading.Thread.Sleep(5000); } break; } firstLoop = false; } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } System.Threading.Thread.Sleep(5000); } } public static bool InitDataSource() { try { AsyncBehaviorManager asyncBehaviorManager = new AsyncBehaviorManager(); asyncBehaviorManager.Init(); WareHouseManager wareHouseManager = new WareHouseManager(); wareHouseManager.Init(); LocationPropertyManager locationPropertyManager = new LocationPropertyManager(); locationPropertyManager.Init(); MaterialDetailManager materialDetailManager = new MaterialDetailManager(); materialDetailManager.Init(); //CallTaskManager callTaskManager = new CallTaskManager(); //callTaskManager.Init(); //callTaskManager.DeleteOldData(); MaterialBindingManager materialBindingManager = new MaterialBindingManager(); materialBindingManager.Init(); PmsTaskInfoManager pmsTaskInfoManger = new PmsTaskInfoManager(); pmsTaskInfoManger.Init(); pmsTaskInfoManger.DeleteOldData(); //AgvMaterialBindingManager agvMaterialBindingManager = new AgvMaterialBindingManager(); //agvMaterialBindingManager.Init(); AreaTrafficManager areaTrafficManager = new AreaTrafficManager(); areaTrafficManager.Init(); return true; } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } return false; } public static bool InitWMS() { try { CLog.Instance.SystemLog.WriteInfo("同步WMS信息..."); LocationPropertyManager locationManager = new LocationPropertyManager(); WareHouseManager wareHouseManager = new WareHouseManager(); //从基础配置表里获取库位信息 var wHouses = ExcelConfig.Instance.RouteConfigList .Where(d => !string.IsNullOrEmpty(d.WareHouseCode)) .Select(d => d.WareHouseCode) .Distinct() .ToList(); var wHousesInsertList = new List(); var wHouseList = wareHouseManager.GetList(); foreach (var item in wHouses) { var data = wHouseList.FirstOrDefault(d => d.WareHouseCode == item); if (data == null) { var data2 = new WareHouse(); data2.WareHouseCode = item; data2.WareHouseName = item; wHousesInsertList.Add(data2); } } if (wHousesInsertList.Count > 0) { wareHouseManager.Insert(wHousesInsertList); } //仓位 var configs = ExcelConfig.Instance.RouteConfigList .Where(d => !string.IsNullOrEmpty(d.WareHouseCode) && !string.IsNullOrEmpty(d.LocationCode) && d.StationID > 0); var insertList = new List(); var updateList = new List(); var locationList = locationManager.GetList(); foreach (var item in configs) { if (string.IsNullOrWhiteSpace(item.Area)) { item.Area = item.WareHouseCode; } var data = locationList.FirstOrDefault(d => d.LocationCode == item.LocationCode); if (data == null) { var data2 = new LocationProperty(); data2.WareHouseCode = item.WareHouseCode; data2.LocationCode = item.LocationCode; data2.Mark = item.StationID; data2.Active = "N"; data2.ModifyUser = "xjh"; data2.ModifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); data2.Area = item.Area; data2.RowIndex = item.RowIndex; data2.ColumnIndex = item.ColumnIndex; insertList.Add(data2); } else { if (data.Mark != item.StationID || data.WareHouseCode != item.WareHouseCode || data.Area != item.Area || data.RowIndex != item.RowIndex || data.ColumnIndex != item.ColumnIndex) { data.Mark = item.StationID; data.WareHouseCode = item.WareHouseCode; data.Area = item.Area; data.RowIndex = item.RowIndex; data.ColumnIndex = item.ColumnIndex; updateList.Add(data); } } } if (insertList.Count > 0) { locationManager.Insert(insertList); } if (updateList.Count > 0) { locationManager.Update(updateList); } CLog.Instance.SystemLog.WriteInfo("同步WMS信息完毕"); return true; } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } return false; } public static bool InitSWMS() { try { CLog.Instance.SystemLog.WriteInfo("同步SWMS信息..."); //仓库 var wHouseList = Crms.SWmsApi.GetAllWarehouse(); var wHouses = ExcelConfig.Instance.RouteConfigList .Where(d => !string.IsNullOrEmpty(d.WareHouseCode)) .Select(d => d.WareHouseCode) .Distinct() .ToList(); foreach (var item in wHouses) { var data = wHouseList.FirstOrDefault(d => d.warehouseId == item); if (data == null) { var data2 = new SWmsWarehouse(); data2.warehouseId = item; data2.warehouseName = item; var result = Crms.SWmsApi.AddWarehouse(data2, out var content); if (!result) { CLog.Instance.SystemLog.WriteInfo($"添加仓库配置失败 {content}"); } } } //区域 var areaList = Crms.SWmsApi.GetAllArea(); var areas = ExcelConfig.Instance.RouteConfigList .Where(d => !string.IsNullOrEmpty(d.Area)) .Select(d => d.Area) .Distinct() .ToList(); foreach (var item in areas) { var data = areaList.FirstOrDefault(d => d.areaId == item); if (data == null) { var data2 = new SWmsArea(); data2.areaId = item; data2.areaName = item; var result = Crms.SWmsApi.AddArea(data2, out var content); if (!result) { CLog.Instance.SystemLog.WriteInfo($"添加区域配置失败 {content}"); } } } //库位状态 var statusList = Crms.SWmsApi.GetAllLocationStatus(); //var statusArray = typeof(LocationStatus).GetEnumValues(); var statusArray = new LocationStatus[] { LocationStatus.None }; foreach (var item in statusArray) { var statusCode = item.ToValue().ToString(); var data = statusList.FirstOrDefault(d => d.statusCode == statusCode); if (data == null) { var data2 = new SWmsLocationStatus(); data2.statusCode = statusCode; data2.zh_CN = item.ToStatusString(); data2.zh_HK = ""; data2.en_US = ""; data2.active = true; var result = Crms.SWmsApi.AddLocationStatus(data2, out var content); if (!result) { CLog.Instance.SystemLog.WriteInfo($"添加库位状态配置失败 {content}"); } } } #region 8723屏蔽 //货物模型 //var freightShapeList = Crms.SWmsApi.GetAllFreightShape(); //var goodsArray = new string[] { "默认货物", "空料车", "满料车" }; //foreach (var item in goodsArray) //{ // var data = freightShapeList.FirstOrDefault(d => d.shapeName == item); // if (data == null) // { // var data2 = new SWmsFreightShape(); // data2.shapeName = item; // data2.shapeType = 1; // data2.freightIcon = 3; // data2.maxLength = 1000; // data2.maxWidth = 1000; // data2.rotateWithCarrier = true; // data2.viewRatio = 100; // var result = Crms.SWmsApi.AddFreightShape(data2, out var content); // if (!result) // { // CLog.Instance.SystemLog.WriteInfo($"添加货物模型失败 {content}"); // } // } //} //freightShapeList = Crms.SWmsApi.GetAllFreightShape(); //var goodsList = Crms.SWmsApi.GetAllGoods(); //foreach (var item in goodsArray) //{ // var data = goodsList.FirstOrDefault(d => d.goodsCode == item); // if (data == null) // { // var data2 = new SWmsGoods(); // data2.goodsCode = item; // data2.goodsName = item; // data2.goodsShape = freightShapeList.FirstOrDefault(d => d.shapeName == item)?.id ?? 0; // var result = Crms.SWmsApi.AddGoods(data2, out var content); // if (!result) // { // CLog.Instance.SystemLog.WriteInfo($"添加货物失败 {content}"); // } // } //} #endregion //库位 var locationList = Crms.SWmsApi.GetAllLocation(); var configs = ExcelConfig.Instance.RouteConfigList .Where(d => !string.IsNullOrEmpty(d.WareHouseCode) && !string.IsNullOrEmpty(d.LocationCode) && d.StationID > 0); foreach (var item in configs) { if (string.IsNullOrWhiteSpace(item.Area)) { item.Area = item.WareHouseCode; } var rowText = item.RowIndex > 0 ? item.RowIndex.ToString("D4") : string.Empty; var colText = item.ColumnIndex > 0 ? item.ColumnIndex.ToString("D4") : string.Empty; var data = locationList.FirstOrDefault(d => d.locationId == item.LocationCode); if (data == null) { var data2 = new SWmsLocation(); data2.warehouseId = item.WareHouseCode; data2.areaId = item.Area; data2.locationId = item.LocationCode; data2.locationName = item.LocationCode; data2.enable = true; data2.row = rowText; data2.column = colText; var result = Crms.SWmsApi.AddLocation(data2, out var content); if (!result) { CLog.Instance.SystemLog.WriteInfo($"添加库位失败 {content}"); } } else if (data.warehouseId != item.WareHouseCode || data.areaId != item.Area || data.row != rowText || data.column != colText) { data.warehouseId = item.WareHouseCode; data.areaId = item.Area; data.row = rowText; data.column = colText; var result = Crms.SWmsApi.UpdateLocation(data, out var content); if (!result) { CLog.Instance.SystemLog.WriteInfo($"更新库位失败 {content}"); } } } CLog.Instance.SystemLog.WriteInfo("同步SWMS信息完毕"); return true; } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } return false; } public static bool InitWareHouse() { try { CLog.Instance.SystemLog.WriteInfo("同步任务点信息..."); var whouseInfoList = Crms.PmsApi.GetWarehouseListInfo(string.Empty); if (whouseInfoList == null) { CLog.Instance.SystemLog.WriteError("获取库位活动点失败,请检查CRMS是否启动"); return false; } var whouseGroupTypeList = Crms.PmsApi.GetwarehouseGroupType(); if (whouseGroupTypeList == null) { CLog.Instance.SystemLog.WriteError("获取库位组信息失败,请检查CRMS是否启动"); return false; } //WarehouseType -> GroupId Dictionary whouseTypeGroupIdDict = new Dictionary(); for (int i = 0; i < whouseGroupTypeList.Count; i++) { var whouseGroupType = whouseGroupTypeList[i]; if (!whouseTypeGroupIdDict.ContainsKey(whouseGroupType.WareHouseType)) { whouseTypeGroupIdDict.Add(whouseGroupType.WareHouseType, whouseGroupType.GroupId); } } //仓位 var configs = ExcelConfig.Instance.RouteConfigList .Where(d => /*!string.IsNullOrEmpty(d.WareHouseCode) &&*/ !string.IsNullOrEmpty(d.LocationCode) && d.StationID > 0); foreach (var item in configs) { if (item.StationID <= 0) { continue; } string groupId = !string.IsNullOrEmpty(item.WarehouseGroupType) && whouseTypeGroupIdDict.TryGetValue(item.WarehouseGroupType, out var info) ? info : string.Empty; int findIndex = whouseInfoList.FindIndex(d => d.WareHouseID == item.LocationCode); if (findIndex < 0) { //添加 Crms.PmsApi.AddWarehouse( item.LocationCode, item.StationID, item.RelationStationID1, item.RelationStationID2, item.RelationStationID3, groupId); } else { //更新 var requestInfo = whouseInfoList[findIndex]; if (requestInfo.StationID != item.StationID || (requestInfo.RelationStationID1 ?? 0) != item.RelationStationID1 || (requestInfo.RelationStationID2 ?? 0) != item.RelationStationID2 || (requestInfo.RelationStationID3 ?? 0) != item.RelationStationID3 || (requestInfo.GroupId ?? "") != groupId) { var result = Crms.PmsApi.UpdateWarehouse( item.LocationCode, item.StationID, item.RelationStationID1, item.RelationStationID2, item.RelationStationID3, groupId); if (!result) { CLog.Instance.SystemLog.WriteInfo($"更新库位信息失败 {requestInfo.WareHouseID}"); } } } } CLog.Instance.SystemLog.WriteInfo("同步任务点信息完毕"); return true; } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } return false; } public static void InitOperate() { try { var operateInfoList = Crms.PmsApi.GetOperateList(string.Empty); if (operateInfoList == null) { CLog.Instance.SystemLog.WriteError("获取操作码列表失败,请检查CRMS是否启动"); return; } var vaules = TaskBehavior.BehaviorDict.Values.OrderBy(d => d.Behavior); foreach (var item in vaules) { //添加或更新到PMS行为码动作列表(WEB) AddOrUpdateOperate(item, operateInfoList); } } catch (Exception ex) { CLog.Instance.SystemLog.WriteException("TaskBookRegister", ex); } } private static void AddOrUpdateOperate(BaseTaskBookBehaviorV2 item, List operateInfoList) { var name = string.IsNullOrWhiteSpace(item.Name) ? item.Behavior.ToString() : item.Name; var behavior = item.Behavior; var remark = item.Remark; int findIndex = operateInfoList.FindIndex(d => d.Name == name); if (findIndex < 0) { //添加 Crms.PmsApi.AddOperate(name, behavior, remark); } else { //更新 var operateInfo = operateInfoList[findIndex]; if (operateInfo.Code != behavior || operateInfo.Remark != remark) { operateInfo.Code = behavior; operateInfo.Remark = remark; Crms.PmsApi.UpdateOperate(operateInfo); } } } public static void InitAsyncBehavior() { try { CLog.Instance.SystemLog.WriteInfo("初始化异步行为码..."); AsyncBehaviorManager asyncBehaviorManager = new AsyncBehaviorManager(); var dataList = asyncBehaviorManager.GetList(); foreach (var item in dataList) { var asyncBehavior = InstanceConstructor.GetInstance(item.AssemblyString, item.FullClassName); if (asyncBehavior == null) { CLog.Instance.SystemLog.WriteInfo($"创建异步行为码实例为空 {item.FullClassName}"); continue; } asyncBehavior.Id = item.Id; asyncBehavior.TaskID = item.TaskID; asyncBehavior.AgvId = item.AgvId; asyncBehavior.Behavior = item.Behavior; asyncBehavior.Interval = item.Interval; asyncBehavior.MaxStepId = item.MaxStepId; asyncBehavior.FirstStart = item.FirstStart; asyncBehavior.Start(); } CLog.Instance.SystemLog.WriteInfo("初始化异步行为码完毕"); } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } } public static bool InitLocationXY() { var RouteConfigList = ExcelConfig.Instance.RouteConfigList; while (true) { try { var mapData = Crms.PmsApi.GetMapData(); if (mapData != null) { foreach (var item in mapData.Stations) { MapStationDictionary.AddOrUpdate(item.Index, item, (k, v) => item); } for (int i = 0; i < RouteConfigList.Count; i++) { var item = RouteConfigList[i]; if (MapStationDictionary.TryGetValue(item.StationID, out var mapStationInfo) && mapStationInfo != null) { item.X = mapStationInfo.Vertex.X; item.Y = mapStationInfo.Vertex.Y; item.GraphVertex = mapStationInfo.Vertex.Number; } else { CLog.Instance.SystemLog.WriteInfo($"从地图数据中找不到活动站点 {item.LocationCode} {item.StationID}"); } } break; } else { CLog.Instance.SystemLog.WriteInfo("获取地图数据失败"); } } catch (Exception ex) { CLog.Instance.SystemLog.WriteExceptionCaller(ex); } System.Threading.Thread.Sleep(5000); } CLog.Instance.SystemLog.WriteInfo("获取地图数据完毕"); return true; } public static void InitPmsAutoupdateXml() { try { string s = System.Reflection.Assembly.GetExecutingAssembly().Location; FileInfo finfo = new FileInfo(s); string currPath = finfo.DirectoryName; string configFile = Path.Combine(currPath, "pms.xml"); var PmsConfig = new PmsAutoupdateConfig(); PmsConfig.Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); PmsConfig.Url = AppSetting.GetAutoUpdateUrl().Replace("xml", "zip"); string xml = XmlTools.XmlSerialize(PmsConfig); using (TextWriter tw = new StreamWriter(configFile)) { tw.Write(xml); } string dataFile = Path.Combine(currPath, "pms.zip"); if (File.Exists(dataFile)) { File.Delete(dataFile); } List fileList = new List(); DirectoryInfo theFolder = new DirectoryInfo(currPath); FileInfo[] fileInfos = theFolder.GetFiles(); //遍历文件 foreach (FileInfo fileInfo in fileInfos) { if (fileInfo.Extension == ".config" || fileInfo.Name.Contains("vshost")) { continue; } if (fileInfo.Name.StartsWith("ProjectManagementSystem") || fileInfo.Name.StartsWith("DbCommon")) { fileList.Add(fileInfo.FullName); } } ZipUtility zipUtility = new ZipUtility(); zipUtility.ZipFileFromFiles(currPath, fileList, dataFile, 9); } catch (Exception) { } } [XmlRoot("item")] public class PmsAutoupdateConfig { [XmlElement("version")] public string Version { get; set; } [XmlElement("url")] public string Url { get; set; } } } }