From 9dbd9daa2fa8e457444f392d51b257b834bd22a2 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Sat, 24 May 2025 10:48:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/test' into test

---
 src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue |  295 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 295 insertions(+), 0 deletions(-)

diff --git a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
new file mode 100644
index 0000000..7dcf2d7
--- /dev/null
+++ b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -0,0 +1,295 @@
+<!-- 任务统计表格 -->
+<template>
+	<div class="task-intermediate-content">
+		<SearchBox @search="searchClick" @addTask="handleAddTask"></SearchBox>
+		<div class="task-table">
+			<el-table
+			stripe
+				:data="jobListData"
+				:row-class-name="tableRowClassName"
+				:row-style="{ height: '54px', fontSize: '14px', 'text-align': 'center' }"
+				:header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }"
+			>
+				<el-table-column label="序号" type="index" width="60">
+					<template #default="{ $index }">
+						{{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2, '0') }}
+					</template>
+				</el-table-column>
+				<el-table-column prop="job_info_num" label="任务编号" show-overflow-tooltip align="center" />
+				<el-table-column prop="name" label="任务名称" show-overflow-tooltip align="center" />
+				<el-table-column prop="dept_name" label="所属部门" width="200" align="center" />
+				<el-table-column prop="device_names" label="所属机巢" />
+				<el-table-column prop="ai_type_str" label="关联算法" show-overflow-tooltip align="center" />
+				<el-table-column label="任务状态" align="center">
+					<template #default="scope">
+						<span
+							:style="{
+								color:
+									scope.row.status === 1
+										? '#ffe17e'
+										: scope.row.status === 2
+										? '#ffa768'
+										: scope.row.status === 3
+										? '#8effac'
+										: scope.row.status === 5
+										? '#FF4848'
+										: scope.row.status === 7
+										? '#A6A6A6'
+										: '',
+							}"
+						>
+							{{ scope.row.status ? getStatusText(scope.row.status) : '' }}
+						</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="is_circle_job" label="任务类型" align="center">
+					<template #default="scope">
+						<span>{{ scope.row.rep_rule_type ? '周期任务' : '临时任务' }}</span>
+					</template>
+				</el-table-column>
+				<!-- <el-table-column prop="job_num" label="执行次数" /> -->
+				<el-table-column prop="event_number" label="关联事件" align="center">
+					<template #default="scope">
+						<span>{{ scope.row.event_number ? scope.row.event_number : '/' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="cycle_time_value" label="任务时间" />
+				<el-table-column prop="creator_name" label="创建人" align="center" />
+				<el-table-column label="操作" width="200" align="center">
+					<template #default="scope">
+						<div
+							v-if="scope.row.status === 2"
+							class="btnItem turnBack"
+							link
+							type="primary"
+							@click="turnBack(scope.row)"
+						>
+							返航
+						</div>
+						<div
+							v-if="scope.row.status === 1"
+							class="btnItem cancelTask"
+							link
+							type="primary"
+							@click="cancelTask(scope.row)"
+						>
+							取消任务
+						</div>
+						<div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
+					</template>
+				</el-table-column>
+			</el-table>
+		</div>
+		<div class="pagination">
+			<el-pagination
+				class="ztzf-pagination"
+				popper-class="custom-pagination-dropdown"
+				v-model:current-page="jobListParams.current"
+				v-model:page-size="jobListParams.size"
+				:page-sizes="[10, 20, 30, 40]"
+				layout="prev, pager, next, sizes, jumper"
+				:total="total"
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+			/>
+		</div>
+	</div>
+	<!-- 添加任务 -->
+	<AddTask v-model:show="isShowAddTask" @refresh="refreshGetJobList" />
+	<!-- 当前任务详情 -->
+	<!-- <CurrentTaskDetails
+		v-if="isShowCurrentTaskDetails"
+		v-model:show="isShowCurrentTaskDetails"
+		:wayLineJodInfoId="rowData.id"
+	/> -->
+	<!-- 历史任务详情 -->
+	<DeviceJobDetails
+		v-if="isShowDeviceJobDetails"
+		v-model:show="isShowDeviceJobDetails"
+		:wayLineJodInfoId="rowData.id"
+		:batchNo="rowData.batch_no"
+	/>
+	<CancelTaskDialog
+		ref="cancelTaskDialogRef"
+		v-model:isShowCancelTask="isShowCancelTask"
+		:row-data="rowData"
+		@refresh="getJobList"
+	/>
+</template>
+
+<script setup>
+import SearchBox from '../SearchBox.vue'
+import AddTask from './AddTask.vue'
+// import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue'
+import { jobList, cancelJobs, taskReturnLines } from '@/api/job/task'
+import { ElMessage } from 'element-plus'
+import DeviceJobDetails from '../DeviceJobDetails.vue'
+import CancelTaskDialog from '../CancelTaskDialog.vue'
+import { useStore } from 'vuex'
+const store = useStore()
+const singleUavHome = computed(() => store.state.home.singleUavHome)
+const jobListParams = reactive({
+	current: 1,
+	size: 10,
+	searchParams: {},
+})
+const jobListData = ref([])
+const total = ref(0)
+let isShowDeviceJobDetails = ref(false)
+let isShowCurrentTaskDetails = ref(false)
+let isShowCancelTask = ref(false)
+const cancelTaskDialogRef = ref(null)
+
+// 获取任务列表
+const getJobList = () => {
+	jobList(jobListParams).then(res => {
+		if (res.data.code !== 0) return
+		jobListData.value = res.data.data.records
+		total.value = res.data.data.total
+	})
+}
+// 状态文字
+const getStatusText = status => {
+	const statusMap = {
+		1: '待执行',
+		2: '执行中',
+		3: '已执行',
+		4: '已取消',
+		5: '执行失败',
+		7: '取消执行',
+	}
+	return statusMap[status] || '-'
+}
+
+// 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发)
+let rowData = ref({})
+const handleDetail = row => {
+	if (!row.device_sns.length) return ElMessage.warning('没有device_sns')
+	if (row.device_sns.length !== 1) return ElMessage.success('即将跳转到集群调度')
+	rowData.value = row ? row : {}
+	if (row.status === 2 || row.status === 1) {
+		// isShowCurrentTaskDetails.value = true
+		// 跳转大屏当前任务详情
+		const adminUrl = `${import.meta.env.VITE_APP_AREA_NAME}/command-center-dashboard/#/taskManage`
+		const targetPath = `id=${encodeURIComponent(rowData.value.id)}&batchNo=${encodeURIComponent(rowData.value.batch_no)}`
+		window.open(`${adminUrl}?${targetPath}`, '_blank')
+	} else {
+		isShowDeviceJobDetails.value = true
+	}
+}
+
+// 分页大小改变
+const handleSizeChange = val => {
+	jobListParams.size = val
+	getJobList()
+}
+
+// 页码改变
+const handleCurrentChange = val => {
+	jobListParams.current = val
+	getJobList()
+}
+
+// 传参查询条件
+const searchClick = params => {
+	jobListParams.current = 1
+	jobListParams.size = 10
+	jobListParams.searchParams = params
+	getJobList()
+}
+
+const refreshGetJobList = () => {
+	jobListParams.current = 1
+	jobListParams.size = 10
+	getJobList()
+}
+
+// 新建任务
+const isShowAddTask = ref(false)
+const handleAddTask = () => {
+	isShowAddTask.value = true
+}
+
+const tableRowClassName = ({ row, rowIndex }) => {
+	if (rowIndex % 2 === 1) {
+		return 'warning-row'
+	} else {
+		return 'success-row'
+	}
+}
+// 取消任务 0 取消全部 1取消单条
+const cancelTask = row => {
+	if (row.execute_time_arr?.length && row.execute_time_arr?.length > 0) {
+		rowData.value = row
+		isShowCancelTask.value = true
+	} else {
+		cancelTaskDialogRef.value.submitCancelTask(row, 1)
+	}
+}
+// 返航
+const turnBack = row => {
+	taskReturnLines(row.device_sns).then(res => {
+		if (res.data.code !== 0) return
+		ElMessage.success('返航操作成功')
+		getJobList()
+	})
+}
+
+onMounted(() => {
+	// getJobList()
+})
+</script>
+
+<style lang="scss" scoped>
+.task-intermediate-content {
+	margin: 0 30px 16px 40px;
+	background-color: #ffffff;
+	padding: 14px 18px;
+	// 表格
+	.task-table {
+		height: 520px;
+		margin-top: 18px;
+		overflow: auto;
+	}
+	.btnItem {
+		height: 27px;
+		line-height: 27px;
+		border-radius: 0px 0px 0px 0px;
+		border: 1px solid #51a8ff;
+		font-family: Segoe UI, Segoe UI;
+		font-weight: 400;
+		font-size: 14px;
+		color: #1C5CFF;
+		padding: 0 10px;
+		display: inline-block;
+		margin-right: 10px;
+		cursor: pointer;
+
+		&.turnBack {
+			border: 1px solid #ffa500;
+			color: #ffa500;
+		}
+		&.cancelTask {
+			border: 1px solid #3efe96;
+			color: #3efe96;
+		}
+	}
+	:deep(.el-table) {
+			--el-table-tr-bg-color: #ffffff;
+			--el-table-striped-bg-color: #EFEFEF;
+			
+			.el-table__body tr.el-table__row--striped td {
+				background-color: var(--el-table-striped-bg-color);
+			}
+	}
+	// 分页
+	:deep(.el-pagination) {
+		display: flex;
+		justify-content: center;
+	}
+	:deep(.el-pagination button) {
+		background: center center no-repeat none !important;
+		color: #8eb8ea !important;
+	}
+}
+</style>

--
Gitblit v1.9.3