/api/open/getdevinfo接口增加去重处理,这个不能去掉
This commit is contained in:
parent
d905211c24
commit
7cb0918326
|
|
@ -55,106 +55,155 @@ namespace Waste.Application.ThirdApiInfo
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<ResultInfo> GetDevInfoAsync(GetDevInfoRequestDto data)
|
public async Task<ResultInfo> GetDevInfoAsync(GetDevInfoRequestDto data)
|
||||||
{
|
{
|
||||||
|
|
||||||
//更新上报记录结果
|
//更新上报记录结果
|
||||||
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == data.ECode);
|
Guid resultid = Guid.Empty;
|
||||||
if (device == null)
|
//这里进行去重处理
|
||||||
|
if (!string.IsNullOrEmpty(data.ResultId) && Guid.TryParse(data.ResultId, out resultid))
|
||||||
{
|
{
|
||||||
return new ResultInfo(ResultState.FAIL, "设备未找到");
|
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == data.ECode);
|
||||||
}
|
if (device == null)
|
||||||
if(device.Status == (int)DeviceStatus.Error)
|
|
||||||
{
|
|
||||||
return new ResultInfo(ResultState.FAIL, "设备已停止运行");
|
|
||||||
}
|
|
||||||
var returndata = new GetDevInfoResponseDto
|
|
||||||
{
|
|
||||||
ResultId = IDGen.NextID(),
|
|
||||||
UserId = UserId,
|
|
||||||
PostUrl = ApiUrl
|
|
||||||
};
|
|
||||||
var devicesecret = await dbClient.Queryable<W_SZDevice>().FirstAsync(x => x.DeviceId == device.Id);
|
|
||||||
if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
|
|
||||||
|| string.IsNullOrEmpty(devicesecret.SecretHash)
|
|
||||||
|| string.IsNullOrEmpty(devicesecret.DevId))
|
|
||||||
{
|
|
||||||
return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
|
|
||||||
}
|
|
||||||
//解析协议,IC卡数据@垃圾桶编号@厨余垃圾@7.91
|
|
||||||
// 00000000003031 40 0F00010009 40 C6E4CBFBC0ACBBF8 40 31352E39
|
|
||||||
// 00000000003031 40 000F000002 40 C6E4CBFBC0ACBBF8 40 35312E30 0D0A
|
|
||||||
if (!string.IsNullOrEmpty(data.data) && data.data.Length > 52)
|
|
||||||
{
|
|
||||||
data.data = data.data.Replace(" ", "");
|
|
||||||
//收到的为16进制,对数据进行解析,0-4预留,5-垃圾种类,6-垃圾桶大小,7-@,8-12垃圾桶编号,13@,14-21垃圾种类汉字,22@,23-结束重量, OD OA 回车换行
|
|
||||||
data.data = data.data.Substring(0, data.data.Length - 4);
|
|
||||||
var trashhex = data.data.Substring(16, 10); //垃圾桶编号
|
|
||||||
var typehex = data.data.Substring(28, 16); //垃圾种类
|
|
||||||
var sizehex = data.data.Substring(12, 2);//桶大小,30-小桶,31-大桶
|
|
||||||
var weighthex = data.data.Substring(46, data.data.Length - 46);
|
|
||||||
returndata.trash = HextToDec(trashhex).ToString(); //垃圾桶编号使用10进制
|
|
||||||
var type = GetChsFromHex(typehex);
|
|
||||||
var weight = GetChsFromHex(weighthex);
|
|
||||||
returndata.type = TrashType(type);
|
|
||||||
returndata.Weight = weight.ToDouble();
|
|
||||||
//计算净重,毛重-皮重=净重,如果净重小于等于0则不上报保存
|
|
||||||
returndata.Weight = (returndata.Weight - device.Tare.ToDouble()).ToDouble(2);
|
|
||||||
if (returndata.Weight <= 0)
|
|
||||||
{
|
{
|
||||||
_loggerService.AddLogger($"{data.ECode},{device.Name},重量小于等于0:{returndata.ToJson()}", 1);
|
return new ResultInfo(ResultState.FAIL, "设备未找到");
|
||||||
return new ResultInfo(ResultState.FAIL, "无效的重量");
|
|
||||||
}
|
}
|
||||||
//检查是否为15分钟内第一次上报
|
var devicesecret = await dbClient.Queryable<W_SZDevice>().FirstAsync(x => x.DeviceId == device.Id);
|
||||||
//如果是巴城的设备则不使用这个限制
|
if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
|
||||||
if(device.Businessid != Guid.Parse("39FCB9DE-404E-68F5-384B-EE2462EAB87C"))
|
|| string.IsNullOrEmpty(devicesecret.SecretHash)
|
||||||
|
|| string.IsNullOrEmpty(devicesecret.DevId))
|
||||||
{
|
{
|
||||||
var time15 = DateTime.Now.AddMinutes(-15);
|
return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
|
||||||
if (await dbClient.Queryable<W_DeviceResult>().AnyAsync(x => x.DeviceId == device.Id && x.LastTrash == returndata.trash && x.LastHeartTime > time15))
|
|
||||||
{
|
|
||||||
_loggerService.AddLogger($"{data.ECode},{device.Name},重复垃圾桶编号的数据:{returndata.ToJson()}", 1);
|
|
||||||
return new ResultInfo(ResultState.FAIL, "15分钟内同一垃圾桶编号上报");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
returndata.IsSuccessed = true;
|
int timestamp = _suZhouService.GetUTCTimestamp();
|
||||||
//记录数据
|
int noncestr = _suZhouService.GetNonce();
|
||||||
data.IMEI = data.IMEI.ToStr();
|
var result = await dbClient.Queryable<W_Result>().FirstAsync(x => x.Id == resultid);
|
||||||
data.ICCID = data.ICCID.ToStr();
|
if (result == null)
|
||||||
data.IMSI = data.IMSI.ToStr();
|
|
||||||
await _capBus.PublishAsync("result.service.insert", new ResultS2SDto
|
|
||||||
{
|
{
|
||||||
BusinessId = device.Businessid,
|
return new ResultInfo(ResultState.SUCCESS, "记录id未找到");
|
||||||
DeviceId = device.Id,
|
}
|
||||||
gslq = data.GSLQ,
|
var returndata = new GetDevInfoResponseDto
|
||||||
iccid = data.ICCID,
|
{
|
||||||
imei = data.IMEI,
|
DeviceId = devicesecret.DevId,
|
||||||
imsi = data.IMSI,
|
noncestr = noncestr,
|
||||||
LastHeartTime = device.LastHeartTime,
|
timestamp = timestamp,
|
||||||
latitude = data.Latitude,
|
Secret = devicesecret.Secret,
|
||||||
longtitude = data.Longitude,
|
SecretHash = devicesecret.SecretHash,
|
||||||
ResultId = returndata.ResultId,
|
UserId = UserId,
|
||||||
Tare = device.Tare,
|
PostUrl = ApiUrl,
|
||||||
trash = returndata.trash,
|
ScanningTime = timestamp,
|
||||||
wastetype = type,
|
ResultId = resultid,
|
||||||
weight = weight
|
trash = result.Registration,
|
||||||
});
|
Weight = result.GrossWeight.ToDouble(),
|
||||||
|
status = 0,
|
||||||
|
IsSuccessed = true,
|
||||||
|
type = TrashType(result.WasteType)
|
||||||
|
};
|
||||||
|
string[] paramlist = new string[] {
|
||||||
|
returndata.Weight.ToString(),returndata.trash,returndata.type.ToString(),returndata.ScanningTime.ToString(),returndata.status.ToString()};
|
||||||
|
returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
|
||||||
|
return new ResultInfo(ResultState.SUCCESS, "success", returndata);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_loggerService.AddLogger($"{data.ECode},{device.Name},协议格式不正确:{data.ToJson()}", 1);
|
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == data.ECode);
|
||||||
return new ResultInfo(ResultState.FAIL, "协议格式不正确");
|
if (device == null)
|
||||||
}
|
{
|
||||||
int timestamp = _suZhouService.GetUTCTimestamp();
|
return new ResultInfo(ResultState.FAIL, "设备未找到");
|
||||||
int noncestr = _suZhouService.GetNonce();
|
}
|
||||||
returndata.DeviceId = devicesecret.DevId;
|
if (device.Status == (int)DeviceStatus.Error)
|
||||||
returndata.noncestr = noncestr;
|
{
|
||||||
returndata.timestamp = timestamp;
|
return new ResultInfo(ResultState.FAIL, "设备已停止运行");
|
||||||
returndata.Secret = devicesecret.Secret;
|
}
|
||||||
returndata.SecretHash = devicesecret.SecretHash;
|
var returndata = new GetDevInfoResponseDto
|
||||||
returndata.ScanningTime = timestamp;
|
{
|
||||||
string[] paramlist = new string[] {
|
ResultId = IDGen.NextID(),
|
||||||
|
UserId = UserId,
|
||||||
|
PostUrl = ApiUrl
|
||||||
|
};
|
||||||
|
var devicesecret = await dbClient.Queryable<W_SZDevice>().FirstAsync(x => x.DeviceId == device.Id);
|
||||||
|
if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
|
||||||
|
|| string.IsNullOrEmpty(devicesecret.SecretHash)
|
||||||
|
|| string.IsNullOrEmpty(devicesecret.DevId))
|
||||||
|
{
|
||||||
|
return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
|
||||||
|
}
|
||||||
|
//解析协议,IC卡数据@垃圾桶编号@厨余垃圾@7.91
|
||||||
|
// 00000000003031 40 0F00010009 40 C6E4CBFBC0ACBBF8 40 31352E39
|
||||||
|
// 00000000003031 40 000F000002 40 C6E4CBFBC0ACBBF8 40 35312E30 0D0A
|
||||||
|
if (!string.IsNullOrEmpty(data.data) && data.data.Length > 52)
|
||||||
|
{
|
||||||
|
data.data = data.data.Replace(" ", "");
|
||||||
|
//收到的为16进制,对数据进行解析,0-4预留,5-垃圾种类,6-垃圾桶大小,7-@,8-12垃圾桶编号,13@,14-21垃圾种类汉字,22@,23-结束重量, OD OA 回车换行
|
||||||
|
data.data = data.data.Substring(0, data.data.Length - 4);
|
||||||
|
var trashhex = data.data.Substring(16, 10); //垃圾桶编号
|
||||||
|
var typehex = data.data.Substring(28, 16); //垃圾种类
|
||||||
|
var sizehex = data.data.Substring(12, 2);//桶大小,30-小桶,31-大桶
|
||||||
|
var weighthex = data.data.Substring(46, data.data.Length - 46);
|
||||||
|
returndata.trash = HextToDec(trashhex).ToString(); //垃圾桶编号使用10进制
|
||||||
|
var type = GetChsFromHex(typehex);
|
||||||
|
var weight = GetChsFromHex(weighthex);
|
||||||
|
returndata.type = TrashType(type);
|
||||||
|
returndata.Weight = weight.ToDouble();
|
||||||
|
//计算净重,毛重-皮重=净重,如果净重小于等于0则不上报保存
|
||||||
|
returndata.Weight = (returndata.Weight - device.Tare.ToDouble()).ToDouble(2);
|
||||||
|
if (returndata.Weight <= 0)
|
||||||
|
{
|
||||||
|
_loggerService.AddLogger($"{data.ECode},{device.Name},重量小于等于0:{returndata.ToJson()}", 1);
|
||||||
|
return new ResultInfo(ResultState.FAIL, "无效的重量");
|
||||||
|
}
|
||||||
|
//检查是否为15分钟内第一次上报
|
||||||
|
//如果是巴城的设备则不使用这个限制
|
||||||
|
if (device.Businessid != Guid.Parse("39FCB9DE-404E-68F5-384B-EE2462EAB87C"))
|
||||||
|
{
|
||||||
|
var time15 = DateTime.Now.AddMinutes(-15);
|
||||||
|
if (await dbClient.Queryable<W_DeviceResult>().AnyAsync(x => x.DeviceId == device.Id && x.LastTrash == returndata.trash && x.LastHeartTime > time15))
|
||||||
|
{
|
||||||
|
_loggerService.AddLogger($"{data.ECode},{device.Name},重复垃圾桶编号的数据:{returndata.ToJson()}", 1);
|
||||||
|
return new ResultInfo(ResultState.FAIL, "15分钟内同一垃圾桶编号上报");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
returndata.IsSuccessed = true;
|
||||||
|
//记录数据
|
||||||
|
data.IMEI = data.IMEI.ToStr();
|
||||||
|
data.ICCID = data.ICCID.ToStr();
|
||||||
|
data.IMSI = data.IMSI.ToStr();
|
||||||
|
await _capBus.PublishAsync("result.service.insert", new ResultS2SDto
|
||||||
|
{
|
||||||
|
BusinessId = device.Businessid,
|
||||||
|
DeviceId = device.Id,
|
||||||
|
gslq = data.GSLQ,
|
||||||
|
iccid = data.ICCID,
|
||||||
|
imei = data.IMEI,
|
||||||
|
imsi = data.IMSI,
|
||||||
|
LastHeartTime = device.LastHeartTime,
|
||||||
|
latitude = data.Latitude,
|
||||||
|
longtitude = data.Longitude,
|
||||||
|
ResultId = returndata.ResultId,
|
||||||
|
Tare = device.Tare,
|
||||||
|
trash = returndata.trash,
|
||||||
|
wastetype = type,
|
||||||
|
weight = weight
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_loggerService.AddLogger($"{data.ECode},{device.Name},协议格式不正确:{data.ToJson()}", 1);
|
||||||
|
return new ResultInfo(ResultState.FAIL, "协议格式不正确");
|
||||||
|
}
|
||||||
|
int timestamp = _suZhouService.GetUTCTimestamp();
|
||||||
|
int noncestr = _suZhouService.GetNonce();
|
||||||
|
returndata.DeviceId = devicesecret.DevId;
|
||||||
|
returndata.noncestr = noncestr;
|
||||||
|
returndata.timestamp = timestamp;
|
||||||
|
returndata.Secret = devicesecret.Secret;
|
||||||
|
returndata.SecretHash = devicesecret.SecretHash;
|
||||||
|
returndata.ScanningTime = timestamp;
|
||||||
|
string[] paramlist = new string[] {
|
||||||
returndata.Weight.ToString(),returndata.trash,returndata.type.ToString(),returndata.ScanningTime.ToString(),returndata.status.ToString()
|
returndata.Weight.ToString(),returndata.trash,returndata.type.ToString(),returndata.ScanningTime.ToString(),returndata.status.ToString()
|
||||||
};
|
};
|
||||||
returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
|
returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
|
||||||
_loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1);
|
_loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1);
|
||||||
return new ResultInfo(ResultState.SUCCESS, "success", returndata);
|
return new ResultInfo(ResultState.SUCCESS, "success", returndata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 16进制转汉字
|
/// 16进制转汉字
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue