From ec3cfd144de6fcf5e5cbfaf02585c17805300602 Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周三, 21 5月 2025 13:35:16 +0800
Subject: [PATCH] 优化
---
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs | 305 +++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 271 insertions(+), 34 deletions(-)
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
index 1e3200e..6a65e24 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
@@ -21,6 +21,10 @@
using CMS.Plugin.PipeLineLems.Domain.CallMaterialOrder;
using System.Collections.Generic;
using CMS.Framework.AspNetCore.Users;
+using NPOI.SS.Formula.Functions;
+using CMS.Plugin.PipeLineLems.Application.Implements;
+using CmsQueryExtensions.Entitys;
+using CMS.Plugin.PipeLineLems.Domain.WorkTask;
namespace CMS.Plugin.PipeLineLems.ProjectService
{
@@ -89,6 +93,9 @@
{ "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�", "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�(鎻忚堪)" },
{ "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�", "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�(鎻忚堪)" },
{ "鍒囧壊杩涚珯淇″彿", "鍒囧壊杩涚珯淇″彿(鎻忚堪)" },
+
+ { "瑁呴厤瀹屽伐淇″彿", "瑁呴厤瀹屽伐淇″彿(鎻忚堪)" },
+ { "鐒婃帴瀹屽伐淇″彿", "鐒婃帴瀹屽伐淇″彿(鎻忚堪)" },
};
// 鍒涘缓閫氶亾鐩戝惉
@@ -146,7 +153,7 @@
_logger.LogInformation($"{changed.Name} 鍙橀噺鍊煎彂鐢熷彉鍖栵紝鏃у�納oldValue}=鏂板�納newValue}锛孴raceId={traceId}");
- if (changed.Name == "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�" && changed.New?.Value.SafeString().ToBool() == true)
+ if (changed.Name == "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�")
{
// TODO: 澶勭悊鍙橀噺鍊煎彉鍖�
@@ -159,15 +166,21 @@
锛�4锛夊苟鍙戠鐞嗭細 濡傛灉涓氬姟灞傚苟鍙戦噺澶э紝蹇呴』浼樺寲浠g爜璁捐鍜屽疄鏂斤紝浠ュ噺灏戝湪楂樺苟鍙戞儏鍐典笅鐨勭郴缁熻祫婧愭秷鑰楋紝闃叉绯荤粺鎬ц兘闂銆�
锛�5锛変唬鐮佸畨鍏細 瀹夎骞朵娇鐢� CMS.CodeAnalysis 鍒嗘瀽鍣ㄦ潵鍒嗘瀽 IVariableDataCache.TagChanged 鐨勪娇鐢ㄦ儏鍐点�傝宸ュ叿鑳藉湪浣跨敤涓嶅綋鏃舵彁渚涚紪璇戦敊璇紝甯姪鎮ㄦ彁楂樹唬鐮佽川閲忋��*/
- _ = Task.Run(async () =>
+ if (changed.New?.Value.SafeString().ToBool() == true)
{
- await HanlderForPringBarCodeByCreateProductAsync();
- // 渚�1锛氬悓姝ュ鐞�
- //await ProcessAsync();
+ _ = Task.Run(async () =>
+ {
+ await HanlderForPringBarCodeByCreateProductAsync();
+ });
+ }
+ else
+ {
- // 渚�2锛氳皟鐢ㄥ閮ˋPI
- //await ExecuteExternalApiAsync();
- });
+ _ = Task.Run(async () =>
+ {
+ await HanlderForPringBarCodeByCreateProductWhenFalseAsync();
+ });
+ }
}
if (changed.Name == "鎵撶爜杩涚珯淇″彿" && changed.New?.Value.SafeString().ToBool() == true)
@@ -221,7 +234,7 @@
}
- if (changed.Name == "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�" && changed.New?.Value.SafeString().ToBool() == true)
+ if (changed.Name == "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�")
{
// TODO: 澶勭悊鍙橀噺鍊煎彉鍖�
@@ -234,15 +247,57 @@
锛�4锛夊苟鍙戠鐞嗭細 濡傛灉涓氬姟灞傚苟鍙戦噺澶э紝蹇呴』浼樺寲浠g爜璁捐鍜屽疄鏂斤紝浠ュ噺灏戝湪楂樺苟鍙戞儏鍐典笅鐨勭郴缁熻祫婧愭秷鑰楋紝闃叉绯荤粺鎬ц兘闂銆�
锛�5锛変唬鐮佸畨鍏細 瀹夎骞朵娇鐢� CMS.CodeAnalysis 鍒嗘瀽鍣ㄦ潵鍒嗘瀽 IVariableDataCache.TagChanged 鐨勪娇鐢ㄦ儏鍐点�傝宸ュ叿鑳藉湪浣跨敤涓嶅綋鏃舵彁渚涚紪璇戦敊璇紝甯姪鎮ㄦ彁楂樹唬鐮佽川閲忋��*/
- _ = Task.Run(async () =>
+ if (changed.New?.Value.SafeString().ToBool() == true)
{
- await HanlderForCutByCreateProductAsync();
- // 渚�1锛氬悓姝ュ鐞�
- //await ProcessAsync();
+ _ = Task.Run(async () =>
+ {
+ await HanlderForCutByCreateProductAsync();
+ });
+ }
+ else
+ {
+ _ = Task.Run(async () =>
+ {
+ await HanlderForCutByCreateProductWhenFlaseAsync();
+ });
+ }
+ }
- // 渚�2锛氳皟鐢ㄥ閮ˋPI
- //await ExecuteExternalApiAsync();
- });
+
+ if (changed.Name == "瑁呴厤瀹屽伐淇″彿")
+ {
+ if (changed.New?.Value.SafeString().ToBool() == true)
+ {
+ _ = Task.Run(async () =>
+ {
+ await HanlderFor瑁呴厤瀹屽伐淇″彿Async();
+ });
+ }
+ else
+ {
+ _ = Task.Run(async () =>
+ {
+ await HanlderFor瀹屽伐淇″彿WhenFalseAsync("瑁呴厤");
+ });
+ }
+ }
+
+ if (changed.Name == "鐒婃帴瀹屽伐淇″彿")
+ {
+ if (changed.New?.Value.SafeString().ToBool() == true)
+ {
+ _ = Task.Run(async () =>
+ {
+ await HanlderFor鐒婃帴瀹屽伐淇″彿Async();
+ });
+ }
+ else
+ {
+ _ = Task.Run(async () =>
+ {
+ await HanlderFor瀹屽伐淇″彿WhenFalseAsync("鐒婃帴");
+ });
+ }
}
}
}
@@ -314,13 +369,13 @@
try
{
//鏍规嵁wms浠诲姟鍙峰鎵� 鍙枡宸ュ崟
- callMaterialOrder = await callMaterialOrderAppService.FindByWmsTaskNoAsync(myTaskNo);
+ callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.WmsTaskNo == myTaskNo);
if (callMaterialOrder == null) return;//缁撴潫
//鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
- var workPlanList = await workPlanAppService.FindByDataIdentifierAsync(callMaterialOrder.DataIdentifier);
+ var workPlanList = await workPlanAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
if (workPlanList?.Count == 0) return;//缁撴潫
////TODO:鏆傛椂鐢熸垚浜у搧ID
@@ -365,6 +420,7 @@
pipeSpecCode3 = new_workPlanList[i].PipeSpecCode;
}
}
+
Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
{
{ "鎵撶爜宸ヤ欢1",code1},
@@ -376,7 +432,8 @@
{ "鎵撶爜绠℃缂栫爜", new_workPlanList.First().PipeSpecCode },
{ "鎵撶爜绠℃鍚嶇О", new_workPlanList.First().PipeSectionName },
{ "鎵撶爜鍘熸枡绠″瀷鍙�", new_workPlanList.First().MaterialMode },
- { "鎵撶爜鍘熸枡鏍囪瘑", new_workPlanList.First().DataIdentifier }
+ { "鎵撶爜鍘熸枡鏍囪瘑", new_workPlanList.First().DataIdentifier },
+ { "鎵撶爜鍘熸枡绠℃壒娆�", callMaterialOrder.MaterialBatch },//鎵规
};
_variableService.WriteValueAsync(keyValuePairs);
@@ -409,7 +466,9 @@
{
var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+ var workTaskAppService = _serviceProvider.GetRequiredService<IWorkTaskAppService>();
var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+ var workTaskRepository = _serviceProvider.GetRequiredService<IWorkTaskRepository>();
var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
using var scope = _serviceProvider.CreateScope();
@@ -432,30 +491,44 @@
try
{
//鏍规嵁wms浠诲姟鍙峰鎵� 鍙枡宸ュ崟
- callMaterialOrder = await callMaterialOrderAppService.FindByWmsTaskNoAsync(myTaskNo);
+ callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.WmsTaskNo == myTaskNo);
if (callMaterialOrder == null) return;//缁撴潫
+ //鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
+ var workTaskList = await workTaskAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
+ if (workTaskList?.Count == 0) return;//缁撴潫
+ //鏇存柊涓虹敓浜т腑
//鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
- var workPlanList = await workPlanAppService.FindByDataIdentifierAsync(callMaterialOrder.DataIdentifier);
+ var workPlanList = await workPlanAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
if (workPlanList?.Count == 0) return;//缁撴潫
//TODO:鏆傛椂鐢熸垚浜у搧ID
//var productID = DateTime.Now.ToString("yyyyMMddHHmmssfff");
- var productID = workPlanList.First().PipeSpecCode;
+ var productID = callMaterialOrder.DataIdentifier;
Dictionary<string, object?> keyValuePairs_productID = new Dictionary<string, object?>
{
{ "鎵撶爜_ProductID", productID},
+ { "CMS鍙嶉璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙风粨鏋�", true},
};
var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
- //鏇存柊涓虹敓浜т腑
- foreach (var item in workPlanList)
+ //鏇存柊 浠诲姟 涓虹敓浜т腑
+ var new_workTaskList = workTaskList.Where(x => x.ProcessRouteNumber == "鍒囧壊").ToList();
+ foreach (var item in new_workTaskList)
{
item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
}
- await workPlanRepository.UpdateManyAsync(workPlanList);
+ await workTaskRepository.UpdateManyAsync(new_workTaskList);
+
+ //鏇存柊涓虹敓浜т腑
+ var new_workPlanList = workPlanList.Where(x => x.ProcessRouteNumber == "鍒囧壊").ToList();
+ foreach (var item in new_workPlanList)
+ {
+ item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
+ }
+ await workPlanRepository.UpdateManyAsync(new_workPlanList);
uow.CompleteAsync();
@@ -466,6 +539,19 @@
throw;
}
}
+ }
+
+ /// <summary>
+ /// 璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�(鍊间负false鐨勬椂鍊�)
+ /// </summary>
+ /// <returns></returns>
+ private async Task HanlderForPringBarCodeByCreateProductWhenFalseAsync()
+ {
+ Dictionary<string, object?> keyValuePairs_productID = new Dictionary<string, object?>
+ {
+ { "CMS鍙嶉璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙风粨鏋�", false},
+ };
+ var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
}
@@ -569,13 +655,13 @@
try
{
//鏍规嵁wms浠诲姟鍙峰鎵� 鍙枡宸ュ崟
- callMaterialOrder = await callMaterialOrderAppService.FindByWmsTaskNoAsync(myTaskNo);
+ callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.WmsTaskNo == myTaskNo);
if (callMaterialOrder == null) return;//缁撴潫
//鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
- var workPlanList = await workPlanAppService.FindByDataIdentifierAsync(callMaterialOrder.DataIdentifier);
+ var workPlanList = await workPlanAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
if (workPlanList?.Count == 0) return;//缁撴潫
////TODO:鏆傛椂鐢熸垚浜у搧ID
@@ -631,7 +717,8 @@
{ "鍒囧壊绠℃缂栫爜", new_workPlanList.First().PipeSpecCode },
{ "鍒囧壊绠℃鍚嶇О", new_workPlanList.First().PipeSectionName },
{ "鍒囧壊鍘熸枡绠″瀷鍙�", new_workPlanList.First().MaterialMode },
- { "鍒囧壊鍘熸枡鏍囪瘑", new_workPlanList.First().DataIdentifier }
+ { "鍒囧壊鍘熸枡鏍囪瘑", new_workPlanList.First().DataIdentifier },
+ { "鍒囧壊鍘熸枡绠℃壒娆�", callMaterialOrder.MaterialBatch },//鎵规
};
_variableService.WriteValueAsync(keyValuePairs);
@@ -664,7 +751,9 @@
{
var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+ var workTaskAppService = _serviceProvider.GetRequiredService<IWorkTaskAppService>();
var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+ var workTaskRepository = _serviceProvider.GetRequiredService<IWorkTaskRepository>();
var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
using var scope = _serviceProvider.CreateScope();
@@ -687,32 +776,62 @@
try
{
//鏍规嵁wms浠诲姟鍙峰鎵� 鍙枡宸ュ崟
- callMaterialOrder = await callMaterialOrderAppService.FindByWmsTaskNoAsync(myTaskNo);
+ callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.WmsTaskNo == myTaskNo);
if (callMaterialOrder == null) return;//缁撴潫
+ //鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
+ var workTaskList = await workTaskAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
+ if (workTaskList?.Count == 0) return;//缁撴潫
+ var new_workTaskList = workTaskList.Where(x => x.ProcessName == "鍒囧壊宸ュ簭").ToList();
+ //鏇存柊涓虹敓浜т腑
+ foreach (var item in new_workTaskList)
+ {
+ item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
+ item.Remark = "鏇存柊鐢熶骇涓�";
+ }
+ await workTaskRepository.UpdateManyAsync(new_workTaskList);
+
+ var new_workTaskList_printCode = workTaskList.Where(x => x.ProcessName == "鎵撶爜宸ュ簭").ToList();
+ foreach (var item in new_workTaskList_printCode)
+ {
+ item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.宸插畬鎴�;
+ item.Remark = "鏇存柊宸插畬鎴�";
+ }
+ await workTaskRepository.UpdateManyAsync(new_workTaskList_printCode);
//鏍规嵁鍘熸枡鏍囪瘑瀵绘壘 浣滀笟璁″垝
- var workPlanList = await workPlanAppService.FindByDataIdentifierAsync(callMaterialOrder.DataIdentifier);
+ var workPlanList = await workPlanAppService.GetListByFilterAsync(x => x.DataIdentifier == callMaterialOrder.DataIdentifier);
if (workPlanList?.Count == 0) return;//缁撴潫
//TODO:鏆傛椂鐢熸垚浜у搧ID
//var productID = DateTime.Now.ToString("yyyyMMddHHmmssfff");
- var productID = workPlanList.First().PipeSpecCode;
+ var productID = callMaterialOrder.DataIdentifier;
Dictionary<string, object?> keyValuePairs_productID = new Dictionary<string, object?>
{
{ "鍒囧壊_ProductID", productID},
+ { "CMS鍙嶉璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙风粨鏋�", true},
};
var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
+
+
+ var new_workPlanList = workPlanList.Where(x => x.ProcessRouteNumber == "瑁呴厤").ToList();
//鏇存柊涓虹敓浜т腑
- foreach (var item in workPlanList)
+ foreach (var item in new_workPlanList)
{
item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
+ item.Remark = "鏇存柊鐢熶骇涓�";
}
- await workPlanRepository.UpdateManyAsync(workPlanList);
+ await workPlanRepository.UpdateManyAsync(new_workPlanList);
-
+ var new_workPlanList_printCode = workPlanList.Where(x => x.ProcessRouteNumber == "鍒囧壊").ToList();
+ foreach (var item in new_workPlanList_printCode)
+ {
+ item.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.宸插畬鎴�;
+ item.Remark = "鏇存柊宸插畬鎴�";
+ }
+ await workPlanRepository.UpdateManyAsync(new_workPlanList_printCode);
uow.CompleteAsync();
@@ -724,5 +843,123 @@
}
}
}
+
+ /// <summary>
+ /// 璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙凤紙鍊间负false鐨勬椂鍊欙級
+ /// </summary>
+ /// <returns></returns>
+ private async Task HanlderForCutByCreateProductWhenFlaseAsync()
+ {
+
+ Dictionary<string, object?> keyValuePairs_productID = new Dictionary<string, object?>
+ {
+ { "CMS鍙嶉璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙风粨鏋�", false},
+ };
+ var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
+ }
+
+
+
+ /// <summary>
+ /// 瑁呴厤瀹屽伐淇″彿=true鏃�
+ /// </summary>
+ /// <returns></returns>
+ private async Task HanlderFor瑁呴厤瀹屽伐淇″彿Async()
+ {
+
+ var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+ var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+ var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+ var pipeSpecCode = await _variableService.ReadValueAsync("瑁呴厤绠℃缂栫爜");
+
+ if (string.IsNullOrEmpty(pipeSpecCode?.Content?.Value.SafeString().ToString()))
+ {
+
+ }
+ else
+ {
+
+
+
+ var myPipeSpecCode = pipeSpecCode.Content.Value.SafeString().ToString();
+ CallMaterialOrder callMaterialOrder = null;
+ try
+ {
+ var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+ var userName = await _variableService.ReadValueAsync("瑁呴厤浜�");
+ MyCurrentUser myCurrentUser = new MyCurrentUser()
+ {
+ UserAccount = userName.Content.Value.SafeString().ToString()
+ };
+ sharedService.CompleteAssemblyProcess(_serviceProvider, new Application.Contracts.Dtos.WorkPlan.CompleteAssemblyProcessInput() { PipeSpecCode = myPipeSpecCode, ProcessName = "瑁呴厤宸ュ簭" }, myCurrentUser);
+
+ }
+ catch (Exception)
+ {
+
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鐒婃帴瀹屽伐淇″彿=true鏃�
+ /// </summary>
+ /// <returns></returns>
+ private async Task HanlderFor鐒婃帴瀹屽伐淇″彿Async()
+ {
+
+ var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+ var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+ var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+ var pipeSpecCode = await _variableService.ReadValueAsync("鐒婃帴绠℃缂栫爜");
+
+ if (string.IsNullOrEmpty(pipeSpecCode?.Content?.Value.SafeString().ToString()))
+ {
+
+ }
+ else
+ {
+
+
+
+ var myPipeSpecCode = pipeSpecCode.Content.Value.SafeString().ToString();
+ CallMaterialOrder callMaterialOrder = null;
+ try
+ {
+ var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+ var userName = await _variableService.ReadValueAsync("鐒婃帴浜�");
+ MyCurrentUser myCurrentUser = new MyCurrentUser()
+ {
+ UserAccount = userName.Content.Value.SafeString().ToString()
+ };
+ sharedService.CompleteAssemblyProcess(_serviceProvider, new Application.Contracts.Dtos.WorkPlan.CompleteAssemblyProcessInput() { PipeSpecCode = myPipeSpecCode, ProcessName = "鐒婃帴宸ュ簭" }, myCurrentUser);
+
+ }
+ catch (Exception)
+ {
+
+ }
+ }
+ }
+
+ /// <summary>
+ /// 瀹屽伐淇″彿=false鏃�
+ /// </summary>
+ /// <returns></returns>
+ private async Task HanlderFor瀹屽伐淇″彿WhenFalseAsync(string processName)
+ {
+ try
+ {
+ var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+ await sharedService.CompleteHandleOutStoreFinish(_serviceProvider, processName, false);
+ }
+ catch (Exception)
+ {
+
+
+ }
+ }
}
}
--
Gitblit v1.9.3