add - 成品下线条码系统对接

dev
liuwf 1 year ago
parent 6b05cce2d2
commit fdcb9b54db

@ -491,6 +491,16 @@
完成时间
</summary>
</member>
<member name="T:Admin.Core.Model.Model_New.OffLineInfo">
<summary>
条码下线信息
</summary>
</member>
<member name="P:Admin.Core.Model.Model_New.OffLineInfo.ObjId">
<summary>
主键标识
</summary>
</member>
<member name="T:Admin.Core.Model.Model_New.OrderBomInfo">
<summary>
SAP BOM 信息

@ -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
{
/// <summary>
/// 成品下线记录
/// </summary>
public interface IOffLineInfoRepository : IBaseRepository<OffLineInfo>
{
}
}

@ -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
{
/// <summary>
/// 成品下线
/// </summary>
public interface IOffLineInfoServices : IBaseServices<OffLineInfo>
{
}
}

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace Admin.Core.IService
{
/// <summary>
/// 成品下线
/// 成品下线对接条码系统
/// </summary>
public interface IProductOffLineServices : IBaseServices<BaseTest>
{

@ -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
{
/// <summary>
/// 条码下线信息
/// </summary>
[SugarTable("OFF_LINEINFO", "AUCMA_MES")]
public class OffLineInfo
{
/// <summary>
/// 主键标识
///</summary>
[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;
}
}

@ -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<OffLineInfo>, IOffLineInfoRepository
{
public OffLineInfoRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
}
}

@ -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<OffLineInfo>, IOffLineInfoServices
{
private readonly IBaseRepository<OffLineInfo> _dal;
public OffLineInfoServices(IBaseRepository<OffLineInfo> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

@ -57,8 +57,7 @@ namespace Admin.Core.Service
{
// 保存业务
var _db = baseRepository.Db;
var infos = await _db.Ado.SqlQueryAsync<BaseTest>($"");
var infos = await _db.Ado.SqlQueryAsync<BaseTest>($"SELECT ILS_TMPRD.ILS_SORT_BARCODE_PKG.SAVE_BARCODE_INFO({Barcode},{Created_By},{Order_number},{Order_type})");
return infos.FirstOrDefault().result;
}
catch (Exception ex)

@ -71,6 +71,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="RestSharp" Version="106.15.0" />
</ItemGroup>
<ItemGroup>

@ -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<IBaseOrderInfoServices>();
private readonly IProductPlanInfoServices? _productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
// 成品下线操作条码系统接口
private readonly IProductOffLineServices? _productOffLineServices = App.ServiceProvider.GetService<IProductOffLineServices>();
// 成品下线操作mes数据
private readonly IOffLineInfoServices? _offLineInfoServices = App.ServiceProvider.GetService<IOffLineInfoServices>();
#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);
}
/// <summary>
/// 扫描的条码处理
/// 处理条码
/// </summary>
/// <param name="code"></param>
/// <param name="direction">扫码器方向</param>
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
}
/// <summary>
/// 去条码系统查询校验并保存
/// </summary>
/// <param name="BarCode"></param>
/// <returns></returns>
public async Task<bool> 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 工具方法
/// <summary>
///
/// </summary>
/// <param name="refData"></param>
/// <returns></returns>
public static string DBToString(object refData)
{
if (refData == null)
return "";
else
return refData == DBNull.Value ? "" : refData.ToString();
}
/// <summary>
/// 多码系统校验
/// </summary>
/// <param name="TempOffLineInfo"></param>
/// <returns></returns>
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<AucmaBarCodeModel>(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
}
}

@ -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
{
/// <summary>
/// 公司条码
/// </summary>
public string oneCode { get; set; }
/// <summary>
/// 资产条码
/// </summary>
public string serialNumber { get; set; }
/// <summary>
/// 芯片码
/// </summary>
public string rfid { get; set; }
public string update { get; set; }
public string imei { get; set; }
public string imsi { get; set; }
/// <summary>
/// 模块信息
/// </summary>
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; }
/// <summary>
/// 是摄像头码
/// </summary>
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":""}
}
}
Loading…
Cancel
Save