HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/HH.WCS.DaYang.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiModel.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/WmsController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/core/WCSCore.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/models/EquipmentStatus.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/LocationHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/WCSHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/HH.WCS.DaYang.csproj
@@ -188,6 +188,7 @@ <Compile Include="core\Monitor.cs" /> <Compile Include="models\BaseModel.cs" /> <Compile Include="models\Area.cs" /> <Compile Include="models\EquipmentStatus.cs" /> <Compile Include="models\CntrItem.cs" /> <Compile Include="models\CntrItemDetail.cs" /> <Compile Include="models\OI_WMS_OP_DEF.cs" /> HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiHelper.cs
@@ -140,7 +140,7 @@ return result; } private static object lockObj = new object(); /// <summary> @@ -268,7 +268,7 @@ /// </summary> /// <param name="model"></param> /// <returns></returns> internal static Result EquipmentInfo(EquipmentInfoModel model) internal static Result NotifyDeviceSignal(NotifyDeviceSignalModel model) { Result result = new Result { resultCode = 0, resultMsg = "创建成功" }; if (model == null) @@ -282,28 +282,29 @@ string cntrcode = model.CntrNo; var db = new SqlHelper<object>().GetInstance(); if (model.DeviceNo=="1")//叠盘机 if (model.DeviceNo == "1")//叠盘机 { } else //入库空 { #region 获取起点信息 //根据托盘获取起点信息 var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First(); if (CntrLoc == null) #region 获取起点信息,并判断空托是否叠满 //根据起点 获取绑定托盘数量 var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.Loc).ToList(); if (CntrLoc.Count < 4) { result.resultCode = -1; result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘"; LogHelper.Info($"creattask:根据托盘:{cntrcode}未找到绑定托盘"); result.resultMsg = $"根据货位:{model.Loc}获取托盘数量小于4"; LogHelper.Info($"EquipmentInfo:根据货位:{model.Loc}获取托盘数量小于4"); return result; } startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE); else { //拼接托盘号 cntrcode = CntrLoc.Select(a => a.S_CNTR_CODE).ToString(); } startloc = LocationHelper.GetLoc(model.Loc); if (startloc == null) { result.resultCode = -1; result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"; LogHelper.Info($"creattask:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"); result.resultMsg = $"根据起点:{model.Loc}未找到货位信息"; LogHelper.Info($"EquipmentInfo:根据起点:{model.Loc}未找到货位信息"); return result; } @@ -315,9 +316,10 @@ { result.resultCode = -1; result.resultMsg = $"未计算到立库终点货位,请检查货位情况"; LogHelper.Info($"creattask:未计算到立库终点货位,请检查货位情况"); LogHelper.Info($"EquipmentInfo:未计算到立库终点货位,请检查货位情况"); return result; } #endregion #region 创建任务 @@ -347,6 +349,148 @@ } #endregion } else //入库空 { //入库口申请入库 if (model.SignalType == 1) { #region 获取起点信息 //根据托盘获取起点信息 var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First(); if (CntrLoc == null) { result.resultCode = -1; result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘"; LogHelper.Info($"EquipmentInfo:根据托盘:{cntrcode}未找到绑定托盘"); return result; } startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE); if (startloc == null) { result.resultCode = -1; result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"; LogHelper.Info($"EquipmentInfo:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"); return result; } #endregion #region 计算立库终点 endloc = LocationHelper.InStorage(startloc); if (endloc == null) { result.resultCode = -1; result.resultMsg = $"未计算到立库终点货位,请检查货位情况"; LogHelper.Info($"EquipmentInfo:未计算到立库终点货位,请检查货位情况"); return result; } #endregion #region 创建任务 if (startloc != null && endloc != null) { var wcsTask = new WCSTask { S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "入库", S_START_LOC = startloc.S_CODE, S_END_LOC = endloc.S_CODE, S_START_WH = startloc.S_WH_CODE, S_START_AREA = startloc.S_AREA_CODE, S_END_WH = endloc.S_WH_CODE, S_END_AREA = endloc.S_AREA_CODE, N_CNTR_COUNT = 1, N_SCHEDULE_TYPE = 2, S_CNTR_CODE = cntrcode }; LogHelper.Info("创建入平库任务:" + JsonConvert.SerializeObject(wcsTask)); if (WCSHelper.CreateTask(wcsTask)) { LocationHelper.LockLoc(startloc.S_CODE, 2); LocationHelper.LockLoc(endloc.S_CODE, 1); LogHelper.Info("创建任务成功"); } } #endregion } //入库空申请叠盘 else { //判断设备状态是否属于叠盘状态 var DeviceStatu = db.Queryable<EquipmentStatus>().Where(a => a.deviceNo == model.DeviceNo).First(); if (DeviceStatu != null && DeviceStatu.Status == "1") { #region 获取起点信息 //根据托盘获取起点信息 var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrcode).First(); if (CntrLoc == null) { result.resultCode = -1; result.resultMsg = $"根据托盘:{cntrcode}未找到绑定托盘"; LogHelper.Info($"EquipmentInfo:根据托盘:{cntrcode}未找到绑定托盘"); return result; } startloc = LocationHelper.GetLoc(CntrLoc.S_LOC_CODE); if (startloc == null) { result.resultCode = -1; result.resultMsg = $"根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"; LogHelper.Info($"EquipmentInfo:根据起点:{CntrLoc.S_LOC_CODE}未找到货位信息"); return result; } #endregion #region 获取终点信息 string DiePanLoc = ""; //根据托盘获取起点信息 endloc = db.Queryable<Location>().Where(a => a.S_CODE == DiePanLoc).First(); if (endloc == null) { result.resultCode = -1; result.resultMsg = $"根据货位编码:{DiePanLoc}未找到叠盘货位"; LogHelper.Info($"EquipmentInfo:根据货位编码:{DiePanLoc}未找到叠盘货位"); return result; } #endregion #region 创建任务 if (startloc != null && endloc != null) { var wcsTask = new WCSTask { S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "入库", S_START_LOC = startloc.S_CODE, S_END_LOC = endloc.S_CODE, S_START_WH = startloc.S_WH_CODE, S_START_AREA = startloc.S_AREA_CODE, S_END_WH = endloc.S_WH_CODE, S_END_AREA = endloc.S_AREA_CODE, N_CNTR_COUNT = 1, N_SCHEDULE_TYPE = 2, S_CNTR_CODE = cntrcode }; LogHelper.Info("创建入平库任务:" + JsonConvert.SerializeObject(wcsTask)); if (WCSHelper.CreateTask(wcsTask)) { LocationHelper.LockLoc(startloc.S_CODE, 2); LocationHelper.LockLoc(endloc.S_CODE, 1); LogHelper.Info("创建任务成功"); } } #endregion } else { result.resultCode = -1; result.resultMsg = $"当前叠盘机状态不属于叠盘状态,不允许空托叠托"; LogHelper.Info($"EquipmentInfo:当前叠盘机状态不属于叠盘状态,不允许空托叠托"); return result; } } } return result; HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/ApiModel.cs
@@ -256,19 +256,81 @@ /// <summary> /// 设备信号反馈 /// </summary> public partial class PutInModel public partial class NotifyDeviceSignalModel { /// <summary> /// 起点 /// 托盘号,可空,多个托盘号可以拼接 /// </summary> public string startBit { get; set; } [JsonProperty("cntrNo")] public string CntrNo { get; set; } /// <summary> /// 设备编号 /// </summary> [JsonProperty("deviceNo")] public string DeviceNo { get; set; } [JsonProperty("extData")] public Dictionary<string, object>[] ExtData { get; set; } /// <summary> /// 货位,上料点、下料点、读码位、称重位 /// </summary> [JsonProperty("loc")] public string Loc { get; set; } /// <summary> /// 请求类型,1:入库申请 /// </summary> [JsonProperty("signalType")] public int SignalType { get; set; } } /// <summary> /// 任务状态反馈 /// </summary> public partial class NotifyTaskStatusModel { /// <summary> /// 设备号 /// </summary> [JsonProperty("deviceNo")] public string DeviceNo { get; set; } /// <summary> /// 异常代码,主要是针对各种异常取消的描述 /// </summary> [JsonProperty("errCode")] public int ErrCode { get; set; } /// <summary> /// 当前托盘位置 /// </summary> [JsonProperty("loc")] public string Loc { get; set; } /// <summary> /// 任务状态,1:开始/执行中;2:完成;3:准备取货;4:取货完成;5:准备卸货;6:卸货完成;7:异常取消;8:强制完成 /// </summary> [JsonProperty("status")] public int Status { get; set; } /// <summary> /// wcs的子任务号,如果wcs任务拆分了,可以一起上报子任务号,方便日志追踪 /// </summary> [JsonProperty("subTaskNo")] public string SubTaskNo { get; set; } /// <summary> /// 任务号 /// </summary> [JsonProperty("taskNo")] public string TaskNo { get; set; } } #endregion #region 大洋立库接口接收返回参数 /// <summary> /// 设备信息返回 /// </summary> @@ -318,38 +380,7 @@ [JsonProperty("workStatus")] public int WorkStatus { get; set; } } /// <summary> /// 设备信号反馈 /// </summary> public partial class EquipmentInfoModel { /// <summary> /// 托盘号,可空,多个托盘号可以拼接 /// </summary> [JsonProperty("cntrNo")] public string CntrNo { get; set; } /// <summary> /// 设备编号 /// </summary> [JsonProperty("deviceNo")] public string DeviceNo { get; set; } [JsonProperty("extData")] public Dictionary<string, object>[] ExtData { get; set; } /// <summary> /// 货位,上料点、下料点、读码位、称重位 /// </summary> [JsonProperty("loc")] public string Loc { get; set; } /// <summary> /// 请求类型,1:入库申请 /// </summary> [JsonProperty("signalType")] public long SignalType { get; set; } } public partial class Empty { HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/api/WmsController.cs
@@ -1,4 +1,5 @@ using HH.WCS.DaYang.core; using Newtonsoft.Json; using System.Web.Http; using static HH.WCS.DaYang.api.ApiHelper; @@ -35,13 +36,25 @@ /// </summary> /// <param name="model"></param> /// <returns></returns> public Result EquipmentInfo(EquipmentInfoModel model) public Result notifyDeviceSignal(NotifyDeviceSignalModel model) { Result result = new Result(); LogHelper.Info("EquipmentInfo 接收:" + JsonConvert.SerializeObject(model), "EquipmentInfo"); result = ApiHelper.EquipmentInfo(model); LogHelper.Info("EquipmentInfo 返回:" + JsonConvert.SerializeObject(result), "EquipmentInfo"); LogHelper.Info("notifyDeviceSignal 接收:" + JsonConvert.SerializeObject(model), "EquipmentInfo"); result = ApiHelper.NotifyDeviceSignal(model); LogHelper.Info("notifyDeviceSignal 返回:" + JsonConvert.SerializeObject(result), "EquipmentInfo"); return result; } /// <summary> /// 任务状态反馈 /// </summary> /// <param name="model"></param> /// <returns></returns> public ReturnResult notifyTaskStatus(NotifyTaskStatusModel model) { LogHelper.Info("AGVCallbackState Request:" + JsonConvert.SerializeObject(model), "HosttoagvTask"); WCSCore.NotifyTaskStatus(model); return new ReturnResult(); } } } HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/core/WCSCore.cs
@@ -65,7 +65,7 @@ WCSHelper.Fail(TN_Task); break; } WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData,"agv"); //调用第三方接口(如果有)TaskProcess.ReportStatus } else @@ -80,6 +80,52 @@ } } public static void NotifyTaskStatus(NotifyTaskStatusModel model) { var TN_Task = WCSHelper.GetTask(model.TaskNo); if (TN_Task != null) { if (model.Status <= 7) { //有任务号请求 switch (model.Status) { case 1: WCSHelper.Begin(TN_Task); break; #region MyRegion case 3: WCSHelper.UpdateStatus(TN_Task, "开始取货"); break; case 4: WCSHelper.UpdateStatus(TN_Task, "取货完成"); TaskProcess.OperateStatus(TN_Task, 4); break; case 5: WCSHelper.UpdateStatus(TN_Task, "开始卸货"); break; case 6: WCSHelper.UpdateStatus(TN_Task, "卸货完成"); TaskProcess.OperateStatus(TN_Task, 6); break; #endregion case 2: WCSHelper.End(TN_Task); break; case 7: TaskProcess.OperateStatus(TN_Task, 7); WCSHelper.Fail(TN_Task); break; } WCSHelper.AddActionRecord(model.TaskNo, model.Status,"","","wcs"); //调用第三方接口(如果有)TaskProcess.ReportStatus } } } /// <summary> /// 任务分发,根据调度类型发给不同的调度系统 /// </summary> HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/models/EquipmentStatus.cs
New file @@ -0,0 +1,22 @@ using HH.WCS.DaYang.models; using SqlSugar; using System; namespace HH.WCS.DaYang { [SugarTable("TN_EquipmentStatus")] public class EquipmentStatus : BaseModel { /// <summary> /// ״̬ /// </summary> public string Status { get; set; } /// <summary> /// 设备号 /// </summary> public string deviceNo { get; set; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/LocationHelper.cs
@@ -79,7 +79,7 @@ } } //空托入库,相同物料内测排的货位 //托盘入库,相同物料内测排的货位 var Locs = GetLocByItemCode(areaCode, itemCode, new int[] { 1, 4 }).OrderByDescending(b => b.N_COL).ToList(); if (Locs.Count > 0) HH.WCS.Mobox3/HH.WCS.Mobox3.DaYang/wms/WCSHelper.cs
@@ -145,7 +145,7 @@ } return res; } internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData,string Type) { var db = new SqlHelper<TaskAction>().GetInstance(); var action = new TaskAction() @@ -153,7 +153,7 @@ N_ACTION_CODE = state, S_TASK_CODE = no, S_EQ_CODE = forkliftNo, S_EQ_TYPE = "agv", S_EQ_TYPE = Type, S_DATA = extData }; return db.Insertable(action).ExecuteCommand() > 0;