diff --git a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs index 929f9bc7..0245ac4d 100644 --- a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs +++ b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs @@ -23,7 +23,7 @@ namespace Aucma.Core.ProductOffLine.Business /// /// 入库业务逻辑 /// - public class OffLineBusiness + public class OffLineBusiness { #region 单例实现 @@ -36,7 +36,7 @@ namespace Aucma.Core.ProductOffLine.Business } } #endregion - //public OffLineBusiness(){} + // public OffLineBusiness(){} #region 变量定义 public static OffLineInfo TempOffLineInfo = new OffLineInfo(); @@ -71,7 +71,12 @@ namespace Aucma.Core.ProductOffLine.Business /// public delegate void RefreshScanMateriaCode(string materialCode, string materialName, string spaceName, string materialType); public event RefreshScanMateriaCode RefreshScanMateriaCodeEvent; - + /// + /// 获取入库方向 + /// + /// 物料类型 + public delegate string getDirection(string materialType); + public event getDirection getDirectioneEvent; #endregion #region 变量定义 @@ -82,17 +87,15 @@ namespace Aucma.Core.ProductOffLine.Business #endregion - public async void test() { - BaseOrderInfo order = await _baseOrderInfoServices.FirstAsync(); + + BaseOrderInfo order = await _baseOrderInfoServices.FirstAsync(); Console.WriteLine(order); } - - /// /// 处理条码 /// @@ -104,492 +107,516 @@ namespace Aucma.Core.ProductOffLine.Business bool BackResult = await HandleMaterialBarCode(code.Trim()); //处理条码信息 TempOffLineInfo.ReadFlag = 0; if (BackResult == true) - { - - } - // // 如果校验失败,下发报警 - // if ("N".Equals(result.Substring(0, 1))) - //{ - // sendPlcError(); - // // 刷新页面提示信息 result.Substring(2) - // return false; - //} - - - //3.分垛A,B库逻辑(先左边读到的条码分A库,右边读到的B库==>预留分库逻辑) - - ////4.下发plc信号 - //bool flag = SendPlcPass(); - //if (!flag) - //{ - // log.Error("获取plc反馈失败"); - // return; - //} - //Console.WriteLine(code); - //return; - //5.调条码系统保存入库接口SaveBarcodeInfo - string saveResult = await _productOffLineServices.SaveBarcodeInfo("333", "ILS_SORT", "11111", 1); - if (string.IsNullOrEmpty(saveResult) || "E".Equals(saveResult.Substring(0, 1))) { - log.Error("条码系统保存接口出错"); - sendPlcError(); - return; - } - //6.更新mes数据库完成数量和时间(BASE_ORDERINFO,PRODUCT_PLANINFO) 注意:查询的字段可能需要修改,确保数据一致 + TempOffLineInfo.ProductRefreshFlag = true; + // 更新mes数据库 + int a = await _offLineInfoServices.AddAsync(TempOffLineInfo); + log.Info(String.Format("订单号{0} 订单数量{1}", TempOffLineInfo.ProductOrderNo.Replace("0000", ""), TempOffLineInfo.OrderQty)); + if (a > 0) + { + // 先查询分垛方向A或者B eg:000000009001000718 + string direction = getDirectioneEvent?.Invoke(TempOffLineInfo.ProductCode.Replace("00000000", "")); - //6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理 - string orderCode = "11215484"; - List orders = await _baseOrderInfoServices.QueryAsync(x => x.OrderCode == orderCode); - BaseOrderInfo order = orders.FirstOrDefault(); - if (order.CompleteAmount == 0) - { - order.CompleteAmount++; - order.BeginDate = DateTime.Now; - } - if (order.CompleteAmount == order.OrderAmount) - { - order.EndDate = DateTime.Now; - } - order.UpdatedTime = DateTime.Now; - _baseOrderInfoServices.UpdateAsync(order); - //6.2根据订单号去更新PRODUCT_PLANINFO - List productInfos = await _productPlanInfoServices.QueryAsync(x => x.OrderCode == orderCode); - ProductPlanInfo productInfo = productInfos.FirstOrDefault(); - if (productInfo.CompleteAmount == 0) - { - productInfo.CompleteAmount++; - productInfo.BeginTime = DateTime.Now; + // DownLoadPassFlag(BackResult); //下发plc放行信号,分垛AB库 + TempOffLineInfo.ReadFlag = 1; //放行成功 + } + else + { + TempOffLineInfo.ReadFlag = 2; //保存条码失败 + } } - if (productInfo.CompleteAmount == productInfo.PlanAmount) + else { - productInfo.EndTime = DateTime.Now; + log.Info("条码验证失败"); + TempOffLineInfo.ReadFlag = 3; // 条码验证失败 } - productInfo.UpdatedTime = DateTime.Now; - await _productPlanInfoServices.UpdateAsync(productInfo); } - /// - /// 去条码系统查询校验并保存 - /// - /// - /// - public async Task HandleMaterialBarCode(string BarCode) + + // // 如果校验失败,下发报警 + // if ("N".Equals(result.Substring(0, 1))) + //{ + // sendPlcError(); + // // 刷新页面提示信息 result.Substring(2) + // return false; + //} + + + //3.分垛A,B库逻辑(先左边读到的条码分A库,右边读到的B库==>预留分库逻辑) + + ////4.下发plc信号 + //bool flag = SendPlcPass(); + //if (!flag) + //{ + // log.Error("获取plc反馈失败"); + // return; + //} + //Console.WriteLine(code); + //return; + //5.调条码系统保存入库接口SaveBarcodeInfo + //string saveResult = await _productOffLineServices.SaveBarcodeInfo("333", "ILS_SORT", "11111", 1); + //if (string.IsNullOrEmpty(saveResult) || "E".Equals(saveResult.Substring(0, 1))) + //{ + // log.Error("条码系统保存接口出错"); + // sendPlcError(); + // return; + //} + ////6.更新mes数据库完成数量和时间(BASE_ORDERINFO,PRODUCT_PLANINFO) 注意:查询的字段可能需要修改,确保数据一致 + + ////6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理 + //string orderCode = "11215484"; + //List orders = await _baseOrderInfoServices.QueryAsync(x => x.OrderCode == orderCode); + //BaseOrderInfo order = orders.FirstOrDefault(); + //if (order.CompleteAmount == 0) + //{ + // order.CompleteAmount++; + // order.BeginDate = DateTime.Now; + //} + //if (order.CompleteAmount == order.OrderAmount) + //{ + // order.EndDate = DateTime.Now; + //} + //order.UpdatedTime = DateTime.Now; + //_baseOrderInfoServices.UpdateAsync(order); + ////6.2根据订单号去更新PRODUCT_PLANINFO + //List productInfos = await _productPlanInfoServices.QueryAsync(x => x.OrderCode == orderCode); + //ProductPlanInfo productInfo = productInfos.FirstOrDefault(); + //if (productInfo.CompleteAmount == 0) + //{ + // productInfo.CompleteAmount++; + // productInfo.BeginTime = DateTime.Now; + //} + //if (productInfo.CompleteAmount == productInfo.PlanAmount) + //{ + // productInfo.EndTime = DateTime.Now; + //} + //productInfo.UpdatedTime = DateTime.Now; + //await _productPlanInfoServices.UpdateAsync(productInfo); + + + + /// + /// 去条码系统查询校验并保存 + /// + /// + /// + public async Task HandleMaterialBarCode(string BarCode) + { + try { - try - { - TempOffLineInfo.ProductSNCode = BarCode.Trim(); //SN码 - TempOffLineInfo.ProductScanTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + TempOffLineInfo.ProductSNCode = BarCode.Trim(); //SN码 + TempOffLineInfo.ProductScanTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - TempOffLineInfo.ProductOrderNo = ""; - log.Info("条码验证开始:" + BarCode); + TempOffLineInfo.ProductOrderNo = ""; + log.Info("条码验证开始:" + BarCode); - //1.查询条码系统 - string result = await _productOffLineServices.QueryChecked(BarCode); - // string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000000807@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01"; + //1.查询条码系统 + string result = await _productOffLineServices.QueryChecked(BarCode); + // string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000000807@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01"; - //查询到的数据分割处理,结果中用"@"号分隔,刷新页面显示 - string[] FArrayList = result.Split('@'); - if (FArrayList[0].ToUpper() == "Y") //查询数据成功 - { + //查询到的数据分割处理,结果中用"@"号分隔,刷新页面显示 + string[] FArrayList = result.Split('@'); + if (FArrayList[0].ToUpper() == "Y") //查询数据成功 + { - log.Info(BarCode + "成功返回验证信息:" + result); - #region 实体赋值 - TempOffLineInfo.MsgInfo = "获取信息成功" + BarCode + " 返回值:" + FArrayList[0].ToUpper(); - TempOffLineInfo.ProductFactoryCode = FArrayList[1]; - TempOffLineInfo.ProductSNCode = FArrayList[2]; - TempOffLineInfo.ProductOrderNo = DBToString(FArrayList[3]); - TempOffLineInfo.ProductSaleNo = DBToString(FArrayList[4]); - TempOffLineInfo.ProductSaleLineNo = DBToString(FArrayList[5]); - TempOffLineInfo.ProductCheckInfo = DBToString(FArrayList[6]); //验证组合 - TempOffLineInfo.ProductCode = DBToString(FArrayList[7]); - TempOffLineInfo.ProductName = DBToString(FArrayList[8]); //产品描述 - TempOffLineInfo.ProductType = FArrayList[9]; - TempOffLineInfo.ProductModel = FArrayList[10]; //产品型号 - TempOffLineInfo.ProductRemark = DBToString(FArrayList[11]); - TempOffLineInfo.ProductBarNo = FArrayList[12]; - TempOffLineInfo.ProductMasterModel = FArrayList[13]; //产品主型号 - TempOffLineInfo.ProductVersion = FArrayList[14]; - TempOffLineInfo.ProductUseInfo = FArrayList[15];//产品用途 - TempOffLineInfo.ProductCirculate = FArrayList[16];//流通特性 - TempOffLineInfo.ProductCreateDate = FArrayList[17]; - #endregion - - // 多码系统校验,是否需要待定,现场看情况 - bool flag = TestBarCode(TempOffLineInfo); - if (!flag) - { - return false; - } - log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证通过!"); - } - else + log.Info(BarCode + "成功返回验证信息:" + result); + #region 实体赋值 + TempOffLineInfo.MsgInfo = "获取信息成功" + BarCode + " 返回值:" + FArrayList[0].ToUpper(); + TempOffLineInfo.ProductFactoryCode = FArrayList[1]; + TempOffLineInfo.ProductSNCode = FArrayList[2]; + TempOffLineInfo.ProductOrderNo = DBToString(FArrayList[3]); + TempOffLineInfo.ProductSaleNo = DBToString(FArrayList[4]); + TempOffLineInfo.ProductSaleLineNo = DBToString(FArrayList[5]); + TempOffLineInfo.ProductCheckInfo = DBToString(FArrayList[6]); //验证组合 + TempOffLineInfo.ProductCode = DBToString(FArrayList[7]); + TempOffLineInfo.ProductName = DBToString(FArrayList[8]); //产品描述 + TempOffLineInfo.ProductType = FArrayList[9]; + TempOffLineInfo.ProductModel = FArrayList[10]; //产品型号 + TempOffLineInfo.ProductRemark = DBToString(FArrayList[11]); + TempOffLineInfo.ProductBarNo = FArrayList[12]; + TempOffLineInfo.ProductMasterModel = FArrayList[13]; //产品主型号 + TempOffLineInfo.ProductVersion = FArrayList[14]; + TempOffLineInfo.ProductUseInfo = FArrayList[15];//产品用途 + TempOffLineInfo.ProductCirculate = FArrayList[16];//流通特性 + TempOffLineInfo.ProductCreateDate = FArrayList[17]; + #endregion + + // 多码系统校验,是否需要待定,现场看情况 + bool flag = TestBarCode(TempOffLineInfo); + if (!flag) { - log.Info(BarCode + "失败返回验证信息:" + FArrayList[1]); - #region 实体赋值 - TempOffLineInfo.ProductDataFlag = true; - TempOffLineInfo.MsgAlarmFlag = true; - TempOffLineInfo.MsgInfo = "获取信息失败. " + BarCode + " 返回值:" + FArrayList[0].ToString(); - TempOffLineInfo.ProductOrderNo = ""; - TempOffLineInfo.ProductSaleNo = ""; - TempOffLineInfo.ProductSaleLineNo = ""; - TempOffLineInfo.ProductCheckInfo = ""; //验证组合 - TempOffLineInfo.ProductCode = ""; - TempOffLineInfo.ProductName = ""; //产品描述 - TempOffLineInfo.ProductType = ""; - TempOffLineInfo.ProductModel = ""; //产品型号 - TempOffLineInfo.ProductRemark = ""; - TempOffLineInfo.ProductBarNo = ""; ; - TempOffLineInfo.ProductMasterModel = ""; //产品主型号 - TempOffLineInfo.ProductVersion = ""; - TempOffLineInfo.ProductUseInfo = "";//产品用途 - TempOffLineInfo.ProductCirculate = "";//流通特性 - TempOffLineInfo.ProductCreateDate = ""; - TempOffLineInfo.oneCode = ""; - TempOffLineInfo.serialNumber = ""; - TempOffLineInfo.rfid = ""; - TempOffLineInfo.sim = ""; - TempOffLineInfo.number1 = ""; - #endregion return false; } - // mes查询订单数据, 异常处理:后期可能根据SN码查箱体码,查订单号并检查更新订单数据 - BaseOrderInfo order = await _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo.Replace("0000", "")); - //2.上传条码系统 - if (!string.IsNullOrEmpty(TempOffLineInfo.ProductOrderNo)) + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证通过!"); + } + else + { + log.Info(BarCode + "失败返回验证信息:" + FArrayList[1]); + #region 实体赋值 + TempOffLineInfo.ProductDataFlag = true; + TempOffLineInfo.MsgAlarmFlag = true; + TempOffLineInfo.MsgInfo = "获取信息失败. " + BarCode + " 返回值:" + FArrayList[0].ToString(); + TempOffLineInfo.ProductOrderNo = ""; + TempOffLineInfo.ProductSaleNo = ""; + TempOffLineInfo.ProductSaleLineNo = ""; + TempOffLineInfo.ProductCheckInfo = ""; //验证组合 + TempOffLineInfo.ProductCode = ""; + TempOffLineInfo.ProductName = ""; //产品描述 + TempOffLineInfo.ProductType = ""; + TempOffLineInfo.ProductModel = ""; //产品型号 + TempOffLineInfo.ProductRemark = ""; + TempOffLineInfo.ProductBarNo = ""; ; + TempOffLineInfo.ProductMasterModel = ""; //产品主型号 + TempOffLineInfo.ProductVersion = ""; + TempOffLineInfo.ProductUseInfo = "";//产品用途 + TempOffLineInfo.ProductCirculate = "";//流通特性 + TempOffLineInfo.ProductCreateDate = ""; + TempOffLineInfo.oneCode = ""; + TempOffLineInfo.serialNumber = ""; + TempOffLineInfo.rfid = ""; + TempOffLineInfo.sim = ""; + TempOffLineInfo.number1 = ""; + #endregion + return false; + } + // mes查询订单数据, 异常处理:后期可能根据SN码查箱体码,查订单号并检查更新订单数据 + BaseOrderInfo order = await _baseOrderInfoServices.FirstAsync(x => x.OrderCode == TempOffLineInfo.ProductOrderNo.Replace("0000", "")); + //2.上传条码系统 + if (!string.IsNullOrEmpty(TempOffLineInfo.ProductOrderNo)) + { + string strSave = await _productOffLineServices.SaveBarcodeInfo(BarCode.Trim(), "ILS_SORT", TempOffLineInfo.ProductOrderNo, 1); + if (!string.IsNullOrEmpty(strSave)) { - string strSave = await _productOffLineServices.SaveBarcodeInfo(BarCode.Trim(), "ILS_SORT", TempOffLineInfo.ProductOrderNo, 1); - if (!string.IsNullOrEmpty(strSave)) + if (strSave == "Y") { - if (strSave == "Y") - { - log.Info(BarCode + "上传条码成功:" + strSave); + log.Info(BarCode + "上传条码成功:" + strSave); - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码成功" + strSave; - if (order != null) - { - TempOffLineInfo.OrderQty = order.OrderAmount; - TempOffLineInfo.ActQty = order.CompleteAmount; - } - return true; + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码成功" + strSave; + if (order != null) + { + TempOffLineInfo.OrderQty = order.OrderAmount; + TempOffLineInfo.ActQty = order.CompleteAmount; } - else + return true; + } + else + { + log.Info(BarCode + "上传条码失败:" + strSave); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave; + if (strSave.Contains("条码重复")) { - log.Info(BarCode + "上传条码失败:" + strSave); - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave; - if (strSave.Contains("条码重复")) + // 查询本地数据库是否有数据 + OffLineInfo offLineInfo = await _offLineInfoServices.FirstAsync(x => x.ProductSNCode == BarCode); + if (offLineInfo != null) { - // 查询本地数据库是否有数据 - OffLineInfo offLineInfo = await _offLineInfoServices.FirstAsync(x => x.ProductSNCode == BarCode); - if (offLineInfo != null) - { - log.Info(BarCode + "条码重复,本地已存在"); - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave + "上传日期:" + DBToString(offLineInfo.ProductScanTime); + log.Info(BarCode + "条码重复,本地已存在"); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave + "上传日期:" + DBToString(offLineInfo.ProductScanTime); - if (TempOffLineInfo.ChkOut == true) - { - return true; - } - } - else + if (TempOffLineInfo.ChkOut == true) { - log.Info(BarCode + "条码重复,本地不存在,已上传中"); - await _offLineInfoServices.AddAsync(TempOffLineInfo); + return true; } } - return false; + else + { + log.Info(BarCode + "条码重复,本地不存在,已上传中"); + await _offLineInfoServices.AddAsync(TempOffLineInfo); + } } - - } - else - { return false; } + } else { - TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",生产单号异常"; return false; } } - catch (Exception ex) + else { - TempOffLineInfo.MsgInfo = "获取产品条码异常:" + ex.Message; - TempOffLineInfo.MsgAlarmFlag = true; - - log.Info(BarCode + "条码验证异常:" + ex.Message.ToString()); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",生产单号异常"; return false; } - finally - { - TempOffLineInfo.ProductRefreshFlag = true; - } - } + catch (Exception ex) + { + TempOffLineInfo.MsgInfo = "获取产品条码异常:" + ex.Message; + TempOffLineInfo.MsgAlarmFlag = true; + log.Info(BarCode + "条码验证异常:" + ex.Message.ToString()); + return false; + } + finally + { + TempOffLineInfo.ProductRefreshFlag = true; + } + } - #region plc交互 - private SemaphoreSlim semaphore = new SemaphoreSlim(0); - /// - /// 下发plc放行信号,根据接收到的scannerNo不同,两条道的plc信号地址也不同 - /// - /// - private bool SendPlcPass(int scannerNo) + + + #region plc交互 + private SemaphoreSlim semaphore = new SemaphoreSlim(0); + /// + /// 下发plc放行信号,根据接收到的scannerNo不同,两条道的plc信号地址也不同 + /// + /// + private bool SendPlcPass(int scannerNo) + { + bool result = false; + try { - bool result = false; - try + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); + if (obj != null) { - var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); - if (obj != null) + if (obj.plc.IsConnected) { - if (obj.plc.IsConnected) + if (scannerNo == 1) { - if (scannerNo == 1) - { - // 写入入库方向,两条道plc地址不同 - obj.plc.WriteInt32("D100", scannerNo); - // 往plc写入放行信号 - obj.plc.WriteInt32("D102", 1); - } - else - { - // 写入入库方向,两条道plc地址不同 - obj.plc.WriteInt32("D200", scannerNo); - // 往plc写入放行信号 - obj.plc.WriteInt32("D202", 1); - } - - // 等待plc反馈信号 - waitPlcSignal(scannerNo); - // semaphore.Wait(); - result = true; + // 写入入库方向,两条道plc地址不同 + obj.plc.WriteInt32("D100", scannerNo); + // 往plc写入放行信号 + obj.plc.WriteInt32("D102", 1); } else { - log.Info("成品下线plc连接失败,请检查plc连接"); + // 写入入库方向,两条道plc地址不同 + obj.plc.WriteInt32("D200", scannerNo); + // 往plc写入放行信号 + obj.plc.WriteInt32("D202", 1); } + + // 等待plc反馈信号 + waitPlcSignal(scannerNo); + // semaphore.Wait(); + result = true; } else { - log.Info("获取plc连接对象信息为空"); + log.Info("成品下线plc连接失败,请检查plc连接"); } } - catch (Exception ex) + else { - log.Error("下发plc放行信号方法SendPlcPass()出现异常,ex:" + ex); + log.Info("获取plc连接对象信息为空"); } - return result; } - /// - /// 读取plc放行反馈 - /// - /// - private void waitPlcSignal(int scannerNo) + catch (Exception ex) { - try - { - bool isFlag = true; - var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); + log.Error("下发plc放行信号方法SendPlcPass()出现异常,ex:" + ex); + } + return result; + } + /// + /// 读取plc放行反馈 + /// + /// + private void waitPlcSignal(int scannerNo) + { + try + { + bool isFlag = true; + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); - if (obj != null && obj.plc.IsConnected) + if (obj != null && obj.plc.IsConnected) + { + do { - do + if (scannerNo == 1) { - if (scannerNo == 1) + // 读取plc反馈信号 + if (obj.plc.ReadInt32("D102") == 2) { - // 读取plc反馈信号 - if (obj.plc.ReadInt32("D102") == 2) - { - Console.WriteLine("收到plc放行成功"); - // 清空数据 - obj.plc.WriteInt32("D100", 0); - obj.plc.WriteInt32("D102", 0); - isFlag = false; - } + Console.WriteLine("收到plc放行成功"); + // 清空数据 + obj.plc.WriteInt32("D100", 0); + obj.plc.WriteInt32("D102", 0); + isFlag = false; } - else + } + else + { + // 读取plc反馈信号 + if (obj.plc.ReadInt32("D202") == 2) { - // 读取plc反馈信号 - if (obj.plc.ReadInt32("D202") == 2) - { - Console.WriteLine("收到plc放行成功"); - // 清空数据 - obj.plc.WriteInt32("D200", 0); - obj.plc.WriteInt32("D202", 0); - isFlag = false; - } + Console.WriteLine("收到plc放行成功"); + // 清空数据 + obj.plc.WriteInt32("D200", 0); + obj.plc.WriteInt32("D202", 0); + isFlag = false; } - Thread.Sleep(1000); - } while (isFlag); - // 释放信号量 - //semaphore.Release(); - } - else - { - log.Info("成品下线plc连接失败"); - } - + } + Thread.Sleep(1000); + } while (isFlag); + // 释放信号量 + //semaphore.Release(); } - catch (Exception ex) + else { - log.Error("读取plc放行反馈方法waitPlcSignal()出现异常,ex:" + ex); + log.Info("成品下线plc连接失败"); } + + } + catch (Exception ex) + { + log.Error("读取plc放行反馈方法waitPlcSignal()出现异常,ex:" + ex); } + } - /// - /// 下发plc报警信号 - /// - private void sendPlcError() + /// + /// 下发plc报警信号 + /// + private void sendPlcError() + { + try { - try + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); + if (obj != null) { - var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc")); - if (obj != null) + if (obj.plc.IsConnected) { - if (obj.plc.IsConnected) - { - // 下发报警信号 - obj.plc.WriteInt32("D104", 1); - } - else - { - log.Info("成品下线plc连接失败,请检查plc连接"); - } + // 下发报警信号 + obj.plc.WriteInt32("D104", 1); } else { - log.Info("获取plc连接对象信息为空"); + log.Info("成品下线plc连接失败,请检查plc连接"); } } - catch (Exception ex) + else { - log.Error("下发plc放报警信号方法sendPlcError()出现异常,ex:" + ex); + log.Info("获取plc连接对象信息为空"); } } - #endregion + catch (Exception ex) + { + log.Error("下发plc放报警信号方法sendPlcError()出现异常,ex:" + ex); + } + } + #endregion - #region 工具方法 - /// - /// - /// - /// - /// - public static string DBToString(object refData) + #region 工具方法 + /// + /// + /// + /// + /// + public static string DBToString(object refData) + { + if (refData == null) + return ""; + else + return refData == DBNull.Value ? "" : refData.ToString(); + } + + /// + /// 多码系统校验 + /// + /// + /// + public bool TestBarCode(OffLineInfo TempOffLineInfo) + { + if (TempOffLineInfo.ProductCode.Replace("00000000", "") == "9002005518" || TempOffLineInfo.ProductCode.Replace("00000000", "") == "9002005517") { - if (refData == null) - return ""; - else - return refData == DBNull.Value ? "" : refData.ToString(); + TempOffLineInfo.ProductRemark = ""; } - /// - /// 多码系统校验 - /// - /// - /// - public bool TestBarCode(OffLineInfo TempOffLineInfo) + if (TempOffLineInfo.ProductRemark != "") { - if (TempOffLineInfo.ProductCode.Replace("00000000", "") == "9002005518" || TempOffLineInfo.ProductCode.Replace("00000000", "") == "9002005517") - { - TempOffLineInfo.ProductRemark = ""; - } - - if (TempOffLineInfo.ProductRemark != "") - { - log.Info(TempOffLineInfo.ProductSNCode + ", 验证组合:" + TempOffLineInfo.ProductRemark); + log.Info(TempOffLineInfo.ProductSNCode + ", 验证组合:" + TempOffLineInfo.ProductRemark); - string strCheck = TempOffLineInfo.ProductRemark.Replace("wb", ""); + string strCheck = TempOffLineInfo.ProductRemark.Replace("wb", ""); - Boolean blnY = strCheck.Contains("Y"); - Boolean blnZ = strCheck.Contains("Z"); - Boolean blnX = strCheck.Contains("X"); - Boolean blnG = strCheck.Contains("G"); - //Boolean blnC = strCheck.Contains("C"); + Boolean blnY = strCheck.Contains("Y"); + Boolean blnZ = strCheck.Contains("Z"); + Boolean blnX = strCheck.Contains("X"); + Boolean blnG = strCheck.Contains("G"); + //Boolean blnC = strCheck.Contains("C"); - int iCheck = 0; + int iCheck = 0; - if (blnY == true) - iCheck = iCheck + 1; + if (blnY == true) + iCheck = iCheck + 1; - if (blnZ == true) - iCheck = iCheck + 1; + if (blnZ == true) + iCheck = iCheck + 1; - if (blnX == true) - iCheck = iCheck + 1; + if (blnX == true) + iCheck = iCheck + 1; - if (blnG == true) - iCheck = iCheck + 1; + if (blnG == true) + iCheck = iCheck + 1; - //if (blnC == true) - // iCheck = iCheck + 1; + //if (blnC == true) + // iCheck = iCheck + 1; - //y一维码,公司条码 oneCode - //z资产号 serialNumber - //x芯片 rfid - //g模块信息 sim - //wb不需要验证 - //c是摄像头码 number1 - if (blnY == true && iCheck > 1) + //y一维码,公司条码 oneCode + //z资产号 serialNumber + //x芯片 rfid + //g模块信息 sim + //wb不需要验证 + //c是摄像头码 number1 + if (blnY == true && iCheck > 1) + { + if (blnY || blnZ || blnX || blnG) //|| blnC { - if (blnY || blnZ || blnX || blnG) //|| blnC + var client = new RestClient("http://10.100.83.113/syong/test.php"); + client.Timeout = -1; + var request = new RestRequest(Method.POST); + request.AlwaysMultipartFormData = true; + request.AddParameter("oneCode", TempOffLineInfo.ProductSNCode); + request.AddParameter("Werks", "2701"); + request.AddParameter("mark", "YZX"); + IRestResponse response = client.Execute(request); + Console.WriteLine(response.Content); + var chkInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Content); + + TempOffLineInfo.oneCode = DBToString(chkInfo.oneCode); + TempOffLineInfo.serialNumber = DBToString(chkInfo.serialNumber); + TempOffLineInfo.rfid = DBToString(chkInfo.rfid); + TempOffLineInfo.sim = DBToString(chkInfo.sim); + TempOffLineInfo.number1 = DBToString(chkInfo.number1); + + if (blnY == true && DBToString(chkInfo.oneCode) == "") { - var client = new RestClient("http://10.100.83.113/syong/test.php"); - client.Timeout = -1; - var request = new RestRequest(Method.POST); - request.AlwaysMultipartFormData = true; - request.AddParameter("oneCode", TempOffLineInfo.ProductSNCode); - request.AddParameter("Werks", "2701"); - request.AddParameter("mark", "YZX"); - IRestResponse response = client.Execute(request); - Console.WriteLine(response.Content); - var chkInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Content); - - TempOffLineInfo.oneCode = DBToString(chkInfo.oneCode); - TempOffLineInfo.serialNumber = DBToString(chkInfo.serialNumber); - TempOffLineInfo.rfid = DBToString(chkInfo.rfid); - TempOffLineInfo.sim = DBToString(chkInfo.sim); - TempOffLineInfo.number1 = DBToString(chkInfo.number1); - - if (blnY == true && DBToString(chkInfo.oneCode) == "") - { - TempOffLineInfo.MsgInfo = "多码验证,公司条码验证失败"; - log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,公司条码验证失败"); - return false; - } - - if (blnZ == true && DBToString(chkInfo.serialNumber) == "") - { - TempOffLineInfo.MsgInfo = "多码验证,资产号验证失败"; - log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,资产号验证失败"); - return false; - } + TempOffLineInfo.MsgInfo = "多码验证,公司条码验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,公司条码验证失败"); + return false; + } - if (blnX == true && DBToString(chkInfo.rfid) == "") - { - TempOffLineInfo.MsgInfo = "多码验证,芯片验证失败"; - log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,芯片验证失败"); - return false; - } + if (blnZ == true && DBToString(chkInfo.serialNumber) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,资产号验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,资产号验证失败"); + return false; + } - if (blnG == true && DBToString(chkInfo.sim) == "") - { - TempOffLineInfo.MsgInfo = "多码验证,模块信息验证失败"; - log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,模块信息验证失败"); - return false; - } + if (blnX == true && DBToString(chkInfo.rfid) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,芯片验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,芯片验证失败"); + return false; + } - return true; + if (blnG == true && DBToString(chkInfo.sim) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,模块信息验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,模块信息验证失败"); + return false; } + + return true; } - } - return true; + } } - - #endregion + return true; } + + #endregion } +} \ No newline at end of file diff --git a/Aucma.Core.ProductOffLine/ViewModels/DirectionItemViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/DirectionItemViewModel.cs index 4909d918..3f6878b7 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/DirectionItemViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/DirectionItemViewModel.cs @@ -25,7 +25,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels public RelayCommand SaveCommand { get; set; } - + private readonly IBaseMaterialInfoServices? _baseMaterialInfoServices; public DirectionItemViewModel(DirectionEditModel info) { _baseMaterialInfoServices = App.ServiceProvider.GetService(); @@ -93,9 +93,9 @@ namespace Aucma.Core.ProductOffLine.ViewModels } } } + #endregion - - #endregion 关闭窗口 + //关闭窗口 private void CloseWindow(object parameter) { var window = parameter as Window; diff --git a/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs index c9d62057..c809073b 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/IndexPageViewModel.cs @@ -284,84 +284,15 @@ namespace Aucma.Core.ProductOffLine.ViewModels /// 扫码器方向 private async void ReceiveCode(string code, int scannerNo) { - //1.扫描的SN条码去条码系统查询GET_BARCODE_DATA 返回校验数据 - // string result = await _productOffLineServices.QueryChecked(code); - string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000000807@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01"; - // 如果校验失败,下发报警 - if ("N".Equals(result.Substring(0, 1))) - { - sendPlcError(); - // 刷新页面提示信息 result.Substring(2) - return; - } - //2.查询到的数据分割处理,结果中用"@"号分隔,刷新页面显示并存到scada数据库(表待建) - string[] resultArray = result.Split('@'); - // 输出结果 - foreach (string item in resultArray) - { - Console.WriteLine(item); - } - - //3.分垛A,B库逻辑(先左边读到的条码分A库,右边读到的B库==>预留分库逻辑) - - //4.下发plc信号 - bool flag = SendPlcPass(scannerNo); - if (!flag) - { - log.Error("获取plc反馈失败"); - return; - } - Console.WriteLine(code); - return; - //5.调条码系统保存入库接口SaveBarcodeInfo - string saveResult = await _productOffLineServices.SaveBarcodeInfo("333", "ILS_SORT","11111", 1); - if (string.IsNullOrEmpty(saveResult) ||"E".Equals(saveResult.Substring(0, 1))) - { - log.Error("条码系统保存接口出错"); - sendPlcError(); - return; - } - //6.更新mes数据库完成数量和时间(BASE_ORDERINFO,PRODUCT_PLANINFO) 注意:查询的字段可能需要修改,确保数据一致 - - //6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理 - string orderCode = "11215484"; - List orders = await _baseOrderInfoServices.QueryAsync(x => x.OrderCode == orderCode); - BaseOrderInfo order = orders.FirstOrDefault(); - if (order.CompleteAmount == 0) - { - order.CompleteAmount++; - order.BeginDate = DateTime.Now; - } - if (order.CompleteAmount == order.OrderAmount) - { - order.EndDate = DateTime.Now; - } - order.UpdatedTime = DateTime.Now; - _baseOrderInfoServices.UpdateAsync(order); - //6.2根据订单号去更新PRODUCT_PLANINFO - List productInfos = await _productPlanInfoServices.QueryAsync(x => x.OrderCode == orderCode); - ProductPlanInfo productInfo = productInfos.FirstOrDefault(); - if (productInfo.CompleteAmount == 0) - { - productInfo.CompleteAmount++; - productInfo.BeginTime = DateTime.Now; - } - if (productInfo.CompleteAmount == productInfo.PlanAmount) - { - productInfo.EndTime = DateTime.Now; - } - productInfo.UpdatedTime = DateTime.Now; - await _productPlanInfoServices.UpdateAsync(productInfo); - + } - - + #region plc交互 private SemaphoreSlim semaphore = new SemaphoreSlim(0); /// /// 下发plc放行信号,根据接收到的scannerNo不同,两条道的plc信号地址也不同 /// - /// + /// private bool SendPlcPass(int scannerNo) { bool result = false; diff --git a/Aucma.Core.ProductOffLine/ViewModels/QualityPageViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/QualityPageViewModel.cs index f25a38cd..630b397a 100644 --- a/Aucma.Core.ProductOffLine/ViewModels/QualityPageViewModel.cs +++ b/Aucma.Core.ProductOffLine/ViewModels/QualityPageViewModel.cs @@ -1,15 +1,18 @@ using Admin.Core.IService; using Admin.Core.Model; using Admin.Core.Service; +using Aucma.Core.ProductOffLine.Business; using Aucma.Core.ProductOffLine.Models; using Aucma.Core.ProductOffLine.Views; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.DependencyInjection; +using Org.BouncyCastle.Asn1.X509; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.Drawing; using System.Linq; using System.Text; using System.Threading; @@ -18,25 +21,63 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; +using System.Windows.Media; namespace Aucma.Core.ProductOffLine.ViewModels { public partial class QualityPageViewModel : ObservableObject { private readonly IBaseQualityInspectionItemInfoServices? _baseQualityInspectionItemInfoServices; + private readonly IBaseMaterialInfoServices? _baseMaterialInfoServices; + OffLineBusiness offLineBusiness = OffLineBusiness.Instance; public QualityPageViewModel() { + // 手动模式默认A库 + IsSelectedOptionA = true; + // 传入库方向 + offLineBusiness.getDirectioneEvent += getInstoreDirection; QualityPageView.getAllQualityEvent += test; _baseQualityInspectionItemInfoServices = App.ServiceProvider.GetService(); + _baseMaterialInfoServices = App.ServiceProvider.GetService(); AutoDirectionCommand = new RelayCommand(DirectionEdit); SelectQualityCommand = new RelayCommand(SelectQuality); init(); LoadData(); + } + /// + /// 根据自动/手动模式获取入库方向 + /// + /// + public String getInstoreDirection(string materialType) + { + string direction = string.Empty; + Application.Current.Dispatcher.Invoke(() => + { + // 设置了入库模式 + if (SelectedMaterialType != null && SelectedMaterialType.Content.ToString() == "手动模式") + { + // 获取手动方向 + direction = IsSelectedOptionA == true ? "A" : "B"; + } + else + { + // 未设置方向模式或者设置自动模式,默认自动 + BaseMaterialInfo info = _baseMaterialInfoServices.Query(x => x.MaterialCode == materialType).FirstOrDefault(); + direction = info.InboundDirection; + } + + }); + + return direction; + } + + public async Task> test() { List list = await _baseQualityInspectionItemInfoServices.query(); + return list; } @@ -67,12 +108,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels SelectQualityView selectQualityView = new SelectQualityView(); selectQualityView.ShowDialog(); } + /// /// 分垛模式(自动模式,手动模式)SelectedMaterialType.content.tostring() /// /// private string _selectedMaterialType; - private string _selectedMaterialType; - public string SelectedMaterialType + private ComboBoxItem _selectedMaterialType; + public ComboBoxItem SelectedMaterialType { get { return _selectedMaterialType; } set @@ -80,10 +122,51 @@ namespace Aucma.Core.ProductOffLine.ViewModels if (_selectedMaterialType != value) { _selectedMaterialType = value; - SetProperty(ref _selectedMaterialType, value); + OnPropertyChanged(nameof(SelectedMaterialType)); + } + } + } + #region 单选框 + private bool _isSelectedOptionA; + public bool IsSelectedOptionA + { + get { return _isSelectedOptionA; } + set + { + if (_isSelectedOptionA != value) + { + _isSelectedOptionA = value; + OnPropertyChanged(nameof(IsSelectedOptionA)); + + // 如果选择了A选项,将B选项设为false + if (_isSelectedOptionA) + { + IsSelectedOptionB = false; + } + } + } + } + + private bool _isSelectedOptionB; + public bool IsSelectedOptionB + { + get { return _isSelectedOptionB; } + set + { + if (_isSelectedOptionB != value) + { + _isSelectedOptionB = value; + OnPropertyChanged(nameof(IsSelectedOptionB)); + + // 如果选择了B选项,将A选项设为false + if (_isSelectedOptionB) + { + IsSelectedOptionA = false; + } } } } + #endregion #region 初始化datagrid private ObservableCollection materialDataGrid = new ObservableCollection(); @@ -101,8 +184,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels #endregion #region 加载DataGrid数据 - private void LoadData() + private async void LoadData() { + //Task.Run(() => + //{ + // Thread.Sleep(5000); + // getInstoreDirection("9000004529"); + //}); //MaterialDataGrid.Add(new MaterialComplateInfo() { No = 1, ProductPlanCode = "8659452123", MaterialCode = "8659452123", MaterialName = "SC-AUCMA-农夫山泉,SC", PlanAmount = 50, CompleteAmount = 10 }); //MaterialDataGrid.Add(new MaterialComplateInfo() { No = 2, ProductPlanCode = "8659452123", MaterialCode = "8659452123", MaterialName = "SC-AUCMA-农夫山泉,SC", PlanAmount = 60, CompleteAmount = 40 }); //MaterialDataGrid.Add(new MaterialComplateInfo() { No = 3, ProductPlanCode = "8659452123", MaterialCode = "8659452123", MaterialName = "SC-AUCMA-农夫山泉,SC", PlanAmount = 50, CompleteAmount = 10 }); @@ -124,45 +212,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels [RelayCommand] private void ExecQuery(object obj) { - //List list; - //var result = (StatisticModel)obj; - //if (string.IsNullOrEmpty(result.BeginTime) && string.IsNullOrEmpty(result.EndTime)) - //{ - // list = await _codeBindingRecordServices.QueryAllByTime(null, null); - //} - //else if (string.IsNullOrEmpty(result.BeginTime)) - //{ - // list = await _codeBindingRecordServices.QueryAllByTime(result.BeginTime, null); - //} - //else if (string.IsNullOrEmpty(result.EndTime)) - //{ - // list = await _codeBindingRecordServices.QueryAllByTime(null, result.EndTime); - //} - //else - //{ - // DateTime theBeginTime = Convert.ToDateTime(result.BeginTime); - // DateTime theEndTime = Convert.ToDateTime(result.EndTime); - // if (theBeginTime > theEndTime) - // { - // MessageBox.Show("结束时间要大于开始时间!"); - // return; - // } - // list = await _codeBindingRecordServices.QueryAllByTime(result.BeginTime, result.EndTime); - //} - - - //if (list != null) - //{ - // System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => - // { - // MaterialDataGrid.Clear(); - // foreach (CodeBindingRecord item in list) - // { - // MaterialDataGrid.Add(new ReaderInfo() { No = item.ObjId, BoxCode = item.BoxCode, BoxName = item.BoxName, ProductCode = item.ProductCode, BindingResult = item.BindingResult, RecordTime = item.RecordTime1.ToString() }); - // } - - // })); - //} + } #endregion } diff --git a/Aucma.Core.ProductOffLine/Views/QualityPageView.xaml b/Aucma.Core.ProductOffLine/Views/QualityPageView.xaml index d7adb1c7..03e529f2 100644 --- a/Aucma.Core.ProductOffLine/Views/QualityPageView.xaml +++ b/Aucma.Core.ProductOffLine/Views/QualityPageView.xaml @@ -37,15 +37,19 @@ - - + + + + - - + +