diff --git a/Admin.Core.Api/Admin.Core.Model.xml b/Admin.Core.Api/Admin.Core.Model.xml index 06d88e13..17daf502 100644 --- a/Admin.Core.Api/Admin.Core.Model.xml +++ b/Admin.Core.Api/Admin.Core.Model.xml @@ -491,6 +491,16 @@ 完成时间 + + + 条码下线信息 + + + + + 主键标识 + + SAP BOM 信息 diff --git a/Admin.Core.IRepository/IRepository_New/IOffLineInfoRepository.cs b/Admin.Core.IRepository/IRepository_New/IOffLineInfoRepository.cs new file mode 100644 index 00000000..96ab32ae --- /dev/null +++ b/Admin.Core.IRepository/IRepository_New/IOffLineInfoRepository.cs @@ -0,0 +1,17 @@ +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using Admin.Core.Model.ViewModels; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Admin.Core.IRepository +{ + /// + /// 成品下线记录 + /// + public interface IOffLineInfoRepository : IBaseRepository + { + + + } +} \ No newline at end of file diff --git a/Admin.Core.IService/IService_New/IOffLineInfoServices.cs b/Admin.Core.IService/IService_New/IOffLineInfoServices.cs new file mode 100644 index 00000000..1b854f37 --- /dev/null +++ b/Admin.Core.IService/IService_New/IOffLineInfoServices.cs @@ -0,0 +1,18 @@ +using Admin.Core.IService; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using Admin.Core.Model.ViewModels; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Admin.Core.IService +{ + /// + /// 成品下线 + /// + public interface IOffLineInfoServices : IBaseServices + { + + + } +} \ No newline at end of file diff --git a/Admin.Core.IService/IService_New/IProductOffLineServices.cs b/Admin.Core.IService/IService_New/IProductOffLineServices.cs index 4068224a..9df9e4f3 100644 --- a/Admin.Core.IService/IService_New/IProductOffLineServices.cs +++ b/Admin.Core.IService/IService_New/IProductOffLineServices.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Admin.Core.IService { /// - /// 成品下线 + /// 成品下线对接条码系统 /// public interface IProductOffLineServices : IBaseServices { diff --git a/Admin.Core.Model/Model_New/OffLineInfo.cs b/Admin.Core.Model/Model_New/OffLineInfo.cs new file mode 100644 index 00000000..58d1b911 --- /dev/null +++ b/Admin.Core.Model/Model_New/OffLineInfo.cs @@ -0,0 +1,58 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Model.Model_New +{ + /// + /// 条码下线信息 + /// + [SugarTable("OFF_LINEINFO", "AUCMA_MES")] + public class OffLineInfo + { + /// + /// 主键标识 + /// + [SugarColumn(ColumnName = "OBJ_ID", IsPrimaryKey = true, IsIdentity = true)] + public int ObjId { get; set; } + + public string ProductFactoryCode; //计划工厂 + public string ProductSNCode; //公司条码 + public string ProductOrderNo; //工单号 + public string ProductSaleNo; //销售订单号 + public string ProductSaleLineNo; //销售行号 + public string ProductCode;//物料编码 + public string ProductModel;//产品型号 + public string ProductName;//物料描述 + public string ProductType;//产品类型 + public string ProductCheckInfo;//验证组合 + public string ProductRemark; //标签特征 + public string ProductBarNo; //产品条码编码 + public string ProductMasterModel;//主型号 + public string ProductVersion;//版本号 + public string ProductUseInfo;//用途位 + public string ProductCirculate;//流通特性 + public string ProductCreateDate;//生成日期 + public string ProductScanTime; //扫描时间 + + + public bool ProductRefreshFlag; + public int ReadFlag; + public bool ProductDataFlag; + // 界面提示信息 + public string MsgInfo; + public bool MsgAlarmFlag; + public int OrderQty; + public int ActQty; + public string oneCode; + public string serialNumber; + public string rfid; + public string sim; + public string number1; + public bool ChkOut; + + } +} diff --git a/Admin.Core.Repository/Repository_New/OffLineInfoRepository.cs b/Admin.Core.Repository/Repository_New/OffLineInfoRepository.cs new file mode 100644 index 00000000..574d8780 --- /dev/null +++ b/Admin.Core.Repository/Repository_New/OffLineInfoRepository.cs @@ -0,0 +1,24 @@ +using Admin.Core.IRepository; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using Admin.Core.Model.ViewModels; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ICSharpCode.SharpZipLib.Zip.ZipEntryFactory; + +namespace Admin.Core.Repository +{ + public class OffLineInfoRepository : BaseRepository, IOffLineInfoRepository + { + public OffLineInfoRepository(IUnitOfWork unitOfWork) : base(unitOfWork) + { + } + + + } +} diff --git a/Admin.Core.Service/Service_New/OffLineInfoServices.cs b/Admin.Core.Service/Service_New/OffLineInfoServices.cs new file mode 100644 index 00000000..a565cf55 --- /dev/null +++ b/Admin.Core.Service/Service_New/OffLineInfoServices.cs @@ -0,0 +1,17 @@ +using Admin.Core.IRepository; +using Admin.Core.IService; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; + +namespace Admin.Core.Service +{ + public class OffLineInfoServices : BaseServices, IOffLineInfoServices + { + private readonly IBaseRepository _dal; + public OffLineInfoServices(IBaseRepository dal) + { + this._dal = dal; + base.BaseDal = dal; + } + } +} \ No newline at end of file diff --git a/Admin.Core.Service/Service_New/ProductOffLineServices.cs b/Admin.Core.Service/Service_New/ProductOffLineServices.cs index 0024f21a..e328b7e1 100644 --- a/Admin.Core.Service/Service_New/ProductOffLineServices.cs +++ b/Admin.Core.Service/Service_New/ProductOffLineServices.cs @@ -57,8 +57,7 @@ namespace Admin.Core.Service { // 保存业务 var _db = baseRepository.Db; - var infos = await _db.Ado.SqlQueryAsync($""); - + var infos = await _db.Ado.SqlQueryAsync($"SELECT ILS_TMPRD.ILS_SORT_BARCODE_PKG.SAVE_BARCODE_INFO({Barcode},{Created_By},{Order_number},{Order_type})"); return infos.FirstOrDefault().result; } catch (Exception ex) diff --git a/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj b/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj index 2492a5ac..4ca354a2 100644 --- a/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj +++ b/Aucma.Core.ProductOffLine/Aucma.Core.ProductOffLine.csproj @@ -71,6 +71,7 @@ + diff --git a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs index f52b35f7..929f9bc7 100644 --- a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs +++ b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs @@ -4,11 +4,15 @@ using Admin.Core.Model.Model_New; using Admin.Core.Service; using Aucma.Core.PLc; using Aucma.Core.ProductOffLine; +using Aucma.Core.ProductOffLine.Models; using log4net; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Logging; +using RestSharp; using System; +using System.Collections; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading; @@ -32,14 +36,26 @@ namespace Aucma.Core.ProductOffLine.Business } } #endregion + //public OffLineBusiness(){} + + #region 变量定义 + public static OffLineInfo TempOffLineInfo = new OffLineInfo(); + public static OffLineInfo FDOffLineInfo = new OffLineInfo(); + // 河南工厂编码 + private static string Werks = "1301"; + #endregion + + #region 接口引用 private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness)); - private readonly IBaseOrderInfoServices _baseOrderInfoServices; - private readonly IProductPlanInfoServices? _productPlanInfoServices; - private readonly IProductOffLineServices? _productOffLineServices; - + private readonly IBaseOrderInfoServices _baseOrderInfoServices = App.ServiceProvider.GetService(); + private readonly IProductPlanInfoServices? _productPlanInfoServices = App.ServiceProvider.GetService(); + // 成品下线操作条码系统接口 + private readonly IProductOffLineServices? _productOffLineServices = App.ServiceProvider.GetService(); + // 成品下线操作mes数据 + private readonly IOffLineInfoServices? _offLineInfoServices = App.ServiceProvider.GetService(); #endregion @@ -66,55 +82,51 @@ namespace Aucma.Core.ProductOffLine.Business #endregion - public OffLineBusiness() - { - - + - } - public void test() - { + public async void test() + { + BaseOrderInfo order = await _baseOrderInfoServices.FirstAsync(); + Console.WriteLine(order); } /// - /// 扫描的条码处理 + /// 处理条码 /// /// /// 扫码器方向 - private async void ReceiveCode(string code, int scannerNo) + private async void MaterialBarScanEvent(string code)//接收条码数据 { - //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); + //1.扫描的SN条码去条码系统校验 + 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(scannerNo); - if (!flag) - { - log.Error("获取plc反馈失败"); - return; - } - Console.WriteLine(code); - return; + ////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))) @@ -157,6 +169,167 @@ namespace Aucma.Core.ProductOffLine.Business } + /// + /// 去条码系统查询校验并保存 + /// + /// + /// + public async Task HandleMaterialBarCode(string BarCode) + { + try + { + TempOffLineInfo.ProductSNCode = BarCode.Trim(); //SN码 + TempOffLineInfo.ProductScanTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + 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"; + + //查询到的数据分割处理,结果中用"@"号分隔,刷新页面显示 + 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 + "失败返回验证信息:" + 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)) + { + if (strSave == "Y") + { + log.Info(BarCode + "上传条码成功:" + strSave); + + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码成功" + strSave; + if (order != null) + { + TempOffLineInfo.OrderQty = order.OrderAmount; + TempOffLineInfo.ActQty = order.CompleteAmount; + } + return true; + } + else + { + log.Info(BarCode + "上传条码失败:" + strSave); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave; + if (strSave.Contains("条码重复")) + { + // 查询本地数据库是否有数据 + OffLineInfo offLineInfo = await _offLineInfoServices.FirstAsync(x => x.ProductSNCode == BarCode); + if (offLineInfo != null) + { + log.Info(BarCode + "条码重复,本地已存在"); + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码失败" + strSave + "上传日期:" + DBToString(offLineInfo.ProductScanTime); + + if (TempOffLineInfo.ChkOut == true) + { + return true; + } + } + else + { + log.Info(BarCode + "条码重复,本地不存在,已上传中"); + await _offLineInfoServices.AddAsync(TempOffLineInfo); + } + } + return false; + } + + } + else + { + return false; + } + } + else + { + TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",生产单号异常"; + return false; + } + } + 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); @@ -298,5 +471,125 @@ namespace Aucma.Core.ProductOffLine.Business } #endregion + + + #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") + { + TempOffLineInfo.ProductRemark = ""; + } + + if (TempOffLineInfo.ProductRemark != "") + { + log.Info(TempOffLineInfo.ProductSNCode + ", 验证组合:" + TempOffLineInfo.ProductRemark); + + 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"); + + int iCheck = 0; + + if (blnY == true) + iCheck = iCheck + 1; + + if (blnZ == true) + iCheck = iCheck + 1; + + if (blnX == true) + iCheck = iCheck + 1; + + if (blnG == 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) + { + 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) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,公司条码验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,公司条码验证失败"); + return false; + } + + if (blnZ == true && DBToString(chkInfo.serialNumber) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,资产号验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,资产号验证失败"); + return false; + } + + if (blnX == true && DBToString(chkInfo.rfid) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,芯片验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,芯片验证失败"); + return false; + } + + if (blnG == true && DBToString(chkInfo.sim) == "") + { + TempOffLineInfo.MsgInfo = "多码验证,模块信息验证失败"; + log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证,模块信息验证失败"); + return false; + } + + return true; + } + } + } + return true; + } + + #endregion } } diff --git a/Aucma.Core.ProductOffLine/Models/AucmaBarCodeModel.cs b/Aucma.Core.ProductOffLine/Models/AucmaBarCodeModel.cs new file mode 100644 index 00000000..e46921fe --- /dev/null +++ b/Aucma.Core.ProductOffLine/Models/AucmaBarCodeModel.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.ProductOffLine.Models +{ + public class AucmaBarCodeModel + { + /// + /// 公司条码 + /// + public string oneCode { get; set; } + /// + /// 资产条码 + /// + public string serialNumber { get; set; } + /// + /// 芯片码 + /// + public string rfid { get; set; } + + public string update { get; set; } + + public string imei { get; set; } + + public string imsi { get; set; } + /// + /// 模块信息 + /// + public string sim { get; set; } + + public string wifiMac { get; set; } + + public string btMac { get; set; } + + public string uuid { get; set; } + + public string major { get; set; } + + public string minor { get; set; } + + public string Iwerk { get; set; } + + public string customNumber { get; set; } + /// + /// 是摄像头码 + /// + public string number1 { get; set; } + + public string number2 { get; set; } + + public string number3 { get; set; } + + public string number4 { get; set; } + + //{ "oneCode":"1252002000010B150050","serialNumber":"AKMZG20210207568","rfid":"6062F554", + //"update":"2021-01-08 10:49:43","imei":null,"imsi":null,"sim":null,"wifiMac":null,"btMac":null, + //"uuid":null,"major":null,"minor":null,"Iwerk":"1021","customNumber":"","number1":"","number2":"","number3":"","number4":""} + + + } +}