leiqunqing
2026-02-06 15b3879cd259108e7ebb755fe02c190f28f1e20c
´úÂë¹ÜÀí/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs
@@ -1,10 +1,15 @@
using System.Text;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using System.Linq;
using System.Text;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.PLCEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.BasicInfo;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
@@ -54,33 +59,43 @@
                    OtherDevice device = (OtherDevice)value;
                    try
                    {
                        if (!device.IsConnected) throw new Exception(device.DeviceName + "连接失败");
                        var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
                        var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
                        var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
                        var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
                        var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
                        if (Heart && !EMG && AutoExecuting && OnlineExecuting && !Error)
                        if (/*Heart &&*/ !EMG && AutoExecuting && OnlineExecuting && !Error)
                        {
                            #region ä¸Šçº¿æ‰«ç 
                            HandleOnlineScan(device);
                            #endregion
                            //#region é›¶ä»¶æ£€æµ‹
                            //HandlePartDetection(device);
                            //#endregion
                            //#region ä¸Šçº¿æ‰«ç 
                            //HandleOnlineScan(device);
                            //#endregion
                            #region åŽ‹è£…æ‰«ç 
                            HandlePressScan(device);
                            #endregion
                            #region åŽ‹è£…ä¿¡æ¯ä¸Šä¼ 
                            HandlePressInfoUpload(device);
                            #endregion
                            #region æ£€æµ‹æ‰«ç 
                            HandleDetectScan(device);
                            #endregion
                            #region æ£€æµ‹ä¿¡æ¯ä¸Šä¼ 
                            HandleDetectInfoUpload(device);
                            #endregion
                            #region ä¸‹çº¿æ‰«ç 
                            HandleOfflineScan(device);
                            #endregion
                        }
                    }
                    catch (Exception ex)
                    {
@@ -91,50 +106,159 @@
            return Task.CompletedTask;
        }
        /// <summary>
        /// é›¶ä»¶æ£€æµ‹
        /// </summary>
        /// <param name="device"></param>
        /// <exception cref="InvalidOperationException"></exception>
        private void HandlePartDetection(OtherDevice device)
        {
            //DB800.1.4
            var Location5ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation5ScanStart);
            var Location5ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation5ScanDone);
            if (Location5ScanStart && !Location5ScanDone)
            {
                try
                {
                    if (_scanStationService.Repository.QueryFirst(x => x.StationCode == "001").IsScanned == 0)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation5ScanDone, true);
                        return;
                    }
                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryData(x => true, 1, "Id desc").FirstOrDefault();
                    if (dt_Boxing == null)
                    {
                        throw new InvalidOperationException("无组盘数据");
                    }
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
                    if (dt_Formula == null)
                    {
                        throw new InvalidOperationException("无成品配方");
                    }
                    List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id);
                    List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id && x.IsScanned == 1);
                    if (!_boxingDetailService.CheckComponentsMatchExactly(dt_BoxingDetails.Select(x => x.ComponentCode).ToList(), dt_FormulaDetails.Select(x => x.ComponentCode).ToList()))
                    {
                        throw new InvalidOperationException("零件与配方表中不同");
                    }
                    device.SetValue(W_PLCDBName.wboolLocation5ScanDone, true);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "检测零件流程执行异常", ex);
                }
            }
            else if (!Location5ScanStart && Location5ScanDone)
            {
                device.SetValue(W_PLCDBName.wboolLocation5ScanDone, false);
            }
        }
        /// <summary>
        /// ä¸Šçº¿æ‰«ç 
        /// </summary>
        /// <param name="device"></param>
        private void HandleOnlineScan(OtherDevice device)
        {
            var Location1ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation1ScanStart);
            var Location1ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation1ScanDone);
            if (Location1ScanStart && !Location1ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询组盘数据,判断托盘绑定成品是否已绑定所有所需零件
            //DB800.1.4
            var Location5ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation5ScanStart);
            var Location5ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation5ScanDone);
            if (Location5ScanStart && !Location5ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询组盘数据,判断托盘绑定成品是否已绑定所有所需零件
            {
                Dt_Boxing dt_Boxing1 = _boxingService.Repository.QueryData(x => true, 1, "Id desc").FirstOrDefault();
                if (dt_Boxing1 != null && dt_Boxing1.ProductCode == null)
                {
                    return;
                }
                //var PalletCode = "PL111";
                var PalletCode = TcpClientExample.Start("192.168.2.120", 2001);
                try
                {
                    if (!PalletCode.IsNotEmptyOrNull())
                    if (!PalletCode.IsNotEmptyOrNull() || PalletCode == "NoRead")
                    {
                        throw new InvalidOperationException("托盘为空");
                    }
                    var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (boxing == null)
                    if (_boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode && x.ProductCode != null) != null)
                    {
                        throw new InvalidOperationException("未添加组盘信息");
                        device.SetValue(W_PLCDBName.wboolLocation5ScanDone, true);
                        throw new InvalidOperationException("托盘以存在");
                    }
                    List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == boxing.Id);
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == boxing.ProductCode);
                    if (dt_Formula == null)
                    {
                        throw new InvalidOperationException("无成品配方");
                    }
                    List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id && x.IsScanned == 1);
                    //比较零件是否齐全
                    if (!_boxingDetailService.IsComponentCodesEqual(dt_BoxingDetails, dt_FormulaDetails))
                    {
                        throw new InvalidOperationException("零件有问题,请处理");
                    }
                    device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true);
                    Dt_Boxing dt_Boxing = new Dt_Boxing();
                    dt_Boxing.PalletCode = PalletCode;
                    _boxingService.Repository.AddData(dt_Boxing);
                    //Dt_ScanStation dt_ScanStation = _scanStationService.Repository.QueryFirst(x => x.StationCode == "001");
                    //if (dt_ScanStation == null)
                    //{
                    //    throw new InvalidOperationException("无工位数据");
                    //}
                    //Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_ScanStation.StationEndProduct);
                    //if (dt_Formula == null)
                    //{
                    //    throw new InvalidOperationException("无成品配方");
                    //}
                    //List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id && x.IsScanned == 1);
                    //if (dt_ScanStation.IsScanned == 0)
                    //{
                    //    Dt_Boxing dt_Boxing = new Dt_Boxing
                    //    {
                    //        PalletCode = PalletCode,
                    //        ProductCode = dt_Formula.ProductCode,
                    //        ProductName = dt_Formula.ProductName,
                    //        Creater = "admin",
                    //        CreateDate = new DateTime()
                    //    };
                    //    int id = _boxingService.Repository.AddData(dt_Boxing);
                    //    foreach (var item in dt_FormulaDetails)
                    //    {
                    //        Dt_BoxingDetail dt_BoxingDetail = new Dt_BoxingDetail()
                    //        {
                    //            BoxingId = id,
                    //            ComponentCode = item.ComponentCode,
                    //            ComponentName = item.ComponentName,
                    //            Creater = "admin",
                    //            CreateDate = new DateTime()
                    //        };
                    //        _boxingDetailService.Repository.AddData(dt_BoxingDetail);
                    //    }
                    //    device.SetValue(W_PLCDBName.wboolLocation5ScanDone, true);
                    //    return;
                    //}
                    //var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    //if (boxing == null)
                    //{
                    //    throw new InvalidOperationException("未添加组盘信息");
                    //}
                    //List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == boxing.Id);
                    //if (!_boxingDetailService.CheckComponentsMatchExactly(dt_BoxingDetails.Select(x => x.ComponentCode).ToList(), dt_FormulaDetails.Select(x => x.ComponentCode).ToList()))
                    //{
                    //    throw new InvalidOperationException("零件与配方表中不同");
                    //}
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "上线扫码流程执行异常", ex);
                }
            }
            else if (!Location1ScanStart && Location1ScanDone)
            else if (!Location5ScanStart && Location5ScanDone)
            {
                device.SetValue(W_PLCDBName.wboolLocation1ScanDone, false);
                device.SetValue(W_PLCDBName.wboolLocation5ScanDone, false);
            }
        }
@@ -144,6 +268,7 @@
        /// <param name="device"></param>
        private void HandlePressScan(OtherDevice device)
        {
            //DB800.1.1
            var Location2ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation2ScanStart);
            var Location2ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation2ScanDone);
            if (Location2ScanStart && !Location2ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询托盘绑定成品加工所需数据,写入PLC
@@ -152,36 +277,40 @@
                try
                {
                    if (!PalletCode.IsNotEmptyOrNull())
                    if (!PalletCode.IsNotEmptyOrNull() || PalletCode == "NoRead")
                    {
                        throw new InvalidOperationException("托盘为空");
                        throw new InvalidOperationException("托盘号为空");
                    }
                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (dt_Boxing == null)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true);
                        throw new InvalidOperationException("托盘为空");
                    }
                    if (dt_Boxing.ProductCode == null && dt_Boxing.BoxingNo == null)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true);
                        return;
                    }
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
                    //写入PLC
                    device.SetValue(W_PLCDBName.wrealPressPalletCode, dt_Boxing.Id % 100);
                    if(dt_Formula.PressNoTighten == 1)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation8ScanDone,true);
                    }
                    device.SetValue(W_PLCDBName.wrealProductLength, dt_Formula.ProductLength);
                    device.SetValue(W_PLCDBName.wrealProductWidth, dt_Formula.ProductWidth);
                    device.SetValue(W_PLCDBName.wrealProductHeight, dt_Formula.ProductHeight);
                    device.SetValue(W_PLCDBName.wrealScrewDownsetDistance, dt_Formula.ScrewDownsetDistance);
                    device.SetValue(W_PLCDBName.wrealScrewTorqueOutput, dt_Formula.ScrewTorqueOutput);
                    device.SetValue(W_PLCDBName.wDintAutoScrewOn, dt_Formula.DintAutoScrewOn);
                    //中心高度
                    device.SetValue(W_PLCDBName.wrealScrewTorque, dt_Formula.ScrewTorqueOutput);
                    device.SetValue(W_PLCDBName.wrealAutoScrewProgramNo, dt_Formula.DintAutoScrewOn);
                    //压装扫码完成
                    device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true);
                    //接收数据
                    decimal PressHeight = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressHeight);
                    decimal ScrewTorque = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
                    decimal ScrewAngle = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewAngle);
                    //添加到数据库
                    Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo()
                    {
                        PalletCode = PalletCode,
                        ProductCode = dt_Formula.ProductCode,
                        ProductName = dt_Formula.ProductName,
                        PressHeight = PressHeight,
                        ScrewTorque = ScrewTorque,
                        ScrewAngle = ScrewAngle
                    };
                    _processInfoService.Repository.AddData(dt_ProcessInfo);
                }
                catch (Exception ex)
                {
@@ -194,50 +323,123 @@
            }
        }
        /// <summary>
        /// åŽ‹è£…ä¿¡æ¯ä¸Šä¼ 
        /// </summary>
        /// <param name="device"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void HandlePressInfoUpload(OtherDevice device)
        {
            //DB800.1.5
            var Location6ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation6ScanStart);
            var Location6ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation6ScanDone);
            if (Location6ScanStart && !Location6ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询托盘绑定成品加工所需数据,写入PLC
            {
                var PalletNum = device.GetValue<R_PLCDBName, int>(R_PLCDBName.rrealPressPalletCode);
                try
                {
                    if (!PalletNum.IsNotEmptyOrNull())
                    {
                        throw new InvalidOperationException("托盘为空");
                    }
                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.Id % 100 == PalletNum);
                    if (dt_Boxing == null)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation6ScanDone, true);
                        throw new InvalidOperationException("未找到组盘数据");
                    }
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
                    //接收数据
                    decimal PressHeight = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressHeight);
                    decimal ScrewTorque = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
                    decimal ScrewAngle = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewAngle);
                    decimal PressPressure = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressForce);
                    bool PressTightenNg = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rrealPressScrewByScrewNG);
                    bool PressTightenOk = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rrealPressScrewByScrewOK);
                    bool PressTightenUnfinished = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rrealPressScrewByProcessUnfinished);
                    //添加到数据库
                    Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo()
                    {
                        PalletCode = dt_Boxing.PalletCode,
                        ProductCode = dt_Formula.ProductCode,
                        ProductName = dt_Formula.ProductName,
                        ProductSn = dt_Boxing.BoxingNo,
                        PressTightenNg = PressTightenNg?1:0,
                        PressTightenOk = PressTightenOk?1:0,
                        PressTightenUnfinished = PressTightenUnfinished?1:0,
                        PressHeight = PressHeight,
                        ScrewTorque = ScrewTorque,
                        ScrewAngle = ScrewAngle,
                        PressPressure = PressPressure,
                    };
                    _processInfoService.Repository.AddData(dt_ProcessInfo);
                    // åŽ‹è£…ä¿¡æ¯ä¸Šä¼ å®Œæˆ
                    device.SetValue(W_PLCDBName.wboolLocation6ScanDone, true);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "压装信息上传流程执行异常", ex);
                }
            }
            else if (!Location6ScanStart && Location6ScanDone)
            {
                device.SetValue(W_PLCDBName.wboolLocation6ScanDone, false);
            }
        }
        /// <summary>
        /// æ£€æµ‹æ‰«ç 
        /// </summary>
        /// <param name="device"></param>
        private void HandleDetectScan(OtherDevice device)
        {
            //DB800.1.2
            var Location3ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation3ScanStart);
            var Location3ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation3ScanDone);
            if (Location3ScanStart && !Location3ScanDone)
            {
                var PalletCode = TcpClientExample.Start("192.168.2.122", 2001);
                try
                {
                    if (!PalletCode.IsNotEmptyOrNull())
                    if (!PalletCode.IsNotEmptyOrNull() || PalletCode == "NoRead")
                    {
                        throw new InvalidOperationException("托盘为空");
                    }
                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (dt_Boxing == null)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true);
                        throw new InvalidOperationException("托盘为空");
                    }
                    if (dt_Boxing.ProductCode == null && dt_Boxing.BoxingNo == null)
                    {
                        device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true);
                        return;
                    }
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
                    //写入PLC
                    device.SetValue(W_PLCDBName.wrealXDirectionDistance1, dt_Formula.XDirectionDistance1);
                    device.SetValue(W_PLCDBName.wrealYDirectionHeight1, dt_Formula.YDirectionHeight1);
                    device.SetValue(W_PLCDBName.wrealXDirectionDistance2, dt_Formula.XDirectionDistance2);
                    device.SetValue(W_PLCDBName.wrealYDirectionHeight2, dt_Formula.YDirectionHeight2);
                    device.SetValue(W_PLCDBName.wrealXDirectionDistance3, dt_Formula.XDirectionDistance3);
                    device.SetValue(W_PLCDBName.wrealYDirectionHeight3, dt_Formula.YDirectionHeight3);
                    device.SetValue(W_PLCDBName.wrealCheckPalletCode, dt_Boxing.Id % 100);
                    device.SetValue(W_PLCDBName.wrealP0P1Width, dt_Formula.P0P1Width);
                    device.SetValue(W_PLCDBName.wrealP0P2Width, dt_Formula.P0P2Width);
                    device.SetValue(W_PLCDBName.wrealP0P3Width, dt_Formula.P0P3Width);
                    device.SetValue(W_PLCDBName.wrealP0P3Width, dt_Formula.P0P3Width);
                    device.SetValue(W_PLCDBName.wrealP1P3Height, dt_Formula.P1P3Height);
                    device.SetValue(W_PLCDBName.wrealP2P3Height, dt_Formula.P2P3Height);
                    //检测扫码完成
                    device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true);
                    //接收数据
                    decimal Height1 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight1);
                    decimal Height2 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);
                    decimal Height3 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight3);
                    Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (dt_ProcessInfo == null)
                    {
                        throw new InvalidOperationException("成品未压装");
                    }
                    dt_ProcessInfo.Height1 = Height1;
                    dt_ProcessInfo.Height2 = Height2;
                    dt_ProcessInfo.Height3 = Height3;
                    _processInfoService.Repository.UpdateData(dt_ProcessInfo);
                }
                catch (Exception ex)
                {
@@ -252,11 +454,89 @@
        }
        /// <summary>
        /// æ£€æµ‹ä¿¡æ¯ä¸Šä¼ 
        /// </summary>
        /// <param name="device"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void HandleDetectInfoUpload(OtherDevice device)
        {
            //DB800.1.6
            var Location7ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation7ScanStart);
            var Location7ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation7ScanDone);
            if (Location7ScanStart && !Location7ScanDone)
            {
                var PalletNum = device.GetValue<R_PLCDBName, int>(R_PLCDBName.rrealCheckPalletCode);
                try
                {
                    if (!PalletNum.IsNotEmptyOrNull())
                    {
                        throw new InvalidOperationException("托盘为空");
                    }
                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.Id % 100 == PalletNum);
                    if (dt_Boxing == null)
                    {
                        throw new InvalidOperationException("未找到组盘数据");
                    }
                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
                    //接收数据
                    decimal Height1 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight1);//113
                    decimal Height2 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);//92
                    decimal Height3 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight3);//11
                    bool CheckUnfinished = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rrealDetectByInspectUnfinished);
                    Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == dt_Boxing.PalletCode);
                    int id = 0;
                    if (dt_ProcessInfo == null)
                    {
                        dt_ProcessInfo = new Dt_ProcessInfo()
                        {
                            PalletCode = dt_Boxing.PalletCode,
                            ProductCode = dt_Formula.ProductCode,
                            ProductName = dt_Formula.ProductName,
                            ProductSn = dt_Boxing.BoxingNo,
                            CheckUnfinished = CheckUnfinished?1:0,
                        };
                        id = _processInfoService.Repository.AddData(dt_ProcessInfo);
                    }
                    else
                    {
                        id = dt_ProcessInfo.Id;
                    }
                    dt_ProcessInfo.Id = id;
                    dt_ProcessInfo.Height1 = Height1 = Height1 - Height3;
                    dt_ProcessInfo.Height2 = Height2 = Height2 - Height3;
                    dt_ProcessInfo.Height3 = Height3;
                    _processInfoService.Repository.UpdateData(dt_ProcessInfo);
                    //检测信息上传完成
                    device.SetValue(W_PLCDBName.wboolLocation7ScanDone, true);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "检测扫码流程执行异常", ex);
                }
            }
            else if (!Location7ScanStart && Location7ScanDone)
            {
                device.SetValue(W_PLCDBName.wboolLocation7ScanDone, false);
            }
        }
        /// <summary>
        /// ä¸‹çº¿æ‰«ç 
        /// </summary>
        /// <param name="device"></param>
        private void HandleOfflineScan(OtherDevice device)
        {
            //DB800.1.3
            var Location4ScanStart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolLocation4ScanStart);
            var Location4ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation4ScanDone);
            if (Location4ScanStart && !Location4ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询组盘数据,判断托盘绑定成品是否已绑定所有所需零件
@@ -266,30 +546,46 @@
                {
                    try
                    {
                        if (!PalletCode.IsNotEmptyOrNull())
                        if (!PalletCode.IsNotEmptyOrNull() || PalletCode == "NoRead")
                        {
                            throw new InvalidOperationException("托盘为空");
                        }
                        Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                        if (dt_ProcessInfo == null)
                        {
                            throw new InvalidOperationException("成品未压装和检测");
                        }
                        Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                        if (dt_Boxing != null)
                        {
                        _boxingService.Repository.DeleteData(dt_Boxing);
                        List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id);
                            if (dt_BoxingDetails != null)
                            {
                        _boxingDetailService.Repository.DeleteData(dt_BoxingDetails);
                            }
                        }
                        Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                        if (dt_ProcessInfo != null)
                        {
                        Dt_ProcessInfoDetail dt_ProcessInfoDetail = new Dt_ProcessInfoDetail()
                        {
                            PalletCode = PalletCode,
                            ProductCode = dt_ProcessInfo.ProductCode,
                            ProductName = dt_ProcessInfo.ProductName,
                                ProductCode = dt_ProcessInfo.ProductCode?.ToString() ?? "",
                                ProductName = dt_ProcessInfo.ProductName?.ToString() ?? "",
                                ProductSn = dt_ProcessInfo.ProductSn,
                                PressTightenNg = dt_ProcessInfo.PressTightenNg,
                                PressTightenOk = dt_ProcessInfo.PressTightenOk,
                                PressTightenUnfinished = dt_ProcessInfo.PressTightenUnfinished,
                                CheckUnfinished = dt_ProcessInfo.CheckUnfinished,
                                PressHeight = dt_ProcessInfo.PressHeight,
                                ScrewTorque = dt_ProcessInfo.ScrewTorque,
                                ScrewAngle = dt_ProcessInfo.ScrewAngle,
                                PressPressure = dt_ProcessInfo.PressPressure,
                                Height1 = dt_ProcessInfo.Height1,
                                Height2 = dt_ProcessInfo.Height2,
                                Height3 = dt_ProcessInfo.Height3,
                            Creater = "admin",
                            CreateDate = DateTime.Now
                        };
                        _processDetailInfoService.Repository.AddData(dt_ProcessInfoDetail);
                        _processInfoService.DeleteData(dt_ProcessInfo);
                        }
                        uow.Commit();
                        //下线扫码完成
                        device.SetValue(W_PLCDBName.wboolLocation4ScanDone, true);
@@ -297,12 +593,13 @@
                    catch (Exception ex)
                    {
                        WriteError(device.DeviceName, "下线扫码流程执行异常", ex);
                    }
                }
            }
            else if (!Location4ScanStart && Location4ScanDone)
            {
                device.SetValue(W_PLCDBName.wboolLocation2ScanDone, false);
                device.SetValue(W_PLCDBName.wboolLocation4ScanDone, false);
            }
        }
    }