using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using yunneiWCS.Common;
using yunneiWCS.data;
using yunneiWCS.EnumDefine;
using yunneiWCS.EnumDefine.Device;
using yunneiWCS.ORM;
namespace yunneiWCS.ExtendFunction
{
///
/// 增补创建的扩展帮助类 【EditBy shaocx,2022-02-05】
///
public class MyExtendHelper
{
///
/// 验证AGV是否执行回原点的任务
///
///
///
public static bool ValidateAgvNoParting(string isP)
{
// return MyExtendHelper.ValidateAgvNoParting(isP);//原来的代码
return true;//先确认返回,试试效果 【Editby shaocx,2024-10-11】
}
///
/// 过滤这些真正的空库位
///
///
///
///
public static List FilterEmptyPosition(dbmodel mod, List findPosition)
{
List new_outPosition = new List();
if (findPosition == null || findPosition.Count == 0)
{
return new_outPosition;
}
productStock _productStock = null;
foreach (var item in findPosition)
{
_productStock = null;
_productStock = mod.productStock.Where(x => x.positionId == item.positionId).FirstOrDefault();
if (_productStock != null)
{//说明有库存
}
else
{//说明无库存
new_outPosition.Add(item);
}
}
return new_outPosition;
}
///
/// 是否允许给堆垛机发送新任务
///
///
///
public static bool IsAllowSendNewTaskToSrm(int sleepTime = 2000)
{
Thread.Sleep(sleepTime);//等待一秒钟 【EditBy shaocx,2022-03-26】
if (Form1.srm.mode == "自动" && Form1.srm.Alarm_info == "无故障" && Form1.srm.state == "待机" && Form1.srm.srmTaskExcuteName == "复位")
{
return true;
}
return false;
}
///
/// 获取输送线站点
///
///
///
///
///
///
///
///
public static string GetConvPlace(convEntity conv1, convEntity conv2, convEntity conv3, convEntity conv4, task item, TaskAreaEnum queryTaskAreaEnum)
{
string convPlace = "";
if (!IsAllowSimulatorHandle(item))
{
switch (queryTaskAreaEnum)
{
case TaskAreaEnum.缸体侧:
if (conv1.taskId.ToString() == item.PlcTaskNo)
{
convPlace = "2-39-1";
}
if (conv2.taskId.ToString() == item.PlcTaskNo)
{
convPlace = "1-39-1";
}
break;
case TaskAreaEnum.缸盖侧:
if (conv3.taskId.ToString() == item.PlcTaskNo)
{
convPlace = "1-0-1";
}
if (conv4.taskId.ToString() == item.PlcTaskNo)
{
convPlace = "2-0-1";
}
break;
}
}
else
{//虚拟模式或强制完成
switch (queryTaskAreaEnum)
{
case TaskAreaEnum.缸体侧:
convPlace = "2-39-1";//写死
break;
case TaskAreaEnum.缸盖侧:
convPlace = "1-0-1";//写死
break;
}
}
return convPlace;
}
///
/// 判断任务是否允许模拟完成(虚拟模拟或者是强制完成模式)
///
///
///
public static bool IsAllowSimulatorHandle(task _task)
{
if (Form1.isvirtual)
{
return true;
}
if (_task != null && _task.isForceComplete == 1)
{
return true;
}
return false;
}
///
/// 根据站点位置获取输送线的设备枚举
///
///
///
public static TransEnum GetTransByPlace(string placeName)
{
/*
* 缸体下线、上线 、缸体余料回库 的立体入库口和出库口 1-39-1(对应输送线短的L2)、2-39-1(对应输送线长的L1)
缸盖下线、上线、缸盖余料回库的立库入库口和出库口 1-0-1(对应输送线短的L3)、2-0-1(对应输送线长的L4)
*/
switch (placeName)
{
case "2-39-1":
return TransEnum.输送线L1;
case "1-39-1":
return TransEnum.输送线L2;
case "2-0-1":
return TransEnum.输送线L4;
case "1-0-1":
return TransEnum.输送线L3;
}
throw new Exception("根据站点位置" + placeName + "获取输送线的设备枚举失败");
}
///
/// 通过站点ID获取库存
///
///
///
///
public static productStock GetProductStockById(dbmodel mod, long positionId)
{
productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == positionId);
return stock;
}
///
/// 处理入库单,获取任务类型 【EditBy shaocx,2022-02-06】
///
///
///
public static taskType GetTaskTypeForInStockOrder(inStockOrder inTask)
{
//增加 toStieCode的判断 【EditBy shaocx,2022-02-06】
taskType tasktype = 0;
if (string.IsNullOrEmpty(inTask.toStieCode))
{
//根据起点判断任务类型
if (SysGloble.TransStations.Contains(inTask.siteCode))
{
tasktype = taskType.手动入库;
}
else
{
//tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? 1 : 2;
tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? taskType.缸体下线 : taskType.缸盖下线;
}
}
else
{//表示不入立体库,直接去天永机器人那里
tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? taskType.缸体下线直接去上线点 : taskType.缸盖下线直接去上线点;
}
return tasktype;
}
///
/// 处理入库单,获取任务区域 【EditBy shaocx,2022-02-06】
///
///
///
public static int GetTaskAreaForInStockOrder(inStockOrder inTask)
{
return inTask.orderType == 1 ? (int)TaskAreaEnum.缸体侧 : (int)TaskAreaEnum.缸盖侧;
}
///
/// 根据出库口的位置,获取任务区域 【EditBy shaocx,2022-02-06】
///
///
///
public static int GetTaskAreaByOutStorePostion(string postionName)
{
TaskAreaEnum _TaskAreaEnum = default(TaskAreaEnum);
switch (postionName)
{
case "1-39-1":
case "2-39-1":
_TaskAreaEnum = TaskAreaEnum.缸体侧;
break;
case "1-0-1":
case "2-0-1":
_TaskAreaEnum = TaskAreaEnum.缸盖侧;
break;
}
return (int)_TaskAreaEnum;
}
///
/// 站点是否被任务占用
///
///
///
///
public static FunctionReturnEntity IsStationHasDoingTask(dbmodel mod, string station)
{
//判断站点是否有任务被占用
var queryStatus1 = (int)taskStatus.完成;
var queryStatus2 = (int)taskStatus.作废;
int taskCount = mod.task.Where(x => (x.sourcePlace == station || x.toPlace == station) && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2).Count();
if (taskCount > 0)
{
return FunctionReturnEntity.Fail("站点" + station + "有任务被占用");
}
return FunctionReturnEntity.Success("站点" + station + "没有任务被占用");
}
///
/// 输送线站点是否被任务占用
///
///
///
///
public static FunctionReturnEntity IsStationHasDoingTaskForMiddlePlace(dbmodel mod, string _middlePlace)
{
//判断站点是否有任务被占用
var queryStatus1 = (int)taskStatus.完成;
var queryStatus2 = (int)taskStatus.作废;
int taskCount = mod.task.Where(x => (x.middlePlace == _middlePlace) && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2).Count();
if (taskCount > 0)
{
return FunctionReturnEntity.Fail("站点" + _middlePlace + "有任务被占用");
}
return FunctionReturnEntity.Success("站点" + _middlePlace + "没有任务被占用");
}
///
/// 站点是否可以被创建新任务
///
///
///
///
public static FunctionReturnEntity IsStationAllowCreateNewTask(dbmodel mod, string station)
{
var position = mod.position.Where(x => (x.positionName == station)).FirstOrDefault();
if (position == null)
{
return FunctionReturnEntity.Fail("站点" + station + "不存在");
}
if (position.isLock == true)
{
return FunctionReturnEntity.Fail("站点" + station + "被锁定");
}
if (position.enable == false)
{
return FunctionReturnEntity.Fail("站点" + station + "被禁用");
}
return FunctionReturnEntity.Success("站点" + station + "可以被使用");
}
///
/// 验证AGV是否空闲,可发送任务给他
///
///
///
///
///
public static bool ValidateAgvIsFree(task item, TaskAreaEnum _taskArea, List agvs,
string[] agvSendStatus
)
{
if (MyExtendHelper.IsAllowSimulatorHandle(item)) return true;
bool isReadAgv = false;
switch (_taskArea)
{
case TaskAreaEnum.缸体侧:
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
{
if (agvs.Count == 4)
{
#region 判断AGV是否空闲
string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1);
if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
{
isReadAgv = true;
}
isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1);
if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
{
isReadAgv = true;
}
#endregion
}
}
break;
case TaskAreaEnum.缸盖侧:
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
{
if (agvs.Count == 4)
{
#region 判断AGV是否空闲
string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1);
if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
{
isReadAgv = true;
}
isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1);
if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
{
isReadAgv = true;
}
#endregion
}
}
break;
}
return isReadAgv;
}
}
}