| | |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Security.Cryptography; |
| | | using System.Threading.Tasks; |
| | | using System.Xml.Linq; |
| | | using static HH.WCS.Mobox3.NFLZ.api.OtherModel; |
| | | using static HH.WCS.Mobox3.NFLZ.dispatch.NDCApi; |
| | |
| | | Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList(),mst.S_TYPE); |
| | | if (mst.S_TYPE.Contains("满托上线")) |
| | | { |
| | | //解绑物料 |
| | | new SqlHelper<object>().GetInstance().Deleteable<CntrItemRel>().Where(a => mst.S_CNTR_CODE.Contains(a.S_CNTR_CODE)).ExecuteCommand(); |
| | | new SqlHelper<object>().GetInstance().Updateable<Container>().SetColumns(a => a.N_DETAIL_COUNT == 0).Where(a => mst.S_CNTR_CODE.Contains(a.S_CODE)).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | //起点终点解锁 |
| | | LocationHelper.UnLockLoc(mst.S_START_LOC); |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | /// <exception cref="NotImplementedException"></exception> |
| | | public static void EmptyTask(WCSTask mst) |
| | | { |
| | | //瓶盖注塑机空托上线,若急产急用库区没有多余的空托,则在非急产急用空托区拿空托 |
| | | //瓶盖注塑机空托上线,若即产急用库区没有多余的空托,则在非即产急用空托区拿空托 |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | Location startLoca = null; |
| | | |
| | |
| | | Extend2 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First().S_AGV_SITE; |
| | | if (mst.N_START_LAYER > 1) |
| | | { |
| | | Extend1 = db.Queryable<LocationExt>().Where(a => a.S_LOC_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_START_LAYER).First().S_AGV_SITE; |
| | | if(mst.S_TYPE != "瓶坯非即产空框入库" && mst.S_TYPE != "瓶坯接驳位入库" && mst.S_TYPE != "瓶盖空托入库") |
| | | { |
| | | Extend1 = db.Queryable<LocationExt>().Where(a => a.S_LOC_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_START_LAYER).First().S_AGV_SITE; |
| | | } |
| | | |
| | | } |
| | | if (mst.N_END_LAYER > 1) |
| | | { |
| | | Extend2 = db.Queryable<LocationExt>().Where(a => a.S_LOC_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_END_LAYER).First().S_AGV_SITE; |
| | | Extend2 = db.Queryable<LocationExt>().Where(a => a.S_LOC_CODE == mst.S_END_LOC && a.N_LAYER == mst.N_END_LAYER).First().S_AGV_SITE; |
| | | } |
| | | if(mst.S_TYPE == "瓶坯非急产补满框" || mst.S_TYPE == "瓶盖非急产补满框" || mst.S_TYPE == "瓶坯非急产补空框" || mst.S_TYPE == "瓶盖非急产补空框" || mst.S_TYPE == "注塑即产满托下线(瓶坯)") |
| | | if(mst.S_TYPE == "瓶坯非即产补满框" || mst.S_TYPE == "瓶盖非即产补满框大包装" || mst.S_TYPE == "瓶坯非即产补空框" || mst.S_TYPE == "瓶盖非即产补空框" || mst.S_TYPE == "注塑即产满托下线(瓶坯)") |
| | | { |
| | | Extend2 = Settings.dXSites.Where(it => it.loc == mst.S_END_LOC).First().site.ToString(); |
| | | } |
| | | |
| | | if(mst.S_TYPE == "接驳位入库") |
| | | { |
| | | if(mst.S_CNTR_CODE.Split(',').ToList().Count != 2) |
| | | { |
| | | Extend1 = db.Queryable<LocationExt>().Where(a => a.S_LOC_CODE == mst.S_START_LOC && a.N_LAYER == 1).First().S_AGV_SITE; |
| | | } |
| | | } |
| | | |
| | | Extend3 = "0"; |
| | |
| | | //Extend4 = db.Queryable<LinjiangBCPWorkOrder>().Where(a => a.S_WorkNo == workNo).First().S_UsingNow == "N" ? "2" : "1"; |
| | | |
| | | //瓶坯注塑机站点根据配置文件获取 |
| | | if (taskType.Contains("注塑") && taskType.Contains("瓶坯")) |
| | | { |
| | | var devInfo = Settings.deviceInfos.Where(a => (a.TN_Location.Contains(mst.S_START_LOC) || a.TN_Location.Contains(mst.S_END_LOC)) && a.enable == 1).FirstOrDefault(); |
| | | string machine = (devInfo.TN_Location[0] == mst.S_START_LOC || devInfo.TN_Location[0] == mst.S_END_LOC) ? "A" : "B"; |
| | | string machineTwo = devInfo.deviceName.Split('-')[1] + machine; |
| | | LogHelper.Info($"机台:{machineTwo}"); |
| | | var siteInfo = Settings.pPZSJSites.Where(a => a.siteName == machineTwo && a.enable == 1).FirstOrDefault(); |
| | | if (siteInfo != null) |
| | | { |
| | | if (taskType.Contains("空托上线")) |
| | | { |
| | | //改变终点站点 |
| | | Extend2 = siteInfo.site[1]; |
| | | } |
| | | else |
| | | { |
| | | //改变起点站点 |
| | | Extend1 = siteInfo.site[0]; |
| | | } |
| | | } |
| | | else LogHelper.Info("配置文件未配置瓶坯注塑机站点"); |
| | | } |
| | | //if (taskType.Contains("注塑") && taskType.Contains("瓶坯")) |
| | | //{ |
| | | // var devInfo = Settings.deviceInfos.Where(a => (a.TN_Location.Contains(mst.S_START_LOC) || a.TN_Location.Contains(mst.S_END_LOC)) && a.enable == 1).FirstOrDefault(); |
| | | // string machine = (devInfo.TN_Location[0] == mst.S_START_LOC || devInfo.TN_Location[0] == mst.S_END_LOC) ? "A" : "B"; |
| | | // string machineTwo = devInfo.deviceName.Split('-')[1] + machine; |
| | | // LogHelper.Info($"机台:{machineTwo}"); |
| | | // var siteInfo = Settings.pPZSJSites.Where(a => a.siteName == machineTwo && a.enable == 1).FirstOrDefault(); |
| | | // if (siteInfo != null) |
| | | // { |
| | | // if (taskType.Contains("空托上线")) |
| | | // { |
| | | // //改变终点站点 |
| | | // Extend2 = siteInfo.site[1]; |
| | | // } |
| | | // else |
| | | // { |
| | | // //改变起点站点 |
| | | // Extend1 = siteInfo.site[0]; |
| | | // } |
| | | // } |
| | | // else LogHelper.Info("配置文件未配置瓶坯注塑机站点"); |
| | | //} |
| | | } |
| | | |
| | | Console.WriteLine($"[SendTask]:TaskNo={mst.S_CODE.Trim()},start={Extend1},end={Extend2}"); |
| | |
| | | .ToList(); |
| | | if (locInfo.Count > 0) |
| | | { |
| | | if(areaName == "瓶坯即产满框缓存") |
| | | { |
| | | locInfo = locInfo.Where(a => a.N_ROW == 1 || a.N_ROW == 2).ToList(); |
| | | } |
| | | |
| | | LogHelper.Info($"入库算法02:查询到可入货位的数量为:{locInfo.Count}"); |
| | | foreach (var a in locInfo) |
| | | { |
| | |
| | | var endItemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == endCntrInfo.S_CNTR_CODE).First(); |
| | | if (endItemInfo != null) |
| | | { |
| | | endItemCode = endItemInfo.S_ITEM_CODE; |
| | | endItemCode = endItemInfo.S_ITEM_CODE + endItemInfo.S_BATCH_NO; |
| | | } |
| | | } |
| | | else |
| | |
| | | else |
| | | { |
| | | //查询后面当前货位后一个 |
| | | result = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW > a.N_ROW && b.S_LOCK_STATE == "无").OrderBy(b => b.N_COL).First(); |
| | | result = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW == a.N_ROW && b.N_COL > a.N_COL && b.N_CURRENT_NUM < b.N_CAPACITY && b.S_LOCK_STATE == "无").OrderBy(b => b.N_COL).First(); |
| | | } |
| | | if (result != null) |
| | | { |
| | |
| | | var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).Includes(a => a.LocCntrRel).ToList(); |
| | | if (locList.Count > 0) |
| | | { |
| | | if(areaName == "瓶坯即产满框缓存" && string.IsNullOrEmpty(itemCode)) |
| | | { |
| | | locList = locList.Where(a => a.N_ROW == 3).ToList(); |
| | | } |
| | | LogHelper.Info($"出库算法02:查询到可出货位数量:{locList.Count}"); |
| | | foreach (var a in locList) |
| | | { |
| | |
| | | LogHelper.Info($"瓶坯注塑满托下线:类型:{taskName},物料编码:{itemCode}"); |
| | | if (taskName.Contains("即产")) |
| | | { |
| | | //注塑机急产即用下线,首先下线到即产即用满框线边,满眶线边满了,下到即产即用满框缓存区,满框缓存区满了,下到入库接驳堆叠位 |
| | | //注塑机即产即用下线,首先下线到即产即用满框线边,满眶线边满了,下到即产即用满框缓存区,满框缓存区满了,下到入库接驳堆叠位 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框" && a.enable == 1).FirstOrDefault(); |
| | | if(areaInfo != null) |
| | | { |
| | |
| | | { |
| | | LogHelper.Info($"{endAreaName}未配置"); |
| | | } |
| | | |
| | | if(result == null) |
| | | { |
| | | if(endAreaName == "翻斗机库存空托下线(瓶坯)") |
| | | { |
| | | //瓶坯非即产空托下线 如果非即产空框库区无法入库,则下线到瓶坯即产满框缓存 4 5 排 |
| | | areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框缓存" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && (a.N_ROW == 4 || a.N_ROW == 5) && a.N_CURRENT_NUM == 0).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList(); |
| | | if (locList.Count > 0) |
| | | { |
| | | foreach (var a in locList) |
| | | { |
| | | var rowInfo = db.Queryable<RowLock>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.S_ROW == a.S_ROW && a.S_LOCK_STATE == "无").First(); |
| | | if (rowInfo != null && a.S_LOCK_STATE == "无") |
| | | { |
| | | result = a; |
| | | break; |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶坯即产满框缓存未配置"); |
| | | } |
| | | } |
| | | if(endAreaName == "翻斗机即产空托下线(瓶坯)") |
| | | { |
| | | //瓶坯即产空托下线 如果即产空框库区无法入库,则下线到瓶坯即产满框缓存 3 排 |
| | | areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框缓存" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_ROW == 3 && a.N_CURRENT_NUM == 0).OrderBy(a => a.N_COL).First(); |
| | | if (locInfo != null ) |
| | | { |
| | | var rowInfo = db.Queryable<RowLock>().Where(b => b.S_AREA_CODE == locInfo.S_AREA_CODE && b.S_ROW == locInfo.S_ROW && locInfo.S_LOCK_STATE == "无").First(); |
| | | if (rowInfo != null && locInfo.S_LOCK_STATE == "无") |
| | | { |
| | | result = locInfo; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶坯即产满框缓存未配置"); |
| | | } |
| | | if(result == null) |
| | | { |
| | | BCPEmptyOut(db, "翻斗机库存空托下线(瓶坯)"); |
| | | } |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | |
| | | /// </summary> |
| | | /// <param name="cntr"></param> |
| | | /// <returns></returns> |
| | | internal static bool BindLocCntr(string loc, string cntr, string itemCode, string batchNo, string deviceName = "", string itemlayer = "") |
| | | internal static bool BindLocCntr(string loc, string cntr, string itemCode, string batchNo, string deviceName = "", string itemlayer = "",string itemName = "") |
| | | { |
| | | LogHelper.Info($"绑定货位容器表,loc:{loc},cntr:{cntr}"); |
| | | bool result = true; |
| | |
| | | { |
| | | var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode, S_SRC = deviceName }; |
| | | if (db.Insertable<LocCntrRel>(cir).ExecuteCommand() > 0) LogHelper.Info($"货位容器表绑定成功,货位号:{loc},托盘号:{cntrCode}"); |
| | | BindCntrItem(cntrCode, itemCode, batchNo, itemlayer); |
| | | var Con = db.Queryable<Container>().Where(a => a.S_CODE == cntrCode).First(); |
| | | if(Con == null) |
| | | { |
| | | int detallCount = 0; |
| | | if (!string.IsNullOrEmpty(itemCode)) |
| | | { |
| | | detallCount = 1; |
| | | } |
| | | if(db.Insertable<Container>(new Container |
| | | { |
| | | S_CODE = cntrCode, |
| | | N_TYPE = 1, |
| | | N_DETAIL_COUNT = detallCount |
| | | }).ExecuteCommand() > 0) |
| | | { |
| | | LogHelper.Info($"容器表绑定成功,托盘号:{cntrCode}"); |
| | | } |
| | | } |
| | | if (!string.IsNullOrEmpty(itemCode)) |
| | | { |
| | | BindCntrItem(cntrCode, itemCode, batchNo, itemlayer, itemName); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | |
| | | /// <param name="batchNo"></param> |
| | | /// <param name="qty"></param> |
| | | /// <returns></returns> |
| | | internal static bool BindCntrItem(string trayCode, string itemCode, string batchNo, string itemlayer = "") |
| | | internal static bool BindCntrItem(string trayCode, string itemCode, string batchNo, string itemlayer = "",string itemName = "") |
| | | { |
| | | LogHelper.Info($"绑定容器物料表,trayCode:{trayCode}"); |
| | | var res = false; |
| | |
| | | var info = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE.Trim() == trayCode.Trim()).First(); |
| | | if (info == null) |
| | | { |
| | | var cir = new CntrItemRel { S_CNTR_CODE = trayCode, S_BATCH_NO = batchNo, S_ITEM_CODE = itemCode, S_ITEM_MODEL = itemlayer }; |
| | | if (db.Insertable<CntrItemRel>(cir).ExecuteCommand() > 0) LogHelper.Info($"容器物料表绑定成功,托盘号:{trayCode},物料编码:{itemCode},物料层数:{itemlayer}"); |
| | | var cir = new CntrItemRel { S_CNTR_CODE = trayCode, S_BATCH_NO = batchNo, S_ITEM_CODE = itemCode, S_ITEM_MODEL = itemlayer,S_ITEM_NAME = itemName }; |
| | | if (db.Insertable<CntrItemRel>(cir).ExecuteCommand() > 0) LogHelper.Info($"容器物料表绑定成功,托盘号:{trayCode},物料编码:{itemCode},物料层数:{itemlayer},物料名称:{itemName}"); |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 计算瓶坯非即产空托起点 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | internal static Location FJCKTLoc() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | Location result = null; |
| | | //在瓶坯即产满框 查询 4 5两排的空框 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框缓存" && a.enable == 1).FirstOrDefault(); |
| | | if(areaInfo != null) |
| | | { |
| | | var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && (a.N_ROW == 4 || a.N_ROW == 5) && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList(); |
| | | if(locList.Count > 0) |
| | | { |
| | | foreach (var a in locList) |
| | | { |
| | | var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First(); |
| | | if(cntrInfo != null) |
| | | { |
| | | var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First(); |
| | | if(itemInfo == null) |
| | | { |
| | | var rowInfo = db.Queryable<RowLock>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.S_ROW == a.S_ROW && b.S_LOCK_STATE == "无").First(); |
| | | if (rowInfo != null && a.S_LOCK_STATE == "无") |
| | | { |
| | | result = a; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if(result == null) |
| | | { |
| | | result = TaskProcess.BCPInOrOut(db, false, "瓶坯库区", ""); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 取消任务 |
| | | /// </summary> |
| | | /// <param name="tN_Task"></param> |
| | | /// <exception cref="NotImplementedException"></exception> |
| | | internal static void cancelTask(WCSTask TN_Task) |
| | | { |
| | | if(!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 4)) |
| | | { |
| | | //取消任务 |
| | | WCSHelper.UpdateStatus(TN_Task.S_CODE, 4); |
| | | if (TN_Task.S_TYPE == "接驳位入库") |
| | | { |
| | | new SqlHelper<object>().GetInstance().Deleteable<CntrItemRel>().Where(a => TN_Task.S_CNTR_CODE.Contains(a.S_CNTR_CODE)).ExecuteCommand(); |
| | | new SqlHelper<object>().GetInstance().Deleteable<LocCntrRel>().Where(a => TN_Task.S_CNTR_CODE.Contains(a.S_CNTR_CODE)).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | WCSHelper.UpdateStatus(TN_Task.S_CODE, 3); |
| | | } |
| | | |
| | | var op = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); |
| | | if (op != null) |
| | | { |
| | | if (op.N_B_STATE == 0) |
| | | { |
| | | //等待直接修改状态为取消 |
| | | op.N_B_STATE = 3; |
| | | } |
| | | else if (op.N_B_STATE == 1) |
| | | { |
| | | if (WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 4)) |
| | | { |
| | | op.N_B_STATE = 2; |
| | | } |
| | | else |
| | | { |
| | | op.N_B_STATE = 3; |
| | | } |
| | | } |
| | | |
| | | WMSHelper.UpdateTaskState(op); |
| | | } |
| | | NDCApi.CancelOrder(TN_Task.S_CODE.Trim()); |
| | | OperateStatus(TN_Task, 7); |
| | | } |
| | | } |
| | | } |