zhaoy 8 місяці тому
джерело
коміт
76c8dcd65d
18 змінених файлів з 445 додано та 93 видалено
  1. +1
    -0
      BPA.SAAS.KitChenManage.Application/BPA.SAAS.KitChenManage.Application.csproj
  2. +75
    -0
      BPA.SAAS.KitChenManage.Application/BPA.SAAS.KitChenManage.Application.xml
  3. +105
    -75
      BPA.SAAS.KitChenManage.Application/Device/Services/DevicePushRecodeService.cs
  4. +22
    -12
      BPA.SAAS.KitChenManage.Application/Push/Comm/CommDefaultHandle.cs
  5. +15
    -0
      BPA.SAAS.KitChenManage.Application/Push/Comm/Dto/BaseParmDto.cs
  6. +103
    -0
      BPA.SAAS.KitChenManage.Application/Push/Comm/MqttServer.cs
  7. +34
    -0
      BPA.SAAS.KitChenManage.Application/Push/Comm/WorkTask.cs
  8. +33
    -0
      BPA.SAAS.KitChenManage.Application/Push/奶茶机_V1/ProductFunctionData.cs
  9. +15
    -0
      BPA.SAAS.KitChenManage.Application/Push/奶茶机_v1/Dto/ReplyBaseDto.cs
  10. +1
    -0
      BPA.SAAS.KitChenManage.Application/Store/Services/IStoreService.cs
  11. +19
    -0
      BPA.SAAS.KitChenManage.Application/Store/Services/StoreService.cs
  12. +9
    -0
      BPA.SAAS.KitChenManage.Application/Store/StoreServices.cs
  13. +3
    -3
      BPA.SAAS.KitChenManage.Core/BPA.SAAS.KitChenManage.Core.csproj
  14. +1
    -1
      BPA.SAAS.KitChenManage.Core/BPA.SAAS.KitChenManage.Core.xml
  15. +1
    -1
      BPA.SAAS.KitChenManage.Core/DbContext.cs
  16. +5
    -1
      BPA.SAAS.KitChenManage.Core/Model/BPA_DevicePushRecode.cs
  17. +1
    -0
      BPA.SAAS.KitChenManage.Web.Core/BPA.SAAS.KitChenManage.Web.Core.csproj
  18. +2
    -0
      BPA.SAAS.KitChenManage.Web.Core/Startup.cs

+ 1
- 0
BPA.SAAS.KitChenManage.Application/BPA.SAAS.KitChenManage.Application.csproj Переглянути файл

@@ -19,6 +19,7 @@
<ItemGroup>
<PackageReference Include="BPA.Message" Version="1.0.105" />
<PackageReference Include="BPA.MQTTClient" Version="1.0.11" />
<PackageReference Include="Longbow.Tasks" Version="8.0.0" />
</ItemGroup>

<ItemGroup>


+ 75
- 0
BPA.SAAS.KitChenManage.Application/BPA.SAAS.KitChenManage.Application.xml Переглянути файл

@@ -161,6 +161,14 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Device.Services.DevicePushRecodeService.CallBackDevicePushRecode(System.String,System.String)">
<summary>
数据下发回调更新数据
</summary>
<param name="messageId"></param>
<param name="groupId"></param>
<returns></returns>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Device.Services.DevicePushRecodeService.Delete(System.Collections.Generic.List{System.String})">
<summary>
删除
@@ -457,11 +465,72 @@
属性值
</summary>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Push.Comm.MqttServer.Publish(System.String,BPA.SAAS.KitChenManage.Application.Device.Dtos.PushData,System.Int32)">
<summary>
发布mq(发送数据)
</summary>
<param name="Topic"></param>
<param name="data"></param>
<param name="MessageId"></param>
<returns></returns>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Push.Comm.MqttServer.Subscribe(System.String)">
<summary>
订阅,mq
</summary>
<param name="topic"></param>
<returns></returns>
</member>
<member name="T:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData">
<summary>
产品下发数据格式定义
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.BatchingPushTopics">
<summary>
物料下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.BatchingPushTopics_reply">
<summary>
响应物料下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.TechnologyPushTopics">
<summary>
工艺下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.TechnologyPushTopics_reply">
<summary>
响应工艺下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.GoodsPushTopics">
<summary>
商品下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.GoodsPushTopics_reply">
<summary>
响应商品下发topics
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.BatchingData">
<summary>
物料下发服务参数格式
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.GoodsData">
<summary>
商品下发服务参数格式
</summary>
</member>
<member name="F:BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.ProductFunctionData.TechnologyData">
<summary>
工艺下发服务参数格式
</summary>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Store.Services.IStoreService.Page(BPA.SAAS.KitChenManage.Application.Store.Dtos.StoreDtoPageInput)">
<summary>
分页
@@ -537,6 +606,12 @@
</summary>
<returns></returns>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Store.StoreServices.GetStoreList_alm">
<summary>
查询所有店铺(外部调用)
</summary>
<returns></returns>
</member>
<member name="M:BPA.SAAS.KitChenManage.Application.Store.StoreServices.Add(BPA.SAAS.KitChenManage.Application.Store.Dtos.StoreDtoInput)">
<summary>
添加


+ 105
- 75
BPA.SAAS.KitChenManage.Application/Device/Services/DevicePushRecodeService.cs Переглянути файл

@@ -2,23 +2,29 @@
using BPA.Message.IOT;
using BPA.SAAS.KitChenManage.Application.Device.Dtos;
using BPA.SAAS.KitChenManage.Application.Push.Comm;
using BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.Dto;
using BPA.SAAS.KitChenManage.Application.Store.Dtos;
using BPA.SAAS.KitChenManage.Comm.Const;
using BPA.SAAS.KitChenManage.Core.Base;
using BPA.SAAS.KitChenManage.Core.Model;
using Furion.LinqBuilder;
using Furion.RemoteRequest.Extensions;
using Longbow.Tasks;
using Microsoft.CodeAnalysis.Operations;
using Microsoft.Extensions.Hosting;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Subscribing;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Json;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using uPLibrary.Networking.M2Mqtt;

namespace BPA.SAAS.KitChenManage.Application.Device.Services
{
@@ -26,11 +32,13 @@ namespace BPA.SAAS.KitChenManage.Application.Device.Services
{
private readonly ISqlSugarClient _db;
private readonly IMqttClient _mqttClient;
CommDefaultHandle requestParmsHeadlen = new();
CommDefaultHandle commDefaultHandle = new();
MqttServer mqttServer;
public DevicePushRecodeService(ISqlSugarClient db, IMqttClient mqttClient)
{
_db = db;
_mqttClient=mqttClient;
mqttServer = new(mqttClient);
}
/// <summary>
/// 分页
@@ -55,6 +63,10 @@ namespace BPA.SAAS.KitChenManage.Application.Device.Services
DataResore=t.DataResore,
Status=t.Status,
Description=t.Description,
MessageId=t.MessageId,
TopicRely=t.TopicRely,
DataResoreRely=t.DataResoreRely,
DescriptionRely=t.DescriptionRely,
}).OrderBy(x => x.CreateAt, OrderByType.Desc).ToPageListAsync(input.Current, input.PageSize, total);
PageUtil util = new PageUtil()
{
@@ -71,55 +83,77 @@ namespace BPA.SAAS.KitChenManage.Application.Device.Services
/// <returns></returns>
public async Task<bool> Add(DevicePushRecodeDtoInput input)
{
var DataResore =await requestParmsHeadlen.GetParm(input.Type, input.Data.ToString(), input.DeviceId, input.ProductName, input.ProductVersion);
var data = input.Adapt<BPA_DevicePushRecode>();
string topstr = "";
string Topic = GetTopic(input.Type, input.DeviceAutoKey.ToString(), input.ProductVersion, input.ProductKey, out topstr);
var DataResore =await commDefaultHandle.GetParm(input.Type, input.Data.ToString(), input.DeviceId, input.ProductName, input.ProductVersion, input.DeviceAutoKey.ToString());
if(DataResore==null) throw Oops.Oh("解析参数失败");
string Topic = DataResore.TopicsStr;
if (string.IsNullOrEmpty(Topic)) throw Oops.Oh("请配置相关topic");
var maxmessageId=_db.Queryable<BPA_DevicePushRecode>().Max(x => x.MessageId);
int messageId = maxmessageId+1;
var groupId = App.User?.FindFirst(ClaimConst.GroupId)?.Value;
data.Topic= Topic;
data.Status = 1;
data.DataResore = JsonConvert.SerializeObject(DataResore);
data.Status = 0;
data.DataResore = JsonConvert.SerializeObject(DataResore.Data);
data.DeviceAutoKey= input.DeviceAutoKey;
data.Description = "成功";
if (input.TopicsData.Count > 0)
{
var chaeck = input.TopicsData.Any(x => x.Topics.Trim() == topstr.Trim());
if (!chaeck)
{
data.Status =2;
data.Description = "下发数据失败,该产品还未配置对应的topic,请联系管理员进行配置";
}
}
else
data.Description = "下发中,等待设备响应";
data.MessageId= messageId;
data.TopicRely = DataResore.TopicsStrRely;
data.DescriptionRely = "等待回调";
var respush = await mqttServer.Publish(Topic, new PushData() { Data = data.DataResore, DeviceId = input.DeviceAutoKey }, messageId);
if (respush != "success")
{
data.Description = respush;
data.Status = 2;
data.Description = "下发数据失败,该产品还未配置对应的topic,请联系管理员进行配置";
}
if (data.Status == 1)
{
var respush = await Push(Topic, new PushData() { Data = data.DataResore, DeviceId = input.DeviceAutoKey });
if (respush != "success")
{
data.Description = respush;
data.Status =2;
}
}
// return true;
var res = await _db.Insertable(data).CallEntityMethod(t => t.Create()).ExecuteCommandAsync();
//周期性任务 (10 秒后执行1次任务)
var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(10)).WithRepeatCount(1).Build();
TaskServicesManager.GetOrAdd(messageId.ToString(), async (provider, token) => {
await CallBackDevicePushRecode(messageId.ToString(), groupId);
}, trigger);
//订阅回复数据下发topics
await mqttServer.Subscribe(DataResore.TopicsStrRely);
await BindMqReceived(messageId.ToString(), groupId);
return res>0;
}
/// <summary>
/// 数据下发回调更新数据
/// </summary>
/// <param name="messageId"></param>
/// <param name="groupId"></param>
/// <returns></returns>
public async Task CallBackDevicePushRecode(string messageId,string groupId)
{
var model = await _db.Queryable<BPA_DevicePushRecode>().Where(x => x.MessageId.ToString() == messageId.ToString() && x.GroupId == groupId).FirstAsync();
if (model.Status == 0)
{
model.Status = 1;
model.Description = "下发成功,设备未回调";
model.DescriptionRely = "响应数据失败";
_db.Updateable(model).ExecuteCommand();
}
}
public async Task<bool> Update(string id)
{
var data = _db.Queryable<BPA_DevicePushRecode>().Where(x => x.Id == id).First();
data.Status = 1;
var respush = await Push(data.Topic, new PushData() { Data = data.DataResore, DeviceId = data.DeviceAutoKey });
var groupId = App.User?.FindFirst(ClaimConst.GroupId)?.Value;
data.Status = 0;
data.Description = "下发中,等待设备响应";
data.DescriptionRely = "等待回调";
data.DataResoreRely = "";
// data.MessageId= messageId;
var respush = await mqttServer.Publish(data.Topic, new PushData() { Data = data.DataResore, DeviceId = data.DeviceAutoKey }, data.MessageId);
if (respush!= "success")
{
data.Description = respush;
data.Status = 2;
}
var res = await _db.Updateable(data).ExecuteCommandAsync();
var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(10)).WithRepeatCount(1).Build();
TaskServicesManager.GetOrAdd(data.MessageId.ToString(), async (provider, token) => {
await CallBackDevicePushRecode(data.MessageId.ToString(), groupId);
}, trigger);
await BindMqReceived(data.MessageId.ToString(), groupId);
return res > 0;
}
/// <summary>
@@ -142,53 +176,49 @@ namespace BPA.SAAS.KitChenManage.Application.Device.Services
throw Oops.Oh("删除失败");
}
}
private async Task<string> Push(string Topic,PushData data)
private async Task BindMqReceived(string messageId,string groupId)
{
try
_mqttClient.UseApplicationMessageReceivedHandler(async e =>
{
// Topic = TOPIC.GetInstance.GetBusinessTopic(x, storeInfo.FirstOrDefault(a => a.Id == item.OrgId).AutoKey) + "/" + item.AutoKey;
BPAPackage bPAPackage = new BPAPackage
var model = await _db.Queryable<BPA_DevicePushRecode>().Where(x => x.MessageId.ToString() == messageId.ToString() && x.GroupId == groupId).FirstAsync();
if (model != null && model.Status == 0)
{
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 applictionmessage = new MqttApplicationMessageBuilder().WithTopic(Topic).WithPayload(bPAPackage.Serialize(false)).WithAtLeastOnceQoS().Build();
await _mqttClient.PublishAsync(applictionmessage);
return "success";
}
catch (Exception e)
{
return "下发错误,错误信息:" + e.Message;
}
}
private string GetTopic(int type,string deviceKey, string productVersion, string productKey,out string topstr )
{
string topic = "";
topstr = "";
switch (type)
{
case 1: //商品下发
topic = $"/{productKey}/{productVersion}/{deviceKey}/defaul/goodspush";
topstr = "/"+productKey+"/"+productVersion+"/${deviceKey}/defaul/goodspush";
break;
case 2://物料下发
topic = $"/{productKey}/{productVersion}/{deviceKey}/defaul/batvhingpush";
topstr = "/" + productKey + "/" + productVersion + "/${deviceKey}/defaul/batvhingpush";
break;
case 4:
topic = $"/{productKey}/{productVersion}/{deviceKey}/defaul/chnologypush";
topstr = "/" + productKey + "/" + productVersion + "/${deviceKey}/defaul/chnologypush";
break;
}
return topic;
var str = Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? Array.Empty<byte>()).Replace("\r", "").Replace("\n", "").Replace("\t", "");
model.DataResoreRely = str;
model.Description = "下发成功,设备已回调";
try
{
var re = JsonConvert.DeserializeObject<ReplyBaseDto>(str);
if (re.MessageId != messageId.ToString())
{
model = await _db.Queryable<BPA_DevicePushRecode>().Where(x => x.MessageId.ToString() == re.MessageId && x.GroupId == groupId).FirstAsync();
model.DataResoreRely = str;
model.Description = "下发成功,设备已回调";
}
if (model != null)
{
if (re.Success)
{
model.Status = 1;
model.DescriptionRely = "回调成功";
}
else
{
model.Status = 1;
model.DescriptionRely = re.Errors;
}
}
}
catch (Exception ex)
{
model.Status = 1;
model.Description = "下发成功";
model.DescriptionRely = "响应数据异常,异常信息:" + ex.Message;

}
_db.Updateable(model).ExecuteCommand();
}
});
}
}
}

+ 22
- 12
BPA.SAAS.KitChenManage.Application/Push/Comm/CommDefaultHandle.cs Переглянути файл

@@ -1,9 +1,9 @@
using BPA.Message;
using BPA.SAAS.KitChenManage.Application.Device.PushDto.ProductFunction;
using BPA.SAAS.KitChenManage.Application.Push.Comm.Dto;
using BPA.SAAS.KitChenManage.Application.Push.Comm.Dto.Batching;
using BPA.SAAS.KitChenManage.Application.Push.Comm.Dto.Goods;
using BPA.SAAS.KitChenManage.Application.Push.Comm.Dto.GoodsTechnology;
using BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1;
using BPA.SAAS.KitChenManage.Comm.Const;
using BPA.SAAS.KitChenManage.Core.Base;
using Furion.JsonSerialization;
@@ -25,28 +25,36 @@ namespace BPA.SAAS.KitChenManage.Application.Push.Comm
public class CommDefaultHandle
{
private string BaseServerUrl = App.GetConfig<string>("baseurl");
public async Task<dynamic> GetParm(int type, string data, string deviceId,string productName, string productVersion)
public async Task<BaseParmDto> GetParm(int type, string data, string deviceId,string productName, string productVersion, string deviceAutoKey)
{
string strTopics = "";
string TopicsStrRely = "";
dynamic obj = null;
switch (type)
{
case 1: //商品下发
var GoodsData = GetProduct_VersionData(productName, productVersion, "GoodsData");
if (string.IsNullOrWhiteSpace(GoodsData)) throw Oops.Oh("系统还未开发【产品名称:" + productName + "-版本号:" + productVersion + "】的商品数据下发功能");
var GoodsData = GetProduct_VersionData(productName, productVersion, "GoodsData"); ;//获取对应版本的下发数据参数
strTopics = GetProduct_VersionData(productName, productVersion, "GoodsPushTopics").Replace("${deviceKey}", deviceAutoKey); //获取对应版本的下发topics
TopicsStrRely = GetProduct_VersionData(productName, productVersion, "GoodsPushTopics_reply").Replace("${deviceKey}", deviceAutoKey);//获取对应版本的下发topics
if (string.IsNullOrWhiteSpace(GoodsData)) throw Oops.Oh("系统还未开发【产品名称:" + productName + " 版本号:" + productVersion + "】的商品数据下发功能");
obj = await GetGoods(data, GoodsData);
break;
case 2://物料下发
var BatchingData = GetProduct_VersionData(productName, productVersion, "BatchingData");
if (string.IsNullOrWhiteSpace(BatchingData)) throw Oops.Oh("系统还未开发【产品名称:"+ productName + "-版本号:"+ productVersion + "】的物料数据下发功能");
var BatchingData = GetProduct_VersionData(productName, productVersion, "BatchingData");//获取对应版本的下发数据参数
strTopics = GetProduct_VersionData(productName, productVersion, "BatchingPushTopics").Replace("${deviceKey}", deviceAutoKey);//获取对应版本的下发topics
TopicsStrRely= GetProduct_VersionData(productName, productVersion, "BatchingPushTopics_reply").Replace("${deviceKey}", deviceAutoKey);//获取对应版本的下发topics
if (string.IsNullOrWhiteSpace(BatchingData)) throw Oops.Oh("系统还未开发【产品名称:"+ productName + " 版本号:"+ productVersion + "】的物料数据下发功能");
obj = await GetBatching(data, BatchingData);
break;
case 4:
var TechnologyData = GetProduct_VersionData(productName, productVersion, "TechnologyData");
if (string.IsNullOrWhiteSpace(TechnologyData)) throw Oops.Oh("系统还未开发【产品名称:" + productName + "-版本号:" + productVersion + "】的工艺数据下发功能");
case 4://工艺下发
var TechnologyData = GetProduct_VersionData(productName, productVersion, "TechnologyData"); ;//获取对应版本的下发数据参数
strTopics = GetProduct_VersionData(productName, productVersion, "TechnologyPushTopics").Replace("${deviceKey}", deviceAutoKey);//获取对应版本的下发topics
TopicsStrRely = GetProduct_VersionData(productName, productVersion, "TechnologyPushTopics_reply").Replace("${deviceKey}", deviceAutoKey);//获取对应版本的下发topics
if (string.IsNullOrWhiteSpace(TechnologyData)) throw Oops.Oh("系统还未开发【产品名称:" + productName + " 版本号:" + productVersion + "】的工艺数据下发功能");
obj = await GetGoodsTechnology(data, deviceId, TechnologyData);
break;
}
return obj;
return new BaseParmDto() {Data= obj,TopicsStr= strTopics,TopicsStrRely= TopicsStrRely };
}
private async Task<dynamic> GetGoods(string data, string productFunctionData)
{
@@ -201,6 +209,7 @@ namespace BPA.SAAS.KitChenManage.Application.Push.Comm
}

}
/// <summary>
/// 映射数据
/// </summary>
@@ -266,8 +275,9 @@ namespace BPA.SAAS.KitChenManage.Application.Push.Comm
/// <returns></returns>
private string GetProduct_VersionData(string productName, string productVersion,string attrubiteName)
{
string namespaceName = "BPA.SAAS.KitChenManage.Application.Push."+ productName + "_"+ productVersion; // 要查询的命名空间名称
Assembly assembly = typeof(CommDefaultHandle).Assembly; // 当前程序集(或者其他需要查询的程序集)
//判断当前产品版本是否存在下发数据格式定义的类 如果存在则根据属性取出里面定义的数据格式
string namespaceName = "BPA.SAAS.KitChenManage.Application.Push."+ productName + "_"+ productVersion;
Assembly assembly = typeof(CommDefaultHandle).Assembly;
Type[] typesInNamespace = assembly.GetTypes().Where(t => t.Namespace == namespaceName).ToArray();
var value = "";
foreach (Type type in typesInNamespace)


+ 15
- 0
BPA.SAAS.KitChenManage.Application/Push/Comm/Dto/BaseParmDto.cs Переглянути файл

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPA.SAAS.KitChenManage.Application.Push.Comm.Dto
{
public class BaseParmDto
{
public dynamic Data { get; set; }
public string TopicsStr { get; set; }
public string TopicsStrRely { get; set; }
}
}

+ 103
- 0
BPA.SAAS.KitChenManage.Application/Push/Comm/MqttServer.cs Переглянути файл

@@ -0,0 +1,103 @@
using BPA.Message;
using BPA.SAAS.KitChenManage.Application.Device.Dtos;
using MQTTnet.Client.Subscribing;
using MQTTnet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MQTTnet.Client;
using uPLibrary.Networking.M2Mqtt;

namespace BPA.SAAS.KitChenManage.Application.Push.Comm
{
public class MqttServer
{
private readonly IMqttClient _mqttClient;
public MqttServer(IMqttClient mqttClient)
{
_mqttClient=mqttClient;
}
/// <summary>
/// 发布mq(发送数据)
/// </summary>
/// <param name="Topic"></param>
/// <param name="data"></param>
/// <param name="MessageId"></param>
/// <returns></returns>
public async Task<string> Publish(string Topic, PushData data, int MessageId)
{
try
{
if (string.IsNullOrEmpty(Topic))
{
throw Oops.Oh("订阅主题不能为空!");
}

// 判断客户端是否连接
if (!_mqttClient.IsConnected)
{
throw Oops.Oh("MQTT 客户端尚未连接!");
}

// Topic = TOPIC.GetInstance.GetBusinessTopic(x, storeInfo.FirstOrDefault(a => a.Id == item.OrgId).AutoKey) + "/" + item.AutoKey;
BPAPackage bPAPackage = new BPAPackage
{
MessageId = 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 applictionmessage = new MqttApplicationMessageBuilder().WithTopic(Topic).WithPayload(bPAPackage.Serialize(false)).WithAtLeastOnceQoS().Build();
await _mqttClient.PublishAsync(applictionmessage);
return "success";
}
catch (Exception e)
{
return "下发错误,错误信息:" + e.Message;

}
}
/// <summary>
/// 订阅,mq
/// </summary>
/// <param name="topic"></param>
/// <returns></returns>
public async Task<string> Subscribe(string topic)
{
string str = "success";
try
{
topic = topic.Trim();
if (string.IsNullOrEmpty(topic))
{
throw Oops.Oh("订阅主题不能为空!");
}

// 判断客户端是否连接
if (!_mqttClient.IsConnected)
{
throw Oops.Oh("MQTT 客户端尚未连接!");
}

// 设置订阅参数
var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(topic)
.Build();
await _mqttClient.SubscribeAsync(subscribeOptions, CancellationToken.None);
return str;
}
catch (Exception e)
{
return "下发错误,错误信息:" + e.Message;

}
}
}
}

+ 34
- 0
BPA.SAAS.KitChenManage.Application/Push/Comm/WorkTask.cs Переглянути файл

@@ -0,0 +1,34 @@
using BPA.SAAS.KitChenManage.Application.Device.Services;
using Longbow.Tasks;
using Microsoft.Extensions.DependencyInjection;
using MQTTnet.Client;
using MQTTnet.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using uPLibrary.Networking.M2Mqtt;

namespace BPA.SAAS.KitChenManage.Application.Push.Comm
{
public class WorkTask : ITask, ITransient
{
// IMqttClient mqttServermqttClient;
IDevicePushRecodeService devicePushRecodeService;
//MqttServer mqttClient;
public async Task Execute(IServiceProvider provider, CancellationToken cancellationToken)
{
// mqttServermqttClient = provider.GetService<IMqttClient>();
devicePushRecodeService = provider.GetService<IDevicePushRecodeService>();
//mqttClient = new(mqttServermqttClient);
//cancellationToken.Register(devicePushRecodeService.CallBackDevicePushRecode())
//await devicePushRecodeService.CallBackDevicePushRecode();
// Console.WriteLine($"订阅消息返回:"+ str);

// return Task.CompletedTask;
}
}
}

+ 33
- 0
BPA.SAAS.KitChenManage.Application/Push/奶茶机_V1/ProductFunctionData.cs Переглянути файл

@@ -11,8 +11,41 @@ namespace BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1
/// </summary>
public class ProductFunctionData
{
/// <summary>
/// 物料下发topics
/// </summary>
public const string BatchingPushTopics = "/120078739409565e0/v1/${deviceKey}/defaul/batvhingpush";
/// <summary>
/// 响应物料下发topics
/// </summary>
public const string BatchingPushTopics_reply= "/120078739409565e0/v1/${deviceKey}/defaul/batvhingpush_reply";
/// <summary>
/// 工艺下发topics
/// </summary>
public const string TechnologyPushTopics = "/120078739409565e0/v1/${deviceKey}/defaul/chnologypush";
/// <summary>
/// 响应工艺下发topics
/// </summary>
public const string TechnologyPushTopics_reply = "/120078739409565e0/v1/${deviceKey}/defaul/chnologypush_reply";
/// <summary>
/// 商品下发topics
/// </summary>
public const string GoodsPushTopics = "/120078739409565e0/v1/${deviceKey}/defaul/goodspush";
/// <summary>
///响应商品下发topics
/// </summary>
public const string GoodsPushTopics_reply = "/120078739409565e0/v1/${deviceKey}/defaul/goodspush_reply";
/// <summary>
/// 物料下发服务参数格式
/// </summary>
public const string BatchingData = "{\r\n\t\"batchinginfo\": [{\r\n\t\t\"id\": \"物料ID\",\r\n\t\t\"name\": \"物料名称\",\r\n\t\t\"typeid\": \"物料类型ID\",\r\n\t\t\"typename\": \"物料类型名称\",\r\n\t\t\"unit\": \"单位\",\r\n\t\t\"createAt\": \"创建时间\"\r\n\t}],\r\n\t\"batchingTypeinfo\": [{\r\n\t\t\"id\": \"ID\",\r\n\t\t\"name\": \"物料类型名称\"\r\n\t}],\r\n\t\"batchingUnitinfo\": [{\r\n\t\t\"id\": \"ID\",\r\n\t\t\"name\": \"物料单位名称\"\r\n\t}]\r\n}";
/// <summary>
/// 商品下发服务参数格式
/// </summary>
public const string GoodsData = "{\r\n\t\"goodsinfo\": [{\r\n\t\t\"id\": \"商品ID\",\r\n\t\t\"name\": \"商品名称\",\r\n\t\t\"goodsTypeId\": \"商品类型ID\",\r\n\t\t\"goodsTypeName\": \"商品类型名称\",\r\n\t\t\"goodsUintId\": \"单位Id\",\r\n\t\t\"goodsUintName\": \"单位名称\",\r\n\t\t\"createAt\": \"创建时间\",\r\n\t\t\"imgUrl\": \"商品图片路径\",\r\n\t\t\"price\": \"价格\",\r\n\t\t\"design\": \"描述\"\r\n\t}],\r\n\t\"goodsTypeInfo\": [{\r\n\t\t\"id\": \"id\",\r\n\t\t\"name\": \"分类名称\",\r\n\t\t\"PId\": \"父级id\"\r\n\t}],\r\n\t\"goodsUnitInfo\": [{\r\n\t\t\"id\": \"id\",\r\n\t\t\"name\": \"单位名称\"\r\n\t}],\r\n\t\"goodsAttribute\": [{\r\n\t\t\"id\": \"id\",\r\n\t\t\"attributeName\": \"属性名称\",\r\n\t\t\"goodsTypeId\": \"商品分类id\",\r\n\t\t\"attributeValueList\": [{\r\n\t\t\t\"id\": \"id\",\r\n\t\t\t\"goodsAttributeId\": \"商品属性id\",\r\n\t\t\t\"attributeValue\": \"商品属性值\"\r\n\t\t}]\r\n\t}]\r\n}";
/// <summary>
/// 工艺下发服务参数格式
/// </summary>
public const string TechnologyData = "{\r\n\t\"technologysInfo\": [{\r\n\t\t\"id\": \"id\",\r\n\t\t\"name\": \"工艺步骤名称\",\r\n\t\t\"DeviceVersionId\": \"设备版本id\",\r\n\t\t\"technologyActionInfo\": [{\r\n\t\t\t\"id\": \"id\",\r\n\t\t\t\"technologyId\": \"工艺步骤id\",\r\n\t\t\t\"actionName\": \"模型名称\",\r\n\t\t\t\"actionValue\": \"模型数据\",\r\n\t\t\t\"actionType\": \"数据类型\",\r\n\t\t\t\"technologyType\": \"工艺模型类型(标识是否物料 1标识物料 0标识其他)\"\r\n\t\t}],\r\n\t}],\r\n\t\r\n\t\"goodsTechnologysInfo\": [{\r\n\t\t\"id\": \"id\",\r\n\t\t\"stepName\": \"工艺步骤名称\",\r\n\t\t\"actionJson\": \"工艺模型json\",\r\n\t\t\"goodsAttributeId\": \"商品属性值id组合\",\r\n\t\t\"chnologyId\": \"工艺id\",\r\n\t\t\"goodsId\": \"商品id\",\r\n\t\t\"deviceId\": \"设备id\",\r\n\t\t\"createAt\": \"创建时间\"\r\n\t}]\r\n}";
}
}

+ 15
- 0
BPA.SAAS.KitChenManage.Application/Push/奶茶机_v1/Dto/ReplyBaseDto.cs Переглянути файл

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPA.SAAS.KitChenManage.Application.Push.奶茶机_v1.Dto
{
public class ReplyBaseDto
{
public string MessageId { get; set; }
public bool Success { get; set; }
public string Errors { get; set; }
}
}

+ 1
- 0
BPA.SAAS.KitChenManage.Application/Store/Services/IStoreService.cs Переглянути файл

@@ -21,6 +21,7 @@ namespace BPA.SAAS.KitChenManage.Application.Store.Services
/// </summary>
/// <returns></returns>
Task<List<StoreDtoOutput>> GetStoreList();
Task<List<StoreDtoOutput>> GetStoreList_alm();
/// <summary>
/// 添加
/// </summary>


+ 19
- 0
BPA.SAAS.KitChenManage.Application/Store/Services/StoreService.cs Переглянути файл

@@ -66,6 +66,25 @@ namespace BPA.SAAS.KitChenManage.Application.Store.Services
return res;
}
public async Task<List<StoreDtoOutput>> GetStoreList_alm()
{
string groupId = App.HttpContext.Request.Headers["groupId"].ToString();
if (string.IsNullOrWhiteSpace(groupId)) throw Oops.Oh("加盟商id不能为空");
var res = await _db.Queryable<BPA_Store>().Where(x=>x.GroupId== groupId)
.Select(t => new StoreDtoOutput
{
CreateAt = t.CreateAt,
Id = t.Id,
Name = t.Name,
Phone = t.Phone,
Description = t.Description,
OrgName = t.OrgName,
OrgId = t.OrgId,
Sort = t.Sort,
}).OrderBy(t => t.Sort).OrderBy(x => x.CreateAt, OrderByType.Desc).ToListAsync();

return res;
}
/// <summary>
/// 添加
/// </summary>


+ 9
- 0
BPA.SAAS.KitChenManage.Application/Store/StoreServices.cs Переглянути файл

@@ -38,6 +38,15 @@ namespace BPA.SAAS.KitChenManage.Application.Store
return await _storeService.GetStoreList();
}
/// <summary>
/// 查询所有店铺(外部调用)
/// </summary>
/// <returns></returns>
[HttpGet("/api/store/getstorelist_alm")]
public async Task<List<StoreDtoOutput>> GetStoreList_alm()
{
return await _storeService.GetStoreList_alm();
}
/// <summary>
/// 添加
/// </summary>
/// <param name="input"></param>


+ 3
- 3
BPA.SAAS.KitChenManage.Core/BPA.SAAS.KitChenManage.Core.csproj Переглянути файл

@@ -14,9 +14,9 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.23" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.23" />
<PackageReference Include="Furion.Pure" Version="4.9.1.23" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.35" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.35" />
<PackageReference Include="Furion.Pure" Version="4.9.1.35" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
</ItemGroup>



+ 1
- 1
BPA.SAAS.KitChenManage.Core/BPA.SAAS.KitChenManage.Core.xml Переглянути файл

@@ -67,7 +67,7 @@
</member>
<member name="P:BPA.SAAS.KitChenManage.Core.Model.BPA_DevicePushRecode.Status">
<summary>
下发状态 1成功 2失败
下发状态 0下发中 1成功 2失败
</summary>
</member>
<member name="P:BPA.SAAS.KitChenManage.Core.Model.BPA_FoodMenuGoods.FoodMenuId">


+ 1
- 1
BPA.SAAS.KitChenManage.Core/DbContext.cs Переглянути файл

@@ -38,7 +38,7 @@ namespace BPA.SAAS.KitChenManage.Core
//过滤已删除数据
db.QueryFilter.AddTableFilter<IDeleted>(it => it.IsDeleted == 0);
//db.QueryFilter.AddTableFilter<IStatus>(it => it.Status == 0);
if (App.User.FindFirst(ClaimConst.CLAINM_SUPERADMIN)?.Value != null)
if (App.User?.FindFirst(ClaimConst.CLAINM_SUPERADMIN)?.Value != null)
{
//非管理员账户过滤加盟商数据
var groupId = App.User?.FindFirst(ClaimConst.GroupId)?.Value;


+ 5
- 1
BPA.SAAS.KitChenManage.Core/Model/BPA_DevicePushRecode.cs Переглянути файл

@@ -21,10 +21,14 @@ namespace BPA.SAAS.KitChenManage.Core.Model
public string Topic { get; set; }
public string DataResore { get; set; }
/// <summary>
/// 下发状态 1成功 2失败
/// 下发状态 0下发中 1成功 2失败
/// </summary>
public int Status { get; set; }
public int DeviceAutoKey { get; set; }
public string Description { get; set; }
public int MessageId { get; set; }
public string TopicRely { get; set; }
public string DataResoreRely { get; set; }
public string DescriptionRely { get; set; }
}
}

+ 1
- 0
BPA.SAAS.KitChenManage.Web.Core/BPA.SAAS.KitChenManage.Web.Core.csproj Переглянути файл

@@ -17,6 +17,7 @@

<ItemGroup>
<PackageReference Include="BPA.MQTTClient" Version="1.0.11" />
<PackageReference Include="Longbow.Tasks" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>



+ 2
- 0
BPA.SAAS.KitChenManage.Web.Core/Startup.cs Переглянути файл

@@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using ProtoBuf.Meta;
using System;
using System.Threading.Tasks;

@@ -50,6 +51,7 @@ namespace BPA.SAAS.KitChenManage.Web.Core
});
});
// services.GetService<IMqttClientOptions>();
services.AddTaskServices();
services.AddCorsAccessor();
services.AddRemoteRequest();
services.AddSqlsugarSetup(App.Configuration);


Завантаження…
Відмінити
Зберегти