From 714ea9a94ef34909cc2d03b0c64eba2d7ca16c47 Mon Sep 17 00:00:00 2001 From: zhangzhuo <512464164@qq.com> Date: Sun, 23 Mar 2025 13:09:36 +0800 Subject: [PATCH] =?UTF-8?q?BUG=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Seyounth.Hyosung.Core/Agv/HikAgv.cs | 30 ++++++- .../Agv/HyosungAgvService.cs | 16 +++- .../Agv/IHyosungAgvService.cs | 4 + .../Plc/HyosungPlcService.cs | 69 ++++++++------- .../Plc/IHyosungPlcService.cs | 4 +- Seyounth.Hyosung.Core/Scanner/HikScanner.cs | 62 ++++++++++++-- .../Scanner/HyosungScannerService.cs | 42 ++++++---- .../Entities/AgvBinEntity.cs | 3 + Seyounth.Hyosung.Data/Entities/TrayEntity.cs | 2 + .../Entities/VarietyEntity.cs | 3 + Seyounth.Hyosung.Data/Models/Tray.cs | 8 +- Seyounth.Hyosung.Data/Models/Variety.cs | 6 +- .../Services/AgvBinService.cs | 8 +- Seyounth.Hyosung.Data/Services/DictService.cs | 14 +++- .../Services/IDictService.cs | 4 + .../Services/ITrayService.cs | 2 + .../Services/IVarietyService.cs | 5 ++ Seyounth.Hyosung.Data/Services/TrayService.cs | 83 +++++++++++-------- .../Services/VarietyService.cs | 14 ++++ Seyounth.Hyosung.Data/Services/YarnService.cs | 10 +-- Seyounth.Hyosung.Runtime/HyosungRuntime.cs | 81 ++++++++++++------ Seyounth.Hyosung/ViewModels/HomeViewModel.cs | 5 ++ .../Views/Pages/HomeViewPage.xaml | 11 +-- .../Views/Pages/HomeViewPage.xaml.cs | 14 +++- 24 files changed, 357 insertions(+), 143 deletions(-) diff --git a/Seyounth.Hyosung.Core/Agv/HikAgv.cs b/Seyounth.Hyosung.Core/Agv/HikAgv.cs index e931405..294be19 100644 --- a/Seyounth.Hyosung.Core/Agv/HikAgv.cs +++ b/Seyounth.Hyosung.Core/Agv/HikAgv.cs @@ -1,6 +1,7 @@ using System.Net.Http.Json; using Microsoft.Extensions.Logging; using Seyounth.Hyosung.Core.Agv.HikModels; +using Seyounth.Hyosung.Data.Entities; namespace Seyounth.Hyosung.Core.Agv; @@ -70,13 +71,40 @@ public class HikAgv(ILogger logger) if (rs.Code != "0") { - logger.LogWarning($"{start.PositionCode} carry to {end.PositionCode} error: code is {rs.Code}"); + logger.LogWarning($"{start.PositionCode} carry to {end.PositionCode} error: code is {rs.Code} message is {rs.Message}"); return; } logger.LogInformation($"{start.PositionCode} carry to {end.PositionCode} succeed"); } + + public async Task UnBin(AgvBinEntity bin) + { + var url = Url + "bindCtnrAndBin"; + var input = new + { + reqCode = GetRequestCode(), + stgBinCode = bin.CtnrCode, + ctnrTyp = bin.HeightCode, + indBind = "0" + }; + var rs = await PostAsync(url, input); + if (rs is null) + { + logger.LogWarning($"agv unbin {bin.CtnrCode} error: result is null"); + return; + } + + if (rs.Code != "0") + { + logger.LogWarning($"agv unbin {bin.CtnrCode} error: code is {rs.Code} message:{rs.Message}"); + return; + } + + logger.LogInformation($"agv unbin {bin.CtnrCode} succeed"); + } + public async Task MovingToAsync(AgvPosition des, string taskType) { var url = Url + SchedulingTaskUri; diff --git a/Seyounth.Hyosung.Core/Agv/HyosungAgvService.cs b/Seyounth.Hyosung.Core/Agv/HyosungAgvService.cs index 5f88bab..9c6c30b 100644 --- a/Seyounth.Hyosung.Core/Agv/HyosungAgvService.cs +++ b/Seyounth.Hyosung.Core/Agv/HyosungAgvService.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Logging; using Seyounth.Hyosung.Core.Agv.HikModels; +using Seyounth.Hyosung.Data.Entities; using Seyounth.Hyosung.Data.Services; namespace Seyounth.Hyosung.Core.Agv; @@ -23,7 +24,7 @@ public class HyosungAgvService( } while (status is null); var tray = await trayService.GetByCode(trayCode); - var height = (int)Math.Ceiling((double)(tray.StackHeight / 10.0)!); + var height = (int)Math.Ceiling((double)((tray.StackHeight??0) / 10.0)!); var bin = await agvBinService.GetAvailableBin(height); AgvPosition start = new AgvPosition() { @@ -35,8 +36,21 @@ public class HyosungAgvService( PositionCode = bin.CtnrCode, Type = "05" }; + if(!string.IsNullOrEmpty(bin.HeightCode)) + await UnBin(bin); var ctnrType = await dictService.GetKeyAsync("AgvRackType", bin.Height.ToString()); + if (string.IsNullOrEmpty(ctnrType)) + ctnrType = "14"; + bin.HeightCode = ctnrType; + await _agv.CarryToAsync(start, stop, ctnrType, 120, "1"); await agvBinService.BindAsync(bin); + //等待30秒 确保AGV已经把产品叉出 + await Task.Delay(30 * 1000); + } + + public async Task UnBin(AgvBinEntity bin) + { + await _agv.UnBin(bin); } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Agv/IHyosungAgvService.cs b/Seyounth.Hyosung.Core/Agv/IHyosungAgvService.cs index a94d7a0..95ed16a 100644 --- a/Seyounth.Hyosung.Core/Agv/IHyosungAgvService.cs +++ b/Seyounth.Hyosung.Core/Agv/IHyosungAgvService.cs @@ -1,3 +1,5 @@ +using Seyounth.Hyosung.Data.Entities; + namespace Seyounth.Hyosung.Core.Agv; public interface IHyosungAgvService @@ -8,4 +10,6 @@ public interface IHyosungAgvService /// /// Task StorageAsync(string trayCode); + + Task UnBin(AgvBinEntity bin); } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs b/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs index 5779c2f..ab449a4 100644 --- a/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs +++ b/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using MCProtocol; using Microsoft.Extensions.Logging; using Seyounth.Hyosung.Data.Models; @@ -74,7 +75,7 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS } public async Task LeaveCompletedAsync() - { + { await _writer.WriteShortsAsync(4020, 0); await _writer.WriteShortsAsync(13012, 0); await _writer.WriteShortsAsync(4520, 1); @@ -105,32 +106,32 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS await _writer.WriteShortsAsync(12120, ls.ToArray()); } - public async Task WritePrintLabelResultAsync(int index, int side, bool result) + public async Task WritePrintLableOptionsAsync(int side) + { + short data = 0; + switch (side) + { + case 0: + data = 1; + break; + case 1: + data = 2; + break; + case 2: + data = 6; + break; + case 3: + data = 14; + break; + case 4: + data = 30; + break; + } + await _writer.WriteShortsAsync(13050, [1, 1, 1, 2]); + } + public async Task WritePrintLabelResultAsync(int index, bool result) { var address = index == 1 ? 13060 : 13061; - if (index == 2) - { - short data = 0; - switch (side) - { - case 0: - data = 1; - break; - case 1: - data = 2; - break; - case 2: - data = 6; - break; - case 3: - data = 14; - break; - case 4: - data = 30; - break; - } - await _writer.WriteShortsAsync(13050, [1,1,1, data] ); - } await _writer.WriteShortsAsync(address, (short)(result ? 1 : 2)); } @@ -166,8 +167,8 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS { await QueryScanProductRequest(); await QueryScanFixtureRequest(); - if (!isLeaving) - await QueryLeavingProductionLine(); + if(!isLeaving) + await QueryLeavingProductionLine(); await QueryNeedTrayCode(); await QueryPutOnceCompleted(); await QueryPackLineOption(); @@ -234,17 +235,17 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS // var stackStatus = await _reader.ReadShortsAsync(12110, 1); if (leavingProductionLine[0] == 1) { - await _writer.WriteShortsAsync(4020, 0); + var trayCode = await _reader.ReadStringAsync(12600); - if (!string.IsNullOrEmpty(trayCode)) - { + //if (!string.IsNullOrEmpty(trayCode)) + //{ PlcStackInfo info = new PlcStackInfo() { TrayCode = trayCode }; isLeaving = true; OnPlcRequestLeavingProductionLine?.Invoke(info); - } + // } } } @@ -273,6 +274,7 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS var status = await _reader.ReadShortsAsync(4691, 2); if (status[0] > 0) { + logger.LogInformation($"request put yarn completed"); await _writer.WriteShortsAsync(4690, 0, 0, 0); var trayCode = await _reader.ReadStringAsync(4620); var yarn1 = await _reader.ReadStringAsync(4630); @@ -284,6 +286,7 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS YarnCount = status[0], TotalYarnCount = status[1] }; + logger.LogInformation($"request put yarn get info: {JsonSerializer.Serialize(info)}"); if (!string.IsNullOrEmpty(yarn1)) info.YarnCode.Add(yarn1); if (!string.IsNullOrEmpty(yarn2)) @@ -319,7 +322,7 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS private async Task QueryGetPrintLabel() { var trayCode = await _reader.ReadStringAsync(13000); - if (!string.IsNullOrEmpty(trayCode)||!trayCode.StartsWith("0000")) + if (!string.IsNullOrEmpty(trayCode)&&!trayCode.StartsWith("0000")) { await _reader.WriteStringAsync(13000, "00000000000000000000"); OnRequestGetPrintLableOption?.Invoke(trayCode); @@ -344,4 +347,6 @@ public class HyosungPlcService(ILogger logger) : IHyosungPlcS OnRequestPrintLabel?.Invoke(2, requestPrintLabel[2]); } } + + } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs b/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs index a0f2600..d5e0ab4 100644 --- a/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs +++ b/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs @@ -58,7 +58,9 @@ public interface IHyosungPlcService Task WritePackLineOptionAsync(PackLineOption option); - Task WritePrintLabelResultAsync(int index, int side, bool result); + Task WritePrintLableOptionsAsync(int side); + + Task WritePrintLabelResultAsync(int index, bool result); /// /// Plc璇锋眰鎵弿浜у搧 diff --git a/Seyounth.Hyosung.Core/Scanner/HikScanner.cs b/Seyounth.Hyosung.Core/Scanner/HikScanner.cs index 5f0f473..e3294af 100644 --- a/Seyounth.Hyosung.Core/Scanner/HikScanner.cs +++ b/Seyounth.Hyosung.Core/Scanner/HikScanner.cs @@ -23,27 +23,71 @@ public class HikScanner(string host, int port) _socket.Dispose(); } - public async Task ScanAsync() + public async Task Restart() { try { - byte[] cmd = "start"u8.ToArray(); - await _socket.SendAsync(cmd); - byte[] buffer = new byte[1024]; - int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(2000)); - cmd = "stop"u8.ToArray(); - await _socket.SendAsync(cmd); + _socket.Close(); + } + finally + { + + _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + await _socket.ConnectAsync(Host, Port); + } + } + + public async Task Stop() + { + var cmd = "stop"u8.ToArray(); + await _socket.SendAsync(cmd); + } + + public async Task ScanAsync() + { + var barcode = string.Empty; + try + { + if (!_socket.Connected) + { + _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + await _socket.ConnectAsync(Host, Port); + } byte[] _ = new byte[1024]; while (_socket.Available > 0) { await _socket.ReceiveAsync(_, SocketFlags.None); } - return Encoding.ASCII.GetString(buffer, 0, len); + _socket.ReceiveTimeout = 1000; + byte[] cmd = "start"u8.ToArray(); + await _socket.SendAsync(cmd); + byte[] buffer = new byte[1024]; + int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(1000)); + barcode= Encoding.ASCII.GetString(buffer, 0, len); } catch (Exception e) { - return string.Empty; + _socket.Close(); + _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + await _socket.ConnectAsync(Host, Port); + byte[] _ = new byte[1024]; + while (_socket.Available > 0) + { + await _socket.ReceiveAsync(_, SocketFlags.None); + } + _socket.ReceiveTimeout = 1000; + byte[] cmd = "start"u8.ToArray(); + await _socket.SendAsync(cmd); + byte[] buffer = new byte[1024]; + int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(1000)); + barcode= Encoding.ASCII.GetString(buffer, 0, len); } + finally + { + var cmd = "stop"u8.ToArray(); + await _socket.SendAsync(cmd); + } + return barcode; // 娓呯┖缂撳啿鍖 闃叉鏀跺埌涔嬪墠鐨勬暟鎹 } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs b/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs index 92270eb..e8da46d 100644 --- a/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs +++ b/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs @@ -102,42 +102,48 @@ public class HyosungScannerService : IHyosungScannerService public async Task ScanYarnAsync(int varietyId) { - List> ls = _yarnScanners.Select(scanner => scanner.ScanAsync() - .ContinueWith(task => - { - if (task.IsCompletedSuccessfully && !string.IsNullOrEmpty(task.Result)) - { - _logger.LogInformation($"scanner[{scanner.Host}:{scanner.Port}] scan yarn {task.Result}"); - return Yarn.Create(task.Result, varietyId); - } - - return null; - })) - .ToList(); + List> ls = _yarnScanners.Select(scanner => scanner.ScanAsync()).ToList(); + //鍋滄鎵鏈夌殑鎵爜鏋 + while (ls.Count > 0) { // 浣跨敤 Task.WhenAny 鏂规硶绛夊緟浠绘剰涓涓换鍔″畬鎴 - Task completedTask = await Task.WhenAny(ls); + Task completedTask = await Task.WhenAny(ls); // 绉婚櫎宸茬粡瀹屾垚鐨勪换鍔 ls.Remove(completedTask); // 鑾峰彇瀹屾垚浠诲姟鐨勭粨鏋 - Yarn? result = await completedTask; + string result = await completedTask; // 濡傛灉缁撴灉涓嶄负绌猴紝绔嬪嵆杩斿洖缁撴灉 - if (result != null) + if (!string.IsNullOrEmpty(result)) { - return result; + _yarnScanners.Select(async scanner => await scanner.Stop()); + return Yarn.Create(result, varietyId); + + + } } - + //_yarnScanners.Select( scanner => scanner.Stop()); _logger.LogWarning($"all scanner no scan yarn"); + _yarnScanners.Select(async scanner => await scanner.Restart()); // 濡傛灉鎵鏈変换鍔¢兘瀹屾垚涓旀病鏈夋壘鍒伴潪绌虹粨鏋滐紝杩斿洖 null return null; } public async Task ScanFixtureAsync(int fixtureId) { - return await _fixtureScanners[fixtureId].ScanAsync(); + try + { + return await _fixtureScanners[fixtureId].ScanAsync(); + } + catch(Exception e) + { + _logger.LogError(e, $"Fixture{fixtureId} Scan Error"); + await _fixtureScanners[fixtureId].Restart(); + return await _fixtureScanners[fixtureId].ScanAsync(); + } + //string code = ""; //do //{ diff --git a/Seyounth.Hyosung.Data/Entities/AgvBinEntity.cs b/Seyounth.Hyosung.Data/Entities/AgvBinEntity.cs index b426c16..4f129a4 100644 --- a/Seyounth.Hyosung.Data/Entities/AgvBinEntity.cs +++ b/Seyounth.Hyosung.Data/Entities/AgvBinEntity.cs @@ -32,5 +32,8 @@ public class AgvBinEntity [SugarColumn(ColumnDescription = "鎺掑簭")] public int Sort { get; set; } + [SugarColumn(IsNullable =true)] + public string HeightCode { get; set; } + public bool IsDeleted { get; set; } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Entities/TrayEntity.cs b/Seyounth.Hyosung.Data/Entities/TrayEntity.cs index 3e4c1d3..ba90e54 100644 --- a/Seyounth.Hyosung.Data/Entities/TrayEntity.cs +++ b/Seyounth.Hyosung.Data/Entities/TrayEntity.cs @@ -42,4 +42,6 @@ public class TrayEntity [SugarColumn(IsNullable = true)] public int? AgvBinId { get; set; } [SugarColumn(IsNullable = true)] public string? Barcode { get; set; } + + [SugarColumn(IsNullable = true)] public bool? IsPacking { get; set; } = false; } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs b/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs index 0b747c8..4befcaa 100644 --- a/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs +++ b/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs @@ -83,5 +83,8 @@ public class VarietyEntity [SugarColumn(ColumnDescription = "鍓爣绛炬暟閲")] public int SubLabelCount { get; set; } + + [SugarColumn(IsNullable =true)] + public int? LastNo { get; set; } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Models/Tray.cs b/Seyounth.Hyosung.Data/Models/Tray.cs index 523c9c9..77e7c7b 100644 --- a/Seyounth.Hyosung.Data/Models/Tray.cs +++ b/Seyounth.Hyosung.Data/Models/Tray.cs @@ -38,6 +38,8 @@ public class Tray public string? Barcode { get; set; } + public bool? IsPacking { get; set; } + public TrayEntity ToEntity() { return new TrayEntity() @@ -58,7 +60,8 @@ public class Tray Type = Type, Unit = Unit, AgvBinId = AgvBinId, - Barcode = Barcode + Barcode = Barcode, + IsPacking= IsPacking }; } @@ -82,7 +85,8 @@ public class Tray Type = entity.Type, Unit = entity.Unit, AgvBinId = entity.AgvBinId, - Barcode = entity.Barcode + Barcode = entity.Barcode, + IsPacking=entity.IsPacking }; } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Models/Variety.cs b/Seyounth.Hyosung.Data/Models/Variety.cs index 7327d8e..13fd136 100644 --- a/Seyounth.Hyosung.Data/Models/Variety.cs +++ b/Seyounth.Hyosung.Data/Models/Variety.cs @@ -64,6 +64,8 @@ public class Variety public bool IsTurn { get; set; } + public int? LastNo { get; set; } + public static Variety Create(VarietyEntity entity, List pallets) { var variety = new Variety() @@ -92,7 +94,8 @@ public class Variety MiddlePallet = Pallet.FromEntity(pallets.First(x => x.Id == entity.MiddlePalletId)), TopAndBottomPallet = Pallet.FromEntity(pallets.First(x => x.Id == entity.TopAndBottomPalletId)), Tray = Pallet.FromEntity(pallets.First(x => x.Id == entity.TrayId)), - HasBox = entity.HasBox + HasBox = entity.HasBox, + LastNo = entity.LastNo }; if (entity.PaperTrayId != null && entity.PaperTrayId != 0) variety.PaperTray = Pallet.FromEntity(pallets.First(x => x.Id == entity.PaperTrayId)); @@ -130,6 +133,7 @@ public class Variety TopAndBottomPalletId = TopAndBottomPallet.Id, TrayId = Tray.Id, HasBox = HasBox, + LastNo=LastNo }; return entity; } diff --git a/Seyounth.Hyosung.Data/Services/AgvBinService.cs b/Seyounth.Hyosung.Data/Services/AgvBinService.cs index 166d3ca..d14fa6c 100644 --- a/Seyounth.Hyosung.Data/Services/AgvBinService.cs +++ b/Seyounth.Hyosung.Data/Services/AgvBinService.cs @@ -19,18 +19,18 @@ public class AgvBinService : IAgvBinService public async Task GetAvailableBin(int height) { - var bin = await _repository.AsQueryable() + var bin = await _repository.CopyNew().AsQueryable() .Where(x => x.IsFree && !x.IsDeleted).OrderBy(x => x.Sort).FirstAsync(); if (bin.BinCode == "B10") { - await _repository.AsUpdateable() + await _repository.CopyNew().AsUpdateable() .Where(x => x.RackType == 2 && !x.IsDeleted) .SetColumns(x => x.IsFree, true) .ExecuteCommandAsync(); } else if (bin.BinCode == "B33") { - await _repository.AsUpdateable() + await _repository.CopyNew().AsUpdateable() .Where(x => x.RackType == 1 && !x.IsDeleted) .SetColumns(x => x.IsFree, true) .ExecuteCommandAsync(); @@ -43,6 +43,6 @@ public class AgvBinService : IAgvBinService { entity.IsFree = false; _cache.First(e => e.Id == entity.Id).IsFree = false; - return _repository.UpdateAsync(entity); + return _repository.CopyNew().UpdateAsync(entity); } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/DictService.cs b/Seyounth.Hyosung.Data/Services/DictService.cs index 3d74446..5f14b5c 100644 --- a/Seyounth.Hyosung.Data/Services/DictService.cs +++ b/Seyounth.Hyosung.Data/Services/DictService.cs @@ -22,11 +22,23 @@ public class DictService : IDictService public async Task GetKeyAsync(string type, string name) { - return _cache.FirstOrDefault(d => d.Type == type && d.Value == name)?.Value ?? ""; + return _cache.FirstOrDefault(d => d.Type == type && d.Value == name)?.Key ?? ""; } public async Task> GetDictsByTypeAsync(string type) { return _cache.Where(d => d.Type == type).ToList(); } + + public async Task SetValue(string type, string key, string value) + { + await _repository.CopyNew().AsUpdateable() + .Where(x => x.Type == type && x.Key == key).SetColumns(x => x.Value, value).ExecuteCommandAsync(); ; + } + + public async Task GetValue(string type, string key) + { + var dict = await _repository.CopyNew().GetFirstAsync(x => x.Type == type && x.Key == key); + return dict.Value; + } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/IDictService.cs b/Seyounth.Hyosung.Data/Services/IDictService.cs index 8d7dd5c..14f7682 100644 --- a/Seyounth.Hyosung.Data/Services/IDictService.cs +++ b/Seyounth.Hyosung.Data/Services/IDictService.cs @@ -7,4 +7,8 @@ public interface IDictService Task GetKeyAsync(string type, string value); Task> GetDictsByTypeAsync(string type); + + Task SetValue(string type, string key,string value); + + Task GetValue(string type, string key); } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/ITrayService.cs b/Seyounth.Hyosung.Data/Services/ITrayService.cs index 2523bf6..4174a0f 100644 --- a/Seyounth.Hyosung.Data/Services/ITrayService.cs +++ b/Seyounth.Hyosung.Data/Services/ITrayService.cs @@ -27,6 +27,8 @@ public interface ITrayService /// Task GetByCode(string code); + Task GetIsPacking(); + /// /// 鐢熸垚鎺у埗鍙 /// diff --git a/Seyounth.Hyosung.Data/Services/IVarietyService.cs b/Seyounth.Hyosung.Data/Services/IVarietyService.cs index dbdd33c..a549ea1 100644 --- a/Seyounth.Hyosung.Data/Services/IVarietyService.cs +++ b/Seyounth.Hyosung.Data/Services/IVarietyService.cs @@ -39,4 +39,9 @@ public interface IVarietyService /// /// Task AddPalletAsync(Pallet pallet); + + + Task SetLastNo(int varietyId, int lastNo); + + Task GetLastNo(int varietyId); } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/TrayService.cs b/Seyounth.Hyosung.Data/Services/TrayService.cs index 8355635..c1df37a 100644 --- a/Seyounth.Hyosung.Data/Services/TrayService.cs +++ b/Seyounth.Hyosung.Data/Services/TrayService.cs @@ -6,25 +6,29 @@ using Seyounth.Hyosung.Data.Models; using Seyounth.Hyosung.Data.Repositories; using Seyounth.Hyosung.Data.Services.Hyosung; using Seyounth.Hyosung.Data.Services.Hyosung.Entities; +using SqlSugar; namespace Seyounth.Hyosung.Data.Services; public class TrayService : ITrayService { - private readonly ConcurrentDictionary _cache = new(); - private readonly IRepository _repository; + //private readonly ConcurrentDictionary _cache = new(); + // private readonly _repository; private readonly IHyosungWmsService _hyosungWmsService; - public TrayService(IServiceProvider provider, IHyosungWmsService hyosungWmsService) + private readonly ISqlSugarClient _db; + + public TrayService(IServiceProvider provider, IHyosungWmsService hyosungWmsService,ISqlSugarClient db) { - _repository = provider.CreateScope().ServiceProvider.GetRequiredService>(); + _db = db; + // _repository = provider.CreateScope().ServiceProvider.GetRequiredService>(); //_repository = provider.GetService>(); - var trays = _repository.GetList(t => t.ControlNo == null); + // var trays = _db.Queryable().Where(t => t.ControlNo == null).ToListAsync().Result; _hyosungWmsService = hyosungWmsService; - foreach (var tray in trays) - { - _cache.TryAdd(tray.TrayCode, Tray.FromEntity(tray)); - } + //foreach (var tray in trays) + //{ + // _cache.TryAdd(tray.TrayCode, Tray.FromEntity(tray)); + //} } public async Task GeneraNewTray(int varietyId) @@ -35,29 +39,29 @@ public class TrayService : ITrayService VarietyId = varietyId, CreateTime = DateTime.Now }; - var count = await _repository.CountAsync(t => t.VarietyId == tray.VarietyId); + var count = await _db.CopyNew().Queryable().CountAsync(t => t.VarietyId == tray.VarietyId); tray.IsEven = count % 2 == 0; - var identity = await _repository.InsertReturnIdentityAsync(tray.ToEntity()); + var identity = await _db.CopyNew().Insertable(tray.ToEntity()).ExecuteReturnIdentityAsync(); tray.Id = identity; - _cache.TryAdd(tray.TrayCode, tray); + // _cache.TryAdd(tray.TrayCode, tray); return tray; } public async Task GetIdByCode(string code) { - try - { - return _cache[code].Id; - } - catch - { - return (await _repository.GetFirstAsync(d => d.TrayCode == code)).Id; - } + //try + //{ + // return _cache[code].Id; + //} + //catch + //{ + return (await _db.CopyNew().Queryable().Where(d => d.TrayCode == code).FirstAsync()).Id; + // } } public async Task GetByCode(string code) { - return Tray.FromEntity(await _repository.GetSingleAsync(t => t.TrayCode == code)); + return Tray.FromEntity(await _db.CopyNew().Queryable().Where(t => t.TrayCode == code).FirstAsync()); } public Task StorageAsync(string trayCode, int stackHeight, int controlNo, MST_ITEM_2240_V itemInfo) @@ -68,14 +72,14 @@ public class TrayService : ITrayService public async Task PrintTrayAsync(string trayCode, int controlNo, MST_ITEM_2240_V itemInfo) { Tray tray; - try - { - tray = _cache[trayCode]; - } - catch - { + //try + //{ + // tray = _cache[trayCode]; + //} + //catch + //{ tray = await GetByCode(trayCode); - } + //} tray.ControlNo = controlNo; tray.Grade = itemInfo.GRADE; @@ -87,23 +91,32 @@ public class TrayService : ITrayService tray.GrossWeight = itemInfo.GROSS_WEIGHT; tray.Barcode = $"{itemInfo.ITEM_CODE} {DateTime.Now:yyMMdd}00{itemInfo.LOTNO.PadLeft(4, '0')}{controlNo.ToString().PadLeft(4, '0')}0"; - await _repository.UpdateAsync(tray.ToEntity()); - _cache.Remove(tray.TrayCode, out _); + await _db.Updateable(tray.ToEntity()).ExecuteCommandAsync(); + // _cache.Remove(tray.TrayCode, out _); return tray; } public async Task StorageAsync(string trayCode) { - var tray = await _repository.GetFirstAsync(d => d.TrayCode == trayCode); + var tray = await _db.CopyNew().Queryable().Where(d => d.TrayCode == trayCode).FirstAsync(); tray.FinishTime = DateTime.Now; - await _repository.UpdateAsync(tray); - _cache.TryRemove(tray.TrayCode, out _); + tray.IsPacking = true; + await _db.CopyNew().Updateable(tray).ExecuteCommandAsync(); + // _cache.TryRemove(tray.TrayCode, out _); } public async Task UpdateHeightAsync(string trayCode, int height) { - await _repository.AsUpdateable() + await _db.CopyNew().Updateable() .Where(x => x.TrayCode == trayCode) - .SetColumns(x => x.StackHeight, height).ExecuteCommandAsync(); + .SetColumns(x => x.StackHeight, height) + .SetColumns(x => x.IsPacking, false) + .ExecuteCommandAsync(); + } + + public async Task GetIsPacking() + { + var tray= await _db.CopyNew().Queryable().Where(x => x.IsPacking!=null&&x.IsPacking.Value).FirstAsync(); + return Tray.FromEntity(tray); } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/VarietyService.cs b/Seyounth.Hyosung.Data/Services/VarietyService.cs index 5f0b9d5..78a42a6 100644 --- a/Seyounth.Hyosung.Data/Services/VarietyService.cs +++ b/Seyounth.Hyosung.Data/Services/VarietyService.cs @@ -86,4 +86,18 @@ public class VarietyService : IVarietyService { return _varietiesCache.Select(v => Variety.Create(v, _palletsCache.ToList())).ToList(); } + + public async Task GetLastNo(int varietyId) + { + var variety = await (_varietyRepository.CopyNew().GetFirstAsync(x=>x.Id==varietyId)); + return variety.LastNo; + } + + public async Task SetLastNo(int varietyId,int lastNo) + { + await _varietyRepository.CopyNew().AsUpdateable() + .Where(x => x.Id == varietyId) + .SetColumns(x => x.LastNo , lastNo) + .ExecuteCommandAsync(); + } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Data/Services/YarnService.cs b/Seyounth.Hyosung.Data/Services/YarnService.cs index 2497a44..67ac94a 100644 --- a/Seyounth.Hyosung.Data/Services/YarnService.cs +++ b/Seyounth.Hyosung.Data/Services/YarnService.cs @@ -26,7 +26,7 @@ public class YarnService : IYarnService public async Task AddYarnAsync(Yarn yarn) { - var id = await _yarnRepository.InsertReturnIdentityAsync(yarn.ToEntity()); + var id = await _yarnRepository.CopyNew().InsertReturnIdentityAsync(yarn.ToEntity()); yarn.Id = id; NoFinished.TryAdd(yarn.ScanCode, yarn); return yarn; @@ -34,7 +34,7 @@ public class YarnService : IYarnService public async Task> GetYarnsByTrayIdAsync(int trayId) { - return (await _yarnRepository.GetListAsync(y => y.TrayId == trayId)) + return (await _yarnRepository.CopyNew().GetListAsync(y => y.TrayId == trayId)) .Select(Yarn.FromEntity).ToList(); } @@ -46,7 +46,7 @@ public class YarnService : IYarnService } catch { - return Yarn.FromEntity(await _yarnRepository.GetFirstAsync(d => d.ScanCode == code)) ; + return Yarn.FromEntity(await _yarnRepository.CopyNew().GetFirstAsync(d => d.ScanCode == code)) ; } } @@ -55,7 +55,7 @@ public class YarnService : IYarnService { var yarn = NoFinished[yarnCode]; yarn.IsFinished = true; - await _yarnRepository.UpdateAsync(yarn.ToEntity()); + await _yarnRepository.CopyNew().UpdateAsync(yarn.ToEntity()); NoFinished.TryRemove(yarnCode, out _); } @@ -66,7 +66,7 @@ public class YarnService : IYarnService yarn.StackTime = DateTime.Now; yarn.IsFinished = true; yarn.IsFinished = true; - await _yarnRepository.UpdateAsync(yarn.ToEntity()); + await _yarnRepository.CopyNew().UpdateAsync(yarn.ToEntity()); NoFinished.TryRemove(yarnCode, out _); } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Runtime/HyosungRuntime.cs b/Seyounth.Hyosung.Runtime/HyosungRuntime.cs index f435ca0..33c0d9c 100644 --- a/Seyounth.Hyosung.Runtime/HyosungRuntime.cs +++ b/Seyounth.Hyosung.Runtime/HyosungRuntime.cs @@ -25,12 +25,15 @@ public class HyosungRuntime( ITrayService trayService, IVarietyService varietyService, IHyosungAgvService hyosungAgvService, - IHyosungWmsService hyosungWmsService) : IHyosungRuntime + IHyosungWmsService hyosungWmsService, + IDictService dictService) : IHyosungRuntime { public PackLineOption PackLineOption { get; private set; } public StackStationModel Stack1 { get; private set; } = new(); public StackStationModel Stack2 { get; private set; } = new(); + private ConcurrentQueue _packingQueue = new ConcurrentQueue(); + private string currentPrintTrayCode = ""; public async Task StartAsync(CancellationToken token) @@ -153,6 +156,7 @@ public class HyosungRuntime( { await trayService.StorageAsync(info.TrayCode); await hyosungAgvService.StorageAsync(info.TrayCode); + _packingQueue?.TryDequeue(out _); //鏍囧織涓嬬嚎宸插畬鎴 await hyosungPlcService.LeaveCompletedAsync(); logger.LogInformation($"plc leaving production line success"); @@ -257,26 +261,44 @@ public class HyosungRuntime( logger.LogInformation($"plc request pack line option"); try { + var tray = await trayService.GetByCode(arg); var variety = await varietyService.GetById(tray.VarietyId); + if (_packingQueue is null) + _packingQueue = new ConcurrentQueue(); + _packingQueue.Enqueue(variety.Id); + var mod = await hyosungWmsService.GetItemInfoByItemCode(variety.Code); + var grade = "1"; + if (mod.GRADE != "AA") grade = mod.GRADE; + var count = _packingQueue.Count(x => x == variety.Id); + var control = await varietyService.GetLastNo(variety.Id); + if (control is null) + control = await hyosungWmsService.GetControlNo(variety, grade); + else + control =control+count; + var isEven = control % 2 == 0; PackLineOption = new PackLineOption() { HeadCount = variety.StackHeadCount ?? 0, HasBox = variety.HasBox, - IsTop = variety.NeedTopBoard is NeedType.Need or NeedType.NotNeed - ? variety.NeedTopBoard == NeedType.Need - : tray.IsEven && variety.NeedTopBoard == NeedType.EvenNeed, - IsPack = variety.NeedPackStrap is NeedType.Need or NeedType.NotNeed - ? variety.NeedPackStrap == NeedType.Need - : tray.IsEven && variety.NeedPackStrap == NeedType.EvenNeed, - IsFilm = variety.NeedFilmWrapping is NeedType.Need or NeedType.NotNeed - ? variety.NeedFilmWrapping == NeedType.Need - : tray.IsEven && variety.NeedFilmWrapping == NeedType.EvenNeed, - IsLam = variety.NeedFilmCoating is NeedType.Need or NeedType.NotNeed - ? variety.NeedFilmCoating == NeedType.Need - : tray.IsEven && variety.NeedFilmCoating == NeedType.EvenNeed, TrayCode = arg }; + if (variety.NeedTopBoard == NeedType.Need || (isEven && variety.NeedTopBoard == NeedType.EvenNeed) || (!isEven && variety.NeedTopBoard == NeedType.OddNeed)) + PackLineOption.IsTop = true; + else + PackLineOption.IsTop = false; + if (variety.NeedPackStrap == NeedType.Need || (isEven && variety.NeedPackStrap == NeedType.EvenNeed) || (!isEven && variety.NeedPackStrap == NeedType.OddNeed)) + PackLineOption.IsPack = true; + else + PackLineOption.IsPack = false; + if (variety.NeedFilmWrapping == NeedType.Need || (isEven && variety.NeedFilmWrapping == NeedType.EvenNeed) || (!isEven && variety.NeedFilmWrapping == NeedType.OddNeed)) + PackLineOption.IsFilm = true; + else + PackLineOption.IsFilm = false; + if (variety.NeedFilmCoating == NeedType.Need || (isEven && variety.NeedFilmCoating == NeedType.EvenNeed) || (!isEven && variety.NeedFilmCoating == NeedType.OddNeed)) + PackLineOption.IsLam = true; + else + PackLineOption.IsLam = false; await hyosungPlcService.WritePackLineOptionAsync(PackLineOption); logger.LogInformation($"plc request pack line option success"); } @@ -294,12 +316,18 @@ public class HyosungRuntime( var mod = await hyosungWmsService.GetItemInfoByItemCode(variety.Code); var grade = "1"; if (mod.GRADE != "AA") grade = mod.GRADE; - int controlNo = 0; + int? controlNo; if (tray.ControlNo is null || tray.ControlNo == 0) { - controlNo = await hyosungWmsService.GetControlNo(variety, grade); - tray = await trayService.PrintTrayAsync(arg, controlNo, mod); + controlNo = await varietyService.GetLastNo(variety.Id); + if (controlNo is null) + controlNo = await hyosungWmsService.GetControlNo(variety, grade); + else + controlNo += 1; + tray = await trayService.PrintTrayAsync(arg, controlNo.Value, mod); } + await dictService.SetValue("System", "CurrentPackingTrayCode", arg); + await hyosungPlcService.WritePrintLableOptionsAsync( variety.MasterLabelCount); } /// @@ -311,23 +339,26 @@ public class HyosungRuntime( /// private async Task OnPlcRequestPrintLabel(int arg1, int height) { - logger.LogInformation($"plc request print label:{arg1} {currentPrintTrayCode} {height}"); - var tray = await trayService.GetByCode(currentPrintTrayCode); + var trayCode = await dictService.GetValue("System", "CurrentPackingTrayCode"); + var tray = await trayService.GetByCode(trayCode); + logger.LogInformation($"plc request print label:{arg1} {tray.TrayCode} {height}"); + //var tray = await trayService.GetByCode(currentPrintTrayCode); var variety = await varietyService.GetById(tray.VarietyId); - await trayService.UpdateHeightAsync(currentPrintTrayCode, height); + await trayService.UpdateHeightAsync(tray.TrayCode, height); try { if (arg1 == 1) { - await printer.PrintAsync(1, currentPrintTrayCode); - await hyosungPlcService.WritePrintLabelResultAsync(arg1, variety.SubLabelCount, true); + await printer.PrintAsync(1, tray.TrayCode); + await hyosungPlcService.WritePrintLabelResultAsync(arg1, true); } else { - await printer.PrintAsync(2, currentPrintTrayCode); - await hyosungPlcService.WritePrintLabelResultAsync(arg1, variety.MasterLabelCount, true); - await hyosungWmsService.UpdateControlNo(variety, tray.ControlNo.Value); + await printer.PrintAsync(2, tray.TrayCode); + await hyosungPlcService.WritePrintLabelResultAsync(arg1, true); + await varietyService.SetLastNo(variety.Id, tray.ControlNo.Value); + //await hyosungWmsService.UpdateControlNo(variety, tray.ControlNo.Value); await hyosungWmsService.AddLabelResult(new LabelResult(tray, variety)); } @@ -337,7 +368,7 @@ public class HyosungRuntime( } catch (Exception e) { - await hyosungPlcService.WritePrintLabelResultAsync(arg1, 1, false); + await hyosungPlcService.WritePrintLabelResultAsync(arg1, false); logger.LogError(e, "print label fail"); } } diff --git a/Seyounth.Hyosung/ViewModels/HomeViewModel.cs b/Seyounth.Hyosung/ViewModels/HomeViewModel.cs index b48e525..d2dfbaa 100644 --- a/Seyounth.Hyosung/ViewModels/HomeViewModel.cs +++ b/Seyounth.Hyosung/ViewModels/HomeViewModel.cs @@ -19,6 +19,8 @@ public partial class HomeViewModel : ObservableObject [ObservableProperty] private List _yarnCarTypes; + [ObservableProperty] private List _yarnCarSide; + [ObservableProperty] private Variety _selectedVariety; [ObservableProperty] private PackLineOption _packLineOption; @@ -36,6 +38,9 @@ public partial class HomeViewModel : ObservableObject _yarnCarTypes.Add("B"); _yarnCarTypes.Add("C"); _yarnCarTypes.Add("D"); + _yarnCarSide = new(); + _yarnCarSide.Add("姝i潰"); + _yarnCarSide.Add("鍙嶉潰"); _varieties = new ObservableCollection(varietyService.GetAll()); DispatcherTimer timer = new DispatcherTimer(); timer = new DispatcherTimer(); diff --git a/Seyounth.Hyosung/Views/Pages/HomeViewPage.xaml b/Seyounth.Hyosung/Views/Pages/HomeViewPage.xaml index 3ffc4b3..770c676 100644 --- a/Seyounth.Hyosung/Views/Pages/HomeViewPage.xaml +++ b/Seyounth.Hyosung/Views/Pages/HomeViewPage.xaml @@ -173,11 +173,12 @@ Foreground="White" ItemsSource="{Binding ViewModel.YarnCarTypes}" /> - + Foreground="White" Grid.Row="2" Grid.Column="0" Text="绾辫溅姝e弽闈:" /> + @@ -67,7 +71,11 @@ namespace Seyounth.Hyosung.Views.Pages { var variety = selectedItem as Variety; var info = await _wmsService.GetItemInfoByItemCode(variety.Code); - var controlNo = await _wmsService.GetControlNo(variety, info.GRADE); + int? controlNo; + if (variety.LastNo is null || variety.LastNo == 0) + controlNo = await _wmsService.GetControlNo(variety, info.GRADE); + else + controlNo = variety.LastNo + 1; await Dispatcher.InvokeAsync(() => { ControlNoTextBlock.Text = $"鎺у埗鍙: {controlNo}";