using DotNetCore.CAP;
using Furion.DependencyInjection;
using Furion.DistributedIDGenerator;
using Mapster;
using Nirvana.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Waste.Application.SubscribeInfo;
using Waste.Domain;

namespace Waste.Application
{
    /// <summary>
    /// 投放记录管理
    /// </summary>
    public class ResultService : BaseInfoService, IResultService, ITransient
    {
        private readonly ISqlSugarRepository<W_Result> repository;
        private readonly SqlSugarClient dbClient;
        private readonly ILoggerService _loggerService;
        private readonly ICapPublisher _capBus;

        public ResultService(ISqlSugarRepository<W_Result> sqlSugarRepository, ILoggerService loggerService, ICapPublisher capPublisher)
        {
            repository = sqlSugarRepository;
            dbClient = repository.Context;
            _loggerService = loggerService;
            _capBus = capPublisher;
        }

        /// <summary>
        /// 获取投放记录
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        [WasteAuthorize]
        public async Task<PageParms<ResultList>> GetListAsync(QueryParams param)
        {
            RefAsync<int> totalnum = 0;
            var temquery = dbClient.Queryable<W_Result>();
            if (param.queryParam != null && param.queryParam.Count > 0)
            {
                List<IConditionalModel> conModels = new List<IConditionalModel>();
                param.queryParam.ForEach(x =>
                {
                    var val = x.Value.ToStrEmpty();
                    if (!string.IsNullOrEmpty(val))
                    {
                        if (x.Name.ToStr().ToLower() == "facecode")
                        {
                            temquery = temquery.Where(t => SqlFunc.Subqueryable<W_Device>().Where(e => e.FacEcode.Contains(val) && t.DeviceId == e.Id).Any());
                        }
                        else if (x.Name.ToStr().ToLower() == "name")
                        {
                            temquery = temquery.Where(t => SqlFunc.Subqueryable<W_Device>().Where(e => e.Name.Contains(val) && t.DeviceId == e.Id).Any());
                        }
                        else if (x.Name.Equals("poststatus", StringComparison.OrdinalIgnoreCase))
                        {
                            var status = val.ToInt();
                            if (status >= 0)
                            {
                                temquery = temquery.Where(t => SqlFunc.Subqueryable<W_ResultExt>().Where(e => e.Status == status && t.Id == e.ResultId).Any());
                            }
                            else
                            {
                                temquery = temquery.Where(t => SqlFunc.Subqueryable<W_ResultExt>().Where(e => t.Id == e.ResultId).NotAny());
                            }
                        }
                        else
                        {
                            conModels.Add(new ConditionalModel()
                            {
                                FieldName = x.Name,
                                ConditionalType = (ConditionalType)x.Type,
                                FieldValue = val
                            });
                        }
                    }
                });
                if (conModels.Count > 0)
                {
                    temquery = temquery.Where(conModels);
                }
            }
            //针对非平台类型,则可以查看下面所有的子账户设备
            if (currentUser.AccountType != (int)AccountType.platform)
            {
                var sql = $"code like '{currentUser.BusinessCode}'+'%' and id = x.businessid";
                temquery = temquery.Where(x => SqlFunc.Subqueryable<W_Business>().Where(sql).Any());
            }
            string sorts = string.Format("{0} {1}", param.sort, param.order);
            var query = await temquery.OrderBy(sorts)
                .Select(x => new ResultList
                {
                    Id = x.Id,
                    BusinessId = x.BusinessId,
                    DeviceId = x.DeviceId,
                    WasteType = x.WasteType,
                    Tare = x.Tare,
                    GrossWeight = x.GrossWeight,
                    NetWeight = x.NetWeight,
                    Registration = x.Registration,
                    CreateTime = x.CreateTime,
                    PostStatus = -1
                })
                .Mapper((it, cache) =>
                {
                    var allbus = cache.Get(list =>
                    {
                        var ids = list.Where(e => e.BusinessId != Guid.Empty).Select(e => e.BusinessId).ToList();
                        return dbClient.Queryable<W_Business>().Where(e => ids.Contains(e.Id)).ToList();
                    });
                    it.BusinessName = allbus.FirstOrDefault(e => e.Id == it.BusinessId)?.Name;
                    var alldev = cache.Get(list =>
                    {
                        var ids = list.Where(e => e.DeviceId != Guid.Empty).Select(e => e.DeviceId).ToList();
                        return dbClient.Queryable<W_Device>().Where(e => ids.Contains(e.Id)).ToList();
                    });
                    var dev = alldev.FirstOrDefault(e => e.Id == it.DeviceId);
                    if (dev != null)
                    {
                        it.DeviceName = dev.Name;
                        it.DeviceFacEcode = dev.FacEcode;
                        it.DeviceEcode = dev.Ecode;
                        it.DeviceAddress = dev.Address;
                    }
                    var allres = cache.Get(list =>
                   {
                       var ids = list.Select(e => e.Id).ToList();
                       return dbClient.Queryable<W_ResultExt>().Where(e => ids.Contains(e.ResultId)).ToList();
                   });
                    var res = allres.FirstOrDefault(e => e.ResultId == it.Id);
                    if (res != null)
                    {
                        it.PostStatus = res.Status;
                    }
                    var allext = cache.Get(list =>
                    {
                        var ids = list.Select(e => e.Id).ToList();
                        return dbClient.Queryable<W_MeasureResult>().Where(e => ids.Contains(e.ResultId)).ToList();
                    });
                    var ext = allext.FirstOrDefault(e => e.ResultId == it.Id);
                    it.WasteType = /*ext != null && !ext.WasteSType.IsEmpty() ? $"{ext.WasteSType}【{it.WasteType}】" :*/ it.WasteType;
                    it.Measure_WasteSType = ext?.WasteSType;
                    it.Measure_Price = ext?.Price;
                    it.Measure_Amount = ext?.Amount;
                    it.Measure_OpUser = ext?.OpUser;
                    it.Measure_UUID = ext?.UUID;
                    if (string.IsNullOrWhiteSpace(it.Registration))
                    {
                        it.Registration = ext?.Registration;
                    }
                    it.ID1 = ext?.ID1;
                    it.ID2 = ext?.ID2;
                    it.ID3 = ext?.ID3;
                    it.ID4 = ext?.ID4;
                    it.ID5 = ext?.ID5;
                    it.ID6 = ext?.ID6;
                    it.ID7 = ext?.ID7;
                    it.ID8 = ext?.ID8;
                })
                 .ToPageListAsync(param.offset, param.limit, totalnum);
            return new PageParms<ResultList>
            {
                page = param.offset,
                Items = query,
                totalnum = totalnum,
                limit = param.limit
            };
        }

        /// <summary>
        /// 查询历史投放记录
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<PageParms<ResultListByEquS2CDto>> GetListByEquAsync(ResultListByEquC2SDto input)
        {
            RefAsync<int> totalnum = 0;
            Expression<Func<W_Result, bool>> exp = Expressionable.Create<W_Result>().AndIF(input.StartTime.HasValue, x => x.CreateTime >= input.StartTime).AndIF(input.EndTime.HasValue, x => x.CreateTime <= input.EndTime).And(x => x.DeviceId == input.DeviceId).ToExpression();
            var query = await dbClient.Queryable<W_Result>()
                .Where(exp)
                .OrderBy(x => x.CreateTime, OrderByType.Desc)
                .Select(x => new ResultListByEquS2SDto
                {
                    CreateTime = x.CreateTime,
                    Id = x.Id,
                    TrashCode = x.Registration,
                    WasteType = x.WasteType,
                    GrossWeight = x.GrossWeight
                })
                .Mapper((it, cache) =>
                {
                    var allext = cache.Get(list =>
                    {
                        var ids = list.Select(x => x.Id).ToList();
                        return dbClient.Queryable<W_MeasureResult>().Where(e => ids.Contains(e.ResultId)).ToList();
                    });
                    var ext = allext.FirstOrDefault(x => x.ResultId == it.Id);
                    if (ext != null)
                    {
                        it.WasteSType = ext.WasteSType;
                    }
                })
                .ToPageListAsync(input.offset, input.limit, totalnum);
            var list = query.Adapt<List<ResultListByEquS2CDto>>();
            return new PageParms<ResultListByEquS2CDto>
            {
                page = input.offset,
                Items = list,
                totalnum = totalnum,
                limit = input.limit
            };
        }

        /// <summary>
        /// wifi模块测量结果增加
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task InsertResultByWifiAsync(WifiPackage data)
        {
            //查找设备
            var device = await dbClient.Queryable<W_Device>().FirstAsync(x => data.sn == x.Ecode);
            // _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
            if (device == null)
            {
                //记录日志
                _loggerService.AddLogger($"设备未找到,参数:{data.ToJson()}", 3);
                return;
            }
            //计算净重,毛重-皮重=净重，如果净重小于等于0则不上报保存
            decimal weight = (data.Weight.ToDecimal() - device.Tare).ToDecimal(2);
            if (weight <= 0)
            {
                //记录日志
                _loggerService.AddLogger($"净重为0不上报,参数:{data.ToJson()}", 3);
                return;
            }
            var devicedata = await dbClient.Queryable<W_DeviceData>().FirstAsync(x => x.DeviceId == device.Id);
            var resultid = IDGen.NextID();
            DateTime time = DateTime.Now;
            //检查设备是否为今天第一次上报
            bool isfrist = false;
            if (device.LastHeartTime.HasValue && device.LastHeartTime.Value.Date != DateTime.Now.Date)
            {
                isfrist = true;
            }
            decimal currentweight = data.Weight.IsEmpty() ? 0 : data.Weight.ToDecimal();
            //记录数据
            await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("Proc_InsertResult", new
            {
                deviceid = device.Id,
                businessid = device.Businessid,
                resultid = resultid,
                imei = devicedata != null ? devicedata.IMSI : "",
                iccid = devicedata != null ? devicedata.ICCID : "",
                imsi = devicedata != null ? devicedata.IMSI : "",
                time = time,
                latitude = "",
                longitude = "",
                sign = "",
                city = "",
                area = data.trashcode,
                wastetype = data.WasteType,
                weigth = currentweight,
                isheart = data.IsHeart,
                tare = device.Tare,
                isfrist = isfrist
            });
            if (!data.IsHeart)
            {
                await SendMessageToThird(new SendThirdMessageSubscribeS2SDto
                {
                    DeviceId = device.Id,
                    Time = time,
                    TrashCode = data.trashcode,
                    WasteType = data.WasteType,
                    Weight = currentweight,
                    faccode = device.FacEcode,
                    ecode = device.Ecode,
                    province = device.Province,
                    city = device.City,
                    area = device.Area,
                    address = device.Address
                });
            }
        }

        /// <summary>
        /// 新的4G模块测量结果增加
        /// </summary>
        /// <param name="myPackage"></param>
        /// <returns></returns>
        public async Task InsertResultBy4GAsync(nMyPackage myPackage)
        {
            //查找设备
            var device = await dbClient.Queryable<W_Device>().FirstAsync(x => myPackage.IMEI == x.Ecode);
            // _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
            if (device == null)
            {
                //记录日志
                _loggerService.AddLogger($"设备未找到,参数:{myPackage.ToJson()}", 3);
                return;
            }
            var devicedata = await dbClient.Queryable<W_DeviceData>().FirstAsync(x => x.DeviceId == device.Id);
            var resultid = IDGen.NextID();
            DateTime time = DateTime.Now;
            if (myPackage.IsHeart)
            {
                if (string.IsNullOrEmpty(myPackage.Longitude) || myPackage.Longitude.ToDecimal() == 0) myPackage.Longitude = devicedata != null ? devicedata.Longitude : "0";
                if (string.IsNullOrEmpty(myPackage.Latitude) || myPackage.Latitude.ToDecimal() == 0) myPackage.Latitude = devicedata != null ? devicedata.Latitude : "0";
            }
            else
            {
                if (string.IsNullOrEmpty(myPackage.IMSI)) myPackage.IMSI = devicedata != null ? devicedata.IMSI : "";
                if (string.IsNullOrEmpty(myPackage.IMEI)) myPackage.IMEI = devicedata != null ? devicedata.IMEI : "";
                if (string.IsNullOrEmpty(myPackage.ICCID)) myPackage.ICCID = devicedata != null ? devicedata.ICCID : "";
                if (!string.IsNullOrEmpty(myPackage.Time) && myPackage.Time.Length == 14)
                {
                    time = $"{myPackage.Time.Substring(0, 4)}-{myPackage.Time.Substring(4, 2)}-{myPackage.Time.Substring(6, 2)} {myPackage.Time.Substring(8, 2)}:{myPackage.Time.Substring(10, 2)}:{myPackage.Time.Substring(12, 2)}".ToDate();
                }
            }
            //检查设备是否为今天第一次上报
            bool isfrist = false;
            if (device.LastHeartTime.HasValue && device.LastHeartTime.Value.Date != DateTime.Now.Date)
            {
                isfrist = true;
            }
            var Weight = myPackage.Weight.IsEmpty() ? 0 : myPackage.Weight.ToDecimal();
            //记录数据
            await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("Proc_InsertResult", new
            {
                deviceid = device.Id,
                businessid = device.Businessid,
                resultid = resultid,
                imei = myPackage.IMEI,
                iccid = myPackage.ICCID,
                imsi = myPackage.IMSI,
                time = time,
                latitude = myPackage.Latitude,
                longitude = myPackage.Longitude,
                sign = myPackage.GSLQ,
                city = "",
                area = myPackage.trashcode,
                wastetype = myPackage.WasteType,
                weigth = Weight,
                isheart = myPackage.IsHeart,
                tare = device.Tare,
                isfrist = isfrist
            });
            if (!myPackage.IsHeart)
            {
                await SendMessageToThird(new SendThirdMessageSubscribeS2SDto
                {
                    DeviceId = device.Id,
                    Time = time,
                    TrashCode = myPackage.trashcode,
                    WasteType = myPackage.WasteType,
                    Weight = Weight,
                    faccode = device.FacEcode,
                    ecode = device.Ecode,
                    province = device.Province,
                    city = device.City,
                    area = device.Area,
                    address = device.Address
                });
            }
        }

        /// <summary>
        /// 新的A8 4G模块测量结果增加
        /// </summary>
        /// <param name="myPackage"></param>
        /// <returns></returns>
        public async Task InsertResultByA84GAsync(A8MyPackage myPackage)
        {
            //如果uuid不为空,并且以存在记录,则忽略
            //if (!myPackage.IsHeart && !myPackage.UUID.IsEmpty() && await dbClient.Queryable<W_MeasureResult>().AnyAsync(x => x.UUID == myPackage.UUID))
            //{
            //    _loggerService.AddLogger($"A8记录重复,内容:{myPackage.ToJson()}", 1);
            //    return;
            //}
            //查找设备
            var device = await dbClient.Queryable<W_Device>().FirstAsync(x => myPackage.IMEI == x.Ecode);
            // _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
            if (device == null)
            {
                //记录日志
                _loggerService.AddLogger($"设备未找到,参数:{myPackage.ToJson()}", 3);
                return;
            }
            var devicedata = await dbClient.Queryable<W_DeviceData>().FirstAsync(x => x.DeviceId == device.Id);
            var resultid = IDGen.NextID();
            DateTime time = DateTime.Now;
            if (myPackage.IsHeart)
            {
                if (string.IsNullOrEmpty(myPackage.Longitude) || myPackage.Longitude.ToDecimal() == 0) myPackage.Longitude = devicedata != null ? devicedata.Longitude : "0";
                if (string.IsNullOrEmpty(myPackage.Latitude) || myPackage.Latitude.ToDecimal() == 0) myPackage.Latitude = devicedata != null ? devicedata.Latitude : "0";
            }
            else
            {
                if (string.IsNullOrEmpty(myPackage.IMSI)) myPackage.IMSI = devicedata != null ? devicedata.IMSI : "";
                if (string.IsNullOrEmpty(myPackage.IMEI)) myPackage.IMEI = devicedata != null ? devicedata.IMEI : "";
                if (string.IsNullOrEmpty(myPackage.ICCID)) myPackage.ICCID = devicedata != null ? devicedata.ICCID : "";
                if (!string.IsNullOrEmpty(myPackage.Time) && myPackage.Time.Length == 14)
                {
                    time = $"{myPackage.Time.Substring(0, 4)}-{myPackage.Time.Substring(4, 2)}-{myPackage.Time.Substring(6, 2)} {myPackage.Time.Substring(8, 2)}:{myPackage.Time.Substring(10, 2)}:{myPackage.Time.Substring(12, 2)}".ToDate();
                }
            }
            //检查设备是否为今天第一次上报
            bool isfrist = false;
            if (device.LastHeartTime.HasValue && device.LastHeartTime.Value.Date != DateTime.Now.Date)
            {
                isfrist = true;
            }
            var Weight = myPackage.Weight.IsEmpty() ? 0 : myPackage.Weight.ToDecimal();
            decimal price = myPackage.Price.IsEmpty() ? 0 : myPackage.Price.ToDecimal();
            decimal amount = myPackage.Amount.IsEmpty() ? 0 : myPackage.Amount.ToDecimal();
            string wastestype = myPackage.WasteSType.ToStr();
            //记录数据
            await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("Proc_InsertResult", new
            {
                deviceid = device.Id,
                businessid = device.Businessid,
                resultid = resultid,
                imei = myPackage.IMEI,
                iccid = myPackage.ICCID,
                imsi = myPackage.IMSI,
                time = time,
                latitude = myPackage.Latitude,
                longitude = myPackage.Longitude,
                sign = myPackage.GSLQ,
                city = "",
                area = myPackage.trashcode,
                wastetype = myPackage.WasteType,
                weigth = Weight,
                isheart = myPackage.IsHeart,
                tare = device.Tare,
                isfrist = isfrist
            });
            if (!myPackage.IsHeart)
            {
                //记录价格数据
                if (!myPackage.UUID.IsEmpty())
                {
                    await dbClient.Insertable(new W_MeasureResult
                    {
                        ResultId = resultid,
                        WasteSType = wastestype,
                        Amount = amount,
                        OpUser = myPackage.OpUser.ToStr(),
                        Price = price,
                        UUID = myPackage.UUID,

                        DeviceFacEcode = myPackage.DeviceFacEcode,
                        Registration = myPackage.Registration,
                        GrossWeight = myPackage.GrossWeight,
                        Tare = myPackage.Tare,
                        NetWeight = myPackage.NetWeight,

                        ID1 = myPackage.ID1,
                        ID2 = myPackage.ID2,
                        ID3 = myPackage.ID3,
                        ID4 = myPackage.ID4,
                        ID5 = myPackage.ID5,
                        ID6 = myPackage.ID6,
                        ID7 = myPackage.ID7,
                        ID8 = myPackage.ID8,

                        CreatedTime = DateTime.Now,
                        DataHash = myPackage.DataHash
                    }).ExecuteCommandAsync();
                }
                await SendMessageToThird(new SendThirdMessageSubscribeS2SDto
                {
                    DeviceId = device.Id,
                    Time = time,
                    TrashCode = myPackage.trashcode,
                    WasteType = myPackage.WasteType,
                    Weight = Weight,
                    WasteSType = wastestype,
                    faccode = device.FacEcode,
                    ecode = device.Ecode,
                    province = device.Province,
                    city = device.City,
                    area = device.Area,
                    address = device.Address
                });
            }
        }

        /// <summary>
        /// 给第三方推送消息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task SendMessageToThird(SendThirdMessageSubscribeS2SDto input)
        {
            if (input.Weight <= 0)
            {
                return;
            }
            var configdata = await dbClient.Queryable<W_DeviceConfig>().Where(x => x.DeviceId == input.DeviceId).Select(x => new W_DeviceConfig
            {
                Body = x.Body,
                Url = x.Url
            }).FirstAsync();
            if (configdata != null && !configdata.Url.IsEmpty())
            {
                var senddata = input.Adapt<SendThirdMessageSubscriDto>();
                senddata.Body = configdata.Body.ToStr();
                senddata.Url = configdata.Url.ToStr();
                await _capBus.PublishAsync("third.service.sendmessage", senddata);
            }
        }

        /// <summary>
        /// 增加测量记录
        /// </summary>
        /// <param name="myPackage"></param>
        /// <returns></returns>
        public async Task<ResultInfo> InsertResultAsync(MyPackage myPackage)
        {
            //查找设备
            var device = await dbClient.Queryable<W_Device>().FirstAsync(x => myPackage.IMEI == x.Ecode);
            // _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
            if (device == null)
            {
                //记录日志
                _loggerService.AddLogger($"设备未找到,参数:{myPackage.ToJson()}", 3);
                return new ResultInfo(ResultState.FAIL, "设备未找到");
            }
            var devicedata = await dbClient.Queryable<W_DeviceData>().FirstAsync(x => x.DeviceId == device.Id);
            var resultid = IDGen.NextID();
            DateTime time = DateTime.Now;
            if (myPackage.IsHeart)
            {
                if (string.IsNullOrEmpty(myPackage.Longitude) || myPackage.Longitude.ToDecimal() == 0) myPackage.Longitude = devicedata != null ? devicedata.Longitude : "0";
                if (string.IsNullOrEmpty(myPackage.Latitude) || myPackage.Latitude.ToDecimal() == 0) myPackage.Latitude = devicedata != null ? devicedata.Latitude : "0";
            }
            else
            {
                if (string.IsNullOrEmpty(myPackage.IMSI)) myPackage.IMSI = devicedata != null ? devicedata.IMSI : "";
                if (string.IsNullOrEmpty(myPackage.IMEI)) myPackage.IMEI = devicedata != null ? devicedata.IMEI : "";
                if (string.IsNullOrEmpty(myPackage.ICCID)) myPackage.ICCID = devicedata != null ? devicedata.ICCID : "";
                if (!string.IsNullOrEmpty(myPackage.Time) && myPackage.Time.Length == 14)
                {
                    time = $"{myPackage.Time.Substring(0, 4)}-{myPackage.Time.Substring(4, 2)}-{myPackage.Time.Substring(6, 2)} {myPackage.Time.Substring(8, 2)}:{myPackage.Time.Substring(10, 2)}:{myPackage.Time.Substring(12, 2)}".ToDate();
                }
            }
            //检查设备是否为今天第一次上报
            bool isfrist = false;
            if (device.LastHeartTime.HasValue && device.LastHeartTime.Value.Date != DateTime.Now.Date)
            {
                isfrist = true;
            }

            if (myPackage.IsChecked && !string.IsNullOrEmpty(myPackage.Area) && myPackage.Area.Length > 0)
            {
                //新的协议中此字段为垃圾桶编号
                var areaBytes = Encoding.Default.GetBytes(myPackage.Area);
                //长度为5个字节,后三位为垃圾桶编号(16进制)
                if (areaBytes.Length == 5)
                {
                    var typeBytes = new byte[3];
                    for (var i = 0; i < 3; i++)
                    {
                        typeBytes[i] = areaBytes[i + 2];
                    }
                    var typeHex = Convert.ToHexString(typeBytes);
                    myPackage.Area = Convert.ToInt32(typeHex, 16).ToString();
                }
                //000F000002.16进制
                //  var areaHex = Convert.ToHexString(areaBytes);
            }
            decimal weight = myPackage.Weight.IsEmpty() ? 0 : myPackage.Weight.ToDecimal();
            //记录数据
            await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("Proc_InsertResult", new
            {
                deviceid = device.Id,
                businessid = device.Businessid,
                resultid = resultid,
                imei = myPackage.IMEI,
                iccid = myPackage.ICCID,
                imsi = myPackage.IMSI,
                time = time,
                latitude = myPackage.Latitude,
                longitude = myPackage.Longitude,
                sign = myPackage.GSLQ,
                city = myPackage.City,
                area = myPackage.Area,
                wastetype = myPackage.WasteType,
                weigth = weight,
                isheart = myPackage.IsHeart,
                tare = device.Tare,
                isfrist = isfrist
            });
            //上传垃圾数据
            //if (myPackage.IsWeight && myPackage.Weight.ToDecimal() > 0)
            //{
            //    var devicesecret = await repository.Change<W_SZDevice>().Context.Queryable<W_SZDevice>().FirstAsync(x => x.DeviceId == device.Id);
            //    if (devicesecret != null && !string.IsNullOrEmpty(devicesecret.Secret)
            //        && !string.IsNullOrEmpty(devicesecret.SecretHash)
            //        && !string.IsNullOrEmpty(devicesecret.DevId))
            //    {
            //        int timestamp = GetTimestamp(time);
            //        await _suZhouService.PostGarbagesAsync(new GarbagePltC2SDto
            //        {
            //            Weight = myPackage.Weight.ToDouble(),
            //            secret = devicesecret.Secret,
            //            secrethash = devicesecret.SecretHash,
            //            ScanningTime = timestamp,
            //            DStatus = 0,
            //            deviceid = devicesecret.DevId,
            //            Trash = myPackage.Area,
            //            Type = TrashType(myPackage.WasteType)
            //        });
            //    }
            //}
            if (!myPackage.IsHeart)
            {
                await SendMessageToThird(new SendThirdMessageSubscribeS2SDto
                {
                    DeviceId = device.Id,
                    Time = time,
                    TrashCode = myPackage.Area,
                    WasteType = myPackage.WasteType,
                    Weight = weight,
                    faccode = device.FacEcode,
                    ecode = device.Ecode,
                    province = device.Province,
                    city = device.City,
                    area = device.Area,
                    address = device.Address
                });
            }
            return new ResultInfo(ResultState.SUCCESS, "success");
        }

        /// <summary>
        /// byte转int
        /// </summary>
        /// <param name="bt"></param>
        /// <returns></returns>
        private static int ByteToInt(byte bt)
        {
            return Convert.ToInt32(((int)bt).ToString("X2"), 16);
        }

        private static int GetTimestamp(DateTime time)
        {
            DateTime dateTimeStart = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0));
            int timestamp = Convert.ToInt32((time - dateTimeStart).TotalSeconds);
            return timestamp;
        }

        private int TrashType(string type)
        {
            if (type == "厨余垃圾") return 1;
            else if (type == "可回收物") return 2;
            else if (type == "有害垃圾") return 3;
            else if (type == "其他垃圾") return 4;
            else return 0;
        }
    }
}