From 38e3bb79544ed4a18fb61b892d4832cafc83c211 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 26 Jan 2026 10:00:20 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web

---
 applications/task-work-order/src/views/orderView/flyingHand/index.vue                          |    7 +
 applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue     |   67 +++++++-----
 applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue             |    2 
 applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue |    4 
 applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue        |   22 +++-
 applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue  |    9 -
 applications/task-work-order/env/.env                                                          |    3 
 applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue                    |   38 -------
 applications/task-work-order/src/api/zkxt/index.js                                             |   20 ++++
 applications/task-work-order/src/styles/common/cockpit.scss                                    |   16 ++-
 applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue       |   15 +++
 applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue  |   54 +++++++++-
 applications/mobile-web-view/src/appComponents/workMap/index.vue                               |    7 
 applications/task-work-order/env/.env.development                                              |    2 
 uniapps/work-app/src/subPackages/workDetail/index.vue                                          |    3 
 15 files changed, 173 insertions(+), 96 deletions(-)

diff --git a/applications/mobile-web-view/src/appComponents/workMap/index.vue b/applications/mobile-web-view/src/appComponents/workMap/index.vue
index 948d848..5df7896 100644
--- a/applications/mobile-web-view/src/appComponents/workMap/index.vue
+++ b/applications/mobile-web-view/src/appComponents/workMap/index.vue
@@ -291,10 +291,11 @@
 watch(
 	() => mapCurrentDetail,
 	newVal => {
+const newDataMap=newVal
 		// 只有 workNavigationShow 为 true 且有经纬度时才添加标记
-		if (workNavigationShow && newVal?.longitude && newVal?.latitude) {
-			addIncidentMarker(newVal)
-			mapCurrentDetailData.value = newVal
+		if (workNavigationShow && newDataMap?.longitude && newDataMap?.latitude) {
+			addIncidentMarker(newDataMap)
+			mapCurrentDetailData.value = newDataMap
 		} else if (!workNavigationShow && incidentMarker) {
 			// 当 workNavigationShow 变为 false 时,移除已添加的标记
 			markersLayer.removeLayer(incidentMarker)
diff --git a/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue b/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
index ea0840b..b45f3ed 100644
--- a/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
+++ b/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
@@ -7,56 +7,22 @@
 			:workNavigationShow="true"
 			:mapCurrentDetail="mapCurrentDetail"
 		>
-<!--			<template #eventNav>-->
-<!--				<EventNavigation :mapCurrentDetail="mapCurrentDetail"></EventNavigation>-->
-<!--			</template>-->
 		</WorkMap>
 	</div>
 </template>
 
 <script setup>
-import { getDeviceRegion } from '@/api/home/aggregation'
 import WorkMap from '@/appComponents/workMap/index.vue'
-import EventNavigation from '@/appPages/work/workDetail/mapWork/eventNavigation.vue'
 import { useRoute } from 'vue-router'
 import { showToast } from 'vant'
-import { getList } from '/src/api/work/index.js'
 import { useStore } from 'vuex'
 const store = useStore()
 const userInfo = computed(() => store?.state?.user?.userInfo)
 const route = useRoute()
 const mapCurrentDetail = ref({})
-const eventNum = ref('')
-// 机巢数据
-let machineData = ref([]);
-// 机巢数据
-const handleNodeClick = async data => {
-  const droneList = await getDeviceRegion({ areaCode: userInfo.value.detail.areaCode });
-  machineData.value = droneList?.data?.data;
-};
-const getDataList = async val => {
-	const params = {
-		current: 1,
-		size: 9999,
-		source: 1,
-		event_name: val,
-	}
-	const res = await getList(params)
-	const response = res.data.data.records
-  const matchedMachine = machineData.value.find(m => m.device_sn === response[0].device_sn);
-  const deviceNickname = matchedMachine?.nickname || ''
-	mapCurrentDetail.value = {
-		...response[0],
-		processingDetail: response[0].processing_details,
-		update_photo_url: response[0].update_photo_url,
-		aiType: response[0].ai_type_key_list?.join(',') || '',
-    device_names:deviceNickname ? deviceNickname :''
-	}
-}
 onMounted(async () => {
-  // handleNodeClick()
-	eventNum.value = route.query.currentItem
-	// await getDataList(eventNum.value)
+mapCurrentDetail.value = JSON.parse(decodeURIComponent(route.query.currentItem))
+
 })
 </script>
 
diff --git a/applications/task-work-order/env/.env b/applications/task-work-order/env/.env
index 5204ccb..f02486b 100644
--- a/applications/task-work-order/env/.env
+++ b/applications/task-work-order/env/.env
@@ -15,3 +15,6 @@
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS=gzip
+
+# xt接口地址
+VITE_APP_URL_XT=http://218.202.104.82:8200
diff --git a/applications/task-work-order/env/.env.development b/applications/task-work-order/env/.env.development
index 40d319b..fe1504c 100644
--- a/applications/task-work-order/env/.env.development
+++ b/applications/task-work-order/env/.env.development
@@ -17,7 +17,7 @@
 # VITE_APP_URL = https://wrj.shuixiongit.com/api
 VITE_APP_URL= http://192.168.1.204
 
-VITE_APP_URL_XT=http://218.202.104.82:8200
+
 
 #新大屏地址
 VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
diff --git a/applications/task-work-order/src/api/zkxt/index.js b/applications/task-work-order/src/api/zkxt/index.js
index 98c05e5..3978887 100644
--- a/applications/task-work-order/src/api/zkxt/index.js
+++ b/applications/task-work-order/src/api/zkxt/index.js
@@ -18,3 +18,23 @@
 		data:{"size":100,"current":1},
 	})
 }
+
+// 获取飞手信息
+export const deviceFlyerApi = (data) => {
+	return request({
+		url: `/deviceFlyer/deviceFlyer/queryList`,
+		method: 'post',
+		data: data,
+	})
+}
+
+// 获取航线列表
+export const airlineListApi = (data) => {
+	return request({
+		url: `/webservice/webservice/airline/queryList`,
+		method: 'post',
+		data: data,
+	})
+}
+
+
diff --git a/applications/task-work-order/src/styles/common/cockpit.scss b/applications/task-work-order/src/styles/common/cockpit.scss
index 07f955a..bdd93cd 100644
--- a/applications/task-work-order/src/styles/common/cockpit.scss
+++ b/applications/task-work-order/src/styles/common/cockpit.scss
@@ -5,22 +5,28 @@
 $form-tips-gray: #A1A3D4;
 
 .gd-input {
-  --el-input-bg-color: #{$form-bg};
-  --el-input-placeholder-color: #{$form-tips};
+  --bg: #{$form-bg};
+  --tips: #{$form-tips};
 
   &.gray {
-    --el-input-bg-color: #{$form-bg-gray};
-    --el-input-placeholder-color: #{$form-tips-gray};
+    --bg: #{$form-bg-gray};
+    --tips: #{$form-tips-gray};
   }
 
   .el-input__wrapper, .el-textarea__inner {
     box-shadow: none !important;
+    background: var(--bg);
     border: none;
+  }
+  .el-input__inner, .el-textarea__inner {
+    &::placeholder {
+      color: var(--tips);
+    }
   }
 
   &.is-disabled {
     .el-input__wrapper {
-      background: $form-bg;
+      background: var(--bg);
     }
   }
 }
diff --git a/applications/task-work-order/src/views/orderView/flyingHand/index.vue b/applications/task-work-order/src/views/orderView/flyingHand/index.vue
new file mode 100644
index 0000000..60a2c0d
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/flyingHand/index.vue
@@ -0,0 +1,7 @@
+<template>
+	<basic-container>飞手</basic-container>
+</template>
+
+<script setup></script>
+
+<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
index 4c96dc6..ded4a42 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
@@ -428,14 +428,14 @@
 
 /* 左侧步骤条 */
 .detail-left {
-	width: 25%;
+	width: 35%;
 	padding-right: 20px;
 	border-right: 1px solid #e8e8e8;
 }
 
 /* 右侧表单 */
 .detail-right {
-	width: 75%;
+	width: 65%;
 	.reject-reason {
 		margin-bottom: 20px;
 		background: #f2f3f5;
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
index 1966e5b..0136cc5 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
@@ -1,14 +1,25 @@
 <template>
   <div class="audit-record-container">
-    <div class="label">审批记录</div>
-    <el-steps direction="vertical" :active="displayedSteps.length">
-      <el-step v-for="step in displayedSteps" :key="step.status" :title="step.title" :description="`${step.person || ''}\n${step.time || ''}`" />
-    </el-steps>
+    <el-timeline class="gd-timeline">
+      <el-timeline-item
+        v-for="(step, index) in displayedSteps"
+        :key="step.status"
+        :icon="Check"
+        :type="index === displayedSteps.length - 1 ? 'success' : 'info'"
+        :timestamp="step.time"
+      >
+        <div class="item-content">
+          <div class="flowName">{{ step.title }}</div>
+          <div >{{ step.person }}</div>
+        </div>
+      </el-timeline-item>
+    </el-timeline>
   </div>
 </template>
 
 <script setup>
 import { ref, watch } from 'vue'
+import { Check } from '@element-plus/icons-vue'
 import { gdSupplyDemandAuditListApi } from '@/views/orderView/orderDataManage/supplyAdd/supplyAddApi'
 
 const props = defineProps({
@@ -89,32 +100,32 @@
 
 <style scoped lang="scss">
 .audit-record-container {
-	height: 95%;
-  .label {
-    font-weight: 500;
-    margin-bottom: 8px;
-    color: #333;
+width:100%;
+	// height: 95%;
+ 
+}
+
+/* 时间线样式 */
+:deep(.gd-timeline) {
+ padding-left: 90px;
+}
+
+:deep(.el-timeline-item) {
+  padding-bottom: 20px;
+  .item-content {
+ 	position: relative;
+			.flowName {
+				width: 80px;
+				position: absolute;
+				left: -120px;
+				top: 0px;
+			}
   }
 }
 
-/* 步骤条样式 */
-:deep(.el-steps) {
-  align-items: flex-start;
-}
-
-:deep(.el-step) {
-  // margin-bottom: 20px;
-}
-
-:deep(.el-step__title) {
-  font-size: 14px;
-  font-weight: 500;
-}
-
-:deep(.el-step__description) {
-  font-size: 13px;
-  color: #666;
-  white-space: pre-wrap;
-  line-height: 1.4;
+:deep(.el-timeline-item__timestamp) {
+  font-size: 12px;
+  color: #999;
+  margin-top: 2px;
 }
 </style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
index d19aed6..8a2dd3e 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -201,6 +201,7 @@
 import { gdWorkOrderPageApi } from '../orderManage/orderManageApi'
 import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
 import { pxToRem } from '@/utils/rem'
+import { airlineListApi } from '@/api/zkxt'
 
 // 初始化任务行
 const initTaskRow = () => ({
@@ -212,7 +213,7 @@
 	deviceId: null,
 	taskDesc: '',
 })
-
+// todo 时间线
 const dictObj = inject('dictObj')
 
 const emit = defineEmits(['success'])
@@ -230,11 +231,7 @@
 // 下拉选项
 const flyerListMap = ref({}) // 飞手列表,按行索引存储
 const deviceList = ref([]) // 设备列表
-const routeOptions = ref([
-	{ name: '航线1', id: '1' },
-	{ name: '航线2', id: '2' },
-	{ name: '航线3', id: '3' },
-]) // 航线假数据
+const routeOptions = inject('routeOptions')
 
 // 子任务列表
 const taskList = ref([initTaskRow()])
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
index f9d1d67..d94a48d 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -8,6 +8,24 @@
 		:close-on-click-modal="false"
 	>
 		<div class="content" style="display: flex">
+			<div class="processBox" v-if="dialogMode !== 'add' && processList.length">
+				<el-timeline class="gd-timeline">
+					<el-timeline-item
+						v-for="(activity, index) in processList"
+						:key="index"
+						:icon="Check"
+						:type="index === processList.length - 1 ? 'success' : 'info'"
+						:color="activity.color"
+						:hollow="activity.hollow"
+						:timestamp="activity.flowDesc.split(' ')[1]"
+					>
+						<div class="item-content">
+							<div>{{ activity.flowDesc.split(' ')[0] }}</div>
+							<div class="flowName">{{ activity.flowName }}</div>
+						</div>
+					</el-timeline-item>
+				</el-timeline>
+			</div>
 			<div class="leftBox">
 				<!-- 查看模式 -->
 				<div class="detail-container" v-if="dialogReadonly">
@@ -27,7 +45,7 @@
 						</el-col>
 						<el-col :span="12">
 							<div class="label">巡查任务航线</div>
-							<div class="val">{{ getRouteName(formData.patrolRouteUrl) }}</div>
+							<div class="val">{{ getAirName(formData.patrolRouteUrl) }}</div>
 						</el-col>
 						<el-col :span="12">
 							<div class="label">推荐飞手</div>
@@ -218,13 +236,14 @@
 import { ElMessage } from 'element-plus'
 import { fieldRules, getDictLabel } from '@ztzf/utils'
 import { gdPatrolTaskRepublish, gdFlyerPageApi, gdPatrolTaskAuditApi } from './inspectionRequestApi'
-import { gdWorkOrderPageApi } from '../orderManage/orderManageApi'
+import { gdWorkOrderFlowListApi, gdWorkOrderPageApi } from '../orderManage/orderManageApi'
 import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
 import { pxToRem } from '@/utils/rem'
 import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
 import { gdTaskResultListApi } from '@/views/orderView/orderManage/clueEvents/achievementApi'
 import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue'
 import RefuseOrderDialog1 from '@/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue'
+import { Check } from '@element-plus/icons-vue'
 
 // 初始化表单数据
 const initForm = () => ({
@@ -258,11 +277,8 @@
 const flyerList = ref([])
 const deviceList = ref([])
 const workOrderList = ref([])
-const routeOptions = ref([
-	{ name: '航线1', id: '1' },
-	{ name: '航线2', id: '2' },
-	{ name: '航线3', id: '3' },
-])
+const routeOptions = inject('routeOptions')
+const getAirName = inject('getAirName')
 
 const gdStatusObj = {
 	'0': { reason: '拒绝原因', operationType: '2' },
@@ -366,6 +382,14 @@
 	deviceList.value = res?.data?.data ?? []
 }
 
+const processList = ref([])
+// 加载时间线list
+function loadList() {
+	gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '1' }).then(res => {
+		processList.value = res.data.data
+	})
+}
+
 // 提交编辑
 async function handleSubmit() {
 	const isValid = await formRef.value?.validate().catch(() => false)
@@ -396,7 +420,9 @@
 async function open({ mode = 'view', row } = {}) {
 	dialogMode.value = mode
 	formData.value = { ...initForm(), ...row }
+	console.log(row)
 	;['6', '7', '8'].includes(row.taskStatus) && getList()
+	loadList()
 	initMap()
 }
 
@@ -427,8 +453,20 @@
 			width: 100%;
 			height: 423px;
 		}
-	}
 
+	}
+	.processBox {
+		width: 312px;
+		.item-content {
+			position: relative;
+			.flowName {
+				width: 80px;
+				position: absolute;
+				left: -120px;
+				top: 0px;
+			}
+		}
+	}
 	.imgBox {
 		display: flex;
 		flex-wrap: wrap;
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
index 6d64be5..a3064be 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -137,6 +137,7 @@
 import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi'
 import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue'
 import { useStore } from 'vuex'
+import { airlineListApi } from '@/api/zkxt'
 
 const store = useStore()
 const requester = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250')
@@ -232,6 +233,19 @@
 	selectedIds.value = rows.map(item => item.id)
 }
 
+const routeOptions = ref([])
+const getAirName = id => {
+	const item = routeOptions.value.find(item => item.id === id)
+	return item ? item.name : id
+}
+provide('routeOptions', routeOptions)
+provide('getAirName', getAirName)
+function getAirList() {
+	airlineListApi({}).then(res => {
+		routeOptions.value = res.data.data || []
+	})
+}
+
 // 获取字典
 function getDictList() {
 	getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand,taskStatus').then(res => {
@@ -249,6 +263,7 @@
 onMounted(() => {
 	getList()
 	getDictList()
+	getAirList()
 })
 </script>
 <style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
index 83b7efb..ad0cb1f 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -374,11 +374,12 @@
 
 // 获取推荐设备列表
 async function getDeviceList() {
+	const all = ['11'].includes(gdStatus.value)
 	try {
 		const str = [...pointList.value, pointList.value[0]].map(item => `${item.longitude} ${item.latitude}`).join(',')
 		let geom = `POLYGON((${str}))`
 		const res = await gdManageDeviceListApi({
-			deviceIds: formData.value.recommendDeviceIds,
+			deviceIds: all ? '' : formData.value.recommendDeviceIds,
 			devicePayload: dialogMode.value === 'add' ? formData.value.deviceLoadDemand : '',
 			geom: dialogMode.value === 'add' ? geom : '',
 		})
@@ -439,7 +440,7 @@
 
 // 加载时间线list
 function loadList() {
-	gdWorkOrderFlowListApi({ workOrderId: formData.value.id }).then(res => {
+	gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '0' }).then(res => {
 		processList.value = res.data.data
 	})
 }
@@ -543,10 +544,20 @@
 			position: position,
 			billboard: {
 				image: droneIcon,
-				width: 40,
-				height: 40,
+				width: 20,
+				height: 20,
 				verticalOrigin: Cesium.VerticalOrigin.CENTER,
 			},
+			label: {
+				text: item.nickname,
+				font: '12px/1.5 Microsoft YaHei',
+				style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+				outlineWidth: 2,
+				outlineColor: Cesium.Color.WHITE,
+				horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+				verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+				pixelOffset: new Cesium.Cartesian2(0, -10)
+			}
 		})
 	})
 }
@@ -563,8 +574,9 @@
 		hasPatrolTaskList.value && gdPatrolTaskPage()
 		dialogMode.value === 'edit' ? editPolygon() : viewPolygon()
 	}
-	// setMapDevice()
+	setMapDevice()
 	await nextTick()
+	await getDeviceList()
 	syncSelection()
 }
 
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
index b7df2ad..496a025 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -82,7 +82,7 @@
 		<div class="gd-table-container" v-loading="loading">
 			<div class="gd-table-content gd-table-content-bg">
 				<el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
-					<el-table-column type="selection" width="46" />
+					<el-table-column type="selection" width="46" v-if="requester"/>
 					<el-table-column type="index" width="64" label="序号" />
 					<el-table-column prop="workOrderName" show-overflow-tooltip label="工单名称" />
 					<el-table-column prop="workOrderCode" show-overflow-tooltip label="工单编号" />
diff --git a/uniapps/work-app/src/subPackages/workDetail/index.vue b/uniapps/work-app/src/subPackages/workDetail/index.vue
index bd634d2..d46e87d 100644
--- a/uniapps/work-app/src/subPackages/workDetail/index.vue
+++ b/uniapps/work-app/src/subPackages/workDetail/index.vue
@@ -146,8 +146,9 @@
 })
 // 跳转地图
 const jumpMap = item => {
+  const contactStr = encodeURIComponent(JSON.stringify(item))
   uni.navigateTo({
-    url: `/subPackages/workDetail/mapWork/index?eventNum=${item.event_num}`,
+    url: `/subPackages/workDetail/mapWork/index?eventNum=${contactStr}`,
   })
 }
 // 退回

--
Gitblit v1.9.3