From 18fcb8ad28f583e3e1b99b23e4f7d9e1833dcd83 Mon Sep 17 00:00:00 2001
From: pengwei <2071057782@qq.com>
Date: 星期三, 12 三月 2025 14:16:30 +0800
Subject: [PATCH] 最新提交

---
 项目代码/client/src/views/tts/CraftCenter/Craftcenter.vue |  494 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 405 insertions(+), 89 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/client/src/views/tts/CraftCenter/Craftcenter.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/client/src/views/tts/CraftCenter/Craftcenter.vue"
index e1a51eb..9ba3afa 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/client/src/views/tts/CraftCenter/Craftcenter.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/client/src/views/tts/CraftCenter/Craftcenter.vue"
@@ -33,8 +33,12 @@
             >
               <span>姝や负浠诲姟浣滅敤涓數姘旂殑鐨勮鎯呮楠ゅ伐鑹恒��</span>
               <div style="display: flex; margin-top: 0.81rem">
-                <span style="margin-right: 1.25rem">姝ラ锛�12</span>
-                <span>濂楃瓛鏁伴噺锛�34</span>
+                <span style="margin-right: 1.25rem"
+                  >姝ラ锛歿{ electric ? electric.maxNodal : "0" }}</span
+                >
+                <span
+                  >濂楃瓛鏁伴噺锛歿{ electric ? electric.sumTorqueSum : "0" }}</span
+                >
               </div>
             </div>
           </div>
@@ -59,7 +63,7 @@
               font-size: 0.88rem;
               cursor: pointer;
             "
-            @click="addcraft()"
+            @click="addcraft('鐢垫皵')"
           >
             鏂板宸ヨ壓
           </div>
@@ -97,8 +101,14 @@
             >
               <span>姝や负浠诲姟浣滅敤涓満姊扮殑鐨勮鎯呮楠ゅ伐鑹恒��</span>
               <div style="display: flex; margin-top: 0.81rem">
-                <span style="margin-right: 1.25rem">姝ラ锛�12</span>
-                <span>濂楃瓛鏁伴噺锛�34</span>
+                <span style="margin-right: 1.25rem"
+                  >姝ラ锛歿{ mechanical ? mechanical.maxNodal : "0" }}</span
+                >
+                <span
+                  >濂楃瓛鏁伴噺锛歿{
+                    mechanical ? mechanical.sumTorqueSum : "0"
+                  }}</span
+                >
               </div>
             </div>
           </div>
@@ -123,7 +133,7 @@
               font-size: 0.88rem;
               cursor: pointer;
             "
-            @click="addcraft()"
+            @click="addcraft('鏈烘')"
           >
             鏂板宸ヨ壓
           </div>
@@ -161,8 +171,10 @@
             >
               <span>姝や负浠诲姟浣滅敤涓湴娌熺殑鐨勮鎯呮楠ゅ伐鑹恒��</span>
               <div style="display: flex; margin-top: 0.81rem">
-                <span style="margin-right: 1.25rem">姝ラ锛�12</span>
-                <span>濂楃瓛鏁伴噺锛�34</span>
+                <span style="margin-right: 1.25rem"
+                  >姝ラ锛歿{ trench ? trench.maxNodal : "0" }}</span
+                >
+                <span>濂楃瓛鏁伴噺锛歿{ trench ? trench.sumTorqueSum : "0" }}</span>
               </div>
             </div>
           </div>
@@ -187,7 +199,7 @@
               font-size: 0.88rem;
               cursor: pointer;
             "
-            @click="addcraft()"
+            @click="addcraft('鍦版矡')"
           >
             鏂板宸ヨ壓
           </div>
@@ -243,29 +255,45 @@
                 size="small"
               />
             </div>
-            <div class="serch_box">
-              <div class="serchb">鍏ㄥ眬鎼滅储</div>
+            <!-- <div class="serch_box">
+              <div class="serchb">
+                <el-select
+                  v-model="queryForm.selectType"
+                  placeholder="璇烽�夋嫨"
+                  size="small"
+                  style="width: 100%; height: 100%; font-size: 0.15rem"
+                >
+                  <el-option
+                    v-for="item in selectoptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </div>
               <input
-                v-model="queryForm.selectName"
+                v-model="queryForm.selectInput"
                 placeholder="璇疯緭鍏ュ叧閿瘝鎼滅储"
                 style="border-left: 0.06rem solid #e2e2e2"
               />
-            </div>
+            </div> -->
             <el-button
               type="primary"
               size="small"
               style="height: 2rem; margin-left: 0.98rem"
-              @click="clicksearch"
+              @click="handleQuery"
               >鏌ヨ</el-button
             >
             <el-button
               size="small"
-              @click="clickreset"
+              @click="resetQuery"
               style="height: 2rem; font-size: 0.88rem"
               >閲嶇疆</el-button
             >
           </div>
-          <el-button style="width: 5rem; height: 2rem; margin-top: 1.13rem"
+          <el-button
+            style="width: 5rem; height: 2rem; margin-top: 1.13rem"
+            @click="printExcel"
             >鎵归噺瀵煎嚭</el-button
           >
         </div>
@@ -290,16 +318,28 @@
             border: '0.01rem solid #eee',
           }"
         >
-          <el-table-column prop="date" label="搴忓彿" min-width="2%" />
-          <el-table-column prop="date" label="宸ヨ壓椤剁偣/姝ラ" min-width="3%" />
-          <el-table-column prop="date" label="宸ヨ壓鍐呭" min-width="5%" />
-          <el-table-column prop="date" label="宸ュ叿" min-width="2%" />
+          <el-table-column prop="setpNum" label="搴忓彿" min-width="2%" />
+          <el-table-column
+            prop="craftsStep"
+            label="宸ヨ壓椤剁偣/姝ラ"
+            min-width="3%"
+          />
+          <el-table-column
+            prop="craftContent"
+            label="宸ヨ壓鍐呭"
+            min-width="5%"
+          />
+          <el-table-column prop="tools" label="宸ュ叿" min-width="2%" />
           <el-table-column prop="date" label="鐗╂枡" min-width="1%" />
-          <el-table-column prop="date" label="鍥剧墖瑙嗛" min-width="2%" />
-          <el-table-column prop="date" label="鏄惁娑夊強" min-width="2%" />
-          <el-table-column prop="date" label="鎺掑簭" min-width="1%" />
-          <el-table-column prop="date" label="鍒涘缓浜�" min-width="1%" />
-          <el-table-column prop="date" label="鍒涘缓鏃ユ湡" min-width="2%" />
+          <!-- <el-table-column prop="date" label="鍥剧墖瑙嗛" min-width="2%" /> -->
+          <el-table-column prop="" label="鏄惁娑夊強" min-width="2%" />
+          <el-table-column prop="nodal" label="鎺掑簭" min-width="1%" />
+          <el-table-column prop="date" label="鍒涘缓浜�" min-width="2%">
+            <template #default="">
+              {{ user }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="鍒涘缓鏃ユ湡" min-width="2%" />
           <el-table-column label="鎿嶄綔" min-width="3%">
             <template #default="scope">
               <el-button
@@ -321,8 +361,8 @@
       v-model="craftdialogVisible"
       title="宸ヨ壓淇℃伅"
       width="50%"
-      :before-close="handleClose"
       :show-close="false"
+      @close="handleClose"
     >
       <template #header="{ titleId, titleClass }">
         <div class="my-craftheader">
@@ -340,10 +380,11 @@
         label-width="auto"
         label-position="top"
         :rules="rules"
+        ref="ruleFormRef"
       >
         <el-row :gutter="10">
           <el-col :span="16"
-            ><el-form-item prop="DeviceName">
+            ><el-form-item prop="craftsStep">
               <template #label>
                 <span style="font-size: 0.88rem; color: black"
                   >宸ヨ壓椤剁偣/姝ラ</span
@@ -351,7 +392,7 @@
               </template>
               <el-input
                 size="small"
-                v-model="form.DeviceName"
+                v-model="form.craftsStep"
                 placeholder="璇疯緭鍏�"
                 style="height: 2rem"
               /> </el-form-item
@@ -362,13 +403,17 @@
                 <span style="font-size: 0.88rem; color: black">鐗╂枡</span>
               </template>
               <el-select
-                v-model="value"
+                v-model="WLvalue"
                 placeholder="璇烽�夋嫨"
+                multiple
+                filterable
+                :remote-method="remoteMethod"
+                :loading="loading"
                 size="small"
                 style="width: 240px"
               >
                 <el-option
-                  v-for="item in options"
+                  v-for="item in WLoptions"
                   :key="item.value"
                   :label="item.label"
                   :value="item.value"
@@ -378,18 +423,18 @@
         </el-row>
         <el-row :gutter="10">
           <el-col :span="8"
-            ><el-form-item prop="Unit">
+            ><el-form-item prop="isinvolved">
               <template #label>
                 <span style="font-size: 0.88rem; color: black">鏄惁娑夊強</span>
               </template>
               <el-select
-                v-model="value"
+                v-model="form.isinvolved"
                 placeholder="璇烽�夋嫨"
                 size="small"
                 style="width: 240px"
               >
                 <el-option
-                  v-for="item in options"
+                  v-for="item in isoptions"
                   :key="item.value"
                   :label="item.label"
                   :value="item.value"
@@ -397,35 +442,39 @@
               </el-select> </el-form-item
           ></el-col>
           <el-col :span="8"
-            ><el-form-item prop="Description">
+            ><el-form-item prop="sort">
               <template #label>
                 <span style="font-size: 0.88rem; color: black">鎺掑簭</span>
               </template>
-              <el-select
-                v-model="value"
-                placeholder="璇烽�夋嫨"
+              <el-input
                 size="small"
-                style="width: 240px"
-              >
-                <el-option
-                  v-for="item in options"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select> </el-form-item
+                v-model="form.setpNum"
+                placeholder="璇疯緭鍏�"
+                style="height: 2rem"
+              /> </el-form-item
           ></el-col>
           <el-col :span="8"
-            ><el-form-item prop="Description">
+            ><el-form-item prop="tools">
               <template #label>
                 <span style="font-size: 0.88rem; color: black">宸ュ叿</span>
               </template>
-              <el-cascader
+              <el-select
+                v-model="form.tools"
+                placeholder="璇烽�夋嫨"
+                multiple
+                filterable
+                :remote-method="GJremoteMethod"
+                :loading="GJloading"
                 size="small"
                 style="width: 240px"
-                :options="options"
-                :props="props"
-                clearable /></el-form-item
+                value-key="id"
+              >
+                <el-option
+                  v-for="item in GJoptions"
+                  :key="item.id"
+                  :label="item.toolName"
+                  :value="item"
+                /> </el-select></el-form-item
           ></el-col>
         </el-row>
         <!-- <el-row>
@@ -490,18 +539,18 @@
         </el-row>
         <el-row>
           <el-col>
-            <el-form-item prop="Unit">
+            <el-form-item prop="craftContent">
               <template #label>
                 <span style="font-size: 0.88rem; color: black">鍐呭鎻忚堪</span>
               </template>
-              <el-input v-model="input" placeholder="璇疯緭鍏�" />
+              <el-input v-model="form.craftContent" placeholder="璇疯緭鍏�" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-form-item prop="Unit">
             <template #label>
-              <span style="font-size: 0.88rem; color: black">鍐呭鎻忚堪</span>
+              <span style="font-size: 0.88rem; color: black">閫夋嫨濂楃瓛</span>
             </template>
             <div
               style="
@@ -527,7 +576,7 @@
                   >
                     <span
                       style="color: rgba(28, 31, 35, 0.8); font-size: 0.75rem"
-                      >鍏�0椤�</span
+                      >鍏眥{ checkList.length }}椤�</span
                     ><span
                       style="
                         color: rgba(28, 31, 35, 0.8);
@@ -539,9 +588,17 @@
                   </div>
                 </div>
                 <el-scrollbar height="20rem" style="padding-left: 0.88rem">
-                  <p v-for="item in 0" :key="item" class="scrollbar-demo-item">
-                    {{ item }}
-                  </p>
+                  <el-checkbox-group
+                    v-model="checkList"
+                    style="display: flex; flex-direction: column"
+                  >
+                    <el-checkbox
+                      v-for="item in sleeveData"
+                      :key="item.id"
+                      :label="item.articleName"
+                      :value="item"
+                    />
+                  </el-checkbox-group>
                 </el-scrollbar>
               </div>
               <div style="width: 50%; height: 100%">
@@ -549,7 +606,7 @@
                   style="padding: 0.88rem 0 0 0.88rem; box-sizing: border-box"
                 >
                   <span style="color: rgb(167, 171, 176); font-size: 0.88rem"
-                    >宸查��0椤�</span
+                    >宸查�墈{ checkList.length }}椤�</span
                   >
                   <span
                     style="
@@ -564,8 +621,29 @@
                   height="calc(25rem - 44.15px)"
                   style="padding-left: 0.88rem"
                 >
-                  <p v-for="item in 0" :key="item" class="scrollbar-demo-item">
-                    {{ item }}
+                  <p
+                    style="
+                      display: flex;
+                      justify-content: space-between;
+                      margin: 0.5rem 0;
+                    "
+                    v-for="(item, index) in checkList"
+                    :key="item"
+                    class="scrollbar-demo-item"
+                  >
+                    <span>
+                      {{ item.articleName }}
+                    </span>
+                    <span>
+                      <el-input-number
+                        size="small"
+                        style="width: 7rem"
+                        v-model="item.num"
+                        :min="1"
+                        :max="100"
+                        @change="handleChange"
+                      />
+                    </span>
                   </p>
                 </el-scrollbar>
               </div>
@@ -580,7 +658,7 @@
           >
           <el-button
             type="primary"
-            @click="craftdialogVisible = false"
+            @click="addprocess(ruleFormRef)"
             style="height: 2rem"
           >
             淇濆瓨
@@ -592,75 +670,314 @@
 </template>
 <script setup>
 import { ref, reactive, onMounted } from "vue";
-import { GetSleeveandStep } from "@/api/newapi/Process";
+import { formatTime } from "@/utils/index.js";
+import {
+  GetSleeveandStep,
+  GetProcess,
+  AddProcess,
+  GetPageData,
+  ArticleInfom,
+  GetTool,
+  ExportApi,
+} from "@/api/newapi/Process";
+import { ElMessage } from "element-plus";
+import { exportExcel } from "@/utils/index.js";
 //宸ヨ壓鏄庣粏寮瑰嚭妗�
 const detailsDialogVisible = ref(false);
-//
+//宸ヨ壓鏄庣粏鏁版嵁
 const gridData = ref([]);
 //鐢垫皵鏁伴噺
-const electric = ref({});
+const electric = ref(null);
+//鏈烘鏁伴噺
+const mechanical = ref(null);
+//鍦版矡
+const trench = ref(null);
 //鎼滅储
 const queryForm = reactive({
   selectName: "",
   selectTime: [], // 鏃堕棿鑼冨洿
+  selectType: "",
+  selectInput: "",
 });
+const selectoptions = ref([
+  {
+    value: "setpNum",
+    label: "搴忓彿",
+  },
+  {
+    value: "tools",
+    label: "宸ュ叿",
+  },
+]);
+//閫夋嫨鐨勫绛掓暟鎹�
+const checkList = ref([]);
+//鑾峰彇鏁版嵁
 const title = ref("鐢垫皵");
 const showdetails = (val) => {
   detailsDialogVisible.value = true;
   title.value = val;
+  initData(title.value);
+  // GetProcess(val).then((res) => {
+  //   gridData.value = res.data;
+  // });
 };
 //鏂板宸ヨ壓/缂栬緫宸ヨ壓
 const craftdialogVisible = ref(false);
 const type = ref("鏂板");
-const form = reactive({
-  DeviceName: "",
-  DeviceCode: "",
-  Spec: "",
-  Unit: "",
-  Description: "",
+const form = ref({
+  craftType: "", //宸ヨ壓绫诲瀷锛堢粍锛�
+  nodal: "", //鑺傜偣
+  craftsStep: "", //宸ヨ壓姝ラ
+  craftContent: "", //宸ヨ壓鍐呭
+  sleeveNum: "", //濂楃瓛鏁伴噺
+  tools: "", //宸ュ叿
+  isinvolved: "", //鏄惁娑夊強
+  sort: "", //鎺掑簭
+  craftID: 1,
+  setpNum: "",
+  torqueOne: null,
+  torqueOneQuantity: 0,
+  torqueSum: 0,
+  torqueTwo: null,
+  torqueTwoQuantity: 0,
+  articleOne: "",
+  articleTwo: "",
 });
 const props = { multiple: true };
+//濂楃瓛鏁版嵁
+const sleeveData = ref([]);
 
 //鏂板宸ヨ壓
 const addcraft = (row) => {
   type.value = "鏂板";
+  title.value = row;
   craftdialogVisible.value = true;
-  console.log(row, type);
+  ArticleInfom({
+    page: 1,
+    rows: 100,
+    total: 0,
+    tableName: "",
+    sort: "",
+    order: "",
+    wheres: "",
+    export: true,
+    value: "",
+    filter: [
+      {
+        name: "",
+        value: "",
+        displayType: "",
+      },
+    ],
+  }).then((res) => {
+    sleeveData.value = res.rows;
+  });
+  GetTool({
+    page: 1,
+    rows: 100,
+    total: 0,
+    tableName: "",
+    sort: "",
+    order: "",
+    wheres: "",
+    export: true,
+    value: "",
+    filter: [
+      {
+        name: "",
+        value: "",
+        displayType: "",
+      },
+    ],
+  }).then((res) => {
+    GJoptions.value = res.rows;
+  });
 };
 //缂栬緫宸ヨ壓
 const Editcraft = (row) => {
   type.value = "缂栬緫";
   detailsDialogVisible.value = false;
   craftdialogVisible.value = true;
-  console.log(row, type);
+  form.value = row;
+  console.log(row, form);
 };
-//鍥剧墖涓婁紶
-const dialogImageUrl = ref("");
-const dialogVisible = ref(false);
-const disabled = ref(false);
+//瑙勫垯
+const ruleFormRef = ref();
+const rules = reactive({
+  craftType: [{ required: true, message: "璇烽�夋嫨宸ヨ壓绫诲瀷", trigger: "change" }],
+  nodal: [{ required: true, message: "璇烽�夋嫨鑺傜偣", trigger: "change" }],
+  craftsStep: [{ required: true, message: "璇疯緭鍏ュ伐鑹烘楠�", trigger: "blur" }],
+  craftContent: [
+    { required: true, message: "璇疯緭鍏ュ伐鑹哄唴瀹�", trigger: "blur" },
+  ],
+  sleeveNum: [{ required: true, message: "璇疯緭鍏ュ绛掓暟閲�", trigger: "blur" }],
+});
 
-const handleRemove = (file) => {
-  console.log(file);
+//淇濆瓨
+const addprocess = async (formEl) => {
+  let string = "";
+  form.value.tools.forEach((item) => {
+    string += item.toolName + ",";
+  });
+
+  form.value.articleOne = checkList.value[0].num;
+  form.value.articleTwo = checkList.value[1].num;
+  form.value.tools = string;
+  form.value.craftType = title.value;
+  console.log(form.value);
+
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      AddProcess(form.value).then((res) => {
+        ElMessage({
+          message: res.message,
+          type: "success",
+        });
+        craftdialogVisible.value = false;
+      });
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+//鐗╂枡妯$硦鏌ヨ
+const WLvalue = ref(null);
+const loading = ref(false);
+const WLoptions = ref([]);
+const remoteMethod = (query) => {
+  if (query) {
+    loading.value = true;
+    setTimeout(() => {
+      loading.value = false;
+      WLoptions.value = list.value.filter((item) => {
+        return item.label.toLowerCase().includes(query.toLowerCase());
+      });
+    }, 200);
+  } else {
+    WLoptions.value = [];
+  }
+};
+//宸ュ叿妯$硦鏌ヨ
+const GJvalue = ref(null);
+const GJloading = ref(false);
+const GJoptions = ref([]);
+const GJremoteMethod = (query) => {
+  if (query) {
+    GJloading.value = true;
+    setTimeout(() => {
+      GJloading.value = false;
+      GJoptions.value = list.value.filter((item) => {
+        return item.label.toLowerCase().includes(query.toLowerCase());
+      });
+    }, 200);
+  } else {
+    GJoptions.value = [];
+  }
+};
+//鏄惁娑夊強
+const isoptions = reactive([
+  { label: "鏄�", value: "鏄�" },
+  { label: "鍚�", value: "鍚�" },
+]);
+const user = ref(null);
+//鍒嗛〉璇锋眰鍙傛暟
+const pageQuery = ref({
+  page: 1, //褰撳墠椤甸潰
+  rows: 10, //姣忛〉鏄剧ず鏉℃暟
+  order: "desc", //鎺掑簭鏂瑰紡
+  sort: "craftID", //鎺掑簭瀛楁
+  wheres: "", //鏉′欢鏌ヨ
+});
+
+const initData = (val) => {
+  // 鏌ヨ鏉′欢
+  const startTime = formatTime(queryForm.selectTime[0]);
+  const endTime = formatTime(queryForm.selectTime[1]);
+  const filter = [
+    {
+      name: "gruop",
+      value: val,
+      displayType: "Contains",
+    },
+    {
+      name: queryForm.selectType,
+      value: queryForm.selectInput,
+      displayType: "Equal",
+    },
+    {
+      name: "pustatus",
+      value: queryForm.selectName,
+      displayType: "Contains",
+    },
+    { name: "createTime", value: startTime, displayType: "ThanOrEqual" },
+    { name: "createTime", value: endTime, displayType: "LessOrEqual" },
+  ];
+  GetPageData({
+    ...pageQuery.value,
+    filter,
+  }).then((res) => {
+    gridData.value = res.rows;
+  });
+};
+const printExcel = () => {
+  // 鏌ヨ鏉′欢
+  const startTime = formatTime(queryForm.selectTime[0]);
+  const endTime = formatTime(queryForm.selectTime[1]);
+  const filter = [
+    {
+      name: "gruop",
+      value: title.value,
+      displayType: "String",
+    },
+    {
+      name: queryForm.selectType,
+      value: queryForm.selectInput,
+      displayType: "String",
+    },
+    {
+      name: "pustatus",
+      value: queryForm.selectName,
+      displayType: "String",
+    },
+    { name: "createTime", value: startTime, displayType: "ThanOrEqual" },
+    { name: "createTime", value: endTime, displayType: "LessOrEqual" },
+  ];
+  ExportApi({
+    ...pageQuery.value,
+    filter,
+  });
 };
 
-const handlePictureCardPreview = (file) => {
-  dialogImageUrl.value = file.url;
-  dialogVisible.value = true;
+//鏁版嵁妫�绱簨浠�
+const handleQuery = () => {
+  pageQuery.value.page = 1;
+  initData(title.value);
+};
+const resetQuery = () => {
+  queryForm.value = { selectTime: [] };
+  pageQuery.value.page = 1;
+  initData(title.value);
 };
 
-const handleDownload = (file) => {
-  console.log(file);
+// const handleChange = () => {
+//   console.log(checkList.value);
+// };
+const handleClose = () => {
+  console.log(checkList.value);
 };
+
 onMounted(() => {
   GetSleeveandStep("鐢垫皵").then((res) => {
-    console.log("123", res);
+    electric.value = res.data[0];
   });
   GetSleeveandStep("鏈烘").then((res) => {
-    console.log("123", res);
+    mechanical.value = res.data[0];
   });
   GetSleeveandStep("鍦版矡").then((res) => {
-    console.log("123", res);
+    trench.value = res.data[0];
   });
+  user.value = JSON.parse(localStorage.getItem("user")).userName;
 });
 </script>
 <style lang="scss" scoped>
@@ -741,8 +1058,7 @@
         width: 6.88rem;
         height: 2rem;
         text-align: center;
-        border: 0.06rem solid rgba(222, 222, 222, 1);
-        border-radius: 0.25rem 0 0 0.25rem;
+
         font-size: 0.75rem;
         display: flex;
         align-items: center;

--
Gitblit v1.9.3