diff --git a/Waste.Application/ThirdApiInfo/OpenService.cs b/Waste.Application/ThirdApiInfo/OpenService.cs index f1f98c1..cac7ef9 100644 --- a/Waste.Application/ThirdApiInfo/OpenService.cs +++ b/Waste.Application/ThirdApiInfo/OpenService.cs @@ -55,106 +55,155 @@ namespace Waste.Application.ThirdApiInfo /// public async Task GetDevInfoAsync(GetDevInfoRequestDto data) { + //更新上报记录结果 - var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode); - if (device == null) + Guid resultid = Guid.Empty; + //这里进行去重处理 + if (!string.IsNullOrEmpty(data.ResultId) && Guid.TryParse(data.ResultId, out resultid)) { - return new ResultInfo(ResultState.FAIL, "设备未找到"); - } - 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().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) + var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode); + if (device == null) { - _loggerService.AddLogger($"{data.ECode},{device.Name},重量小于等于0:{returndata.ToJson()}", 1); - return new ResultInfo(ResultState.FAIL, "无效的重量"); + return new ResultInfo(ResultState.FAIL, "设备未找到"); } - //检查是否为15分钟内第一次上报 - //如果是巴城的设备则不使用这个限制 - if(device.Businessid != Guid.Parse("39FCB9DE-404E-68F5-384B-EE2462EAB87C")) + var devicesecret = await dbClient.Queryable().FirstAsync(x => x.DeviceId == device.Id); + if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret) + || string.IsNullOrEmpty(devicesecret.SecretHash) + || string.IsNullOrEmpty(devicesecret.DevId)) { - var time15 = DateTime.Now.AddMinutes(-15); - if (await dbClient.Queryable().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分钟内同一垃圾桶编号上报"); - } + return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息"); } - 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 + int timestamp = _suZhouService.GetUTCTimestamp(); + int noncestr = _suZhouService.GetNonce(); + var result = await dbClient.Queryable().FirstAsync(x => x.Id == resultid); + if (result == null) { - 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 - }); + return new ResultInfo(ResultState.SUCCESS, "记录id未找到"); + } + var returndata = new GetDevInfoResponseDto + { + DeviceId = devicesecret.DevId, + noncestr = noncestr, + timestamp = timestamp, + Secret = devicesecret.Secret, + SecretHash = devicesecret.SecretHash, + UserId = UserId, + PostUrl = ApiUrl, + ScanningTime = timestamp, + ResultId = resultid, + 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 { - _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[] { + var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode); + if (device == null) + { + return new ResultInfo(ResultState.FAIL, "设备未找到"); + } + 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().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().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.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist); - _loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1); - return new ResultInfo(ResultState.SUCCESS, "success", returndata); + returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist); + _loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1); + return new ResultInfo(ResultState.SUCCESS, "success", returndata); + } } /// /// 16进制转汉字