From e19b4d3b6a68314887f78786c36ad97339d5faaf Mon Sep 17 00:00:00 2001
From: mrzhssss <pro6@qq.com>
Date: 星期四, 01 十二月 2022 10:06:21 +0800
Subject: [PATCH] #

---
 src/main/webapp/static/js/order/out.js |  460 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 249 insertions(+), 211 deletions(-)

diff --git a/src/main/webapp/static/js/order/out.js b/src/main/webapp/static/js/order/out.js
index 6a2ff74..683acc3 100644
--- a/src/main/webapp/static/js/order/out.js
+++ b/src/main/webapp/static/js/order/out.js
@@ -1,12 +1,10 @@
 var pageCurr;
-var tableData;
 var insTb2;
-const sensorType = 5;
 layui.config({
     base: baseUrl + "/static/layui/lay/modules/"
 }).extend({
     notice: 'notice/notice',
-}).use(['table','laydate', 'form', 'util', 'admin', 'notice', 'treeTable', 'xmSelect'], function(){
+}).use(['table','laydate', 'form', 'util', 'admin', 'notice', 'treeTable', 'xmSelect', 'tableMerge', 'tableX' , 'laytpl'], function(){
     var table = layui.table;
     var $ = layui.jquery;
     var layer = layui.layer;
@@ -17,97 +15,46 @@
     var notice = layui.notice;
     var treeTable = layui.treeTable;
     var xmSelect = layui.xmSelect;
-
-    // 璁惧绫诲瀷鏁版嵁
-    var modelTb = treeTable.render({
-        elem: '#nothing',
-        url: baseUrl+'/sensorModel/list/auth',
-        headers: {token: localStorage.getItem('token')},
-        tree: {
-            iconIndex: 2,           // 鎶樺彔鍥炬爣鏄剧ず鍦ㄧ鍑犲垪
-            isPidData: true,        // 鏄惁鏄痠d銆乸id褰㈠紡鏁版嵁
-            idName: 'id',           // id瀛楁鍚嶇О
-            pidName: 'parentId'     // pid瀛楁鍚嶇О
-        },
-        cols: [[
-            {type: 'checkbox'}
-            ,{type: 'numbers'}
-            ,{field: 'name', align: 'left',title: '鍚嶇О', minWidth: 150}
-        ]],
-        done: function (data) {
-            modelTb.expandAll();
-        }
-    });
+    var tableMerge = layui.tableMerge;
+    var tableX = layui.tableX;
+    var laytpl = layui.laytpl;
 
     insTb2 = table.render({
-        elem: '#sensorTable',
+        elem: '#orderDetlTable',
         headers: {token: localStorage.getItem('token')},
-        url: baseUrl+'/sensor/list/auth?sensor_type='+sensorType,
+        url: baseUrl+'/orderDetl/pakout/list/auth',
         page: true,
         limit: 15,
         limits: [15, 30, 50, 100, 200, 500],
-        toolbar: '#sensorToolbar',
-        height: 'full-100',
+        toolbar: '#orderDetToolbar',
+        height: 'full-120',
+        where: {order_id: 9999999999},
         cols: [[
             {type: 'checkbox'}
-            // ,{field: 'id', align: 'center',title: 'ID'}
-            ,{field: 'hostId$', align: 'center',title: '鎵�灞為」鐩�', templet: '#hostTpl', width: 130}
-            // ,{field: 'sensorType$', align: 'center',title: '璁惧绫诲瀷'}
-            ,{field: 'uuid', align: 'center',title: '璁惧缂栫爜', width: 160}
-            ,{field: 'location', align: 'center',title: '鍦扮悊浣嶇疆', width: 180, style: 'font-size: 13px', hide: false}
-            ,{field: 'sensorModel$', align: 'center',title: '璁惧鍨嬪彿', width: 130, hide: false}
-            // ,{field: 'ccid', align: 'center',title: 'CCID'}
-            ,{field: 'sim', align: 'center',title: 'sim鍗″彿',hide: true}
-            // ,{field: 'name', align: 'center',title: '璁惧鍚�'}
-            // ,{field: 'topic', align: 'center',title: '涓婚'}
-            // ,{field: 'ip', align: 'center',title: 'ip'}
-            // ,{field: 'port', align: 'center',title: '绔彛'}
-            // ,{field: 'data', align: 'center',title: '鎶ユ枃'}
-            // ,{field: 'lon', align: 'center',title: '缁忓害'}
-            // ,{field: 'lat', align: 'center',title: '绾害'}
-            ,{field: 'signal', align: 'center',title: '淇″彿鍊�'}
-            ,{field: 'battery', align: 'center',title: '鐢甸噺',hide: true}
-            // ,{field: 'charge$', align: 'center',title: '鍏呯數鐘舵��'}
-            // ,{field: 'tiltX', align: 'center',title: 'x杞村�炬枩'}
-            // ,{field: 'tiltY', align: 'center',title: 'y杞村�炬枩'}
-            // ,{field: 'tiltZ', align: 'center',title: 'z杞村�炬枩'}
-            // ,{field: 'tilt$', align: 'center',title: '鍊炬枩鐘舵��'}
-            ,{field: 'tempe', align: 'center',title: '娓╁害', hide: true}
-            ,{
-                field: 'online', title: '缃戠粶', templet: function (d) {
-                    var strs = [
-                        '<span class="text-success">鍦ㄧ嚎</span>',
-                        '<span class="text-danger">绂荤嚎</span>'
-                    ];
-                    return strs[d.online?0:1];
-                }, align: 'center', sort: true
-            }
-            ,{
-                field: 'error', title: '鐘舵��', templet: function (d) {
-                    var strs = [
-                        '<span class="layui-badge layui-badge-red">寮傚父</span>',
-                        '<span class="layui-badge layui-badge-green">姝e父</span>'
-                    ];
-                    return strs[d.error?0:1];
-                }, align: 'center', sort: false, minWidth: 70, hide: false
-            }
-            // ,{field: 'worn$', align: 'center',title: '鐮存崯鐘舵��'}
-            // ,{field: 'overflow$', align: 'center',title: '瀹氱偣姘翠綅'}
-            // ,{field: 'nsAngle', align: 'center',title: '鍗楀寳瑙掑害'}
-            // ,{field: 'waterGage', align: 'center',title: '绠¢亾姘村帇'}
-            // ,{field: 'harmGas', align: 'center',title: '鏈夊姘斾綋'}
-            // ,{field: 'lnGas', align: 'center',title: '鍙噧姘斾綋'}
-            // ,{field: 'hsGas', align: 'center',title: '纭寲姘㈡皵浣�'}
-            // ,{field: 'reserve0', align: 'center',title: '棰勭暀0'}
-            // ,{field: 'reserve1', align: 'center',title: '棰勭暀1'}
-            // ,{field: 'status$', align: 'center',title: '鐘舵��', templet: '#statusTpl', width: 120, unresize: true}
-            // ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            ,{type: 'numbers', title: '#'}
+            ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', templet: '#orderNoTpl', width: 160}
+            ,{field: 'matnr', align: 'center',title: '鍟嗗搧缂栫爜', width: 160}
+            ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', width: 200}
+            ,{field: 'batch', align: 'center',title: '搴忓垪鐮�'}
+            ,{field: 'specs', align: 'center',title: '瑙勬牸'}
+            // ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+            // ,{field: 'qty', align: 'center',title: '浣滀笟鏁伴噺', style: 'font-weight: bold'}
+            ,{field: 'enableQty', align: 'center',title: '鎬绘暟閲�', style: 'font-weight: bold'}
+            // ,{field: 'name', align: 'center',title: '鍚嶇О'}
+            // ,{field: 'model', align: 'center',title: '鍨嬪彿'}
+            ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
+            ,{field: 'barcode', align: 'center',title: '鍟嗗搧鏉$爜', hide: true}
+            // ,{field: 'supplier', align: 'center',title: '渚涘簲鍟�'}
+            // ,{field: 'unitPrice', align: 'center',title: '鍗曚环'}
+            // ,{field: 'itemNum', align: 'center',title: '鍝侀」鏁�'}
+            // ,{field: 'count', align: 'center',title: '鏁伴噺'}
+            // ,{field: 'weight', align: 'center',title: '閲嶉噺'}
+            // ,{field: 'status$', align: 'center',title: '鐘舵��'}
             // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
-            ,{field: 'updateTime$', align: 'center',title: '鏇存柊鏃堕棿', minWidth: 170}
+            // ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
             // ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳'}
-            ,{field: 'addr', align: 'center',title: '璇︾粏鍦板潃', hide: true}
-            ,{field: 'memo', align: 'center',title: '澶囨敞', hide: true}
-
+            // ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
+            // ,{field: 'memo', align: 'center',title: '澶囨敞'}
             ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 160}
         ]],
         request: {
@@ -129,11 +76,11 @@
             if (res.code === 403) {
                 top.location.href = baseUrl+"/";
             }
-            tableData = table.cache.sensorTable;
             pageCurr=curr;
             limit();
         }
     });
+
     /* 琛ㄦ牸2鎼滅储 */
     form.on('submit(sensorTbSearch)', function (data) {
         insTb2.reload({where: data.field, page: {curr: 1}});
@@ -141,9 +88,17 @@
     });
 
     /* 琛ㄦ牸2澶村伐鍏锋爮鐐瑰嚮浜嬩欢 */
-    table.on('toolbar(sensorTable)', function (obj) {
-        if (obj.event === 'add') { // 娣诲姞
-            showEditModel()
+    table.on('toolbar(orderDetlTable)', function (obj) {
+
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        if (obj.event === 'pakoutPreview') { // 娣诲姞
+            if (checkStatus.length === 0) {
+                layer.msg('璇烽�夋嫨鑷冲皯涓�鏉″嚭搴撴槑缁�', {icon: 2});
+                return;
+            }
+            pakoutPreview(checkStatus.map(function (d) {
+                return d.id;
+            }));
         } else if (obj.event === 'del') { // 鍒犻櫎
             var checkRows = table.checkStatus('sensorTable');
             if (checkRows.data.length === 0) {
@@ -158,140 +113,199 @@
     });
 
     /* 琛ㄦ牸2宸ュ叿鏉$偣鍑讳簨浠� */
-    table.on('tool(sensorTable)', function (obj) {
+    table.on('tool(orderDetlTable)', function (obj) {
+        console.log(obj);
         var data = obj.data;
         switch (obj.event) {
-            case 'detl':
-                top.sensorByDetl = data.id;
+            // 鍑哄簱
+            case 'pakoutPreview':
+                pakoutPreview([data.id])
                 break;
-            // 缂栬緫
-            case 'edit':
-                showEditModel(data);
-                break;
-            // 鍒犻櫎
-            case 'del':
-                var ids = [data.id];
-                doDelSensor({ids: ids});
-                break;
-            // 鍩虹偣瀹氫綅
-            case 'lbs':
-                notice.msg('璇锋眰涓�...', {icon: 4, position: "topCenter"});
-                var param = {
-                    uuid: data.uuid,
-                    event: obj.event
-                };
-                $.ajax({
-                    url: baseUrl+"/main/command/v1/auth",
-                    headers: {'token': localStorage.getItem('token')},
-                    data: JSON.stringify(param),
-                    contentType:'application/json;charset=UTF-8',
-                    method: 'POST',
-                    success: function (res) {
-                        notice.destroy();
-                        if (res.code === 200){
-                            admin.open({
-                                title: '缁堢鍝嶅簲',
-                                url: 'callback.html',
-                                area: '360px',
-                                data: {
-                                    request: param,
-                                    response: res.data
-                                },
-                                tpl: true
-                            });
-                        } else if (res.code === 403){
-                            top.location.href = baseUrl+"/";
-                        }else {
-                            layer.msg(res.msg, {icon: 2});
-                        }
-                    }
-                })
-                break
         }
     });
 
-    // 璁惧鏄庣粏灞曞紑鍥炶皟
-    window.onSensorDetlDialog = function () {
-    };
-
-
-    /* 鏄剧ず琛ㄥ崟寮圭獥 */
-    function showEditModel(mData) {
-        admin.open({
-            type: 1,
-            area: '900px',
-            title: (mData ? '淇敼' : '娣诲姞') + '璁惧',
-            content: $('#editDialog').html(),
-            success: function (layero, dIndex) {
-                // 鍥炴樉琛ㄥ崟鏁版嵁
-                form.val('detail', mData);
-                // 鍦板浘瀹氫綅鍥炴樉
-                if (mData) {
-                    setTimeout(function () {
-                        $("#mapIframe")[0].contentWindow.position(mData.lon, mData.lat);
-                    }, 500)
-                }
-                // 琛ㄥ崟鎻愪氦浜嬩欢
-                form.on('submit(editSubmit)', function (data) {
-                    data.field.sensorModel = insXmSel.getValue('valueStr');
-                    if (isEmpty(data.field.hostId)) {
-                        layer.msg('璇烽�夋嫨鎵�灞為」鐩�', {icon: 2});
-                        return false;
-                    }
-                    data.field.lon = $("#mapIframe").contents().find("#lon").val();
-                    data.field.lat = $("#mapIframe").contents().find("#lat").val();
-                    data.field.city = $("#mapIframe").contents().find("#city").val();
-                    if (isEmpty(data.field.lon) || isEmpty(data.field.lat)) {
-                        layer.msg('璁惧涓嶅湪瀹氫綅', {icon: 2});
-                        return false;
-                    }
-                    var loadIndex = layer.load(2);
-                    $.ajax({
-                        url: baseUrl+"/sensor/"+(mData?'update':'add')+"/auth?sensorType="+sensorType,
-                        headers: {'token': localStorage.getItem('token')},
-                        data: data.field,
-                        method: 'POST',
-                        success: function (res) {
-                            layer.close(loadIndex);
-                            if (res.code === 200){
-                                layer.close(dIndex);
-                                layer.msg(res.msg, {icon: 1});
-                                $(".layui-laypage-btn")[0].click();
-                            } else if (res.code === 403){
-                                top.location.href = baseUrl+"/";
-                            }else {
-                                layer.msg(res.msg, {icon: 2});
+    function pakoutPreview(ids) {
+        let loadIndex = layer.load(2);
+        $.ajax({
+            url: baseUrl + "/out/pakout/preview/auth",
+            headers: {'token': localStorage.getItem('token')},
+            contentType: 'application/json;charset=UTF-8',
+            data: JSON.stringify(ids),
+            method: 'POST',
+            success: function (res) {
+                layer.close(loadIndex);
+                var tableCache;
+                if (res.code === 200){
+                    layer.open({
+                        type: 1
+                        ,title: false
+                        ,closeBtn: false
+                        ,offset: '50px'
+                        ,area: ['1200px', '700px']
+                        ,shade: 0.5
+                        ,shadeClose: false
+                        ,btn: ['绔嬪嵆鍑哄簱', '绋嶅悗澶勭悊']
+                        ,btnAlign: 'c'
+                        ,moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
+                        ,content: $('#pakoutPreviewBox').html()
+                        ,success: function(layero, index){
+                            console.log(res.data);
+                            stoPreTabIdx = table.render({
+                                elem: '#stoPreTab',
+                                data: res.data,
+                                height: 520,
+                                page: false,
+                                limit: Number.MAX_VALUE,
+                                cellMinWidth: 100,
+                                cols: [[
+                                    // {type: 'checkbox', merge: ['orderNo']},
+                                    {field: 'orderNo', title: '鍗曟嵁缂栧彿', merge: true, align: 'center'},
+                                    {field: 'title', title: '鍟嗗搧', merge: true, align: 'center', width: 350},
+                                    {field: 'batch', title: '搴忓垪鐮�', align: 'center'},
+                                    // { title: '鍓╀綑闇�姹傞噺', align: 'center' , width: 120, toolbar: '#checkNeedQty'},
+                                    // {field: 'anfme', title: '瀹為檯鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                                    { title: '鍑哄簱鏁伴噺', align: 'center',field: 'anfme', width: 90, style: 'font-weight: bold; color: red'},
+                                    {field: 'locNo', title: '璐т綅', align: 'center', width: 100, templet: '#locNoTpl'},
+                                    {field: 'staNos', align: 'center', title: '鍑哄簱绔�', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
+                                    {type: 'checkbox', merge: ['locNo']},
+                                ]],
+                                done: function (res) {
+                                    tableMerge.render(this);
+                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
+                                    tableCache = tableData = table.cache.stoPreTab;
+                                }
+                            });
+                            // 淇敼鍑哄簱绔�
+                            form.on('select(tbBasicTbStaNos)', function (obj) {
+                                let index  = obj.othis.parents('tr').attr("data-index");
+                                let data = tableCache[index];
+                                for (let i = 0; i<tableCache.length; i++) {
+                                    if (tableCache[i].locNo === data.locNo) {
+                                        tableCache[i]['staNo'] = Number(obj.elem.value);
+                                    }
+                                }
+                                obj.othis.children().find("input").css("color", "blue");
+                                return false;
+                            });
+                            // 鎵归噺淇敼鍑哄簱绔�
+                            form.on('submit(batchModifySta)', function () {
+                                let stoPreTabData = layui.table.checkStatus('stoPreTab').data;
+                                if (stoPreTabData.length < 1) {
+                                    layer.msg("璇疯嚦灏戦�夋嫨涓�鏉′互涓婂悎骞舵暟鎹�", {icon: 7});
+                                    return false;
+                                }
+                                modifySta(stoPreTabData);
+                            });
+                            // 鎵归噺淇敼鍑哄簱绔� - 绔欑偣閫夋嫨
+                            function modifySta(stoPreTabData) {
+                                // 鍑哄簱绔欏彇浜ら泦
+                                let staBatchSelectVal = [];
+                                for(let i = 0; i<stoPreTabData.length; i++) {
+                                    let staNos = stoPreTabData[i].staNos;
+                                    if (staNos !== null) {
+                                        if (staBatchSelectVal.length === 0) {
+                                            staBatchSelectVal = staNos;
+                                        } else {
+                                            staBatchSelectVal = staBatchSelectVal.filter(val =>
+                                                {
+                                                    return new Set(staNos).has(val)
+                                                }
+                                            )
+                                        }
+                                    }
+                                }
+                                if (staBatchSelectVal.length === 0) {
+                                    layer.msg("鍑哄簱绔欐病鏈変氦闆嗭紝鏃犳硶鎵归噺淇敼", {icon: 2});
+                                    return;
+                                }
+                                admin.open({
+                                    type: 1,
+                                    area: '300px',
+                                    offset: 'auto',
+                                    title: '璇烽�夋嫨绔欑偣',
+                                    content: $('#staBatchSelectDialog').html(),
+                                    success: function (layero, ddIndex) {
+                                        // 娓叉煋涓嬫媺妗�
+                                        let template = Handlebars.compile($('#batchStaSelectTpl').html());
+                                        $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
+                                        // 纭
+                                        form.on('submit(staBatchSelectConfirm)', function (obj) {
+                                            let loadIdx = layer.load(2);
+                                            let batchSta = Number(obj.field.batchSta);
+                                            let arr = [];
+                                            for (let j = 0; j<stoPreTabData.length; j++) {
+                                                for (let i = 0; i<tableCache.length; i++) {
+                                                    if (tableCache[i].orderNo === stoPreTabData[j].orderNo
+                                                        && tableCache[i].matnr === stoPreTabData[j].matnr
+                                                        && tableCache[i].locNo === stoPreTabData[j].locNo) {
+                                                        tableCache[i]['staNo'] = batchSta;
+                                                        arr.push(i);
+                                                    }
+                                                }
+                                            }
+                                            stoPreTabIdx.reload({data: tableCache});
+                                            arr.forEach(item => {
+                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
+                                            });
+                                            layui.form.render('select');
+                                            arr.forEach(item => {
+                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
+                                            });
+                                            layer.close(loadIdx); layer.close(ddIndex);
+                                            return false;
+                                        });
+                                        // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                                        $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                                        layui.form.render('select');
+                                    },
+                                })
                             }
+
                         }
-                    })
-                    return false;
-                });
-                // 娓叉煋涓嬫媺鏍�
-                var insXmSel = xmSelect.render({
-                    el: '#modelSel',
-                    height: '250px',
-                    data: modelTb.options.data,
-                    initValue: mData&&mData.sensorModel ? [mData.sensorModel] : [],
-                    model: {label: {type: 'text'}},
-                    prop: {
-                        name: 'name',
-                        value: 'id'
-                    },
-                    radio: true,
-                    clickClose: true,
-                    tree: {
-                        show: true,
-                        indent: 15,
-                        strict: false,
-                        expandedKeys: true
-                    }
-                });
-                // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
-                $(layero).children('.layui-layer-content').css('overflow', 'visible');
-                layui.form.render('select');
+                        ,yes: function(index, layero){
+                            //鎸夐挳銆愮珛鍗冲嚭搴撱�戠殑鍥炶皟
+                            pakout(tableCache, index);
+                        }
+                        ,btn2: function(index, layero){
+                            //鎸夐挳銆愮◢鍚庡鐞嗐�戠殑鍥炶皟
+                            layer.close(index)
+                            //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
+                        }
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
+            }
+        })
+    }
+
+    function pakout(tableCache, layerIndex) {
+        // let loadIndex = layer.load(2);
+        notice.msg('姝e湪鐢熸垚鍑哄簱浠诲姟......', {icon: 4});
+        $.ajax({
+            url: baseUrl + "/out/pakout/auth",
+            headers: {'token': localStorage.getItem('token')},
+            contentType: 'application/json;charset=UTF-8',
+            data: JSON.stringify(tableCache),
+            method: 'POST',
+            success: function (res) {
+                notice.destroy();
+                if (res.code === 200) {
+                    layer.close(layerIndex);
+                    layer.msg(res.msg, {icon: 1});
+                    insTb.reload({where: null});
+                    insTb2.reload({where: null, page: {curr: 1}});
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
             }
         });
     }
+
 
 
     /* 鍒犻櫎璁㈠崟 */
@@ -333,6 +347,8 @@
         })
     })
 
+    window.pakoutPreview = pakoutPreview;
+
 });
 
 function tableReload(child) {
@@ -348,3 +364,25 @@
     });
 }
 
+/**
+ * 涓�閿嚭搴�
+ */
+function autoOut(orderId) {
+    let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+    $.ajax({
+        url: baseUrl + "/out/pakout/orderDetlIds/auth",
+        headers: {'token': localStorage.getItem('token')},
+        data: { orderId : orderId },
+        method: 'POST',
+        success: function (res) {
+            layer.close(loadIndex);
+            if (res.code === 200){
+                pakoutPreview(res.data);
+            } else if (res.code === 403){
+                top.location.href = baseUrl+"/";
+            } else {
+                layer.msg(res.msg, {icon: 2});
+            }
+        }
+    })
+}

--
Gitblit v1.9.1