| | |
| | | using HH.WCS.Mobox3.NFLZ.util; |
| | | using HH.WCS.Mobox3.NFLZ.wms; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Security.Cryptography; |
| | | using System.Xml.Linq; |
| | | using static HH.WCS.Mobox3.NFLZ.api.OtherModel; |
| | | using static HH.WCS.Mobox3.NFLZ.dispatch.NDC; |
| | | using static HH.WCS.Mobox3.NFLZ.dispatch.NDCApi; |
| | | using static HH.WCS.Mobox3.NFLZ.wms.WMSHelper.AddChangeModel; |
| | | |
| | | namespace HH.WCS.Mobox3.NFLZ.process |
| | |
| | | if (mst.S_TYPE.Contains("空托上线")) |
| | | { |
| | | LogHelper.Info($"{mst.S_TYPE}卸货完成,写入信号"); |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_END_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | if(state == 6) |
| | | { |
| | | var signal = devInfo.TN_Location[0] == mst.S_END_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务卸货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_END_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | { |
| | | var signal = devInfo.TN_Location[0] == mst.S_END_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务卸货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}"); |
| | | } |
| | | if (mst.S_TYPE.Contains("满托上线")) |
| | | { |
| | |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | { |
| | | var signal = "3F 00 12 22 00 0D 0A"; |
| | | var signal = "3F 00 12 21 0D 0A"; |
| | | if (state == 1102) signal = "3F 00 10 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | |
| | | if (mst.S_TYPE.Contains("满托下线")) |
| | | { |
| | | LogHelper.Info($"{mst.S_TYPE}取货完成,写入信号"); |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_START_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | if(state == 4) |
| | | { |
| | | var signal = devInfo.TN_Location[0] == mst.S_START_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_START_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | { |
| | | var signal = devInfo.TN_Location[0] == mst.S_START_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_START_LOC}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_START_LOC}"); |
| | | } |
| | | } |
| | | |
| | |
| | | if (state == 6)//卸货完成 |
| | | { |
| | | claimGoodsTime(mst, state); |
| | | writeSignal(mst); |
| | | CacheBitUpdate(mst, false); |
| | | } |
| | | if (state == 7) |
| | |
| | | if (mst.S_TYPE.Contains("满托下线")) |
| | | { |
| | | LogHelper.Info($"空托任务生成处理,任务类型:{mst.S_TYPE}"); |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯空托" && a.enable == 1).First(); |
| | | string areaName = mst.S_TYPE.Contains("库存") ? "瓶坯非即产空框" : "瓶坯即产空框"; |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).First(); |
| | | if(areaInfo != null) |
| | | { |
| | | startLoca = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | | startLoca = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").OrderBy(a => a.N_ROW).First(); |
| | | if (startLoca != null) |
| | | { |
| | | LogHelper.Info("startLoca" + JsonConvert.SerializeObject(startLoca)); |
| | |
| | | LogHelper.Info($"满托任务生成处理,任务类型:{mst.S_TYPE}"); |
| | | string startArea = ""; |
| | | LinZhiBCPWorkOrder bcpW = null; |
| | | if (mst.S_TYPE.Contains("瓶坯")) |
| | | { |
| | | bcpW = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo.Contains("农夫林芝-瓶坯翻斗机") && a.S_WorkState == "执行中").First(); |
| | | } |
| | | else |
| | | { |
| | | bcpW = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo.Contains("农夫林芝-瓶盖翻斗机") && a.S_WorkState == "执行中").First(); |
| | | } |
| | | |
| | | bcpW = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_WorkNo == mst.S_WORK_NO && a.S_WorkState == "执行中").First(); |
| | | LogHelper.Info($"满托任务生成处理,工单:{JsonConvert.SerializeObject(bcpW)}"); |
| | | if (mst.S_TYPE.Contains("瓶盖")) |
| | | { |
| | | //瓶盖无即产即用和非即产即用 |
| | | var bcpInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产即用" && a.enable == 1).FirstOrDefault(); |
| | | var bcpInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产满框" && a.enable == 1).FirstOrDefault(); |
| | | if (bcpInfo != null) |
| | | { |
| | | startLoca = DeviceProcess.getFDSXArea(db, bcpW, bcpInfo.areaCode); |
| | |
| | | { |
| | | if (bcpW.S_UsingNow == "Y") |
| | | { |
| | | LogHelper.Info($"瓶坯即产即用A库区查找"); |
| | | startArea = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产即用A" && a.enable == 1).FirstOrDefault().areaCode; |
| | | LogHelper.Info($"瓶坯即产满框 查找"); |
| | | startArea = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框" && a.enable == 1).FirstOrDefault().areaCode; |
| | | startLoca = DeviceProcess.getFDSXArea(db, bcpW, startArea); |
| | | if (startLoca == null) |
| | | { |
| | | LogHelper.Info($"瓶坯即产即用A库区未找到满托,去瓶坯即产即用B库区查找"); |
| | | startLoca = TaskProcess.BCPInOrOut(db, true, "瓶坯即产即用B", bcpW.S_ItemCode); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | startArea = Settings.areaInfos.Where(a => a.areaName == "瓶坯非即产即用" && a.enable == 1).FirstOrDefault().areaCode; |
| | | LogHelper.Info($"瓶坯翻斗机非即产满框 查找"); |
| | | string areaName = bcpW.S_PLineNo.Split('-')[1].Substring(0, 1) + "号瓶坯翻斗机非即产满框"; |
| | | startArea = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).FirstOrDefault().areaCode; |
| | | startLoca = DeviceProcess.getFDSXArea(db, bcpW, startArea); |
| | | } |
| | | } |
| | |
| | | var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoca.S_CODE).First(); |
| | | if (cntrInfo != null) |
| | | { |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, mst.S_START_LOC, "出库", taskType, cntrInfo.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, mst.S_START_LOC, "出库", taskType, cntrInfo.S_CNTR_CODE,"","",bcpW.S_WorkNo); |
| | | } |
| | | else LogHelper.Info($"未绑定托盘,货位号:{startLoca.S_CODE}"); |
| | | } |
| | |
| | | TsNo = 1; |
| | | // 坯盖任务下发参数获取 |
| | | // 获取起终点的AGV站点 |
| | | Extend1 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_START_LAYER).First().S_AGV_SITE; |
| | | Extend2 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC && a.N_LAYER == mst.N_END_LAYER).First().S_AGV_SITE; |
| | | Extend1 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC).First().S_AGV_SITE; |
| | | 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.N_END_LAYER > 1) |
| | | { |
| | | 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 == "注塑即产满托下线(瓶坯)") |
| | | { |
| | | Extend2 = Settings.dXSites.Where(it => it.loc == mst.S_END_LOC).First().site.ToString(); |
| | | } |
| | | |
| | | Extend3 = "0"; |
| | | // 获取 任务参数4 DATA 数据 |
| | | string startLayerValue = Convert.ToString(startLayer, 16).ToUpper(); |
| | |
| | | Console.WriteLine($"[SendTask]:TaskNo={mst.S_CODE.Trim()},start={Extend1},end={Extend2}"); |
| | | LogHelper.Info($"[SendTask]:TaskNo={mst.S_CODE.Trim()},start={Extend1},end={Extend2}"); |
| | | bool action = true; |
| | | var dic = new Dictionary<string, string>(); |
| | | //var dic1 = new Dictionary<string, string>(); |
| | | //dic.Add("Pri", mst.N_PRIORITY.ToString()); |
| | | //dic.Add("No", mst.S_CODE.Trim()); |
| | | dic.Add("From", Extend1); |
| | | dic.Add("To", Extend2); |
| | | dic.Add("Func", Extend3); |
| | | dic.Add("Data", Extend4); |
| | | |
| | | //var dic = new Dictionary<string, string>(); |
| | | ////var dic1 = new Dictionary<string, string>(); |
| | | ////dic.Add("Pri", mst.N_PRIORITY.ToString()); |
| | | ////dic.Add("No", mst.S_CODE.Trim()); |
| | | //dic.Add("From", Extend1); |
| | | //dic.Add("To", Extend2); |
| | | //dic.Add("Func", Extend3); |
| | | //dic.Add("Data", Extend4); |
| | | // |
| | | //if (ConveryTaskList.Contains(taskType) || taskType.Contains("移库")) |
| | | //{ |
| | | // dic.Add("ItemHeight", Extend5); |
| | | // dic.Add("CntrType", Extend6); |
| | | // dic.Add("FromCol", Extend7); |
| | | // dic.Add("ToCol", Extend8); |
| | | // if (taskType.Contains("移库") || taskType.Contains("成品下线") || taskType.Contains("零头下线")) |
| | | // { |
| | | // LogHelper.Info($"移库:Extend5:{Extend5},Extend6:{Extend6},Extend7:{Extend7},Extend8:{Extend8},"); |
| | | // if (Extend5 == "" || Extend6 == "" || Extend7 == "" || Extend8 == "") |
| | | // { |
| | | // action = false; |
| | | // } |
| | | // } |
| | | //} |
| | | var dic = new List<param> |
| | | { |
| | | new param() { name = "From", value = Extend1 }, |
| | | new param() { name = "To", value = Extend2 }, |
| | | new param() { name = "Func", value = Extend3 }, |
| | | new param() { name = "Data", value = Extend4 } |
| | | }; |
| | | if (ConveryTaskList.Contains(taskType) || taskType.Contains("移库")) |
| | | { |
| | | dic.Add("ItemHeight", Extend5); |
| | | dic.Add("CntrType", Extend6); |
| | | dic.Add("FromCol", Extend7); |
| | | dic.Add("ToCol", Extend8); |
| | | dic.Add(new param(){name = "ItemHeight", value = Extend5}); |
| | | dic.Add(new param(){name = "CntrType", value = Extend6}); |
| | | dic.Add(new param(){name = "FromCol", value = Extend7}); |
| | | dic.Add(new param(){name = "ToCol", value = Extend8}); |
| | | if (taskType.Contains("移库") || taskType.Contains("成品下线") || taskType.Contains("零头下线")) |
| | | { |
| | | LogHelper.Info($"移库:Extend5:{Extend5},Extend6:{Extend6},Extend7:{Extend7},Extend8:{Extend8},"); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (action) |
| | | { |
| | | var res = new AGVResult(); |
| | | res = NDC.AddNewOrderNew(TsNo,mst.N_PRIORITY,mst.S_CODE, dic); |
| | | var res = new AgvApiResult(); |
| | | //res = NDC.AddNewOrderNew(TsNo,mst.N_PRIORITY,mst.S_CODE, dic); |
| | | res = NDCApi.AddOrderNew(TsNo, mst.N_PRIORITY, mst.S_CODE,dic); |
| | | |
| | | if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) |
| | | if (res != null && (res.err_code == 0 || res.err_code == 50009)) |
| | | { |
| | | mst.N_B_STATE = 1; |
| | | WCSHelper.UpdateStatus(mst, "已推送"); |
| | |
| | | if (action) |
| | | { |
| | | //瓶盖库区,两层密集型库区 空满在同一个库区,需要区分不同排 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).First(); |
| | | if (areaInfo != null) |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName.Contains(areaName) && a.enable == 1).OrderByDescending(a => a.pri).ToList(); |
| | | if (areaInfo.Count > 0) |
| | | { |
| | | //库区货位约定:列号越小越靠里 |
| | | LogHelper.Info($"入库算法01:area:{areaInfo.areaCode},itemCode:{itemCode}"); |
| | | try |
| | | foreach(var it in areaInfo) |
| | | { |
| | | if (result == null) |
| | | //库区货位约定:列号越小越靠里 |
| | | LogHelper.Info($"入库算法01:area:{it.areaCode},itemCode:{itemCode}"); |
| | | try |
| | | { |
| | | var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL) |
| | | .PartitionBy(a => a.N_ROW).Take(1) |
| | | .ToList(); |
| | | if (locInfo.Count > 0) |
| | | if (result == null) |
| | | { |
| | | LogHelper.Info($"入库算法02:查询到可入货位的数量为:{locInfo.Count}"); |
| | | foreach (var a in locInfo) |
| | | var locInfo = 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) |
| | | .PartitionBy(a => a.N_ROW).Take(1) |
| | | .ToList(); |
| | | if (locInfo.Count > 0) |
| | | { |
| | | LogHelper.Info($"入库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE},当前数量:{a.N_CURRENT_NUM}"); |
| | | //去掉当前货位有锁,或者为空托的货位 |
| | | if (a.S_LOCK_STATE == "无") |
| | | if(areaName == "瓶坯即产满框缓存") |
| | | { |
| | | string endItemCode = ""; |
| | | var endCntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First(); |
| | | if (endCntrInfo != null) |
| | | locInfo = locInfo.Where(a => a.N_ROW == 1 || a.N_ROW == 2).ToList(); |
| | | } |
| | | LogHelper.Info($"入库算法02:查询到可入货位的数量为:{locInfo.Count}"); |
| | | foreach (var a in locInfo) |
| | | { |
| | | LogHelper.Info($"入库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE},当前数量:{a.N_CURRENT_NUM}"); |
| | | //去掉当前货位有锁,或者为空托的货位 |
| | | if (a.S_LOCK_STATE == "无") |
| | | { |
| | | var endItemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == endCntrInfo.S_CNTR_CODE).First(); |
| | | if (endItemInfo != null) |
| | | string endItemCode = ""; |
| | | var endCntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First(); |
| | | if (endCntrInfo != null) |
| | | { |
| | | endItemCode = endItemInfo.S_ITEM_CODE; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"终点货位未绑定托盘信息"); |
| | | continue; |
| | | } |
| | | LogHelper.Info($"入库算法04:查询到当前货位绑定的物料编码为:{endItemCode}"); |
| | | //判断是否和当前货位的物料编码相同 |
| | | if (itemCode == endItemCode) |
| | | { |
| | | //查询当前排是否可入(判断是是否有入库锁和出库锁) |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | { |
| | | //当前排无任务 |
| | | if (a.N_CURRENT_NUM < a.N_CAPACITY) result = a; |
| | | else |
| | | var endItemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == endCntrInfo.S_CNTR_CODE).First(); |
| | | if (endItemInfo != null) |
| | | { |
| | | //查询后面当前货位后一个 |
| | | 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(); |
| | | } |
| | | if (result != null) |
| | | { |
| | | break; |
| | | endItemCode = endItemInfo.S_ITEM_CODE; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"入库算法05:查询到当前排有锁,排号:{a.N_ROW}"); |
| | | |
| | | LogHelper.Info($"终点货位未绑定托盘信息"); |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"入库算法02:未查询到可入货位"); |
| | | } |
| | | if (result == null) |
| | | { |
| | | //todo 还需要判断锁 |
| | | #region 查找所有数量是空的排 |
| | | LogHelper.Info($"入库算法06:无可用货位,获取空排货位。", "WMSAlgoRithm"); |
| | | //2.0 简化查询只查每一排第一列 |
| | | var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList(); |
| | | //2.1 选一个空排 |
| | | if (list.Count > 0) |
| | | { |
| | | LogHelper.Info($"入库算法06:无可用货位,获取空排货位数量为:{list.Count}。", "WMSAlgoRithm"); |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | LogHelper.Info($"入库算法07:获取空排货位:货位编码:{list[i].S_CODE.Trim()},当前数量:{list[i].N_CURRENT_NUM},排号:{list[i].N_ROW},库区编码:{list[i].S_AREA_CODE.Trim()}", "WMSAlgoRithm"); |
| | | if (list[i].S_LOCK_STATE.Trim().Contains("无")) |
| | | { |
| | | //二次校验当前排所有货位都是空的,防止系统数据错乱 |
| | | int row = list[i].N_ROW; |
| | | string areaCode = list[i].S_AREA_CODE.Trim(); |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaCode && b.N_ROW == row && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | LogHelper.Info($"入库算法04:查询到当前货位绑定的物料编码为:{endItemCode}"); |
| | | //判断是否和当前货位的物料编码相同 |
| | | if (itemCode == endItemCode) |
| | | { |
| | | var locInfo1 = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First(); |
| | | if (locInfo1 != null) |
| | | //查询当前排是否可入(判断是是否有入库锁和出库锁) |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | { |
| | | LogHelper.Info($"{locInfo1.sum},row:{row}"); |
| | | if (locInfo1.sum == 0) |
| | | //当前排无任务 |
| | | if (a.N_CURRENT_NUM < a.N_CAPACITY) result = a; |
| | | else |
| | | { |
| | | //空排 |
| | | result = list[i]; |
| | | //查询后面当前货位后一个 |
| | | 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(); |
| | | } |
| | | if (result != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | else LogHelper.Info("未找到该排"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("该排有锁"); |
| | | else |
| | | { |
| | | LogHelper.Info($"入库算法05:查询到当前排有锁,排号:{a.N_ROW}"); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else LogHelper.Info($"未获取到空排,库区编码:{areaInfo.areaCode}"); |
| | | #endregion |
| | | else |
| | | { |
| | | LogHelper.Info($"入库算法02:未查询到可入货位"); |
| | | } |
| | | if (result == null) |
| | | { |
| | | //todo 还需要判断锁 |
| | | #region 查找所有数量是空的排 |
| | | LogHelper.Info($"入库算法06:无可用货位,获取空排货位。", "WMSAlgoRithm"); |
| | | //2.0 简化查询只查每一排第一列 |
| | | var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.areaCode).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList(); |
| | | //2.1 选一个空排 |
| | | if (list.Count > 0) |
| | | { |
| | | LogHelper.Info($"入库算法06:无可用货位,获取空排货位数量为:{list.Count}。", "WMSAlgoRithm"); |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | LogHelper.Info($"入库算法07:获取空排货位:货位编码:{list[i].S_CODE.Trim()},当前数量:{list[i].N_CURRENT_NUM},排号:{list[i].N_ROW},库区编码:{list[i].S_AREA_CODE.Trim()}", "WMSAlgoRithm"); |
| | | if (list[i].S_LOCK_STATE.Trim().Contains("无")) |
| | | { |
| | | //二次校验当前排所有货位都是空的,防止系统数据错乱 |
| | | int row = list[i].N_ROW; |
| | | string areaCode = list[i].S_AREA_CODE.Trim(); |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaCode && b.N_ROW == row && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | { |
| | | var locInfo1 = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First(); |
| | | if (locInfo1 != null) |
| | | { |
| | | LogHelper.Info($"{locInfo1.sum},row:{row}"); |
| | | if (locInfo1.sum == 0) |
| | | { |
| | | //空排 |
| | | result = list[i]; |
| | | break; |
| | | } |
| | | } |
| | | else LogHelper.Info("未找到该排"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("该排有锁"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else LogHelper.Info($"未获取到空排,库区编码:{it.areaCode}"); |
| | | #endregion |
| | | } |
| | | |
| | | if(result != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("GetLocationIn:" + ex.Message, ex); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("GetLocationIn:" + ex.Message, ex); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"出库算法01:area:{areaName},itemCode:{itemCode}"); |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).FirstOrDefault(); |
| | | if(areaInfo != null) |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName.Contains(areaName) && a.enable == 1).OrderByDescending(a => a.pri).ToList(); |
| | | if(areaInfo.Count > 0) |
| | | { |
| | | var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.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) |
| | | foreach(var it in areaInfo) |
| | | { |
| | | LogHelper.Info($"出库算法02:查询到可出货位数量:{locList.Count}"); |
| | | foreach (var a in locList) |
| | | LogHelper.Info($"出库算法01:area:{it.areaName},itemCode:{itemCode}"); |
| | | 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) |
| | | { |
| | | LogHelper.Info($"出库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE}"); |
| | | if (a.S_LOCK_STATE == "无") |
| | | if(areaName == "瓶坯即产满框缓存" && string.IsNullOrEmpty(itemCode)) |
| | | { |
| | | var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First(); |
| | | if(cntrInfo != null) |
| | | locList = locList.Where(a => a.N_ROW == 3).ToList(); |
| | | } |
| | | LogHelper.Info($"出库算法02:查询到可出货位数量:{locList.Count}"); |
| | | foreach (var a in locList) |
| | | { |
| | | LogHelper.Info($"出库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE}"); |
| | | if (a.S_LOCK_STATE == "无") |
| | | { |
| | | LogHelper.Info($"出库算法04:当前货位绑定的托盘码为:{cntrInfo.S_CNTR_CODE}"); |
| | | string endItemCode = ""; |
| | | var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First(); |
| | | if(itemInfo != null && itemInfo.S_ITEM_CODE == itemCode) |
| | | var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First(); |
| | | if (cntrInfo != null) |
| | | { |
| | | endItemCode = itemInfo.S_ITEM_CODE; |
| | | } |
| | | if(endItemCode == itemCode) |
| | | { |
| | | //判断当前排有无锁 |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | LogHelper.Info($"出库算法04:当前货位绑定的托盘码为:{cntrInfo.S_CNTR_CODE}"); |
| | | string endItemCode = ""; |
| | | var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First(); |
| | | if (itemInfo != null && itemInfo.S_ITEM_CODE == itemCode) |
| | | { |
| | | result = a; |
| | | break; |
| | | endItemCode = itemInfo.S_ITEM_CODE; |
| | | } |
| | | else |
| | | if (endItemCode == itemCode) |
| | | { |
| | | LogHelper.Info($"出库算法05:当前排有锁,货位号:{lockInfo.S_CODE}"); |
| | | //判断当前排有无锁 |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == it.areaCode && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if (lockInfo == null) |
| | | { |
| | | result = a; |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"出库算法05:当前排有锁,货位号:{lockInfo.S_CODE}"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if(result != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | |
| | | if(usingNow == "Y") |
| | | { |
| | | //即产即用 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚即产空框" && a.enable == 1).FirstOrDefault(); |
| | | var 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_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶胚即产空框未配置"); |
| | | LogHelper.Info("瓶坯即产空框未配置"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //非即产即用 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚非即产空框" && a.enable == 1).FirstOrDefault(); |
| | | 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_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(); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶胚非即产空框未配置"); |
| | | LogHelper.Info("瓶坯非即产空框未配置"); |
| | | } |
| | | } |
| | | |
| | |
| | | if (taskName.Contains("即产")) |
| | | { |
| | | //注塑机急产即用下线,首先下线到即产即用满框线边,满眶线边满了,下到即产即用满框缓存区,满框缓存区满了,下到入库接驳堆叠位 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚即产满框" && a.enable == 1).FirstOrDefault(); |
| | | var 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_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_ROW).First(); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"瓶坯注塑满托下线:瓶胚即产满框 未配置"); |
| | | LogHelper.Info($"瓶坯注塑满托下线:瓶坯即产满框 未配置"); |
| | | } |
| | | if (result == null) |
| | | { |
| | | result = TaskProcess.BCPInOrOut(db, true, "瓶胚即产满框缓存区", itemCode); |
| | | result = TaskProcess.BCPInOrOut(db, true, "瓶坯即产满框缓存", itemCode); |
| | | } |
| | | if(result == null) |
| | | { |
| | | //result = TaskProcess.BCPInOrOut(db, true, "瓶坯库区", itemCode); |
| | | result = getJBLoc(db, result); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | |
| | | private static Location getJBLoc(SqlSugarClient db, Location result) |
| | | { |
| | | //注塑机非即产即用下线,下到入库接驳堆叠位 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚入库接驳" && a.enable == 1).FirstOrDefault(); |
| | | var 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_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"瓶坯注塑满托下线:瓶胚入库接驳 未配置"); |
| | | LogHelper.Info($"瓶坯注塑满托下线:瓶坯入库接驳 未配置"); |
| | | } |
| | | |
| | | return result; |
| | |
| | | internal static Location BCPEmptyOut(SqlSugarClient db, string taskName) |
| | | { |
| | | Location result = null; |
| | | //翻斗机库存空托下线(瓶盖) |
| | | string endAreaName = taskName.Contains("瓶盖") ? "瓶盖空托" : "瓶坯空托"; |
| | | |
| | | string endAreaName = taskName.Contains("瓶盖") ? "瓶盖非即产空框" : taskName.Contains("库存") ? "瓶坯非即产空框" : "瓶坯即产空框"; |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == endAreaName && a.enable == 1).FirstOrDefault(); |
| | | if(areaInfo != null) |
| | | if (areaInfo != null) |
| | | { |
| | | var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | | if(locInfo != null) |
| | | var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_ROW).First(); |
| | | if (locInfo != null) |
| | | { |
| | | result = locInfo; |
| | | } |
| | |
| | | { |
| | | 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> |
| | | /// 半成品移库 |
| | | /// </summary> |
| | | /// <param name="action">true - 工单开启 false - 工单关闭</param> |
| | | /// <param name="machine">设备</param> |
| | | internal static void BCPYiKu(bool action, string machine) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | Location startLoc = null; |
| | | Location endLoc = null; |
| | | if (action) |
| | | { |
| | | if(machine == "瓶坯翻斗机") |
| | | { |
| | | //瓶坯翻斗机 |
| | | //开启,判断工单类型,根据工单类型补充对应的库区 即产即用不补充 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯非即产即用" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | var workInfo = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo == "农夫林芝-瓶批翻斗机" && a.S_WorkState == "执行中").First(); |
| | | if (workInfo.S_UsingNow == "N") |
| | | { |
| | | startLoc = TaskProcess.BCPInOrOut(db, false, "瓶坯库区", workInfo.S_ItemCode); |
| | | endLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶坯非即产即用未配置"); |
| | | } |
| | | |
| | | } |
| | | if (machine == "瓶坯注塑机") |
| | | { |
| | | //开启,查询 瓶坯空托 是否空托数量大于3托,如果不大于,则补空托 |
| | | 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_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").ToList(); |
| | | if(locList.Count > 2) |
| | | { |
| | | LogHelper.Info("瓶坯空托 补空托"); |
| | | startLoc = TaskProcess.BCPInOrOut(db, false, "瓶坯库区",""); |
| | | endLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶坯注塑机空托未配置"); |
| | | } |
| | | |
| | | } |
| | | if (machine == "瓶盖翻斗机") |
| | | { |
| | | //开启,查询 瓶盖非急产急用 物料是否满,不满则补充物料 |
| | | var 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_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").First(); |
| | | if(locInfo != null) |
| | | { |
| | | LogHelper.Info("瓶盖非即产即用 补满托"); |
| | | var workInfo = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo == "农夫林芝-瓶盖翻斗机" && a.S_WorkState == "执行中").First(); |
| | | startLoc = TaskProcess.BCPInOrOut(db, false, "瓶盖库区", workInfo.S_ItemCode); |
| | | endLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).First(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("瓶盖非即产即用未配置"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (machine == "瓶坯翻斗机") |
| | | { |
| | | //关闭,查询 瓶坯非即产即用 瓶坯即产即用A 瓶坯即产即用B 是否有物料,有则入库 |
| | | var areaList = Settings.areaInfos.Where(a => (a.areaName == "瓶坯非即产即用" || a.areaName == "瓶坯即产即用A") && a.enable == 1).ToList(); |
| | | if (areaList.Count > 0) |
| | | { |
| | | foreach(var a in areaList) |
| | | { |
| | | startLoc = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.areaCode && b.N_CURRENT_NUM > 0 && b.S_LOCK_STATE == "无").Includes(b => b.LocCntrRel).First(); |
| | | if (startLoc != null) break; |
| | | } |
| | | } |
| | | if (startLoc == null) |
| | | { |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产即用B" && a.enable == 1).FirstOrDefault(); |
| | | if(areaInfo != null) |
| | | { |
| | | var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.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(locInfo.Count > 0) |
| | | { |
| | | foreach(var a in locInfo) |
| | | { |
| | | int row = a.N_ROW; |
| | | var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First(); |
| | | if(lockInfo == null) |
| | | { |
| | | startLoc = a; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if(startLoc != null) |
| | | { |
| | | if (startLoc.LocCntrRel != null) |
| | | { |
| | | var itemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == startLoc.LocCntrRel.S_CNTR_CODE).First(); |
| | | if (itemInfo != null) |
| | | { |
| | | endLoc = TaskProcess.BCPInOrOut(db, true, "瓶坯库区", itemInfo.S_ITEM_CODE); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (machine == "瓶坯注塑机") |
| | | { |
| | | //关闭,查询 瓶坯空托 是否有空托,有则入库 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯注塑机空托" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | startLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); |
| | | if(startLoc != null) |
| | | { |
| | | endLoc = TaskProcess.BCPInOrOut(db, true, "瓶坯库区", ""); |
| | | } |
| | | } |
| | | } |
| | | if (machine == "瓶盖翻斗机") |
| | | { |
| | | //关闭, 1、查询 瓶盖空托 是否还有托盘,有则入库 2、查询瓶盖非即产即用 是否有物料, 有则入库 |
| | | //关闭,查询 瓶坯空托 是否有空托,有则入库 |
| | | |
| | | //查询空托库区 |
| | | var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖空托" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | startLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); |
| | | if (startLoc != null) |
| | | { |
| | | endLoc = TaskProcess.BCPInOrOut(db, true, "瓶盖库区", ""); |
| | | } |
| | | } |
| | | |
| | | //查询满托库区 |
| | | if(startLoc == null) |
| | | { |
| | | areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产即用" && a.enable == 1).FirstOrDefault(); |
| | | if (areaInfo != null) |
| | | { |
| | | startLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); |
| | | if (startLoc != null) |
| | | { |
| | | if(startLoc.LocCntrRel != null) |
| | | { |
| | | var itemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == startLoc.LocCntrRel.S_CNTR_CODE).First(); |
| | | if(itemInfo != null) |
| | | { |
| | | endLoc = TaskProcess.BCPInOrOut(db, true, "瓶盖库区", itemInfo.S_ITEM_CODE); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (startLoc != null && endLoc != null) |
| | | { |
| | | WMSHelper.CreateOpTask(startLoc.S_CODE, endLoc.S_CODE, "入库", "半成品移库", startLoc.LocCntrRel.S_CNTR_CODE); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// FuLeWebPost |
| | |
| | | { |
| | | 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) |
| | | { |
| | | if(db.Insertable<Container>(new Container |
| | | { |
| | | S_CODE = cntrCode, |
| | | N_TYPE = 1, |
| | | N_DETAIL_COUNT = 1 |
| | | }).ExecuteCommand() > 0) |
| | | { |
| | | LogHelper.Info($"容器表绑定成功,托盘号:{cntrCode}"); |
| | | } |
| | | } |
| | | if (!string.IsNullOrEmpty(itemCode)) |
| | | { |
| | | BindCntrItem(cntrCode, itemCode, batchNo, itemlayer); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | |
| | | } |
| | | } |
| | | |
| | | /// <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 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; |
| | | } |
| | | } |
| | | } |