using Newtonsoft.Json; using NongFuWebApi.Services; using NongFuWebApi.Controllers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using static NongFuWebApi.Controllers.AMSModel; using System.Configuration; namespace NongFuWebApi.Models { public class ApiHelper { private static HttpHelper httpHelper = new HttpHelper(); static string url = ConfigurationManager.AppSettings["WMSUrl"].ToString(); #region 靖宇接口方法 /// /// 工单信息获取接口 /// /// /// internal static SimpleResultModel WorkInfo(TASK_WorkInfoModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; try { var db = new SqlHelper().GetInstance(); var workInfo = db.Queryable().Where(a => a.S_WorkNo == model.WorkNo).First(); //bool req = false; //查询执行中或者处于暂停的 当前产线工单 //如果不存在,即插入工单表数据信息,默认执行中 //反之,判断当前是否为 结束工单,如果是,更新结束时间,反之,返回工单已存在 //WorkState 1-新建 2-完成 if (workInfo == null && model.WorkState == "1") { //如果物料名称用物料表物料名称,查询物料表物料名称 var iteminfo = db.Queryable().Where(a => a.S_ITEM_CODE == model.MaterialCode).First(); if (iteminfo != null) { model.ItemCode = iteminfo.S_ITEM_NAME; } WorkOrder1 wmsTask = new WorkOrder1() { S_WorkNo = model.WorkNo, S_PLineNo = model.DeviceName, // SQL_UsingNo = "N", S_ORDER_TYPE = "产线下线", S_ItemCode = model.MaterialCode, SQL_ItemName = model.ItemCode, S_WorkState = "新建", withCode = "是", S_Modify = model.WorkTime, // MaterialCode = model.MaterialCode }; TaskHelper.JingYuInsertWork(wmsTask); result.success = true; result.errMsg = $"工单信息接收成功,工单已创建!"; string deviceName = model.DeviceName; //SendPlcWorkState(deviceName); } else if (workInfo != null && model.WorkState == "2") { if (!workInfo.S_WorkState.Trim().Contains("完成")) { TaskHelper.UpdateStatus1(workInfo, "已完成", model.WorkTime); result.success = true; result.errMsg = $"工单信息接收成功,工单已完成!"; string deviceName = model.DeviceName; //SendPlcWorkState(deviceName, false); } else result.errMsg = $"工单信息接收成功,工单已完成!"; } else if (workInfo != null && model.WorkState == "1") result.errMsg = $"当前工单已存在。工单号:{workInfo.S_WorkNo},产线号:{model.DeviceName}"; } catch (Exception ex) { result.errMsg = $"工单信息接收异常:{ex.Message}"; } return result; } /// /// 富勒托盘 带更改托盘码的托盘信息下发方法 /// /// /// internal static SimpleResultModel SendTrayCode(SendTrayCodeModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; var db = new SqlHelper().GetInstance(); string msg = ""; try { model.TrayInfo.ForEach(a => { /* 富勒更新异常托盘流程 * 1.替换码必定有值 * 2.如果存在原码: * a.中间表有数据,直接使用 替换码 替换中间表 原码 托盘数据 --OVER * b.中间表,托盘物料表 均无 原码 数据,则 使用托盘码插入数据 --OVER * c.中间表无数据,托盘物料表有 原码 数据,则表示,当前托盘已经生成任务, * 直接替换 任务表,托盘物料表数据 备注:如果 货位托盘表 存在数据,则需要一并替换 --OVER * 3.如果不存在原码: * a.直接使用 替换码 插入中间表 数据 --OVER * **/ var trayInfo = TaskHelper.GetJingYuTrayInfo(a.trayCode, a.trayNum); if (trayInfo == null) { string TrayCode = string.IsNullOrEmpty(a.trayCode) ? a.sign : a.trayCode; if (!string.IsNullOrEmpty(a.sign) && !string.IsNullOrEmpty(a.trayCode)) { //中间表无数据,判断托盘物料表 var trayItemTable = db.Queryable().Where(it => it.S_CNTR_CODE == a.trayCode).First(); if (trayItemTable != null) { //存在数据--更新相关任务数据以及当前托盘物料数据 trayItemTable.S_CNTR_CODE = a.sign; var taskInfo = db.Queryable().Where(it => it.S_CNTRS.Contains(a.trayCode)).OrderByDescending(it => it.T_CREATE).First(); if (taskInfo != null) { string cntrs = taskInfo.S_CNTRS.Replace(a.trayCode, a.sign); taskInfo.S_CNTRS = cntrs; db.Updateable(trayItemTable).WhereColumns(it => new { it.S_ID }).UpdateColumns(it => new { it.S_CNTR_CODE }).ExecuteCommand(); db.Updateable(taskInfo).UpdateColumns(b => new { b.S_CNTRS }).ExecuteCommand(); // UpdateScreenTable(a, db);//更新 屏幕显示表 托盘数据 msg = msg + $"更新托盘数据成功:已同步任务以及托盘物料表相关更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; var locTrayInfo = db.Queryable().Where(it => it.S_CNTR_CODE == a.trayCode).First(); if (locTrayInfo != null) { locTrayInfo.S_CNTR_CODE = a.sign; db.Updateable(locTrayInfo).UpdateColumns(b => new { b.S_CNTR_CODE }).ExecuteCommand(); } result.success = true; } } else { TaskHelper.InsertTrayCodeJy(a, a.sign, a.deviceName, db, ref msg);//不存在数据--插入中间表数据 msg = msg + $"更新托盘数据异常:当前 托盘物料表不存在此托盘信息,直接插入中间表数据。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; } LogHelper.Info("SendTrayCode Dispose:更新托盘数据处理反馈:" + $"{msg}", "ThirdSystemLog"); } else { TaskHelper.InsertTrayCodeJy(a, TrayCode, a.deviceName, db, ref msg); result.success = true; result.errCode = 0; if (!string.IsNullOrEmpty(a.trayCode)) msg = msg + $"插入托盘数据成功:托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; else msg = msg + $"更新托盘数据成功:托盘号:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:处理托盘数据成功!" + $"托盘码:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } else { if (!string.IsNullOrEmpty(a.sign)) { trayInfo.workNo = a.workNo; trayInfo.trayCode = a.sign; trayInfo.trayNum = a.trayNum; trayInfo.batchNo = a.batchNo; trayInfo.trayRule = a.trayRule; trayInfo.itemLayer = a.itemLayer; db.Updateable(trayInfo).UpdateColumns(b => new { b.workNo, b.trayCode, b.trayNum, b.batchNo, b.trayRule, b.itemLayer }).ExecuteCommand(); var workInfo = db.Queryable().Where(b => b.S_PLineNo == a.deviceName && b.S_WorkNo == a.workNo).First(); if (workInfo != null) { workInfo.S_ItemLayer = a.itemLayer; db.Updateable(workInfo).UpdateColumns(b => new { b.S_ItemLayer }).ExecuteCommand(); } //UpdateScreenTable(a, db);//更新 屏幕显示表 托盘数据 result.success = true; msg = msg + $"更新托盘数据成功:托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据成功!" + $"托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};", "ThirdSystemLog"); } else { result.success = false; msg = msg + $"更新托盘数据失败:未传输替换码。托盘号:{a.trayCode},替换码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据失败!" + $"托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } }); result.errMsg = msg; } catch (Exception ex) { LogHelper.Error($"SendTrayCode Error:{ex.Message}", ex); } return result; } /// /// 人工分拣出库接口解绑托盘 /// /// /// internal static SimpleResultModel UnbindingTrayCode(UnbindingTrayCodeModel model) { var result = new SimpleResultModel { success = false, errCode = -1 }; string msg = ""; int n = 0; string locCode = ""; var db = new SqlHelper().GetInstance(); if (model.TrayInfo != null) { for (int i = 0; i < model.TrayInfo.Count(); i++) { string cntrCode = model.TrayInfo[i]; LogHelper.Info($"删除托盘{cntrCode}"); var trayInfo = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).First(); if (trayInfo != null) { locCode = trayInfo.S_LOC_CODE.Trim(); //排锁表操作 //if (!string.IsNullOrEmpty(locCode)) //{ // var locInfo = db.Queryable().Where(a => a.S_LOC_CODE == locCode).First(); // if (locInfo != null) // { // TaskHelper.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), false, false, true); // var Srow = db.Queryable().Where(a => a.N_ROW == locInfo.N_ROW.Trim() && a.S_AREA_CODE == locInfo.S_AREA_CODE.Trim()).First(); // if (Srow != null) // { // Srow.S_LOCK_STATE = "其他锁"; // db.Updateable(Srow).UpdateColumns(a => new { a.S_LOCK_STATE }).ExecuteCommand(); // } // } //} result.success = true; if (db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand() <= 0) { db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); } if (db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand() <= 0) { db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); } msg = msg + $"{n++}:当前托盘号:{model.TrayInfo[i]},解绑成功!"; } else { msg = msg + $"{n++}:当前托盘号:{model.TrayInfo[i]},不存在对应货位!"; } if (!string.IsNullOrEmpty(locCode)) { var locNum = db.Queryable().Where(a => a.S_LOC_CODE == locCode).ToList(); int num = 0; var locInfo = db.Queryable().Where(a => a.S_LOC_CODE == locCode).First(); if (locInfo != null) { RowLocLock(locInfo); locInfo.N_CURRENT_NUM = GetLocTrayNum(locNum, num); LogHelper.Info("UnbindingTrayCode Dispose:更新当前货位当前数量!" + $"货位编码:{locCode},数量:{locInfo.N_CURRENT_NUM}", "ThirdSystemLog"); db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand(); var locaHaveTray = db.Queryable().Where(a => a.N_ROW == locInfo.N_ROW.Trim() && a.N_CURRENT_NUM > 0).ToList(); if (locaHaveTray.Count == 0) TaskHelper.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), true, false, true); //else TaskController.Monitor.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), false); } } } } else { msg = $"人工分拣出库:富勒传输数据异常!传输为空值!"; } result.errMsg = msg; LogHelper.Info("UnbindingTrayCode Dispose:" + result.errMsg, "ThirdSystemLog"); return result; } /// /// 分拣出库锁定一排,托盘全部解绑完成解锁单个货位 /// /// /// private static void RowLocLock(Location loc) { var db = new SqlHelper().GetInstance(); if (loc.S_LOCK_STATE != "无") { var locNum = db.Queryable().Where(a => a.S_LOC_CODE == loc.S_LOC_CODE).ToList(); if (locNum.Count <= 0) { var loclist = db.Queryable().Where(a => a.S_AREA_CODE == loc.S_AREA_CODE && a.N_ROW == loc.N_ROW && a.N_CURRENT_NUM > 0).ToList(); if (loclist.Count > 1) { TaskHelper.UpdateLocStock(loc, "无"); } } } else { var loclist = db.Queryable().Where(a => a.S_AREA_CODE == loc.S_AREA_CODE && a.N_ROW == loc.N_ROW && a.N_CURRENT_NUM > 0).ToList(); if (loclist.Count > 0) { loclist.ForEach(a => { TaskHelper.UpdateLocStock(a, "出库锁"); }); } } } #endregion /// /// 工单信息获取接口 /// /// /// internal static SimpleResultModel WorkInfoCA(TASK_WorkInfoModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; try { var db = new SqlHelper().GetInstance(); var workInfo = db.Queryable().Where(a => a.SQL_WorkNo == model.WorkNo).First(); //bool req = false; //查询执行中或者处于暂停的 当前产线工单 //如果不存在,即插入工单表数据信息,默认执行中 //反之,判断当前是否为 结束工单,如果是,更新结束时间,反之,返回工单已存在 //WorkState 1-新建 2-完成 if (workInfo == null && model.WorkState == "1") { ChunAnWorkOrder wmsTask = new ChunAnWorkOrder() { SQL_WorkNo = model.WorkNo, SQL_PLineNo = model.DeviceName, SQL_UsingNo = "N", SQL_ORDER_TYPE = "产线下线", SQL_ItemCode = model.ItemCode, SQL_State = "新建", SQL_Modify = model.WorkTime, MaterialCode = model.MaterialCode }; TaskHelper.ChunAnInsertWork(wmsTask); result.success = true; result.errMsg = $"工单信息接收成功,工单已创建!"; string deviceName = model.DeviceName; SendPlcWorkState(deviceName); } else if (workInfo != null && model.WorkState == "2") { if (!workInfo.SQL_State.Trim().Contains("完成")) { TaskHelper.UpdateStatus(workInfo, "已完成", model.WorkTime); result.success = true; result.errMsg = $"工单信息接收成功,工单已完成!"; string deviceName = model.DeviceName; SendPlcWorkState(deviceName, false); } else result.errMsg = $"工单信息接收成功,工单已完成!"; } else if (workInfo != null && model.WorkState == "1") result.errMsg = $"当前工单已存在。工单号:{workInfo.SQL_WorkNo},产线号:{model.DeviceName}"; } catch (Exception ex) { result.errMsg = $"工单信息接收异常:{ex.Message}"; } return result; } /// /// 工单信息获取接口(标准工单模型) /// /// /// internal static SimpleResultModel WorkInfoStand(TASK_WorkInfoModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; try { var db = new SqlHelper().GetInstance(); var workInfo = db.Queryable().Where(a => a.S_WorkNo == model.WorkNo).First(); //bool req = false; //查询执行中或者处于暂停的 当前产线工单 //如果不存在,即插入工单表数据信息,默认执行中 //反之,判断当前是否为 结束工单,如果是,更新结束时间,反之,返回工单已存在 //WorkState 1-新建 2-完成 if (workInfo == null && model.WorkState == "1") { ConveryWorkOrder wmsTask = new ConveryWorkOrder() { S_WorkNo = model.WorkNo, S_PLineNo = model.DeviceName, S_ORDER_TYPE = "产线下线", S_ItemCode = model.MaterialCode, S_WorkState = "新建", T_MODIFY = DateTime.Parse(model.WorkTime) }; result.success = db.Insertable(wmsTask).ExecuteCommand() > 0; result.success = true; result.errMsg = $"工单信息接收成功,工单已创建!"; } else if (workInfo != null && model.WorkState == "2") { if (!workInfo.S_WorkState.Trim().Contains("完成")) { workInfo.S_WorkState = "已完成"; db.Updateable(workInfo).UpdateColumns(it => new { it.S_WorkState }).ExecuteCommand(); result.success = true; result.errMsg = $"工单信息接收成功,工单已完成!"; } else result.errMsg = $"工单信息接收成功,工单已完成!"; } else if (workInfo != null && model.WorkState == "1") result.errMsg = $"当前工单已存在。工单号:{workInfo.S_WorkNo},产线号:{model.DeviceName}"; } catch (Exception ex) { result.errMsg = $"工单信息接收异常:{ex.Message}"; } return result; } /// /// 向PLC发送工单开启或关闭状态 /// /// /// true-新建 false-完成 private static bool SendPlcWorkState(string deviceName, bool state = true) { bool result = false; string sendTcpMsg = ""; string deviceIP = ConfigurationManager.AppSettings[deviceName].ToString(); if (state) sendTcpMsg = "3F00300d0a"; else sendTcpMsg = "3F00400d0a"; if (!string.IsNullOrEmpty(sendTcpMsg) && !string.IsNullOrEmpty(deviceIP)) { var db = new SqlHelper().GetInstance(); var cacheData = db.Queryable().Where(a => a.DataSign == "TcpData" && a.Ext1 == deviceIP && a.Ext2 == sendTcpMsg).First(); if (cacheData == null) { ChunAnCacheData chunAnCacheData = new ChunAnCacheData { DataSign = "TcpData", Ext1 = deviceIP, Ext2 = sendTcpMsg }; result = db.Insertable(chunAnCacheData).ExecuteCommand() > 0; } } return result; } /// /// 生产下线托盘信息下发接口 /// /// /// #region 标准托盘信息下发方法 //internal static SimpleResultModel SendTrayCode(SendTrayCodeModel model) //{ // SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; // var db = new SqlHelper().GetInstance(); // string msg = ""; // try // { // model.TrayInfo.ForEach(a => // { // //托盘码唯一:已存在入库的托盘码不允许再插入中间表 // var trayAreaInfo = db.Queryable().Where(b => b.S_CNTR_CODE == a.trayCode).First(); // if (trayAreaInfo == null) // { // var trayInfo = TaskHelper.GetChunAnTrayInfo(a.trayCode, a.trayNum); // if (trayInfo == null) // { // if (!string.IsNullOrEmpty(a.sign)) // { // msg = msg + $"更新托盘数据失败:托盘已不存在。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; // LogHelper.Info("SendTrayCode Dispose:更新托盘数据失败!" + $"托盘已不存在。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};", "ThirdSystemLog"); // } // else // { // ChunAnTrayInfo ChunAnTrayInfo = new ChunAnTrayInfo() // { // deviceName = a.deviceName, // workNo = a.workNo, // trayCode = a.trayCode, // trayNum = a.trayNum, // dateTime = a.dateTime, // batchNo = a.batchNo, // trayRule = a.trayRule, // itemLayer = a.itemLayer // }; // TaskHelper.ChunAnInsertTrayInfo(ChunAnTrayInfo); // result.success = true; // result.errCode = 0; // msg = msg + $"插入托盘数据成功:托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; // LogHelper.Info("SendTrayCode Dispose:插入托盘数据成功!" + $"托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); // } // } // else // { // if (!string.IsNullOrEmpty(a.sign)) // { // trayInfo.workNo = a.workNo; // trayInfo.trayCode = a.sign; // trayInfo.trayNum = a.trayNum; // trayInfo.batchNo = a.batchNo; // trayInfo.trayRule = a.trayRule; // trayInfo.itemLayer = a.itemLayer; // db.Updateable(trayInfo).UpdateColumns(b => new { b.workNo, b.trayCode, b.trayNum, b.batchNo, b.trayRule, b.itemLayer }).ExecuteCommand(); // msg = msg + $"更新托盘数据成功:托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; // LogHelper.Info("SendTrayCode Dispose:更新托盘数据成功!" + $"托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};", "ThirdSystemLog"); // } // else // { // result.success = false; // msg = msg + $"插入托盘数据失败:托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; // LogHelper.Info("SendTrayCode Dispose:插入托盘数据失败!" + $"托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); // } // } // } // else // { // result.success = false; // msg = msg + $"插入托盘数据失败:托盘已存在。货位号:{trayAreaInfo.S_LOC_CODE.Trim()},托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; // LogHelper.Info("SendTrayCode Dispose:插入托盘数据失败!" + $"托盘已存在。货位号:{trayAreaInfo.S_LOC_CODE.Trim()},托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); // } // }); // result.errMsg = msg; // } // catch (Exception ex) // { // LogHelper.Error($"SendTrayCode Error:{ex.Message}", ex); // result.errMsg = ex.Message; // } // return result; //} #endregion #region 带更改托盘码的托盘信息下发方法 internal static SimpleResultModel SendTrayCodeCA(SendTrayCodeModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; var db = new SqlHelper().GetInstance(); string msg = ""; try { model.TrayInfo.ForEach(a => { /* 富勒更新异常托盘流程 * 1.替换码必定有值 * 2.如果存在原码: * a.中间表有数据,直接使用 替换码 替换中间表 原码 托盘数据 --OVER * b.中间表,托盘物料表 均无 原码 数据,则 使用托盘码插入数据 --OVER * c.中间表无数据,托盘物料表有 原码 数据,则表示,当前托盘已经生成任务, * 直接替换 任务表,托盘物料表数据 备注:如果 货位托盘表 存在数据,则需要一并替换 --OVER * 3.如果不存在原码: * a.直接使用 替换码 插入中间表 数据 --OVER * **/ var trayInfo = TaskHelper.GetChunAnTrayInfo(a.trayCode, a.trayNum); if (trayInfo == null) { string TrayCode = string.IsNullOrEmpty(a.trayCode) ? a.sign : a.trayCode; if (!string.IsNullOrEmpty(a.sign) && !string.IsNullOrEmpty(a.trayCode)) { //中间表无数据,判断托盘物料表 var trayItemTable = db.Queryable().Where(it => it.S_CNTR_CODE == a.trayCode).First(); if (trayItemTable != null) { //存在数据--更新相关任务数据以及当前托盘物料数据 trayItemTable.S_CNTR_CODE = a.sign; var taskInfo = db.Queryable().Where(it => it.S_CNTRS.Contains(a.trayCode)).OrderByDescending(it => it.T_CREATE).First(); if (taskInfo != null) { string cntrs = taskInfo.S_CNTRS.Replace(a.trayCode, a.sign); taskInfo.S_CNTRS = cntrs; db.Updateable(trayItemTable).WhereColumns(it => new { it.S_ID }).UpdateColumns(it => new { it.S_CNTR_CODE }).ExecuteCommand(); db.Updateable(taskInfo).UpdateColumns(b => new { b.S_CNTRS }).ExecuteCommand(); UpdateScreenTable(a, db);//更新 屏幕显示表 托盘数据 msg = msg + $"更新托盘数据成功:已同步任务以及托盘物料表相关更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; var locTrayInfo = db.Queryable().Where(it => it.S_CNTR_CODE == a.trayCode).First(); if (locTrayInfo != null) { locTrayInfo.S_CNTR_CODE = a.sign; db.Updateable(locTrayInfo).UpdateColumns(b => new { b.S_CNTR_CODE }).ExecuteCommand(); } result.success = true; } } else { TaskHelper.InsertTrayCode(a, a.sign, a.deviceName, db, ref msg);//不存在数据--插入中间表数据 msg = msg + $"更新托盘数据异常:当前 托盘物料表不存在此托盘信息,直接插入中间表数据。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; } LogHelper.Info("SendTrayCode Dispose:更新托盘数据处理反馈:" + $"{msg}", "ThirdSystemLog"); } else { TaskHelper.InsertTrayCode(a, TrayCode, a.deviceName, db, ref msg); result.success = true; result.errCode = 0; if (!string.IsNullOrEmpty(a.trayCode)) msg = msg + $"插入托盘数据成功:托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; else msg = msg + $"更新托盘数据成功:托盘号:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:处理托盘数据成功!" + $"托盘码:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } else { if (!string.IsNullOrEmpty(a.sign)) { trayInfo.workNo = a.workNo; trayInfo.trayCode = a.sign; trayInfo.trayNum = a.trayNum; trayInfo.batchNo = a.batchNo; trayInfo.trayRule = a.trayRule; trayInfo.itemLayer = a.itemLayer; db.Updateable(trayInfo).UpdateColumns(b => new { b.workNo, b.trayCode, b.trayNum, b.batchNo, b.trayRule, b.itemLayer }).ExecuteCommand(); UpdateScreenTable(a, db);//更新 屏幕显示表 托盘数据 result.success = true; msg = msg + $"更新托盘数据成功:托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据成功!" + $"托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};", "ThirdSystemLog"); } else { result.success = false; msg = msg + $"更新托盘数据失败:未传输替换码。托盘号:{a.trayCode},替换码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据失败!" + $"托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } }); result.errMsg = msg; } catch (Exception ex) { LogHelper.Error($"SendTrayCode Error:{ex.Message}", ex); } return result; } internal static SimpleResultModel SendTrayCodeStand(SendTrayCodeModel model) { SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 }; var db = new SqlHelper().GetInstance(); string msg = ""; try { model.TrayInfo.ForEach(a => { var trayInfo = db.Queryable().Where(it => it.trayCode == a.trayCode && it.trayNum == a.trayNum).First(); if (trayInfo == null) { // 如果富勒未传输托盘码,则将替换码作为托盘码使用 string TrayCode = string.IsNullOrEmpty(a.trayCode) ? a.sign : a.trayCode; if (!string.IsNullOrEmpty(a.sign) && !string.IsNullOrEmpty(a.trayCode)) { //调用WMS接口查询当前托盘是否已经入库,如果入库则传输托盘码给WMS;反之,则插入托盘中间表作为新托盘使用 string res = JsonConvert.SerializeObject(new { trayCode = a.trayCode }); string req = httpHelper.WebPost(url + "QueryTrayCode", res); msg = msg + $"调用WMS返回结果:入参:{res},回参:{req};"; if (!string.IsNullOrEmpty(req)) { var reqInfo = JsonConvert.DeserializeObject(req); if (reqInfo.success) { //调用WMS接口传输托盘数据 string res1 = JsonConvert.SerializeObject(new { deviceName = a.deviceName, workNo = a.workNo, trayCode = a.trayCode, trayNum = a.trayNum, dateTime = a.dateTime, batchNo = a.batchNo, trayRule = a.trayRule, itemLayer = a.itemLayer, sign = a.sign }); string req1 = httpHelper.WebPost(url + "SendTrayCode", res1); LogHelper.Info($"SendTrayCode WMSReq:{req1}", "ThirdSystemLog"); } else { SendTrayCodeStandInsertTrayData(a, result, db, trayInfo, TrayCode); msg = msg + $"更新托盘数据异常:当前 托盘物料表不存在此托盘信息,直接插入中间表数据。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; } } else { SendTrayCodeStandInsertTrayData(a, result, db, trayInfo, TrayCode); msg = msg + $"更新托盘数据异常:调用WMS查询托盘失败,直接插入中间表数据。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; } LogHelper.Info("SendTrayCode Dispose:更新托盘数据处理反馈:" + $"{msg}", "ThirdSystemLog"); } else { SendTrayCodeStandInsertTrayData(a, result, db, trayInfo, TrayCode); result.errCode = 0; if (!string.IsNullOrEmpty(a.trayCode)) msg = msg + $"插入托盘数据成功:托盘号:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; else msg = msg + $"更新托盘数据成功:托盘号:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:处理托盘数据成功!" + $"托盘码:{a.trayCode},更新码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } else { if (!string.IsNullOrEmpty(a.sign)) { trayInfo.workNo = a.workNo; trayInfo.trayCode = a.sign; trayInfo.trayNum = a.trayNum; trayInfo.batchNo = a.batchNo; trayInfo.trayRule = a.trayRule; trayInfo.itemLayer = a.itemLayer; db.Updateable(trayInfo).UpdateColumns(b => new { b.workNo, b.trayCode, b.trayNum, b.batchNo, b.trayRule, b.itemLayer }).ExecuteCommand(); result.success = true; msg = msg + $"更新托盘数据成功:托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据成功!" + $"托盘已更新。托盘号:{a.trayCode},更新托盘号:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};", "ThirdSystemLog"); } else { result.success = false; msg = msg + $"更新托盘数据失败:未传输替换码。托盘号:{a.trayCode},替换码:{a.sign},托盘数量:{a.trayNum},托盘时间:{a.dateTime};"; LogHelper.Info("SendTrayCode Dispose:更新托盘数据失败!" + $"托盘码:{a.trayCode},托盘数量:{a.trayNum},托盘时间:{a.dateTime}", "ThirdSystemLog"); } } }); result.errMsg = msg; } catch (Exception ex) { LogHelper.Error($"SendTrayCode Error:{ex.Message}", ex); } return result; } /// /// 梅坪-插入托盘数据 /// /// /// /// /// /// private static void SendTrayCodeStandInsertTrayData(TrayInfo a, SimpleResultModel result, SqlSugar.SqlSugarClient db, ChunAnTrayInfoTwo trayInfo, string TrayCode) { ChunAnTrayInfoTwo ChunAnTrayInfo = new ChunAnTrayInfoTwo() { deviceName = a.deviceName, workNo = a.workNo, trayCode = TrayCode, trayNum = a.trayNum, dateTime = a.dateTime, batchNo = a.batchNo, trayRule = a.trayRule, itemLayer = a.itemLayer }; result.success = db.Insertable(ChunAnTrayInfo).ExecuteCommand() > 0; } /// /// 更新屏幕表数据 /// /// /// private static void UpdateScreenTable(TrayInfo a, SqlSugar.SqlSugarClient db) #endregion { var screen = db.Queryable().Where(it => it.DataTypeNo == "托盘数据" && it.TrayCode == a.trayCode).First(); if (screen != null) { screen.TrayCode = a.sign; db.Updateable(screen).UpdateColumns(b => new { b.TrayCode }).ExecuteCommand(); } } /// /// 人工分拣出库接口解绑托盘 /// /// /// internal static SimpleResultModel UnbindingTrayCodeCA(UnbindingTrayCodeModel model) { var result = new SimpleResultModel { success = false, errCode = -1 }; string msg = ""; int n = 0; string locCode = ""; var db = new SqlHelper().GetInstance(); if (model.TrayInfo != null) { for (int i = 0; i < model.TrayInfo.Count(); i++) { string cntrCode = model.TrayInfo[i]; var trayInfo = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).First(); if (trayInfo != null) { locCode = trayInfo.S_LOC_CODE.Trim(); if (!string.IsNullOrEmpty(locCode)) { var locInfo = db.Queryable().Where(a => a.S_LOC_CODE == locCode).First(); if (locInfo != null) { TaskHelper.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), false, false, true); var Srow = db.Queryable().Where(a => a.N_ROW == locInfo.N_ROW.Trim() && a.S_AREA_CODE == locInfo.S_AREA_CODE.Trim()).First(); if (Srow != null) { Srow.S_LOCK_STATE = "其他锁"; db.Updateable(Srow).UpdateColumns(a => new { a.S_LOCK_STATE }).ExecuteCommand(); } } } result.success = true; db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); db.Deleteable(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); msg = msg + $"{n++}:当前托盘号:{model.TrayInfo[i]},解绑成功!"; } else msg = msg + $"{n++}:当前托盘号:{model.TrayInfo[i]},不存在对应货位!"; if (!string.IsNullOrEmpty(locCode)) { var locNum = db.Queryable().Where(a => a.S_LOC_CODE == locCode).ToList(); int num = 0; var locInfo = db.Queryable().Where(a => a.S_LOC_CODE == locCode).First(); if (locInfo != null) { locInfo.N_CURRENT_NUM = GetLocTrayNum(locNum, num); LogHelper.Info("UnbindingTrayCode Dispose:更新当前货位当前数量!" + $"货位编码:{locCode},数量:{locInfo.N_CURRENT_NUM}", "ThirdSystemLog"); db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand(); var locaHaveTray = db.Queryable().Where(a => a.N_ROW == locInfo.N_ROW.Trim() && a.N_CURRENT_NUM > 0).ToList(); if (locaHaveTray.Count == 0) TaskHelper.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), true, false, true); //else TaskController.Monitor.YiKuUnLockRow(db, locInfo.N_ROW.Trim(), locInfo.S_AREA_CODE.Trim(), false); } } } } else msg = $"人工分拣出库:富勒传输数据异常!传输为空值!"; result.errMsg = msg; LogHelper.Info("UnbindingTrayCode Dispose:" + result.errMsg, "ThirdSystemLog"); return result; } /// /// 人工分拣出库接口解绑托盘-梅坪项目(直接调用WMS接口传输数据) /// /// /// internal static SimpleResultModel UnbindingTrayCodeStand(UnbindingTrayCodeModel model) { var result = new SimpleResultModel { success = false, errCode = -1 }; string msg = ""; if (model.TrayInfo != null) { string res = JsonConvert.SerializeObject(new { TrayInfo = model.TrayInfo }); string req = httpHelper.WebPost(url + "UnbindingTrayCode", res); if (req.Contains("true")) result.success = true; LogHelper.Info($"UnbindingTrayCode WMSReq:{req}", "ThirdSystemLog"); } else msg = $"人工分拣出库:富勒传输数据异常!传输为空值!"; result.errMsg = msg; LogHelper.Info("UnbindingTrayCode Dispose:" + result.errMsg, "ThirdSystemLog"); return result; } private static int GetLocTrayNum(List locNum, int num) { int trayNum = locNum.Count(); switch (trayNum) { case 0: num = 0; break; case 1: num = 1; break; case 2: num = 1; break; case 3: num = 2; break; case 4: num = 2; break; } return num; } } }