#define test using BPA.Message; using BPA.Message.Enum; using BPASmartClient.EventBus; using BPASmartClient.Helper; using BPASmartClient.Http; using BPASmartClient.Message; using BPASmartClient.Model; using Newtonsoft.Json; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using static BPASmartClient.EventBus.EventBus; namespace BPASmartClient.Business { /// /// 订单代理 /// public class OrderProxy : IPlugin { //订单队列 private ConcurrentDictionary> orders = new ConcurrentDictionary>(); //运行标识 private bool running = false; //设备管理 private DeviceMgr deviceMgr; ConcurrentQueue morkOrderPushes = new ConcurrentQueue(); /// /// 初始化 /// public void Initialize() { deviceMgr = Plugin.GetInstance().GetPlugin(); #if test ThreadManage.GetInstance().StartLong(new Action(() => { while (morkOrderPushes.Count > 0) { if (morkOrderPushes.TryDequeue(out MorkOrderPush mork)) { Thread.Sleep(3000); new OrderStatusChangedEvent() { Status = ORDER_STATUS.COOKING, SubOrderId = mork.SuborderId }.Publish(); Thread.Sleep(5000); new OrderStatusChangedEvent() { Status = ORDER_STATUS.COMPLETED_COOK, SubOrderId = mork.SuborderId }.Publish(); Thread.Sleep(5000); new OrderStatusChangedEvent() { Status = ORDER_STATUS.COMPLETED_TAKE, SubOrderId = mork.SuborderId }.Publish(); Thread.Sleep(2000); } } Thread.Sleep(1000); }), "sim order"); #endif } public void Start() { running = true; Plugin.GetInstance().GetPlugin().SetMessageReciveHandler(delegate (IMessage message) { if (message == null) return; //订单消息 if (message is MorkOrderPush morkOrderpush) { if (!orders.ContainsKey(morkOrderpush.DeviceId)) { orders.TryAdd(morkOrderpush.DeviceId, new ConcurrentQueue()); StartTargetDeviceOrderJob(morkOrderpush.DeviceId); } orders[morkOrderpush.DeviceId].Enqueue(morkOrderpush); } //辅料信息 else if (message is RecipeBoms recipe) { } //物料消息 else if (message is OrderMaterialDelivery delivery) { } }); EventBus.EventBus.GetInstance().Subscribe(0, OrderStatusChangedHandle); } private void StartTargetDeviceOrderJob(int deviceId) { ThreadManage.GetInstance().Start(() => { var device = deviceMgr.GetDevices().FirstOrDefault(p => p.DeviceId == deviceId); while (running) { if (device.IsBusy || !device.IsHealth) { Thread.Sleep(100); continue; } while (orders[deviceId].Count > 0) { if (orders[deviceId].TryDequeue(out MorkOrderPush temp)) { #if test morkOrderPushes.Enqueue(temp); #endif var orderEvent = DoOrderEvent.Make(temp); orderEvent.Id = device.DeviceId; orderEvent.Publish(); ActionManage.GetInstance.Send("AddOrder", new object[] { temp, device }); } } Thread.Sleep(50); } }, $"MQTT 订单接收处理-设备[{deviceId}]", true); } public void OrderStatusChangedHandle(IEvent @event, EventCallBackHandle callBack) { OrderStatusChangedEvent orderStatusChangedEvent = @event as OrderStatusChangedEvent; string result = string.Empty; OrderStatusChange orderStatusChange = new OrderStatusChange() { CookingStatus = orderStatusChangedEvent.Status, SuborderId = orderStatusChangedEvent.SubOrderId }; try { string header = $"[{InternetInfo.OrderServer}/order/robotstatuschange]_[{DateTime.Now.Ticks}]".AESEncrypt(); string url = $"{InternetInfo.OrderServer}order/robotstatuschange"; result = APIHelper.GetInstance.HttpRequest(url, header, orderStatusChange, RequestType.POST); } catch (Exception ex) { MessageLog.GetInstance.ShowEx(ex.ToString()); } var res = JsonConvert.DeserializeObject(result); ActionManage.GetInstance.Send("OrderStatusChange", orderStatusChangedEvent); MessageLog.GetInstance.Show(string.Format("订单状态改变,调用API执行结果{0}", res == null ? false : res.isSuccess)); } /// /// 资源释放 /// public void Dispose() { running = false; } } }