123
cjs
5 小时以前 2877a2f0b9a0276e95f3312ae1dcdd1aece3ea94
HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs
@@ -11,6 +11,7 @@
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;
@@ -42,6 +43,12 @@
                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();
                }
            }
        }
@@ -65,7 +72,7 @@
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
        }
@@ -677,7 +684,7 @@
        /// <exception cref="NotImplementedException"></exception>
        public static void EmptyTask(WCSTask mst)
        {
            //瓶盖注塑机空托上线,若急产急用库区没有多余的空托,则在非急产急用空托区拿空托
            //瓶盖注塑机空托上线,若即产急用库区没有多余的空托,则在非即产急用空托区拿空托
            var db = new SqlHelper<object>().GetInstance();
            Location startLoca = null;
@@ -716,46 +723,50 @@
                LinZhiBCPWorkOrder bcpW = null;
                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();
                    if (bcpInfo != null)
                if (bcpW != null)
                {
                    if (mst.S_TYPE.Contains("瓶盖"))
                    {
                        startLoca = DeviceProcess.getFDSXArea(db, bcpW, bcpInfo.areaCode);
                    }
                }
                else
                {
                    if (bcpW.S_UsingNow == "Y")
                    {
                        LogHelper.Info($"瓶坯即产满框 查找");
                        startArea = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框" && a.enable == 1).FirstOrDefault().areaCode;
                        startLoca = DeviceProcess.getFDSXArea(db, bcpW, startArea);
                        //瓶盖无即产即用和非即产即用
                        var bcpInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产满框" && a.enable == 1).FirstOrDefault();
                        if (bcpInfo != null)
                        {
                            startLoca = DeviceProcess.getFDSXArea(db, bcpW, bcpInfo.areaCode);
                        }
                    }
                    else
                    {
                        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);
                        if (bcpW.S_UsingNow == "Y")
                        {
                            LogHelper.Info($"瓶坯即产满框 查找");
                            startArea = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框" && a.enable == 1).FirstOrDefault().areaCode;
                            startLoca = DeviceProcess.getFDSXArea(db, bcpW, startArea);
                        }
                        else
                        {
                            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);
                        }
                    }
                }
                if (startLoca != null)
                {
                    LogHelper.Info("startLoca" + JsonConvert.SerializeObject(startLoca));
                    string taskType = "";
                    if (mst.S_TYPE == "翻斗机即产空托下线(瓶坯)") taskType = "翻斗机即产满托上线(瓶坯)";
                    if (mst.S_TYPE == "翻斗机库存空托下线(瓶坯)") taskType = "翻斗机库存满托上线(瓶坯)";
                    if (mst.S_TYPE == "翻斗机库存空托下线(瓶盖)") taskType = "翻斗机库存满托上线(瓶盖)";
                    var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoca.S_CODE).First();
                    if (cntrInfo != null)
                    if (startLoca != null)
                    {
                        WMSHelper.CreateOpTask(startLoca.S_CODE, mst.S_START_LOC, "出库", taskType, cntrInfo.S_CNTR_CODE,"","",bcpW.S_WorkNo);
                        LogHelper.Info("startLoca" + JsonConvert.SerializeObject(startLoca));
                        string taskType = "";
                        if (mst.S_TYPE == "翻斗机即产空托下线(瓶坯)") taskType = "翻斗机即产满托上线(瓶坯)";
                        if (mst.S_TYPE == "翻斗机库存空托下线(瓶坯)") taskType = "翻斗机库存满托上线(瓶坯)";
                        if (mst.S_TYPE == "翻斗机库存空托下线(瓶盖)") taskType = "翻斗机库存满托上线(瓶盖)";
                        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,"","",bcpW.S_WorkNo);
                        }
                        else LogHelper.Info($"未绑定托盘,货位号:{startLoca.S_CODE}");
                    }
                    else LogHelper.Info($"未绑定托盘,货位号:{startLoca.S_CODE}");
                }
            }
        }
@@ -1105,7 +1116,7 @@
                        Extend2 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First().S_AGV_SITE;
                        if (mst.N_START_LAYER > 1)
                        {
                            if(mst.S_TYPE != "瓶坯非急产空框入库" && mst.S_TYPE != "瓶坯接驳位入库" && mst.S_TYPE != "瓶盖空托入库")
                            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;
                            }
@@ -1115,7 +1126,7 @@
                        {
                            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();
                        }
@@ -1358,7 +1369,7 @@
                                                    else
                                                    {
                                                        //查询后面当前货位后一个
                                                        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.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)
                                                    {
@@ -1470,7 +1481,7 @@
                                        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)
                                        if (itemInfo != null)
                                        {
                                            endItemCode = itemInfo.S_ITEM_CODE;
                                        }
@@ -1564,14 +1575,14 @@
        /// <param name="taskName"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        internal static Location BCPFullOut(SqlSugarClient db, string taskName, string itemCode)
        internal static Location BCPFullOut(SqlSugarClient db, string taskName, string itemCode,string batch)
        {
            Location result = null;
            LogHelper.Info($"瓶坯注塑满托下线:类型:{taskName},物料编码:{itemCode}");
            LogHelper.Info($"瓶坯注塑满托下线:类型:{taskName},物料编码:{itemCode},批次号:{batch}");
            if (taskName.Contains("即产"))
            {
                //注塑机急产即用下线,首先下线到即产即用满框线边,满眶线边满了,下到即产即用满框缓存区,满框缓存区满了,下到入库接驳堆叠位
                //注塑机即产即用下线,首先下线到即产即用满框线边,满眶线边满了,下到即产即用满框缓存区,满框缓存区满了,下到入库接驳堆叠位
                var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯即产满框" && a.enable == 1).FirstOrDefault();
                if(areaInfo != null)
                {
@@ -1939,19 +1950,7 @@
                    {
                        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}");
                        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, itemName);
@@ -1978,6 +1977,26 @@
            try
            {
                db.BeginTran();
                var Con = db.Queryable<Container>().Where(a => a.S_CODE == trayCode).First();
                if (Con == null)
                {
                    int detallCount = 1;
                    if (db.Insertable<Container>(new Container
                    {
                        S_CODE = trayCode,
                        N_TYPE = 1,
                        N_DETAIL_COUNT = detallCount
                    }).ExecuteCommand() > 0)
                    {
                        LogHelper.Info($"容器表绑定成功,托盘号:{trayCode}");
                    }
                }
                else
                {
                    Con.N_DETAIL_COUNT = 1;
                    db.Updateable(Con).UpdateColumns(a => new { a.N_DETAIL_COUNT }).ExecuteCommand();
                }
                //db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
                //1.将原有容器物料信息删除
                //db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntr.S_CNTR_CODE.Trim()).ExecuteCommand();
@@ -2485,11 +2504,20 @@
                {
                    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 == "无")
                        var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                        if(cntrInfo != null)
                        {
                            result = a;
                            break;
                            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;
                                }
                            }
                        }
                    }
                }
@@ -2501,5 +2529,103 @@
            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)
            {
                    //等待直接修改状态为取消
                op.N_B_STATE = 2;
                WMSHelper.UpdateTaskState(op);
            }
            NDCApi.CancelOrder(TN_Task.S_CODE.Trim());
            OperateStatus(TN_Task, 7);
        }
        internal static Location BCPInOrOutTwo(SqlSugarClient db, string areaName, string itemCode)
        {
            Location result = null;
            var areaInfo = Settings.areaInfos.Where(a => a.areaName.Contains(areaName) && a.enable == 1).OrderByDescending(a => a.pri).ToList();
            if (areaInfo.Count > 0)
            {
                foreach (var it in areaInfo)
                {
                    LogHelper.Info($"瓶坯非即产满框转运: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($"瓶坯非即产满框转运:查询到可出货位数量:{locList.Count}");
                        foreach (var a in locList)
                        {
                            LogHelper.Info($"瓶坯非即产满框转运:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE}");
                            if (a.S_LOCK_STATE == "无")
                            {
                                var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                if (cntrInfo != null)
                                {
                                    LogHelper.Info($"瓶坯非即产满框转运:当前货位绑定的托盘码为:{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)
                                    {
                                        endItemCode = itemInfo.S_ITEM_CODE;
                                    }
                                    if (endItemCode == itemCode)
                                    {
                                        LogHelper.Info($"瓶坯非即产满框转运:当前货位绑定的物料编码为:{endItemCode},物料类型为:{itemInfo.S_BATCH_NO},绑定时间为:{itemInfo.T_CREATE}");
                                        if ((itemInfo.S_BATCH_NO == "非即产" && itemInfo.T_CREATE.AddHours(Settings.lQHours) <= DateTime.Now) || itemInfo.S_BATCH_NO == "即产")
                                        {
                                            //非即产瓶坯需要判断冷却时间是否大于一定时间
                                            //判断当前排有无锁
                                            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($"瓶坯非即产满框转运:当前排有锁,货位号:{lockInfo.S_CODE}");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (result != null)
                    {
                        break;
                    }
                }
            }
            else
            {
                LogHelper.Info($"瓶坯非即产满框转运:{areaName}未配置");
            }
            return result;
        }
    }
}