From fe5c4eeb45ec03380259b2e3c9b411be128ae6c8 Mon Sep 17 00:00:00 2001 From: bklLiudl <673013083@qq.com> Date: 星期一, 26 八月 2024 09:11:58 +0800 Subject: [PATCH] 功能测试,问题修改。 --- HTML/views/ASNSetting/ArrivalNoticeDetail.html | 15 +++- Wms/WMS.BLL/SysServer/UserInforServer.cs | 4 Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs | 28 ++++++++- Wms/Model/ModelVm/BllAsnVm/ArrivalNoticeDetailVm.cs | 25 ++++++++ HTML/views/ASNSetting/ArrivalNotice.html | 18 +++-- Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDto.cs | 3 Wms/WMS.Entity/BllAsnEntity/BllArrivalNoticeDetail.cs | 24 ++++++++ HTML/views/ASNSetting/ProcurePlanNotice.html | 27 ++++---- Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDetailDto.cs | 25 ++++++++ Wms/WMS.BLL/BllAsnServer/ProcurePlanServer.cs | 1 10 files changed, 138 insertions(+), 32 deletions(-) diff --git a/HTML/views/ASNSetting/ArrivalNotice.html b/HTML/views/ASNSetting/ArrivalNotice.html index 396741c..67fc0aa 100644 --- a/HTML/views/ASNSetting/ArrivalNotice.html +++ b/HTML/views/ASNSetting/ArrivalNotice.html @@ -401,7 +401,7 @@ base: '../../layuiadmin/' //闈欐�佽祫婧愭墍鍦ㄨ矾寰� }).extend({ index: 'lib/index' //涓诲叆鍙fā鍧� - }).use(['index', 'form','table', 'laypage', 'layer', 'laydate'], function () { + }).use(['index', 'form', 'table', 'laypage', 'layer', 'laydate'], function () { var doing = true; @@ -530,13 +530,15 @@ // {field: 'Money',title: '閲戦',align: 'center',width: 65}, { field: 'LotText', title: '鎵规鎻忚堪', align: 'center', width: 120 }, { field: 'PackagName', title: '鍖呰鍚嶇О', align: 'center', width: 110, }, - { field: 'IsBale', title: '鏄惁瑁瑰寘', align: 'center', width: 150 }, - { field: 'IsBelt', title: '鏄惁鎵撳甫', align: 'center', width: 150 }, - { field: 'UDF1', title: '鑷畾涔夊垪1', align: 'center', width: 140 }, - { field: 'UDF2', title: '鑷畾涔夊垪2', align: 'center', width: 140 }, - { field: 'UDF3', title: '鑷畾涔夊垪3', align: 'center', width: 140 }, - { field: 'UDF4', title: '鑷畾涔夊垪4', align: 'center', width: 140 }, - { field: 'UDF5', title: '鑷畾涔夊垪5', align: 'center', width: 140, templet: '#templetUDF5' }, + { field: 'Lot1', title: '鐢熶骇鏃ユ湡', align: 'center', width: 140 }, + { field: 'Lot2', title: '杩囨湡鏃ユ湡', align: 'center', width: 140 }, + // { field: 'IsBale', title: '鏄惁瑁瑰寘', align: 'center', width: 150 }, + // { field: 'IsBelt', title: '鏄惁鎵撳甫', align: 'center', width: 150 }, + // { field: 'UDF1', title: '鑷畾涔夊垪1', align: 'center', width: 140 }, + // { field: 'UDF2', title: '鑷畾涔夊垪2', align: 'center', width: 140 }, + // { field: 'UDF3', title: '鑷畾涔夊垪3', align: 'center', width: 140 }, + // { field: 'UDF4', title: '鑷畾涔夊垪4', align: 'center', width: 140 }, + // { field: 'UDF5', title: '鑷畾涔夊垪5', align: 'center', width: 140, templet: '#templetUDF5' }, { field: 'CreateUserName', title: '鍒涘缓浜�', align: 'center', width: 100 }, { field: 'CreateTime', title: '鍒涘缓鏃堕棿', align: 'center', width: 160, templet: '#templetCreateTime2' }, { field: 'UpdateUserName', title: '淇敼浜�', align: 'center', width: 150, }, diff --git a/HTML/views/ASNSetting/ArrivalNoticeDetail.html b/HTML/views/ASNSetting/ArrivalNoticeDetail.html index c8893fe..d0e3685 100644 --- a/HTML/views/ASNSetting/ArrivalNoticeDetail.html +++ b/HTML/views/ASNSetting/ArrivalNoticeDetail.html @@ -209,13 +209,16 @@ { field: 'Standard', title: '瑙勬牸', width: 160, align: 'center' }, { field: 'LotText', title: '鎵规鎻忚堪', align: 'center', edit: 'text', width: 160 }, { field: 'PackagNo', title: '鍖呰鍚嶇О', width: 160, templet: "#table-content-Packlist" }, + { field: 'Lot1', title: '鐢熶骇鏃ユ湡', align: 'center', edit: 'text', width: 140 }, + { field: 'Lot2', title: '杩囨湡鏃ユ湡', align: 'center', edit: 'text', width: 140 }, + // { field: 'Price', title: '鍗曚环', align: 'center', width: 80 }, // { field: 'Money', title: '閲戦', align: 'center', width: 100 }, - { field: 'UDF1', title: '鑷畾涔夊垪1', align: 'center', edit: 'text', width: 140 }, - { field: 'UDF2', title: '鑷畾涔夊垪2', align: 'center', edit: 'text', width: 140 }, - { field: 'UDF3', title: '鑷畾涔夊垪3', align: 'center', edit: 'text', width: 140 }, - { field: 'UDF4', title: '鑷畾涔夊垪4', align: 'center', edit: 'text', width: 140 }, - { field: 'UDF5', title: '鑷畾涔夊垪5', align: 'center', width: 140, templet: '#templetUDF5' }, + // { field: 'UDF1', title: '鑷畾涔夊垪1', align: 'center', edit: 'text', width: 140 }, + // { field: 'UDF2', title: '鑷畾涔夊垪2', align: 'center', edit: 'text', width: 140 }, + // { field: 'UDF3', title: '鑷畾涔夊垪3', align: 'center', edit: 'text', width: 140 }, + // { field: 'UDF4', title: '鑷畾涔夊垪4', align: 'center', edit: 'text', width: 140 }, + // { field: 'UDF5', title: '鑷畾涔夊垪5', align: 'center', width: 140, templet: '#templetUDF5' }, { field: 'caozuo', title: '鎿嶄綔', fixed: 'right', width: 100, align: 'center', templet: '#table-content-list', "disabled": true } ]]; var TotalColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//灏嗚〃澶存暟鎹繘琛寀rl缂栫爜 @@ -703,6 +706,8 @@ IsBale: arr[i].IsBale, IsBelt: arr[i].IsBelt, SupplierLot: arr[i].SupplierLot, + Lot1: arr[i].Lot1, + Lot2: arr[i].Lot2, UDF1: arr[i].UDF1, UDF2: arr[i].UDF2, UDF3: arr[i].UDF3, diff --git a/HTML/views/ASNSetting/ProcurePlanNotice.html b/HTML/views/ASNSetting/ProcurePlanNotice.html index 733b7c0..22ded55 100644 --- a/HTML/views/ASNSetting/ProcurePlanNotice.html +++ b/HTML/views/ASNSetting/ProcurePlanNotice.html @@ -65,9 +65,9 @@ </div> <div class="layui-inline"> - <label class="layui-form-label">瀹㈡埛鍚嶇О</label> + <label class="layui-form-label">渚涘簲鍟�</label> <div class="layui-input-inline"> - <input type="text" id="CustomerName" name="CustomerName" placeholder="瀹㈡埛鍚嶇О" + <input type="text" id="CustomerName" name="CustomerName" placeholder="渚涘簲鍟�" autocomplete="off" class="layui-input"> </div> </div> @@ -288,10 +288,10 @@ { field: 'Status', title: '鎵ц鐘舵��', align: 'center', templet: '#buttonTpl' }, { field: 'CompleteTime', title: '瀹屾垚鏃堕棿', align: 'center', templet: '#templetCompleteTime' }, { field: 'UserName', title: '鍒跺崟浜�', align: 'center', width: 110 }, - { field: 'CreateUserName', title: '鍒涘缓浜�', align: 'center', width: 110 }, + // { field: 'CreateUserName', title: '鍒涘缓浜�', align: 'center', width: 110 }, { field: 'CreateTime', title: '涓嬪彂鏃堕棿', align: 'center', templet: '#templetCreateTime' }, - { field: 'UpdateUserName', title: '淇敼浜�', align: 'center', width: 110 }, - { field: 'UpdateTime', title: '淇敼鏃堕棿', align: 'center', templet: '#templetUpdateTime' }, + // { field: 'UpdateUserName', title: '淇敼浜�', align: 'center', width: 110 }, + // { field: 'UpdateTime', title: '淇敼鏃堕棿', align: 'center', templet: '#templetUpdateTime' }, //{ field: 'caozuo', title: '鎿嶄綔', fixed: 'right', width: 280, align: 'center', toolbar: '#toolbarDemo1', "disabled": true } ]]; var TotalColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//灏嗚〃澶存暟鎹繘琛寀rl缂栫爜 @@ -331,7 +331,7 @@ height: h1, id: 'LAY-app-content-list', where: param, - + contentType: 'application/json', headers: { ToKen: $.cookie('token') }, page: true, @@ -362,19 +362,19 @@ { field: 'OrderDetailCode', title: '閲囪喘鍗曡鍙�', align: 'center', width: 100 }, { field: 'CustomerName', title: '渚涘簲鍟嗗悕绉�', align: 'center' }, { field: 'SkuNo', title: '鐗╂枡缂栫爜', align: 'center', width: 100 }, - { field: 'SkuName', title: '鐗╂枡鍚嶇О', align: 'center', width: 200 }, - { field: 'Standard', title: '鐗╂枡瑙勬牸', align: 'center', width: 130 }, + { field: 'SkuName', title: '鐗╂枡鍚嶇О', align: 'center' }, + { field: 'Standard', title: '鐗╂枡瑙勬牸', align: 'center' }, { field: 'Qty', title: '鏁伴噺', align: 'center', width: 70 }, { field: 'CompleteQty', title: '瀹屾垚鏁伴噺', align: 'center', width: 90 }, { field: 'CompleteTime', title: '瀹屾垚鏃堕棿', align: 'center', width: 160, templet: '#templetCompleteTime2' }, //{ field: 'UnitName', title: '璁¢噺鍗曚綅', align: 'center', width: 90 }, //{ field: 'Price', title: '鍗曚环', align: 'center', width: 65 }, //{ field: 'Money', title: '閲戦', align: 'center', width: 65 }, - { field: 'PackagName', title: '鍖呰鍚嶇О', align: 'center', width: 110, }, - { field: 'CreateUserName', title: '鍒涘缓浜�', align: 'center', width: 100 }, - { field: 'CreateTime', title: '鍒涘缓鏃堕棿', align: 'center', width: 160, templet: '#templetCreateTime2' }, - { field: 'UpdateUserName', title: '淇敼浜�', align: 'center', width: 150, }, - { field: 'UpdateTime', title: '淇敼鏃堕棿', align: 'center', width: 150, templet: '#templetUpdateTime3' }, + { field: 'PackagName', title: '鍖呰鍚嶇О', align: 'center' }, + // { field: 'CreateUserName', title: '鍒涘缓浜�', align: 'center', width: 100 }, + // { field: 'CreateTime', title: '鍒涘缓鏃堕棿', align: 'center', width: 160, templet: '#templetCreateTime2' }, + // { field: 'UpdateUserName', title: '淇敼浜�', align: 'center', width: 150, }, + // { field: 'UpdateTime', title: '淇敼鏃堕棿', align: 'center', width: 150, templet: '#templetUpdateTime3' }, //{ field: 'caozuo', title: '鎿嶄綔', fixed: 'right', align: 'center', toolbar: '#toolbarDemoList', "disabled": true } ]]; var DetailColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(DetailColsArr)))//灏嗚〃澶存暟鎹繘琛寀rl缂栫爜 @@ -411,6 +411,7 @@ defaultToolbar: [], //'filter','print', 'exports' headers: { ToKen: $.cookie('token') }, page: true, + even: true, limit: pageCnt, limits: pageLimits, cellMinWidth: 60, //鍏ㄥ眬瀹氫箟甯歌鍗曞厓鏍肩殑鏈�灏忓搴︼紝layui 2.2.1 鏂板 diff --git a/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDetailDto.cs b/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDetailDto.cs index a5408ed..0abda3d 100644 --- a/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDetailDto.cs +++ b/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDetailDto.cs @@ -157,6 +157,31 @@ public string AsnStatus { get; set; } /// <summary> + /// 鎵规灞炴��1-鐢熶骇鏃ユ湡 + /// </summary> + public string Lot1 { get; set; } + /// <summary> + /// 鎵规灞炴��2-杩囨湡鏃ユ湡 + /// </summary> + public string Lot2 { get; set; } + /// <summary> + /// 鎵规灞炴��3 + /// </summary> + public string Lot3 { get; set; } + /// <summary> + /// 鎵规灞炴��4 + /// </summary> + public string Lot4 { get; set; } + /// <summary> + /// 鎵规灞炴��5 + /// </summary> + public string Lot5 { get; set; } + /// <summary> + /// 鎵规灞炴��6 + /// </summary> + public string Lot6 { get; set; } + + /// <summary> /// 鑷畾涔夊垪1 /// </summary> public string UDF1 { get; set; } diff --git a/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDto.cs b/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDto.cs index a45a95b..0f34c61 100644 --- a/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDto.cs +++ b/Wms/Model/ModelDto/BllAsnDto/ArrivalNoticeDto.cs @@ -43,7 +43,7 @@ public string CustomerNo { get; set; } /// <summary> - /// Desc:瀹㈡埛鍚嶇О + /// Desc:渚涘簲鍟嗗悕绉� /// Default: /// Nullable:True /// </summary> @@ -89,6 +89,7 @@ public DateTime CreateTime { get; set; } public string CreateUserName { get; set; } + public string UserName { get; set; } public string UpdateTime { get; set; } diff --git a/Wms/Model/ModelVm/BllAsnVm/ArrivalNoticeDetailVm.cs b/Wms/Model/ModelVm/BllAsnVm/ArrivalNoticeDetailVm.cs index 13e8e08..8993c90 100644 --- a/Wms/Model/ModelVm/BllAsnVm/ArrivalNoticeDetailVm.cs +++ b/Wms/Model/ModelVm/BllAsnVm/ArrivalNoticeDetailVm.cs @@ -122,6 +122,31 @@ public int? CreateUser { get; set; } /// <summary> + /// 鎵规灞炴��1-鐢熶骇鏃ユ湡 + /// </summary> + public string Lot1 { get; set; } + /// <summary> + /// 鎵规灞炴��2-杩囨湡鏃ユ湡 + /// </summary> + public string Lot2 { get; set; } + /// <summary> + /// 鎵规灞炴��3 + /// </summary> + public string Lot3 { get; set; } + /// <summary> + /// 鎵规灞炴��4 + /// </summary> + public string Lot4 { get; set; } + /// <summary> + /// 鎵规灞炴��5 + /// </summary> + public string Lot5 { get; set; } + /// <summary> + /// 鎵规灞炴��6 + /// </summary> + public string Lot6 { get; set; } + + /// <summary> /// 鑷畾涔夊垪1 /// </summary> public string UDF1 { get; set; } diff --git a/Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs b/Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs index ba41cd5..c3a2b0d 100644 --- a/Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs +++ b/Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs @@ -73,6 +73,7 @@ CompleteTime = tb1.CompleteTime, CreateTime = tb1.CreateTime, CreateUserName = tb3.RealName, + UserName=tb1.UserName, UpdateTime = ((DateTime)tb1.UpdateTime).ToString("yyyy-MM-dd HH:mm:ss"), UpdateUserName = tb4.RealName @@ -118,6 +119,8 @@ Status = tb1.Status, AsnType = tb2.Type, AsnStatus = tb2.Status, + Lot1 = tb1.Lot1, + Lot2 = tb1.Lot2, UDF1 = tb1.UDF1, UDF2 = tb1.UDF2, UDF3 = tb1.UDF3, @@ -519,8 +522,21 @@ } } + if (TypeLot.Contains(model.Type)) + { + if (string.IsNullOrWhiteSpace(detailModel.Lot1)) + { + throw new Exception("鐢熶骇鏃ユ湡涓嶅彲涓虹┖!"); + } + if (string.IsNullOrWhiteSpace(detailModel.Lot2)) + { + throw new Exception("杩囨湡鏃ユ湡涓嶅彲涓虹┖!"); + } + } + // 鍒ゆ柇鏄惁宸插瓨鍦ㄥ綋鍓嶆槑缁� - var com = dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo && m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count(); + var com = dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo + && m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count(); if (com > 0) { strMessage = "-1:鐗╂枡鍜屾壒娆″彿閲嶅;"; @@ -587,6 +603,8 @@ IsBelt = detailModel.IsBelt, SupplierLot = detailModel.SupplierLot, Status = "0", + Lot1 = detailModel.Lot1, + Lot2 = detailModel.Lot2, UDF1 = detailModel.UDF1, UDF2 = detailModel.UDF2, UDF3 = detailModel.UDF3, @@ -607,6 +625,8 @@ && it.SupplierLot == detailModel.SupplierLot && it.IsBale == detailModel.IsBale && it.IsBelt == detailModel.IsBelt + && it.Lot1 == detailModel.Lot1 // 鐢熶骇鏃ユ湡 + && it.Lot2 == detailModel.Lot2 // 杩囨湡鏃ユ湡 && it.UDF1 == detailModel.UDF1 && it.UDF2 == detailModel.UDF2 && it.UDF3 == detailModel.UDF3 @@ -624,7 +644,7 @@ { if (dbDetail.LotNo != detailModel.LotNo) { - strMessage = "-1:褰撳墠鍗曟嵁绫诲瀷涓嶅彲鏇存敼鎵规锛屽彧鍙紪杈戞暟閲�;"; + strMessage = "-1:褰撳墠鍗曟嵁绫诲瀷涓嶅彲鏇存敼鎵规;"; continue; } } @@ -639,6 +659,8 @@ dbDetail.LotText = detailModel.LotText; dbDetail.SupplierLot = detailModel.SupplierLot; dbDetail.IsBale = detailModel.IsBale; + dbDetail.Lot1 = detailModel.Lot1; + dbDetail.Lot2 = detailModel.Lot2; dbDetail.UDF1 = detailModel.UDF1; dbDetail.UDF2 = detailModel.UDF2; dbDetail.UDF3 = detailModel.UDF3; @@ -792,7 +814,7 @@ asnModel.UpdateUser = model.CreateUser; } - asnDetail.IsDel = "0"; + asnDetail.IsDel = "1"; asnDetail.UpdateTime = editDateTime; asnDetail.UpdateUser = model.CreateUser; diff --git a/Wms/WMS.BLL/BllAsnServer/ProcurePlanServer.cs b/Wms/WMS.BLL/BllAsnServer/ProcurePlanServer.cs index db806fa..3c0c3bc 100644 --- a/Wms/WMS.BLL/BllAsnServer/ProcurePlanServer.cs +++ b/Wms/WMS.BLL/BllAsnServer/ProcurePlanServer.cs @@ -42,6 +42,7 @@ .WhereIF(!string.IsNullOrWhiteSpace(model.EndTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) .WhereIF(!string.IsNullOrWhiteSpace(model.SkuName), (tb1,tb2) => tb2.SkuName.Contains(model.SkuName)) .WhereIF(!string.IsNullOrWhiteSpace(model.SkuNo), (tb1,tb2) => tb2.SkuNo.Contains(model.SkuNo)) + .WhereIF(!string.IsNullOrWhiteSpace(model.CustomerName), (tb1,tb2) => tb2.CustomerName.Contains(model.CustomerName)) .Where(tb1 => tb1.IsDel == "0") .OrderBy(tb1=>tb1.Status) .OrderByDescending(tb1 => tb1.CreateTime) diff --git a/Wms/WMS.BLL/SysServer/UserInforServer.cs b/Wms/WMS.BLL/SysServer/UserInforServer.cs index 4597c85..30997b1 100644 --- a/Wms/WMS.BLL/SysServer/UserInforServer.cs +++ b/Wms/WMS.BLL/SysServer/UserInforServer.cs @@ -65,6 +65,7 @@ .LeftJoin<SysUserInfor>((a, b) => a.CreateUser == b.Id) .LeftJoin<SysDepartment>((a, b, c) => a.DepartmentNo == c.DepartmentNo) .LeftJoin<SysRoles>((a, b, c, d) => a.RoleNo == d.RoleNo) + .Where((a,b,c,d)=>d.IsDel == "0") .WhereIF(!string.IsNullOrEmpty(UserName), a => a.UserName.Contains(UserName)) .WhereIF(!string.IsNullOrEmpty(DepartmentNo), a => a.DepartmentNo == DepartmentNo) .WhereIF(!string.IsNullOrEmpty(RoleNo), a => a.RoleNo == RoleNo) @@ -187,9 +188,7 @@ /// <summary> /// 淇敼鐢ㄦ埛瀵嗙爜 /// </summary> - /// <param name="pwdOld">鍘熷瘑鐮�</param> /// <param name="pwdNew">鏂板瘑鐮�</param> - /// <param name="pwdNewTwo">纭瀵嗙爜</param> /// <param name="userId">鐢ㄦ埛id</param> /// <returns></returns> /// <exception cref="Exception">鎹曡幏寮傚父</exception> @@ -199,6 +198,7 @@ .Where(s => s.Id == userId) .SetColumns(s => s.UpdateTime == DateTime.Now) .SetColumns(s => s.UpdateUser == _userManager.UserId) + .SetColumns(s=>s.PassWord == pwdNew) .SetColumns(s => s.SetPasswordTime == DateTime.Now) .ExecuteCommandAsync(); } diff --git a/Wms/WMS.Entity/BllAsnEntity/BllArrivalNoticeDetail.cs b/Wms/WMS.Entity/BllAsnEntity/BllArrivalNoticeDetail.cs index 8a3d951..c8a1948 100644 --- a/Wms/WMS.Entity/BllAsnEntity/BllArrivalNoticeDetail.cs +++ b/Wms/WMS.Entity/BllAsnEntity/BllArrivalNoticeDetail.cs @@ -145,6 +145,30 @@ /// Nullable:True /// </summary> public string InspectStatus { get; set; } + /// <summary> + /// 鎵规灞炴��1-鐢熶骇鏃ユ湡 + /// </summary> + public string Lot1 { get; set; } + /// <summary> + /// 鎵规灞炴��2-杩囨湡鏃ユ湡 + /// </summary> + public string Lot2 { get; set; } + /// <summary> + /// 鎵规灞炴��3 + /// </summary> + public string Lot3 { get; set; } + /// <summary> + /// 鎵规灞炴��4 + /// </summary> + public string Lot4 { get; set; } + /// <summary> + /// 鎵规灞炴��5 + /// </summary> + public string Lot5 { get; set; } + /// <summary> + /// 鎵规灞炴��6 + /// </summary> + public string Lot6 { get; set; } /// <summary> /// 鑷畾涔夊垪1 -- Gitblit v1.8.0