From 1187936c713bae2ad43063900c7bee80502e091d Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 19 十一月 2025 17:06:42 +0800
Subject: [PATCH] fix: 重构拉丝报工
---
src/pages/production/wire/report/wire.vue | 627 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 480 insertions(+), 147 deletions(-)
diff --git a/src/pages/production/wire/report/wire.vue b/src/pages/production/wire/report/wire.vue
index da32716..e391316 100644
--- a/src/pages/production/wire/report/wire.vue
+++ b/src/pages/production/wire/report/wire.vue
@@ -1,41 +1,181 @@
<template>
<view class="list">
- <z-paging ref="pagingRef" v-model="wireReportList" :fixed="false" @query="getWireReportList">
- <template #top>
- <CardTitle title="鎶ュ伐淇℃伅" :hideAction="true" :full="false" @action="addReport" />
+ <CardTitle title="鎶ュ伐淇℃伅" :hideAction="false" :full="false">
+ <template #action>
+ <wd-button
+ icon="file-add"
+ :round="false"
+ size="small"
+ custom-class="add_btn"
+ @click="handleAddParent"
+ >
+ 鏂板鏉嗗寘
+ </wd-button>
</template>
- <wd-card
- v-for="(item, index) in wireReportList"
- :key="index"
- type="rectangle"
- custom-class="round"
- >
+ </CardTitle>
+
+ <!-- 鐖剁骇鍒楄〃锛堟潌鍖咃級 -->
+ <view class="parent-list">
+ <wd-card v-for="(item, index) in parentDataList" :key="item.id || index" class="card_bg">
<template #title>
- <view class="flex justify-between">
- <view>
- <wd-icon name="user" color="#0D867F"></wd-icon>
- <text class="text-[#0D867F] ml-2 font-medium">鐢熶骇浜�</text>
- <text class="text-[#333333] ml-2">{{ item.productUser }}</text>
+ <view class="flex justify-between w-full">
+ <view class="flex items-center">
+ <text class="font-medium text-[#252525]">鏉嗗寘淇℃伅</text>
+ <view v-if="item.isAutoAdd == 1" class="text-xs text-blue-500 ml-2">鑷姩娣诲姞</view>
</view>
- <!-- <view class="text-[#A8A8A8]" @click="toEdit">缂栬緫</view> -->
+ <wd-button plain type="error" size="small" @click="handleDeleteRodBag(item)">
+ 鍒犻櫎
+ </wd-button>
</view>
</template>
- <ProductionCard :data="cardAttr" :value="item" />
+
+ <view>
+ <wd-row class="my-2" v-if="item.poleNumber">
+ <wd-col :span="24">
+ <view class="flex">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">
+ 棰嗙敤鏉嗗彿:
+ <text class="text-[#252525]">{{ item.poleNumber }}</text>
+ </text>
+ </view>
+ </wd-col>
+ </wd-row>
+ <wd-row class="my-2" v-if="item.poleModel">
+ <wd-col :span="12">
+ <view class="flex">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">
+ 鏉嗗瀷鍙�:
+ <text class="text-[#252525]">{{ item.poleModel }}</text>
+ </text>
+ </view>
+ </wd-col>
+ <wd-col :span="12">
+ <view class="flex">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">
+ 鏉嗗寘鍙�:
+ <text class="text-[#252525]">{{ item.polePackageNumber }}</text>
+ </text>
+ </view>
+ </wd-col>
+ </wd-row>
+ <wd-row class="my-2">
+ <wd-col :span="24" v-if="item.poleWeight">
+ <view class="flex">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">
+ 鏉嗛噸(kg):
+ <text class="text-[#252525]">{{ item.poleWeight }}</text>
+ </text>
+ </view>
+ </wd-col>
+ </wd-row>
+ <wd-row class="my-2">
+ <wd-col :span="24" v-if="item.supplier">
+ <view class="flex">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">
+ 渚涘簲鍟�:
+ <text class="text-[#252525]">{{ item.supplier }}</text>
+ </text>
+ </view>
+ </wd-col>
+ </wd-row>
+ <wd-row class="my-2" v-if="item.isConsumed !== undefined">
+ <wd-col :span="24">
+ <view class="flex items-center">
+ <view class="icon_box">
+ <wd-icon name="folder" color="#0D867F"></wd-icon>
+ </view>
+ <text class="text-[#646874] mx-2">娑堣�楁儏鍐�:</text>
+ <wd-switch
+ v-model="item.isConsumed"
+ :disabled="false"
+ active-text="宸茶�楀畬"
+ inactive-text="杩樺墿浣�"
+ :active-value="1"
+ :inactive-value="0"
+ size="20"
+ @change="handleConsumedChange(item, $event)"
+ />
+ </view>
+ </wd-col>
+ </wd-row>
+ </view>
+
<template #footer>
- <wd-button size="small" plain style="margin-right: 10px" @click="toAttachment(item)">
- 闄勪欢
- </wd-button>
- <wd-button size="small" plain @click="toCheck(item.id)">鑷</wd-button>
+ <view class="flex justify-start">
+ <wd-button plain size="small" type="primary" @click="openChildDialog(item)">
+ 鎶ュ伐绠$悊
+ </wd-button>
+ </view>
</template>
</wd-card>
- </z-paging>
- <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup">
- <view class="action px-3">
- <wd-button type="text" @click="cancel">鍙栨秷</wd-button>
- <wd-button type="text" @click="submit">纭畾</wd-button>
+ </view>
+
+ <!-- 鏂板鏉嗗寘寮规 -->
+ <wd-popup v-model="parentDialogVisible" position="bottom" custom-class="yl-popup">
+ <view class="parent-dialog">
+ <view class="dialog-header">
+ <text class="dialog-title">鏂板鏉嗗寘</text>
+ <wd-icon name="close" class="close-icon" @click="closeParentDialog"></wd-icon>
+ </view>
+ <view class="dialog-content">
+ <wd-cell-group>
+ <wd-input
+ v-model="newParentData.poleNumber"
+ label="棰嗙敤鏉嗗彿"
+ label-width="100px"
+ placeholder="璇疯緭鍏ラ鐢ㄦ潌鍙�"
+ />
+ <wd-input
+ v-model="newParentData.poleModel"
+ label="鏉嗗瀷鍙�"
+ label-width="100px"
+ placeholder="璇疯緭鍏ユ潌鍨嬪彿"
+ />
+ <wd-input
+ v-model="newParentData.polePackageNumber"
+ label="鏉嗗寘鍙�"
+ label-width="100px"
+ placeholder="璇疯緭鍏ユ潌鍖呭彿"
+ />
+ <wd-input
+ v-model="newParentData.poleWeight"
+ label="鏉嗛噸(kg)"
+ label-width="100px"
+ type="number"
+ placeholder="璇疯緭鍏ユ潌閲�"
+ />
+ <wd-picker
+ v-model="newParentData.supplier"
+ label="渚涘簲鍟�"
+ label-width="100px"
+ :columns="supplierOptions"
+ placeholder="璇烽�夋嫨渚涘簲鍟�"
+ />
+ </wd-cell-group>
+ </view>
+ <view class="dialog-footer">
+ <wd-button plain @click="closeParentDialog">鍙栨秷</wd-button>
+ <wd-button type="primary" class="ml-2" @click="handleSaveNewParent">淇濆瓨</wd-button>
+ </view>
</view>
- <WireForm ref="wireFormRef" />
</wd-popup>
+
+ <!-- Draw缁勪欢锛堥鐢ㄨ嚜妫�锛� -->
<wd-popup v-model="drawFormRef.visible" position="bottom" custom-class="yl-popup">
<Draw
:wire-id="drawData.wireId"
@@ -43,172 +183,324 @@
@close="handleDrawClose"
/>
</wd-popup>
+
<wd-toast />
</view>
</template>
+
<script setup lang="ts">
import CardTitle from "@/components/card-title/index.vue";
-import WireForm from "./wireForm.vue";
-import { useToast } from "wot-design-uni";
-import ProductionCard from "../../components/ProductionCard.vue";
-import zPaging from "@/components/z-paging/z-paging.vue";
+import { useToast, dayjs } from "wot-design-uni";
import { onLoad } from "@dcloudio/uni-app";
+import { onMounted, nextTick } from "vue";
+import WireApi from "@/api/product/wire";
import ManageApi from "@/api/product/manage";
import Draw from "./rawMaterial.vue";
+import { getTeamId } from "@/utils/cache";
+import { useUserStore } from "@/store/modules/user";
+import WireDetailApi from "@/api/product/wire";
-const pagingRef = ref();
-const wireFormRef = ref();
-const paramsId = ref();
const toast = useToast();
-const dialog = reactive({
- visible: false,
+const userStore = useUserStore();
+const paramsId = ref();
+const model = ref();
+const oneLength = ref();
+
+// 鐖剁骇鏁版嵁鍒楄〃
+const parentDataList = ref<any[]>([]);
+// 瀛愮骇鏁版嵁鍒楄〃锛堟墍鏈夊瓙绾ф暟鎹殑鎵佸钩鍖栧垪琛級
+const childDataList = ref<any[]>([]);
+
+// 渚涘簲鍟嗛�夐」
+const supplierOptions = ref<any[]>([]);
+
+// 鐖剁骇寮规鐩稿叧
+const parentDialogVisible = ref(false);
+const newParentData = ref({
+ poleNumber: "",
+ poleModel: "",
+ polePackageNumber: "",
+ poleWeight: undefined as number | undefined,
+ supplier: "",
+ isConsumed: 1,
});
+// Draw缁勪欢鐩稿叧
const drawFormRef = reactive({
visible: false,
});
-// 澶勭悊draw缁勪欢鍏抽棴浜嬩欢
-const handleDrawClose = () => {
- // 纭繚寮圭獥琚纭叧闂�
- drawFormRef.visible = false;
-};
const drawData = ref({
wireId: "",
poleNumber: "",
});
-const showDrawPopup = async () => {
- console.log("杩涘叆璇ユ柟娉曪紒");
+// 鑾峰彇璇︽儏鏁版嵁
+const getDetailData = async (id: string) => {
try {
- const { data } = await ManageApi.queryWireRawMaterialInspect({
- wireId: paramsId.value,
- poleNumber: drawData.value.poleNumber,
- });
- console.log("data", data);
- // 閫傞厤涓嶅悓鐨勬暟鎹粨鏋勮繑鍥炴牸寮�
- if (data == null) {
- drawData.value = {
- wireId: paramsId.value,
- poleNumber: drawData.value.poleNumber,
- };
- // 鏄剧ずDraw寮圭獥
- drawFormRef.visible = true;
- toast.success("璇峰~鍐欓鐢ㄤ俊鎭�!");
- } else {
- // toast.error("宸插瓨鍦ㄩ鐢ㄤ俊鎭�,鏃犻渶濉姤!");
+ const { data } = await WireDetailApi.getWireDetailById({ id });
+ model.value = data.model;
+ oneLength.value = data.oneLength;
+ } catch (error) {
+ console.error("鑾峰彇璇︽儏澶辫触:", error);
+ }
+};
+
+// 鍔犺浇渚涘簲鍟嗗瓧鍏�
+const loadSupplierDict = async () => {
+ try {
+ const res = await ManageApi.dictAPI("al_supplier");
+ if (res.data && Array.isArray(res.data)) {
+ supplierOptions.value = res.data.map((item: any) => ({
+ label: item.dictLabel || "",
+ value: item.dictValue || item.value || "",
+ }));
}
} catch (error) {
- console.error("鑾峰彇棰嗙敤淇℃伅澶辫触:", error);
- toast.error("鑾峰彇淇℃伅澶辫触锛岃閲嶈瘯");
+ console.error("鍔犺浇渚涘簲鍟嗗瓧鍏稿け璐�:", error);
}
};
-const cardAttr = ref<any[]>([
- {
- label: "棰嗙敤鏉嗗彿",
- prop: "poleNumber",
- span: 24,
- },
- {
- label: "鍗曚笣鐩樺彿",
- prop: "monofilamentNumber",
- span: 24,
- },
- {
- label: "鏉嗗瀷鍙�",
- prop: "poleModel",
- },
- {
- label: "鏉嗗寘鍙�",
- prop: "polePackageNumber",
- },
- {
- label: "鏉嗛噸(kg)",
- prop: "poleWeight",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鐩樺瀷鍙�",
- prop: "dishModel",
- },
- {
- label: "鐩橀暱(m)",
- prop: "oneLength",
- },
- {
- label: "瀹為檯闀垮害",
- prop: "actuallyLength",
- },
- {
- label: "瀹為檯閲嶉噺(kg)",
- prop: "actuallyWeight",
- },
-]);
+// 鍒濆鍖栨暟鎹�
+const getData = async () => {
+ try {
+ const { code, data } = await WireApi.getWireOutputTree({
+ wireId: paramsId.value,
+ });
-const wireReportList = ref<any[]>([]);
+ if (code == 200) {
+ parentDataList.value = [];
+ childDataList.value = [];
-// const toEdit = () => {
-// uni.navigateTo({
-// url: "/pages/production/wire/report/wireEdit",
-// });
-// };
+ const parentMap = new Map();
-const addReport = () => {
- dialog.visible = true;
-};
+ data.forEach((item: any) => {
+ const parentKey = `${item.poleNumber}-${item.poleModel}-${item.polePackageNumber}`;
-const submit = async () => {
- const result = await wireFormRef.value.submit();
- dialog.visible = !result.success;
- // 璁剧疆poleNumber鍒癲rawData涓�
- if (result.success) {
- drawData.value.poleNumber = result.poleNumber;
- showDrawPopup();
+ if (!parentMap.has(parentKey)) {
+ const parentData = {
+ id: parentKey,
+ poleNumber: item.poleNumber,
+ poleModel: item.poleModel,
+ polePackageNumber: item.polePackageNumber,
+ dishModel: item.dishModel,
+ poleWeight: item.poleWeight,
+ supplier: item.supplier,
+ isConsumed: item.isConsumed === true || item.isConsumed === 1 ? 1 : 0,
+ treeId: item.id,
+ isAutoAdd: item.isAutoAdd,
+ };
+ parentMap.set(parentKey, parentData);
+ parentDataList.value.push(parentData);
+ }
+
+ if (item.node && Array.isArray(item.node)) {
+ item.node.forEach((child: any) => {
+ const childData = {
+ ...child,
+ parentKey: parentKey,
+ poleNumber: item.poleNumber,
+ poleModel: item.poleModel,
+ polePackageNumber: item.polePackageNumber,
+ supplier: item.supplier,
+ selected: false,
+ };
+ childDataList.value.push(childData);
+ });
+ }
+ });
+ }
+ } catch (error) {
+ console.error("鑾峰彇鏁版嵁澶辫触:", error);
+ toast.error("鑾峰彇鏁版嵁澶辫触");
}
- pagingRef.value.reload();
};
-const cancel = () => {
- toast.show("鍙栨秷");
- dialog.visible = false;
+// 鏂板鐖剁骇鏁版嵁 - 鎵撳紑寮规
+const handleAddParent = () => {
+ const lastParent = parentDataList.value[0];
+
+ // 鍒濆鍖栨柊鏁版嵁锛屽鏋滄湁鏈�鍚庝竴鏉℃暟鎹紝浣跨敤鍏跺�间綔涓洪粯璁ゅ��
+ newParentData.value = {
+ poleNumber: lastParent?.poleNumber || "",
+ poleModel: lastParent?.poleModel || "",
+ polePackageNumber: lastParent?.polePackageNumber || "",
+ poleWeight: lastParent?.poleWeight || null,
+ supplier: lastParent?.supplier || "",
+ isConsumed: 1,
+ };
+
+ parentDialogVisible.value = true;
};
-const toAttachment = (item: any) => {
+// 淇濆瓨鏂扮埗绾ф暟鎹�
+const handleSaveNewParent = async () => {
+ if (
+ !newParentData.value.poleNumber ||
+ !newParentData.value.poleModel ||
+ !newParentData.value.polePackageNumber ||
+ !newParentData.value.poleWeight
+ ) {
+ toast.error("璇峰~鍐欏畬鏁寸殑鐖剁骇淇℃伅锛堥鐢ㄦ潌鍙枫�佹潌鍨嬪彿銆佹潌鍖呭彿銆佹潌閲嶄负蹇呭~椤癸級");
+ return;
+ }
+
+ try {
+ const { code } = await WireApi.addRodBagTree({
+ wireId: paramsId.value,
+ poleNumber: newParentData.value.poleNumber,
+ poleModel: newParentData.value.poleModel,
+ polePackageNumber: newParentData.value.polePackageNumber,
+ supplier: newParentData.value.supplier,
+ poleWeight: newParentData.value.poleWeight,
+ isConsumed: newParentData.value.isConsumed,
+ });
+
+ if (code == 200) {
+ toast.success("淇濆瓨鎴愬姛");
+ closeParentDialog();
+ await getData();
+ }
+ } catch (error) {
+ console.error("淇濆瓨澶辫触:", error);
+ toast.error("淇濆瓨澶辫触");
+ }
+};
+
+// 鍏抽棴鐖剁骇寮规
+const closeParentDialog = () => {
+ parentDialogVisible.value = false;
+ // 閲嶇疆琛ㄥ崟鏁版嵁
+ newParentData.value = {
+ poleNumber: "",
+ poleModel: "",
+ polePackageNumber: "",
+ poleWeight: undefined,
+ supplier: "",
+ isConsumed: 1,
+ };
+};
+
+// 鍒犻櫎鏉嗗寘
+const handleDeleteRodBag = async (row: any) => {
+ try {
+ const res = await uni.showModal({
+ title: "鎻愮ず",
+ content: `纭畾鍒犻櫎鏉嗗寘锛�${row.poleNumber} - ${row.poleModel} - ${row.polePackageNumber} 鍚楋紵`,
+ });
+
+ if (res.confirm) {
+ const { code } = await WireApi.deleteRodBagTree({
+ wireId: paramsId.value,
+ poleModel: row.poleModel,
+ poleNumber: row.poleNumber,
+ polePackageNumber: row.polePackageNumber,
+ });
+
+ if (code === 200) {
+ toast.success("鍒犻櫎鎴愬姛");
+ await getData();
+ } else {
+ toast.error("鍒犻櫎澶辫触");
+ }
+ }
+ } catch (error) {
+ console.error("鍒犻櫎鏉嗗寘澶辫触:", error);
+ toast.error("鍒犻櫎澶辫触");
+ }
+};
+
+// 娑堣�楁儏鍐靛彉鍖�
+const handleConsumedChange = async (row: any, value: any) => {
+ if (row.treeId) {
+ // 淇濆瓨鏃у�硷紝鐢ㄤ簬澶辫触鏃舵仮澶�
+ const oldValue = row.isConsumed;
+
+ // 澶勭悊 value锛屽彲鑳芥槸鏁板瓧銆佸璞℃垨鍏朵粬鏍煎紡
+ let isConsumedValue: number;
+ if (typeof value === "object" && value !== null && "value" in value) {
+ // 濡傛灉鏄璞℃牸寮� {value: 1}
+ isConsumedValue = value.value;
+ } else if (typeof value === "number") {
+ // 濡傛灉鏄暟瀛�
+ isConsumedValue = value;
+ } else if (typeof value === "boolean") {
+ // 濡傛灉鏄竷灏斿��
+ isConsumedValue = value ? 1 : 0;
+ } else {
+ // 鍏朵粬鎯呭喌锛屽皾璇曡浆鎹�
+ isConsumedValue = value === 1 || value === "1" || value === true ? 1 : 0;
+ }
+
+ // 鍏堟洿鏂� UI
+ row.isConsumed = isConsumedValue;
+
+ try {
+ const { code } = await WireApi.updateRodBagTree({
+ treeId: row.treeId,
+ isConsumed: isConsumedValue,
+ });
+
+ if (code != 200) {
+ toast.error("鏇存柊澶辫触");
+ // 鏇存柊澶辫触鏃舵仮澶嶅師鍊�
+ row.isConsumed = oldValue;
+ }
+ } catch (error) {
+ console.error("鏇存柊娑堣�楁儏鍐靛け璐�:", error);
+ toast.error("鏇存柊澶辫触");
+ // 鏇存柊澶辫触鏃舵仮澶嶅師鍊�
+ row.isConsumed = oldValue;
+ }
+ }
+};
+
+// 鎵撳紑瀛愮骇椤甸潰
+const openChildDialog = async (parentRow: any) => {
+ // 妫�鏌ユ槸鍚︽湁棰嗙敤淇℃伅
+ try {
+ const { code, data } = await ManageApi.queryWireRawMaterialInspect({
+ wireId: paramsId.value,
+ poleNumber: parentRow.poleNumber,
+ });
+
+ if (code == 200) {
+ if (data == null) {
+ // 鏄剧ずDraw缁勪欢
+ drawData.value = {
+ wireId: paramsId.value,
+ poleNumber: parentRow.poleNumber,
+ };
+ drawFormRef.visible = true;
+ toast.warning("璇峰厛濉啓棰嗙敤淇℃伅");
+ return;
+ }
+ }
+ } catch (error) {
+ console.error("妫�鏌ラ鐢ㄤ俊鎭け璐�:", error);
+ }
+
+ // 璺宠浆鍒版姤宸ョ鐞嗛〉闈�
uni.navigateTo({
- url: "/pages/production/wire/attachment/index",
- success: () => {
- // 椤甸潰璺宠浆鎴愬姛鍚庡彂閫佷簨浠朵紶閫掓暟鎹�
- uni.$emit("detailData", item);
- },
+ url: `/pages/production/wire/report/reportManage?wireId=${paramsId.value}&parentId=${parentRow.id}&poleNumber=${parentRow.poleNumber}&poleModel=${parentRow.poleModel}&polePackageNumber=${parentRow.polePackageNumber}&poleWeight=${parentRow.poleWeight}&supplier=${parentRow.supplier || ""}`,
});
};
-const toCheck = (id: number) => {
- uni.navigateTo({
- url: `/pages/production/wire/selfInspect/index?id=${id}`,
- });
+// 澶勭悊draw缁勪欢鍏抽棴浜嬩欢
+const handleDrawClose = () => {
+ drawFormRef.visible = false;
};
-// 鑾峰彇鎷変笣鎶ュ伐鍒楄〃
-const getWireReportList = async () => {
- const { data } = await ManageApi.getReportList({
- wireId: paramsId.value,
- type: "鎷変笣",
- });
- pagingRef.value.complete(data);
-};
-
-onLoad((options: any) => {
+onLoad(async (options: any) => {
paramsId.value = options.id;
+ await getDetailData(options.id);
+ await loadSupplierDict();
+ await getData();
});
</script>
<style lang="scss" scoped>
.list {
- height: calc(100vh - 30px);
+ min-height: calc(100vh - 30px);
padding: 12px;
background: #f3f9f8;
@@ -219,8 +511,49 @@
}
}
-.action {
+.parent-list {
+ margin-top: 12px;
+}
+
+.card_bg {
+ box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.05);
+ padding-bottom: 10px;
+ margin-bottom: 12px;
+}
+
+.icon_box {
display: flex;
- justify-content: space-between;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+ background: #e7f4ec99;
+ border-radius: 50%;
+}
+
+.edit-form {
+ padding: 12px 0;
+}
+
+.parent-dialog {
+ max-height: 80vh;
+ display: flex;
+ flex-direction: column;
+ background: #fff;
+ border-radius: 12px 12px 0 0;
+}
+
+.dialog-content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 16px;
+}
+
+.dialog-footer {
+ display: flex;
+ justify-content: flex-end;
+ padding: 16px;
+ border-top: 1px solid #e6e6e6;
+ gap: 8px;
}
</style>
--
Gitblit v1.9.3