using Common; using DataBase; using Model; using Model.ApiModel; using Model.WcsModel; using Newtonsoft.Json; using NLog; using NPOI.SS.Formula; using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.PTG; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlTypes; using System.Reflection; using System.Text; using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData; namespace BLL.DAL { [Obsolete] public class DALWcsMessage { #region JC09 /// /// 获取与PLC交互的所有IP地址 /// /// public DataTable GetPlcIps() { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select * from WCSIP where isDel = 0;"); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 获取与设备交互信息 /// /// public DataTable GetPlcInfos() { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select tb1.*,tb2.IP from WCSPlcInfo as tb1 " + $"left join WCSIP as tb2 on tb1.PlcIP = tb2.Id where tb1.isDel = 0; "); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 判断WCS是否自动模式 链接DB1 /// /// true:自动模式 false:手动模式 public bool GetIsWcsAutoDB1() { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select code from [dbo].[Dictionary] where TypeName = 'WCSAuto';"); DataRow row = DataFactory.SqlDataBaseDB1().GetDataRowBySQL(sqlString); if (row != null) { if (row["code"].ToString() == "0") { bl = true; } } return bl; } catch (Exception ex) { throw ex; } } /// /// 判断WCS是否自动模式 链接db2 /// /// true:自动模式 false:手动模式 public bool GetIsWcsAutoDB2() { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select code from [dbo].[Dictionary] where TypeName = 'WCSAuto';"); DataRow row = DataFactory.SqlDataBaseDB2().GetDataRowBySQL(sqlString); if (row != null) { if (row["code"].ToString() == "0") { bl = true; } } return bl; } catch (Exception ex) { throw ex; } } /// /// 获取当前工位偏移量信息 /// /// 工位Id /// public DataTable GetPlcPos(string plcInfoId) { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select * from WCSPlcPos where isDel = 0 and PlcInfoId = '{plcInfoId}';"); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 调用WMS接口获取储位地址 /// /// 托盘号 /// 起始工位 /// 目标工位号(取货工位) /// 任务号 /// 返回wms反馈的信息 public string GetLocations(string palletNo, string startLocat, ref string endLocat, ref string taskNo) { Logger logger = LogManager.GetCurrentClassLogger(); try { string returnStr = ""; StringBuilder sqlString = new StringBuilder(); // 先判断此托盘的任务是否已生成任务 sqlString.Append("select * from WCSTasks where Status in ('0','1') and Type = '0' "); sqlString.Append($"and PalletNo = '{palletNo}' and isdel = '0';"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count <= 0) { LocatModel model = new LocatModel(); model.PalletNo = palletNo; model.HouseNo = "W01"; model.RoadwayNo = ""; string json = JsonConvert.SerializeObject(model); var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/RequestLocation", json); logger.Error(palletNo + "申请储位:" + response); Tasks taskModels = JsonConvert.DeserializeObject(response); if (taskModels.Success == "0") { // 永远只返回一条信息,因为是集合所以用循环插入写法; DALWMSApi dal = new DALWMSApi(); var task = taskModels.TaskList; task.Type = "0"; // 任务类型 0:入库任务 1出库任务 2 移库任务 task.Origin = "WMS"; task.StartLocate = startLocat; // 起始位置 WCSResultModel result = dal.AddWcsTask(task); taskNo = taskModels.TaskList.TaskNo; //任务号 if (result.stateCode == "1") { //修改储位信息 任务类型 执行状态 起始位置 目标位置 EditLocaetStatus("0", "0", "", task.EndLocate); endLocat = task.EndRoadway; returnStr = task.EndLocate;//"托盘号:" + palletNo + "\n" + "储位地址:" + task.EndLocate + "\n"; } else { returnStr = "-1:" + result.errMsg; return returnStr; } } else { returnStr = "-1:" + taskModels.Message; return returnStr; } } else { returnStr = dt.Rows[0]["EndLocat"].ToString(); endLocat = dt.Rows[0]["EndRoadway"].ToString(); taskNo = dt.Rows[0]["TaskNo"].ToString(); } // 确定取货工位 switch (endLocat) { case "R01": endLocat = "10"; break; case "R02": endLocat = "6"; break; } //returnStr = endLocat; return returnStr; } catch (Exception ex) { logger.Error("程序错误:" + ex.Message); throw ex; } } /// /// WCS自申请储位 /// /// 托盘号 /// 起始工位 /// 目标工位号(取货工位) /// 任务号 /// 返回wms反馈的信息 public string GetWcsLocations(string palletNo, string startLocat, ref string endLocat, ref string taskNo) { Logger logger = LogManager.GetCurrentClassLogger(); try { string returnStr = ""; StringBuilder sqlString = new StringBuilder(); // 先判断此托盘的任务是否已生成任务 // 验证任务是否已存在 sqlString.Append($"select * from WCSTasks where IsDel = '0' and (Status = '0' or Status = '1') and PalletNo = '{palletNo}';"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt != null || dt.Rows.Count > 0) { returnStr = "托盘" + palletNo + ";任务已存在!"; return returnStr; } if (dt == null || dt.Rows.Count <= 0) { var response = GetLocateByRoadways(); //申请储位 logger.Error(palletNo + "申请储位:" + response); // 永远只返回一条信息,因为是集合所以用循环插入写法; DALWMSApi dal = new DALWMSApi(); WCSTasks task = new WCSTasks(); task.Type = "0"; // 任务类型 0:入库任务 1出库任务 2 移库任务 task.Origin = "WCS"; //来源 task.StartLocate = startLocat; // 起始位置 task.EndLocate = response.LocatNo; // 目标位置 task.EndRoadway = response.RoadwayNo; // 目标巷道 task.PalletNo = palletNo; // 托盘号 WCSResultModel result = dal.AddItsWcsTask(task); if (result.stateCode == "1") { //修改储位信息 任务类型 执行状态 起始位置 目标位置 var IsUptLocate = EditLocaetStatus("0", "0", "", response.LocatNo); if (IsUptLocate) { endLocat = response.RoadwayNo; returnStr = response.LocatNo; } else { returnStr = "-1:" + "申请储位后任务储位修改失败"; return returnStr; } } else { returnStr = "-1:" + result.errMsg; return returnStr; } } else { returnStr = "-1:" + "申请储位失败"; return returnStr; } // 确定取货工位 switch (endLocat) { case "R01": endLocat = "1"; break; case "R02": endLocat = "2"; break; case "R03": endLocat = "3"; break; case "R04": endLocat = "4"; break; case "R05": endLocat = "5"; break; case "R06": endLocat = "6"; break; case "R07": endLocat = "7"; break; } //returnStr = endLocat; return returnStr; } catch (Exception ex) { logger.Error("程序错误:" + ex.Message); throw ex; } } /// /// 插入任务明细表 /// /// 任务明细信息 public bool AddWCSTasksMonitor(WCSTasksMonitor model) { bool bl = false; StringBuilder sqlString = new StringBuilder(); try { // 判断任务号是否位"" if (model.TaskNo == "") { // 根据托盘号获取对应的任务号 sqlString.Append($"select TaskNo from WCSTasks where Status = '1' and IsDel = '0' and PalletNo = '{model.PalletNo}';"); DataRow row = DataFactory.SqlDataBase().GetDataRowBySQL(sqlString); if (row != null) { model.TaskNo = row["TaskNo"].ToString(); } } if (model.TaskNo == "") { return bl; } // 插入任务明细表 sqlString.Clear(); sqlString.Append(@"INSERT INTO WCSTasksMonitor ( TaskNo , PlcId , PlcName , StartLocat , EndLocat , InteractiveMsg , ErrorMsg,PalletNo,Status,IsDel ) VALUES ("); sqlString.Append($"'{model.TaskNo}',{model.PlcId},'{model.PlcName}','{model.StartLocat}','{model.EndLocat}',"); sqlString.Append($"'{model.InteractiveMsg}','{model.ErrorMsg}','{model.PalletNo}','{model.Status}','0');"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { bl = true; } } catch (Exception ex) { // 记录日志文件 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "AddWCSTasksMonitor添加任务明细失败!"); return bl; } return bl; } /// /// 更新任务状态 /// /// 托盘号 /// 任务状态 0: 等待执行 1: 正在执行 2: 执行完成 3: 异常结束 4: 任务取消 /// true:成功 flase:失败 public bool SetWCSTasks(string palletNo, string StateValue, string EndLocatNo, string taskNo = "") { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append($"Update WCSTasks set FinishDate = '{DateTime.Now}', Status = '{StateValue}' "); //判断目标工位是否为空 if (!string.IsNullOrEmpty(EndLocatNo)) { sqlString.Append($" ,EndLocat = '{EndLocatNo}'"); } if (StateValue == "1") { //任务状态为正在执行时修改为最高优先级 sqlString.Append($" ,Levels = '2'"); } else if (StateValue == "2") { //任务状态为执行完成时修改为正常优先级 sqlString.Append($" ,Levels = '2'"); } sqlString.Append(" where Status not in ('3','2','4') "); if (!string.IsNullOrWhiteSpace(palletNo)) { sqlString.Append($" and PalletNo = '{palletNo}' "); } if (!string.IsNullOrWhiteSpace(taskNo)) { sqlString.Append($" and TaskNo = '{taskNo}' "); } else { sqlString.Append(" ;"); } int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { bl = true; } return bl; } catch (Exception ex) { throw ex; } } /// /// 获取任务信息 /// /// 0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 任务取消 /// 0 入库任务 1 出库任务 2 移库任务 /// 托盘号 /// public DataTable GetWCSTasks(string status, string type, string palletNo = "", string startRoadway = "", string taskNo = "", string endRoadway = "") { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select top 1 * from WCSTasks "); sqlString.Append($"where Status = '{status}' and IsDel = '0' "); if (taskNo != "") { sqlString.Append($" and TaskNo = '{taskNo}' "); } if (palletNo != "") { sqlString.Append($" and palletNo = '{palletNo}' "); } if (startRoadway != "") { sqlString.Append($" and startRoadway = '{startRoadway}' "); } if (endRoadway != "") { sqlString.Append($" and endRoadway = '{endRoadway}' "); } if (type != "") { sqlString.Append($" and Type = '{type}' "); } sqlString.Append(" order by Levels,Status,StartLocat,CreateTime asc; "); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 获取储位任务信息 /// /// 起始货位 /// public DataTable GetLocateTasks(string startlocat = "",string endlocat = "") { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select top 1 * from WCSTasks "); sqlString.Append($"where IsDel = '0'"); if (startlocat != "") { sqlString.Append($" and StartLocat = '{startlocat}' "); } if (endlocat != "") { sqlString.Append($" and EndLocat = '{endlocat}' "); } sqlString.Append(" order by Levels,Status,StartLocat,CreateTime asc; "); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } /// /// 获取储位任务信息 /// /// 起始货位 /// public DataTable GetWCSDX(string skuno = "") { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select top 1 * from WCSMaterialRules where SkuNo = "+skuno); return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } /// /// 调用WMS接口反馈任务接口 /// /// 任务完成状态 /// public bool RequestTasks(TaskReques model) { bool bl = false; Logger logger = LogManager.GetCurrentClassLogger(); try { StringBuilder sqlString = new StringBuilder(); string json = JsonConvert.SerializeObject(model); var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/ReceiveWcsSignal", json); logger.Error(model.taskNo + "任务反馈:" + response); //var response1 = JsonConvert.DeserializeObject(response); ResponseTasks taskModels = JsonConvert.DeserializeObject(response); if (taskModels.StatusCode == "0") { sqlString.Append($"Update WCSTasks set IsSuccess = '0' where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); bl = true; } else { sqlString.Append($"Update WCSTasks set IsSuccess = '1',Information='{taskModels.Message}' where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); bl = false; } } catch (Exception ex) { logger.Error("程序错误:" + ex.Message); } return bl; } /// /// 调用WMS接口反馈任务满入异常接口 /// /// 任务信息 /// public string RequestFullException(TaskReques model, string startLocat, ref string taskNo) { string returnStr = ""; taskNo = ""; //任务号 Logger logger = LogManager.GetCurrentClassLogger(); try { StringBuilder sqlString = new StringBuilder(); string json = JsonConvert.SerializeObject(model); var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/FullException", json); logger.Error(model.taskNo + "任务反馈:" + response); //var response1 = JsonConvert.DeserializeObject(response); Tasks taskModels = JsonConvert.DeserializeObject(response); if (taskModels.Success == "0") { // 永远只返回一条信息,因为是集合所以用循环插入写法; DALWMSApi dal = new DALWMSApi(); var task = taskModels.TaskList; task.Type = "0"; // 任务类型 0:入库任务 1出库任务 2 移库任务 task.Origin = "WMS"; task.StartLocate = startLocat; // 起始位置 WCSResultModel result = dal.AddWcsTask(task); if (result.stateCode == "1") { taskNo = taskModels.TaskList.TaskNo; //任务号 returnStr = task.EndLocate; } else { returnStr = "-1:" + result.errMsg; } sqlString.Append($"Update WCSTasks set IsSuccess = '0', where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); } else { returnStr = "-1:" + taskModels.Message; sqlString.Append($"Update WCSTasks set IsSuccess = '1', where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); } } catch (Exception ex) { returnStr = "-1程序错误:" + ex.Message; logger.Error(returnStr); } return returnStr; } /// /// 调用WMS接口反馈空取异常接口 /// /// 任务信息 /// public bool RequestEmptyException(TaskReques model) { bool bl = false; Logger logger = LogManager.GetCurrentClassLogger(); try { StringBuilder sqlString = new StringBuilder(); string json = JsonConvert.SerializeObject(model); var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/EmptyException", json); logger.Error(model.taskNo + "任务反馈:" + response); //var response1 = JsonConvert.DeserializeObject(response); ResponseTasks taskModels = JsonConvert.DeserializeObject(response); if (taskModels.Success == "0") { sqlString.Append($"Update WCSTasks set IsSuccess = '0' where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); bl = true; } else { sqlString.Append($"Update WCSTasks set IsSuccess = '1',Information='{taskModels.Message}' where TaskNo = '{model.taskNo}';"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); bl = false; } } catch (Exception ex) { logger.Error("-1程序错误:" + ex.Message); } return bl; } /// /// 向赋码系统获取箱码信息 /// /// /// public WcsBoxInfo GetBoxInfo(string boxCode) { try { //获取是否存在当前箱码信息 StringBuilder sqlString = new StringBuilder(); // 先判断此托盘的任务是否已生成任务 sqlString.Append($"select * from WcsBoxInfo where IsDel = '0' and BoxNo = '{boxCode}' "); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count == 0) { //调用赋码系统 var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/RequestLocation", boxCode); WcsBoxInfo boxInfo = JsonConvert.DeserializeObject(response); //添加箱码信息 sqlString.Clear(); sqlString.Append("insert into WcsBoxInfo (OrderCode,Line_No,LineDao,PORT,BoxNo,BoxNo2,BoxNo3,PalletNo,Qty,FullQty,Aflag,Status,SkuNo,SkuName,LotNo,LotText,Custom,CustomName,ProductionTime,ExpirationTime,CompleteTime,InspectMark,BitBoxMark,Standard,PackageStandard,StoreTime,QtyCount,QtyOrd,Opuser,IsDel,CreateTime,CreateUser,UpdateTime,UpdateUser)"); sqlString.Append($"Values ('{boxInfo.OrderCode}','{boxInfo.Line_No}','{boxInfo.LineDao}','{boxInfo.PORT}','{boxInfo.BoxNo}','{boxInfo.BoxNo2}','{boxInfo.BoxNo3}','','{boxInfo.Qty}','{boxInfo.FullQty}','{boxInfo.Aflag}','{boxInfo.Status}','{boxInfo.SkuNo}','{boxInfo.SkuName}','{boxInfo.LotNo}','{boxInfo.LotText}','{boxInfo.Custom}','{boxInfo.CustomName}','{boxInfo.ProductionTime}','{boxInfo.ExpirationTime}','{boxInfo.CompleteTime}','{boxInfo.InspectMark}','{boxInfo.BitBoxMark}','{boxInfo.Standard}','{boxInfo.PackageStandard}','{boxInfo.StoreTime}','{boxInfo.QtyCount}','{boxInfo.QtyOrd}','{boxInfo.Opuser}','0',getdate(),null,null,null)"); int isAdd = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (isAdd == 1) { return boxInfo; } else { return null; } } else { return null; } } catch (Exception ex) { throw ex; } } /// /// 变更储位(需要的值 任务类型 状态 (入库与PLC:目标位置、出库:起始位置、移库两个都需要) /// /// 任务类型 0:入库 1:出库 2:移库 3:PLC申请 /// 执行状态 0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 任务取消 /// 起始位置 /// 目标位置 /// public bool EditLocaetStatus(string type, string status, string startLocat, string endLocat) { try { bool isTrue = false; int upt = 0; StringBuilder sqlString = new StringBuilder(); #region 赋值状态 string start = ""; //起始储位状态 string end = ""; //目标储位状态 string qita = ""; //用于WMS //修改的状态 0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移除中 //任务类型 0入 1出 2移 3 PLC申请 switch (type) { case "0"://入库 case "3"://PLC入库 //任务状态 switch (status) { case "0": //等待执行 case "1": //正在执行 end = "2"; //目标储位状态 //入库中 break; case "2": //执行完成 end = "1"; //目标储位状态 //有物品 break; case "3": //异常结束 //不变 break; case "4": //取消 end = "0"; //目标储位状态 //空储位 break; default: //其它 break; } break; case "1": //出库 //任务状态 switch (status) { case "0": //等待执行 case "1": //正在执行 start = "3"; //起始储位状态 出库中 break; case "2": //执行完成 start = "0"; //起始储位状态 空储位 break; case "3": //异常结束 //不变 break; case "4": //取消 start = "1"; //起始储位状态 有物品 break; default: //其它 break; } break; case "2": //移库 //任务状态 switch (status) { case "0": //等待执行 case "1": //正在执行 end = "4"; //目标储位状态 移入中 start = "5"; //起始储位状态 移出中 break; case "2": //执行完成 end = "1"; //目标储位状态 有物品 start = "0"; //起始储位状态 空储位 break; case "3": //异常结束 //不变 break; case "4": //取消 end = "0"; //目标储位状态 空储位 start = "1"; //起始储位状态 有物品 break; default: //其它 break; } break; default: break; } #endregion //验证起始状态或目标状态不为空 if (!string.IsNullOrEmpty(end)) { sqlString.Append($"update WCSStorageLocat set Status = '{end}' where LocatNo = '{endLocat}';"); } if (!string.IsNullOrEmpty(start)) { sqlString.Append($"update WCSStorageLocat set Status = '{start}' where LocatNo = '{startLocat}';"); } if (!string.IsNullOrEmpty(end) || !string.IsNullOrEmpty(start)) { upt = DataFactory.SqlDataBase().ExecuteBySql(sqlString); } if (upt >= 1) { isTrue = true; } return isTrue; } catch (Exception ex) { throw ex; } } #endregion #region 申请储位 //申请储位(包含组托的信息) public WCSStorageLocat RequestLocation() { try { #region try { WCSStorageLocat locate = new WCSStorageLocat(); locate = GetLocateByRoadways(); return locate; } catch (Exception ex) { throw new Exception(ex.Message); } #endregion } catch (Exception e) { throw new Exception(e.Message); } } /// /// 申请储位(包含组托的信息) /// private WCSStorageLocat GetLocateByRoadways() { try { #region 入库分配规则 StringBuilder sqlString = new StringBuilder(); WCSStorageLocat locate = new WCSStorageLocat(); //string txt = !string.IsNullOrEmpty(roadway) ? $" and RoadwayNo = '{roadway}'" : ""; sqlString.Append("select RoadwayNo from WCSStorageLocat where IsDel = '0' and WareHouseNo = 'W01' group by RoadwayNo order by RoadwayNo"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count == 0) { return null; } else { for (int i = 0; i < dt.Rows.Count; i++) { locate = GetLocateByRoadway(dt.Rows[i]["RoadwayNo"].ToString()); if (locate != null) { break; } } } #endregion return locate; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 取当前巷最优位置 /// /// 巷道号 /// private WCSStorageLocat GetLocateByRoadway(string roadwayNo) { var str = "''"; StringBuilder sqlString = new StringBuilder(); //查询该巷道并且标志为正常的的储位 do { sqlString.Clear(); //var sql = $"select * from WCSStorageLocat where IsDel = 0 and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and LocatNo not in({str}) "; //sql += "order by "; //sql += "Row , Depth desc, "; sqlString.Append($"select * from WCSStorageLocat where IsDel = 0 and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and LocatNo not in({str}) order by Row , Depth desc"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); List list = (List)DataTableHelper.DataTableToIList(dt); if (dt != null || dt.Rows.Count >= 1) { foreach (var item in list) { var isOk = LocateIsOk(item); if (isOk) { return item; } else { if (str.Length > 0) { str += ","; } str += $"'{item.LocatNo}'"; } } } else { return null; } } while (true); } public bool LocateIsOk(WCSStorageLocat model) { if (model.Depth == "01") { return true; } else { //获取深度为1的储位信息 StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select top 1 * from WCSStorageLocat where IsDel = '0' and [Row] = {model.Row} and [Column] = {model.Column} and Layer = {model.Layer} and Depth = '01' "); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); //var locate = db.Queryable().First(m => m.IsDel == "0" && m.LocateGroup == model.LocateGroup && m.Depth == "01"); if (dt == null || dt.Rows.Count == 0) { return false; } else { //前面储位状态为空且不能是损坏状态的 if (dt.Rows[0]["Status"].ToString() == "0" && dt.Rows[0]["Flag"].ToString() != "2") { return true; } else { return false; } } } } #endregion #region 标准版数据交互 /// /// 根据托盘号获取组盘信息 /// /// /// public DataRow GetWcsPalletBind(string palletNo) { try { //select Top 1 * from WCSPalletBind where PalletNo = 'T2300017' StringBuilder sqlString = new StringBuilder(); sqlString.Clear(); sqlString.Append("select Top 1 * from WCSPalletBind "); sqlString.Append($" where palletNo = '{palletNo}' "); sqlString.Append(" order by CreateTime desc "); DataRow aa = DataFactory.SqlDataBase().GetDataRowBySQL(sqlString); return aa; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 获取空托盘任务信息 /// /// 0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 任务取消 /// 0 入库任务 1 出库任务 2 移库任务 /// 批次号 /// public DataTable GetWCSSupallTasks(string status, string type, string lotNo = "") { bool bl = false; try { //获取空托盘入库任务 StringBuilder sqlString = new StringBuilder(); sqlString.Append("select top 1 * from WCSTasks "); sqlString.Append($"where Status = '{status}' and IsDel = '0' "); if (lotNo != "") { sqlString.Append($" and LotNo = '{lotNo}' "); } if (type != "") { sqlString.Append($" and Type = '{type}' "); } sqlString.Append(" and StartRoadway != '' order by Levels desc,CreateTime asc; "); var taskList = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); //获取数据后清空sqlString sqlString.Clear(); //修改空托盘入库任务改为出库任务 sqlString.Append($"Update WCSTasks set Type);"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { bl = true; return taskList; } return null; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 获取指定入口货物信息 /// /// 入库口 /// public DataTable GetWCSConveyorInfo(string conveyor = "") { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select * from WCSConveyorInfo "); sqlString.Append("where Status = '1' and IsDel = '0' and isEndLot = '0' "); if (!string.IsNullOrWhiteSpace(conveyor)) { sqlString.Append($" and Conveyor = '{conveyor}';"); } return DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "系统错误:"); } return null; } /// /// 存储托盘组托信息 /// /// 组托信息 /// true:成功 false:失败 public bool AddWCSPalletBind(WCSPalletBind model) { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append(@"INSERT INTO WCSPalletBind ( LocatNo , PalletNo , SkuQty , SkuWeight , Status , ErrorMsg , TaskType , SkuType , SubPallet , LotNo , LotText , SupplierLot , IsBale , IsBelt ) VALUES ("); sqlString.Append($"'{model.LocatNo}','{model.PalletNo}','{model.SkuQty}','{model.SkuWeight}','{model.Status}',"); sqlString.Append($"'{model.ErrorMsg}','{model.TaskType}','{model.SkuType}','{model.SubPallet}','{model.LotNo}',"); sqlString.Append($"'{model.LotText}','{model.SupplierLot}','{model.IsBale}','{model.IsBelt}');"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { bl = true; } } catch (Exception ex) { // 记录日志文件 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "SetWCSPalletBind存储组盘信息失败"); return bl; } return bl; } /// /// 调用WMS接口获取储位地址 /// /// 托盘号 /// 组盘信息 /// 目标工位号(取货工位) /// 返回wms反馈的信息 public string GetLocation(string palletNo, WCSPalletBind model, ref string endLocat) { try { string returnStr = ""; StringBuilder sqlString = new StringBuilder(); // 先判断此托盘的任务是否已生成任务 sqlString.Append("select * from WCSTasks where Status in ('0','1') and Type = '0' "); sqlString.Append($"and PalletNo = '{palletNo}' and isdel = '0';"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count <= 0) { string json = JsonConvert.SerializeObject(model); var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.130:8081/api/DownAPi/RequestLocation", json); ResponseTasks taskModels = JsonConvert.DeserializeObject(response); //Logger logger = LogManager.GetCurrentClassLogger(); //logger.Error("申请储位原因:", response); if (taskModels.Success == "0") { // 永远只返回一条信息,因为是集合所以用循环插入写法; DALWMSApi dal = new DALWMSApi(); WCSTasks task = taskModels.TaskList; // 添加任务信息 task.StartLocate = model.StationNum; task.LotNo = model.LotNo; task.SupplierLot = model.SupplierLot; task.PalletType = model.SubPallet == "0" ? "0" : "1"; WCSResultModel result = dal.AddWcsTask(task); if (result.stateCode == "1") { endLocat = task.EndRoadway; returnStr = "托盘号:" + palletNo + "\n" + "储位地址:" + task.EndLocate + "\n"; // 插入组托信息 this.AddWCSPalletBind(model); // 插入任务明细表 WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); tasksMonitor.TaskNo = task.TaskNo; tasksMonitor.PlcId = int.Parse(model.PlcId); tasksMonitor.PlcName = model.StationNum; tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = "向WMS申请储位信息成功"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = task.EndLocate; tasksMonitor.Status = "2"; // 执行完成 this.AddWCSTasksMonitor(tasksMonitor); } else { returnStr = "-1:" + result.errMsg; return returnStr; } } else { returnStr = "-1:" + taskModels.Message; return returnStr; } } else { endLocat = dt.Rows[0]["EndRoadway"].ToString(); } // 确定取货工位 switch (endLocat) { case "R11": endLocat = "2"; break; case "R12": endLocat = "6"; break; case "R13": endLocat = "10"; break; } // 记录日志文件 returnStr = endLocat; Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(returnStr, "申请储位"); return returnStr; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "程序异常:申请储位失败!"); throw ex; } } /// /// 调用WMS接口申请空托盘垛 /// /// 物料号 /// 送货工位号 /// public string GetSupperPalletLocation(string skuNo = "", string endLocat = "") { try { return ""; //string returnStr = ""; //StringBuilder sqlString = new StringBuilder(); //sqlString.Clear(); //string json = JsonConvert.SerializeObject(skuNo); //var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.130:8081/api/DownAPi/PalletLocation", json); ////var response = Utility.Extra.HttpHelper.DoPost("http://localhost:13243/api/DownAPi/PalletLocation", json); //var taskModels = JsonConvert.DeserializeObject(response); //if (taskModels.Success == "0") //{ // if (taskModels.Message == "任务已申请!") // { // return null; // } // // 永远只返回一条信息,因为是集合所以用循环插入写法; // DALWMSApi dal = new DALWMSApi(); // foreach (var item in taskModels.TaskList) // { // WCSTasks task = item; // //根据托盘号获取 // // 添加任务信息 // task.EndLocat = item.EndLocat != "" ? item.EndLocat : skuNo == "100099" ? "41" : skuNo == "100098" ? "23" : "33"; // task.LotNo = ""; // task.SupplierLot = ""; // task.PalletType = ""; // WCSResultModel result = dal.AddWcsTask(task); // if (result.stateCode == "1") // { // endLocat = task.EndRoadway; // returnStr = "托盘号:" + task.PalletNo + "\n" + "储位地址:" + task.StartLocat + "\n"; // // 插入任务明细表 // WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); // tasksMonitor.TaskNo = task.TaskNo; // tasksMonitor.PlcId = 0; // tasksMonitor.PlcName = ""; // tasksMonitor.StartLocat = task.StartLocat; // tasksMonitor.InteractiveMsg = "向WMS申请空托盘信息成功"; // tasksMonitor.PalletNo = task.PalletNo; // tasksMonitor.EndLocat = task.EndLocat; // tasksMonitor.Status = "2"; // 执行完成 // this.AddWCSTasksMonitor(tasksMonitor); // } // else // { // returnStr = "-1:" + result.errMsg; // return returnStr; // } // // 确定取货工位 // switch (task.StartRoadway) // { // case "R11": // endLocat = "3"; // break; // case "R12": // endLocat = "4"; // break; // case "R13": // endLocat = "11"; // break; // } // // 记录日志文件 // returnStr += "目标位置:" + endLocat + "\n"; // Logger logger = LogManager.GetCurrentClassLogger(); // logger.Error(returnStr, "申请空托盘"); // } // return returnStr; //} //else //{ // returnStr = "-1:" + taskModels.Message; // return returnStr; //} } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "程序异常:申请空托盘失败!"); throw ex; } } /// /// 获取报警基础信息 /// /// 报警信息基础表 public DataTable GetWcsAlarmInfo() { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select * from WCSAlarmInfo order by PlcIP;"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); return dt; } catch (Exception ex) { throw ex; } } #endregion #region 07版本,标准版弄好后删除 /// /// 获取未完成的任务自动 /// /// 任务状态0:未下发 1:已下发 3:已完成 /// 任务信息 public DataTable GetWmsTasks(string state, string taskType, string Palno = "") { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select top 1 * from TaskMonitor "); sqlString.Append("where State = '" + state + "' and Source = 'WMS' and IsDel = '0' "); if (Palno != "") { sqlString.Append(" and Palno = '" + Palno + "' "); } sqlString.Append(" and taskType = '" + taskType + "' "); sqlString.Append(" order by PriorityLevel desc,CreateTime asc; "); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count == 0) { return null; } return dt; } catch (Exception ex) { throw ex; } } /// /// 根据出入库口获取正在执行的出入库任务 /// /// 通道口 /// in:入库 out:出库 /// true:不存在任务 false:存在任务 public bool GetTasks(string InitialAddre, string taskType) { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select * from TaskMonitor "); sqlString.Append("where State = '1' and Source = 'WMS' and IsDel = '0' "); sqlString.Append("and taskType = '" + taskType + "' and InitialAddre = '" + InitialAddre + "' "); sqlString.Append("order by PriorityLevel desc,CreateTime asc; "); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count == 0) { bl = true; } return bl; } catch (Exception ex) { throw ex; } } /// /// 创建任务 /// /// 任务表实体类 public int SetTaskMonitor(TaskMonitorDto taskModel) { try { int isSucceed = 0; StringBuilder sqlString = new StringBuilder(); sqlString.Append(@"INSERT INTO TaskMonitor(TaskNo,TaskType,InitialAddre , Palno, TargetAddre, State, IsSucceed, ErrorStr, PriorityLevel, Source , Demo, CreateTime, IsDel) values ('"); sqlString.Append(taskModel.TaskNo + "','" + taskModel.TaskType + "','" + taskModel.InitialAddre + "','"); sqlString.Append(taskModel.Palno + "','" + taskModel.TargetAddre + "',0,'0','0','0','WMS','',GETDATE(),'0')"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { return isSucceed; } else { return -1; } } catch (Exception ex) { throw ex; } } /// /// 更新任务状态 /// /// 托盘号 /// 任务状态 /// true:成功 flase:失败 public bool SetWmsTasks(string TrayCode, string StateValue) { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("Update TaskMonitor set State = '" + StateValue + "' where Palno = '" + TrayCode + "' and State != '3';"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { bl = true; } return bl; } catch (Exception ex) { throw ex; } } /// /// 获取报警基础信息 /// /// 报警信息基础表 public DataTable GetErrorInfor() { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select * from [CS_AlarmInfo] order by M;"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); return dt; } catch (Exception ex) { throw ex; } } /// /// 向报警表写入错误信息 /// public void SetErrorMessage(string errorType, string errorCode, string messageStr) { try { // State: 0=未处理 1=已处理 StringBuilder sqlString = new StringBuilder(); sqlString.Append("insert into CS_Alarm (Name,ErrorCode,AlarmName,State) "); sqlString.Append("VALUES ('" + errorType + "','" + errorCode + "','" + messageStr + "','0');"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); } catch (Exception ex) { throw ex; } } /// /// 判断当前报警信息是否已存在 /// /// MB点位 /// false:不存在 true:已存在 public bool GetErrorMessage(string errorCode) { bool bl = false; try { StringBuilder sqlString = new StringBuilder(); sqlString.Append("select count(*) from CS_Alarm where errorCode = '" + errorCode + "';"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt.Rows[0][0].ToString() != "0") { bl = true; } return bl; } catch (Exception ex) { throw ex; } } /// /// 删除跺机和运输线所有报警信息 /// public void DelErrorMessage() { try { // State: 0=未处理 1=已处理 StringBuilder sqlString = new StringBuilder(); sqlString.Append("delete from CS_Alarm;"); DataFactory.SqlDataBase().ExecuteBySql(sqlString); } catch (Exception ex) { throw ex; } } /// /// 通知wms任务完成 /// /// 托盘号 /// 储位地址 /// 任务类型 1 入库任务 2:出库任务 public void WcsinWms(string palNo, string locationCode, string taskType) { try { string returnStr = ""; DALWMSApi api = new DALWMSApi(); var LocationModel = new ApiLocationModel(); if (taskType == "1") { // 入库完成 LocationModel = api.PutStorage(palNo, locationCode); } else { // 出库完成 LocationModel = api.OutStorage(palNo, locationCode); } if (LocationModel.Code == "01") { returnStr = "托盘号:'" + palNo + "'任务完成"; } else { this.SetErrorMessage(LocationModel.OutMode, LocationModel.Code, palNo + "任务失败!"); returnStr = "托盘号:'" + palNo + "'任务失败"; //switch (LocationModel.Code) //{ // case "-11": returnStr = palNo + ":-11参数错误!"; break; // case "-101": returnStr = palNo + ":-101无组盘信息!"; break; // case "-102": returnStr = palNo + ":-102非仓库托盘"; break; // default: break; //} } } catch (Exception ex) { throw ex; } } /// /// 调用WMS接口获取储位地址 /// /// 托盘号 /// 返回wms反馈的信息 public string GetLocation(string palNo, string height, string inPort) { try { string returnStr = ""; // 向WMS申请储位 LocationInfo location = new LocationInfo(); location.palNo = palNo; location.height = int.Parse(height); string json = JsonConvert.SerializeObject(location); DALWMSApi api = new DALWMSApi(); var LocationModel = api.GetLocation(palNo, int.Parse(height)); // Liudl 2022-12-31 Edit 接口调用改为程序内部调用 //var response = Utility.Extra.HttpHelper.DoPost("192.168.1.35:57061/api/WMSApi/getLocation", json); //ApiLocationModel LocationModel = JsonConvert.DeserializeObject(response); // 判断储位是否申请成功 01:成功 -11:参数错误 -101:没有组盘信息 -102:没有此托盘 if (LocationModel.Code == "01") { // 生成入库任务,插入任务表 TaskMonitorDto taskModel = new TaskMonitorDto(); taskModel.TaskNo = "in"; taskModel.TaskType = "in"; taskModel.InitialAddre = inPort; taskModel.Palno = palNo; taskModel.TargetAddre = LocationModel.LocationCode; taskModel.State = "0"; taskModel.IsSucceed = LocationModel.Code; taskModel.ErrorStr = LocationModel.OutMode; taskModel.PriorityLevel = 0; taskModel.Source = "WMS"; taskModel.IsDel = 0; this.SetTaskMonitor(taskModel); returnStr = "托盘号:'" + palNo + "'申请储位成功,储位地址为:'" + LocationModel.LocationCode + "'"; } else { // 向led屏幕插入信息 Liudl 未完成 // 插入报警信息 this.SetErrorMessage(LocationModel.OutMode, LocationModel.Code, palNo + "申请储位地址失败!"); switch (LocationModel.Code) { case "-11": returnStr = palNo + ":-S11参数错误!"; break; case "-101": returnStr = palNo + ":-S101无组盘信息!"; break; case "-102": returnStr = palNo + ":-S102非仓库托盘"; break; default: break; } } // 记录日志文件 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(returnStr, "申请储位"); return returnStr; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "程序异常:申请储位失败!"); throw ex; } } /// /// 判断此托盘是否已分配任务 /// /// 托盘号 /// public string IsTaskMonitor(string palNo) { string Location = ""; try { StringBuilder strSQL = new StringBuilder(); strSQL.Append($"select TargetAddre from TaskMonitor where Palno ='{palNo}' and TaskType = 'in' and IsDel = '0' and State <> '3';"); DataTable dtI = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL); if (dtI != null && dtI.Rows.Count > 0) { Location = "托盘号:'" + palNo + "'申请储位成功,储位地址为:'" + dtI.Rows[0]["TargetAddre"] + "'"; } return Location; } catch (Exception ex) { throw ex; } } #endregion #region 分拣方法 /// /// 查询任务是否绑定并获取分道 /// /// 条码信息 /// public string GetBarcodeAndRoute(string barcode) { StringBuilder sqlString = new StringBuilder(); try { sqlString.Append($"select * from WCSBoxInfo where BoxNo = '{barcode}' ;"); DataRow row = DataFactory.SqlDataBase().GetDataRowBySQL(sqlString); //已获取箱支关系 if (row != null) { sqlString.Clear(); DataTable dt2 = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); var SkuNo = dt2.Rows[0]["SkuNo"].ToString(); var LotNo = dt2.Rows[0]["LotNo"].ToString(); var SkuName = dt2.Rows[0]["SkuName"].ToString(); var EndLotFlag = dt2.Rows[0]["EndLotFlag"].ToString(); //结批标识0:未结批,1:已结批 //更改分拣任务状态为预结批 if (EndLotFlag == "1") { sqlString.Clear(); sqlString.Append($"update WCSPickLinoBind set IDState = '2' where SkuNo = '{SkuNo}' and LotNo = '{LotNo}';"); int count = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (count == 0) { return "4"; } } sqlString.Append($"select * from WCSPickLinoBind where SkuNo = '{SkuNo}' and LotNo = '{LotNo}' and IDState = '1' ;"); int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); //箱码已绑定 if (rowCount >= 1) { //下发分道信息(预留:在同一种物料绑定多个通道时,通过随机数,随机分配物料已绑定的道号) //PS:需要和PLC确定访问方式,分配完成后是否需要清空扫码仪缓存位,如果不清空,则需要在 //WcsBoxInfo表中添加“已分配状态”,用来控制每次的分道号和上次分配的是一样的 DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); int[] array = new int[rowCount]; for (int j = 0; j < rowCount; j++) { array[j] = int.Parse(dt.Rows[j]["LineDao"].ToString()); } Random random = new Random(); int randomIndex = random.Next(0, array.Length); int randomElement = array[randomIndex]; Console.WriteLine("随机取出的分道为: " + randomElement); //给PLC下发道号码垛规则等信息 string lineDao = randomElement.ToString(); PickLinoBind LineInfo = new PickLinoBind(); LineInfo.Chang = dt.Rows[randomElement]["Chang"].ToString(); LineInfo.Kuan = dt.Rows[randomElement]["Kuan"].ToString(); LineInfo.Gao = dt.Rows[randomElement]["Gao"].ToString(); //通过PLC提供的地址写入 //写入……… return "0"; } //箱码未绑定 else { //自动绑定分道,并下发给PLC道号 sqlString.Clear(); sqlString.Append($"select * from WCSPickLino where PickType = 0 and Picked < '4' and IDState =0 ;"); rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount >= 1)//有可分配的码垛工位 { //获取码垛规则 StringBuilder skuSql = new StringBuilder(); skuSql.Append($"select * from WCSMaterialRules where SkuNo = '{SkuNo}' and IsDel = '0' ;"); DataTable sku = DataFactory.SqlDataBase().GetDataTableBySQL(skuSql); if (sku == null || sku.Rows.Count == 0) { return "1";//未获取到该品种码垛规则,需要人工维护 } //创建到PickLindBind表该物料的绑定任务 DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); //查找可用道号 int[] array = { 1, 2, 3, 4 }; StringBuilder LineDao = new StringBuilder(); LineDao.Append($"select * from WCSPickLinoBind where " + $"PickLinoID = {int.Parse(dt.Rows[0]["ID"].ToString())} and LineDao = {""}"); DataTable dt1 = DataFactory.SqlDataBase().GetDataTableBySQL(skuSql); PickLinoBind locat = new PickLinoBind() { PickLinoID = int.Parse(dt.Rows[0]["ID"].ToString()), TaskNo = "固定值,测试", Type = "固定值,测试", LotNo = LotNo, SkuNo = SkuNo, SkuName = SkuName, Chang = sku.Rows[0]["Chang"].ToString(),//……需要修改通过物料 Kuan = sku.Rows[0]["Kuan"].ToString(), Gao = sku.Rows[0]["Gao"].ToString(), AddTime = DateTime.Parse(DateTime.Now.ToString()), IDState = "1", LineDao = dt1.Rows[0]["LineDao"].ToString(), Level = "1", }; //将locat insert到pickLinoBind中 // 插入任务明细表 sqlString.Clear(); sqlString.Append(@"INSERT INTO WCSPickLinoBind ( PickLinoID , TaskNo , Type , LotNo , SkuNo , SkuName , Chang,Kuan,Gao,AddTime,IDState,LineDao,Level) VALUES ("); sqlString.Append($"{locat.PickLinoID},{locat.TaskNo},'{locat.Type}','{locat.LotNo}','{locat.SkuNo}',"); sqlString.Append($"'{locat.SkuName}','{locat.Chang}','{locat.Kuan}','{locat.Gao}',{locat.AddTime},"); sqlString.Append($"'1','{locat.LineDao}','1');"); rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (rowCount > 0) { //给PLC下发道号码垛规则等信息 string lineDao = locat.LineDao; PickLinoBind LineInfo = new PickLinoBind(); LineInfo.Chang = locat.Chang; LineInfo.Kuan = locat.Kuan; LineInfo.Gao = locat.Gao; //通过PLC提供的地址写入 //写入……… return "0"; } else { return "3"; } } else//码垛工位已满,不分配 { return "2"; } } } //未获取箱支关系 else { //未获取到箱码信息,调用赋码系统接口程序获取箱信息,并将箱信息写入WCSPickLinoBind表中 WcsBoxInfo BoxInfo = new WcsBoxInfo(); BoxInfo = GetBoxInfo(barcode); return "5"; } } catch (Exception ex) { throw ex; } } /// /// 机器人请求插码 /// /// 任务信息 /// public string GetBarcodeIN(string barcode, string palletNo) { StringBuilder sqlString = new StringBuilder(); try { if (palletNo.Length > 8) { return "1";//托盘号错误 } if (CheckBarcodeRepeat(barcode)) { return "2";//箱码重复 } //允许插码,更改箱支关系表中此箱码Aflag状态为2 sqlString.Append($"UPDATE WCSBoxInfo set Aflag = '2' where BoxNo = '{barcode}' and Aflag = '1' and Status = '0';"); int IsUptLocate = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (IsUptLocate == 1) { return "0"; } else { return "3";//修改插码状态失败 } } catch (Exception) { throw; } } public bool CheckBarcodeRepeat(string barcode) { try { StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select * from WCSBoxInfo where BoxNo = '{barcode}' and Aflag in ('0','2');");//查找当前箱码是否 0:未分道或 2:已插码 DataRow row = DataFactory.SqlDataBase().GetDataRowBySQL(sqlString); if (row == null) { return false; } return true; } catch (Exception ex) { throw ex; } } /// /// 组盘 /// /// 任务信息 /// public bool GroupPallno(string stationNum, string palletNo) { bool T = false; StringBuilder sqlString = new StringBuilder(); try { sqlString.Append($"select * form WCSPickLinoBind where LineDao = '{stationNum}'"); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); var Sku = dt.Rows[0]["Sku"].ToString(); var LotNo = dt.Rows[0]["LotNo"].ToString(); //判断箱支表已插码未组盘的当前托盘号箱信息 sqlString.Clear(); sqlString.Append($"select * from WCSBoxInfo where Sku = '{Sku}' and LotNo = '{LotNo}'" + $" and PalletNo = '{palletNo}' and Aflag = '2'"); DataTable dt1 = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt1.Rows.Count == 0) { return T;//空托盘不需要组盘 } //提交组盘信息…… foreach (var item in dt1.Rows) { //提交当前托盘上的箱支关系 if (GroupBoxInfo(palletNo)) { //提交成功后更改组盘状态 sqlString.Clear(); sqlString.Append($"UPDATE WCSBoxInfo set Status = '1' where Sku = '{Sku}' and LotNo = '{LotNo}'" + $" and PalletNo = '{palletNo}' and Aflag = '2'"); int count = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (count == 0) { return T;//修改组盘状态失败 } T = true; } } return T; } catch (Exception ex) { throw ex; } } /// /// 向WMS提交组盘信息 /// /// /// public bool GroupBoxInfo(string palletNo) { try { //获取是否存在当前箱码信息 StringBuilder sqlString = new StringBuilder(); sqlString.Append($"select * from WcsBoxInfo where IsDel = '0' and PalletNo = '{palletNo}' "); DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sqlString); if (dt == null || dt.Rows.Count == 0) { //调用WMS系统 var response = Utility.Extra.HttpHelper.DoPost(DataFactory.GetWmsURL() + "/api/DownAPi/RequestLocation", palletNo); WcsBoxInfo boxInfo = JsonConvert.DeserializeObject(response); //添加箱码信息 sqlString.Clear(); sqlString.Append("insert into WcsBoxInfo (OrderCode,Line_No,LineDao,PORT,BoxNo,BoxNo2,BoxNo3,PalletNo,Qty,FullQty,Aflag,Status,SkuNo,SkuName,LotNo,LotText,Custom,CustomName,ProductionTime,ExpirationTime,CompleteTime,InspectMark,BitBoxMark,Standard,PackageStandard,StoreTime,QtyCount,QtyOrd,Opuser,IsDel,CreateTime,CreateUser,UpdateTime,UpdateUser)"); sqlString.Append($"Values ('{boxInfo.OrderCode}','{boxInfo.Line_No}','{boxInfo.LineDao}','{boxInfo.PORT}','{boxInfo.BoxNo}','{boxInfo.BoxNo2}','{boxInfo.BoxNo3}','','{boxInfo.Qty}','{boxInfo.FullQty}','{boxInfo.Aflag}','{boxInfo.Status}','{boxInfo.SkuNo}','{boxInfo.SkuName}','{boxInfo.LotNo}','{boxInfo.LotText}','{boxInfo.Custom}','{boxInfo.CustomName}','{boxInfo.ProductionTime}','{boxInfo.ExpirationTime}','{boxInfo.CompleteTime}','{boxInfo.InspectMark}','{boxInfo.BitBoxMark}','{boxInfo.Standard}','{boxInfo.PackageStandard}','{boxInfo.StoreTime}','{boxInfo.QtyCount}','{boxInfo.QtyOrd}','{boxInfo.Opuser}','0',getdate(),null,null,null)"); int isAdd = DataFactory.SqlDataBase().ExecuteBySql(sqlString); if (isAdd == 1) { return true; } else { return false; } } else { return false; } } catch (Exception ex) { throw ex; } } #endregion } /// /// 返回wms实体类 /// public class ExportLibraryDto { /// /// 任务号 /// public string TaskNo { get; set; } /// /// 任务类型 /// public string TaskType { get; set; } /// /// 托盘编码 /// public string StockCode { get; set; } /// /// 储位编码 /// public string SlotCode { get; set; } /// /// 目标地址(可能是仓库口、可能是移库后的储位) /// public string TargetPosition { get; set; } /// /// 托盘要经过的巷道口 /// public string LaneWayPosition { get; set; } /// /// 目标储位经过的巷道口 /// public string TargetLaneWayPosition { get; set; } public int Order { get; set; } } /// /// 任务监控实体类 /// public class TaskMonitorDto { /// /// 任务号 /// public string TaskNo { get; set; } /// /// 任务类型 /// public string TaskType { get; set; } /// /// 托盘编码 /// public string Palno { get; set; } /// /// 起始地址 /// public string InitialAddre { get; set; } /// /// 目标地址 /// public string TargetAddre { get; set; } /// /// 状态 01等待 02进行中 03已完成 /// public string State { get; set; } /// /// 是否成功 /// public string IsSucceed { get; set; } /// /// 错误信息 /// public string ErrorStr { get; set; } /// /// 优先级 /// public int? PriorityLevel { get; set; } /// /// 来源 /// public string Source { get; set; } /// /// 是否成功 /// public string Demo { get; set; } /// /// 是否删除 /// public int? IsDel { get; set; } } /// /// 申请储位实体类 /// public class LocationInfo { /// /// 托盘号 /// public string palNo { get; set; } /// /// 高度 /// public int height { get; set; } } }