using HH.WCS.QingXigongchang.device; using HH.WCS.QingXigongchang.process; using HH.WCS.QingXigongchang.util; using HH.WCS.QingXigongchang.wms; using Newtonsoft.Json; using NLog.Fluent; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.ConstrainedExecution; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using System.Web.Http; using System.Web.Security; using static HH.WCS.QingXigongchang.api.ApiModel; using static HH.WCS.QingXigongchang.dispatch.NDC; namespace HH.WCS.QingXigongchang.api { /// /// api接口辅助类 /// public class ApiHelper { static ApiHelper() { } /// /// 清洁空框位 /// /// /// internal static SimpleResult CleanReport(LocationModel model) { var result = new SimpleResult() { resultMsg = $"货位{model.location}清洁报工成功" }; //1\3\4 可清洁 var cntr = LocationHelper.GetLocCntr(model.location); if (cntr.Count > 0) { ContainerHelper.UpdateCntrState(new List { cntr[0].S_CNTR_CODE.Trim() }, "已清洁"); } else { result.resultCode = 1; result.resultMsg = $"货位{model.location}不存在,或者没有容器"; } LogHelper.Debug("CleanReport Response:" + JsonConvert.SerializeObject(result)); return result; } internal static SimpleResult ResetDevice(DeviceModel model) { var result = new SimpleResult(); var plc = Settings.GetDeviceInfoList().Where(a => a.deviceName == model.deviceName).FirstOrDefault(); if (plc != null) { if (model.order == 1) { if (PlcHelper.SendHex(plc.address, "3F00110d0a")) { Thread.Sleep(300); if (!PlcHelper.SendHex(plc.address, "3F00120d0a")) { result.resultCode = 3; result.resultMsg = "空托重置信号发送失败"; } } else { result.resultCode = 2; result.resultMsg = "满托重置信号发送失败"; } } else { if (PlcHelper.SendHex(plc.address, "3F00210d0a")) { Thread.Sleep(300); if (!PlcHelper.SendHex(plc.address, "3F00220d0a")) { result.resultCode = 3; result.resultMsg = "空托重置信号发送失败"; } } else { result.resultCode = 2; result.resultMsg = "满托重置信号发送失败"; } } } else { result.resultCode = 1; result.resultMsg = "设备不存在,请检查设备名称"; } return result; } internal static SimpleResult GetAREACount(string area) { var result = new SimpleResult(); var res = LocationHelper.GetLocList(x => x.S_AREA_CODE == area && x.N_CURRENT_NUM > 0); //var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1); result.resultCode = res.Count; result.resultMsg = $"库区{area} 满货位数量:{res.Count}"; return result; } [HttpGet] internal static SimpleResult clearloc(string area, List row) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || row.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{row}库区,排不可为空"; return result; } else { var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW)); if (loclist.FindAll(x => x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁").Count > 0) { result.resultCode = -1; result.resultMsg = $"库区{area},排{row} 中有任务锁定位置(可在可视化中查看),无法清理。"; return result; } var res = LocationHelper.DoAction(db => { foreach (var item in loclist) { if (item.S_LOCK_STATE == "报废") continue; item.N_CURRENT_NUM = 0; item.T_FULL_TIME = null; item.T_EMPTY_TIME = DateTime.Now; item.S_LOCK_STATE = "无"; db.Updateable(item).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME, it.S_LOCK_STATE }).ExecuteCommand(); db.Deleteable().Where(it => item.S_LOC_CODE == it.S_LOC_CODE).ExecuteCommand(); } return true; }); result.resultCode = 1; result.resultMsg = res ? $"排货位清理成功。" : $"排货位清理失败。"; } return result; } [HttpGet] internal static SimpleResult clearLoc(string area, List row) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || row.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{row}库区,排不可为空"; } else { //var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废"); var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x => { if (x.S_LOCK_STATE != "报废") x.S_LOCK_STATE = "空间锁"; }); if (res) { result.resultCode = 1; result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。"; } } return result; } [HttpGet] internal static SimpleResult unlockrow(string area, List row) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || row.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{row}库区,排不可为空"; } else { var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x => { if (x.S_LOCK_STATE == "空间锁") x.S_LOCK_STATE = "无"; }); if (res) { result.resultCode = 1; result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。"; } } return result; } internal static SimpleResult Outgo1(string area, List row) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || row.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{row}库区,排不可为空"; } else { var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x => { if (x.S_LOCK_STATE != "报废") x.S_LOCK_STATE = "空间锁"; }); //var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1); if (res) { result.resultCode = 1; result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。"; } } return result; } internal static SimpleResult Outgo2(string area, List row) { area = area.Trim(); var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || row.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{row}库区,排不可为空"; } else { var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_COL), x => { x.N_CURRENT_NUM = 0; x.T_FULL_TIME = null; x.T_EMPTY_TIME = null; x.S_LOCK_STATE = "无"; x.S_NOTE = ""; }, (ms, db) => { if (ms.Count > 0) try { db.BeginTran(); foreach (var item in ms) { if (item.S_LOCK_STATE == "报废") continue; var m_s = db.Queryable().Where(a => a.S_LOC_CODE == item.S_LOC_CODE.Trim()).ToList(); db.Deleteable(m_s).ExecuteCommand(); } db.Ado.CommitTran(); } catch (Exception ex) { LogHelper.Info("解锁排并清托盘失败:" + ex.Message); db.Ado.RollbackTran(); } }); //var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1); if (res) { result.resultCode = 1; result.resultMsg = res ? $"解锁排成功。并清空货位" : $"解锁排失败。"; } //var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 0); ///// 满框区域,解锁 。 清除满框 //if (res) //{ // if (area.Trim() == "1-3PPMK" || area.Trim() == "4-6PPMK") // { // LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && x.N_ROW == row, x => // { // x.S_AGV_SITE = ""; // }); // } //} //else //{ // result.resultCode = 2; // result.resultMsg = $"解锁排失败。"; //} } return result; } internal static SimpleResult _unOutgo3(string area, string loc, string arco) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || string.IsNullOrEmpty(loc)) { result.resultCode = 2; result.resultMsg = $"解绑库区,货位不可为空;"; } else { loc = loc.Trim().ToUpper(); result.resultCode = 1; //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); LocationHelper.DoAction(db => { var __loc = LocationHelper.GetLoc(loc); if (__loc != null && __loc.S_LOCK_STATE != "无") { result.resultMsg = $"货位锁定,不可解绑"; return false; } var models = db.Queryable().Where(x => x.S_LOC_CODE == loc.Trim()).ToList();// db.Queryable().Where(x); if (models.Count > 0) { //var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc.Trim(), S_CNTR_CODE = "1" }).ExecuteCommand(); var res = db.Deleteable().Where(x => x.S_LOC_CODE == loc.Trim()).ExecuteCommand(); LogHelper.Info("解绑托盘"); //重置货位。 - 如果解到 瓶坯机,那就是你操作失误。 LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x => { x.N_CURRENT_NUM = 0; x.T_FULL_TIME = null; }); result.resultMsg = $"解绑货位成功!"; } return true; }); } return result; } internal static SimpleResult unOutgo3(string area, string loc, string arco) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || string.IsNullOrEmpty(loc)) { result.resultCode = 2; result.resultMsg = $"解绑库区,货位不可为空;"; } else { loc = loc.Trim().ToUpper(); result.resultCode = 1; var locd = LocationHelper.GetLoc(loc); //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); var _locs = new List(); if (arco == "o") _locs.Add(locd); else if (arco == "r") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW); else if (arco == "c") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL); else if (arco == "a") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE); else { return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明"); } if (_locs.Find(x => x.S_LOCK_STATE != "无") != null) { result.resultMsg = $"货位锁定,不可解绑"; return result; } LocationHelper.DoAction(db => { //var models = db.Queryable().Where(x => x.S_LOC_CODE == loc.Trim()).ToList();// db.Queryable().Where(x); //if (models.Count > 0) //{ //var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc.Trim(), S_CNTR_CODE = "1" }).ExecuteCommand(); LogHelper.Info("解绑托盘"); db.Deleteable().Where(x => _locs.Select(xx => xx.S_LOC_CODE).Contains(x.S_LOC_CODE)).ExecuteCommand(); db.Updateable(_locs).ReSetValue(x => { x.N_CURRENT_NUM = 0; x.T_FULL_TIME = null; x.T_EMPTY_TIME = DateTime.Now; }).ExecuteCommand(); //重置货位。 - 如果解到 瓶坯机,那就是你操作失误。 //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x => //{ // x.N_CURRENT_NUM = 0; // x.T_FULL_TIME = null; //}); result.resultMsg = $"解绑货位成功!"; //} return true; }); } return result; } internal static SimpleResult Outgo3(string area, string SQL_UsingNow, string loc) { var result = new SimpleResult(); if (string.IsNullOrEmpty(loc)) { result.resultCode = 2; result.resultMsg = $"空框货位不可为空;"; } else { loc = loc.Trim().ToUpper(); var locd = LocationHelper.GetLoc(loc); var cntr = LocationHelper.GetLocCntrRel(loc); if (locd == null) { result.resultCode = -1; result.resultMsg = $"货位不存在。"; return result; } else if (locd.S_LOCK_STATE.Trim() != "无") { result.resultCode = -1; result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定"; return result; } else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY) { result.resultCode = 2; result.resultMsg = $"{loc} 满了。不能再绑了"; return result; } result.resultCode = 1; //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); LogHelper.Info("绑定托盘:" + loc); { var b = false; var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc.Trim())).FirstOrDefault(); if (plc != null) { if (plc.enable != 1) return new SimpleResult { resultCode = -1, resultMsg = plc.deviceName + "未启用。 先别绑定了!" }; if (plc.deviceType == 5 || plc.deviceType == 8) { b = true; } } LocationHelper.DoAction(db => { if (!b) { var models = db.Queryable().Where(x => x.S_LOC_CODE == loc).ToList();// db.Queryable().Where(x); if (models.Find(x => x.S_CNTR_CODE.Trim() == "1") == null) { if (models.Count() > 0) { db.Deleteable(models).ExecuteCommand(); } string ccccc = "C" + Settings.GetTimeStamp(); if ("$JCJYKK,JCJYMK".IndexOf(locd.S_AREA_CODE) > 0 || locd.S_AREA_CODE.Contains("JCJY")) ccccc = "J" + Settings.GetTimeStamp(); //JCJYMK 为了绑即产满框备用的。 var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = ccccc, S_TYPE = SQL_UsingNow }).ExecuteCommand(); //res = db.Insertable(new Container { S_CNTR_CODE = ccccc, S_DEST = "接口绑定", S_TYPE = SQL_UsingNow }).ExecuteCommand(); LogHelper.Info("瓶写托盘" + JsonConvert.SerializeObject(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = "1" })); } } else { //瓶盖机 if (plc.deviceType <= 3) if (string.IsNullOrEmpty(SQL_UsingNow)) { result.resultCode = 2; result.resultMsg = $"请选择空框是否即产?"; return false; } var cc = "F" + Settings.GetTimeStamp(); //if (workOrder.SQL_UsingNow.Trim() == "Y") bool __b__ = SQL_UsingNow.Trim().ToUpper() == "Y"; if (__b__) { cc = "J" + Settings.GetTimeStamp(); } var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cc }).ExecuteCommand() > 0; res = db.Insertable(new Container { S_CNTR_CODE = cc, S_DEST = "接口绑定", S_TYPE = (__b__ ? "即产托盘" : "非即产托盘") }).ExecuteCommand() > 0; LogHelper.Info(loc + "写托盘" + res + JsonConvert.SerializeObject(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cc })); } LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x => { if (b) x.N_CURRENT_NUM = 1; else x.N_CURRENT_NUM++; }); LocationHelper.SetT_FULL_TIME(loc.Trim(), DateTime.Now, (c, cc) => { if (c.deviceType == 8) { PlcHelper.SendHex(c.address, cc);//"3F00100d0a" result.resultMsg = $"{c.deviceName}{loc}绑定,清信号完成。"; } else if (c.deviceType == 5) { PlcHelper.SendHex(c.address, "3F00110d0a");//"3F00100d0a" result.resultMsg = $"{c.deviceName}{loc}绑定,清信号完成。"; } else { result.resultMsg = $"绑定完成。;"; } }); return true; }); } } lable_end: return result; } /// /// 清溪信号错误导致的问题拉扯 /// 瞎提绑定功能的沟通 开发。 /// /// 货位 /// 产线号 /// area, row,col,one /// internal static SimpleResult BindCp(string loc, string LineNo, string arco) { var result = new SimpleResult() { resultCode = 0, resultMsg = "" }; var workOrder = WCSHelper.GetWorkOrder(LineNo); if (workOrder == null) { LogHelper.Info(LineNo + "没有【执行中】的工单"); return SimpleResult.Error(LineNo + "没有【执行中】的工单"); } var _locs = new List(); var _loc = LocationHelper.GetLoc(loc); //"QX-02","QX-03","QX-04" if (!_loc.S_AREA_CODE.Contains("QX-"))//02") && !_loc.S_AREA_CODE.Contains("QX-03") && !_loc.S_AREA_CODE.Contains("QX-05") && !_loc.S_AREA_CODE.Contains("QX-04")) { return SimpleResult.Error(loc + " 货位 不属于成品区"); } if (arco == "o") _locs.Add(_loc); else if (arco == "r") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE && x.N_ROW == _loc.N_ROW); else if (arco == "c") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE && x.N_COL == _loc.N_COL); else if (arco == "a") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE); else { return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明"); } var size = workOrder.B_Type; var ItemName = workOrder.SQL_ItemName; var Batch = workOrder.SQL_BatchNo; //if(workOrder?.B_Type!= null) //{ //} if (string.IsNullOrEmpty(Batch)) { LogHelper.Info(LineNo + "没有设置批次,或该工单还没有执行过下线任务"); return SimpleResult.Error(LineNo + "没有设置批次,或该工单还没有执行过下线任务"); } if (string.IsNullOrEmpty(size)) { LogHelper.Info(LineNo + "工单 没有指定版型"); return SimpleResult.Error(LineNo + "没有指定版型"); } if (string.IsNullOrEmpty(ItemName)) { LogHelper.Info(LineNo + "工单 没有指定物料"); return SimpleResult.Error(LineNo + "没有指定物料"); } foreach (var item in _locs) { var cur = item.N_CURRENT_NUM; var cap = item.N_CAPACITY; while (cap - cur > 0) { cur++; var tp1 = Settings.TPnum(); var cntr = tp1 + "_1v" + tp1 + "_2"; LogHelper.Info("成品绑定 - " + cntr); LocationHelper.BindingLoc(item.S_LOC_CODE, new List { cntr }); var res = LocationHelper.DoAction(db => { db.Insertable(new CntrItemRel { S_CNTR_CODE = cntr, S_BATCH_NO = Batch, F_QTY = "" + 0, S_ITEM_CODE = ItemName }).ExecuteCommand(); return true; }); } } return result; } /// /// /// /// /// internal static SimpleResult Outgo31(string loc, string SQL_UsingNow, string arco) { switch (SQL_UsingNow) { case "1": SQL_UsingNow = "集化板"; break; case "2": SQL_UsingNow = "大板"; break; case "3": SQL_UsingNow = "小板"; break; case "4": SQL_UsingNow = "超托板/套板"; break; default: break; } var result = new SimpleResult(); if (string.IsNullOrEmpty(loc)) { result.resultCode = 2; result.resultMsg = $"空框货位不可为空;"; } else { var _locs = new List(); loc = loc.Trim().ToUpper(); var locd = LocationHelper.GetLoc(loc); var cntr = LocationHelper.GetLocCntrRel(loc); if (locd == null) { result.resultCode = -1; result.resultMsg = $"货位不存在。"; return result; } else if (locd.S_LOCK_STATE.Trim() != "无") { result.resultCode = -1; result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定"; return result; } else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY) { result.resultCode = -1; result.resultMsg = $"{loc} 满了。不能再绑了"; return result; } result.resultCode = 0; //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); LogHelper.Info("绑定成品空托盘:" + loc); if (arco == "o") _locs.Add(locd); else if (arco == "r") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW); else if (arco == "c") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL); else if (arco == "a") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE); else { return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明"); } { var row = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "报废"); //var rowloc = row.Find(x => x.S_LOCK_STATE != "无"); if (row.Any()) { result.resultCode = -1; result.resultMsg = $"所选区域{row.FirstOrDefault().S_LOC_CODE}排有{row.FirstOrDefault().S_LOCK_STATE}状态, 不能进行绑定"; return result; } LocationHelper.DoAction(db => { var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int li = 0; foreach (var __loc in _locs) { if (li >= s.Length) li = 0; string end = s[li].ToString(); db.Insertable(new LocCntrRel { S_LOC_CODE = __loc.S_LOC_CODE.Trim(), S_CNTR_CODE = "TP" + Settings.GetTimeStamp() + end, S_TYPE = SQL_UsingNow }).ExecuteCommand(); __loc.N_CURRENT_NUM++; if (__loc.N_CURRENT_NUM > __loc.N_CAPACITY) __loc.N_CURRENT_NUM = __loc.N_CAPACITY; __loc.T_FULL_TIME = DateTime.Now; db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand(); } return true; }); } } lable_end: return result; } /// /// /// /// /// internal static SimpleResult Outgo34(string loc, string SQL_UsingNow, string arco, string item, bool BindORUnbind = true) { var result = new SimpleResult(); if (string.IsNullOrEmpty(loc)) { result.resultCode = 2; result.resultMsg = $"货位不可为空;"; } else { var _locs = new List(); loc = loc.Trim().ToUpper(); var locd = LocationHelper.GetLoc(loc); var cntr = LocationHelper.GetLocCntrRel(loc); if (locd == null) { result.resultCode = -1; result.resultMsg = $"货位不存在。"; return result; } else if (locd.S_LOCK_STATE.Trim() != "无") { result.resultCode = -1; result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定"; return result; } else if (BindORUnbind) { if (arco == "o") { if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY) { result.resultCode = -1; result.resultMsg = $"{loc} 满了。不能再绑了"; return result; } } } else { if (arco == "o") { if (locd.N_CURRENT_NUM == 0) { result.resultCode = -1; result.resultMsg = $"{loc} 没货了。不能再解了"; return result; } } } if (!string.IsNullOrEmpty(item.Trim())) if (!"J,F".Contains(SQL_UsingNow) || String.IsNullOrEmpty(SQL_UsingNow)) { if (locd.S_AREA_CODE.StartsWith("PP")) { SQL_UsingNow = "F"; } else if (locd.S_AREA_CODE.Contains("JCJY")) { SQL_UsingNow = "J"; } else return SimpleResult.Error("指明 即产和非即产的参数 JF 没有明确" + SQL_UsingNow); } result.resultCode = 0; //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); LogHelper.Info("解绑定PP托盘:" + loc); if (arco == "o") _locs.Add(locd); else if (arco == "r") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW); else if (arco == "c") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL); else if (arco == "a") _locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE); else { return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明"); } { var row = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "报废"); //var rowloc = row.Find(x => x.S_LOCK_STATE != "无"); if (row.Any()) { result.resultCode = -1; result.resultMsg = $"所选区域{row.FirstOrDefault().S_LOC_CODE}排有{row.FirstOrDefault().S_LOCK_STATE}状态, 不能进行绑定"; return result; } if (BindORUnbind) { Location e = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。 if (e != null) { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.FirstOrDefault()?.S_TYPE != item) { LogHelper.Info($"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次绑定{item} 不符。 终止绑定"); result.resultCode = -1; result.resultMsg = $"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次绑定{item} 不符。 终止绑定"; return result; } } LocationHelper.DoAction(db => { var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int li = 0; foreach (var __loc in _locs) { if (__loc.N_CAPACITY <= __loc.N_CURRENT_NUM) continue; if (li >= s.Length) li = 0; string end = s[li].ToString(); db.Insertable(new LocCntrRel { S_LOC_CODE = __loc.S_LOC_CODE.Trim(), S_CNTR_CODE = SQL_UsingNow + Settings.GetTimeStamp() + end, S_TYPE = item }).ExecuteCommand(); __loc.N_CURRENT_NUM++; if (__loc.N_CURRENT_NUM > __loc.N_CAPACITY) __loc.N_CURRENT_NUM = __loc.N_CAPACITY; __loc.T_FULL_TIME = DateTime.Now; db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand(); li++; } return true; }); } else { LocationHelper.DoAction(db => { foreach (var __loc in _locs) { if (0 == __loc.N_CURRENT_NUM) continue; db.Deleteable().Where(it => it.S_LOC_CODE == __loc.S_LOC_CODE.Trim()).ExecuteCommand(); __loc.N_CURRENT_NUM = 0; __loc.T_FULL_TIME = null; __loc.T_EMPTY_TIME = DateTime.Now; db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_EMPTY_TIME, it.T_FULL_TIME }).ExecuteCommand(); } return true; }); } } } lable_end: return result; } /// /// /// /// /// internal static SimpleResult Outgo33(string loc, string LineNo) { var result = new SimpleResult(); List loclist = new List(); if (loc.Contains("=")) { //LogHelper.Info("验证loc数据a" + loc); var aa = loc.Split('='); //LogHelper.Info("验证loc数据aa0 " + aa[0]); var ar = Array.ConvertAll(aa[1].Split('-'), Convert.ToInt32); string areaaaaa = aa[0].Trim(); //LogHelper.Info("验证loc数据aa1 " + JsonConvert.SerializeObject(ar)); loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == areaaaaa && ar.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废"); //LogHelper.Info("拉取数据: " + loclist.Count); loc = loclist.FirstOrDefault()?.S_LOC_CODE; } //LogHelper.Info("验证loc数据V" + loc); if (string.IsNullOrEmpty(loc)) { result.resultCode = -1; result.resultMsg = $"货位|库区排不可为空;"; } else { loc = loc.Trim().ToUpper(); var locd = LocationHelper.GetLoc(loc); var cntr = LocationHelper.GetLocCntrRel(loc); LogHelper.Info("验证loc数据和托盘" + loc); if (locd == null) { result.resultCode = -1; result.resultMsg = $"货位不存在。"; return result; } else if (locd.S_LOCK_STATE.Trim() != "无") { result.resultCode = -1; result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定"; return result; } else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY) { result.resultCode = -1; result.resultMsg = $"{loc} 满了。不能再绑了"; return result; } LogHelper.Info("验证完成" + loc); string SQL_UsingNow = "TP"; if (locd.S_AREA_CODE.StartsWith("PP")) { SQL_UsingNow = "F"; } else if (locd.S_AREA_CODE.Contains("JCJY")) { SQL_UsingNow = "J"; } result.resultCode = 0; //LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList()); LogHelper.Info("绑定-33-托盘:" + loc); var _locful = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.N_CURRENT_NUM > 0).FirstOrDefault(); if (_locful != null) { cntr = LocationHelper.GetLocCntrRel(_locful.S_LOC_CODE); if (cntr.Count > 0) { if (cntr.FirstOrDefault()?.S_TYPE?.Trim() != LineNo.Trim()) { result.resultCode = -1; result.resultMsg = $"{loc}所在排{_locful.S_LOC_CODE}位置物料{cntr.FirstOrDefault()?.S_TYPE}和 {LineNo} 不同!"; return result; } } } var row = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "报废"); var rowloc = row.Find(x => x.S_LOCK_STATE != "无"); if (rowloc != null) { result.resultCode = -1; result.resultMsg = $"货位所在排有{rowloc.S_LOCK_STATE}状态, 不能进行绑定"; return result; } if (loclist.Any()) { List cirl = new List(); List lcir = new List(); var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int li = 0; foreach (var item in loclist) { item.N_CURRENT_NUM++; item.T_FULL_TIME = DateTime.Now; item.T_EMPTY_TIME = null; if (li >= s.Length) li = 0; string end = s[li].ToString(); var cir = new LocCntrRel { S_LOC_CODE = item.S_LOC_CODE.Trim(), S_CNTR_CODE = SQL_UsingNow + end + Settings.GetTimeStamp(), S_TYPE = LineNo.Trim(), }; lcir.Add(cir); cirl.Add(new Container { S_CNTR_CODE = cir.S_CNTR_CODE }); li++; LogHelper.Info("bindloc3.:" + item.S_LOC_CODE + "cnr" + cir.S_CNTR_CODE); } LogHelper.Info($"bindloc3.:{JsonConvert.SerializeObject(loclist)}"); LocationHelper.DoAction(db => { db.Insertable(lcir).ExecuteCommand(); db.Insertable(cirl).ExecuteCommand(); db.Updateable(loclist).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand(); return true; }); } else { locd.N_CURRENT_NUM++; locd.T_FULL_TIME = DateTime.Now; locd.T_EMPTY_TIME = null; LocationHelper.DoAction(db => { db.Insertable(new LocCntrRel { S_LOC_CODE = locd.S_LOC_CODE.Trim(), S_CNTR_CODE = SQL_UsingNow + Settings.GetTimeStamp(), S_TYPE = LineNo.Trim(), }).ExecuteCommand(); db.Updateable(locd).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand(); return true; }); } } lable_end: return result; } //按列绑定。 库区用。 - internal static SimpleResult Outgo4(string area, List col) { var result = new SimpleResult(); if (string.IsNullOrEmpty(area) || col.Count < 1) { result.resultCode = 2; result.resultMsg = $"{area}:{col}库区 列不可为空"; } else { area = area.Trim().ToUpper(); result.resultCode = 1; var b = LocationHelper.DoAction(db => { var locs = LocationHelper.GetAllLocListByAreaCode(area, 0, 0).FindAll(x => col.Contains(x.N_COL)); if (locs.Count == 0) { result.resultCode = 2; result.resultMsg = $"{area}库区 {col} 列没有货位"; return false; } if (locs.Find(x => x.S_LOCK_STATE.Trim() != "无") != null) { result.resultCode = 2; result.resultMsg = $"{area}库区 列 货位锁定中!"; return false; } //if (locs.Find(x => x.N_CURRENT_NUM == 1) != null) //{ // result.resultCode = 2; // result.resultMsg = $"{area}库区 {_ncol} 列!"; // return false; //} foreach (var _loc in locs) { var models = db.Queryable().Where(x => x.S_LOC_CODE == _loc.S_LOC_CODE).ToList();// db.Queryable().Where(x); if (models.Count == 0)//models.Find(x => x.S_CNTR_CODE.Trim() == "1") == null) { var rrr = new LocCntrRel { S_LOC_CODE = _loc.S_LOC_CODE.Trim(), S_CNTR_CODE = "C" + Settings.GetTimeStamp() }; var res = db.Insertable(rrr).ExecuteCommand(); LogHelper.Info("Range写托盘" + JsonConvert.SerializeObject(rrr)); _loc.N_CURRENT_NUM = 1; _loc.T_FULL_TIME = DateTime.Now; db.Updateable(_loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand(); //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == _loc.S_LOC_CODE, x => //{ // x.N_CURRENT_NUM = 1; // x.T_FULL_TIME = DateTime.Now; //}); } } result.resultMsg = "绑定成功!"; return true; }); //if (index > 0 && (index + 1 < areas.Length)) //{ // index++; // goto Labelgogog; //} } ErrOrExit: return result; } internal static SimpleResult unOutgo33(string locdddd, string LineNo = "") { string loc = locdddd; var result = new SimpleResult(); List loclist = new List(); if (loc.Contains("=")) { //LogHelper.Info("验证loc数据a" + loc); var aa = loc.Split('='); //LogHelper.Info("验证loc数据aa0 " + aa[0]); var ar = Array.ConvertAll(aa[1].Split('-'), Convert.ToInt32); string areaaaaa = aa[0]; //LogHelper.Info("验证loc数据aa1 " + JsonConvert.SerializeObject(ar)); loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == areaaaaa && ar.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废"); //LogHelper.Info("拉取数据: " + loclist.Count); //loc = loclist.FirstOrDefault()?.S_CODE; if (loclist.Find(x => x.S_LOCK_STATE.Trim() != "无") != null) { result.resultCode = -1; result.resultMsg = $"{locdddd} 中有锁。不能解"; return result; } } //LogHelper.Info("验证loc数据V" + loc); if (string.IsNullOrEmpty(loc)) { result.resultCode = -1; result.resultMsg = $"货位|库区排不可为空;"; } else { if (loclist.Any()) { //foreach (var item in loclist) //{ // item.N_CURRENT_NUM = 0; // item.T_FULL_TIME = null; // item.T_EMPTY_TIME = DateTime.Now; //} LocationHelper.DoAction(db => { var loclisssss = loclist.Select(x => x.S_LOC_CODE); db.Deleteable().Where(x => loclisssss.Contains(x.S_LOC_CODE)).ExecuteCommand(); db.Updateable().SetColumns(it => new Location { N_CURRENT_NUM = 0, T_FULL_TIME = null, T_EMPTY_TIME = DateTime.Now }).Where(x => loclisssss.Contains(x.S_LOC_CODE)).ExecuteCommand(); //db.Updateable(loclist).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand(); return true; }); } else { loc = loc.Trim().ToUpper(); var locd = LocationHelper.GetLoc(loc); var cntr = LocationHelper.GetLocCntrRel(loc); LogHelper.Info("验证loc数据和托盘" + loc); if (locd == null) { result.resultCode = -1; result.resultMsg = $"货位不存在。"; return result; } else if (locd.S_LOCK_STATE.Trim() != "无") { result.resultCode = -1; result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行解定"; return result; } else if (locd.N_CURRENT_NUM <= 0) { result.resultCode = -1; result.resultMsg = $"{loc} 空的。不能再解了"; return result; } locd.N_CURRENT_NUM = 0; locd.T_FULL_TIME = null; locd.T_EMPTY_TIME = DateTime.Now; LocationHelper.DoAction(db => { db.Deleteable(cntr).ExecuteCommand(); db.Updateable(locd).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand(); return true; }); } } lable_end: return result; } internal static SimpleResult Outgo36(string itemCode, string sArea = "", string eArea = "") { Location startBit = null; Location EndBit = null; LocCntrRel _clrel0 = null; var locList = LocationHelper.GetAreaNormalLocList("入库区"); foreach (var item in locList.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) { var rs = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (rs != null) { var _clrel = LocationHelper.GetLocCntrRel(rs.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(rs.S_LOC_CODE + " 没有货位托盘信息!"); continue; } _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()); if (!_clcntitem.Any()) { LogHelper.Info(rs.S_LOC_CODE + $"货位 的托盘{_clrel0.S_CNTR_CODE} 没有物料记录"); continue; } if (_clcntitem.FirstOrDefault().S_ITEM_CODE.Contains(itemCode)) { startBit = rs; break; } startBit = rs; break; } } if (startBit == null) return SimpleResult.Error("") ; locList = LocationHelper.GetAreaNormalLocList("入库区"); foreach (var item in locList.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { var rsl = item.OrderBy(x => x.N_COL).ToList(); var rs = rsl.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (rs != null) { if (rs.N_CURRENT_NUM < rs.N_CAPACITY) { EndBit = rs; } else EndBit = rsl.Find(x => x.N_COL > rs.N_COL); } else { EndBit = rsl.FirstOrDefault(); } if (EndBit != null) break; } if (EndBit != null) { var res = TaskProcess.CreateTransport("", startBit.S_LOC_CODE, EndBit.S_LOC_CODE, "补满入库区", new List { _clrel0.S_CNTR_CODE }, startBit.N_CURRENT_NUM, EndBit.N_CURRENT_NUM++, 1, 50, _clrel0.S_TYPE); } return SimpleResult.Success(); } public class AddTaskModel { public string From { get; set; } public string To { get; set; } public string No { get; set; } } public class LocationModel { public string location { get; set; } } public class DeviceModel { /// /// 瓶盖机名称 /// public string deviceName { get; set; } /// /// 1 、2 /// public int order { get; set; } } public class RowInfo { public string area { get; set; } public int row { get; set; } } } }