using HH.WCS.QingXigongchang.device; using HH.WCS.QingXigongchang.dispatch; using HH.WCS.QingXigongchang.util; using HH.WCS.QingXigongchang.wms; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using static HH.WCS.QingXigongchang.api.ApiModel; using Monitor = HH.WCS.QingXigongchang.core.Monitor; namespace HH.WCS.QingXigongchang.process { internal class TaskProcess { private static HttpHelper apiHelper = new HttpHelper(); public const bool UPFule = false; #region 任务相关 //--------------------------------------------------任务相关-------------------------------------------------- /// /// 取货卸货完成,缓存位状态更新 /// /// /// internal static void CacheBitUpdate(WMSTask mst, bool load, string desc = "") { var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; if (load) { Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}"); LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}"); LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTRS.Split(',').ToList()); } else { Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}"); LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}-{desc}"); LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTRS.Split(',').ToList(), desc); } } /// /// 任务取消,缓存位状态更新 /// /// internal static void CacheBitCancelUpdate(WMSTask mst, out ReturnResult r, bool BeenOver = false) { r = new ReturnResult(); //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点 bool bbbbbbb = TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4"); //取货完成后 取消/ 强制完成信号。 强制完成必须取货后 if (BeenOver) { if (!bbbbbbb) { if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "6")) { r = new ReturnResult() { ResultCode = -1, ResultMsg = "任务已经卸货,不能强制完成。" }; return; } r = new ReturnResult() { ResultCode = -1, ResultMsg = "任务还没有取货,不能强制完成。" }; return; } } if (bbbbbbb) { //UpdateElevatorTask(mst); //todo: 如果是电梯卸货任务电梯任务中间表状态,如 if (BeenOver) { //if (mst.S_TYPE.Trim().Contains("翻斗机叫满")) //{ // LocationHelper.UnLockLoc(mst.S_END_LOC); //} //else OperateStatus(mst, 6); #region oooooo ////终点绑定 //CacheBitUpdate(mst, false); //if (mst.S_TYPE.Trim() == "满瓶坯-入库") //{ // //LocationHelper.UnLockLoc(mst.S_START_LOC.Trim()); // //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); // //if (BeenOver) // //{ // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x => // { // x.N_CURRENT_NUM = 1; // }); // //取货后完成的 - 直接完成。 这里要按照卸货处理 - 生成搬运空托到任务起点。 // LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim()); // //} //} //else if (mst.S_TYPE.Trim() == "空瓶坯-出库") //{ // //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); // //if (BeenOver) // //{ // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // { // x.N_CURRENT_NUM = 1; // x.T_FULL_TIME = DateTime.Now; // }); // //} //} #endregion } else { LocationHelper.UnLockLoc(mst.S_END_LOC); } } else { //电梯卸货任务表直接删除 //DeleteElevatorTask(mst); //起点终点解锁 if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Contains("空瓶坯-出库"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线")) { //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null); //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => //{ // x.N_CURRENT_NUM = 0; // x.T_FULL_TIME = null; //}); //var _r = LocationHelper.DoAction(db => // { // return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0; // }); var loc = mst.S_TYPE.Trim() == "满瓶坯-入库" ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim(); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 8) for (var i = 0; i < plc.location.Length; i++) { if (loc == plc.location[i]) { LogHelper.Info($"重置信号位置。 " + loc); PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a"); break; } } } //ApiHelper.unOutgo3("------", mst.S_START_LOC); } else if (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边") || mst.S_TYPE.Contains("注塑即产空筐上线") || mst.S_TYPE.Contains("注塑库存空筐上线"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线")) { //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null); //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => //{ // x.N_CURRENT_NUM = 0; // x.T_FULL_TIME = null; //}); //var _r = LocationHelper.DoAction(db => // { // return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0; // }); var loc = (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边")) ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim(); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 2 || plc.deviceType == 3) for (var i = 0; i < plc.location.Length; i++) { if (loc == plc.location[i]) { LogHelper.Info($"重置信号位置。 " + loc); PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a"); break; } } } //ApiHelper.unOutgo3("------", mst.S_START_LOC); } else if (mst.S_TYPE.Contains("库存盖坯出库")) CancelckLingItem(mst); #region 注释行 //if (mst.S_TYPE.Trim().Contains("瓶盖-满下线")) //{ // //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null); // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // { // x.N_CURRENT_NUM = 0; // x.T_FULL_TIME = null; // }); // var _r = LocationHelper.DoAction(db => // { // return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0; // }); // LogHelper.Info($"重置起点位置。 {_r}"); // //ApiHelper.unOutgo3("------", mst.S_START_LOC); //} #endregion LocationHelper.UnLockLoc(mst.S_START_LOC); LocationHelper.UnLockLoc(mst.S_END_LOC); //todo: 如果是电梯卸货任务取消删除,如果是电梯取货任务取消修改任务状态 //var cntrs = mst.S_CNTRS.Split(',').ToList(); //没有取货完成的任务,如果是清洁位补空类型任务,需要将托盘状态还原成已清洁 //if (Settings.GetInStockCacheList().Count(a => (a.locationType == 1 || a.locationType == 3 || a.locationType == 4) && a.location == mst.S_START_LOC) > 0) //{ // ContainerHelper.UpdateCntr(cntrs, "", "", "已清洁"); //} ////临时库-翻斗机线边取消,还原托盘信息 //if (mst.S_TYPE.Trim() == "临时库-线边") //{ // var startInfo = Settings.GetTipperCacheList().Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault(); // if (startInfo != null) // { // ContainerHelper.UpdateCntr(cntrs, startInfo.deviceName, ""); // } //} ////瓶盖库-临时库 //if (mst.S_TYPE.Trim() == "瓶盖库-临时库") //{ // ContainerHelper.UpdateCntr(cntrs, "", ""); //} } } static void CancelckLingItem(WMSTask mst) { if (!TaskProcess.UPFule) return; if (string.IsNullOrEmpty(mst.S_SRC_NO)) return; LingItemOrder od = null; var wod = WCSHelper.GetWorkOrder(mst.S_SRC_NO); var plc = Settings.GetDeviceInfoList().Find(x => x.deviceName == wod?.SQL_PLineNo); if (plc != null) LocationHelper.DoAction(db => { od = db.Queryable().Where(it => plc.FuLeLineNo.Contains(it.DeviceNo) && it.State == "执行").First(); return true; }); if (od != null) { int current = 0; foreach (var item in mst.S_CNTRS.Split(',')) { var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault(); current += cntrs.qty; } od.AllocQTY -= current; //取消扣除分配量。。 强制完成会走信号6 这里不需要 LocationHelper.DoAction(db => { db.Updateable(od).UpdateColumns(it => new { it.AllocQTY }).ExecuteCommand(); return true; }); } } /// /// 安全请求 /// /// /// /// /// internal static void OperateReq(string no, int state, string forkliftNo, string extData) { } /// /// 任务拦截 /// /// /// internal static bool Intercept(WMSTask mst) { var result = false; //翻斗机叠空框 //电梯任务不推送,单独处理 if (mst.S_TYPE.Contains("-电梯")) { result = true; } if (mst.S_TYPE.Trim() == "翻斗机叠空框" && mst.N_PRIORITY == 90) { //判断相同终点的叠托任务是否存在,是否取货完成 var list = TaskHelper.GetTaskByEnd(mst.S_END_LOC); var otherTask = list.Where(a => a.N_PRIORITY == 99).FirstOrDefault(); if (otherTask != null && !TaskHelper.CheckActionRecordExist(otherTask.S_TASK_NO, "4")) { TaskHelper.UpdateStatus(mst, "未执行"); result = true; } } return result; } /// /// 任务状态更新处理 /// /// /// internal static ReturnResult OperateStatus(WMSTask mst, int state) { ReturnResult r = new ReturnResult(); if (state == 4) { if (!mst.S_TYPE.Trim().Contains("自由点对点")) CacheBitUpdate(mst, load: true); if (mst.S_TYPE.Trim().Contains("满瓶坯-入库") || mst.S_TYPE.Trim().Contains("空瓶坯-出库") || mst.S_TYPE.Trim().Contains("瓶盖-满下线")) { LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x) { if (x.N_CURRENT_NUM > 0) x.N_CURRENT_NUM--; else x.N_CURRENT_NUM = 0; }); } else if (mst.S_TYPE.Trim().Contains("上线满出库") || mst.S_TYPE.Trim().Contains("仓空转下空")) { LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x) { if (x.N_CURRENT_NUM == 0) x.S_NOTE = ""; }); } if (mst.S_TYPE.Contains("Fu成品满框-入库")) { var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 9) { PlcHelper.SendHex(plc.address, "3F00" + "10" + "0d0a"); } } LocationHelper.DoAction(db => { var fulectlist = LocationHelper.GetFuLeTrayCodeList(f => mst.S_CNTRS.Contains(f.trayCode.Trim())); LogHelper.Info("Fu成品取货" + mst.S_CNTRS + "--<>--" + JsonConvert.SerializeObject(fulectlist)); if (fulectlist.Any()) db.Updateable(fulectlist).ReSetValue(it => { it.SQL_State = "完成"; }).ExecuteCommand(); return true; }); } if (mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机库存满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机叫满") || mst.S_TYPE.Contains("中转去")) { //写入 入库排锁 - 记录 在入库。 如果排满了,就歇菜。 清除 放在 线程里。 var loc = LocationHelper.GetLoc(mst.S_START_LOC); var db = new SqlHelper().GetInstance(); var row = db.Queryable().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && loc.N_ROW == x.N_ROW && x.S_LOCK_STATE == "出库锁").First(); if (row == null) { db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand(); } //if (loc.N_CURRENT_NUM > 0) //{ // if (row == null) // { // db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand(); // } //} //else //{ // var haslast = LocationHelper.GetLocList(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW && x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE != "报废"); // if (!haslast.Any()) // db.Deleteable().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW).ExecuteCommand(); // else if (row == null) // db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand(); //} } //终点货位为 YWLT1TSJCD 或者 YWLT2TSJCD 的 要取货完成解锁起点,解绑起点,绑定终点,卸货完成,解锁终点 2025年6月10日 Plg if (mst.S_END_LOC?.Trim() == "YWLT1TSJCD" || mst.S_END_LOC?.Trim() == "YWLT2TSJCD") { //解绑起点 CacheBitUpdate(mst, load: true); //绑定终点 CacheBitUpdate(mst, load: false); } LocationHelper.UnLockLoc(mst.S_START_LOC.Trim()); } //new List { "成品满框-入库", "" } if (state == 6 || state == 5) { ///只需要释放货位就行了 if (mst.S_END_LOC?.Trim() == "YWLT1TSJCD" || mst.S_END_LOC?.Trim() == "YWLT2TSJCD") { LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); return r; } LogHelper.Info($"任务类型:{mst.S_TYPE}- 动作:{state}. 是否5算6?{mst.S_TYPE.Contains("成品满框") || mst.S_TYPE.Contains("备货")} "); if (mst.S_TYPE.Contains("备货")) { if (state == 6) goto vvv; } else if (state == 5) goto vvv; if (mst.S_TYPE.Trim() == "J空瓶坯-出库") { mst.S_CNTRS = "J" + Settings.GetTimeStamp(); } if (mst.S_TYPE.Trim() == "F空瓶坯-出库") { mst.S_CNTRS = "F" + Settings.GetTimeStamp(); } //成品空框 不需要绑筐 if (!mst.S_TYPE.Trim().Contains("成品-空托上线") && mst.S_TYPE.Trim() != "满瓶坯-入库" && mst.S_TYPE.Trim() != "瓶盖入库-J2" && mst.S_TYPE.Trim() != "瓶盖空筐转运-J2" && mst.S_TYPE.Trim() != "青溪纸箱搬运物料" && !mst.S_TYPE.Trim().Contains("自由点对点")) { CacheBitUpdate(mst, load: false, mst.S_NOTE); } if (mst.S_TYPE.Trim().Contains("成品-空托上线")) { LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x) { x.S_LOCK_STATE = "无"; x.N_CURRENT_NUM = 1; x.T_FULL_TIME = DateTime.Now; }); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 9) for (int i = 0; i < plc.location.Length; i++) { if (plc.location[i] == mst.S_END_LOC.Trim()) //foreach (var _i in new int[] { 1, 2, 3 }) { PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a"); } } } } if (mst.S_TYPE.Contains("备货")) { var db = new SqlHelper().GetInstance(); var to = db.Queryable().Where(x => x.S_ID == mst.S_SRC_NO).First(); if (to != null) { // to.AlQty += mst.S_CNTRS.Split(',').Length;// mst.S_CNTRS.Substring(1).Split('v').Length; to.AlQty += mst.S_CNTRS.Substring(1).Split('v').Length; db.Updateable(to).UpdateColumns(it => new { it.AlQty }).ExecuteCommand(); } } else if (mst.S_TYPE.Contains("原物料搬运")) { var db = new SqlHelper().GetInstance(); var to = db.Queryable().Where(x => x.SQL_WorkNo == mst.S_SRC_NO).First(); if (to != null) { // to.AlQty += mst.S_CNTRS.Split(',').Length;// mst.S_CNTRS.Substring(1).Split('v').Length; to.OutNum -= mst.S_CNTRS.Split(',').Length; db.Updateable(to).UpdateColumns(it => new { it.OutNum }).ExecuteCommand(); } } if (mst.S_TYPE.Trim().Contains("空瓶坯-出库") || mst.S_TYPE.Trim().Contains("瓶盖-空上机") || mst.S_TYPE.Trim().Contains("翻斗机叫满")) { //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); //LogHelper.Info("该点位的托盘数量" + mst.S_END_LOC.Trim() + (LocationHelper.GetLocation(mst.S_END_LOC.Trim())?.N_CURRENT_NUM).ToString()); LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x) { x.S_LOCK_STATE = "无"; x.N_CURRENT_NUM = 1; x.T_FULL_TIME = DateTime.Now; }); } if (mst.S_TYPE.Contains("瓶盖非即产线边") || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边") || mst.S_TYPE.Contains("中转去") || mst.S_TYPE.Contains("满瓶坯")) { //写入 入库排锁 - 记录 在入库。 如果排满了,就歇菜。 清除 放在 线程里。 var loc = LocationHelper.GetLoc(mst.S_END_LOC); var db = new SqlHelper().GetInstance(); var row = db.Queryable().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && loc.N_ROW == x.N_ROW && x.S_LOCK_STATE == "入库锁").First(); if (row == null) { db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand(); } //if (loc.N_CURRENT_NUM < loc.N_CAPACITY) //{ // if (row == null) // { // db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand(); // } //} //else //{ // var haslast = LocationHelper.GetLocList(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW && x.S_LOCK_STATE != "报废"); // if (haslast.Find(x => x.N_COL > loc.N_COL && x.N_CURRENT_NUM < x.N_CAPACITY) == null) // db.Deleteable().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW).ExecuteCommand(); // else if (row == null) // db.Insertable(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand(); //} } if (mst.S_TYPE.Trim() == "满瓶坯-入库") { //LocationHelper.TakeEmptyToBottleBoyd(mst); //LogHelper.Info(""); string desc = ""; //Settings.deviceInfo startloc = (from x in Settings.GetDeviceInfoList() // where x.location.Contains(mst.S_START_LOC.Trim()) // select x).FirstOrDefault(); //if (startloc != null && string.IsNullOrEmpty(mst.S_SRC_NO)) //{ // var order = WCSHelper.GetWorkOrder(x => mst.S_SRC_NO.Trim() == x.SQL_PLineNo).FirstOrDefault(); // desc = order?.SQL_PLineNo + ">" + order?.SQL_ItemCode; //} var order = WCSHelper.GetWorkOrder(x => mst.S_SRC_NO.Trim() == x.SQL_WorkNo).FirstOrDefault(); desc = order == null ? "" : order?.SQL_PLineNo + ">" + order?.SQL_ItemCode; CacheBitUpdate(mst, load: false, desc); LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); // TAKE OUT 2 ZZQ 出库区 转 中转区 string ppp = ""; if (!string.IsNullOrEmpty(desc)) ppp = order.SQL_PLineNo.Contains("注塑机3") ? "注塑机3" : (order.SQL_PLineNo.Contains("注塑机4") ? "注塑机4" : ""); Monitor.B7(true, ppp); if (false) if (!string.IsNullOrEmpty(desc)) { var areaList = ""; if (order.SQL_PLineNo.Contains("注塑机3")) areaList = "PPTMKZZ"; if (order.SQL_PLineNo.Contains("注塑机4")) areaList = "PPFMKZZ"; if (!string.IsNullOrEmpty(areaList)) { LogHelper.Info($"计算{mst.S_TASK_NO} - {mst.S_SRC_NO} 对应的{order.SQL_PLineNo} 中转区任务"); var loclist__ = LocationHelper.GetAreaNormalLocList(areaList, false); //if (loclist__.Find(x => x.S_LOCK_STATE.Trim() == "入库锁" /*|| x.S_LOCK_STATE.Trim() == "出库锁"*/) != null) //{ // LogHelper.Info($"{mst.S_TASK_NO} - 中转区有入库任务,不进行中转"); //} //else { var rs = order.S_ROW1.Split('='); int[] rows = Array.ConvertAll(rs[rs.Length - 1].Trim().Split('-'), Convert.ToInt32); Location strBit = null; Location endBit = null; LocCntrRel crl = null; var outlocs = LocationHelper.GetAreaNormalLocList("PPMKCK"); if (rs[0] != "PPMKCK") { rows = new int[] { }; } foreach (var item in outlocs.GroupBy(x => x.N_ROW).OrderBy(x => rows.Contains(x.Key) ? 0 : 1).ThenBy(x => x.Count(y => y.N_CURRENT_NUM > 0))) { var e = item.OrderByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); if (e != null) { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemName}"))) { crl = rel.FirstOrDefault(); strBit = e; break; } } } if (strBit != null) { LogHelper.Info($"{mst.S_TASK_NO} - 去中转区,找到出库区位置{strBit.S_LOC_CODE}-{crl.S_CNTR_CODE}"); loclist__ = LocationHelper.GetAreaNormalLocList(areaList); foreach (var _rl in loclist__.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0))) { var rowLsit = _rl.OrderByDescending(x => x.N_COL).ToList(); var e = rowLsit.Find(x => x.N_CURRENT_NUM > 0); if (e == null) { endBit = rowLsit.LastOrDefault(); if (endBit != null) break; } else { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemName}"))) { if (e.N_CURRENT_NUM < e.N_CAPACITY) { endBit = e; break; } else { rowLsit.Reverse(); endBit = rowLsit.FindAll(x => x.N_COL > e.N_COL).OrderBy(x => x.N_COL).FirstOrDefault(); if (endBit != null) break; } } } } if (endBit != null) { LogHelper.Info($"{mst.S_TASK_NO} - 去中转区,找到位置{endBit.S_LOC_CODE}"); bool bb = CreateTransport(order.SQL_WorkNo, strBit.S_LOC_CODE, endBit.S_LOC_CODE, order.SQL_PLineNo + "中转去", new List { crl.S_CNTR_CODE }, strBit.N_CURRENT_NUM, endBit.N_CURRENT_NUM++, 1, 50, crl.S_TYPE); LogHelper.Info($"{mst.S_TASK_NO},任务卸货,创建去{order.SQL_PLineNo}中转区的任务{(bb ? "成功" : "失败")}"); } //, ctrs.FirstOrDefault().S_TYPE } } } } } else if (mst.S_SRC_NO.Contains("LIOauto"))//mst.S_TYPE.Trim() == "青溪纸箱搬运物料" || mst.S_TYPE.Trim().Contains("出库提升机接驳位")) { var db = new SqlHelper().GetInstance(); var alrs = db.Queryable().Where(x => x.WorkNo == mst.S_SRC_NO).First(); if (alrs != null) { alrs.OutCurrentNum = (alrs.current + mst.S_CNTRS.Split(',').Length) + ""; if (alrs.current >= alrs.AreaNum) alrs.State = "完成"; db.Updateable(alrs).UpdateColumns(x => new { x.OutCurrentNum, x.State }).ExecuteCommand(); } LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); } else if (mst.S_TYPE.Contains("瓶盖入库")) { var locstart = LocationHelper.GetLoc(mst.S_START_LOC.Trim()); var b1 = Settings.GetBolAreaList().Find(x => x.NotUsingBolArea == locstart?.S_AREA_CODE); CacheBitUpdate(mst, load: false, b1?.DeviceName); //入库上报富勒 if (UPFule) { var b = false;// 标识 是否需要上报。 var dl = new List(); WorkOrder od = null; List lcirs = new List(); foreach (var item in mst.S_CNTRS.Split(',')) { var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault(); if (cntrs != null && !string.IsNullOrEmpty(cntrs?.S_ORDER_NO) && cntrs.S_ORDER_NO.Trim().EndsWith("_Y")) { if (od == null || od.SQL_WorkNo != cntrs?.S_ORDER_NO.Split('_')[0]) { od = WCSHelper.GetWorkOrderByOrderNo(cntrs?.S_ORDER_NO.Split('_')[0]); } lcirs.Add(cntrs); b = true; dl.Add(new { Settings.warehouseId, Settings.customerId, Settings.asnType, docNo = cntrs?.S_ORDER_NO.Split('_')[0],//od.SQL_WorkNo, expectedArriveTime1 = od?.T_MODIFY, sku = cntrs.S_ITEM_CODE, traceId = cntrs.S_CNTR_CODE, toLocation = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC, cntrs.qty }); } } if (b) { var req = JsonConvert.SerializeObject(new { from = Settings.fromSystem, list = dl }); var feedback = apiHelper.WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/paConfirm", req); LocationHelper.DoAction(db => { //db.Updateable().UpdateColumns(it => new { In_T = DateTime.Now, In_report = feedback }).Where(it => mst.S_CNTRS.Split(',').Contains(it.S_CNTR_CODE)).ExecuteCommand(); db.Updateable(lcirs).ReSetValue(it => { it.In_T = DateTime.Now; it.In_report = feedback; }).ExecuteCommand(); return true; }); } } LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); } else if (mst.S_TYPE.Contains("库存盖坯出库") && UPFule) { var b = false;// 标识 是否需要上报。 var dl = new List(); LingItemOrder od = null; int current = 0; int cone = 0; List lcirs = new List(); { var wod = WCSHelper.GetWorkOrder(mst.S_SRC_NO); var plc = Settings.GetDeviceInfoList().Find(x => x.deviceName == wod?.SQL_PLineNo); if (plc != null) LocationHelper.DoAction(db => { od = db.Queryable().Where(it => plc.FuLeLineNo.Contains(it.DeviceNo) && it.State == "执行").First(); return true; }); } if (od != null) {// 有领料单 再处理上报问题。 无领料,不上报。 。 foreach (var item in mst.S_CNTRS.Split(',')) { var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault(); if (cntrs != null) { lcirs.Add(cntrs); b = true; dl.Add(new { sku = cntrs.S_ITEM_CODE, traceId = cntrs.S_CNTR_CODE, fmLocation = LocationHelper.GetLoc(mst.S_START_LOC)?.S_Fule_LOC, qtyOrdered = cntrs.qty }); current += cntrs.qty; cone = cntrs.qty; } } ///写领料数据 od.OutCurrentNum = (od.current + current) + ""; od.AllocQTY = od.AllocQTY - current; LocationHelper.DoAction(db => { if (od.AreaNum - od.current < cone) od.State = "完成"; return db.Updateable(od).UpdateColumns(it => new { it.OutCurrentNum, it.State, it.AllocQTY }).ExecuteCommand() > 0; }); } else { LogHelper.Info($" {mst.S_TASK_NO} 任务 所属工单{mst.S_SRC_NO} 没找到领料单"); } if (b) { var req = JsonConvert.SerializeObject(new { from = Settings.fromSystem, list = new List { new{ warehouseId = Settings.warehouseId, customerId = Settings.customerId, docNo = od.WorkFromNo, details=dl } } }); var feedback = apiHelper.WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/shipmentConfirm", req); LocationHelper.DoAction(db => { db.Updateable(lcirs).ReSetValue(it => { it.Out_T = DateTime.Now; it.Out_report = feedback; it.Out_LingNo = od.WorkFromNo; }).ExecuteCommand(); return true; }); } } else if (mst.S_TYPE.Trim() == "瓶盖空筐转运-J2") { CacheBitUpdate(mst, load: false, "空框"); LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); } else if (mst.S_TYPE.Trim().Contains("空入转入库")) { LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x) { x.S_LOCK_STATE = "无"; x.S_NOTE = "空框"; }); } else if ((mst.S_TYPE.Contains("瓶盖非即产线边") || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边")) && UPFule) { var jf = mst.S_TYPE.Contains("瓶盖即产转翻斗机线边"); var od = WCSHelper.GetWorkOrder(mst.S_SRC_NO); if (od != null && od.FromFuLe == "Y") { var req = JsonConvert.SerializeObject(new { factoryCode = Settings.factoryCode, workOrderCode = od.SQL_WorkNo, materialCode = od.SQL_ItemCode, amount = jf ? od.pcnumusing : od.pcnum,//Convert.ToInt32(string.IsNullOrEmpty(od.SQL_PCNumber) ? "0" : od.SQL_PCNumber), qrCode = mst.S_CNTRS.Split(',').FirstOrDefault(),//LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC, connectionLineStatus = jf ? "1" : "2", }); od.SQL_Current = currentNum(od.SQL_Current, jf ? od.SQL_PCNumber_using : od.SQL_PCNumber) + ""; var feedback = apiHelper.WebPost($"{Settings.MesServerUrl}/mes/v1/middle/agv/productionReport", req); LocationHelper.DoAction(db => { db.Updateable(od).UpdateColumns(it => new { it.SQL_Current }).ExecuteCommand(); db.Updateable().SetColumns(it => new CntrItemRel { Off_T = DateTime.Now, Off_report = feedback }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand(); return true; }); } } else if ((mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机库存满筐上线(瓶盖)")) && UPFule) { var jf = mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)"); var od = WCSHelper.GetWorkOrder(mst.S_SRC_NO); if (od != null && od.FromFuLe == "Y") { var req = JsonConvert.SerializeObject(new { factoryCode = Settings.factoryCode, workOrderCode = od.SQL_WorkNo + od.Sign, qrCode = mst.S_CNTRS.Split(',').FirstOrDefault(), connectionLineStatus = jf ? "1" : "2", }); var feedback = apiHelper.WebPost($"{Settings.MesServerUrl}/mes/v1/middle/agv/doFeedMaterial", req); LocationHelper.DoAction(db => { db.Updateable().SetColumns(it => new CntrItemRel { DoF_T = DateTime.Now, DoF_report = feedback }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand(); return true; }); } } else if (mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim().Contains("瓶盖-空上机") || mst.S_TYPE.Trim().Contains("翻斗机叫满")) { LogHelper.Info(" 触发信号前 :"); LocationHelper.SetT_FULL_TIME(mst.S_END_LOC.Trim(), DateTime.Now, delegate (Settings.deviceInfo plc, string cc) { LogHelper.Info(plc.deviceName + " 触发信号 :" + cc); if (mst.S_TYPE.Trim().Contains("翻斗机叫满")) { if (DeviceProcess.FJD_wwwwFD.ContainsKey(plc.deviceName.Trim())) { DeviceProcess.FJD_wwwwFD[plc.deviceName.Trim()] = 0; } else { DeviceProcess.FJD_wwwwFD.Add(plc.deviceName.Trim(), 0); } //翻斗机 // //Task.Run(delegate // //{ // //Thread.Sleep(20000); // //PlcHelper.SendHex(plc.address, cc); //DeviceProcess.FDJ_writeFD.Add(plc.deviceName); // //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); // //}); } else { PlcHelper.SendHex(plc.address, cc); LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); } }); } else if (mst.S_TYPE.Contains("备货") && !mst.S_CNTRS.StartsWith("TP"))//&& mst.S_CNTRS.StartsWith("F")) { LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); var db = new SqlHelper().GetInstance(); var to = db.Queryable().Where(x => x.S_ID == mst.S_SRC_NO).First(); //if (to != null && !string.IsNullOrEmpty(to.FROM_NO)) // goto jumpp; //LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), //LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault() var req = JsonConvert.SerializeObject(new { repoNo = Settings.repoNo, startAreaNo = LocationHelper.GetLoc(mst.S_START_LOC)?.S_Fule_LOC, trayInfo = mst.S_CNTRS.Substring(1).Split('v').ToList(), // trayInfo = mst.S_CNTRS.Split(',').ToList(), endAreaNo = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC }); var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/yikuTaskStatus", req); LogHelper.Info("yikuTaskStatus 移库任务完成回报" + req + ";rrr:" + JsonConvert.SerializeObject(feedback)); jumpp: Console.WriteLine("备货 富勒托 "); } else { //Settings.inStockCacheBit startloc = (from x in Settings.GetInStockCacheList() // where (x.locationType == 2 || x.locationType == 1) && x.location.Trim().ToUpper() == mst.S_START_LOC.Trim().ToUpper() // select x).FirstOrDefault(); //if (startloc != null) //{ // LogHelper.Info("x.S_LOC_CODE ==" + mst.S_END_LOC.Trim()); // LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x) // { // x.S_NOTE = ((startloc == null) ? "" : startloc.deviceName); // }); //} //else //{ // //LogHelper.Info("(非错误,仅展示)卸货时找起点瓶盖机类型,没找到 ==" + mst.S_START_LOC.Trim()); //} if (mst.S_TYPE.Contains("成品满框-入库") && mst.S_TYPE.StartsWith("Fu")) { var crs = mst.S_CNTRS.Substring(1).Split('v').ToList(); //var crs = mst.S_CNTRS.Split(',').ToList();// mst.S_CNTRS.Substring(1).Split('v').ToList(); var plcinfo = (from x in Settings.GetDeviceInfoList() where x.location.Contains(mst.S_START_LOC.Trim()) select x).FirstOrDefault(); if (plcinfo != null) { //try //{ WorkOrder order = null; try { var orderNo = LocationHelper.GetFuLeTrayCodeList(X => X.trayCode == crs.First())?.FirstOrDefault(); LogHelper.Info("orderNo:富勒卸货找托盘" + (orderNo == null) + (mst.S_SRC_NO)); order = WCSHelper.GetWorkOrder(x => x.SQL_WorkNo == (orderNo.workNo ?? mst.S_SRC_NO)).FirstOrDefault(); ; LogHelper.Info("order2:托盘找工单" + (order == null)); } catch (Exception dx) { LogHelper.Info("富勒托盘找工单失败。改为找机器工单。 Exception:" + crs.First() + ";;" + dx.Message); order = WCSHelper.GetWorkOrder(plcinfo.deviceName); } //WCSHelper.GetWorkOrder(plcinfo.deviceName); LogHelper.Info("order " + (order == null)); if (order != null) Settings.OrderCaches[plcinfo.deviceName] = order; else { Settings.OrderCaches.TryGetValue(plcinfo.deviceName, out order); } LogHelper.Info("order2 " + (order == null)); //var cntrs = mst.S_CNTRS.Substring(1); string flloc = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC; //LogHelper.Info("order3 "); var req = JsonConvert.SerializeObject(new { trayInfo = crs, workNo = order?.SQL_WorkNo, repoNo = Settings.repoNo, areaLoca = flloc }); //LogHelper.Info("order4 "); var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/proTaskStatus", req); //} //catch (Exception ex) //{ // LogHelper.Error(ex.Message, ex); //} //LocationHelper.DoAction(db => //{ // db.Updateable().SetColumns(it => new FuLeTrayCode { }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand(); // return true; //}); //if (feedback != "") //{ // var result = JsonConvert.DeserializeObject(feedback); //} } } LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); } vvv: Thread.Sleep(1); } #region throw //if (state == 4) //{ // CacheBitUpdate(mst, true); // LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null); // //CheckElevator(mst, true); // //CheckRawMaterial(mst); // //CheckStackBitLoad(mst.S_CNTRS, mst.S_START_LOC); // //LineCacheLoad(mst.S_CNTRS, mst.S_END_LOC); // //CheckBottleCapFullLoad(mst.S_START_LOC, mst.S_CNTRS); // if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim().Contains("瓶盖-满下线")) // { // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // { // x.N_CURRENT_NUM = 0; // }); // } // //if (mst.S_TYPE.Trim() == "瓶盖-空上机") // //{ // // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // // { // // x.N_CURRENT_NUM = x.N_CURRENT_NUM - 1; // // }); // //} // //else if (mst.S_TYPE.Trim() == "下线满入库") // //{ // // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // // { // // x.N_CURRENT_NUM = x.N_CURRENT_NUM - mst.S_CNTRS.Split(',').Length; // // }); // //} // else // { // //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x => // //{ // // x.N_CURRENT_NUM = x.N_CURRENT_NUM - mst.S_CNTRS.Split(',').Length; // //}); // } // LocationHelper.UnLockLoc(mst.S_START_LOC.Trim()); //} //if (state == 6)//卸货完成 //{ // ///下线满入库 // ///入空上转下 // /// 空入转空出 // /// 空入转入库 // /// 仓空转下空 // ///无菌即满下转上 // ///水盖即满下转上 // ///即空上转下 // //----- 都使用这里绑定托盘就好了。 // CacheBitUpdate(mst, false); // //CheckElevator(mst, false); // //if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Trim() == "空瓶坯-出库") // LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); // if (mst.S_TYPE.Trim() == "满瓶坯-入库" // || mst.S_TYPE.Trim() == "空瓶坯-出库" // || mst.S_TYPE.Trim() == "瓶盖-空上机") // { // LogHelper.Info("该点位的托盘数量" + mst.S_END_LOC.Trim() + (LocationHelper.GetLocation(mst.S_END_LOC.Trim())?.N_CURRENT_NUM)); // //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), DateTime.Now); // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x => // { // x.N_CURRENT_NUM = 1; // }); // } // if (mst.S_TYPE.Trim() == "满瓶坯-入库") // { // LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim()); // } // else if (mst.S_TYPE.Trim().Contains("瓶盖-满下线")) // { // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x => // { // //x.N_CURRENT_NUM++; // x.S_NOTE = mst.S_TYPE.Trim().Substring(1, 4); // }); // Task.Run(() => // { // // 送空去吧。 。 // LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim()); // }); // } // else if (mst.S_TYPE.Trim().Contains("即满下转上") || mst.S_TYPE.Trim().Contains("即空上转下")) // { // //绑定托盘方法已经处理数量和 增删托盘。 // //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x => // //{ // // x.N_CURRENT_NUM = mst.S_CNTRS.Split(',').Length; // //}); // } // else if (mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim() == "瓶盖-空上机") // { // LocationHelper.SetT_FULL_TIME(mst.S_END_LOC.Trim(), DateTime.Now, (plc, cc) => // { // PlcHelper.SendHex(plc.address, cc);//"3F00100d0a" // }); // } // else // { // var startloc = Settings.GetInStockCacheList().Where(x => (x.locationType == 2 || x.locationType == 1) && x.location.Trim().ToUpper() == mst.S_START_LOC.Trim().ToUpper()).FirstOrDefault(); // if (startloc != null) // { // LogHelper.Info("x.S_LOC_CODE ==" + mst.S_END_LOC.Trim()); // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x => // { // //x.N_CURRENT_NUM += mst.S_CNTRS.Split(',').Length; // x.S_NOTE = startloc == null ? "" : startloc.deviceName; // }); // } // else LogHelper.Info("(非错误,仅展示)卸货时找起点瓶盖机类型,没找到 ==" + mst.S_START_LOC.Trim()); // } //} #endregion if (state == 7) { CacheBitCancelUpdate(mst, out r); } if (state == 8) { CacheBitCancelUpdate(mst, out r, true); } return r; } static int currentNum(string cn, string pn) { if (string.IsNullOrEmpty(cn)) cn = "0"; return Convert.ToInt32(cn) + Convert.ToInt32(pn); } private static object locLocker = new object(); /// /// 推送任务 /// /// /// internal static bool SendTask(WMSTask mst) { bool result = false; int start = 0; int end = 0; string DispInfo = "0"; string CtrlVal = "0"; string ChgTo = "0"; string Flow = "1"; string Tlow = "0"; int TSNo = 1; string taskType = mst.S_TYPE.Trim(); string taskState = mst.S_B_STATE.Trim(); bool flag = taskState == "未执行" || taskState == "待推送"; if (flag) { string FRow = mst.N_START_LAYER.ToString(); string TRow = mst.N_END_LAYER.ToString(); //bool flag2 = start == 0; if (taskType.Contains("成品满框-入库") || taskType.Contains("成品-空托上线")) { TSNo = 5; start = LocationHelper.GetAgvSite(mst.S_START_LOC); if (taskType.Contains("成品满框-入库")) { switch (mst.S_END_LAREA.Substring(mst.S_END_LAREA.Length - 2)) { case "_J": ChgTo = "1"; break; case "_D": ChgTo = "2"; break; case "_X": ChgTo = "3"; break; } var spx = mst.S_END_LAREA.Substring(mst.S_END_LAREA.IndexOf("_")); var fromEXT = LocationHelper.GetAgvSite(mst.S_START_LOC, spx); if (fromEXT > 0) { start = fromEXT; } var fis = LocationHelper.GetFreeLineList(mst.S_END_LAREA); var locinfo = LocationHelper.GetLoc(mst.S_END_LOC); var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol); end = mst.N_END_LAYER < 2 ? f.bit1 : f.bit2; Tlow = (locinfo.N_COL - f.minCol) + ""; //var cr = mst.S_CNTRS.Split(',')[0]; //var it = ContainerHelper.GetCntrItemRel(cr); //var item = it?[0]?.S_ITEM_CODE; var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault(); if (item != null) { var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//item.S_ITEM_CODE);//x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx && x.ItemLayer == item.ItemLayer*/); //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer); //LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}/*&&x.B_Type=={spx}&&x.ItemLayer=={item.ItemLayer}*/: item_==null?{item_ == null}"); //TRow = item_?.trayHeight + ""; //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer); LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.B_Type=={Settings.areaSuffixR(spx)}&&x.ItemLayer=={item.ItemLayer}: item_ 是否未找到:{item_ == null}"); if (item_ != null) TRow = item_.trayHeight + ""; else return false; } } if (taskType.Contains("成品-空托上线")) { switch (taskType.Substring(7).Trim()) { case "集化板": ChgTo = "1"; break; case "大板": ChgTo = "2"; break; case "小板": ChgTo = "3"; break; } end = LocationHelper.GetAgvSite(mst.S_END_LOC); TRow = "0"; } CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER; DispInfo = "0"; } else if (taskType.Contains("备货")) { TSNo = 5; var ctr = LocationHelper.GetList(x => x.S_CNTR_CODE == mst.S_CNTRS).FirstOrDefault()?.B_TYPE; var spx = ""; if (ctr == null) spx = mst.S_START_LAREA.Substring(mst.S_START_LAREA.IndexOf("_")); else spx = ctr; switch (mst.S_START_LAREA.Substring(mst.S_START_LAREA.Length - 2)) { case "集化板": case "_J": ChgTo = "1"; if (string.IsNullOrEmpty(spx)) spx = "_J"; break; case "大板": case "_D": ChgTo = "2"; if (string.IsNullOrEmpty(spx)) spx = "_D"; break; case "小板": case "_X": ChgTo = "3"; if (string.IsNullOrEmpty(spx)) spx = "_X"; break; } var locinfo = LocationHelper.GetLoc(mst.S_START_LOC); if (locinfo.S_AREA_CODE.StartsWith("BHQ-")) { start = LocationHelper.GetAgvSite(mst.S_START_LOC); } else { var fis = LocationHelper.GetFreeLineList(mst.S_START_LAREA); var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol); start = mst.N_START_LAYER < 2 ? f.bit1 : f.bit2; Flow = (locinfo.N_COL - f.minCol) + ""; } locinfo = LocationHelper.GetLoc(mst.S_END_LOC); if ("YKBH" == locinfo.S_AREA_CODE || locinfo.S_AREA_CODE.StartsWith("BHQ-")) { end = LocationHelper.GetAgvSite(mst.S_END_LOC); if (int.Parse(TRow) > 1) { var e2 = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow); if (e2 > 0) end = e2; } } else { var fis = LocationHelper.GetFreeLineList(mst.S_END_LAREA); var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol); end = mst.N_END_LAYER < 2 ? f.bit1 : f.bit2; Tlow = (locinfo.N_COL - f.minCol) + ""; } CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER; var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault(); if (item != null) { var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/); //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer); //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer); LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.B_Type=={Settings.areaSuffixR(spx)}&&x.ItemLayer=={item.ItemLayer}: item_ 是否未找到:{item_ == null}"); if (item_ != null) TRow = item_.trayHeight + ""; else return false; } DispInfo = "1"; } else if (Settings.GetDeviceInfoList().Find(x => x.location.Contains(mst.S_END_LOC))?.deviceType == 13 && mst.S_TYPE.Contains("原物料搬运") //|| ((mst.S_START_LAREA == "WJBQDDKQ" || mst.S_START_LAREA == "SXBQDDKQ") && mst.N_START_LAYER == 2) //|| ((mst.S_END_LAREA == "WJBQDDKQ" || mst.S_END_LAREA == "SXBQDDKQ") && mst.N_END_LAYER == 2) ) { // 上 提升机任务。 if (start == 0) { //bool flag3 = ; if (int.Parse(FRow) > 1) { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow); if (start == 0) start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow); LogHelper.Info(string.Concat(new string[] { mst.S_TASK_NO, mst.S_START_LOC, "start DD ", start.ToString(), "-", TRow }), ""); } else { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load"); if (start == 0) start = LocationHelper.GetAgvSite(mst.S_START_LOC); LogHelper.Info(string.Concat(new string[] { mst.S_TASK_NO, mst.S_START_LOC, "start agv点", start.ToString(), "-", TRow }), ""); } } if (end == 0) { end = LocationHelper.GetAgvSite(mst.S_END_LOC); LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}"); if (int.Parse(TRow) > 1) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow); LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}"); } } TSNo = 5; TRow = "1"; FRow = "1"; CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER; DispInfo = mst.N_START_LAYER - 1 + ""; var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault(); if (item != null) { var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/); //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer); //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer); LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.S_ITEM_NAME=={item.S_ITEM_NAME}: item_ 是否未找到:{item_ == null}"); if (item_ != null) TRow = item_.trayHeight + ""; else return false; } } //else if ( mst.S_END_LAREA == "WJBQDDKQ" || mst.S_END_LAREA == "SXBQDDKQ"|| mst.S_START_LAREA == "WJBQDDKQ" ||mst.S_START_LAREA == "SXBQDDKQ" ) //{ // if (start == 0) // { // //bool flag3 = ; // if (int.Parse(FRow) > 1) // { // start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow); // if (start == 0) // start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow); // LogHelper.Info(string.Concat(new string[] // { // mst.S_TASK_NO, // mst.S_START_LOC, // "start DD ", // start.ToString(), // "-", // TRow // }), ""); // } // else // { // start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load"); // if (start == 0) // start = LocationHelper.GetAgvSite(mst.S_START_LOC); // LogHelper.Info(string.Concat(new string[] // { // mst.S_TASK_NO, // mst.S_START_LOC, // "start agv点", // start.ToString(), // "-", // TRow // }), ""); // } // } // if (end == 0) // { // end = LocationHelper.GetAgvSite(mst.S_END_LOC); // LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}"); // if (int.Parse(TRow) > 1) // { // end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow); // LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}"); // } // } // TSNo = 5; // TRow = "1"; // FRow = "1"; // CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER; // DispInfo = mst.N_START_LAYER - 1 + ""; // var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault(); // if (item != null) // { // var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/); // //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer); // //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer); // LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.S_ITEM_NAME=={item.S_ITEM_NAME}: item_ 是否未找到:{item_ == null}"); // if (item_ != null) // TRow = item_.trayHeight + ""; // else return false; // } //} else { if (start == 0) { //bool flag3 = ; if (int.Parse(FRow) > 1) { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow); if (start == 0) start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow); LogHelper.Info(string.Concat(new string[] { mst.S_TASK_NO, mst.S_START_LOC, "start DD ", start.ToString(), "-", TRow }), ""); } else { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load"); if (start == 0) start = LocationHelper.GetAgvSite(mst.S_START_LOC); LogHelper.Info(string.Concat(new string[] { mst.S_TASK_NO, mst.S_START_LOC, "start agv点", start.ToString(), "-", TRow }), ""); } } if (end == 0) { end = LocationHelper.GetAgvSite(mst.S_END_LOC); LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}"); if (int.Parse(TRow) > 1) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow); LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}"); } } FRow = "1"; TRow = "0"; bool flag6 = taskType.Contains("即满下转上") || taskType.Contains("即空上转下") || taskType.Contains("即空上入库") || taskType.Contains("下线满入库"); if (flag6) { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load"); } bool flag7 = taskType.Contains("即满下转上") || taskType.Contains("即空上转下") || taskType.Contains("即空仓转下") || taskType.Contains("上线满出库"); if (flag7) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load"); } if (taskType.Contains("入空上转下")) { start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load"); var _llll = Settings.GetInStockCacheList().Find(x => x.location.Trim() == mst.S_END_LOC.Trim()); if (_llll != null && _llll.locationType == 34) end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load"); } else if (taskType.Contains("仓空转下空")) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load"); } //if (taskType.Trim() != "即满瓶盖-空上机" && (taskType.Contains("即") || taskType.Trim().StartsWith("J"))) //{ // FRow = "2"; //} //else //{ // FRow = "1"; //} } if (mst.S_TYPE.Contains("-J2")) { start = LocationHelper.GetAgvSite(mst.S_START_LOC.Trim(), "load"); } if (mst.S_TYPE.Contains("-2J")) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load"); } { var list_ = Settings.GetMoreBits(); if (list_.Find(x => x.Location == mst.S_START_LOC.Trim()) != null) { start = list_.Find(x => x.Location == mst.S_START_LOC.Trim()).StartBit; } else if (mst.S_TYPE.Contains("退库") && list_.Find(x => x.Location == mst.S_START_LOC.Trim() + "&BACK") != null) { start = list_.Find(x => x.Location == mst.S_START_LOC.Trim() + "&BACK").StartBit; } if (list_.Find(x => x.Location == mst.S_END_LOC.Trim()) != null) { end = list_.Find(x => x.Location == mst.S_END_LOC.Trim()).EndBit; } else if (mst.S_TYPE.Contains("退库") && list_.Find(x => x.Location == mst.S_END_LOC.Trim() + "&BACK") != null) { end = list_.Find(x => x.Location == mst.S_END_LOC.Trim() + "&BACK").EndBit; } } LogHelper.Info("SendTask " + mst.S_TASK_NO); Console.WriteLine("start=" + start.ToString()); Console.WriteLine("end= " + end.ToString()); NDC.AGVResult res = NDC.AddNewOrder(TSNo, new Dictionary { { "Pri", mst.N_PRIORITY.ToString() }, { "From", start.ToString() }, { "To", end.ToString() }, { "FRow", FRow }, { "TRow", TRow }, { "DispInfo", DispInfo }, { "CtrlVal", CtrlVal }, { "ChgTo", ChgTo }, { "Flow", Flow }, { "Tlow", Tlow }, { "No", mst.S_TASK_NO.Trim() } }); bool flag8 = res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009); if (flag8) { TaskHelper.UpdateStatus(mst, "已推送"); result = true; GeneralInterFaceFunc(mst, 8 + ""); } } else { result = true; } return result; } /// /// 创建搬运任务 /// /// /// /// /// /// /// /// /// /// public static bool CreateTransport(string wWorkNo, string start, string end, string taskType, List cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1, string note = "") { var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); var taskNo = DateTime.Now.Ticks.ToString(); LogHelper.Info($"CreateTransport- " + $"{taskNo}-{start}-{end}-{taskType}"); var res = TaskHelper.CreateTask(wWorkNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer, note, lockLoc: true); if (res) { result = true; //任务创建成功,起点货位出库锁定,终点货位入库锁定 //LocationHelper.LockLoc(start, "出库锁"); //LocationHelper.LockLoc(end, "入库锁"); } return result; } /// /// 返回任务号。创建的是管控任务。 /// /// /// /// /// /// /// /// /// /// /// public static string CreateTransport2(string wWorkNo, string start, string end, string taskType, List cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1) { var result = ""; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); //var taskNo = DateTime.Now.Ticks.ToString(); var taskNo = TaskHelper.GenerateTaskNo(); LogHelper.Info($"CreateTransport- " + $"{taskNo}-{start}-{end}-{taskType}"); //var res = TaskHelper.CreateTask(wWorkNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer); var fromLoc = LocationHelper.GetLocation(start.Trim()); var endLoc = LocationHelper.GetLocation(end.Trim()); WMSTask wmsTask = new WMSTask() { S_TASK_NO = taskNo, S_START_LAREA = fromLoc.S_AREA_CODE, S_END_LAREA = endLoc.S_AREA_CODE, S_DEPART_NAME = TaskHelper.GetDeptName(taskType), S_START_LOC = start.Trim(), S_END_LOC = end.Trim(), S_TYPE = taskType, S_SRC_NO = wWorkNo, N_PRIORITY = 60, S_WORK_MODE = "agv", S_B_STATE = "待审核",//"未执行", S_CNTRS = trayCodes, N_START_LAYER = startLayer, N_END_LAYER = endLayer, N_CNTR_COUNT = trayCarryCount }; LogHelper.Info($"CreateTransport- CreateTask" + $"{JsonConvert.SerializeObject(wmsTask)}"); var res = TaskHelper.CreateTask(wmsTask); if (res) { result = taskNo; //任务创建成功,起点货位出库锁定,终点货位入库锁定 LocationHelper.LockLoc(start, "出库锁"); LocationHelper.LockLoc(end, "入库锁"); } return result; } #endregion #region 翻斗机转运流程 //--------------------------------------------------翻斗机转运流程-------------------------------------------------- /// /// 任务信息接口--汉和任务每个状态进行实时上传(包括任务创建时,上报 8) /// /// internal static void GeneralInterFaceFunc(WMSTask wmsTask, string taskStatus) { var _loc = LocationHelper.GetLoc(wmsTask.S_START_LOC); if (_loc == null) { return; } string msg = ""; var req = new SimpleResult(); var db = new SqlHelper().GetInstance(); if (TaskHelper.CheckActionRecordExist(wmsTask.S_TASK_NO, "4") && taskStatus == "7") taskStatus = "2"; try { //获取上报接口的URL var url = $"{Settings.TaskReportUrl}/proxy/v1/generalInterface"; LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},获取URL:{url}"); //任务类型数据处理 string taskType = wmsTask.S_TYPE.Replace("-J2", "").Replace("-2J", ""); LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务类型:{taskType}"); var taskTypeInfo = db.Queryable().Where(a => a.taskTypeName == taskType).First(); if (taskTypeInfo != null) taskType = taskTypeInfo.taskType; else { LogHelper.Info($"●●●●●:任务号:{wmsTask.S_TASK_NO},任务类型对接没配置, 终止上报。"); return; } LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},任务类型数据处理:{taskType}"); //托盘物料数据处理mst.S_CNTRS.Substring(1). List cntrList = new List(wmsTask.S_CNTRS.Substring(1).Split('v'));//获取托盘数据 //string itemCode = "";//物料编码 GeneralInterFaceGetItemCodeFunc(wmsTask, db, cntrList, out string itemCode); LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},物料编码:{itemCode}"); List asnReferenceList = new List { };//托码数组 GeneralInterFaceGetTrayCodeFunc(wmsTask, db, asnReferenceList, cntrList); // LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},获取托盘数据:{JsonConvert.SerializeObject(asnReferenceList)}"); //AGV设备信息处理 string equipmentCode = ""; string orgCode = ""; string orgName = ""; string proxyInterfaceCode = "0050"; GeneralInterFaceGetAgvDeviceInfoFunc(wmsTask, db, ref equipmentCode, ref orgCode, ref orgName, ref proxyInterfaceCode); //if (string.IsNullOrEmpty(equipmentCode)) //{ // LogHelper.Info($"{Settings.FactoryCode}+{wmsTask.S_EQ_NO} 未找到车子, 可能是一厂任务,取消上报。"); // return; //} LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},equipmentCode:{equipmentCode},orgCode:{orgCode},orgName:{orgName},proxyInterfaceCode:{proxyInterfaceCode}"); DateTime dateTime = taskStatus == "1" ? Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8) : taskStatus == "2" || taskStatus == "7" ? Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8) : taskStatus == "8" ? Convert.ToDateTime(wmsTask.T_CREATE).AddHours(-8) : DateTime.UtcNow; string createTime = GetTimeStamp(wmsTask.T_CREATE.AddHours(-8), 1, 2); string startTime = ""; //在C#中,使用DateTimeOffset.UtcNow.ToUnixTimeSeconds()方法获取Unix时间戳时,可能会多出一个毫秒。这是因为Unix时间戳是以秒为单位的,而DateTimeOffset.UtcNow返回的是UTC时间,其精度为100纳秒。 if (wmsTask.S_WORK_MODE != "agv" && !string.IsNullOrEmpty(wmsTask.S_WORK_MODE)) startTime = wmsTask.S_WORK_MODE; else { startTime = wmsTask.T_START_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8), 1, 2); if (startTime != null) { wmsTask.S_WORK_MODE = startTime; db.Updateable(wmsTask).UpdateColumns(a => new { a.S_WORK_MODE }).ExecuteCommand(); } //else startTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); } string endTime = wmsTask.T_END_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8), 1, 2); //if (endTime == null) // endTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); string businessTime = taskStatus == "1" ? startTime : taskStatus == "2" || taskStatus == "7" ? endTime : taskStatus == "8" ? createTime : GetTimeStamp(dateTime, 1, 2); LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},任务开始时间:{wmsTask.T_START_TIME},转换后时间:{startTime}"); string sendMsg = JsonConvert.SerializeObject(new { taskCode = wmsTask.S_TASK_NO,//任务编码 taskStatus = taskStatus,//任务状态-任务创建成功传输 8 taskType = taskType,//任务类型-需要根据 配置表数据进行转换,转换为MES的任务类型 createTime = createTime,//需转换为 时间戳 wmsTask.T_CREATE startTime = startTime,//需转换为 时间戳 wmsTask.T_START_TIME endTime = endTime,//需转换为 时间戳 wmsTask.T_END_TIME businessTime = businessTime,//当前任务时间-需转换为 时间戳 DateTime.Now startAddress = wmsTask.S_START_LOC,//起点 endAddress = wmsTask.S_END_LOC,//终点 BindingLoc equipmentNo = wmsTask.S_EQ_NO,//车辆编号 equipmentCode = equipmentCode,//车辆铭牌-需要根据 配置表数据,通过 车辆编号以及工厂编码 查询对应车辆铭牌 orgCode = Settings.FactoryCode,//工厂编码 orgName = Settings.FactoryName,//工厂名称 sku = string.IsNullOrEmpty(itemCode) ? null : itemCode,//物料编码 asnReferenceDList = asnReferenceList,//托码数组 此次叉车叉的托盘喷码, 一次叉辆车,有两个编码 产线下线且非无码模式时传输 appliactionId = "MOBOX" //proxyInterfaceCode = proxyInterfaceCode //接口唯一标识码 固定值:0050 }); //http://yst-open-zuul-qa.idc.yst.com.cn/proxy/v1/ var feedback = new HttpHelper().WebPost(url, sendMsg); ;//YKRWSD AreaRowLockState LogHelper.Info("任务状态上报" + req + ";rrr:" + JsonConvert.SerializeObject(feedback)); } catch (Exception ex) { LogHelper.Error(ex.Message, ex); msg = $"任务上报 Error:TaskInfo:{JsonConvert.SerializeObject(wmsTask)},TaskState:{taskStatus},ErrorMsg:{ex.Message}"; } LogHelper.Info(msg); } /// /// FuLeWebPost /// /// 发送内容 /// 接口名称 /// 扩展参数 /// public static string GetTimeStamp(DateTime dateTime, int DataBitType, int TimeType) { string timeStamp = ""; //时间戳打印 TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//时间戳获取 double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//秒级|毫秒级时间获取 string TimeTypeInfo = TimeType == 1 ? "秒级" : "毫秒级"; timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString(); //double result = 0; //result = DataBitType == 32 ? Convert.ToInt32(tsTime) : Convert.ToInt64(tsTime); return timeStamp; } /// /// 任务信息接口--获取物料编码 /// /// private static string GeneralInterFaceGetItemCodeFunc(WMSTask wmsTask, SqlSugarClient db, List cntrList, out string itemCode) { itemCode = ""; if (cntrList.Count > 0) { string SrcNo = wmsTask.S_SRC_NO?.Trim(); if (!string.IsNullOrEmpty(SrcNo)) { var workInfo = db.Queryable().Where(a => a.SQL_WorkNo == SrcNo).First(); if (workInfo != null && workInfo?.FromFuLe?.Trim() == "Y") itemCode = workInfo.SQL_ItemCode; } } if (!string.IsNullOrEmpty(itemCode)) { itemCode = ContainerHelper.GetItem(itemCode)?.S_ITEM_CODE ?? null; } return itemCode; } public class asnReferenceDModel { public string asnReferenceD { get; set; } } /// /// 任务信息接口--获取托盘数据 /// /// private static void GeneralInterFaceGetTrayCodeFunc(WMSTask wmsTask, SqlSugarClient db, List asnReferenceList, List cntrList) { string SrcNo = wmsTask.S_SRC_NO?.Trim(); //根据任务中存放的工单号,获取工单类型--因为淳安 满托下线任务包含 下线 值,因此多判断一步,减少工单表的查询 if (!string.IsNullOrEmpty(SrcNo)) { var workInfo = db.Queryable().Where(a => a.SQL_WorkNo == SrcNo).First(); if (workInfo != null) { if (workInfo.FromFuLe == "Y") { if (cntrList.Count > 0) { cntrList.ForEach(a => { if (!string.IsNullOrEmpty(a)) asnReferenceList.Add(new asnReferenceDModel { asnReferenceD = a }); }); } } } } } /// /// 任务信息接口--获取AGV设备信息数据 /// /// /// /// /// /// /// private static void GeneralInterFaceGetAgvDeviceInfoFunc(WMSTask wmsTask, SqlSugarClient db, ref string equipmentCode, ref string orgCode, ref string orgName, ref string proxyInterfaceCode) { if (!string.IsNullOrEmpty(wmsTask.S_EQ_NO)) { var agvDeviceInfo = db.Queryable().Where(a => a.equipmentNo == wmsTask.S_EQ_NO && a.orgCode == Settings.FactoryCode).First(); if (agvDeviceInfo != null) { equipmentCode = agvDeviceInfo.equipmentCode; orgCode = agvDeviceInfo.orgCode; orgName = agvDeviceInfo.orgName; proxyInterfaceCode = agvDeviceInfo.proxyInterfaceCode; } } } #endregion #region 瓶盖区 - 总 - 线程 /// /// 这里只支持 即产满空公用位是一层。 /// /// /// /// public static bool FDJTakeEmpyt2(Settings.deviceInfo plc, WorkOrder workOrder) { var isUsing = workOrder.SQL_UsingNow.Trim() == "Y"; //LogHelper.Info("TakeEmpyt212 翻斗鸡取空筐。"); Location startbit = LocationHelper.GetLoc(plc.location[0]); var location = startbit.S_LOC_CODE; var hasin = false; LocationHelper.GetT_FULL_ready.TryGetValue(location, out hasin); if (hasin) { LogHelper.Info($"{location} 翻斗机取空 流程 已在筛选中。"); return false; } else { if (LocationHelper.GetT_FULL_ready.ContainsKey(location)) LocationHelper.GetT_FULL_ready[location] = true; else LocationHelper.GetT_FULL_ready.Add(location, true); } var botf = false; Location endbit = null; int endLayer = 1; //List bits = (from x in Settings.GetInStockCacheList() // where x.locationType == (isUsing ? 12 : 11) // select x).ToList(); //List locs = LocationHelper.GetLocList((Location x) => bits.Select((Settings.inStockCacheBit y) => y.location.Trim().ToUpper()).Contains(x.S_LOC_CODE.Trim().ToUpper())).ToList(); //var locs = LocationHelper.GetAllLocListByAreaCode(isUsing?workOrder.SQL_Area:"") var _locrel = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE); if (_locrel.Count == 0) { LogHelper.Info("TakeEmpyt212 翻斗鸡取空筐。没有筐"); goto label__end; } var b = _locrel.FirstOrDefault().S_CNTR_CODE.Contains("J"); var areaList = new List { b ? "JCJYKK" : "PPKK" }; if (!b) { if (plc.deviceName.Contains("3线翻斗机")) { botf = true; areaList = new List { "PPTKK", "PPFKK", "PPKK" }; } else if (plc.deviceName.Contains("4线翻斗机")) { botf = true; areaList = new List { "PPFKK", "PPTKK", "PPKK" }; } } ballllll: var _areaCode = areaList.FirstOrDefault(); areaList.Remove(_areaCode); var locs = LocationHelper.GetAllLocListByAreaCode(_areaCode, 0, 0); if (locs.Count > 0) { locs.RemoveAll(x => x.S_LOCK_STATE == "报废"); var _temp = locs.FindAll(x => x.S_LOCK_STATE.Trim() != "无").ToList(); if (_temp.Any()) { _temp.ForEach(y => { locs.RemoveAll((Location x) => y.S_AREA_CODE.Trim() == x.S_AREA_CODE.Trim() && y.N_ROW == x.N_ROW); }); } //locs = locs?.OrderBy(X => X.N_ROW).ThenBy(X => X.N_COL).ToList(); //var locs2 = locs.FindAll(x => x.N_CURRENT_NUM < x.N_CAPACITY);//locs.FindAll(x => x.N_CURRENT_NUM < x.N_CAPACITY); //endbit = locs?.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0 && x.N_CURRENT_NUM < x.N_CAPACITY); //if (locs2.Count() == 0) //{ // LogHelper.Info("没有可用的" + (isUsing ? "即产" : "入库") + (b) + "空筐终点"); // goto label__end; //} //var _loc = locs2;//.OrderByDescending(x => x.N_CURRENT_NUM).FirstOrDefault(); if (endbit == null) foreach (IGrouping item in locs.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { List _cols = item.OrderBy(x => x.N_COL).ToList(); Location e = _cols.FindAll((Location x) => x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。 if (e != null && e.N_CURRENT_NUM < e.N_CAPACITY) { endbit = e; } else { var empT = _cols.FindAll(x => x.N_CURRENT_NUM == 0).FirstOrDefault();//从左往右d位 if (empT != null) endbit = empT; } if (endbit != null) break; } if (endbit == null) { LogHelper.Info(_areaCode + "没有可用的" + (b ? "即产" : "入库") + "空筐终点"); if (areaList.Count > 0) goto ballllll; goto label__end; } //if (_loc != null) //{ // if (_loc.N_CURRENT_NUM > 0)//不满 // { // endbit = _loc; // endLayer = _loc.N_CURRENT_NUM + 1; // } // else//空位要按顺序了。 // { // var _llll = locs2.OrderBy(x => x.N_COL).GroupBy(x => x.N_COL).FirstOrDefault().OrderBy(x => x.N_ROW).ToList(); // endbit = _llll.LastOrDefault(); // endLayer = endbit.N_CURRENT_NUM + 1; // } //} } else { LogHelper.Info(_areaCode + (b ? "即产" : "入库") + "空筐区 没配置。 "); if (areaList.Count > 0) goto ballllll; } if (startbit != null && endbit != null) { List ctrs = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE); List carryCntrs = ctrs.Select((LocCntrRel x) => x.S_CNTR_CODE).ToList(); bool bb = CreateTransport(workOrder.SQL_WorkNo, startbit.S_LOC_CODE, endbit.S_LOC_CODE, "翻斗机取空到" + (b ? "即产" : "入库"), carryCntrs, 1, endLayer, 1, 60); LogHelper.Info("翻斗机取空到" + (b ? "即产" : "入库") + string.Format("起点:{0} 终点:{1} 托盘:{2} {3}", startbit.S_LOC_CODE, endbit.S_LOC_CODE, JsonConvert.SerializeObject(carryCntrs), bb ? "任务创建成功" : "任务创建失败。")); //return bb; //goto label__end; LocationHelper.GetT_FULL_ready[location] = false; return bb; } label__end: if (botf) { //生成转筐 //算了。 用线程吧 } LocationHelper.GetT_FULL_ready[location] = false; return false; } public static void TakeFull2FDJ(Settings.deviceInfo plc, WorkOrder workOrder) { var isUsing = workOrder.SQL_UsingNow.Trim() == "Y"; //} //LogHelper.Info("TakeFull2FDJ 翻斗鸡 叫满框"); string location = plc.location[0]; var hasin = false; LocationHelper.GetT_FULL_ready.TryGetValue(location, out hasin); if (hasin) { LogHelper.Info($"{location} 翻斗机送满 流程 已在筛选中。"); goto label__end; } else { if (LocationHelper.GetT_FULL_ready.ContainsKey(location)) LocationHelper.GetT_FULL_ready[location] = true; else LocationHelper.GetT_FULL_ready.Add(location, true); } Location endbit = LocationHelper.GetLoc(plc.location[0]); /// 这里是查看之前的任务在哪一步了。2024年9月9日 13:56:07 要求取消任务完成后呼叫 //var ret = false; //LocationHelper.DoAction(db => //{ // var tasks = db.Queryable().Where(x => x.S_START_LOC == endbit.S_LOC_CODE && "取货完成,开始卸货,卸货完成".Contains(x.S_B_STATE)).ToList(); // if (tasks.Any()) // { // LogHelper.Info($"{endbit.S_LOC_CODE} 的下线任务还没完成。 等待完成后 在呼叫任务。-- 2024年8月30日 10:27:14 现场要求"); // ret = true; // } // return true; //}); //if (ret) // goto label__end; Location startbit = null; int startlayer = 1; LogHelper.Info(plc.deviceName + "工单链接区域->" + workOrder.SQL_Area + " 。翻斗指定出库库区排>" + workOrder.S_ROW1); var lineTo = (workOrder.SQL_LinkLineNO?.Trim() ?? "") + ">"; List locs = LocationHelper.GetAllLocListByAreaCode(workOrder.SQL_Area, 0, 0); locs.RemoveAll(x => x.S_LOCK_STATE == "报废"); string _type = "翻斗机叫满" + (isUsing ? "即产" : "出库"); string desc = ""; if (isUsing) { if (locs.Count > 0) { List _temp = (from x in locs.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无") select x.N_ROW).Distinct().ToList(); if (_temp.Any()) { locs.RemoveAll((Location x) => _temp.Contains(x.N_ROW)); } //locs = locs.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE.Trim() == "无"); var loc_list_PEM = new List(); foreach (var item1 in locs) { var _ctrl = LocationHelper.GetLocCntrRel(item1.S_LOC_CODE); //if (_ctrl.Count > 0 && _ctrl.FirstOrDefault().S_CNTR_CODE.Contains("J")) if (_ctrl.Count > 0 && _ctrl.FirstOrDefault().S_TYPE.Contains(workOrder.SQL_ItemCode)) { loc_list_PEM.Add(item1); break; } } var _loc = loc_list_PEM?.OrderBy(x => x.T_FULL_TIME).FirstOrDefault();//.Find(x => x.S_NOTE == workOrder.SQL_ItemCode); if (loc_list_PEM.Count == 0 || _loc == null) { LogHelper.Info("满筐区 没有可用的即产满筐 - 切筐"); //var Turn_ready = LocationHelper.Turn_ready; //转筐 DateTime dateTime = DateTime.Now; if (LocationHelper.Turn_ready.TryGetValue(endbit.S_LOC_CODE, out dateTime)) { if (DateTime.Now.Subtract(dateTime).TotalMinutes > plc.EmptyWait) { LocationHelper.Turn_ready.Remove(endbit.S_LOC_CODE); desc = "切出库"; goto Label_noUsing; } } else { LocationHelper.Turn_ready.Add(endbit.S_LOC_CODE, DateTime.Now); } goto label__end; } //if (_loc.N_CURRENT_NUM == _loc.N_CAPACITY) //{ // _loc = loc_list_PEM.FindAll(x => x.S_NOTE == workOrder.SQL_ItemCode).OrderBy(x => x.T_FULL_TIME).FirstOrDefault(); //} startbit = _loc; startlayer = _loc.N_CURRENT_NUM; goto Label_Task; } else { LogHelper.Info("" + (isUsing ? "即产" : "出库") + "满筐区 没配置。 "); goto label__end; } } Label_noUsing: { var areaList = ""; if (plc.deviceName.Contains("3线翻斗机")) areaList = "PPTMKZZ"; if (plc.deviceName.Contains("4线翻斗机")) areaList = "PPFMKZZ"; BBBBBBL: if (string.IsNullOrEmpty(areaList)) { if (string.IsNullOrEmpty(workOrder.S_ROW1)) { goto label__end; } var rs = workOrder.S_ROW1.Split('='); var rows = Array.ConvertAll(rs[rs.Length - 1].Split('-'), Convert.ToInt32); locs = LocationHelper.GetAreaNormalLocList(rs[0]).FindAll(x => rows.Contains(x.N_ROW)); } else { locs = LocationHelper.GetAreaNormalLocList(areaList); } //locs = LocationHelper.GetAllLocListByAreaCode("PPMKCK", 0, 0); //locs.RemoveAll(x => x.S_LOCK_STATE == "报废"); //var _temp = locs.FindAll(x => x.S_LOCK_STATE.Trim() != "无").ToList(); //if (_temp.Any()) //{ // _temp.ForEach(y => // { // locs.RemoveAll((Location x) => y.S_AREA_CODE.Trim() == x.S_AREA_CODE.Trim() && y.N_ROW == x.N_ROW); // }); //} if (false) { //1 找半满位 //locs = locs?.OrderBy(x => x.N_ROW).ThenByDescending(x => x.N_COL).ToList(); startbit = locs?.OrderBy(x => x.N_ROW).ThenByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); //startbit = locs?.Find(x => x.N_CURRENT_NUM > 0 && x.N_CURRENT_NUM < x.N_CAPACITY); //if (startbit == null) //{ // //没有不满的。 找满货位。 // startbit = locs?.Find(x => x.N_CURRENT_NUM > 0); //locs?.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).GroupBy(x => x.N_COL).FirstOrDefault()?.OrderBy(x => x.N_ROW).FirstOrDefault(); //} } else { var rowlist = LocationHelper.GetRowLock(locs.FirstOrDefault().S_AREA_CODE); foreach (IGrouping item in locs.GroupBy(x => x.N_ROW).OrderBy(y => rowlist.Find(x => x.S_LOCK_STATE == "出库锁" && x.N_ROW == y.Key)?.T_CREATE ?? DateTime.Now).ThenBy(x => x.ToList().FindAll(y => y.N_CURRENT_NUM > 0).Count)) { var tnotnull = rowlist.Find(x => x.S_LOCK_STATE == "入库锁" && x.N_ROW == item.Key); if (tnotnull != null) continue; List _cols = item.OrderBy(x => x.N_COL).ToList(); Location e = _cols.FindAll((Location x) => x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。 if (e != null) { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{lineTo}{workOrder.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{lineTo}{workOrder.SQL_ItemName}"))) { startbit = e; break; } else { LogHelper.Info($"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次上{lineTo}{workOrder.SQL_ItemCode} 不符。 筛选下一排"); continue; } } } } if (startbit != null) startlayer = startbit.N_CURRENT_NUM; else { LogHelper.Info("没有符合条件的起点出库满框"); if (!string.IsNullOrEmpty(areaList) && areaList.Contains("MKZZ")) { areaList = ""; goto BBBBBBL; } goto label__end; } } Label_Task: LogHelper.Info($"Label_Task=>startbit{JsonConvert.SerializeObject(startbit)} endbit{JsonConvert.SerializeObject(endbit)} "); if (startbit != null && endbit != null) { List ctrs = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE); List carryCntrs = ctrs.Select((LocCntrRel x) => x.S_CNTR_CODE.Trim()).Take(1).ToList(); bool bb = CreateTransport(workOrder.SQL_WorkNo, startbit.S_LOC_CODE, endbit.S_LOC_CODE, "翻斗机叫满" + (isUsing ? "即产" : "出库") + desc, carryCntrs, startlayer, 1, 1, 60); LogHelper.Info("翻斗机叫满" + (isUsing ? "即产" : "出库") + string.Format(".起点:{0} 终点:{1} 托盘:{2} {3}", startbit.S_LOC_CODE, endbit.S_LOC_CODE, JsonConvert.SerializeObject(carryCntrs), bb ? "任务创建成功" : "任务创建失败。")); } label__end: LocationHelper.GetT_FULL_ready[location] = false; } #endregion } }