quanzhou
2 天以前 86f899fa91e811415614dff1a699141144bfc802
src/Bro.M141.Process/MyMQTT.cs
@@ -17,6 +17,7 @@
using System.Threading.Tasks;
using ZXing;
namespace Bro.M141.Process
{
    public class RabbitMQHelper
@@ -32,6 +33,10 @@
        private readonly string _queue1 = "auto_line_mac_queue_bak";
        private readonly string _queue2 = "auto_line_mac_barcode_queue_bak";
        List<MSGClass> MSGClasses = new List<MSGClass>();
        public RabbitMQHelper(string host = "10.2.20.114", int port = 15672, string user = "aoiUser", string pwd = "Chia@aoi")
        {
@@ -75,8 +80,6 @@
                InitConsumer(_receiveChannel2, _queue2, HandleQueue2Message);
            }
            CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, "RabbitMQ 连接成功");
        }
@@ -105,7 +108,20 @@
                }
                else
                {
                    CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ 篮具 收到未匹配 zbguid:{obj?.zbguid}");
                    if (MSGClasses.Any(u => u.zguid == obj?.zbguid))
                    {
                        var tem = MSGClasses.FirstOrDefault(u => u.zguid == obj?.zbguid);
                        if (!string.IsNullOrEmpty(tem.receive))
                        {
                            tem.receive = message;
                            CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ 篮具有超时动作,截留下匹配信息:{message}");
                        }
                    }
                }
            }
            catch (Exception ex)
@@ -125,7 +141,15 @@
                }
                else
                {
                    CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ 物料 收到未匹配 zbguid:{obj?.zbguid}");
                    Thread.Sleep(100);
                    if (_pendingTask2.TryRemove(obj.zbguid, out var tcs2))
                    {
                        tcs2.TrySetResult(message);
                    }
                    else
                    {
                        CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ 物料 收到未匹配 zbguid:{obj?.zbguid}");
                    }
                }
            }
            catch (Exception ex)
@@ -134,8 +158,41 @@
            }
        }
        public async Task<string> MESForBasketAsync(string ztype, string zlsn, string zlpn, string zstatus, string zversion, int timeoutMs = 30000)
        int num = 0;
        public async Task<string> MESForBasketAsync(string ztype, string zlsn, string zlpn, string zstatus, string zversion, int timeoutMes = 30000)
        {
            string keystr = ztype + "_" + zlsn + "_" + zlpn + "_" + zstatus;
            if (MSGClasses.Any(u => u.key == keystr))
            {
                CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"{keystr}匹配成功");
                num++;
                //var tem = MSGClasses.FirstOrDefault(u => u.key == keystr);
                var tem = MSGClasses.Where(u => u.key == "1" && !string.IsNullOrEmpty(u.receive)).ToList();
                //DateTime dt = DateTime.Now;
                if (num < 10)
                {
                    //while ((DateTime.Now - dt).TotalMilliseconds < timeoutMes)
                    //{
                        if (!string.IsNullOrEmpty(tem[0].receive))
                        {
                            CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ {keystr}二次接收 返回值正常 {tem[0].receive}");
                            return tem[0].receive;
                        }
                        Thread.Sleep(1000);
                    //}
                }
                else
                {
                    num = 0;
                    CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ超时处理次数超过十次");
                    //return null;
                }
                CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ二次接收数据接收为空");
                //return null;
            }
            var guid = Guid.NewGuid().ToString();
            var tcs = new TaskCompletionSource<string>(TaskCreationOptions.RunContinuationsAsynchronously);
            _pendingTask1[guid] = tcs;
@@ -157,16 +214,34 @@
            CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ 篮具 发送1:{message}");
            _sendChannel.BasicPublish("", "auto_line_mac_queue", null, body);
            var completed = await Task.WhenAny(tcs.Task, Task.Delay(timeoutMs));
            var completed = await Task.WhenAny(tcs.Task, Task.Delay(timeoutMes));
            _pendingTask1.TryRemove(guid, out _);
            if (completed == tcs.Task)
            {
                return await tcs.Task;
            }
            else
            {
                CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 返回超时1,zbguid={guid}");
                MSGClasses.Add(new MSGClass()
                {
                    key = keystr,
                    zguid = guid,
                });
                if (MSGClasses.Count > 10)
                {
                    MSGClasses.RemoveAt(0);
                }
                return null;
            }
        }
        public async Task<string> MESForProduceAsync(ProductModel pro, string zversion, int znonum, string endtray = "N", string line = "NQ216", int timeoutMs = 3000)
        {
@@ -183,35 +258,10 @@
            {
                zresult = "NG";
            }
            //string zr;
            //switch (pro.Result)
            //{
            //    case "ok":
            //        zr = "";
            //        break;
            //    case "异色":
            //        zr = "SZ2001";
            //        break;
            //    case "磨印":
            //        zr = "SZ2012";
            //        break;
            //    case "压伤":
            //        zr = "SZ2014";
            //        break;
            //    case "变形":
            //        zr = "SZ2014";
            //        break;
            //    case "划伤":
            //        zr = "SZ2021";
            //        break;
            //    default:
            //        zr = "S31006";
            //        break;
            //}
            var DefectCodeMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
            {
                ["ok"] = "",
                ["OK"] = "",
                ["异色"] = "SZ2001",
                ["磨印"] = "SZ2012",
                ["压伤"] = "SZ2014",
@@ -219,7 +269,7 @@
                ["划伤"] = "SZ2021"
            };
            const string DefaultErrorCode = "S31006";
            string zr = DefectCodeMap.TryGetValue(pro.Result, out var code) ? code : DefaultErrorCode;
@@ -232,10 +282,6 @@
                zbarcode = pro.SN,
                zresult = zresult,
                zreson = zr,
                //zreson = pro.Result == "OK" ? "" : "SZ2014",
                //
                //
                zno = znonum.ToString(),
                zwoid = pro.Zword,
                endtray = endtray,
@@ -248,7 +294,7 @@
            _sendChannel.BasicPublish("", "auto_line_mac_barcode_queue", null, body);
            var completed = await Task.WhenAny(tcs.Task, Task.Delay(timeoutMs));
            _pendingTask2.TryRemove(guid, out _);
            //_pendingTask2.TryRemove(guid, out _);
            if (completed == tcs.Task)
                return await tcs.Task;
            else
@@ -268,8 +314,15 @@
        }
    }
    public class MSGClass
    {
        public string key { get; set; }
        public string zguid { get; set; }
        public string receive { get; set; }
    }
@@ -525,21 +578,6 @@
    public class AutoLineMacQueue
    {
        /// <summary>
@@ -596,9 +634,7 @@
        /// 2:预满载(表示4号位预满载,3号位开始往4号位搬时)
        /// </summary>
        public string zstatus { get; set; }
    }
    public class AutoLineMacQueueBak
    {
        public string zbguid { get; set; }
@@ -615,14 +651,12 @@
        /// </summary>
        public string zwoid { get; set; }
    }
    public class AutoLineMacBarcodeQueue
    {
        /// <summary>
        /// 唯一ID
        /// </summary>
        public string zbguid { get; set; } = Guid.NewGuid().ToString();
        /// <summary>
        /// 时间戳,精确到耗秒
        /// </summary>
@@ -655,7 +689,7 @@
        /// 默认:N;零数尾盘:Y
        /// </summary>
        public string endtray { get; set; } = "N";
              /// <summary>
        /// <summary>
        /// 每个ztype下对应独立一个序列号,一个业务动作一个,从0开始,
        /// 每次加1,到达阈值后可重置(比如100后从0开始),只要和上一
        /// 次的不一样即可
@@ -683,6 +717,7 @@
        /// </summary>
        public string tary_label { get; set; }
    }
}