diff --git a/Admin.Core.Model/Model_New/OffLineInfo.cs b/Admin.Core.Model/Model_New/OffLineInfo.cs index b78140fc..7b56f500 100644 --- a/Admin.Core.Model/Model_New/OffLineInfo.cs +++ b/Admin.Core.Model/Model_New/OffLineInfo.cs @@ -62,5 +62,15 @@ namespace Admin.Core.Model /// [SugarColumn(ColumnName = "PRODUCT_LINE_CODE")] public string ProductLineCode { get; set; } //扫描时间 + /// + /// 上传条码系统保存接口返回信息 + /// + [SugarColumn(ColumnName = "SAVE_RETURN_INFO")] + public string SaveRetuenInfo { get; set; } + /// + /// 当前登录班组(一线白班,一线夜班,二线白班,二线夜班) + /// + [SugarColumn(ColumnName = "LOGIN_TEAM")] + public string LoginTeam { get; set; } } } diff --git a/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj b/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj index 48bc648f..244070ed 100644 --- a/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj +++ b/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj @@ -36,7 +36,7 @@ - PreserveNewest + Always true PreserveNewest diff --git a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs index 2f7bd499..b87e5eef 100644 --- a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs +++ b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs @@ -2,12 +2,14 @@ using Aucma.Core.Scanner; using log4net; using MvCodeReaderSDKNet; +using NPOI.SS.Formula.Functions; using StackExchange.Profiling; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; +using System.Threading; using System.Threading.Tasks; using UAParser; @@ -99,6 +101,8 @@ namespace Aucma.Core.ProductOffLine.Business } else { + // 更新存活时间 + LinerLiveTime = DateTime.Now; Console.WriteLine(DateTime.Now + ":外侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); log.Info(DateTime.Now + ":外侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); } @@ -153,6 +157,8 @@ namespace Aucma.Core.ProductOffLine.Business } else { + // 更新存活时间 + LinerLiveTime = DateTime.Now; Console.WriteLine(DateTime.Now + "内侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); log.Info(DateTime.Now + "内侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); } @@ -173,7 +179,7 @@ namespace Aucma.Core.ProductOffLine.Business public static void Shell() { - + ShellLiveTime = DateTime.Now; MvCodeReader.cbOutputEx2delegate ImageCallback; MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfo = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); @@ -187,12 +193,23 @@ namespace Aucma.Core.ProductOffLine.Business nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref stDevList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); if (MvCodeReader.MV_CODEREADER_OK != nRet) { + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); + + RefreshStateEvent?.Invoke("内侧", false); + Thread.Sleep(1000 * 10); Console.WriteLine("Enum device failed:{0:x8}", nRet); break; } Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); if (0 == stDevList.nDeviceNum) { + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); + + RefreshStateEvent?.Invoke("内侧", false); + Thread.Sleep(1000 * 10); + break; } @@ -217,10 +234,17 @@ namespace Aucma.Core.ProductOffLine.Business { nDevIndex = i; Console.WriteLine("device IP :" + ipStr); + } } } - if (nDevIndex < 0) return; + if (nDevIndex < 0) { + Console.WriteLine("未找到外侧扫码器"); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); + Thread.Sleep(1000 * 30); + break; + } stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); // ch:创建设备 | en:Create device @@ -228,6 +252,8 @@ namespace Aucma.Core.ProductOffLine.Business if (MvCodeReader.MV_CODEREADER_OK != nRet) { Console.WriteLine("Create device failed:{0:x8}", nRet); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); break; } @@ -250,6 +276,8 @@ namespace Aucma.Core.ProductOffLine.Business if (MvCodeReader.MV_CODEREADER_OK != nRet) { Console.WriteLine("Register image callback failed!"); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); break; } @@ -258,6 +286,8 @@ namespace Aucma.Core.ProductOffLine.Business if (MvCodeReader.MV_CODEREADER_OK != nRet) { Console.WriteLine("Start grabbing failed:{0:x8}", nRet); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); break; } @@ -265,8 +295,23 @@ namespace Aucma.Core.ProductOffLine.Business ShellDevice = device; Console.WriteLine("Press enter to exit"); Console.WriteLine(DateTime.Now.ToString()); - Console.ReadLine(); - + while (true) + { + Thread.Sleep(1000*60); + DateTime dateTime = DateTime.Now; + TimeSpan timeSpan = dateTime.Subtract(ShellLiveTime); + if (timeSpan.TotalMinutes >= 10) + { + Console.WriteLine("外侧扫码器超时"); + //CloseShell(); + //Shell(); + break; + } + + } + // Console.ReadLine(); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); // ch:停止抓图 | en:Stop grabbing nRet = device.MV_CODEREADER_StopGrabbing_NET(); if (MvCodeReader.MV_CODEREADER_OK != nRet) @@ -291,16 +336,16 @@ namespace Aucma.Core.ProductOffLine.Business break; } } while (false); - - if (MvCodeReader.MV_CODEREADER_OK != nRet) - { - // ch:销毁设备 | en:Destroy device - nRet = device.MV_CODEREADER_DestroyHandle_NET(); - if (MvCodeReader.MV_CODEREADER_OK != nRet) - { - Console.WriteLine("Destroy device failed:{0:x8}", nRet); - } - } + Shell(); + //if (MvCodeReader.MV_CODEREADER_OK != nRet) + //{ + // // ch:销毁设备 | en:Destroy device + // nRet = device.MV_CODEREADER_DestroyHandle_NET(); + // if (MvCodeReader.MV_CODEREADER_OK != nRet) + // { + // Console.WriteLine("Destroy device failed:{0:x8}", nRet); + // } + //} } @@ -308,7 +353,7 @@ namespace Aucma.Core.ProductOffLine.Business public static void Liner() { - + LinerLiveTime = DateTime.Now; MvCodeReader.cbOutputEx2delegate ImageCallback; MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfo = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); @@ -322,12 +367,22 @@ namespace Aucma.Core.ProductOffLine.Business nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref stDevList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); if (MvCodeReader.MV_CODEREADER_OK != nRet) { + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); + + RefreshStateEvent?.Invoke("内侧", false); + Thread.Sleep(1000 * 10); Console.WriteLine("Enum device failed:{0:x8}", nRet); break; } Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); if (0 == stDevList.nDeviceNum) { + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); + + RefreshStateEvent?.Invoke("内侧", false); + Thread.Sleep(1000 * 10); break; } @@ -355,7 +410,15 @@ namespace Aucma.Core.ProductOffLine.Business } } } - if (nDevIndex < 0) return; + if (nDevIndex < 0) + { + Console.WriteLine("未找到内侧扫码器"); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("内侧", false); + Thread.Sleep(1000 * 30); + break; + } + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); // ch:创建设备 | en:Create device @@ -399,7 +462,21 @@ namespace Aucma.Core.ProductOffLine.Business Console.WriteLine("Press enter to exit"); Console.WriteLine(DateTime.Now.ToString()); - Console.ReadLine(); + while (true) + { + Thread.Sleep(1000*60); + DateTime dateTime = DateTime.Now; + TimeSpan timeSpan = dateTime.Subtract(LinerLiveTime); + if (timeSpan.TotalMinutes >= 10) + { + Console.WriteLine("内侧扫码器超时"); + //CloseShell(); + //Shell(); + break; + } + + } + //Console.ReadLine(); // ch:停止抓图 | en:Stop grabbing nRet = device.MV_CODEREADER_StopGrabbing_NET(); @@ -424,6 +501,7 @@ namespace Aucma.Core.ProductOffLine.Business Console.WriteLine("Destroy device failed:{0:x8}", nRet); break; } + } while (false); if (MvCodeReader.MV_CODEREADER_OK != nRet) @@ -435,6 +513,7 @@ namespace Aucma.Core.ProductOffLine.Business Console.WriteLine("Destroy device failed:{0:x8}", nRet); } } + Liner(); } diff --git a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs index c2f7ab18..a6c3b68a 100644 --- a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs +++ b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs @@ -1,11 +1,14 @@ using Admin.Core.Common; +using Admin.Core.Common.Config; using Admin.Core.IService; using Admin.Core.Model; using Admin.Core.Model.Model_New; using Admin.Core.Service; using Aucma.Core.HwPLc; using Aucma.Core.ProductOffLine; +using Aucma.Core.ProductOffLine.Config; using Aucma.Core.ProductOffLine.Models; +using Aucma.Core.ProductOffLine.Views; using Aucma.Core.Scanner; using log4net; using Microsoft.Extensions.DependencyInjection; @@ -23,6 +26,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; +using System.Reflection.Metadata.Ecma335; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -62,6 +66,7 @@ namespace Aucma.Core.ProductOffLine.Business #endregion #region 接口引用 + private AppConfig appConfig = AppConfig.Instance; private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness)); @@ -104,7 +109,8 @@ namespace Aucma.Core.ProductOffLine.Business public OffLineBusiness() { MvCodeHelper.RefreshMaterialCodeStrEvent += MaterialBarScan; - // test(); + ChooseDirectionWindow.SendPlcPassEvent += DownLoadPassFlag; + test(); } #region 变量定义 /// @@ -116,11 +122,11 @@ namespace Aucma.Core.ProductOffLine.Business public void test() { - // private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness)); - // string result = _productOffLineServices.QueryChecked("1520870000099E2V0004"); - // string result = _productOffLineServices.QueryChecked("1530080CD0098E1V1714"); - // Console.WriteLine(result); - // string strSave = _productOffLineServices.SaveBarcodeInfo("1520870000099E2V0004", "ILS_SORT", result.Replace("0000",""), 1); + // private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness)); + // string result = _productOffLineServices.QueryChecked("1520870000099E2V0004"); + // string result = _productOffLineServices.QueryChecked("1530080CD0098E1V1714"); + // Console.WriteLine(result); + // string strSave = _productOffLineServices.SaveBarcodeInfo("1520870000099E2V0004", "ILS_SORT", result.Replace("0000",""), 1); // LogHelper.Info("成品码:1520870000099E2V0004"+strSave); // string tt = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000004899@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01"; Task.Run(() => @@ -128,14 +134,23 @@ namespace Aucma.Core.ProductOffLine.Business //while (true) //{ Thread.Sleep(5000); - Random random = new Random(); - MaterialBarScan("32160030000000912" + random.Next(100, 999), "10.10.92.141"); - Thread.Sleep(3000); - Random random1 = new Random(); - MaterialBarScan("99160030000000912" + random1.Next(100, 999), "10.10.92.141"); - Thread.Sleep(3000); - Random random2 = new Random(); - MaterialBarScan("44160030000000912" + random2.Next(100, 999), "10.10.92.141"); + // string aa = appConfig.BarCodeAccount; + // string bb = appConfig.ProductlineCode; + // appConfig.BarCodeAccount = "123"; + //TempOffLineInfo1.QualityResult = "失败"; + //TempOffLineInfo1.ProductSNCode = "323222444"; //产品SN条码*1 + //TempOffLineInfo1.ProductScanTime = System.DateTime.Now; // 扫码时间*2 + //TempOffLineInfo1.MsgInfo = "条码质检失败:"; + //RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo1); + // Random random = new Random(); + // MaterialBarScan("32160030000000912" + random.Next(100, 999), "10.10.92.141"); + + //Thread.Sleep(3000); + //Random random1 = new Random(); + //MaterialBarScan("99160030000000912" + random1.Next(100, 999), "10.10.92.141"); + //Thread.Sleep(3000); + //Random random2 = new Random(); + //MaterialBarScan("44160030000000912" + random2.Next(100, 999), "10.10.92.141"); // } // Thread.Sleep(1000); @@ -173,16 +188,26 @@ namespace Aucma.Core.ProductOffLine.Business if (!BackResult) { log.Info("条码:" + TempOffLineInfo1.ProductSNCode + "对接条码系统处理失败,禁止放行,流程结束"); + return; } // TempOffLineInfo1.ProductRefreshFlag = true; // 2.更新mes数据库 BackResult = updateMesData(TempOffLineInfo1); - BackResult = true; // 测试 + + // BackResult = true; // 测试 // 3.plc放行 if (BackResult) { - + try + { + //刷新统计图表 + RefreshChartsEvent?.Invoke(); + } + catch (Exception ex) + { + log.Error("刷新统计图表出错:" + ex.Message.ToString()); + } bool plcResult = SendAndWaitSignal(ScannerNo, materialType); //if (plcResult) //{ @@ -199,15 +224,7 @@ namespace Aucma.Core.ProductOffLine.Business // TempOffLineInfo1.ProductRefreshFlag = true; //} log.Info(String.Format("订单号{0} 订单数量{1}", TempOffLineInfo1.ProductOrderNo, TempOffLineInfo1.OrderQty)); - try - { - //刷新统计图表 - RefreshChartsEvent?.Invoke(); - } - catch(Exception ex) - { - log.Error("刷新统计图表出错:"+ex.Message.ToString()); - } + } else { @@ -232,11 +249,20 @@ namespace Aucma.Core.ProductOffLine.Business // TempOffLineInfo2.ProductRefreshFlag = true; // 2.更新mes数据库 BackResult = updateMesData(TempOffLineInfo2); - BackResult = true; + + //BackResult = true; // 3.plc放行 if (BackResult) { - + try + { + //刷新统计图表 + RefreshChartsEvent?.Invoke(); + } + catch (Exception ex) + { + log.Error("刷新统计图表出错:" + ex.Message.ToString()); + } bool plcResult = SendAndWaitSignal(ScannerNo, materialType); //if (plcResult) @@ -254,14 +280,7 @@ namespace Aucma.Core.ProductOffLine.Business // TempOffLineInfo2.ProductRefreshFlag = true; //} log.Info(String.Format("订单号{0} 订单数量{1}", TempOffLineInfo2.ProductOrderNo, TempOffLineInfo2.OrderQty)); - try - { - //刷新统计图表 - RefreshChartsEvent?.Invoke(); - }catch(Exception ex) - { - log.Error("刷新页面异常"+ex.Message.ToString()); - } + } @@ -327,49 +346,76 @@ namespace Aucma.Core.ProductOffLine.Business // 产线 info11.ProductLineCode = "CX_02"; + info11.SaveRetuenInfo = TempOffLineInfo.MsgInfo; + info11.LoginTeam = appConfig.LoginTeam; // 查询本地数据库是否有数据 OffLineInfo offLineInfo = _offLineInfoServices.FirstAsync(x => x.ProductSNCode == TempOffLineInfo.ProductSNCode).Result; if(offLineInfo == null) { - _offLineInfoServices.AddAsync(info11); - } - - // 修改订单表 - ////6.更新mes 数据库完成数量和时间(BASE_ORDERINFO) 注意:查询的字段可能需要修改,确保数据一致 - - ////6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理 - BaseOrderInfo order = _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo).Result; - - order.CompleteAmount++; - if (order.CompleteAmount == order.OrderAmount) - { - order.CompleteDate = DateTime.Now; - } - order.UpdatedTime = DateTime.Now; - _baseOrderInfoServices.UpdateAsync(order); - + info11.ProductOrderNo = "0000" + info11.ProductOrderNo; + int flag = _offLineInfoServices.AddAsync(info11).Result; + if (flag < 0) + { + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + "插入下线记录失败"; + TempOffLineInfo.MsgAlarmFlag = true; + //界面刷新 + RefreshScanMateriaCodeEvent(TempOffLineInfo); + return false; + } - #region 暂时不启用,因为还没打箱体码,查不到数据,更新过点数据 - //PrintBarCode print = _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == bindingRecord1.BoxCode).Result; - //if (print != null) - //{ - // MaterialCompletion completion = new MaterialCompletion(); - // completion.OrderCode = print.OrderCode; - // completion.MaterialBarcode = bindingRecord1.BoxCode; - // completion.MaterialCode = print.MaterialCode; - // completion.MaterialName = print.MaterialName; - // completion.StationName = "1009"; - // completion.CompleteDate = DateTime.Now; - // completion.ProductLineCode = "CX_02"; - // completion.isDownLine = 1; - // _ = _iMaterialCompletionServices.AddAsync(completion).Result; + // 不重复上传的条码才更新mes订单完成数 + // 修改订单表 + ////6.更新mes 数据库完成数量和时间(BASE_ORDERINFO) 注意:查询的字段可能需要修改,确保数据一致 - //} + ////6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理 + BaseOrderInfo order = _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo).Result; + if (order == null) + { + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + "查询mes订单失败"; + TempOffLineInfo.MsgAlarmFlag = true; + //界面刷新 + RefreshScanMateriaCodeEvent(TempOffLineInfo); + return false; - #endregion + } + order.CompleteAmount++; + if (order.CompleteAmount == order.OrderAmount) + { + order.CompleteDate = DateTime.Now; + } + order.UpdatedTime = DateTime.Now; + bool uploadOrder = _baseOrderInfoServices.UpdateAsync(order).Result; + if(!uploadOrder) + { + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + "更新mes订单完成数失败"; + TempOffLineInfo.MsgAlarmFlag = true; + //界面刷新 + RefreshScanMateriaCodeEvent(TempOffLineInfo); + return false; + } + #region 暂时不启用,因为还没打箱体码,查不到数据,更新过点数据 + //PrintBarCode print = _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == bindingRecord1.BoxCode).Result; + //if (print != null) + //{ + // MaterialCompletion completion = new MaterialCompletion(); + // completion.OrderCode = print.OrderCode; + // completion.MaterialBarcode = bindingRecord1.BoxCode; + // completion.MaterialCode = print.MaterialCode; + // completion.MaterialName = print.MaterialName; + // completion.StationName = "1009"; + // completion.CompleteDate = DateTime.Now; + // completion.ProductLineCode = "CX_02"; + // completion.isDownLine = 1; + // _ = _iMaterialCompletionServices.AddAsync(completion).Result; + + //} + #endregion + + } return true; + } catch (Exception) { @@ -396,6 +442,7 @@ namespace Aucma.Core.ProductOffLine.Business TempOffLineInfo.ProductSNCode = BarCode.Trim(); //产品SN条码*1 TempOffLineInfo.ProductScanTime = System.DateTime.Now; // 扫码时间*2 TempOffLineInfo.MsgInfo = "条码质检失败:"; + foreach(ReportQualityInsPection item in qualityList) { TempOffLineInfo.MsgInfo += item.QualityDefectName; @@ -526,10 +573,33 @@ namespace Aucma.Core.ProductOffLine.Business { try { + int orderType = 1; // ZP03为在库返工订单,传参数3,默认正常订单1 + // 先查订单 if (!string.IsNullOrEmpty(TempOffLineInfo.ProductOrderNo)) { + // mes查询订单数据, + BaseOrderInfo order = _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo.Replace("0000", "")).Result; + if (order != null) + { + if (order.OrderType == "ZP03") + { + orderType = 3; + } + TempOffLineInfo.OrderQty = order.OrderAmount; // 订单数量*5 + TempOffLineInfo.ActQty = order.CompleteAmount; // 订单已上传*6 + } + else + { + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",MES未查询到订单数据"; + TempOffLineInfo.MsgAlarmFlag = true; + //界面刷新 + // TempOffLineInfo.ProductRefreshFlag = true; + RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); + return false; + } + // 条码系统保存接口 - string strSave = _productOffLineServices.SaveBarcodeInfo(TempOffLineInfo.ProductSNCode, "6945", TempOffLineInfo.ProductOrderNo, 1); + string strSave = _productOffLineServices.SaveBarcodeInfo(TempOffLineInfo.ProductSNCode, appConfig.BarCodeAccount, TempOffLineInfo.ProductOrderNo, orderType); // string strSave = "Y"; if (!string.IsNullOrEmpty(strSave)) { @@ -538,23 +608,7 @@ namespace Aucma.Core.ProductOffLine.Business log.Info(TempOffLineInfo.ProductSNCode + "上传条码成功:" + strSave); TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码成功"; - // mes查询订单数据, 异常处理:后期可能根据SN码查箱体码,查订单号并检查更新订单数据 - BaseOrderInfo order = _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo.Replace("0000", "")).Result; - if (order != null) - { - TempOffLineInfo.OrderQty = order.OrderAmount; // 订单数量*5 - TempOffLineInfo.ActQty = order.CompleteAmount; // 订单已上传*6 - } - else - { - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",MES查询订单数据异常"; - TempOffLineInfo.MsgAlarmFlag = true; - //界面刷新 - // TempOffLineInfo.ProductRefreshFlag = true; - RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); - // return false; - } - + //界面刷新 // TempOffLineInfo.ProductRefreshFlag = true; RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); @@ -568,31 +622,7 @@ namespace Aucma.Core.ProductOffLine.Business if (strSave.Contains("条码重复")) { - // 查询本地数据库是否有数据 - OffLineInfo offLineInfo = _offLineInfoServices.FirstAsync(x => x.ProductSNCode == TempOffLineInfo.ProductSNCode).Result; - if (offLineInfo != null) - { - log.Info(TempOffLineInfo.ProductSNCode + "条码重复,本地已存在,放行"); - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + "条码重复,本地已存在,放行"; - //界面刷新 - // TempOffLineInfo.ProductRefreshFlag = true; - RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); - return true; - // chkout:条码重复是否允许放行 - //if (TempOffLineInfo.ChkOut == true) - //{ - // return true; - //} - } - else - { - log.Info(TempOffLineInfo.ProductSNCode + "条码重复,本地不存在,已插入,可以放行"); - OffLineInfo info11 = MapperTwo(TempOffLineInfo); - // 产线 - info11.ProductLineCode = "CX_02"; - _offLineInfoServices.AddAsync(info11); - return true; - } + return CodeRepeatProcess(TempOffLineInfo); } TempOffLineInfo.MsgAlarmFlag = true; //界面刷新 @@ -628,12 +658,73 @@ namespace Aucma.Core.ProductOffLine.Business return false; } } - #region plc交互 - /// - /// 下发plc放行信号,传进来扫码器编号,分垛方向A或者B,返回plc反馈结果 - /// - /// - private bool DownLoadPassFlag(int scannerNo,string strDirection) + + /// + /// 条码系统上传重复逻辑20240305经aucma负责人商讨确定 + /// 如果条码重复,比对mes系统记录,在五分钟以内重复,视为短时间内员工重复推箱子或用扫码枪扫描,可以放行 + /// 超过五分钟,报警并显示已存在记录时间提示员工, + /// 员工判断如果是一码多用,搬下来换新条码重新扫描;如果是同一箱子因为吃饭或停班重复扫描,那么点击屏幕按钮进行放行 + /// + /// + public bool CodeRepeatProcess(TempInfo TempOffLineInfo) + { + try + { + // 查询本地数据库是否有数据 + OffLineInfo offLineInfo = _offLineInfoServices.FirstAsync(x => x.ProductSNCode == TempOffLineInfo.ProductSNCode).Result; + + if (offLineInfo != null) + { + if (offLineInfo.ProductScanTime >= DateTime.Now.AddMinutes(-5)) // 五分钟以内 + { + log.Info(TempOffLineInfo.ProductSNCode + "五分钟内重复上传条码系统,本地已存在,放行"); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + "五分钟内重复上传条码系统,放行"; + //界面刷新 + // TempOffLineInfo.ProductRefreshFlag = true; + RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); + return true; + } + else + { + log.Info(TempOffLineInfo.ProductSNCode + "条码重复,并且距离上次上传超过五分钟,报警并显示已存在记录时间提示员工操作处理"); + TempOffLineInfo.MsgAlarmFlag = true; + + TempOffLineInfo.MsgInfo = "条码重复,上传间隔超过五分钟禁止放行,人工处理,上传时间:" + offLineInfo.ProductScanTime; + //界面刷新 + // TempOffLineInfo.ProductRefreshFlag = true; + RefreshScanMateriaCodeEvent?.Invoke(TempOffLineInfo); + return false; + } + } + else + { + log.Info(TempOffLineInfo.ProductSNCode + "条码重复,本地不存在,已插入,放行"); + OffLineInfo info11 = MapperTwo(TempOffLineInfo); + // 产线 + info11.ProductLineCode = "CX_02"; + info11.ProductOrderNo = "0000" + info11.ProductOrderNo; + info11.SaveRetuenInfo = TempOffLineInfo.MsgInfo; + info11.LoginTeam = appConfig.LoginTeam; + _offLineInfoServices.AddAsync(info11); + return true; + } + } + catch (Exception ex) + { + + log.Error("CodeRepeatProcess()异常" + ex.Message.ToString()); + return false; + } + + } + #region plc交互 + /// + /// 下发plc放行信号,传进来扫码器编号,分垛方向A或者B,返回plc反馈结果 + /// scannerNo == 1内侧,scannerNo == 2外侧 + /// strDirection "A" ? 1 : 2;入库方向A,B + /// + /// + private bool DownLoadPassFlag(int scannerNo,string strDirection) { // 入库方向A,B int direction = strDirection == "A" ? 1 : 2; diff --git a/Aucma.Core.ProductOffLine/Config/AppConfig.cs b/Aucma.Core.ProductOffLine/Config/AppConfig.cs new file mode 100644 index 00000000..7ee93185 --- /dev/null +++ b/Aucma.Core.ProductOffLine/Config/AppConfig.cs @@ -0,0 +1,57 @@ +using Admin.Core.Common.Config; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.ProductOffLine.Config +{ + public sealed class AppConfig + { + private static IniHelper iniHelper = new IniHelper(System.Environment.CurrentDirectory + "/config/App.InI"); + + + private static readonly Lazy lazy = new Lazy(() => new AppConfig()); + public static AppConfig Instance + { + get + { + return lazy.Value; + } + } + + + public AppConfig() + { + + } + /// + /// 条码系统账号 + /// + public string BarCodeAccount + { + get { return iniHelper.IniReadValue("system", "BarCodeAccount"); } + set { iniHelper.IniWriteValue("system", "BarCodeAccount", value); } + } + + /// + /// 产线编号 + /// + public string ProductlineCode + { + get { return iniHelper.IniReadValue("system", "ProductlineCode"); } + set { iniHelper.IniWriteValue("system", "ProductlineCode", value); } + } + + /// + /// 当前登录班组 + /// + public string LoginTeam + { + get { return iniHelper.IniReadValue("system", "LoginTeam"); } + set { iniHelper.IniWriteValue("system", "LoginTeam", value); } + } + + } +} diff --git a/Aucma.Core.ProductOffLine/Startup.cs b/Aucma.Core.ProductOffLine/Startup.cs index fc64ab2b..29719ee5 100644 --- a/Aucma.Core.ProductOffLine/Startup.cs +++ b/Aucma.Core.ProductOffLine/Startup.cs @@ -66,7 +66,7 @@ namespace Aucma.Core.ProductOffLine services.AddScannerSetup(); // - services.AddJobSetup(); + // services.AddJobSetup(); //PLC services.AddPlcSetup(); @@ -91,7 +91,7 @@ namespace Aucma.Core.ProductOffLine /// /// /// - public void Configure(IApplicationBuilder app, IScannerService scannerService, IRunPlcService runPlcService, ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter) + public void Configure(IApplicationBuilder app, IScannerService scannerService, IRunPlcService runPlcService)//, ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter { // ʹþ̬ļ app.UseStaticFiles(); @@ -99,7 +99,7 @@ namespace Aucma.Core.ProductOffLine //app.UseAuthorization(); // QuartzNetJobȷ - app.UseQuartzJobMildd(tasksQzService, schedulerCenter); + // app.UseQuartzJobMildd(tasksQzService, schedulerCenter); //ɨ app.UseScannerMildd(scannerService); //PLC diff --git a/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs index 89443f65..b586e4bb 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs @@ -37,6 +37,8 @@ using Aucma.Core.ProductOffLine.Models; using System.Globalization; using Admin.Core.Model.ViewModels; using ChartsByTime = Admin.Core.Model.ViewModels.ChartsByTime; +using LiveCharts.Defaults; +using System.Windows.Documents; /* @@ -52,7 +54,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels // 成品下线操作mes数据 private readonly IOffLineInfoServices? _offLineInfoServices = App.ServiceProvider.GetService(); - // System.Timers.Timer timer = new System.Timers.Timer(500);//界面刷新定时器 + // System.Timers.Timer timer = new System.Timers.Timer(500);//界面刷新定时器 private readonly IBaseBomInfoServices? _baseBomInfoServices; private OffLineBusiness offLineBusiness = OffLineBusiness.Instance; private static double aaa = 100.0; @@ -61,22 +63,14 @@ namespace Aucma.Core.ProductOffLine.ViewModels { OffLineBusiness.RefreshScanMateriaCodeEvent += ModelToPage; OffLineBusiness.RefreshChartsEvent += RefreshCharts; - OffLineQty = "235"; + MainWindowViewModel.RefreshFirstPageChartsEvent += RefreshCharts; _offLineInfoServices = App.ServiceProvider.GetService(); _baseBomInfoServices = App.ServiceProvider.GetService(); - InitEveryDayMethod(); - // 刷新界面扫码信息 - // RefreshPageListen(); - LoadData(); - //Task.Run(() => - //{ - // Thread.Sleep(5000); - // InitEveryDayMethod(); - // // Thread.Sleep(5000); - // // InitEveryDayMethod(); - //}); - - // offLineBusiness.test(); + + RefreshCharts(); + + + } /// @@ -84,10 +78,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels /// public void RefreshCharts() { - InitEveryDayMethod(); - AddDataGrid(); + + List list = LoadData(); + // Console.WriteLine("刷新台数:"+list.Count); + InitEveryDayMethod(list); + } - + #region 参数定义 @@ -204,7 +201,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels OnPropertyChanged(nameof(MsgColor)); } } - + #endregion @@ -255,7 +252,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels /// /// 日产量柱状图X轴日期 /// - private List productionHourList; + private List productionHourList = new List(); public List ProductionHourList { @@ -293,40 +290,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels #region 界面刷新定时器 - //public void RefreshPageListen() - //{ - // timer.Elapsed += new System.Timers.ElapsedEventHandler(RefreshPage); - // timer.AutoReset = true; - // timer.Enabled = true; - // timer.Start(); - - //} - /// - /// 定时检测两个扫码实体是否需要刷新 - /// - /// - /// - //public void RefreshPage(object source, System.Timers.ElapsedEventArgs e) - //{ - - - // if (OffLineBusiness.TempOffLineInfo1.ProductRefreshFlag == true) - // { - // OffLineBusiness.TempOffLineInfo1.ProductRefreshFlag = false; - // ModelToPage(OffLineBusiness.TempOffLineInfo1); - // LoadData(); - - - - // } - // else if(OffLineBusiness.TempOffLineInfo2.ProductRefreshFlag == true) - // { - // OffLineBusiness.TempOffLineInfo2.ProductRefreshFlag = false; - // ModelToPage(OffLineBusiness.TempOffLineInfo2); - - // } - //} public void ModelToPage(TempInfo tempInfo) { App.Current.Dispatcher.Invoke(() => @@ -338,7 +302,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels OrderQty = tempInfo.OrderQty.ToString(); ActQty = tempInfo.ActQty.ToString(); MsgInfo = tempInfo.MsgInfo; - if (tempInfo.MsgAlarmFlag==null || tempInfo.MsgAlarmFlag==false) + if (tempInfo.MsgAlarmFlag == null || tempInfo.MsgAlarmFlag == false) { MsgColor = Brushes.White; } @@ -352,159 +316,190 @@ namespace Aucma.Core.ProductOffLine.ViewModels #endregion - private async void InitEveryDayMethod() + + private async void InitEveryDayMethod(List list) { - await App.Current.Dispatcher.BeginInvoke((Action)(() => - { - Achievement.Clear(); - ProductionHourList = new List(); - // OffLineQty = "232"; - for (int i = 8; i <= 19; i++) - { - ProductionHourList.Add(i + ":00"); - } - //ChartValues achievement2 = new ChartValues(); - //achievement2.Add(74); - //achievement2.Add(77); - //achievement2.Add(75); - //achievement2.Add(6); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //achievement2.Add(0); - //var column2 = new ColumnSeries(); - //column2.DataLabels = true; - //column2.Title = "产量"; - //column2.Values = achievement2; - //column2.Foreground = Brushes.White; - //Achievement.Add(column2); - - //MaterialNameList.Add("BCD-162CST,炫金色,A"); - //MaterialNameList.Add("BCD-212CHG,炫金色,A"); - //MaterialNameList.Add("BCD-211CGN,星际灰,A"); - //MaterialNameList.Add("BC/BD-310NF,银河灰,A"); - //MaterialNameList.Add("BC/BD-232WD,银河灰,A"); - //MaterialNameList.Add("BC/BD-145NF,炫金色,ZS,A"); - //ChartValues achievement = new ChartValues(); - //achievement.Add(41); - //achievement.Add(37); - //achievement.Add(37); - //achievement.Add(47); - //achievement.Add(39); - //achievement.Add(19); - //var column = new ColumnSeries(); - //column.DataLabels = true; - //column.Title = "型号"; - //column.Values = achievement; - //column.Foreground = Brushes.White; - - //ModelStatistics.Add(column); - #region 小时产量统计 - List listTime = _baseBomInfoServices.getWorkTime().Result; - if (listTime == null) return; - // var aa =_offLineInfoServices.Query(x=>x.ProductScanTime>= listTime[0].startTime && x.ProductScanTime<= listTime[11].startTime) - // List hourAmount = _offLineInfoServices.QueryCharts1("CX_01"); - - List list = _offLineInfoServices.QueryCharts(listTime[0].startTime, listTime[11].startTime).Result; - - if (list == null) return; - List hourList1 = new List(); - // 当班下线数量 - int sum = 0; - foreach (ChartsByTime item in list) - { - DateTime date = DateTime.ParseExact(item.date + ":00:00", "yyyy-MM-dd/HH:mm:ss", CultureInfo.InvariantCulture); - ChartsByTimeAmount hour = new ChartsByTimeAmount(); - hour.ProductCode = item.productLineCode; - hour.ProductDate = date; - hour.ProductAmount = item.Amount; - sum += item.Amount; - hourList1.Add(hour); - } - // 当班下线数量页面赋值 - OffLineQty = sum.ToString(); - if (hourList1 == null) return; - - - var hourList = hourList1.Where(x => x.ProductCode.Equals("CX_02") && x.ProductDate >= listTime[0].startTime && x.ProductDate <= listTime[11].startTime); - - List xList = new List(); - ChartValues achievement2 = new ChartValues(); - foreach (var item in hourList) - { - xList.Add(item.ProductDate.Hour.ToString() + ":00"); - achievement2.Add(item.ProductAmount); - } - - var column2 = new ColumnSeries(); - column2.DataLabels = true; - column2.Title = "产量"; - column2.Values = achievement2; - column2.Foreground = Brushes.White; - - // Achievement.Clear(); - //Achievement.Add(column2); - if (Achievement.Count > 0) - { - for (int i = 0; i < hourList.Count(); i++) - { - Achievement.FirstOrDefault().Values[i] = hourList.ElementAt(i).ProductAmount; - } - } - else - { - Achievement.Clear(); - Achievement.Add(column2); - } - - ProductionHourList = xList; - #endregion - - - #region 型号统计 - List nameList = new List(); - ChartValues achievement = new ChartValues(); - var column = new ColumnSeries(); - - List offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result; - var modelList = offList.GroupBy(x => x.ProductModel); - - foreach (var item in modelList) - { - achievement.Add(item.Count()); - nameList.Add(item.Key); - } - column.DataLabels = true; - column.Title = "型号"; - column.Values = achievement; - column.Foreground = Brushes.White; - - // x轴 - MaterialNameList = null; - MaterialNameList = nameList; - // y轴 - if (ModelStatistics.Count > 0) - { - for (int i = 0; i < modelList.Count(); i++) - { - Achievement.FirstOrDefault().Values[i] = modelList.ElementAt(i).Count(); - } - - } - else - { - - ModelStatistics.Add(column); - } - - })); - #endregion - + Application.Current.Dispatcher.Invoke(() => + { + ProductionHourList.Clear(); + Achievement.Clear(); + #region 小时产量统计 + List listTime = _baseBomInfoServices.getWorkTime().Result; + if (listTime == null) return; + // List xList = new List(); + foreach (WorkTime workTime in listTime) + { + // xList.Add(workTime.startTime.Hour.ToString()); + ProductionHourList.Add(workTime.startTime.Hour.ToString()); + } + // ProductionHourList = xList; + // y轴 + if (list == null || list.Count <= 0) return; + var result = list.GroupBy(x => x.ProductScanTime.Hour) // 按照小时进行分组 + .Select(g => new + { + Hour = g.Key.ToString(), // 小时 + Count = g.Count() // 统计每个小时的个数 + }).ToList(); + + ChartValues achievement2 = new ChartValues(); + int i = 0; + foreach (string item in ProductionHourList) + { + var target = result.Where(x => x.Hour == item).FirstOrDefault(); + if (target != null) + { + achievement2.Add(new ObservablePoint(i, target.Count)); + } + else + { + achievement2.Add(new ObservablePoint(i, 0)); + } + i++; + } + + var column2 = new ColumnSeries(); + column2.DataLabels = true; + column2.Title = "产量"; + column2.Values = achievement2; + column2.Foreground = Brushes.White; + Achievement.Add(column2); + #endregion + + #region 型号统计 + List nameList = new List(); + ChartValues achievement = new ChartValues(); + var column = new ColumnSeries(); + + List offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result; + var modelList = offList.GroupBy(x => x.ProductModel); + + foreach (var item in modelList) + { + achievement.Add(item.Count()); + nameList.Add(item.Key); + } + column.DataLabels = true; + column.Title = "型号"; + column.Values = achievement; + column.Foreground = Brushes.White; + + // x轴 + MaterialNameList = null; + MaterialNameList = nameList; + // y轴 + //if (ModelStatistics.Count > 0) + //{ + // for (int j = 0; j < modelList.Count(); j++) + // { + // Achievement.FirstOrDefault().Values[j] = modelList.ElementAt(j).Count(); + // } + + //} + //else + //{ + ModelStatistics.Clear(); + ModelStatistics.Add(column); + // } + + + #endregion + + + + + }); + } + + private async void InitEveryDayMethod11(List list) + { + + Application.Current.Dispatcher.Invoke(() => + { + ProductionHourList.Clear(); + Achievement.Clear(); + #region 小时产量统计 + List listTime = _baseBomInfoServices.getWorkTime().Result; + if (listTime == null) return; + // List xList = new List(); + foreach (WorkTime workTime in listTime) + { + // xList.Add(workTime.startTime.Hour.ToString()); + ProductionHourList.Add(workTime.startTime.Hour.ToString()); + } + // ProductionHourList = xList; + // y轴 + if (list == null || list.Count <= 0) return; + var result = list.GroupBy(x => x.ProductScanTime.Hour) // 按照小时进行分组 + .Select(g => new + { + Hour = g.Key.ToString(), // 小时 + Count = g.Count() // 统计每个小时的个数 + }).ToList(); + ChartValues achievement2 = new ChartValues(); + foreach (string item in ProductionHourList) + { + var target = result.Where(x => x.Hour == item).FirstOrDefault(); + if (target != null) + { + achievement2.Add(target.Count); + } + else + { + achievement2.Add(0); + } + } + + var column2 = new ColumnSeries(); + column2.DataLabels = true; + column2.Title = "产量"; + column2.Values = achievement2; + column2.Foreground = Brushes.White; + Achievement.Add(column2); + #endregion + + + #region 型号统计 + List nameList = new List(); + ChartValues achievement = new ChartValues(); + var column = new ColumnSeries(); + + List offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result; + var modelList = offList.GroupBy(x => x.ProductModel); + + foreach (var item in modelList) + { + achievement.Add(item.Count()); + nameList.Add(item.Key); + } + column.DataLabels = true; + column.Title = "型号"; + column.Values = achievement; + column.Foreground = Brushes.White; + + // x轴 + MaterialNameList = null; + MaterialNameList = nameList; + // y轴 + if (ModelStatistics.Count > 0) + { + for (int i = 0; i < modelList.Count(); i++) + { + Achievement.FirstOrDefault().Values[i] = modelList.ElementAt(i).Count(); + } + + } + else + { + + ModelStatistics.Add(column); + } + + + #endregion + + }); } //private async void InitEveryDayMethod() //{ @@ -553,32 +548,44 @@ namespace Aucma.Core.ProductOffLine.ViewModels // }; //} - public void LoadData() + public List LoadData() { - List listTime = _baseBomInfoServices.getWorkTime().Result; - if (listTime == null) return; - List list = _offLineInfoServices.Query(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].endTime); - if(list==null || list.Count<=0) return; - list = list.OrderBy(x=>x.ProductScanTime).ToList(); - // OffLineInfo record = _offLineInfoServices.FirstAsync().Result; - - Application.Current.Dispatcher.Invoke(() => + try { - foreach(OffLineInfo record in list) + + List listTime = _baseBomInfoServices.getWorkTime().Result; + if (listTime == null) return null; + List list = _offLineInfoServices.Query(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].endTime && x.ProductLineCode == "CX_02"); + OffLineQty = list.Count.ToString(); + if (list == null || list.Count <= 0) return null; + list = list.OrderBy(x => x.ProductScanTime).ToList(); + // OffLineInfo record = _offLineInfoServices.FirstAsync().Result; + + Application.Current.Dispatcher.Invoke(() => { - ListItems.Insert(0, new TempInfo() + ListItems.Clear(); + foreach (OffLineInfo record in list) { - No = ListItems.Count + 1, - ProductOrderNo = record.ProductOrderNo, - ProductSNCode = record.ProductSNCode, - ProductModel = record.ProductModel, - ProductRemark = record.ProductRemark, - QualityResult = "成功", - ProductScanTime = record.ProductScanTime, - }); - } - - }); + ListItems.Insert(0, new TempInfo() + { + No = ListItems.Count + 1, + ProductOrderNo = record.ProductOrderNo, + ProductSNCode = record.ProductSNCode, + ProductModel = record.ProductModel, + ProductRemark = record.ProductRemark, + QualityResult = "成功", + ProductScanTime = record.ProductScanTime, + }); + } + + }); + return list; + } + catch (Exception ex) + { + log.Error("首页LoadData()方法异常:" + ex.Message.ToString()); + return null; + } } public void AddDataGrid() @@ -589,7 +596,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels if (list == null || list.Count <= 0) return; OffLineInfo record = list.OrderByDescending(x => x.ProductScanTime).FirstOrDefault(); //OffLineInfo record = _offLineInfoServices.FirstAsync(x=>x.ProductScanTime).Result; - if(record.ProductSNCode!= ListItems[0].ProductSNCode && record.ProductSNCode != ListItems[1].ProductSNCode) + if (record.ProductSNCode != ListItems[0].ProductSNCode && record.ProductSNCode != ListItems[1].ProductSNCode) { Application.Current.Dispatcher.Invoke(() => { @@ -606,7 +613,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels }); } - + } diff --git a/Aucma.Core.ProductOffLine/ViewModels/LoginViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/LoginViewModel.cs new file mode 100644 index 00000000..00938655 --- /dev/null +++ b/Aucma.Core.ProductOffLine/ViewModels/LoginViewModel.cs @@ -0,0 +1,118 @@ +using Admin.Core.IService; +using Admin.Core.Model; +using Admin.Core.Service; +using Aucma.Core.ProductOffLine.Config; +using Aucma.Core.ProductOffLine.Models; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; + +namespace Aucma.Core.ProductOffLine.ViewModels +{ + public partial class LoginViewModel : ObservableObject + { + private AppConfig appConfig = AppConfig.Instance; + + public RelayCommand CloseWindowCommand { get; set; } + + public RelayCommand SaveCommand { get; set; } + + + public LoginViewModel() + { + _barcodeAccount = appConfig.BarCodeAccount; + // SelectedMaterialType.Content = appConfig.LoginTeam; + CloseWindowCommand = new RelayCommand(t => CloseWindow(t)); + SaveCommand = new RelayCommand(Login); + + } + + + //关闭窗口 + private void CloseWindow(object parameter) + { + var window = parameter as Window; + if (window != null) + { + window.Close(); + } + + } + + private async void Login() + { + + if (SelectedMaterialType == null) + { + MessageBox.Show("未选择班组"); + + return; + + } + if (_barcodeAccount =="") + { + MessageBox.Show("未设置条码系统账号"); + + return; + + } + else + { + MessageBoxResult result = MessageBox.Show("确认登录吗?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) + { + appConfig.BarCodeAccount = _barcodeAccount; + appConfig.LoginTeam = SelectedMaterialType.Content.ToString(); + MessageBox.Show("登录成功"); + // CloseWindow(); + } + + + } + + + } + + + + /// + /// 班组,二线白班,二线夜班 + /// + /// private string _selectedMaterialType; + private ComboBoxItem _selectedMaterialType; + public ComboBoxItem SelectedMaterialType + { + get { return _selectedMaterialType; } + set + { + if (_selectedMaterialType != value) + { + _selectedMaterialType = value; + OnPropertyChanged(nameof(SelectedMaterialType)); + } + } + } + + #region 条码系统账号 + private string _barcodeAccount; + public string BarcodeAccount + { + get { return _barcodeAccount; } + set + { + _barcodeAccount = value; + OnPropertyChanged(nameof(BarcodeAccount)); + } + } + #endregion + + + } +} diff --git a/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs index 78c31e9b..61d9846a 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs @@ -7,13 +7,14 @@ using log4net; using System.Diagnostics; using System.Threading; using NPOI.HSSF.Record; -using Aucma.Core.PLc; using System.Linq; using System.Threading.Tasks; using System.Windows.Threading; using Admin.Core.Common; using Admin.Core.Tasks; using Aucma.Core.ProductOffLine.Business; +using Aucma.Core.HwPLc; +using Aucma.Core.ProductOffLine.Config; namespace Aucma.Core.ProductOffLine.ViewModels { @@ -25,7 +26,15 @@ namespace Aucma.Core.ProductOffLine.ViewModels /// public delegate void RefreshCharts(); public static event RefreshCharts? RefreshChartsEvent; + + /// + /// 首页图表刷新 + /// + public delegate void RefreshFirstPageCharts(); + public static event RefreshFirstPageCharts? RefreshFirstPageChartsEvent; + #endregion + private AppConfig appConfig = AppConfig.Instance; private static readonly log4net.ILog log = LogManager.GetLogger(typeof(MainWindowViewModel)); private IndexPageView firstPage = new IndexPageView();//首页 @@ -41,9 +50,10 @@ namespace Aucma.Core.ProductOffLine.ViewModels timer.Tick += Timer_Tick; timer.Start(); MvCodeHelper.RefreshStateEvent += RefreshScanner; - + MesDbState(true); - PlcState(true); + PlcState(false); + //PlcState(true); Scanner1State(false); Scanner2State(false); @@ -59,7 +69,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels Task.Run(() => { Thread.Sleep(2000); - + //MvCodeHelper1.DeviceListAcq();//获取创建设备 // MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据 Business.MvCodeHelper.Shell(); @@ -68,6 +78,16 @@ namespace Aucma.Core.ProductOffLine.ViewModels Task.Run(() => { Thread.Sleep(4000); + //更新plc状态 + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); + if (obj.plc.IsConnected) + { + PlcState(true); + } + else + { + PlcState(false); + } //MvCodeHelper1.DeviceListAcq();//获取创建设备 // MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据 Business.MvCodeHelper.Liner(); @@ -263,6 +283,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels switch (page) { case "FirstPage": + RefreshFirstPageChartsEvent?.Invoke(); UserContent = firstPage; break; case "RecordPage": @@ -519,18 +540,26 @@ namespace Aucma.Core.ProductOffLine.ViewModels private void Timer_Tick(object sender, EventArgs e) { DateTime now = DateTime.Now; - - // 判断当前是否是白班时间段 - if (now.Hour >= 8 && now.Hour < 20) + if (appConfig.LoginTeam == "") { - ShiftStr = $"白班 08点-20点"; + ShiftStr = $"未登录"; } else { - - ShiftStr = $"夜班 20点-08点"; + ShiftStr = appConfig.LoginTeam; } - CurrentDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + // 判断当前是否是白班时间段 + //if (now.Hour >= 8 && now.Hour < 20) + //{ + // ShiftStr = $"白班 08点-20点"; + //} + //else + //{ + + // ShiftStr = $"夜班 20点-08点"; + //} + CurrentDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } diff --git a/Aucma.Core.ProductOffLine/ViewModels/QualityItemViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/QualityItemViewModel.cs index 06fbbf6b..631a8748 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/QualityItemViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/QualityItemViewModel.cs @@ -22,7 +22,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels public partial class QualityItemViewModel : ObservableObject { public RelayCommand CloseWindowCommand { get; set; } - + public RelayCommand SaveCommand { get; set; } diff --git a/Aucma.Core.ProductOffLine/Views/ChooseDirectionWindow.xaml b/Aucma.Core.ProductOffLine/Views/ChooseDirectionWindow.xaml new file mode 100644 index 00000000..dbec5e51 --- /dev/null +++ b/Aucma.Core.ProductOffLine/Views/ChooseDirectionWindow.xaml @@ -0,0 +1,19 @@ + + + + + + + +