| | |
| | | using System.Threading.Tasks; |
| | | using ZXing; |
| | | |
| | | |
| | | namespace Bro.M141.Process |
| | | { |
| | | public class RabbitMQHelper |
| | |
| | | |
| | | 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") |
| | | { |
| | |
| | | InitConsumer(_receiveChannel2, _queue2, HandleQueue2Message); |
| | | } |
| | | |
| | | |
| | | |
| | | CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, "RabbitMQ 连接成功"); |
| | | } |
| | | |
| | |
| | | } |
| | | 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) |
| | |
| | | } |
| | | 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) |
| | |
| | | } |
| | | } |
| | | |
| | | 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; |
| | |
| | | _sendChannel.BasicPublish("", "auto_line_mac_queue", null, body); |
| | | |
| | | 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) |
| | | { |
| | |
| | | { |
| | | 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) |
| | | { |
| | |
| | | ["划伤"] = "SZ2021" |
| | | }; |
| | | const string DefaultErrorCode = "S31006"; |
| | | |
| | | |
| | | string zr = DefectCodeMap.TryGetValue(pro.Result, out var code) ? code : DefaultErrorCode; |
| | | |
| | | |
| | |
| | | zbarcode = pro.SN, |
| | | zresult = zresult, |
| | | zreson = zr, |
| | | //zreson = pro.Result == "OK" ? "" : "SZ2014", |
| | | // |
| | | |
| | | // |
| | | zno = znonum.ToString(), |
| | | zwoid = pro.Zword, |
| | | endtray = endtray, |
| | |
| | | _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 |
| | |
| | | } |
| | | } |
| | | |
| | | public class MSGClass |
| | | { |
| | | public string key { get; set; } |
| | | |
| | | public string zguid { get; set; } |
| | | |
| | | public string receive { get; set; } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | public class AutoLineMacQueue |
| | | { |
| | | /// <summary> |
| | |
| | | /// 2:预满载(表示4号位预满载,3号位开始往4号位搬时) |
| | | /// </summary> |
| | | public string zstatus { get; set; } |
| | | |
| | | } |
| | | |
| | | public class AutoLineMacQueueBak |
| | | { |
| | | public string zbguid { get; set; } |
| | |
| | | /// </summary> |
| | | public string zwoid { get; set; } |
| | | } |
| | | |
| | | public class AutoLineMacBarcodeQueue |
| | | { |
| | | /// <summary> |
| | | /// 唯一ID |
| | | /// </summary> |
| | | public string zbguid { get; set; } = Guid.NewGuid().ToString(); |
| | | |
| | | /// <summary> |
| | | /// 时间戳,精确到耗秒 |
| | | /// </summary> |
| | |
| | | /// 默认:N;零数尾盘:Y |
| | | /// </summary> |
| | | public string endtray { get; set; } = "N"; |
| | | /// <summary> |
| | | /// <summary> |
| | | /// 每个ztype下对应独立一个序列号,一个业务动作一个,从0开始, |
| | | /// 每次加1,到达阈值后可重置(比如100后从0开始),只要和上一 |
| | | /// 次的不一样即可 |
| | |
| | | /// </summary> |
| | | public string tary_label { get; set; } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |