Bläddra i källkod

柔性配料系统添加接收MQTT工单

煮面机(新)
ZhaoGang 1 år sedan
förälder
incheckning
9d1b781078
22 ändrade filer med 931 tillägg och 3 borttagningar
  1. +7
    -0
      DosingSystem/App.config
  2. +6
    -1
      DosingSystem/App.xaml.cs
  3. +54
    -2
      DosingSystem/ExcuteControl.cs
  4. +83
    -0
      DosingSystem/Model/Dto/BOMEntryOutput.cs
  5. +30
    -0
      DosingSystem/Model/Dto/BOMOutput.cs
  6. +37
    -0
      DosingSystem/Model/Dto/WorkOrderPusht.cs
  7. +16
    -0
      DosingSystem/Model/MQTT/IServer.cs
  8. +12
    -0
      DosingSystem/Model/MQTT/Messages/IMessage.cs
  9. +13
    -0
      DosingSystem/Model/MQTT/Messages/MessageDefine.cs
  10. +16
    -0
      DosingSystem/Model/MQTT/Messages/MessageID.cs
  11. +8
    -0
      DosingSystem/Model/MQTT/Messages/MqttBaseModel.cs
  12. +86
    -0
      DosingSystem/Model/MQTT/Messages/MsgPackExtensionMethod.cs
  13. +17
    -0
      DosingSystem/Model/MQTT/Messages/MsgPackage.cs
  14. +19
    -0
      DosingSystem/Model/MQTT/Messages/WorkOrderPublishOutput.cs
  15. +120
    -0
      DosingSystem/Model/MQTT/MqttServer.cs
  16. +61
    -0
      DosingSystem/Model/MQTT/Topics.cs
  17. +24
    -0
      DosingSystem/Service/APIResult.cs
  18. +35
    -0
      DosingSystem/Service/APIServer.cs
  19. +87
    -0
      DosingSystem/Service/ApiRoute.cs
  20. +41
    -0
      DosingSystem/Service/FormT.cs
  21. +116
    -0
      DosingSystem/Service/IAPIServer.cs
  22. +43
    -0
      DosingSystem/Service/ServerFactory.cs

+ 7
- 0
DosingSystem/App.config Visa fil

@@ -12,6 +12,7 @@
<section name="StockInfo5" type="System.Configuration.NameValueSectionHandler"/>
<section name="StockInfo6" type="System.Configuration.NameValueSectionHandler"/>
<section name="Services" type="System.Configuration.NameValueSectionHandler"/>
<section name="MQTTParam" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
<FlexBatchSystem>
@@ -59,5 +60,11 @@
<add key="Service4" value="CancelRecipeService"/>

</Services>
<MQTTParam>
<add key="UserName" value="admin"/>
<add key="Password" value="admin8765490789"/>
<add key="IpAddress" value="111.9.47.105"/>
<add key="Port" value="18883"/>
</MQTTParam>
</FlexBatchSystem>
</configuration>

+ 6
- 1
DosingSystem/App.xaml.cs Visa fil

@@ -4,6 +4,8 @@ using BPASmartClient.CustomResource.Pages.Model;
using BPASmartClient.CustomResource.Pages.View;
using BPASmartClient.CustomResource.Pages.ViewModel;
using BPASmartClient.DosingSystem.Model;
using BPASmartClient.DosingSystem.Model.MQTT;
using BPASmartClient.DosingSystem.Service;
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
@@ -58,6 +60,7 @@ namespace BPASmartClient.DosingSystem
await Task.Run(() => { excute = ExcuteControl.GetInstance; });
MenuInit();

//SiemensTest.GetInstance.Init();
DeviceInquire.GetInstance.Init();//配料机设备上线监听,设备列表初始化
MainView mv = new MainView();
@@ -92,6 +95,8 @@ namespace BPASmartClient.DosingSystem
}
else
mv.Close();
ServerFactory.GetInstance.Set(new APIServer());
MqttServer.GetInstance.Init();
MainWindow = mv;
}

@@ -280,7 +285,7 @@ namespace BPASmartClient.DosingSystem
ToggleWindowPath = "View.DeviceListView"
});
//2023/6/29修改
if ((ConveryType)Enum.Parse(typeof(ConveryType), Json<DevicePar>.Data.BaseParModel.ConveryType) == ConveryType.U型)
if (!String.IsNullOrWhiteSpace(Json<DevicePar>.Data.BaseParModel.ConveryType) && (ConveryType)Enum.Parse(typeof(ConveryType), Json<DevicePar>.Data.BaseParModel.ConveryType) == ConveryType.U型)
{
DeviceMonitor.Add(new SubMenumodel()
{


+ 54
- 2
DosingSystem/ExcuteControl.cs Visa fil

@@ -29,6 +29,8 @@ using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
using System.Windows.Navigation;
using System.Text.RegularExpressions;
using static System.Resources.ResXFileRef;
using BPASmartClient.DosingSystem.Model.Dto;
using BPASmartClient.DosingSystem.Model.MQTT;

namespace BPASmartClient.DosingSystem
{
@@ -102,8 +104,8 @@ namespace BPASmartClient.DosingSystem
RecipeRun();
BusinessExcute();
ConveyerPropertyReport();
#if Debug
ThreadTaskInit();
#if Debug
Task.Run(() => {
while (true)
{
@@ -749,8 +751,58 @@ namespace BPASmartClient.DosingSystem



/// <summary>
/// 多线程接收工单配方数据。
/// </summary>
private void ThreadTaskInit()
{
TaskManage.GetInstance.StartLong(new Action(() =>
{
while (MqttServer.GetInstance.WorkOrders.Count > 0)
{
if (MqttServer.GetInstance.WorkOrders.TryDequeue(out WorkOrderPusht wod))
{
App.Current?.Dispatcher?.Invoke(new Action(() =>
{
//TODO:工单数据处理,直接新建配方。
foreach (var recipe in wod.ProductList)
{
var tempRecipe = new RecipeModel();
var tempMaterials = new ObservableCollection<RawMaterialModel>();

if (Json<LocalRecipe>.Data.Recipes.Any(p => p.RecipCode == recipe.Id))
{
continue;
}
else
{
tempRecipe.RecipCode = recipe.Id;
}

tempRecipe.RecipeName = recipe.Name;

foreach (var material in recipe.BOMEntryList)
{
tempMaterials.Add(new RawMaterialModel()
{
RawMaterialName = material.MaterialName,
DeviceIp="",
Loc=1,
RawMaterialWeight=(uint)material.BomQty,
RawMaterialSource=0,
RawMaterialId=material.MaterialId,
});
}
tempRecipe.RawMaterials = tempMaterials;
Json<LocalRecipe>.Data.Recipes.Add(tempRecipe);
}
}));
}
}
Thread.Sleep(500);
}), "工单信息监听");
}





+ 83
- 0
DosingSystem/Model/Dto/BOMEntryOutput.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.Dto
{
/// <summary>
///
/// </summary>
public class BOMEntryOutput
{
/// <summary>
/// 主键
/// </summary>
public string Id { get; set; }
/// <summary>
/// 工单id
/// </summary>
public string WorkOrderId { get; set; }
/// <summary>
/// 工单id
/// </summary>
public string WorkOrderName { get; set; }
/// <summary>
/// 配方单位
/// </summary>
public string UnitId { get; set; }
/// <summary>
/// 配方单位名称
/// </summary>
public string UnitName { get; set; }
/// <summary>
/// 上误差值
/// </summary>
public string UpErrorValue { get; set; }
/// <summary>
/// 下误差值
/// </summary>
public string DownErrorValue { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string MaterialId { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string MaterialName { get; set; }
/// <summary>
/// 产品Id
/// </summary>
public string ProductId { get; set; }
/// <summary>
/// 产品名称
/// </summary>
public string ProductName { get; set; }
/// <summary>
/// 配方用量
/// </summary>
public decimal BomQty { get; set; }
/// <summary>
/// 产量
/// </summary>
public string Yield { get; set; }
/// <summary>
/// 配方id
/// </summary>
public string BomId { get; set; }
/// <summary>
/// 1主料配方0 辅料配方
/// </summary>
public bool IsMain { get; set; }
/// <summary>
/// 计划完成时间
/// </summary>
public string PlantEndTime { get; set; }
/// <summary>
/// 计划开始时间
/// </summary>
public string PlantStartTime { get; set; }
}
}

+ 30
- 0
DosingSystem/Model/Dto/BOMOutput.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.Dto
{
public class BOMOutput
{
/// <summary>
/// 主键
/// </summary>
public string Id { get; set; }
/// <summary>
/// 配方名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 1主料配方0 辅料配方
/// </summary>
public bool IsMain { get; set; }

/// <summary>
/// 配方明细
/// </summary>
public List<BOMEntryOutput> BOMEntryList { get; set; } = new();

}
}

+ 37
- 0
DosingSystem/Model/Dto/WorkOrderPusht.cs Visa fil

@@ -0,0 +1,37 @@
using BPASmartClient.DosingSystem.Model.MQTT.Messages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.Model.Dto
{
public class WorkOrderPusht : IMessage
{
/// <summary>
/// 主键
/// </summary>
public string Id { get; set; }
/// <summary>
/// 工单名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 计划完成时间
/// </summary>
public string PlantEndTime { get; set; }
/// <summary>
/// 产量
/// </summary>
public string Yield { get; set; }
/// <summary>
/// 计划开始时间
/// </summary>
public string PlantStartTime { get; set; }
/// <summary>
/// 配方信息
/// </summary>
public List<BOMOutput> ProductList { get; set; } = new();
}
}

+ 16
- 0
DosingSystem/Model/MQTT/IServer.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.MQTT
{
public interface IServer
{

Task Init(params object[] pars);

void Dispose();
}
}

+ 12
- 0
DosingSystem/Model/MQTT/Messages/IMessage.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public interface IMessage
{
}
}

+ 13
- 0
DosingSystem/Model/MQTT/Messages/MessageDefine.cs Visa fil

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;

namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public class MessageDefine
{
public static readonly Dictionary<int, Type> MSG = new Dictionary<int, Type>()
{
{ MessageID.WorkOrderIssued,typeof(WorkOrderPublishOutput)},
};
}
}

+ 16
- 0
DosingSystem/Model/MQTT/Messages/MessageID.cs Visa fil

@@ -0,0 +1,16 @@
namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public class MessageID
{
public const int DevcieControl = 1;//出入库命令控制ID
public const int WorkOrderIssued = 2;//工单下发ID
public const int StatusChange = 3;//配料流程修改ID
public const int MakeDown = 4;//工单配方下发ID
public const int DeviceDataUpdate = 5;//设备数据更新ID
public const int HandControlComm = 6;//手动控制命令
public const int DataActualTimeUpdate = 7;//设备数据实时更新
public const int UiChangeNotify = 8;//UI操作更新
public const int StoreStockTaking = 9;//库存盘点
public const int LogInfoNotify = 10;//业务服务日志消息通知
}
}

+ 8
- 0
DosingSystem/Model/MQTT/Messages/MqttBaseModel.cs Visa fil

@@ -0,0 +1,8 @@
namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public class MqttBaseModel : IMessage
{
/// <summary>客户端唯一ID,客户端区分</summary>
public short ClientId { get; set; }
}
}

+ 86
- 0
DosingSystem/Model/MQTT/Messages/MsgPackExtensionMethod.cs Visa fil

@@ -0,0 +1,86 @@
using BPA.Helper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;

namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public static class MsgPackExtensionMethod
{
public static MsgPackage Deserialize(this string msg)
{
if (msg != null)
{
if (msg.Iskey("MessageId") && msg.Iskey("Message") && msg.Iskey("MessageLen"))
{
var obj = msg.FromJSON<MsgPackage>();
if (obj != null)
return obj;
}
else
{
var id = msg.ToLower().GetJsonObjValue("messageid");
if (int.TryParse(id, out int tempId))
{
if (MessageDefine.MSG.ContainsKey(tempId))
{
MsgPackage package = new MsgPackage();
package.MessageId = tempId;
if (int.TryParse(msg.ToLower().GetJsonObjValue("messagelen"), out int tempLen))
package.MessageLen = tempLen;
var res = msg.ToLower().GetJsonObjValue("message");
if (res != null)
{
package.Message = (IMessage)JsonConvert.DeserializeObject(res, MessageDefine.MSG[tempId]);
}
return package;
}
}
}
}
return new MsgPackage();
}

public static string Serialize(this IMessage mes)
{
MsgPackage msg = new MsgPackage();
var res = MessageDefine.MSG.FirstOrDefault(p => p.Value == mes.GetType());
msg.MessageId = res.Key;
msg.MessageLen = JsonConvert.SerializeObject(mes).Length;
msg.Message = mes;
return JsonConvert.SerializeObject(msg);
}

public static string GetJsonObjValue(this string input, string key)
{
try
{
JObject jo = (JObject)JsonConvert.DeserializeObject(input);
if (jo != null && jo.ContainsKey(key))
return jo[key].ToString();
else
return string.Empty;
}
catch (Exception EX)
{
MessageLog.GetInstance.ShowEx(EX.ToString());
return string.Empty;
}
}

public static bool Iskey(this string input, string key)
{
try
{
JObject jo = (JObject)JsonConvert.DeserializeObject(input);
return jo != null && jo.ContainsKey(key);
}
catch (Exception EX)
{
MessageLog.GetInstance.ShowEx(EX.ToString());
return false;
}
}
}
}

+ 17
- 0
DosingSystem/Model/MQTT/Messages/MsgPackage.cs Visa fil

@@ -0,0 +1,17 @@
using Newtonsoft.Json;

namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
public class MsgPackage
{
/// <summary>消息ID</summary>
public int MessageId { get; set; }

/// <summary>消息内容</summary>
[JsonProperty(TypeNameHandling = TypeNameHandling.Auto)]
public IMessage Message { get; set; }

/// <summary>消息长度</summary>
public int MessageLen { get; set; }
}
}

+ 19
- 0
DosingSystem/Model/MQTT/Messages/WorkOrderPublishOutput.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.MQTT.Messages
{
/// <summary>
/// 下发数据
/// </summary>
public class WorkOrderPublishOutput : IMessage
{
/// <summary>
/// 工单Id
/// </summary>
public string WorkOrderId { get; set; }
}
}

+ 120
- 0
DosingSystem/Model/MQTT/MqttServer.cs Visa fil

@@ -0,0 +1,120 @@
using Aop.Api.Domain;
using BPA.Communication;
using BPA.Communication.Base;
using BPA.Helper;
using BPASmartClient.DosingSystem.Model.Dto;
using BPASmartClient.DosingSystem.Model.MQTT.Messages;
using BPASmartClient.DosingSystem.Service;
using BPASmartClient.Model;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.Model.MQTT
{
public class MqttServer : IServer
{
private volatile static MqttServer _Instance;
public static MqttServer GetInstance => _Instance ?? (_Instance = new MqttServer());
private MqttServer() { }

/// <summary>
/// MQTT 消息
/// </summary>
ConcurrentQueue<string> msg= new ConcurrentQueue<string>();
MqttHelper mqttHelper = new MqttHelper();

NameValueCollection mqttParam;

/// <summary>
/// 工单信息
/// </summary>
public ConcurrentQueue<WorkOrderPusht> WorkOrders { get; set; } = new ConcurrentQueue<WorkOrderPusht>();

public Task Init(params object[] pars)
{
return Task.Factory.StartNew(() =>
{
mqttParam = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("FlexBatchSystem/MQTTParam");

//mqttHelper.IsVerifyNetwork = false;
mqttHelper.MessageRecive = new Action<string>(
s => {
msg.Enqueue(s); });
mqttHelper.Connected = new Action(() =>
{
if (pars.Length > 0)
{
pars.ToList().ForEach(item => { mqttHelper.Subscrib(item?.ToString()); });
}
else
{
//mqttHelper.Subscrib(Topics.MakeDown);

//mqttHelper.Subscrib(Topics.StatusChange);

mqttHelper.Subscrib(Topics.WorkOrderDown);

//mqttHelper.Subscrib(Topics.DataActualTimeUpdate);
}
TaskManage.GetInstance.StartLong(new Action(() =>
{
while (msg.Count > 0)
{
try
{
if (msg.TryDequeue(out string str))
{
var res = str.Deserialize();
if (res?.Message is WorkOrderPublishOutput wod)
WorkOrderPublish(wod);
}
}
catch (Exception ex)
{
MessageLog.GetInstance.ShowEx(ex.ToString());
}

}
Thread.Sleep(10);
}), "MCS工单信息接收", true);
});
//mqttHelper.Connect(Json<ConnectConfig>.Data.MqttUser, Json<ConnectConfig>.Data.MqttPas, Json<ConnectConfig>.Data.MqttIp, Json<ConnectConfig>.Data.MqttPort, $"WCS系统,{Guid.NewGuid()}");
mqttHelper.Connect(new ConfigurationOptions()
{
UserName = mqttParam?.Get("UserName")?? "admin",
Password = mqttParam?.Get("Password")?? "admin8765490789",
IpAddress =mqttParam?.Get("IpAddress")?? "111.9.47.105",
Port =int.TryParse( mqttParam?.Get("Port"),out int port)?port:18883,
ClientId = $"WCS系统业务消息,{Guid.NewGuid()}"
});
});
}
private void WorkOrderPublish(WorkOrderPublishOutput wod)
{
Task.Factory.StartNew(new Action(() =>
{
var x = ServerFactory.GetInstance.Get().GetWorkOrder(wod.WorkOrderId);
if (x.IsSuccess && x.Content.Count > 0)
{
var wop = x.Content.ElementAt(0);
wop.ProductList = wop.ProductList.OrderBy(p => p.Name).ToList();
WorkOrders.Enqueue(wop);
}
}));
}

public void Dispose()
{
mqttHelper.Dispose();
}

public static void Dis() => _Instance = null;
}
}

+ 61
- 0
DosingSystem/Model/MQTT/Topics.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Model.MQTT
{
public class Topics
{
/// <summary>
/// 工单下发
/// </summary>
public const string WorkOrderDown = "WMS/WCS/WorkOrderDown";

/// <summary>
/// 工单配方下发
/// </summary>
public const string MakeDown = "WCSClient/WCSServer/MakeDown";

/// <summary>
/// 控制命令,出入库操作
/// </summary>
public const string ControlComm = "WCSClient/WCSServer/ControlComm";

/// <summary>
/// 配料状态更改
/// </summary>
public const string StatusChange = "WCSServer/WCSClient/StatusChange";

/// <summary>
/// 称重设备数据更新
/// </summary>
public const string DeviceDataUpdate = "WCSServer/WCSClient/DataUpdate";

/// <summary>
/// 手动控制命令下发
/// </summary>
public const string HandControlComm = "WCSClient/WCSServer/HandControlComm";

/// <summary>
/// 设备数据实时更新
/// </summary>
public const string DataActualTimeUpdate = "WCSServer/WCSClient/DataActualTimeUpdate";

/// <summary>
/// UI操作修改数据时触发更新其它UI
/// </summary>
public const string UIDataChange = "WCSClient/WCSClient/UIDataChange";

/// <summary>
/// 盘库消息+库房ID
/// </summary>
public static string StoreStockTaking = "WMS/WCSClient/StoreStockTaking";

/// <summary>
/// 日志消息通知
/// </summary>
public static string LogInfoNotify = "WCSBusines/WCS/LoginfoNotify";
}
}

+ 24
- 0
DosingSystem/Service/APIResult.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Service
{
public class APIResult<T>
{
public T Content { get; set; }

public string ErrorMesg { get; set; } = string.Empty;

public bool IsSuccess { get; set; }
}

public class APIResult
{
public string ErrorMesg { get; set; } = string.Empty;

public bool IsSuccess { get; set; }
}
}

+ 35
- 0
DosingSystem/Service/APIServer.cs Visa fil

@@ -0,0 +1,35 @@
using BPA.Helper;
using BPA.Message;
using BPASmartClient.DosingSystem.Model.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.Service
{
public class APIServer : IAPIServer
{

/// <summary>
/// 设置业务插件状态
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public APIResult<bool> PlugInstatusSet(bool state)
{
var data = new { state = state };
var res = APIHelper.GetInstance.PostRequest($"{ApiRoute.SetStatus}{state}", data.ToJson());
return new FromT<bool>(res).Result;
}

public APIResult<List<WorkOrderPusht>> GetWorkOrder(string workOrderId)
{
var data = new { workOrderId = workOrderId, startTime = "", endTime = "" };
var res = APIHelper.GetInstance.PostRequest(ApiRoute.WorkOrderData, data.ToJson());
return new FromT<List<WorkOrderPusht>>(res).Result;
}
}
}

+ 87
- 0
DosingSystem/Service/ApiRoute.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Service
{
public class ApiRoute
{

private static string APIAddress => "http://111.9.47.105:18090";
//private static string APIAddress => "https://localhost:44342";

/// <summary>
/// 货架路由
/// </summary>
public static string StoreShelves => $"{APIAddress}/StoreShelves/List";

/// <summary>
/// 库位路由
/// </summary>
public static string StorePlace => $"{APIAddress}/StorePlace/MaterialStorePlaceList";

/// <summary>
/// 库位数据更新(库位坐标更新)
/// </summary>
public static string StorePlaceUpdate => $"{APIAddress}/StorePlace/Update";

/// <summary>
/// 获取物料信息
/// </summary>
public static string GetMaterialInfo => $"{APIAddress}/Material/GetMaterialList";

/// <summary>
/// 获取电子标签
/// </summary>
public static string GetCaseTagList => $"{APIAddress}/CaseTag/List";

/// <summary>
/// 出入库管理
/// </summary>
public static string StockFlowManager => $"{APIAddress}/StockFlow/Add";

/// <summary>
/// 库位解绑
/// </summary>
public static string StockUnBind => $"{APIAddress}/MaterialStock/UnBind";

/// <summary>
/// 绑定标签
/// </summary>
public static string BindTag => $"{APIAddress}/StorePlace/BindCaseTag";

/// <summary>
/// 库位坐标批量更新
/// </summary>
public static string BatchUpdate => $"{APIAddress}/StorePlace/BatchUpdate";

/// <summary>
/// 出入库流水记录添加(更新库位余量数据)
/// </summary>
public static string MaterialStockUpdate => $"{APIAddress}/StockFlow/Add";

/// <summary>
/// 库存盘点数据
/// </summary>
public static string StoreStockTakingInfo => $"{APIAddress}/StoreStockTakingInfo/Add";

/// <summary>
/// 工单下发数据
/// </summary>
public static string WorkOrderData => $"{APIAddress}/WorkOrder/WorkOrderData";

/// <summary>
/// 业务插件唯一性状态设置
/// </summary>
public static string SetStatus => $"{APIAddress}/Basic/PlugInstatusSet?state=";

/// <summary>
/// 获取库房信息
/// </summary>
public static string GetStoreHouseInfo => $"{APIAddress}/StoreHouse/List";

}
}

+ 41
- 0
DosingSystem/Service/FormT.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Service
{
public class FromT<T>
{
public APIResult<T> Result { get; set; } = new APIResult<T>();
public FromT(string msg)
{
if (string.IsNullOrEmpty(msg))
return;
//Result.Content = msg.ToJson("content").FromJSON<T>();
if (msg.ToJson("content").TryFromJSON(out T temp))
Result.Content = temp;
else
{
Result.Content = (T)Convert.ChangeType(msg.ToJson("content"), typeof(T));
}
Result.ErrorMesg = msg.ToJson("message");
Result.IsSuccess = msg.ToJson("isSuccess").ToLower().FromJSON<bool>();
}
}


public class FromT
{
public APIResult Result { get; set; } = new APIResult();
public FromT(string msg)
{
if (string.IsNullOrEmpty(msg))
return;
Result.ErrorMesg = msg.ToJson("message");
Result.IsSuccess = msg.ToJson("isSuccess").ToLower().FromJSON<bool>();
}
}
}

+ 116
- 0
DosingSystem/Service/IAPIServer.cs Visa fil

@@ -0,0 +1,116 @@
using BPA.Message;
using BPA.Models;
using BPASmartClient.DosingSystem.Model.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DosingSystem.Service
{
public interface IAPIServer
{
/// <summary>
/// 获取货架信息
/// </summary>
/// <param name="id"></param>
/// <param name="houseId">创库ID</param>
/// <returns></returns>
//APIResult<List<StoreShelvesEntity>> GetStoreShelvesInfo(string id, string houseId);

/// <summary>
/// 获取库位信息
/// </summary>
/// <param name="id"></param>
/// <param name="houseId">仓库ID</param>
/// <param name="shelvesId">货架ID</param>
/// <returns></returns>
//APIResult<List<MaterialStorePlaceOutput>> GetStorePlace(string id, string houseId, string shelvesId);

/// <summary>
/// 批量更新库位坐标
/// </summary>
/// <param name="stores"></param>
/// <returns></returns>
//APIResult BatchUpdate(List<StorePlaceParModel> stores);

/// <summary>
/// 更新库位坐标
/// </summary>
/// <param name="store"></param>
/// <returns></returns>
// APIResult StorePlaceUpdate(StorePlaceParModel store);

/// <summary>
/// 获取物料信息
/// </summary>
/// <returns></returns>
// APIResult<List<MaterialOutput>> GetMaterialInfo();

/// <summary>
/// 获取电子标签
/// </summary>
//APIResult<List<CaseTagOutput>> GetCaseTagList();

/// <summary>
/// 出入库流水管理
/// </summary>
/// <param name="sfm"></param>
/// <returns></returns>
// APIResult StockFlowManager(StockFlowManagerModel sfm);

/// <summary>
/// 库位解绑
/// </summary>
/// <param name="MaterialId">物料ID</param>
/// <param name="PlaceId">库位ID</param>
/// <returns></returns>
//APIResult StockUnBind(string MaterialId, string PlaceId);

/// <summary>
/// 库位绑定标签
/// </summary>
/// <param name="PlaceId">库位ID</param>
/// <param name="TagId">标签ID</param>
/// <returns></returns>
// APIResult BindTag(string PlaceId, string TagId);

/// <summary>
/// 库位数据更新
/// </summary>
/// <param name="materialId">物料ID</param>
/// <param name="placeId">库位ID</param>
/// <param name="qty">数量</param>
/// <param name="id">主键ID</param>
/// <returns></returns>
//APIResult MaterialStockUpdate(string materialId, string placeId, double qty, string id);

/// <summary>
/// 盘库操作
/// </summary>
/// <param name="sstie">库位信息</param>
/// <returns></returns>
//APIResult StoreStockTakingInfoService(List<StoreStockTakingInfoEntity> sstie);

/// <summary>
/// 设置业务插件状态
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
APIResult<bool> PlugInstatusSet(bool state);

/// <summary>
/// 获取工单信息
/// </summary>
/// <param name="workOrderId"></param>
/// <returns></returns>
APIResult<List<WorkOrderPusht>> GetWorkOrder(string workOrderId);

/// <summary>
/// 获取库房信息
/// </summary>
/// <returns></returns>
//APIResult<List<StoreHouseOutput>> GetStoreHouseInfo();
}
}

+ 43
- 0
DosingSystem/Service/ServerFactory.cs Visa fil

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

namespace BPASmartClient.DosingSystem.Service
{
public class ServerFactory
{
private volatile static ServerFactory _Instance;
public static ServerFactory GetInstance => _Instance ?? (_Instance = new ServerFactory());
private ServerFactory() { }

ConcurrentDictionary<string, IAPIServer> servers = new ConcurrentDictionary<string, IAPIServer>();

public void Set<T>(T server) where T : IAPIServer
{
string name = server.GetType().Name;
if (!servers.ContainsKey(name))
{
servers.TryAdd(name, server);
}
}

public IAPIServer Get()
{
if (servers.Count > 0)
return servers.ElementAt(0).Value;
return default;
}

public IAPIServer Get<TServer>(TServer server) where TServer : IAPIServer
{
var name = server.GetType().Name;
if (servers.ContainsKey(name))
return servers[name];
return default;
}

}
}

Laddar…
Avbryt
Spara