using Admin.NET.Core.BasicInformation.Enum; using Admin.NET.Core.TaskModule.Enum; using iWareCommon.Utils; using iWareModel.Entity.MES; using iWareModel.Entity.WCS; using iWareModel.Struct; using iWareSql.MyDbContext; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data.Entity; using System.Linq; namespace iWareCC.Common.Helper { /// /// 增补创建的扩展帮助类 【EditBy shaocx,2022-02-05】 /// public class MyExtendHelper { /// /// 判断一二巷道堆垛机是否故障 /// /// /// /// public static void GetDevicesInfo(MyDbContext mycontext, string WcsIp, ref List useSrmList) { #region 检验堆垛机是否故障 WCSDevicesOutput data1 = null; if (FormCC.IsSimulationPLC) {//如果是模拟 data1 = MyExtendHelper.GetSimulationSrmDevicesOutput(); Log4NetHelper.WriteInfoLog(LogType.OutPlanTask, "出库处理的线程(OutPlanTaskHandler)查询堆垛机是否空闲,模拟环境"); SystemWarningMsg._lbl_Alert_OutPlanTaskHandler = "堆垛机状态查询模拟"; } else { var utl = string.Format(WcsIp + @"GetDevicesInfo?Timestamp={0}&Creator={1}", DateTime.Now.ToString(), "cc"); //var result1 = HttpHelper.Post(utl, ""); IDictionary parameter = new Dictionary(); var result1 = new HTTPService(WcsIp).postContentForString(utl, parameter, ""); if (result1 == null) { SystemWarningMsg._lbl_Alert_OutPlanTaskHandler = "堆垛机状态查询失败,WCS返回NULL"; } data1 = JsonConvert.DeserializeObject(result1); if (data1 == null || !data1.Success || data1.Data == null) { SystemWarningMsg._lbl_Alert_OutPlanTaskHandler = "堆垛机状态查询失败,WCS返回" + result1; } } bool SRM1 = false; bool SRM2 = false; var dev = data1.Data.SRM1; if (dev == null || dev.Alram != "0" || dev.isConnect != "是") { SRM1 = true; } else { useSrmList.Add(1); } dev = data1.Data.SRM2; if (dev == null || dev.Alram != "0" || dev.isConnect != "是") { SRM2 = true; } else { useSrmList.Add(2); } if (SRM2 == true && SRM1 == true) { SystemWarningMsg._lbl_Alert_OutPlanTaskHandler = "堆垛机1,堆垛机2故障,无法下发任务"; } //这个逻辑是不对的 【Editby shaocx,2023-12-29】 //int a = 0; //if (SRM1 == true) //{ // a = 2; //} //if (SRM2 == true) //{ // a = 1; //} //if (SRM1 == false && SRM2 == false) //{ // var count = mycontext.wms_task.Where(x => x.Id > 0).ToList(); // a = count.Count() % 2 + 1;//1,2巷道评均入库 //} //return a; #endregion } /// /// 获取 托盘类型 /// /// /// /// /// /// public static int GetPalletType(MyDbContext mycontext, string containerCode, ref bool isLane3) { var containers2 = GetWareContainerType(mycontext, containerCode);//查询容器类型 isLane3 = false; int PalletType = 0; //if (containers2.WareMaterialTypeCode == "292302417842245" || containers2.WareMaterialTypeCode == "293486279884869") if (containers2.WareMaterialTypeCode == WmsCarrierType.CarrierType_大料箱.ToString() || containers2.WareMaterialTypeCode == WmsCarrierType.CarrierType_塑料托盘.ToString()) { PalletType = 1;//大料箱 或 塑料托盘 } else { PalletType = 2;//小料箱 或 刚托盘 } // if (containers2.WareMaterialTypeCode == "293486279884869" || containers2.WareMaterialTypeCode == "299120688255045")//判断是否为托盘 if (containers2.WareMaterialTypeCode == WmsCarrierType.CarrierType_塑料托盘.ToString() || containers2.WareMaterialTypeCode == WmsCarrierType.CarrierType_钢制托盘.ToString())//判断是否为托盘 { isLane3 = true;//托盘入3巷道 } return PalletType; } /// /// 查找容器类型 /// /// /// /// public static WareContainerType GetWareContainerType(MyDbContext mycontext, string ContainerCode) { return mycontext.wms_base_container_type.Join(mycontext.wms_base_container, a => a.Id, b => b.ContainerTypeId, (a, b) => new WareContainerType { WareMaterialTypeCode = a.Id.ToString(), ContainerCode = b.ContainerCode }).Where(x => x.ContainerCode == ContainerCode).FirstOrDefault();//查询容器类型 } /// /// 获取 字典数据的值 /// /// /// /// public static string GetSysDictData(MyDbContext dbContext, SysDictDataEnum sysDictDataEnum) { var sysDictData = dbContext.SysDictData.Where(x => x.Code == sysDictDataEnum.ToString()).FirstOrDefault(); if (sysDictData != null) return sysDictData.Value; return string.Empty; } /// /// 1和2 巷道的,预留出 移库的空闲数 /// /// /// /// public static List RemoveEmptyLocatonForReservedMoveLocationNumByLane12(MyDbContext dbContext, List criterionContainerOutputs) { if (criterionContainerOutputs == null || criterionContainerOutputs.Count == 0) { return criterionContainerOutputs; } var reservedLocationNum = GetSysDictData(dbContext, SysDictDataEnum.ReservedLocationNumForLan12); if (string.IsNullOrEmpty(reservedLocationNum)) {//说明没有配置预留移库数 return criterionContainerOutputs; } int i_reservedLocationNum = Convert.ToInt32(reservedLocationNum); //1、2巷道的空闲数判断 var lan1List = criterionContainerOutputs.Where(x => x.Lane == 1).ToList(); var lan2List = criterionContainerOutputs.Where(x => x.Lane == 2).ToList(); if (lan1List.Count <= i_reservedLocationNum) { //抛弃1巷道 criterionContainerOutputs.RemoveAll(x => x.Lane == 1); } if (lan2List.Count <= i_reservedLocationNum) { //抛弃2巷道 criterionContainerOutputs.RemoveAll(x => x.Lane == 2); } return criterionContainerOutputs; } /// /// 锁定和解锁库位 /// /// 是否是锁定 /// /// /// public static void LockLocation(bool isLock, MyDbContext dbContext, string placeCode, string lockRemark) { //var _Location = dbContext.wms_base_place.Where(x => x.PlaceCode == placeCode ).FirstOrDefault(); //if (isLock) //{ // //锁定库位 // _Location.PlaceStatus = 1; // _Location.LockRemark = lockRemark; // _Location.UpdatedTime = DateTime.Now; //} //else //{ // //解锁库位 // _Location.IsLocked = 0; // _Location.LockRemark = lockRemark; // _Location.UpdatedTime = DateTime.Now; //} } /// /// 生成虚拟的堆垛机列表 /// /// public static WCSDevicesOutput GetSimulationSrmDevicesOutput() { WCSDevicesOutput wCSDevicesOutput = new WCSDevicesOutput() { Success = true, Data = new WDO_Dev() { SRM1 = new WDO_Data() { isfree = "1", SrmNo = "1", isConnect = "是", Alram = "0" }, SRM2 = new WDO_Data() { isfree = "1", SrmNo = "2", isConnect = "是", Alram = "0" }, SRM3 = new WDO_Data() { isfree = "1", SrmNo = "3", isConnect = "是", Alram = "0" }, } }; return wCSDevicesOutput; } /// /// 生成模拟的WCS返回结果 /// /// public static List CreateSimulationWcsData(List model) { List str = new List(); List taskDatailsOutPutsList = new List(); foreach (var item in model) { taskDatailsOutPutsList.Add(new TaskDatailsOutPut() { WmsTaskNo = item.TaskNo, FinishTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), StartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TaskState = 3, ToPlace = item.ToPlaceCode, }); } return taskDatailsOutPutsList; } /// /// 获取库位对象 /// /// /// /// /// public static wms_base_place GetWareLocationObject(MyDbContext dbContext, string placeCode, bool noFoundThrowException = true) { var wareLocations = dbContext.wms_base_place.Where(x => x.PlaceCode == placeCode).ToList(); if (wareLocations == null || wareLocations.Count == 0) { if (noFoundThrowException) { throw new Exception($"根据库位编号{placeCode}没有找到库位的基础数据!"); } return null; } if (wareLocations.Count > 1) { throw new Exception($"根据库位编号{placeCode}找到库位的基础数据{wareLocations.Count}条!"); } return wareLocations.First(); } /// /// 判断库位是否是平库 /// /// /// /// public static bool IsPingku(MyDbContext dbContext, string locationCode) { //var vFromLocation = MyExtendHelper.GetWareLocationObject(dbContext, locationCode, false); //if (vFromLocation != null) //{ // if (vFromLocation.isPingKu == true) return true; //} return false; } } }