using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using System.Web; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Logging; using SlnMesnac.Config; using SlnMesnac.Model.domain; using SlnMesnac.Repository.service; using SlnMesnac.Repository.service.LogImpl; using SlnMesnac.Repository.service.ScanLog; using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Rpc; using TouchSocket.WebApi; namespace SlnMesnac.TouchSocket { public class ApiServer : RpcServer { private readonly IScanLogService _scanService; private readonly IBaseCodeService _baseCodeService; private readonly IBaseLogService _baseLogService; public Action? ScanLogSocketAction; public Action? ScanStatusSocketAction; private ILogger _logger; private AppConfig _appConfig; public ApiServer(IScanLogService scanService, IBaseCodeService baseCodeService, IBaseLogService baseLogService, ILogger logger,AppConfig appConfig) { _scanService = scanService; _baseCodeService = baseCodeService; _baseLogService = baseLogService; _logger=logger; _appConfig=appConfig; } [EnableCors("cors")] [WebApi(HttpMethodType.POST)] public string Test(IWebApiCallContext callContext) { //http内容 var httpContext = callContext.HttpContext; //http请求 var request = httpContext.Request; var str = request.GetBody(); _logger.LogInformation("测试body{Data}", str); return str; } [EnableCors("cors")] [WebApi(HttpMethodType.POST)] public Back Back(Hk hk) { Back ba=new Back(); _logger.LogInformation("=========================="); _logger.LogInformation("{Data}", hk.ToJsonString()); _logger.LogInformation("=========================="); if (hk.data_type == 1) { BaseLog log = new BaseLog(); log.LogLevel = "Info"; log.ErrMsg = ""; log.LogType = "包裹数据"; log.Content = hk.ToJsonString(); try { //标签处理逻辑算法 FilterBuffer(ref hk, out string result); //复制共享图像到指定路径 CopyImageWithDateFolder(hk.url, result,out string destinationImagePath); string isOk = string.Empty; if(result != "多条码" && result != "noread" && result != "NoRead" && !string.IsNullOrEmpty(result)) { isOk = "Ok"; }else if(result == "多条码") { isOk = "Mul"; }else { isOk = "Ng"; } ScanLogSocket scan = new ScanLogSocket() { code = hk.code, data_type = hk.data_type, ocr = hk.ocr, rfid = hk.rfid, timestamp = hk.timestamp, url = destinationImagePath, isOk = isOk, result = result }; ba = ScanBack(scan); } catch (Exception e) { _logger.LogError(e, e.Message); log.LogLevel = "Error"; log.ErrMsg = e.Message; } _baseLogService.Insert(log); } else { if (hk.data_type == 2) { ScanStatusSocket scan = new ScanStatusSocket() { data_type = hk.data_type, is_alarm = hk.is_alarm, device_status = hk.device_status, timestamp = hk.timestamp, }; ba = ScanStatus(scan); } } return ba; } /// /// 扫描的状态回传 /// /// /// [EnableCors("cors")] [WebApi(HttpMethodType.POST)] public Back ScanStatus(ScanStatusSocket scanStatus) { //_logger.LogInformation("扫描的状态接口"); //_logger.LogInformation("{Data}",scanStatus.ToJsonString()); BaseLog log = new BaseLog { LogLevel = "Info", ErrMsg = "", LogType = "设备监控", Content = scanStatus.ToJsonString() }; try { if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0) { List ls = new List(); var baseCodes = _baseCodeService.QuListCache(); foreach (var baseCode in scanStatus.device_status) { var enBaseCode = baseCodes.FirstOrDefault(x => x.Code == baseCode); if (enBaseCode != null) { ls.Add(enBaseCode.State); } } scanStatus.status_txt = ls; } ScanStatusSocketAction?.Invoke(scanStatus); } catch (Exception e) { _logger.LogError(e,e.Message); log.LogLevel = "Error"; log.ErrMsg=e.Message; } Task.Run(() => { lock (string.Empty) { _baseLogService.Insert(log); } }); return new Back(); } /// /// 扫描数据回传接口 /// /// /// [EnableCors("cors")] [WebApi(HttpMethodType.POST)] public Back ScanBack(ScanLogSocket scanLog) { //_logger.LogInformation("扫描数据回传接口"); //_logger.LogInformation("{Data}", scanLog.ToJsonString()); var model = new ScanLogModel() { CreateTime = scanLog.CreateTime, DataType = scanLog.data_type, Code = scanLog.code, Rfid = scanLog.rfid, Ocr = scanLog.ocr, Url = scanLog.url, IsOk = scanLog.isOk, Result = scanLog.result }; ScanLogSocketAction?.Invoke(model); _scanService.Insert(model); return new Back(); } private const string bufferStart = "0C1104"; private const string bufferBody = "EE5EFB65"; /// /// RFID信息解析 /// /// private void AnasysBuffer(ref string rfidStr) { if(rfidStr != "noread") { string bufferHex = rfidStr.Substring(bufferStart.Length, bufferBody.Length); long decimalValue = Convert.ToInt64(bufferHex, 16); rfidStr = decimalValue.ToString(); } } /// /// 标签处理逻辑算法 /// /// /// /// private void FilterBuffer(ref Hk hk,out string result) { try { result = string.Empty; if (hk.rfid == "noread" || string.IsNullOrEmpty(hk.rfid)) { if (!string.IsNullOrEmpty(hk.code) && hk.code != "NoRead") { result = hk.code; } else { result = hk.rfid; } } else { string[] buffer = hk.rfid.Split(","); if (buffer.Length > 1) { hk.rfid = "多条码"; } else { string rfidStr = hk.rfid; if (!string.IsNullOrEmpty(hk.rfid)) { AnasysBuffer(ref rfidStr); hk.rfid = rfidStr; } } if (hk.rfid != hk.code && !string.IsNullOrEmpty(hk.code) && hk.code != "NoRead") { result = hk.code; } else { result = hk.rfid; } } //处理ATR数据 if (string.IsNullOrEmpty(hk.code) || hk.code == "NoRead") { if (hk.rfid != "多条码" && hk.rfid != "noread") { result = hk.rfid; }else { if(hk.rfid == "多条码") { result = hk.rfid; } else { result = hk.code; } } } else { string[] buffer = hk.code.Split(","); if (buffer.Length > 1) { hk.code = "多条码"; } if (hk.rfid == hk.code && !string.IsNullOrEmpty(hk.rfid) && hk.rfid != "NoRead" && hk.rfid != "多条码") { result = hk.rfid; } else { result = hk.code; } } } catch(Exception ex) { throw new InvalidOperationException($"标签处理逻辑异常:{ex.Message}"); } } /// /// 将全景图像复制到指定路径下 /// /// /// private void CopyImageWithDateFolder(string sourceImagePath,string fileName,out string destinationImagePath) { try { if (string.IsNullOrEmpty(sourceImagePath)) { throw new ArgumentNullException("全景图像路径为空"); } if (string.IsNullOrEmpty(fileName)) { throw new ArgumentNullException("自定义全景图像文件名称为空"); } string destinationBasePath = _appConfig.imagePath; DateTime now = DateTime.Now; string dateFolder = now.Year + "-" + now.Month + "-" + now.Day; string destinationFolder = Path.Combine(destinationBasePath, dateFolder); if (!Directory.Exists(destinationFolder)) { Directory.CreateDirectory(destinationFolder); // 创建 ok、ng、mul 文件夹 string okFolder = Path.Combine(destinationFolder, "ok"); string ngFolder = Path.Combine(destinationFolder, "ng"); string mulFolder = Path.Combine(destinationFolder, "mul"); Directory.CreateDirectory(okFolder); Directory.CreateDirectory(ngFolder); Directory.CreateDirectory(mulFolder); } string sourceFileName = Path.GetFileName(sourceImagePath); string extension = Path.GetExtension(sourceImagePath); string newFileName = now.ToString("HHmmssfff") + "-" + fileName + extension; string subFolder = DetermineSubFolder(fileName); destinationImagePath = Path.Combine(destinationFolder, subFolder, newFileName); File.Copy(sourceImagePath, destinationImagePath, true); //File.Delete(sourceImagePath); } catch (Exception ex) { throw new InvalidOperationException($"将全景图像复制到指定路径处理异常:{ex.Message}"); } } private string DetermineSubFolder(string fileName) { if (fileName.Contains("ead")) { return "ng"; } else if (fileName.Contains("多条码")) { return "mul"; } else { return "ok"; } } } } public class Hk { public DateTime CreateTime { get { DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp); return dateTimeOffset.UtcDateTime; } } public long timestamp { get; set; } public int data_type { get; set; } public string rfid { get; set; } public string code { get; set; } public string ocr { get; set; } public string url { get; set; } public int is_alarm { get; set; } public List device_status { get; set; } public List status_txt { get; set; } }