using BPA.KitChen.GroupMeal.Application.BaseDto;
using BPA.KitChen.GroupMeal.Application.Service.OneCard.Gate;
using BPA.KitChen.GroupMeal.Core.Entity;
using BPA.KitChen.GroupMeal.SqlSugar;
using BPA.Message;
using BPA.Message.API请求;
using BPA.Message.IOT;
using BPA.SAAS.KitChenManage.Application.Device.Dtos;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Furion.LinqBuilder;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting;
using MQTTnet;
using MQTTnet.Client;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Json;
using System.Text;
using System.Threading.Tasks;
namespace BPA.KitChen.GroupMeal.Application.Service.Device.Services
{
[ApiDescriptionSettings("设备下发", Tag = "设备下发", SplitCamelCase = false)]
public class DevicePushRecodeService: IDynamicApiController, ITransient, IDevicePushRecodeService
{
private readonly SqlSugarScope _db;
private readonly IMqttClient _mqttClient;
public DevicePushRecodeService(ISqlSugarClient db, IMqttClient mqttClient)
{
_db = SqlSugarDb.Db;
_mqttClient=mqttClient;
}
///
/// 分页
///
///
///
[HttpPost("/api/devicepushrecode/page")]
public async Task Page(DevicePushRecodeDtoPageInput input)
{
RefAsync total = 0;
var res = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.DeviceName),x=>x.DeviceName.Contains(input.DeviceName))
.Where(x=>x.Type== input.Type)
.Select(t => new
{
CreateAt = t.CreateAt,
CreateBy = t.CreateBy,
Id = t.Id,
DeviceId = t.DeviceId,
DeviceName= t.DeviceName,
Type =t.Type,
Topic=t.Topic,
DataResore=t.DataResore,
}).OrderBy(x => x.CreateAt, OrderByType.Desc).ToPageListAsync(input.Current, input.PageSize, total);
PageUtil util = new PageUtil()
{
Total = total,
Data = res
};
return util;
}
///
/// 添加
///
///
///
[HttpPost("/api/devicepushrecode/add")]
public async Task Add(DevicePushRecodeDtoInput input)
{
var data = input.Adapt();
string Topic = GetTopic(input.Type, input.DeviceAutoKey.ToString());
if (string.IsNullOrEmpty(Topic)) throw Oops.Oh("请配置相关topic");
data.Topic= Topic;
data.DataResore = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(input.Data.ToString()));
var res = await Push(Topic, new PushData() { Data = input.Data, DeviceId = input.DeviceAutoKey });
if (res)
{
await _db.Insertable(data).CallEntityMethod(t => t.Create()).ExecuteCommandAsync();
}
return res;
}
///
/// 删除
///
///
///
[HttpPost("/api/devicepushrecode/delete")]
public async Task Delete(List input)
{
try
{
// 查询数据库中是否存在未删除的活动信息
var resEntitites = _db.Queryable().In(input).ToList();
var res = await _db.Deleteable(resEntitites).ExecuteCommandAsync();
return res > 0;
}
catch (Exception)
{
throw Oops.Oh("删除失败");
}
}
private async Task Push(string Topic, PushData data)
{
try
{
// Topic = TOPIC.GetInstance.GetBusinessTopic(x, storeInfo.FirstOrDefault(a => a.Id == item.OrgId).AutoKey) + "/" + item.AutoKey;
BPAPackage bPAPackage = new BPAPackage
{
MessageId = MessageID.TMC_PUSH_INGREDIENTS,
ClientId = data.DeviceId,
//ClientType = Procuct
MessageVersion = 0x30,
Timestamp = DateTime.Now,
Message = data
};
//每次下发暂停200毫秒 by 王刚 2022-06-08 测试提出修改
// Thread.Sleep(200);
string aa = bPAPackage.Serialize(false);
var thisData = new
{
MessageId = MessageID.TMC_PUSH_INGREDIENTS,
ClientId = data.DeviceId,
//ClientType = Procuct
MessageVersion = 0x30,
Timestamp = DateTime.Now,
Message = data.Data.ToString()
};
var applictionmessage = new MqttApplicationMessageBuilder()
.WithTopic(Topic)
.WithPayload(JsonConvert.SerializeObject(thisData))
.WithAtLeastOnceQoS().Build();
await _mqttClient.PublishAsync(applictionmessage);
return true;
}
catch (Exception e)
{
throw Oops.Oh("下发错误,错误信息:"+e.Message);
}
}
private string GetTopic(int type,string deviceKey)
{
string topic = "";
switch (type)
{
case 1: //商品下发
topic = $"/da4bfff042c656210/${deviceKey}/use/goodspush";
break;
case 2://物料下发
topic = $"/da4bfff042c656210/${deviceKey}/use/batvhingpush";
break;
case 4:
topic = $"/da4bfff042c656210/${deviceKey}/use/chnologypush";
break;
}
return topic;
}
}
}