HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/HH.WCS.XiaoMi.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/core/WMSCore.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocCntrRel.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocFrameRel.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/WCSTask.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/bigMaterial.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/smallMaterial.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/LocationHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/WCSHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/HH.WCS.XiaoMi.csproj
@@ -217,6 +217,8 @@ <Compile Include="dispatch\HanAo.cs" /> <Compile Include="dispatch\NDC.cs" /> <Compile Include="core\Monitor.cs" /> <Compile Include="models\LocFrameRel.cs" /> <Compile Include="models\smallMaterial.cs" /> <Compile Include="models\bigMaterial.cs" /> <Compile Include="models\AutoRepairEmptyTray.cs" /> <Compile Include="models\TN_ISUSING.cs" /> HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/core/WMSCore.cs
@@ -366,5 +366,57 @@ } } /// <summary> /// 应急空料架上线_AMR /// </summary> /// <returns></returns> public static void EmergencyEmptyMaterial() { var db = new SqlHelper<Location>().GetInstance(); try { var startLoc = new Location(); var endLoc = new Location(); var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "应急空料架缓存区域").FirstOrDefault(); endLoc = TaskProcess.InWorkTransport(endReservoirs.areaCode); if (endLoc != null) { var startReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "空料架区").FirstOrDefault(); startLoc = TaskProcess.OutWorkTransport(startReservoirs.areaCode); if (startLoc!=null) { var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); //创建任务 LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "应急空料架上线_AMR"); var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "应急空料架上线_AMR", locCntrRel.S_CNTR_CODE, 1, 1); if (res) { LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功"); } else { LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败"); } } } } catch (Exception ex) { Console.WriteLine("EmergencyEmptyMaterial:" + ex.Message + ex.StackTrace); LogHelper.Error("EmergencyEmptyMaterial:" + ex.Message, ex); throw; } } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocCntrRel.cs
@@ -24,6 +24,10 @@ public int N_BIND_ORDER { get; set; } //货架 zxx public string S_FRAME_CODE { get; set; } [SugarColumn(IsIgnore = true)] [Navigate(NavigateType.OneToMany, nameof(S_CNTR_CODE))] public List<CntrItemDetail> CntrItemRels { get; set; } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/LocFrameRel.cs
New file @@ -0,0 +1,35 @@ using HH.WCS.XiaoMi.models; using SqlSugar; using System; using System.Collections.Generic; namespace HH.WCS.XiaoMi { //TN_Loc_Container //LocCntrRel [SugarTable("TN_Frame_Container")] public class LocFrameRel : BaseModel { [SugarColumn(IsPrimaryKey = true)] //货位 public string S_LOC_CODE { get; set; } //货架 public string S_FRAME_CODE { get; set; } //public string S_ACTION_SRC { get; set; } //public string S_BINDING_METHOD { get; set; } //public int N_BINDING_METHOD { get; set; } //public string S_STATE_PRE { get; set; } //public int N_REVIEW_RESULT { get; set; } //public int N_BIND_ORDER { get; set; } [SugarColumn(IsIgnore = true)] [Navigate(NavigateType.OneToMany, nameof(S_LOC_CODE))] public List<LocCntrRel> LocCntrRels { get; set; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/WCSTask.cs
@@ -47,6 +47,10 @@ public int N_REVIEW_RESULT { get; set; } public string S_CNTR_CODE { get; set; } //货架号 zxx public string S_FRAME_CODE { get; set; } public string S_OP_NAME { get; set; } public string S_WORKSHOP_NO { get; set; } public string S_WORKSHOP_NAME { get; set; } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/bigMaterial.cs
@@ -1,28 +1,44 @@ using HH.WCS.XiaoMi.models; using SqlSugar; using System; using System.Collections.Generic; namespace HH.WCS.XiaoMi { public class bigMaterial : BaseModel public class smallMaterial : BaseModel { //订单TS名字 public string ts_name { get; set; } public string createdNamne { get; set; } public parameters parameter { get; set; } public string routeType { get; set; } //订单优先级 public string priority { get; set; } //任务类型 自动,人工 public string taskType { get; set; } //料架编码 public string rackCode { get; set; } //TS订单参数 public List<Parameters> parameters { get; set; } public string taskID { get; set; } //任务明细号 public string order_name { get; set; } //订单创建时间(传时间戳) public DateTime dead_line { get; set; } } public class parameters public class Parameters { //立库起点、大件起点 public string src { get; set; } //料架仓位明细 public string trayCode { get; set; } //流利料架位置 public string dst { get; set; } //零件类 public string sku { get; set; } //任务号 public string BatchNo { get; set; } public int num { get; set; } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/smallMaterial.cs
New file @@ -0,0 +1,31 @@ using HH.WCS.XiaoMi.models; using SqlSugar; using System; namespace HH.WCS.XiaoMi { public class bigMaterial : BaseModel { public string ts_name { get; set; } public string createdNamne { get; set; } public parameters parameter { get; set; } public string taskID { get; set; } public string order_name { get; set; } public DateTime dead_line { get; set; } } public class parameters { public string src { get; set; } public string dst { get; set; } public string sku { get; set; } public string BatchNo { get; set; } public int num { get; set; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs
@@ -46,13 +46,32 @@ { Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); if (mst.S_FRAME_CODE != null) { LocationHelper.UnBindingLocHj(mst.S_START_LOC, mst.S_FRAME_CODE); } else { LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); } } else { Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); //如果货架有值则绑货架 if (mst.S_FRAME_CODE!=null) { LocationHelper.BindingLocHj(mst.S_END_LOC, mst.S_FRAME_CODE); } else { LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); } } } @@ -380,7 +399,24 @@ } return result; } //小米货架任务 public static bool CreateTransportHj(string start, string end, string taskType, string frame, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1) { var result = false; var trayCodes = frame; var taskNo = DateTime.Now.Ticks.ToString(); var res = WCSHelper.CreateTaskHj(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer); if (res) { result = true; //任务创建成功,起点货位出库锁定,终点货位入库锁定 LocationHelper.LockLoc(start, 2); LocationHelper.LockLoc(end, 1); } return result; } /// <summary> /// 创建搬运任务 /// </summary> @@ -1835,8 +1871,187 @@ } /// <summary> /// 小件 /// </summary> /// <param name="model"></param> /// <returns></returns> internal static TaskResponse smallMaterial(smallMaterial model) { try { var startLoc = new Location(); var endLoc = new Location(); string Message = null; if (model.taskType=="自动") { autoSmallMaterial(model); } else if (model.taskType == "人工") { artificialSmallMaterial(model); } var result = new TaskResponse(); if (Message != null) { result = new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } else { result = new TaskResponse { header = new ResponseHead { code = 200, desc = "SUCCESS" }, body = new ResponseBody { msg = "success", app_name = "Guozi client", data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } }, version = "" } }; } return result; } catch (Exception ex) { Console.WriteLine("bigMaterial:" + ex.Message + ex.StackTrace); LogHelper.Error("bigMaterial:" + ex.Message, ex); throw; } } //自动 拆分 private static string autoSmallMaterial(smallMaterial model) { var db = new SqlHelper<Location>().GetInstance(); string Message = null; //拆分成两条任务,一条是料架到指定的缓存区,料架上的托盘到指定的工位(小米wcs传)一对多 var startFrame = db.Queryable<LocFrameRel>().Where(a => a.S_LOC_CODE == model.parameters[0].src).First(); var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == startFrame.S_FRAME_CODE).First(); if (startLoc == null || startLoc.N_LOCK_STATE != 0) { Message = $"{model.parameters[0].src}库位已被锁定!"; } var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == model.routeType).FirstOrDefault(); var endLoc = TaskProcess.InWorkTransport(endReservoirs.areaCode); if (endLoc != null) { //创建到缓存区任务 var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); //创建任务 LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", model.ts_name); var res = TaskProcess.CreateTransportHj(startLoc.S_CODE, endLoc.S_CODE, model.ts_name, locCntrRel.S_FRAME_CODE, 1, 1); if (!res) { return Message="自动上线任务创建失败"; } } //料架上的托盘到指定的工位 foreach (var parameter in model.parameters) { var startLocHj = db.Queryable<Location>().Where(a => a.S_CODE == parameter.src).First(); if (startLocHj == null || startLocHj.N_LOCK_STATE != 0) { Message = $"{model.parameters[0].src}库位已被锁定!"; } //货架上的货判断一下货架有没有锁 var startFrameParent = db.Queryable<LocFrameRel>().Where(a => a.S_LOC_CODE == parameter.src).First(); if (startFrameParent != null) { var startLocParent = db.Queryable<Location>().Where(a => a.S_CODE == startFrameParent.S_FRAME_CODE).First(); if (startLocParent == null || startLocParent.N_LOCK_STATE != 0) { Message = $"{startFrameParent.S_FRAME_CODE}库位已被锁定!"; } } } return Message; //switch (model.ts_name) //{ // case "p2p": // startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.src).First(); // if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") // { // Message = $"{model.parameter.src}库位已被锁定!"; // } // endLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.dst).First(); // if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") // { // Message = $"{model.parameter.dst}库位已被锁定!"; // } // break; // case "p2a": // startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.src).First(); // if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") // { // Message = $"{model.parameter.src}库位已被锁定!"; // } // endLoc = InWorkTransport(model.parameter.dst); // if (endLoc == null) // { // Message = $"{model.parameter.dst}库区没有可入货位!"; // } // break; // case "a2p": // startLoc = OutWorkTransport(model.parameter.src); // if (startLoc == null) // { // Message = $"{model.parameter.dst}库区没有可出货位!"; // } // endLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameter.dst).First(); // if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") // { // Message = $"{model.parameter.dst}库位已被锁定!"; // } // break; //} //var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); ////创建任务 //LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", model.ts_name); //var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, model.ts_name, locCntrRel.S_CNTR_CODE, 1, 1); //if (!res) //{ // return new TaskResponse // { // header = new ResponseHead { code = 1, desc = Message } // }; //} } //人工 不拆分 private static void artificialSmallMaterial(smallMaterial model) { var db = new SqlHelper<Location>().GetInstance(); } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/LocationHelper.cs
@@ -1,4 +1,5 @@ using HH.WCS.XiaoMi.util; using Opc.Ua; using SqlSugar; using System; using System.Collections.Generic; @@ -404,6 +405,29 @@ } return res; } public static bool UnBindingLocHj(string loc, string frame) { var res = false; var db = new SqlHelper<object>().GetInstance(); var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First(); try { db.BeginTran(); var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == loc).ToList(); var count = db.Deleteable<LocCntrRel>().Where(it => frame==it.S_FRAME_CODE.Trim() && it.S_LOC_CODE.Trim() == loc).ExecuteCommand(); location.N_CURRENT_NUM = lcrList.Count - count; location.S_LOCK_STATE = "无"; location.N_LOCK_STATE = 0; db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); } return res; } /// <summary> /// 货位绑定容器 /// </summary> @@ -443,7 +467,42 @@ } return res; } /// <summary> /// 货位绑定货架 小米 /// </summary> /// <param name="loc"></param> /// <param name="cntrs"></param> /// <returns></returns> public static bool BindingLocHj(string loc, string frame) { var res = false; var db = new SqlHelper<object>().GetInstance(); var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First(); try { var lcrList = db.Queryable<LocCntrRel>().Includes(a => a.Container).Where(a => a.S_LOC_CODE.Trim() == loc).ToList(); db.BeginTran(); int count = 0; if (lcrList.Count(b => b.S_CNTR_CODE.Trim() == frame) == 0) { db.Insertable<LocCntrRel>(new LocCntrRel { S_LOC_CODE = loc, S_FRAME_CODE = frame }).ExecuteCommand(); count++; } location.N_CURRENT_NUM = lcrList.Count + count; location.N_LOCK_STATE = 0; location.S_LOCK_STATE = "无"; db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { Console.WriteLine(ex.Message); db.RollbackTran(); } return res; } /// <summary> /// 判断逻辑库区是否有可用货位 /// </summary> HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/WCSHelper.cs
@@ -114,6 +114,33 @@ return CreateTask(TN_Task); } //小米货架 internal static bool CreateTaskHj(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1) { var fromLoc = LocationHelper.GetLocation(from); var endLoc = LocationHelper.GetLocation(to); WCSTask TN_Task = new WCSTask() { S_CODE = GenerateTaskNo(), S_START_AREA = fromLoc.S_AREA_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_START_LOC = from, S_END_LOC = to, S_TYPE = taskType, S_OP_CODE = no, N_PRIORITY = pri, N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_B_STATE = WCSTask.GetStateStr(0), S_FRAME_CODE = cntrInfo, //N_START_LAYER = startLayer, //N_END_LAYER = endLayer, //N_CNTR_COUNT = cntrCount }; return CreateTask(TN_Task); } internal static bool CreateTask(string no, Location from, Location to, string taskType, int scheduleType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1) { WCSTask TN_Task = new WCSTask()