You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

329 lines
9.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
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;
readonly IBaseLogService _baseLogService;
public Action<ScanLogModel>? ScanLogSocketAction;
public Action<ScanStatusSocket>? ScanStatusSocketAction;
private ILogger<ApiServer> _logger;
public ApiServer(IScanLogService scanService, IBaseCodeService baseCodeService, IBaseLogService baseLogService, ILogger<ApiServer> logger)
{
_scanService = scanService;
_baseCodeService = baseCodeService;
_baseLogService = baseLogService;
_logger=logger;
}
[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.Content = hk.ToJsonString();
try
{
FilterBuffer(ref hk);
ScanLogSocket scan = new ScanLogSocket()
{
code = hk.code,
data_type = hk.data_type,
ocr = hk.ocr,
rfid = hk.rfid,
timestamp = hk.timestamp,
url = hk.url
};
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;
}
/// <summary>
/// 扫描的状态回传
/// </summary>
/// <param name="scanStatus"></param>
/// <returns></returns>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public Back ScanStatus(ScanStatusSocket scanStatus)
{
//_logger.LogInformation("扫描的状态接口");
//_logger.LogInformation("{Data}",scanStatus.ToJsonString());
BaseLog log = new BaseLog
{
LogLevel = "Info",
ErrMsg = "",
Content = scanStatus.ToJsonString()
};
try
{
if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0)
{
List<string> ls = new List<string>();
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;
}
_baseLogService.Insert(log);
return new Back();
}
/// <summary>
/// 扫描数据回传接口
/// </summary>
/// <param name="scanLog"></param>
/// <returns></returns>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public Back ScanBack(ScanLogSocket scanLog)
{
//_logger.LogInformation("扫描数据回传接口");
//_logger.LogInformation("{Data}", scanLog.ToJsonString());
string result = string.Empty;
if (string.IsNullOrEmpty(scanLog.code) || scanLog.code == "noread")
{
result = scanLog.rfid;
}
else
{
result = scanLog.code;
}
var model = new ScanLogModel()
{
CreateTime = scanLog.CreateTime,
DataType = scanLog.data_type,
Code = scanLog.code,
Rfid = scanLog.rfid,
Ocr = scanLog.ocr,
Url = scanLog.url,
Result = result,
};
ScanLogSocketAction?.Invoke(model);
_scanService.Insert(model);
return new Back();
}
private const string bufferStart = "0C1104";
private const string bufferBody = "EE5EFB65";
/// <summary>
/// RFID信息解析
/// </summary>
/// <param name="rfidStr"></param>
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)
{
try
{
if (hk.rfid == "noread" || string.IsNullOrEmpty(hk.rfid))
{
if (!string.IsNullOrEmpty(hk.code) && hk.code != "noread")
{
hk.rfid = hk.code;
}
}
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);
if(rfidStr != hk.code && !string.IsNullOrEmpty(hk.code) && hk.code != "noread")
{
hk.rfid = hk.code;
}
else
{
hk.rfid = rfidStr;
}
}
}
}
//处理ATR数据
if (string.IsNullOrEmpty(hk.code) || hk.code == "noread")
{
if (hk.rfid != "多条码" && hk.rfid != "noread")
{
hk.code = hk.rfid;
}
}
}
catch(Exception ex)
{
throw new InvalidOperationException($"标签处理逻辑异常:{ex.Message}");
}
}
}
}
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<string> device_status { get; set; }
public List<string> status_txt { get; set; }
}