From 874ddf20325b535872488905caa648beaf9ff024 Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周三, 14 5月 2025 14:07:17 +0800
Subject: [PATCH] 管件提交

---
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs        |   21 ++++
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs                      |   85 ++++++++++++++--
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs                 |   60 ++++++++---
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs                       |   21 ++++
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs      |   12 +-
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs |   52 ++++++++++
 6 files changed, 215 insertions(+), 36 deletions(-)

diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs
index a2f5666..02fc481 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs
@@ -15,14 +15,14 @@
         [JsonPropertyName("data")]
         public object Data { get; set; }
 
-        [JsonPropertyName("fail")]
-        public bool Fail { get; set; }
+        //[JsonPropertyName("fail")]
+        //public bool Fail { get; set; }
 
-        [JsonPropertyName("mesg")]
-        public string Mesg { get; set; }
+        [JsonPropertyName("message")]
+        public string Message { get; set; }
 
-        [JsonPropertyName("success")]
-        public bool Success { get; set; }
+        //[JsonPropertyName("success")]
+        //public bool Success { get; set; }
 
         [JsonPropertyName("time")]
         public DateTime Time { get; set; }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
index 513b7bd..6a731e7 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
@@ -1,5 +1,7 @@
 using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
 using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
+using System.Linq.Expressions;
+using Volo.Abp;
 using Volo.Abp.Application.Services;
 using Volo.Abp.Users;
 
@@ -54,4 +56,23 @@
     /// <param name="input"></param> 
     /// <returns></returns> 
     Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWorkPlanInput input);
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    Task<List<WorkPlan>> GetListByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, CancellationToken cancellationToken = default);
+
+
+    /// <summary> 
+    ///  鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="isMultipleThrowException">鏄惁鏌ヨ鍑哄鏉″氨鎶ラ敊</param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    /// <exception cref="UserFriendlyException"></exception> 
+    Task<WorkPlan> GetSingleByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default);
 }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
index 7211e3f..acd549a 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
@@ -19,6 +19,12 @@
 using CmsQueryExtensions.Entitys;
 using CMS.Unit.RuntimeValue.Abstractions;
 using CMS.Extensions.Variable;
+using CMS.Plugin.TraceManagement.Abstractions.Models.Traces;
+using CMS.Plugin.ProcessManagement.Abstractions;
+using KissUtil.Extensions;
+using CMS.Plugin.TraceManagement.Abstractions;
+using CMS.Plugin.ProductManagement.Abstractions.Models;
+using CMS.Plugin.MaterialManagement.Abstractions;
 
 namespace CMS.Plugin.PipeLineLems.Application.Implements;
 
@@ -36,6 +42,11 @@
         //3銆佸啓鍏� 鍒嗘嫞鍙橀噺
 
         VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
+        var _workSectionManager = _serviceProvider.GetRequiredService<IWorkSectionManager>();
+        var _workStationManager = _serviceProvider.GetRequiredService<IWorkStationManager>();
+        var traceProvider = _serviceProvider.GetRequiredService<ITraceProvider>();
+        var materialProvider = _serviceProvider.GetRequiredService<IMaterialProvider>();
+        var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
 
         Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
                     {
@@ -44,13 +55,69 @@
                         { "鍒嗘嫞浜�", myCurrentUser.UserAccount }
                     };
         _variableService.WriteValueAsync(keyValuePairs);
+
+        //鏍规嵁宸ュ簭鍚嶈幏鍙栧伐搴忓璞�
+        var workSection = await _workSectionManager.GetByNameAsync("鍒嗘嫞宸ュ簭");
+        var workStation = await _workStationManager.GetByNameAsync("鍒嗘嫞宸ヤ綅");
+        //鍐欏叆杩芥函鎶ヨ〃
+        var finishTime = DateTime.Now;
+        TraceModel traceModel = new TraceModel()
+        {
+            SerialNumber = input.PipeSpecCode,
+            WorkSectionId = workSection.Id,
+            WorkSectionName = workSection.Name,
+            WorkStationName = workStation.Name,
+
+            FinishTime = finishTime,
+            IsQualified = true,
+            UnqualifiedReason = "",
+            ProductModel = "",
+            ProductName = "",
+
+        };
+        traceModel.Params = new List<TraceParamModel>();
+        foreach (var item in workSection.ProcessParameters)
+        {
+            var value = "ssss";
+            traceModel.Params.Add(new TraceParamModel()
+            {
+                Key = item.Key,
+                Value = value.SafeString()
+            });
+        }
+        //鐗╂枡鍙傛暟鍒楄〃
+        var firstWorkPlans = await workPlanAppService.GetListByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
+
+        var firstWorkPlan = await workPlanAppService.GetSingleByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
+        var rawPipe_DataIdentifier = await materialProvider.FindByNameAsync("鍒嗘嫞鍘熸枡绠℃爣璇�");
+        var rawPipe_MaterialMode = await materialProvider.FindByNameAsync("鍒嗘嫞鍘熸枡绠″瀷鍙�");
+        List<TraceMaterialModel> _MaterialParams = new List<TraceMaterialModel>();
+        _MaterialParams.Add(new TraceMaterialModel()
+        {
+            Key = "鍒嗘嫞鍘熸枡绠℃爣璇�",
+            Quantity = 1,
+            MaterialId = rawPipe_DataIdentifier.MaterialId,
+            MaterialDetailId = rawPipe_DataIdentifier.MaterialDetails.First().Id,
+            Value = firstWorkPlan.DataIdentifier,
+
+        });
+        _MaterialParams.Add(new TraceMaterialModel()
+        {
+            Key = "鍒嗘嫞鍘熸枡绠″瀷鍙�",
+            Quantity = 1,
+            MaterialId = rawPipe_MaterialMode.MaterialId,
+            MaterialDetailId = rawPipe_MaterialMode.MaterialDetails.First().Id,
+            Value = firstWorkPlan.MaterialMode
+        });
+        traceModel.MaterialParams = _MaterialParams;
+
+        await traceProvider.CreateTraceAsync(traceModel);
+
         var response = new MesOrderResponse
         {
-            Code = "000000",
+            Code = "200",
             Data = "",
-            Fail = false,
-            Mesg = "澶勭悊鎴愬姛",
-            Success = true,
+            Message = "澶勭悊鎴愬姛",
             Time = DateTime.UtcNow
         };
         return response;
@@ -262,9 +329,7 @@
         {
             Code = "000000",
             Data = orderModels,
-            Fail = false,
-            Mesg = "澶勭悊鎴愬姛",
-            Success = true,
+            Message = "澶勭悊鎴愬姛",
             Time = DateTime.UtcNow
         };
         return response;
@@ -387,10 +452,8 @@
         // 杩斿洖缁撴灉
         var response = new MesOrderResponse
         {
-            Code = "000000",
-            Fail = false,
-            Mesg = "鍙枡鎴愬姛",
-            Success = true,
+            Code = "200",
+            Message = "鍙枡鎴愬姛",
             Time = DateTime.UtcNow
         };
         return response;
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
index b85d09c..af37ddd 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
@@ -19,16 +19,16 @@
 /// </summary> 
 public class WorkPlanAppService : CMSPluginAppService, IWorkPlanAppService
 {
-    private readonly IWorkPlanRepository workPlanRepository;
+    private readonly IWorkPlanRepository _workPlanRepository;
     private readonly SharedService _sharedService;
     private readonly IServiceProvider _serviceProvider;
     /// <summary> 
     /// Initializes a new instance of the <see cref="WorkPlanAppService"/> class. 
     /// </summary> 
     /// <param name="WorkPlanRepository">The task job repository.</param> 
-    public WorkPlanAppService(IWorkPlanRepository _WorkPlanRepository, SharedService sharedService, IServiceProvider serviceProvider)
+    public WorkPlanAppService(IWorkPlanRepository workPlanRepository, SharedService sharedService, IServiceProvider serviceProvider)
     {
-        workPlanRepository = _WorkPlanRepository;
+        _workPlanRepository = workPlanRepository;
         _sharedService = sharedService;
         _serviceProvider = serviceProvider;
     }
@@ -40,7 +40,7 @@
     /// <returns></returns> 
     public virtual async Task<WorkPlanDto> GetAsync(Guid id)
     {
-        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(await workPlanRepository.GetAsync(id));
+        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(await _workPlanRepository.GetAsync(id));
     }
 
     /// <summary> 
@@ -51,7 +51,7 @@
     /// <returns></returns> 
     public virtual async Task<List<WorkPlan>> FindByDataIdentifierAsync(string dataIdentifier)
     {
-        return await workPlanRepository.FindByDataIdentifierAsync(dataIdentifier);
+        return await _workPlanRepository.FindByDataIdentifierAsync(dataIdentifier);
     }
 
     /// <summary> 
@@ -75,8 +75,8 @@
 
         #endregion
 
-        var count = await workPlanRepository.GetCountAsync(whereConditions);
-        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
+        var count = await _workPlanRepository.GetCountAsync(whereConditions);
+        var list = await _workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
 
         return new PagedResultDto<WorkPlanDto>(count, ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list));
     }
@@ -114,13 +114,13 @@
     {
         await CheckCreateOrUpdateDtoAsync(input);
 
-        var exist = await workPlanRepository.NameExistAsync(input.TaskCode);
+        var exist = await _workPlanRepository.NameExistAsync(input.TaskCode);
         if (exist)
         {
             throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
         }
 
-        var maxSort = await workPlanRepository.GetMaxSortAsync();
+        var maxSort = await _workPlanRepository.GetMaxSortAsync();
         var sort = input.Sort ?? maxSort;
 
         var insertObj = ObjectMapper.Map<WorkPlanCreateDto, WorkPlan>(input);
@@ -128,7 +128,7 @@
         insertObj.CreatorName = "SuperAdmin";
         input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
 
-        await workPlanRepository.InsertAsync(insertObj);
+        await _workPlanRepository.InsertAsync(insertObj);
 
         //if (input.Sort.HasValue && insertObj.Sort != maxSort) 
         //{ 
@@ -149,8 +149,8 @@
     {
         await CheckCreateOrUpdateDtoAsync(input);
 
-        var updateObj = await workPlanRepository.GetAsync(id);
-        var exist = await workPlanRepository.NameExistAsync(input.TaskCode, updateObj.Id);
+        var updateObj = await _workPlanRepository.GetAsync(id);
+        var exist = await _workPlanRepository.NameExistAsync(input.TaskCode, updateObj.Id);
         if (exist)
         {
             throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
@@ -196,7 +196,7 @@
         updateObj.Remark = input.Remark;
 
 
-        await workPlanRepository.UpdateAsync(updateObj);
+        await _workPlanRepository.UpdateAsync(updateObj);
 
         return ObjectMapper.Map<WorkPlan, WorkPlanDto>(updateObj);
     }
@@ -248,7 +248,7 @@
     /// <returns></returns> 
     public virtual Task DeleteAsync(Guid id)
     {
-        return workPlanRepository.DeleteAsync(id);
+        return _workPlanRepository.DeleteAsync(id);
     }
 
     /// <summary> 
@@ -272,7 +272,7 @@
     /// <returns></returns> 
     public virtual async Task AdjustSortAsync(Guid id, int sort)
     {
-        var list = await workPlanRepository.GetListAsync(null, nameof(WorkPlan.Sort));
+        var list = await _workPlanRepository.GetListAsync(null, nameof(WorkPlan.Sort));
         if (list != null && list.Any())
         {
             var initSort = 1;
@@ -299,7 +299,7 @@
             }
         }
 
-        await workPlanRepository.UpdateManyAsync(list);
+        await _workPlanRepository.UpdateManyAsync(list);
     }
 
     /// <summary> 
@@ -308,7 +308,7 @@
     /// <param name="input"></param> 
     /// <returns></returns> 
     /// <exception cref="UserFriendlyException"></exception> 
-    public async Task ImportAsync(WorkPlansImportModel input, string userId,string userAccount)
+    public async Task ImportAsync(WorkPlansImportModel input, string userId, string userAccount)
     {
         //杞崲鏁版嵁
         var result = ObjectMapper.Map<List<WorkPlansImportModel.WorkPlanImportModel>, List<WorkPlanInput>>(input.WorkPlans);
@@ -492,7 +492,7 @@
         #endregion
 
 
-        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
+        var list = await _workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
         var result = ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list);
 
         var sheets = new Dictionary<string, object>
@@ -528,4 +528,28 @@
 
         return Task.CompletedTask;
     }
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    public async Task<List<WorkPlan>> GetListByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, CancellationToken cancellationToken = default)
+    {
+        return await _workPlanRepository.GetListByFilterAsync(whereConditions);
+    }
+
+    /// <summary> 
+    ///  鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="isMultipleThrowException">鏄惁鏌ヨ鍑哄鏉″氨鎶ラ敊</param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    /// <exception cref="UserFriendlyException"></exception> 
+    public async Task<WorkPlan> GetSingleByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default)
+    {
+        return await _workPlanRepository.GetSingleByFilterAsync(whereConditions, is鈥婱ultipleThrowException);
+    }
 }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs
index 1380e17..a97ad25 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs
@@ -58,5 +58,24 @@
     /// <param name="whereConditions"></param> 
     /// <param name="cancellationToken"></param> 
     /// <returns></returns> 
-    Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WorkPlan, bool>>> whereConditions, CancellationToken cancellationToken = default); 
+    Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WorkPlan, bool>>> whereConditions, CancellationToken cancellationToken = default);
+
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    Task<List<WorkPlan>> GetListByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, CancellationToken cancellationToken = default);
+
+    /// <summary> 
+    ///  鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="isMultipleThrowException">鏄惁鏌ヨ鍑哄鏉″氨鎶ラ敊</param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    /// <exception cref="UserFriendlyException"></exception> 
+    Task<WorkPlan> GetSingleByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default);
 } 
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs
index caade5e..bc81213 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs
@@ -4,6 +4,7 @@
 using Microsoft.EntityFrameworkCore;
 using System.Linq.Dynamic.Core;
 using System.Linq.Expressions;
+using Volo.Abp;
 using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
 using Volo.Abp.EntityFrameworkCore;
 
@@ -127,4 +128,55 @@
         return (await GetQueryableAsync())
             .Where(x => !x.IsDeleted).IncludeDetails();
     }
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    public async Task<List<WorkPlan>> GetListByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, CancellationToken cancellationToken = default)
+    {
+        return await (await GetDbSetAsync())
+             .IncludeDetails()
+            .WhereIf(whereConditions != null, whereConditions)
+            .Where(x => !x.IsDeleted)
+            .OrderByDescending(x => x.CreationTime)
+            .ToListAsync(GetCancellationToken(cancellationToken));
+    }
+
+    /// <summary> 
+    ///  鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛� 
+    /// </summary> 
+    /// <param name="whereConditions"></param> 
+    /// <param name="isMultipleThrowException">鏄惁鏌ヨ鍑哄鏉″氨鎶ラ敊</param> 
+    /// <param name="cancellationToken"></param> 
+    /// <returns></returns> 
+    /// <exception cref="UserFriendlyException"></exception> 
+    public async Task<WorkPlan> GetSingleByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default)
+    {
+        if (is鈥婱ultipleThrowException)
+        {
+            var entitys = await (await GetDbSetAsync())
+                .IncludeDetails()
+          .WhereIf(whereConditions != null, whereConditions)
+          .Where(x => !x.IsDeleted)
+          .OrderByDescending(x => x.CreationTime)
+          .ToListAsync(GetCancellationToken(cancellationToken));
+            if (entitys?.Count > 1)
+            {
+                throw new UserFriendlyException("鏌ヨ鍒板鏉¤褰�");
+            }
+            return entitys?.FirstOrDefault();
+        }
+        else
+        {
+            return await (await GetDbSetAsync())
+               .IncludeDetails()
+          .WhereIf(whereConditions != null, whereConditions)
+          .Where(x => !x.IsDeleted)
+          .OrderByDescending(x => x.CreationTime)
+          .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
+        }
+    }
 }

--
Gitblit v1.9.3