feat: 更新批处理模型路径输入功能,增加模型路径管理和验证

This commit is contained in:
sladro 2026-02-27 16:48:59 +08:00
parent 3417462710
commit b7e98af8ba
2 changed files with 105 additions and 29 deletions

View File

@ -107,22 +107,26 @@
<div class="wizard-content">
<!-- 步骤1选择模型 -->
<div v-show="wizardStep === 0" class="step-panel">
<p class="step-desc">请从文件库或本地选择需要进行批量处理的模型集合</p>
<el-upload
class="upload-demo"
drag
multiple
action="#"
:auto-upload="false"
>
<el-icon class="el-icon--upload"><i class="fas fa-cloud-upload-alt"></i></el-icon>
<div class="el-upload__text">
拖拽文件到此处或 <em>点击上传</em>
<p class="step-desc">请输入模型路径并点击增加模型构建本次批处理的模型列表</p>
<div class="model-path-input-row">
<el-input
v-model="newModelPath"
placeholder="例如D:\\CAD\\project\\part1.prt"
@keyup.enter="addModelPath"
/>
<el-button type="primary" @click="addModelPath">
<i class="fas fa-plus"></i> 增加模型
</el-button>
</div>
<div class="model-path-list" v-if="taskForm.modelPaths.length > 0">
<div class="model-path-item" v-for="(path, index) in taskForm.modelPaths" :key="path + index">
<span class="path-text">{{ path }}</span>
<el-button type="danger" size="small" link @click="removeModelPath(index)">移除</el-button>
</div>
<template #tip>
<div class="el-upload__tip">支持多选目前已选 0 个模型</div>
</template>
</el-upload>
</div>
<div class="empty-model-paths" v-else>
尚未添加模型路径
</div>
</div>
<!-- 步骤2配置策略 -->
@ -187,8 +191,10 @@ const taskForm = ref({
exportPath: '',
priority: '普通',
maxConcurrency: 3,
scheduleAt: ''
scheduleAt: '',
modelPaths: []
})
const newModelPath = ref('')
//
const jobs = ref([
@ -211,12 +217,19 @@ const openWizard = () => {
exportPath: '',
priority: '普通',
maxConcurrency: 3,
scheduleAt: ''
scheduleAt: '',
modelPaths: []
}
wizardVisible.value = true
}
const submitTask = () => {
if (taskForm.value.modelPaths.length === 0) {
ElMessage.warning('请先添加至少一个模型路径')
wizardStep.value = 0
return
}
ElMessage.success('批量任务已成功加入调度队列!')
wizardVisible.value = false
// mock ( create job )
@ -226,12 +239,27 @@ const submitTask = () => {
priority: taskForm.value.priority,
progress: 0,
status: 'queued',
totalCount: 1, //
totalCount: taskForm.value.modelPaths.length,
completedCount: 0,
createdAt: new Date().toLocaleString()
})
}
const addModelPath = () => {
const path = newModelPath.value.trim()
if (!path) return
if (taskForm.value.modelPaths.includes(path)) {
ElMessage.warning('该模型路径已存在')
return
}
taskForm.value.modelPaths.push(path)
newModelPath.value = ''
}
const removeModelPath = (index) => {
taskForm.value.modelPaths.splice(index, 1)
}
//
const getStatusLabel = (status) => {
const map = { running: '执行中', completed: '已完成', queued: '排队中', paused: '已暂停', failed: '异常' }
@ -389,10 +417,50 @@ const viewDetails = (row) => {
}
.step-desc {
color: var(--color-text-secondary);
color: #4b5563;
margin-bottom: var(--spacing-md);
}
.model-path-input-row {
display: flex;
gap: var(--spacing-md);
margin-bottom: var(--spacing-md);
}
.model-path-list {
border: 1px solid #d1d5db;
border-radius: var(--size-border-radius);
background: #ffffff;
max-height: 260px;
overflow-y: auto;
}
.model-path-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--spacing-md);
padding: 10px 12px;
border-bottom: 1px solid #e5e7eb;
}
.model-path-item:last-child {
border-bottom: none;
}
.path-text {
flex: 1;
color: #111827;
font-size: var(--font-size-sm);
word-break: break-all;
}
.empty-model-paths {
color: #6b7280;
font-size: var(--font-size-sm);
padding: 10px 2px;
}
.form-tip {
margin-left: 10px;
font-size: 12px;
@ -403,10 +471,26 @@ const viewDetails = (row) => {
:deep(.el-table) {
--el-table-bg-color: transparent;
--el-table-tr-bg-color: transparent;
--el-table-striped-bg-color: rgba(255, 255, 255, 0.08);
--el-table-header-bg-color: var(--color-bg-primary);
--el-table-border-color: var(--color-border-primary);
--el-table-text-color: var(--color-text-primary);
--el-table-header-text-color: var(--color-text-primary);
--el-table-row-hover-bg-color: var(--color-white-rgb-05);
}
/* 修复浅色斑马纹导致的文字可读性问题 */
:deep(.el-table .el-table__row td.el-table__cell) {
color: var(--color-text-primary);
}
:deep(.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell) {
background-color: rgba(255, 255, 255, 0.12);
}
/* 固定列默认会有独立背景,保持与行背景一致,避免发白 */
:deep(.el-table .el-table-fixed-column--left),
:deep(.el-table .el-table-fixed-column--right) {
background-color: transparent !important;
}
</style>

View File

@ -50,14 +50,6 @@
</div>
</div>
<div class="setting-group toggle-group">
<label>安全设置</label>
<div class="toggle-control">
<span>操作前备份原始文件</span>
<el-switch v-model="formData.backupOriginal" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
</div>
</div>
<div class="action-bar">
<button class="primary-btn" @click="startTask" :disabled="isStarting">
<i class="fas" :class="isStarting ? 'fa-spinner fa-spin' : 'fa-play'"></i>
@ -158,7 +150,7 @@
<script setup>
import { ref, reactive, onUnmounted } from 'vue'
import { ElNotification, ElSwitch } from 'element-plus'
import { ElNotification } from 'element-plus'
import revitApi from '@/services/revitApi'
const emit = defineEmits(['page-change'])
@ -177,7 +169,7 @@ let pollingTimer = null
//
const DEFAULT_REVIT_CONFIG = {
MODE: 'EnvelopeOnly',
BACKUP_ORIGINAL: true
BACKUP_ORIGINAL: false
};
//