¶Ô±ÈÐÂÎļþ |
| | |
| | | using CMS.Plugin.FlowManagement.Abstractions.FlowBusiness; |
| | | using CMS.Plugin.HIAWms.Apis; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsContainers; |
| | | using CMS.Plugin.HIAWms.Domain.WmsContainers; |
| | | using CMS.Plugin.HIAWms.Jobs; |
| | | using CMS.Project; |
| | | using CMS.Project.Abstractions; |
| | | using CMS.Unit.RuntimeValue.Abstractions; |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | using Microsoft.Extensions.Logging; |
| | | using Volo.Abp.BackgroundJobs; |
| | | using Volo.Abp.Uow; |
| | | |
| | | namespace CMS.Plugin.HIAWms.ProjectService |
| | | { |
| | | /// <summary> |
| | | /// å·¥ç¨æå¡ï¼åå·¥ç¨å
³èçåå°æå¡ï¼å½<see cref="IProjectServiceRunner"/>以å½åKeyè°ç¨æ¶ä¼è¢«æ§è¡ |
| | | /// </summary> |
| | | public class HIAWmsProjectService : BaseProjectService |
| | | { |
| | | private IServiceProvider _serviceProvider; |
| | | private readonly ILogger<HIAWmsProjectService> _logger; |
| | | private readonly IVariableDataCache _variableDataCache; |
| | | private FlowVariableChannelListener _channelListener; |
| | | private Dictionary<string, string> _monitorVariableNames; |
| | | |
| | | /// <summary> |
| | | /// æå¡çKeyï¼å¯ä¸ï¼ä¾<see cref="IProjectServiceRunner"/>ä½¿ç¨ |
| | | /// </summary> |
| | | public override string Key => "HIAWms"; |
| | | |
| | | /// <summary> |
| | | /// æå¡æè¿°ï¼æ¾ç¤ºå¨æå¡å表UIä¸çåç§° |
| | | /// </summary> |
| | | public override string Description => "HIAWmsæå¡"; |
| | | |
| | | /// <summary> |
| | | /// å¯ç¨ææ |
| | | /// </summary> |
| | | public override bool AuthRequired => false; |
| | | |
| | | /// <summary> |
| | | /// Initializes a new instance of the <see cref="HIAWmsProjectService"/> class. |
| | | /// </summary> |
| | | /// <param name="logger">The logger.</param> |
| | | /// <param name="variableDataCache">The variable data cache.</param> |
| | | public HIAWmsProjectService(IServiceProvider serviceProvider, ILogger<HIAWmsProjectService> logger, IVariableDataCache variableDataCache) |
| | | { |
| | | _serviceProvider = serviceProvider; |
| | | _logger = logger; |
| | | _variableDataCache = variableDataCache; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¼å¯æå¡ |
| | | /// </summary> |
| | | /// <param name="serviceProvider">å
·æå·¥ç¨ä¸ä¸æçå®ä¾</param> |
| | | public override async Task StartAsync(IServiceProvider serviceProvider) |
| | | { |
| | | if (State == ProjectServiceState.Started) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | // çå¬åé |
| | | _monitorVariableNames = new Dictionary<string, string> |
| | | { |
| | | { "HIAWms_Variable1", "çå¬åé1" }, |
| | | { "HIAWms_Variable2", "çå¬åé2" } |
| | | }; |
| | | |
| | | // å建ééçå¬ |
| | | _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 HIAWmsArgs |
| | | //{ |
| | | // Subject = "HIAWms_Subject", |
| | | // Body = "HIAWms_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}"); |
| | | |
| | | // 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 () => |
| | | { |
| | | // ä¾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 wmscontainerRepository = scope.ServiceProvider.GetRequiredService<IWmsContainerRepository>(); |
| | | var count = await wmscontainerRepository.GetCountAsync(); |
| | | |
| | | // å¦æææ´æ°æ°æ®åºæä½ï¼éæäº¤ä¿å |
| | | // await uow.SaveChangesAsync(); |
| | | |
| | | _logger.LogInformation($"ProcessAsyncï¼Count={count}"); |
| | | } |
| | | } |
| | | } |