¶Ô±ÈÐÂÎļþ |
| | |
| | | //using CMS.Extensions.Variable; |
| | | //using CMS.Plugin.FlowManagement.Abstractions.FlowBusiness; |
| | | //using CMS.Plugin.PipeLineLems.Apis; |
| | | //using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.MyTestEntityNames; |
| | | //using CMS.Plugin.PipeLineLems.Domain.MyTestEntityNames; |
| | | //using CMS.Plugin.PipeLineLems.Jobs; |
| | | //using CMS.Plugin.ProcessManagement.Abstractions; |
| | | //using CMS.Plugin.TraceManagement.Abstractions.Models.Traces; |
| | | //using CMS.Plugin.TraceManagement.Abstractions; |
| | | //using CMS.Project; |
| | | //using CMS.Project.Abstractions; |
| | | //using CMS.Unit.RuntimeValue.Abstractions; |
| | | //using KissUtil.Extensions; |
| | | //using Microsoft.Extensions.DependencyInjection; |
| | | //using Microsoft.Extensions.Logging; |
| | | //using System; |
| | | //using Volo.Abp.BackgroundJobs; |
| | | //using Volo.Abp.Uow; |
| | | |
| | | //namespace CMS.Plugin.PipeLineLems.ProjectService |
| | | //{ |
| | | // /// <summary> |
| | | // /// å·¥ç¨æå¡ï¼åå·¥ç¨å
³èçåå°æå¡ï¼å½<see cref="IProjectServiceRunner"/>以å½åKeyè°ç¨æ¶ä¼è¢«æ§è¡ |
| | | // /// </summary> |
| | | // public class PipeLineLemsProjectService : BaseProjectService |
| | | // { |
| | | // private IServiceProvider _serviceProvider; |
| | | // private readonly ILogger<PipeLineLemsProjectService> _logger; |
| | | // private readonly IVariableDataCache _variableDataCache; |
| | | |
| | | // /// <summary> |
| | | // /// åéæå¡ |
| | | // /// </summary> |
| | | // private readonly VariableService _variableService; |
| | | // private FlowVariableChannelListener _channelListener; |
| | | // private Dictionary<string, string> _monitorVariableNames; |
| | | |
| | | // /// <summary> |
| | | // /// æå¡çKeyï¼å¯ä¸ï¼ä¾<see cref="IProjectServiceRunner"/>ä½¿ç¨ |
| | | // /// </summary> |
| | | // public override string Key => "PipeLineLems"; |
| | | |
| | | // /// <summary> |
| | | // /// æå¡æè¿°ï¼æ¾ç¤ºå¨æå¡å表UIä¸çåç§° |
| | | // /// </summary> |
| | | // public override string Description => "PipeLineLemsæå¡"; |
| | | |
| | | // /// <summary> |
| | | // /// å¯ç¨ææ |
| | | // /// </summary> |
| | | // public override bool AuthRequired => true; |
| | | |
| | | // /// <summary> |
| | | // /// Initializes a new instance of the <see cref="PipeLineLemsProjectService"/> class. |
| | | // /// </summary> |
| | | // /// <param name="logger">The logger.</param> |
| | | // /// <param name="variableDataCache">The variable data cache.</param> |
| | | // public PipeLineLemsProjectService( |
| | | // VariableService variableService, |
| | | // IServiceProvider serviceProvider, ILogger<PipeLineLemsProjectService> logger, IVariableDataCache variableDataCache) |
| | | // { |
| | | // _serviceProvider = serviceProvider; |
| | | // _logger = logger; |
| | | // _variableDataCache = variableDataCache; |
| | | // _variableService = variableService; |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// å¼å¯æå¡ |
| | | // /// </summary> |
| | | // /// <param name="serviceProvider">å
·æå·¥ç¨ä¸ä¸æçå®ä¾</param> |
| | | // public override async Task StartAsync(IServiceProvider serviceProvider) |
| | | // { |
| | | // if (State == ProjectServiceState.Started) |
| | | // { |
| | | // return; |
| | | // } |
| | | |
| | | // // çå¬åé |
| | | // _monitorVariableNames = new Dictionary<string, string> |
| | | // { |
| | | // { "æç è¿ç«ä¿¡å·", "æç è¿ç«ä¿¡å·(æè¿°)" }, |
| | | // { "åå²è¿ç«ä¿¡å·", "åå²è¿ç«ä¿¡å·(æè¿°)" }, |
| | | // }; |
| | | |
| | | // // å建ééçå¬ |
| | | // _channelListener?.Token?.Dispose(); |
| | | // _channelListener = new FlowVariableChannelListener(_logger, _variableDataCache); |
| | | // _channelListener.CreateChannel(Key, waitListener: false, timeout: TimeSpan.FromSeconds(30), variableFilter: _monitorVariableNames.Keys.ToHashSet()); |
| | | // _channelListener.TagChanged += OnTagValueChanged; |
| | | |
| | | // await base.StartAsync(serviceProvider); |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// 忢æå¡ |
| | | // /// </summary> |
| | | // /// <param name="serviceProvider">å
·æå·¥ç¨ä¸ä¸æçå®ä¾</param> |
| | | // public override async Task StopAsync(IServiceProvider serviceProvider) |
| | | // { |
| | | // if (_channelListener != null) |
| | | // { |
| | | // // éæ¾çå¬ |
| | | // _channelListener.TagChanged -= OnTagValueChanged; |
| | | // _channelListener.Token.Dispose(); |
| | | // _channelListener = null; |
| | | // } |
| | | |
| | | // // 使ç¨åå°ä½ä¸å¼æ¥å¤ç |
| | | // //await _serviceProvider.GetRequiredService<IBackgroundJobManager>().EnqueueAsync(new PipeLineLemsArgs |
| | | // //{ |
| | | // // Subject = "PipeLineLems_Subject", |
| | | // // Body = "PipeLineLems_Body", |
| | | // //}); |
| | | |
| | | |
| | | // await base.StopAsync(serviceProvider); |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// Called when [tag value changed]. |
| | | // /// </summary> |
| | | // /// <param name="sender">The sender.</param> |
| | | // /// <param name="e">The <see cref="TagChangedEventArgs"/> instance containing the event data.</param> |
| | | // private async void OnTagValueChanged(object sender, TagChangedEventArgs e) |
| | | // { |
| | | // var changeds = e.Changeds.Where(x => _monitorVariableNames != null && _monitorVariableNames.ContainsKey(x.Name)); |
| | | // if (!changeds.Any()) |
| | | // { |
| | | // return; |
| | | // } |
| | | |
| | | // foreach (var changed in changeds) |
| | | // { |
| | | // var oldValue = changed.Old?.Value; |
| | | // var newValue = changed.New?.Value; |
| | | // var traceId = e.TraceId; |
| | | |
| | | // _logger.LogInformation($"{changed.Name} åéå¼åçååï¼æ§å¼{oldValue}=æ°å¼{newValue}ï¼TraceId={traceId}"); |
| | | |
| | | // if (changed.Name == "æç è¿ç«ä¿¡å·" && changed.New?.Value.SafeString().ToBool() == true) |
| | | // { |
| | | |
| | | // // TODO: å¤çåéå¼åå |
| | | // // Tipsï¼https://cms-docs.shengyc.com/cms/api/%E5%90%8E%E7%AB%AF#3-%E5%8F%98%E9%87%8F%E6%A8%A1%E5%9D%97 |
| | | // /* 说æï¼éè¿è®¢é
IVariableDataCache.TagChanged äºä»¶ï¼æ¨å¯ä»¥å®æ¶çæ§åéçååãæ¤äºä»¶ä¼ä¼ éææåéè³äºä»¶å¤ç彿°ï¼å æ¤ï¼ä¸å¡å±éå¨å½æ°ä¸çéå
³æ³¨çåéã |
| | | // 注æäºé¡¹ï¼ |
| | | // ï¼1ï¼æ§è½å½±åï¼ åå¸äºä»¶æ¶ï¼äºä»¶çåéè
å°é»å¡æµç¨ãå æ¤ï¼å¼ºç建议é¿å
å¨äºä»¶å¤ç彿°ä¸æ§è¡ I/ O æä½ãHTTP æ¥å£è®¿é®æå
¶ä»èæ¶æä½ï¼ä»¥é²æ¢å¯¹ç³»ç»æ§è½äº§ç严éå½±åï¼å¯¼è´æ´ä¸ªç³»ç»ååºå»¶è¿ã |
| | | // ï¼2ï¼é«é¢ç触åï¼ ç±äºäºä»¶è®¢é
äºå
¨éåéï¼è§¦åé¢çå¯è½é常é«ã |
| | | // ï¼3ï¼å¼æ¥å¤çï¼ é´äºäºä»¶è§¦åé¢çå¾é«ï¼å»ºè®®ä¸å¡å±å¨çéå
³æ³¨åéåï¼ä½¿ç¨ Task å¯å¨æ°çº¿ç¨å¤çä¸å¡é»è¾ï¼ä»¥é¿å
é»å¡æ ¸å¿çåéçå¬åè½ï¼å®ç°ä¸å¡å±ä¸å¹³å°åºåº§çè§£è¦ã |
| | | // ï¼4ï¼å¹¶å管çï¼ å¦æä¸å¡å±å¹¶åé大ï¼å¿
é¡»ä¼å代ç 设计å宿½ï¼ä»¥åå°å¨é«å¹¶åæ
åµä¸çç³»ç»èµæºæ¶èï¼é²æ¢ç³»ç»æ§è½é®é¢ã |
| | | // ï¼5ï¼ä»£ç å®å
¨ï¼ å®è£
å¹¶ä½¿ç¨ CMS.CodeAnalysis åæå¨æ¥åæ IVariableDataCache.TagChanged çä½¿ç¨æ
åµã该工å
·è½å¨ä½¿ç¨ä¸å½æ¶æä¾ç¼è¯é误ï¼å¸®å©æ¨æé«ä»£ç è´¨éã*/ |
| | | |
| | | // _ = Task.Run(async () => |
| | | // { |
| | | // await HanlderForPringBarCodeAsync(); |
| | | // // ä¾1ï¼åæ¥å¤ç |
| | | // //await ProcessAsync(); |
| | | |
| | | // // ä¾2ï¼è°ç¨å¤é¨API |
| | | // //await ExecuteExternalApiAsync(); |
| | | // }); |
| | | // } |
| | | |
| | | // if (changed.Name == "åå²è¿ç«ä¿¡å·" && changed.New?.Value.SafeString().ToBool() == true) |
| | | // { |
| | | |
| | | // // TODO: å¤çåéå¼åå |
| | | // // Tipsï¼https://cms-docs.shengyc.com/cms/api/%E5%90%8E%E7%AB%AF#3-%E5%8F%98%E9%87%8F%E6%A8%A1%E5%9D%97 |
| | | // /* 说æï¼éè¿è®¢é
IVariableDataCache.TagChanged äºä»¶ï¼æ¨å¯ä»¥å®æ¶çæ§åéçååãæ¤äºä»¶ä¼ä¼ éææåéè³äºä»¶å¤ç彿°ï¼å æ¤ï¼ä¸å¡å±éå¨å½æ°ä¸çéå
³æ³¨çåéã |
| | | // 注æäºé¡¹ï¼ |
| | | // ï¼1ï¼æ§è½å½±åï¼ åå¸äºä»¶æ¶ï¼äºä»¶çåéè
å°é»å¡æµç¨ãå æ¤ï¼å¼ºç建议é¿å
å¨äºä»¶å¤ç彿°ä¸æ§è¡ I/ O æä½ãHTTP æ¥å£è®¿é®æå
¶ä»èæ¶æä½ï¼ä»¥é²æ¢å¯¹ç³»ç»æ§è½äº§ç严éå½±åï¼å¯¼è´æ´ä¸ªç³»ç»ååºå»¶è¿ã |
| | | // ï¼2ï¼é«é¢ç触åï¼ ç±äºäºä»¶è®¢é
äºå
¨éåéï¼è§¦åé¢çå¯è½é常é«ã |
| | | // ï¼3ï¼å¼æ¥å¤çï¼ é´äºäºä»¶è§¦åé¢çå¾é«ï¼å»ºè®®ä¸å¡å±å¨çéå
³æ³¨åéåï¼ä½¿ç¨ Task å¯å¨æ°çº¿ç¨å¤çä¸å¡é»è¾ï¼ä»¥é¿å
é»å¡æ ¸å¿çåéçå¬åè½ï¼å®ç°ä¸å¡å±ä¸å¹³å°åºåº§çè§£è¦ã |
| | | // ï¼4ï¼å¹¶å管çï¼ å¦æä¸å¡å±å¹¶åé大ï¼å¿
é¡»ä¼å代ç 设计å宿½ï¼ä»¥åå°å¨é«å¹¶åæ
åµä¸çç³»ç»èµæºæ¶èï¼é²æ¢ç³»ç»æ§è½é®é¢ã |
| | | // ï¼5ï¼ä»£ç å®å
¨ï¼ å®è£
å¹¶ä½¿ç¨ CMS.CodeAnalysis åæå¨æ¥åæ IVariableDataCache.TagChanged çä½¿ç¨æ
åµã该工å
·è½å¨ä½¿ç¨ä¸å½æ¶æä¾ç¼è¯é误ï¼å¸®å©æ¨æé«ä»£ç è´¨éã*/ |
| | | |
| | | // _ = Task.Run(async () => |
| | | // { |
| | | // await HanlderForCutAsync(); |
| | | // // ä¾1ï¼åæ¥å¤ç |
| | | // //await ProcessAsync(); |
| | | |
| | | // // ä¾2ï¼è°ç¨å¤é¨API |
| | | // //await ExecuteExternalApiAsync(); |
| | | // }); |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// Processes the asynchronous. |
| | | // /// </summary> |
| | | // private async Task ProcessAsync() |
| | | // { |
| | | // using var scope = _serviceProvider.CreateScope(); |
| | | // var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); |
| | | // using var uow = unitOfWorkManager.Begin(requiresNew: true); |
| | | // var mytestentitynameRepository = scope.ServiceProvider.GetRequiredService<IMyTestEntityNameRepository>(); |
| | | // var count = await mytestentitynameRepository.GetCountAsync(); |
| | | |
| | | // // å¦æææ´æ°æ°æ®åºæä½ï¼éæäº¤ä¿å |
| | | // // await uow.SaveChangesAsync(); |
| | | |
| | | // _logger.LogInformation($"ProcessAsyncï¼Count={count}"); |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// Executes the external API. |
| | | // /// </summary> |
| | | // private async Task ExecuteExternalApiAsync() |
| | | // { |
| | | // try |
| | | // { |
| | | // await _serviceProvider.GetRequiredService<IPipeLineLemsExternalApi>().CreateAsync(new MyTestEntityNameCreateDto |
| | | // { |
| | | // Name = "MyTestEntityName_Name", |
| | | // Code = "MyTestEntityName_Code", |
| | | // }); |
| | | // } |
| | | // catch (Exception e) |
| | | // { |
| | | // _logger.LogException(e); |
| | | // } |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// æç |
| | | // /// </summary> |
| | | // /// <returns></returns> |
| | | // private async Task HanlderForPringBarCodeAsync() |
| | | // { |
| | | |
| | | // var plcTaskNo = await _variableService.ReadValueAsync("æç è¿ç«PLCä»»å¡å·"); |
| | | |
| | | // if (string.IsNullOrEmpty(plcTaskNo?.Content?.Value.SafeString().ToString())) |
| | | // { |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // var myTaskNo = plcTaskNo.Content.Value.SafeString().ToString(); |
| | | // //TODO:ææ¶å
åå
¥ å
é¨åé |
| | | // Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "æç 工件1", "11111111" }, |
| | | // { "æç 工件2", "22222222" }, |
| | | // { "æç 工件3", "33333333" } |
| | | // }; |
| | | // _variableService.WriteValueAsync(keyValuePairs); |
| | | |
| | | // //TODO:模æééåæ° |
| | | // keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "æç é度", 100}, |
| | | // { "æç è´¨é", 2}, |
| | | // }; |
| | | // var ret2 = _variableService.WriteValueAsync(keyValuePairs); |
| | | |
| | | // //TODO:ææ¶çæäº§åID |
| | | // //var productID = Guid.NewGuid().ToString(); |
| | | // var productID = DateTime.Now.ToString("yyyyMMddHHmmssfff"); |
| | | // keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "æç _ProductID", productID}, |
| | | // }; |
| | | // var ret = _variableService.WriteValueAsync(keyValuePairs); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | // /// <summary> |
| | | // /// åå² |
| | | // /// </summary> |
| | | // /// <returns></returns> |
| | | // private async Task HanlderForCutAsync() |
| | | // { |
| | | |
| | | // var plcTaskNo = await _variableService.ReadValueAsync("åå²è¿ç«PLCä»»å¡å·"); |
| | | |
| | | // if (string.IsNullOrEmpty(plcTaskNo?.Content?.Value.SafeString().ToString())) |
| | | // { |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // var myTaskNo = plcTaskNo.Content.Value.SafeString().ToString(); |
| | | // //TODO:ææ¶å
åå
¥ å
é¨åé |
| | | // Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "åå²1", "555555" }, |
| | | // { "åå²2", "66666" }, |
| | | // { "åå²3", "77777" } |
| | | // }; |
| | | // _variableService.WriteValueAsync(keyValuePairs); |
| | | |
| | | // //TODO:模æééåæ° |
| | | // keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "åå²é度", 99}, |
| | | // { "åå²è´¨é", 1}, |
| | | // }; |
| | | // var ret2 = _variableService.WriteValueAsync(keyValuePairs); |
| | | |
| | | // //TODO:ææ¶çæäº§åID |
| | | // //è·åä¸ä¸ä¸ªå·¥åºç产åID |
| | | // //æ ¹æ®å·¥åºåè·åå·¥åºå¯¹è±¡ |
| | | // var _workSectionManager = _serviceProvider.GetRequiredService<IWorkSectionManager>(); |
| | | // var lastWorkSection = "æç å·¥åº"; |
| | | // var workSection = await _workSectionManager.GetByNameAsync(lastWorkSection); |
| | | |
| | | // //è·å工忰æ®ï¼ä»æ«å·¥åºæ¥è¯¢3个产åï¼ |
| | | // //读åscms_productionsè¡¨ï¼æ ¹æ®å½åæ¶é´æ¥è¯¢æè¿3æ¡è®°å½ |
| | | // var traceManager = _serviceProvider.GetRequiredService<ITraceProvider>(); |
| | | // GetTracesRequest request = new GetTracesRequest() |
| | | // { |
| | | // WorkSectionId = workSection.Id, |
| | | // }; |
| | | // TraceModel traceModel = null; |
| | | // var list = await traceManager.GetTracesAsync(request); |
| | | // if (list?.Count > 0) |
| | | // { |
| | | // //éæ°æåº |
| | | // list = list.OrderByDescending(x => x.FinishTime).ToList(); |
| | | // traceModel = list.First(); |
| | | // } |
| | | // //var productID = Guid.NewGuid().ToString(); |
| | | // var productID = DateTime.Now.ToString("yyyyMMddHHmmssfff"); |
| | | // if (traceModel != null) |
| | | // { |
| | | // productID = traceModel.SerialNumber; |
| | | // } |
| | | // keyValuePairs = new Dictionary<string, object?> |
| | | // { |
| | | // { "åå²_ProductID", productID}, |
| | | // }; |
| | | // var ret = _variableService.WriteValueAsync(keyValuePairs); |
| | | // } |
| | | // } |
| | | // } |
| | | //} |