HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/HH.WCS.XiaoMi.csproj
@@ -221,6 +221,7 @@ <Compile Include="dispatch\XMWcsHelper.cs" /> <Compile Include="models\LocFrameRel.cs" /> <Compile Include="models\bigMaterial.cs" /> <Compile Include="models\sensorSmallMaterial.cs" /> <Compile Include="models\smallMaterial.cs" /> <Compile Include="models\AutoRepairEmptyTray.cs" /> <Compile Include="models\TN_ISUSING.cs" /> HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/api/WmsController.cs
@@ -41,6 +41,14 @@ LogHelper.Info("smallMaterial 返回:" + JsonConvert.SerializeObject(res), "WMSAPI"); return res; } [HttpPost] public TaskResponse sensorSmallMaterial(sensorSmallMaterial model) { LogHelper.Info("sensorSmallMaterial 参数:" + JsonConvert.SerializeObject(model), "WMSAPI"); var res = TaskProcess.sensorSmallMaterial(model); LogHelper.Info("sensorSmallMaterial 返回:" + JsonConvert.SerializeObject(res), "WMSAPI"); return res; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/core/WMSCore.cs
@@ -324,48 +324,48 @@ //} /// <summary> /// 大件区到区 呼叫空箱 /// </summary> /// <param name="model"></param> /// <returns></returns> public static void bigMateriala2a() { 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); var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); //创建任务 LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "自动补空箱"); var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "自动补空箱", 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}任务创建失败"); } } ///// <summary> ///// 大件区到区 呼叫空箱 ///// </summary> ///// <param name="model"></param> ///// <returns></returns> //public static void bigMateriala2a() //{ // 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); // var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); // //创建任务 // LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "自动补空箱"); // var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "自动补空箱", 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("bigMateriala2a:" + ex.Message + ex.StackTrace); LogHelper.Error("bigMateriala2a:" + ex.Message, ex); throw; } // } // catch (Exception ex) // { // Console.WriteLine("bigMateriala2a:" + ex.Message + ex.StackTrace); // LogHelper.Error("bigMateriala2a:" + ex.Message, ex); // throw; // } } //} /// <summary> HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/dispatch/GZRobot.cs
@@ -1,11 +1,13 @@ using HH.WCS.XiaoMi.api; using HH.WCS.XiaoMi.core; using HH.WCS.XiaoMi.LISTA.dispatch; using HH.WCS.XiaoMi.process; using HH.WCS.XiaoMi.util; using HH.WCS.XiaoMi.wms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using static HH.WCS.XiaoMi.api.ApiModel; using static HH.WCS.XiaoMi.LISTA.dispatch.XMWcsHelper; @@ -249,14 +251,72 @@ { //2表示申请目标库位 var apply = new ApplyModel() { wcsTaskCode = wcsTask.S_WORKSHOP_NO }; var end = XMWcsHelper.GetPositionApply(apply); if (!string.IsNullOrEmpty(end.body.pointCode)) #region 写死测试用 if (!string.IsNullOrEmpty("HC43")) { result.resultCode = 0; result.msg = "目标库位已申请"; result.orderData = end.body.pointCode; result.orderData = "HC43"; //任务表补上 var db = new SqlHelper<WCSTask>().GetInstance(); var task = db.Queryable<WCSTask>().Where(a => a.S_CODE == model.orderName).First(); LogHelper.Info($"task参数======={JsonConvert.SerializeObject(task)}"); var endLoc = LocationHelper.GetLocation("HC43"); LogHelper.Info($"endLoc参数======={JsonConvert.SerializeObject(endLoc)}"); task.S_END_LOC = "HC43"; task.S_END_AREA = endLoc.S_AREA_CODE; var res = db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_END_AREA }).ExecuteCommand() > 0; //锁住终点货位 LogHelper.Info($"task2参数======={JsonConvert.SerializeObject(task)}"); LocationHelper.LockLoc("HC43", 1); if (!res) { result.resultCode = 1; result.success = false; result.msg = $"终点库位{task.S_END_LOC}更新失败"; } LogHelper.Info($"result参数======={JsonConvert.SerializeObject(result)}"); return result; } #endregion //var db = new SqlHelper<Object>().GetInstance(); //var end = XMWcsHelper.GetPositionApply(apply); //string endPointCode = null; //if (end.body.targetType.Equals("AREA")) { // var endLoc1 =TaskProcess.InWorkTransport(end.body.pointCode); // if (endLoc1!=null) // { // //如果没找到就等第一条 // endPointCode = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == end.body.pointCode).OrderByDescending(a => a.N_ROW).ToList()[0].S_CODE; // } //} else if (end.body.targetType.Equals("STATION")) { // endPointCode= end.body.pointCode; //} //if (!string.IsNullOrEmpty(endPointCode)) //{ // result.resultCode = 0; // result.msg = "目标库位已申请"; // result.orderData = endPointCode; // //任务表补上 // var task = db.Queryable<WCSTask>().Where(a => a.S_CODE == model.orderName).First(); // var endLoc = LocationHelper.GetLocation(endPointCode); // task.S_END_LOC = endPointCode; // task.S_END_AREA = endLoc.S_AREA_CODE; // var res = db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_END_AREA }).ExecuteCommand() > 0; // //锁住终点货位 // LocationHelper.LockLoc(endPointCode, 1); // if (!res) // { // result.resultCode = 1; // result.success = false; // result.msg = $"终点库位{task.S_END_LOC}更新失败"; // } // return result; //} else { result.resultCode = 1; HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/dispatch/RcsHelper.cs
@@ -37,7 +37,8 @@ { var db = new SqlHelper<WCSTask>().GetInstance(); //存订单号 var task = db.Queryable<WCSTask>().Where(a => a.S_CODE == model.ts_name).First(); var task = db.Queryable<WCSTask>().Where(a => a.S_CODE == model.order_name).First(); LogHelper.Info($"CreateAntsOrder task参数==========={JsonConvert.SerializeObject(task)}"); task.S_WORKSHOP_NO = dataResult.data[0].in_order_id; var res = db.Updateable(task).UpdateColumns(it => it.S_WORKSHOP_NO).ExecuteCommand() > 0; if (res) @@ -118,7 +119,8 @@ bool result = false; string msg = ""; var request = JsonConvert.SerializeObject(model); var response = apiHelper.Post(baseUrl + ":9002/wcs-admin/api/cancel", request); //var response = apiHelper.Post(baseUrl + ":9002/wcs-admin/api/cancel", request); var response = apiHelper.Put(baseUrl + ":2000/api/om/order/order-command", request); msg = $"[hanao-CancelOrder] request={request};response={response}"; Console.WriteLine(msg); if (response != "") @@ -276,11 +278,11 @@ /// <summary> /// /// </summary> public string order_id { get; set; } public string order_name { get; set; } /// <summary> /// /// </summary> public string order_command_type_id { get; set; } public int order_command_type_id { get; set; } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/CntrItemDetail.cs
@@ -16,6 +16,7 @@ public string S_SERIAL_NO { get; set; } public string S_ITEM_CODE { get; set; } public string S_ITEM_NAME { get; set; } = ""; // public string S_ITEM_SPEC { get; set; } public string S_ITEM_STATE { get; set; } = "合格"; /// <summary> @@ -33,6 +34,8 @@ public float F_QTY { get; set; } public string S_UOM { get; set; } = "kg"; public string S_CNTR_CODE { get; set; } //箱子型号用 public string S_BS_TYPE { get; set; } = ""; public string S_BS_NO { get; set; } = ""; HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/Container.cs
@@ -10,6 +10,7 @@ public string S_CODE { get; set; } public string S_TYPE { get; set; } //用作箱子类型 public string S_SPEC { get; set; } public float F_WEIGHT { get; set; } public float F_LOAD_WEIGHT { get; set; } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/bigMaterial.cs
@@ -28,6 +28,7 @@ public string BatchNo { get; set; } public string issueMode { get; set; } public int num { get; set; } public string boxType { get; set; } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/sensorSmallMaterial.cs
New file @@ -0,0 +1,32 @@ using HH.WCS.XiaoMi.models; using SqlSugar; using System; using System.Collections.Generic; namespace HH.WCS.XiaoMi { public class sensorSmallMaterial : BaseModel { //料架编号 public string rackNumber { get; set; } //配送路径 public string shippingRoute { get; set; } //任务编号 public string taskID { get; set; } // public string order_name { get; set; } //截止时间 public DateTime dead_line { get; set; } //脚本名称 public string ts_name { get; set; } //创建者名称 public string createdName { get; set; } //订单优先级 public string priority { get; set; } //TS订单参数 public Parameters parameters { get; set; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/models/smallMaterial.cs
@@ -46,8 +46,6 @@ } public class Parameters { //任务号 public string BatchNo { get; set; } //起点 public string src { get; set; } //起点缓存区 @@ -58,6 +56,8 @@ public string dst_area { get; set; } //零件类 public string sku { get; set; } //任务号 public string BatchNo { get; set; } //起点缓存区发料方式 public string issueMode { get; set; } //数量 HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs
@@ -29,6 +29,7 @@ using System.Threading.Tasks; using HH.WCS.XiaoMi.LISTA.dispatch; using static HH.WCS.XiaoMi.LISTA.dispatch.RcsHelper; using System.Diagnostics; namespace HH.WCS.XiaoMi.process { @@ -124,8 +125,8 @@ CacheBitCancelUpdate(mst); ////小米订单取消 //CancelModel cancelModel = new CancelModel(); //cancelModel.order_id = mst.S_WORKSHOP_NO; //cancelModel.order_command_type_id = "2"; //cancelModel.order_name = mst.S_CODE; //cancelModel.order_command_type_id = 2; //RcsHelper.CancelOrder(cancelModel); } @@ -386,7 +387,7 @@ model.order_name = mst.S_CODE; model.priority = 1; model.dead_line = DateTime.Now.ToString(); model.ts_name = mst.S_TYPE; model.ts_name = "p2p"; model.parameters = parme; //model.parameters = new AntsParasModel { // src = mst.S_START_LOC, @@ -524,7 +525,10 @@ result = true; //任务创建成功,起点货位出库锁定,终点货位入库锁定 LocationHelper.LockLoc(start, 2); LocationHelper.LockLoc(end, 1); if (end!=null&& end != "") { LocationHelper.LockLoc(end, 1); } } return result; } @@ -857,7 +861,7 @@ /// <summary> /// 出库算法 /// 出库算法 先进先出 /// </summary> /// <param name="area">库区</param> /// <returns></returns> @@ -896,6 +900,108 @@ LogHelper.Error("OutWorkTransport:" + ex.Message, ex); } return result; } /// <summary> /// 小米出库算法 先进先出 /// </summary> /// <param name="area">库区</param> /// <returns></returns> public static Location OutWorkTransportXm(string area, string issueMode) { Location result = null; try { var db = new SqlHelper<Object>().GetInstance(); // 获取所有符合条件的货位 var query = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area); // 根据发料方式应用不同的筛选和排序逻辑 switch (issueMode) { case "9": // 发满箱,数量大于0的先进先出 query = query.Where(a => a.N_CURRENT_NUM > 0); var list9 = query.ToList() .OrderBy(s => s.T_CREATE) // 先进先出 .ToList(); result = GetFirstAvailableLocation(list9); break; case "0": // 发空箱,数量=0的先进先出 query = query.Where(a => a.N_CURRENT_NUM == 0); var list0 = query.ToList() .OrderBy(s => s.T_CREATE) // 先进先出 .ToList(); result = GetFirstAvailableLocation(list0); break; case "8": // 箱子型号优先级:残箱>空箱(残内衬)>满箱>空箱>空箱(满内衬)>其它 var list8 = query.ToList() .OrderBy(s => GetBoxTypePriority(s,new[] { "2", "4", "1", "3", "5" })) // 按指定优先级排序 .ThenBy(s => s.T_CREATE) // 相同优先级按先进先出 .ToList(); result = GetFirstAvailableLocation(list8); break; case "1": // 箱子型号优先级:残箱>空箱(残内衬)>空箱>空箱(满内衬)>满箱>其它 var list1 = query.ToList() .OrderBy(s => GetBoxTypePriority(s,new[] { "2", "4", "3", "5", "1" })) // 按指定优先级排序 .ThenBy(s => s.T_CREATE) // 相同优先级按先进先出 .ToList(); result = GetFirstAvailableLocation(list1); break; default: // 不填-按先进先出 var listDefault = query.ToList() .OrderBy(s => s.T_CREATE) // 先进先出 .ToList(); result = GetFirstAvailableLocation(listDefault); break; } } catch (Exception ex) { Console.WriteLine("OutWorkTransport:" + ex.Message + ex.StackTrace); LogHelper.Error("OutWorkTransport:" + ex.Message, ex); } return result; } // 辅助方法:根据箱子型号获取优先级 private static int GetBoxTypePriority(Location location, string[] priorityOrder) { var db = new SqlHelper<Object>().GetInstance(); var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == location.S_CODE).First(); if (locCntrRel != null) { var container = db.Queryable<Container>().Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).First(); if (container != null) { // 查找箱子型号在优先级数组中的位置 var index = Array.IndexOf(priorityOrder, container.S_SPEC); return index >= 0 ? index : priorityOrder.Length; // 不在优先级列表中的排在最后 } } return priorityOrder.Length; // 没有关联容器的排在最后 } // 辅助方法:获取第一个可用的货位 private static Location GetFirstAvailableLocation(List<Location> locations) { var db = new SqlHelper<Object>().GetInstance(); foreach (var location in locations) { if (location.N_LOCK_STATE == 0) // 判断货位是否被锁住 { var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == location.S_CODE).First(); if (locCntrRel != null) // 判断是否有托盘 { return location; } } } return null; } /// <summary> /// WMS出库转运 @@ -1020,6 +1126,15 @@ var startLoc = new Location(); string endLocStr = null; string Message = null; //校验任务编号是否存在 if (repeatTaskCode(model.order_name)) { Message = model.order_name+"任务编号已存在"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } switch (model.ts_name) { case "p2p": @@ -1027,6 +1142,10 @@ if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") { Message = $"{model.parameters.src}库位已被锁定!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } endLocStr = model.parameters.dst; @@ -1036,6 +1155,10 @@ if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") { Message = $"{model.parameters.src}库位已被锁定!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } var endLoc = InWorkTransport(model.parameters.dst_area); if (endLoc == null) @@ -1046,19 +1169,27 @@ } break; case "a2p": startLoc = OutWorkTransport(model.parameters.src_area); startLoc = OutWorkTransportXm(model.parameters.src_area, model.parameters.issueMode); if (startLoc == null) { Message = $"{model.parameters.dst}库区没有可出货位!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } endLocStr = model.parameters.dst; break; case "a2a": startLoc = OutWorkTransport(model.parameters.src_area); startLoc = OutWorkTransportXm(model.parameters.src_area,model.parameters.issueMode); if (startLoc == null) { Message = $"{model.parameters.src}库区没有可出货位!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } var endLoc1 = InWorkTransport(model.parameters.dst_area); if (endLoc1 == null) @@ -1069,10 +1200,26 @@ } break; case "p2u": startLoc = OutWorkTransport(model.parameters.src); startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameters.src).First(); if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y") { Message = $"{model.parameters.src}库位已被锁定!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } endLocStr = ""; break; case "a2u": startLoc = OutWorkTransportXm(model.parameters.src, model.parameters.issueMode); if (startLoc == null) { Message = $"{model.parameters.src}库区没有可出货位!"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } endLocStr = ""; break; @@ -1082,29 +1229,14 @@ //创建托盘货位绑定关系 string trayCode = ContainerHelper.GenerateCntrNo(); //绑定起点货位(产线)和物料 ContainerHelper.BindLocCntrsXm(startLoc.S_CODE, trayCode, model.parameters.sku, "", model.parameters.BatchNo, model.parameters.issueMode, model.parameters.num); ContainerHelper.BindLocCntrsXm(startLoc.S_CODE, trayCode, model.parameters.sku, "", model.parameters.BatchNo, model.parameters.issueMode, model.parameters.num, model.parameters.boxType); var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); //创建任务 LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLocStr}", "大件"); var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLocStr, "大件", locCntrRel.S_CNTR_CODE, model.order_name, 1, 1); if (!res) { return new TaskResponse { header = new ResponseHead { code = 1, desc = Message } }; } var result = new TaskResponse(); if (Message != null) { result = new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } else if (res) { result = new TaskResponse { @@ -1113,10 +1245,17 @@ { msg = "success", app_name = "Guozi client", data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } }, data = new List<ResponseData> { new ResponseData { in_order_id = model.order_name } }, version = "" } }; } else { Message = $"创建任务 起点:{startLoc.S_CODE}终点:{endLocStr}失败"; result = new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } return result; @@ -1155,6 +1294,15 @@ //找p2a的任务编码 var order_name = model.taskList.Find(s=>s.ts_name=="p2a").order_name; //校验任务编号是否存在 if (repeatTaskCode(order_name)) { Message = order_name + "任务编号已存在"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } //创建任务 LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "小件通用车型"); var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLoc.S_CODE, "小件通用车型", model.rackNumber, order_name, 1, 1); @@ -1162,15 +1310,25 @@ { return new TaskResponse { header = new ResponseHead { code = 0, desc = "自动上线任务创建失败" } header = new ResponseHead { code = 0, desc = $"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}失败" } }; } } var result = new TaskResponse(); //料架上的托盘到指定的工位 foreach (var tasklist in model.taskList) { if (tasklist.ts_name == "p2p") { //校验任务编号是否存在 if (repeatTaskCode(tasklist.order_name)) { Message = tasklist.order_name + "任务编号已存在"; return new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } //先绑定料架和料箱位 ContainerHelper.BindLocCntrsXmLj(tasklist.rackPosition, model.rackNumber); @@ -1187,24 +1345,133 @@ //创建托盘货位绑定关系 string trayCode = ContainerHelper.GenerateCntrNo(); //绑定起点货位(产线)和物料 ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num); ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num,""); var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First(); //创建任务 LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}", "inbound"); var res = TaskProcess.CreateTransportDj(startloc.S_CODE, endlocstr, "inbound", locCntrRel.S_CNTR_CODE, tasklist.order_name, 1, 1); if (!res) if (res) { return new TaskResponse result = new TaskResponse { header = new ResponseHead { code = 1, desc = Message } 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 = tasklist.order_name } }, version = "" } }; } else { Message = $"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}失败"; result = new TaskResponse { header = new ResponseHead { code = 0, desc = Message } }; } } } return result; } catch (Exception ex) { Console.WriteLine("smallMaterial:" + ex.Message + ex.StackTrace); LogHelper.Error("smallMaterial:" + ex.Message, ex); throw; } } //任务号重复判断 private static bool repeatTaskCode(string orderName) { var db = new SqlHelper<WCSTask>().GetInstance(); var result = db.Queryable<WCSTask>().Where(a => a.S_CODE == orderName).Count(); return result > 0; } //传感器小件 public static TaskResponse sensorSmallMaterial(sensorSmallMaterial model) { var db = new SqlHelper<Location>().GetInstance(); try { string Message = null; ////拆分成两条任务,一条是料架到指定的缓存区,二是料架上的托盘到指定的工位(小米wcs传)一对多 //var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.taskList[0].parameters.src).First(); //if (startLoc == null || startLoc.N_LOCK_STATE != 0) //{ // return new TaskResponse // { // header = new ResponseHead { code = 0, desc = $"{model.taskList[0].parameters.src}库位已被锁定!" } // }; //} //var endLoc = TaskProcess.InWorkTransport(model.shippingRoute); //if (endLoc != null) //{ // ////创建到缓存区任务 // //var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); // //找p2a的任务编码 // var order_name = model.taskList.Find(s => s.ts_name == "p2a").order_name; // //创建任务 // LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "小件通用车型"); // var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLoc.S_CODE, "小件通用车型", model.rackNumber, order_name, 1, 1); // if (!res) // { // return new TaskResponse // { // header = new ResponseHead { code = 0, desc = "自动上线任务创建失败" } // }; // } //} ////料架上的托盘到指定的工位 //foreach (var tasklist in model.taskList) //{ // if (tasklist.ts_name == "p2p") // { // //先绑定料架和料箱位 // ContainerHelper.BindLocCntrsXmLj(tasklist.rackPosition, model.rackNumber); // var startloc = db.Queryable<Location>().Where(a => a.S_CODE == tasklist.rackPosition).First(); // if (startloc == null || startloc.N_LOCK_STATE != 0) // { // return new TaskResponse // { // header = new ResponseHead { code = 0, desc = $"{startloc.S_CODE}库位已被锁定!" } // }; // } // var endlocstr = tasklist.parameters.dst; // //创建托盘货位绑定关系 // string trayCode = ContainerHelper.GenerateCntrNo(); // //绑定起点货位(产线)和物料 // ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num); // var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First(); // //创建任务 // LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}", "inbound"); // var res = TaskProcess.CreateTransportDj(startloc.S_CODE, endlocstr, "inbound", locCntrRel.S_CNTR_CODE, tasklist.order_name, 1, 1); // if (!res) // { // return new TaskResponse // { // header = new ResponseHead { code = 1, desc = Message } // }; // } // } //} var result = new TaskResponse(); if (Message != null) { @@ -1222,7 +1489,7 @@ { msg = "success", app_name = "Guozi client", data = new List<ResponseData> { new ResponseData { in_order_id = model.taskList[0].taskID } }, data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } }, version = "" } }; @@ -1239,7 +1506,6 @@ throw; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/util/HttpHelper.cs
@@ -129,6 +129,46 @@ } } public string Put(string url, string putData, string contentType = "application/json", string sessionId = "") { Console.WriteLine(url); WebRequest request = WebRequest.Create(url); request.Method = "PUT"; byte[] byteArray = Encoding.UTF8.GetBytes(putData); request.ContentType = contentType; request.ContentLength = byteArray.Length; request.Timeout = 3000; if (sessionId != "") { request.Headers.Set("ASP.NET_SessionId", sessionId); } StreamReader reader = null; Stream stream = null; WebResponse rsp = null; try { stream = request.GetRequestStream(); stream.Write(byteArray, 0, byteArray.Length); stream.Close(); rsp = request.GetResponse(); stream = rsp.GetResponseStream(); reader = new StreamReader(stream); return reader.ReadToEnd(); } catch (Exception ex) { Console.WriteLine($"{url} err={ex.Message}"); return ""; } finally { // 释放资源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } public string Post(string url, Dictionary<string, string> dic) { HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/ContainerHelper.cs
@@ -581,7 +581,7 @@ /// </summary> /// <param name="cntr"></param> /// <returns></returns> internal static bool BindLocCntrsXm(string loc, string cntr, string itemCode, string itemName, string BatchNo, string issueMode, int num) internal static bool BindLocCntrsXm(string loc, string cntr, string itemCode, string itemName, string BatchNo, string issueMode, int num, string boxType) { bool result = true; List<string> list = new List<string>(cntr.Split(',')); @@ -594,7 +594,7 @@ if (db.Queryable<LocCntrRel>().Count(a => a.S_CNTR_CODE.Trim() == cntrCode) == 0) { var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode }; var con = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1, C_FULL = "2" };//默认满 主动绑定服务用 var con = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1, S_SPEC = boxType, C_FULL = "2" };//默认满 主动绑定服务用 db.Insertable<LocCntrRel>(cir).ExecuteCommand(); db.Insertable<Container>(con).ExecuteCommand(); if (!string.IsNullOrEmpty(itemCode)) HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/wms/WCSHelper.cs
@@ -124,13 +124,18 @@ internal static bool CreateTaskDj(string no, string from, string to, string taskType, int pri, string cntrInfo,string orderName, int cntrCount = 1, int startLayer = 1, int endLayer = 1) { var fromLoc = LocationHelper.GetLocation(from); var endLoc = LocationHelper.GetLocation(to); //因为有点到未知的情况 string endLocAreaStr = null; if (to!=null && to != "") { endLocAreaStr = LocationHelper.GetLocation(to).S_AREA_CODE; } WCSTask TN_Task = new WCSTask() { //S_CODE = GenerateTaskNo(), S_CODE = orderName, S_START_AREA = fromLoc.S_AREA_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_END_AREA = endLocAreaStr, S_START_LOC = from, S_END_LOC = to, S_TYPE = taskType,