111
schangxiang@126.com
2024-12-13 75ca84b7570d7a6a805c27164c3f17c1f2158423
CC/iWareCC_ASRS/ThreadService/01_BZ01¹¤Î»£¨Çå»Ò£¬Ï´°åºó¹¤Î»£©/DataProcess_BZ01.cs
@@ -31,13 +31,14 @@
        {
            var alertMsg = "";
            LogType logType = LogType.DataProcess_BZ01;
            string lastUpi = "";//最后记录的UPI数据
            while (true)
            {
                Thread.Sleep(2000);//休眠2秒,将休眠写到前面,是为了下面的continue方法执行后不显示错误信息的提示!!!【EditBy shaocx,2022-05-24】
                Thread.Sleep(1000);//休眠2秒,将休眠写到前面,是为了下面的continue方法执行后不显示错误信息的提示!!!【EditBy shaocx,2022-05-24】
                SystemWarningMsg._lbl_alert_DataProcess_BZ01 = string.Empty;
                try
                {
                    if (SystemValue.isAllowRuning_DataProcess_BZ01 && SystemValue.isStartedModel)
                    if (SystemValue.isStartedModel)//SystemValue.isAllowRuning_DataProcess_BZ01 &&
                    {
                        if (FormCC.IsAllowRunOutMode == true)
                        {
@@ -50,6 +51,11 @@
                         * 1、从数据库中判断是否齐套
                         * 2、根据齐套结果,推送给PLC
                         */
                        if (FormCC.stationView == null)
                        {
                            SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"{rgvLocation.ToString()}-获取PLC对象为null";
                            continue;
                        }
                        var obj = FormCC.stationView.R_StationForReadCommList.Where(x => x.StationCode == rgvLocation.ToString()).FirstOrDefault();
                        if (obj.R_ReqParseData)
                        {
@@ -59,13 +65,23 @@
                                SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"{rgvLocation.ToString()}-请求了解码,但是结果是空的,此次循环结束";
                                continue;
                            }
                            if (lastUpi == result)
                            {
                                SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"{rgvLocation.ToString()}-重复的UPI{result}";
                                continue;
                            }
                            var upiCode = result;
                            var qitaoReault = false;
                            lastUpi = upiCode;
                            var qitaoReault = false;//齐包结果
                            using (WmsDBModel wmsDB = new WmsDBModel())
                            {
                                var upiObj = wmsDB.mes_batchOrderUPI_new.Where(x => x.UPI == upiCode).FirstOrDefault();
                                if (upiObj == null)
                                {
                                    //写入报警信息
                                    await MyExtendHelper.WriteBoolPlcDataForWarning(PlcWarningAddressGloble.Num_BZ01_1);
                                    SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"{rgvLocation.ToString()},根据UPI:{upiCode}没有找到对象 ";
                                    continue;
                                }
@@ -84,8 +100,6 @@
                                x.AreaCode == (int)AreaCodeEnum.缓存分拣区
                                 ||
                                x.AreaCode == (int)AreaCodeEnum.码垛区域
                                  ||
                                x.AreaCode == (int)AreaCodeEnum.机器人岛缓存区域
                                ).ToList();
                                if (isQiTaoList.Count() != allList.Count())
                                {//不齐包
@@ -94,9 +108,113 @@
                                }
                                else
                                {//齐包
                                    qitaoReault = true;
                                    upiObj.AreaCode = (int)AreaCodeEnum.码垛区域;
                                 //这里再增加个逻辑,必须是按照次序进入的才真正的算齐包 [Editby shaocx,2024-12-06]
                                 //寻找本包内的前一块板的位置
                                    int queryAreaCode = (int)AreaCodeEnum.待缓存分拣区;
                                    var lastUpiLineQueue = wmsDB.mes_upi_linequeue.Where(x => x.PackageCode == upiObj.PackageCode && x.AreaCode == queryAreaCode)
                                        .OrderBy(x => x.Id).FirstOrDefault();//查询该包队列的第一块板
                                    if (lastUpiLineQueue == null)
                                    {//说明 é˜Ÿåˆ—中没有该包的数据
                                        qitaoReault = false;
                                        upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                    }
                                    else
                                    {
                                        if (lastUpiLineQueue.Shelf != upiObj.Shelf)
                                        {
                                            qitaoReault = false;
                                            upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                        }
                                        else
                                        {
                                            var isJiXuValidate = true;
                                            if (upiObj.Shelf != 1)
                                            {
                                                var qianmianList = allList.Where(x => x.Shelf < upiObj.Shelf).ToList();
                                                //看以前的板在哪里,必须都在 ç åž›åŒºåŸŸ
                                                var yiqianQuyu = AreaCodeEnum.码垛区域;
                                                var count_MD = qianmianList.Where(x => x.AreaCode == (int)yiqianQuyu).Count();
                                                if (count_MD != qianmianList.Count())
                                                {
                                                    isJiXuValidate = false;
                                                    qitaoReault = false;
                                                    upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                                }
                                            }
                                            if (isJiXuValidate)
                                            {//是否继续验证
                                                //还需要验证在这些区域中,是否正确排队,如果没有正确排队,那么就认为不齐套 ã€Editby shaocx,2024-12-12】
                                                var queueList = wmsDB.mes_upi_linequeue.Where(x => x.PackageCode == upiObj.PackageCode && x.AreaCode == queryAreaCode)
                                                    .OrderBy(x => x.Id).ToList();
                                                var fisrtId = queueList.OrderBy(x => x.Id).First().Id;
                                                var endId = queueList.OrderByDescending(x => x.Id).First().Id;
                                                //继续查询这个时间段内的队列数据
                                                //重写该队列
                                                queueList = wmsDB.mes_upi_linequeue.Where(x => x.Id >= fisrtId && x.Id <= endId).OrderBy(x => x.Id).ToList();
                                                var syCount = allList.Where(x => x.Shelf >= upiObj.Shelf).Count();
                                                if (queueList.Count() != syCount)
                                                {
                                                    qitaoReault = false;
                                                    upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                                }
                                                else
                                                {
                                                    //判断是否乱序
                                                    bool isLuanXuan = false;
                                                    int temp_shelf = 0;
                                                    for (int i = 0; i < queueList.Count; i++)
                                                    {
                                                        if (i == 0)
                                                        {
                                                            temp_shelf = queueList[i].Shelf;
                                                            if (temp_shelf != upiObj.Shelf)
                                                            {
                                                                qitaoReault = false;
                                                                isLuanXuan = true;
                                                                upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                                                break;//跳出循环
                                                            }
                                                            if (queueList[i].Upi != upiObj.UPI)
                                                            {
                                                                qitaoReault = false;
                                                                isLuanXuan = true;
                                                                upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                                                break;//跳出循环
                                                            }
                                                        }
                                                        else
                                                        {
                                                            temp_shelf = temp_shelf + 1;
                                                            if (temp_shelf != queueList[i].Shelf)
                                                            {//认为乱序了
                                                                qitaoReault = false;
                                                                isLuanXuan = true;
                                                                upiObj.AreaCode = (int)AreaCodeEnum.缓存分拣区;
                                                                break;//跳出循环
                                                            }
                                                        }
                                                    }
                                                    if (isLuanXuan == false)
                                                    {
                                                        qitaoReault = true;
                                                        upiObj.AreaCode = (int)AreaCodeEnum.码垛区域;
                                                    }
                                                }
                                            }
                                        }
                                        //注意:要删除该队列数据哦
                                        wmsDB.mes_upi_linequeue.Remove(lastUpiLineQueue);
                                    }
                                }
                                //if (qitaoReault == false) {
                                //    //临时
                                //    SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"模拟啊啊,暂停啊啊";
                                //    continue;
                                //}
                                using (StationServiceClient client = new StationServiceClient())
                                {
@@ -131,11 +249,14 @@
                                rbRunMode.OrderId = upiObj.OrderId;
                                rbRunMode.PackageCode = upiObj.PackageCode;
                                WmsRecordUpiProcessHandler.SaveWmsRecordUpiProcess(wmsDB, upiObj, "BZ01", "齐包验证:" + (qitaoReault ? "齐包" : "不齐包"));
                                wmsDB.SaveChanges();
                            }
                        }
                        else
                        {
                            SystemWarningMsg._lbl_alert_DataProcess_BZ01 = $"{rgvLocation.ToString()}-没有要处理的数据";
                            using (WmsDBModel wmsDB = new WmsDBModel())
                            {
                                var isAllow = IsAllloRunOutTaskMode(wmsDB, null);
@@ -161,7 +282,8 @@
        private static bool IsAllloRunOutTaskMode(WmsDBModel wmsDB, mes_batchOrderUPI_new curUpiObj)
        {
            //首先查询数据库中是否有 è¦å‡ºåº“的数据
            var isExistOutTaskForNewCreated = wmsDB.wms_rbline_task.Where(x => x.RbTaskType == (int)RbTaskTypeEnum.出库任务
            var isExistOutTaskForNewCreated = wmsDB.wms_rbline_task.Where(x =>
            (x.RbTaskType == (int)RbTaskTypeEnum.齐包出库任务 || x.RbTaskType == (int)RbTaskTypeEnum.强制出库任务)
               && x.TaskStatus == (int)TaskStatusEnum.新建
              ).Count();
            if (isExistOutTaskForNewCreated == 0)