FileManage/web/src/views/testdata/testtask/index.vue
2025-10-31 09:35:32 +08:00

901 lines
37 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script lang="ts">
export default {
name: "testtask",//试验数据管理
};
</script>
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { ElMessage, ElMessageBox } from 'element-plus'
import Page from '@/components/Pagination/page.vue'
import {
tstaskPage, addtsTask, updatetsTask, exportTaskSql, deleteTsTaskById,
deleteTsTaskByIds, confirmDeleteTask, selectTsNodesById, getMaxTaskCode,
importTaskSql
} from "@/api/testtask";
import { storagesBytype } from "@/api/storage";
import { getDict } from '@/api/dict'
import { getUserInfo } from '@/api/user';
///////
let result2 = ref([])
let result1 = ref([
{ name: '任务编号', code: 'task_code' },
{ name: '任务名称', code: 'task_name' },
{ name: '任务类型', code: 'task_type' },
{ name: '任务地点', code: 'task_place' },
{ name: '任务人员', code: 'task_person' },
{ name: '载机名称', code: 'carrier_name' },
{ name: '设备代号_编号', code: 'device_code' },
{ name: '试验描述', code: 'test_describe' },
{ name: '传感器描述', code: 'sensor_describe' },
{ name: '本地存储空间', code: 'local_storage_id' },
{ name: '备份存储空间', code: 'backup_storage_id' },
])
//定义表格数据
const tableData: any = ref([]);
// 查询数据
const dataduan = ref([])
const queryParams: any = ref({
current: 1,
size: 20,
keyword: '',
fieldName: '',
startDate: '',
endDate: ''
});
const total = ref(0);
//导入
const importDialog = ref(false)
const importForm: any = ref({})
const importRules: any = ref({
localStorageId: [{ required: true, message: "请选择本地存储空间", trigger: "change" }],
backupStorageId: [{ required: true, message: "请选择minio存储空间", trigger: "change" }],
})
const fileList = ref([])
const importFormRef = ref()
// 是否单机
const standAlone = ref(false)
//转化时间格式
function zhuandata(dateString: any) {
// 创建Date对象
const date = new Date(dateString);
// 获取年、月、日
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始需要加1
const day = String(date.getDate()).padStart(2, '0');
// 格式化为YYYY-MM-DD
return `${year}-${month}-${day}`;
}
// 表格加载
const loading = ref(false)
//获取表格数据
function getdata() {
loading.value = true
if (dataduan.value && dataduan.value.length > 0) {
const dataArr = []
dataduan.value.forEach((item: any) => {
dataArr.push(zhuandata(item))
})
queryParams.value.startDate = dataArr[0]
queryParams.value.endDate = dataArr[1]
} else {
queryParams.value.startDate = ''
queryParams.value.endDate = ''
}
formitemarr.value.length = 0
loading.value = true
if (checkList1.value.length > 0) {
queryParams.value.fieldName = checkList1.value.join(',')
} else if (checkList2.value.length == 0 && queryParams.value.keyword) {
let result1Name = []
result1.value.forEach((item: any) => {
result1Name.push(item.code)
})
queryParams.value.fieldName = result1Name.join(',')
}
if (checkList2.value.length > 0) {
queryParams.value.attributeContentJson = checkList2.value.join(',')
} else if (checkList2.value.length == 0 && queryParams.value.keyword) {
let result1Name = []
result2.value.forEach((item: any) => {
result1Name.push(item.code)
})
queryParams.value.attributeContentJson = result1Name.join(',')
}
tstaskPage(queryParams.value).then((res: any) => {
visible.value = false
loading.value = false
tableData.value = res.data.records
queryParams.value.current = res.data.current
queryParams.value.size = res.data.size
total.value = res.data.total
let arr = []
// result2.value.length = 0
tableData.value.forEach((item: any) => {
if (item.taskProps) {
arr = JSON.parse(item.taskProps)
} else {
arr = []
}
item.taskProps = arr
result2.value = arr
// result.value = [...new Set([...result1.value, ...result2.value])];
// debugger
if (item.taskProps.length > 0) {
item.taskProps.forEach((items: any) => {
item[items.code] = items.data
})
}
});
if (tableData.value[0].taskProps && tableData.value[0].taskProps.length > 0) {
tableData.value[0].taskProps.forEach((item: any) => {
formitemarr.value.push({ name: item.name, data: '', code: item.code })
})
}
})
}
//弹框命名
const title = ref("")
//控制弹框显隐
const frame = ref(false)
//新增项目弹框
function addproject() {
frame.value = true
title.value = "新增试验任务"
projectForme.value = {
taskName: "",//任务名称
taskDate: "",//任务开始时间
taskPlace: "",//任务地点
taskPerson: "",//任务人员
carrierType: "",// 载体类型
carrierName: "",//载体名称
deviceName: "",//设备名称
taskCode: "",//任务编号
deviceCode: "",//设备编号
taskType: "",
testDescribe: "",// 试验描述
sensorDescribe: "",// 传感器描述
taskProps: "",//信息
localStorageId: '',
backupStorageId: ''
}
if (standAlone.value) {
projectForme.value.localStorageId = 1
projectForme.value.backupStorageId = -1
}
console.log(projectForme.value)
// formitemarr.value.length = 0
shidou.value = true
}
//修改项目弹框
function editproject(row: any) {
projectForme.value = JSON.parse(JSON.stringify(row))
formitemarr.value = projectForme.value.taskProps
projectForme.value.taskDate = [projectForme.value.taskStartdate, projectForme.value.taskEnddate]
title.value = "修改试验任务"
frame.value = true
formitemarr.value = projectForme.value.taskProps
selectNodes(row)
}
const shidou = ref(false)
function selectNodes(row: any) {
selectTsNodesById({ taskId: row.id }).then((res: any) => {
shidou.value = res.data
})
}
//删除项目弹框
function delproject(row: any) {
ElMessageBox.confirm(
'您确定要删除该项目及其中的节点和文件吗?',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
confirmDeleteTask({ ids: row.id }).then((res: any) => {
if (res.data.data.status == 1) {
loading.value = true
deleteTsTaskById({ id: row.id }).then((res: any) => {
if (res.code == 0) {
getdata()
ElMessage({
type: 'success',
message: '删除成功',
})
}
})
} else {
ElMessage.warning("试验任务中含有已备份的文件,无法删除")
return
}
})
})
}
function expproject(row: any) {
ElMessageBox.confirm(
'您确定要导出该任务吗?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
exportTaskSql({ taskId: row.id }).then((res: any) => {
console.log(res)
console.log('响应头:', res.headers);
if (res) {
const fileName = `${row.taskCode}_exportdata.zip`; // 或从响应头中获取文件名
// 处理响应数据
const blob = new Blob([res], { type: 'application/zip' });
// 创建临时链接并触发下载
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = fileName;
link.style.display = 'none';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
ElMessage({
type: 'success',
message: '导出成功',
})
} else {
ElMessage.error("导出失败")
return
}
})
})
}
//表格多选
const tableIdarr = ref([])
function handleSelectionChange(val: any) {
tableIdarr.value = val
}
//多选删除
function delprojectArr() {
const ids = []
tableIdarr.value.forEach((item: any) => {
ids.push(item.id)
})
ElMessageBox.confirm(
'您确定要删除这些项目及其中的节点和文件吗?',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
confirmDeleteTask({ ids: ids.join(',') }).then((res: any) => {
if (res.data.data.status == 1) {
loading.value = true
deleteTsTaskByIds({ ids: ids.join(',') }).then((res: any) => {
if (res.code == 0) {
ElMessage({
type: 'success',
message: '删除成功',
})
getdata()
}
})
} else {
ElMessage.warning("试验任务中含有已备份的文件,无法删除")
return
}
})
})
}
//弹框关闭
function handleClose(formEl: any) {
// if (!formEl) return
// formEl.resetFields()
frame.value = false
}
//表单数据
const ruleFormRef = ref()
const projectForme: any = ref({
taskName: "",//任务名称
taskDate: "",//任务开始时间
taskPlace: "",//任务地点
taskPerson: "",//任务人员
carrierType: "",// 载体类型
carrierName: "",//载体名称
deviceName: "",//设备名称
taskCode: "",//任务编号
deviceCode: ""//设备编号
, taskType: "",
testDescribe: "",// 试验描述
sensorDescribe: "",// 传感器描述
taskProps: "",//信息
localStorageId: '',
backupStorageId: ''
})
//表单确定
async function submitForm(formEl: any) {
if (!formEl) return
await formEl.validate((valid: any, fields: any) => {
if (valid) {
if (formitemarr.value.length > 0) {
projectForme.value.taskProps = JSON.stringify(formitemarr.value)
} else {
projectForme.value.taskProps = '[]'
}
if (projectForme.value.taskDate.length > 0) {
projectForme.value.taskStartdate = projectForme.value.taskDate[0]
projectForme.value.taskEnddate = projectForme.value.taskDate[1]
} else {
projectForme.value.taskStartdate = ''
projectForme.value.taskEnddate = ''
}
if (projectForme.value.id) {
updatetsTask(projectForme.value).then((res: any) => {
if (res.code == 0) {
getdata()
ElMessage.success("修改成功")
frame.value = false
}
})
} else {
addtsTask(projectForme.value).then((res: any) => {
if (res.code == 0) {
getdata()
ElMessage.success("添加成功")
frame.value = false
}
})
}
}
})
}
//用户弹窗规则定义
const moderules = ref({
taskType: [{ required: true, message: "请选择任务类型", trigger: "change" }],
taskDate: [{ required: true, message: "请选择任务时间", trigger: "change" }],
taskPlace: [{ required: true, message: "请输入任务地点", trigger: "blur" }],
localStorageId: [{ required: true, message: "请选择本地存储空间", trigger: "change" }],
backupStorageId: [{ required: true, message: "请选择minio存储空间", trigger: "change" }],
});
onMounted(() => {
getUserInfo().then((res: any) => {
const roles = res.data.roles
const hasSingleMachineUser = roles.some(name => name === '单机用户');
if (hasSingleMachineUser) {
standAlone.value = true
}
})
getdata()
getDictOne()
});
//获取字典项目类型
const dictType = ref([])
const localarr = ref([])
const minioarr = ref([])
function getDictOne() {
getDict({ dictcode: 'taskType' }).then((res: any) => {
dictType.value = res.data
})
storagesBytype({ type: 'local' }).then((res: any) => {
localarr.value = res.data
})
storagesBytype({ type: 'minio' }).then((res: any) => {
minioarr.value = res.data
})
}
//项目类型转换
function typeName(arr: any, itemCode: any) {
let nameone: any
arr.forEach((item: any) => {
if (item.itemcode == itemCode) {
nameone = item.dictname
}
});
return nameone
}
function typeName1(arr: any, itemCode: any) {
let nameone: any
arr.forEach((item: any) => {
if (item.id == itemCode) {
nameone = item.name
}
});
return nameone
}
const logqing = ref(false)
const logTxt = ref('')
function Loglist(row: any, title1: any) {
title.value = title1
logqing.value = true
logTxt.value = row
}
function handleClose1() {
logqing.value = false
}
//添加属性
const formitemarr = ref([])
const dataname = ref('')
const labledone = ref(false)
function addformItem() {
labledone.value = true
dataname.value = ''
}
function labledoneclose() {
labledone.value = false
}
function labledsure() {
if (!dataname.value) {
ElMessage.warning('请输入属性名称')
return
}
generateUniqueId
formitemarr.value.push({ name: dataname.value, data: '', code: generateUniqueId(8) })
labledone.value = false
}
function generateUniqueId(length: any) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
// 添加时间戳部分转换为36进制并取字母部分
const timePart = Date.now().toString(36).toUpperCase().replace(/[0-9]/g, '');
result += timePart;
// 补充随机字符
for (let i = result.length; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result.substring(0, length);
}
function dellable(index: any) {
formitemarr.value.splice(index, 1)
}
const checkList1 = ref([])
const checkList2 = ref([])
const visible: any = ref(false)
function reset() {
checkList1.value.length = 0
checkList2.value.length = 0
queryParams.value.keyword = ''
dataduan.value.length = 0
visible.vlaue = false
getdata()
}
function importproject() {
fileList.value = []
importForm.value.fileName = ''
importForm.value.localStorageId = ''
importForm.value.backupStorageId = ''
getMaxTaskCode().then((res: any) => {
if (res.data) {
importForm.value.taskCode = res.data
importDialog.value = true
} else {
ElMessage.warning('查询编号失败')
return
}
})
}
function fileChange(uploadFile, uploadFiles) {
console.log(uploadFile, uploadFiles)
importForm.value.fileName = uploadFile.name
fileList.value = []
fileList.value = [uploadFile.raw]
}
const isconnect = ref(false)
function importSubmit(formEl: any) {
if (!formEl) return
formEl.validate((valid: any, fields: any) => {
if (valid) {
if (fileList.value.length == 0) {
return ElMessage.warning('请上传导入文件!')
}
if (isconnect.value) {
return
}
const formData = new FormData()
formData.append('file', fileList.value[0])
formData.append('taskCode', importForm.value.taskCode)
formData.append('localStorageId', importForm.value.localStorageId)
formData.append('backupStorageId', importForm.value.backupStorageId)
isconnect.value = true
importTaskSql(formData).then((res: any) => {
if (res.code == '0') {
isconnect.value = false
importDialog.value = false
ElMessage.success('上传成功')
getdata()
} else {
isconnect.value = false
importDialog.value = false
ElMessage.error(res.msg)
}
})
}
})
}
function importClose() {
importDialog.value = false
}
</script>
<template>
<div>
<div class="record-box">
<div class="sou_title">
<div class="sou_title_left">
<el-input style="margin-right: 10px ;width:240px;" v-model="queryParams.keyword" clearable
@change="getdata()" placeholder="全属性搜索"></el-input>
<el-button type="primary" @click="getdata()">搜索</el-button>
<el-popover placement="bottom" :width="400" trigger="click" :visible="visible">
<template #reference>
<el-button @click="visible = true" type="primary">高级</el-button>
</template>
<div style="display: flex;width: 100%;justify-content: space-between;margin: 0px 0px 10px 0px;">
<div class="shuxingtitle" style="margin: 0px;padding: 0px;font-size: 18px;">
<div class="kuai" style="height: 16px;"></div>
<div class="txt"> 高级搜索</div>
</div>
<div class="glose" @click="visible = false">x</div>
</div>
<div style="display: flex;align-items: center;">
<el-input style="margin-right: 10px;width:240px;" v-model="queryParams.keyword" clearable
placeholder="全属性搜索"></el-input>
<el-button type="primary" @click="getdata()">搜索</el-button>
<el-button type="primary" @click="reset()">重置</el-button>
</div>
<div class="shuxingtitle" v-if="result1.length > 0">
<div class="kuai"></div>
<div class="txt"> 固定属性</div>
</div>
<el-checkbox-group v-model="checkList1">
<el-checkbox v-for="item in result1" :key="item.code" :label="item.name"
:value="item.code" />
</el-checkbox-group>
<div class="shuxingtitle" v-if="result2.length > 0">
<div class="kuai"></div>
<div class="txt"> 自定义属性</div>
</div>
<el-checkbox-group v-model="checkList2">
<el-checkbox v-for="item in result2" :key="item.code" :label="item.name"
:value="item.code" />
</el-checkbox-group>
<el-date-picker v-model="dataduan" type="daterange" range-separator="至"
style="margin-right: 10px ;margin-bottom: 10px;" start-placeholder="开始时间"
end-placeholder="结束时间" />
</el-popover>
<!-- <el-button v-else type="primary" style="margin-top: 10px;" @click="getdata()">搜索</el-button> -->
</div>
<div>
<el-button type="primary" @click="addproject()">新增</el-button>
<el-button type="primary" @click="delprojectArr()" :disabled="tableIdarr.length == 0">删除</el-button>
<el-button v-if="standAlone == false" type="primary" @click="importproject()">导入</el-button>
</div>
</div>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"
:header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(71vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" />
<el-table-column prop="taskCode" label="任务编号" width="90"></el-table-column>
<el-table-column prop="taskName" label="任务名称" width="600"></el-table-column>
<el-table-column prop="taskType" label="任务类型" width="120">
<template #default="scope">
<span>{{ typeName(dictType, scope.row.taskType) }}</span>
</template>
</el-table-column>
<el-table-column prop="taskDate" label="任务时间" width="320" align="center">
<template #default="scope">
<span>{{ scope.row.taskStartdate && scope.row.taskEnddate ? scope.row.taskStartdate + '-' +
scope.row.taskEnddate : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="taskPlace" label="任务地点" width="180"></el-table-column>
<el-table-column prop="taskPerson" label="任务人员" width="280"></el-table-column>
<el-table-column prop="carrierName" label="载机名称" width="180"></el-table-column>
<el-table-column prop="deviceCode" label="设备代号_编号" width="180"></el-table-column>
<el-table-column prop="testDescribe" label="试验描述" width="320">
<template #default="scope">
<!-- <span>{{ scope.row.testDescribe }}</span> -->
<div class="ellipsis">
<span class="single-line-ellipsis">{{ scope.row.testDescribe }}</span>
<img src="@/assets/MenuIcon/xqing.png" alt="" title="详情"
@click="Loglist(scope.row.testDescribe, '试验描述详情')" style="cursor: pointer;">
</div>
</template>
</el-table-column>
<el-table-column prop="sensorDescribe" label="传感器描述" width="320">
<template #default="scope">
<!-- <span>{{ scope.row.testDescribe }}</span> -->
<div class="ellipsis">
<span class="single-line-ellipsis">{{ scope.row.sensorDescribe }}</span>
<img src="@/assets/MenuIcon/xqing.png" alt="" title="详情"
@click="Loglist(scope.row.sensorDescribe, '传感器描述详情')" style="cursor: pointer;">
</div>
</template>
</el-table-column>
<el-table-column v-if="standAlone == false" prop="localStorageId" label="本地存储空间" width="180">
<template #default="scope">
<span>{{ typeName1(localarr, scope.row.localStorageId) }}</span>
</template>
</el-table-column>
<el-table-column v-if="standAlone == false" prop="backupStorageId" label="备份存储空间" width="180">
<template #default="scope">
<span>{{ typeName1(minioarr, scope.row.backupStorageId) }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100" align="center">
<template #default="scope">
<span
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
<img src="@/assets/MenuIcon/lbcz_xg.png" alt="" title="修改" @click="editproject(scope.row)"
style="cursor: pointer;">
<img src="@/assets/MenuIcon/lbcz_sc.png" alt="" title="删除" @click="delproject(scope.row)"
style="cursor: pointer;">
<img v-if="standAlone" src="@/assets/MenuIcon/lbcz_dc.png" alt="" title="导出"
@click="expproject(scope.row)" style="cursor: pointer;">
</span>
</template>
</el-table-column>
<el-table-column v-for="item in result2" :prop="item.code" :label="item.name"
width="180"></el-table-column>
</el-table>
<Page :total="total" v-model:size="queryParams.size" v-model:current="queryParams.current"
@pagination="getdata()">
</Page>
</div>
<el-dialog :title="title" v-model="frame" width="60%" :before-close="handleClose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<el-form ref="ruleFormRef" style="max-width:100%" :model="projectForme" :rules="moderules"
label-width="auto" class="demo-ruleForm" status-icon>
<el-scrollbar height="80vh">
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label="任务编号" style="width: 50%;">
<el-input v-model="projectForme.taskCode" maxlength="40" show-word-limit disabled
style="width: 100%;" />
</el-form-item>
<el-form-item label="任务名称" style="width: 50%;margin-left: 15px;">
<el-input v-model="projectForme.taskName" show-word-limit disabled />
</el-form-item>
</div>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label="任务类型" prop="taskType" style="width: 50%;">
<el-select v-model="projectForme.taskType" clearable placeholder=" ">
<el-option v-for="item in dictType" :key="item.itemcode" :label="item.dictname"
:value="item.itemcode" />
</el-select>
</el-form-item>
<el-form-item label="任务时间" prop="taskDate" style="width: 50%;margin-left: 15px;">
<el-date-picker :disabled="projectForme.id" v-model="projectForme.taskDate" type="daterange"
range-separator="-" start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</el-form-item>
</div>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label="任务地点" prop="taskPlace" style="width: 50%;">
<el-input :disabled="projectForme.id" v-model="projectForme.taskPlace" maxlength="500"
show-word-limit />
</el-form-item>
<el-form-item label="任务人员" style="width: 50%;margin-left: 15px;">
<el-input v-model="projectForme.taskPerson" maxlength="500" show-word-limit />
</el-form-item>
</div>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label="载机名称" style="width: 50%;">
<el-input :disabled="projectForme.id" v-model="projectForme.carrierName" maxlength="40"
show-word-limit />
</el-form-item>
<el-form-item label="设备代号_编号" style="width: 50%;margin-left: 15px;">
<el-input :disabled="projectForme.id" v-model="projectForme.deviceCode" maxlength="40"
show-word-limit />
</el-form-item>
</div>
<!-- <el-form-item label="载体类型">
<el-input v-model="projectForme.carrierType" maxlength="200" show-word-limit />
</el-form-item> -->
<el-form-item label="试验描述">
<el-input v-model="projectForme.testDescribe" :rows="7" type="textarea" show-word-limit />
</el-form-item>
<el-form-item label="传感器描述">
<el-input v-model="projectForme.sensorDescribe" :rows="7" type="textarea" show-word-limit />
</el-form-item>
<!-- <el-form-item label="设备名称">
<el-input v-model="projectForme.deviceName" maxlength="40" show-word-limit />
</el-form-item> -->
<el-form-item v-for="(item, index) in formitemarr" :label="item.name">
<div style="width: 100%;display: flex;align-items: center;justify-content: space-between;">
<el-input v-model="item.data" style="width: 92%;" />
<el-button type="primary" @click="dellable(index)">删除</el-button>
</div>
</el-form-item>
<div v-if="standAlone == false"
style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label="本地存储空间" prop="localStorageId" style="width: 50%;">
<el-select v-model="projectForme.localStorageId" clearable placeholder=" "
:disabled="!shidou">
<el-option v-for="item in localarr" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="备份存储空间" prop="backupStorageId" style="width: 50%;margin-left: 15px;">
<el-select v-model="projectForme.backupStorageId" clearable placeholder=" "
:disabled="!shidou">
<el-option v-for="item in minioarr" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</div>
</el-scrollbar>
<el-form-item>
<div style="width: 100%;display: flex;justify-content: end;">
<el-button type="primary" @click="addformItem">添加属性</el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
<el-button @click="handleClose(ruleFormRef)">取消</el-button>
</div>
</el-form-item>
</el-form>
</el-dialog>
<el-dialog :title="'添加属性'" v-model="labledone" width="20%" :before-close="labledoneclose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<el-input v-model="dataname" placeholder="请输入属性名称" />
<div style="width: 100%;display: flex;justify-content: end;margin-top: 10px;">
<el-button type="primary" @click="labledsure()">确定</el-button>
</div>
</el-dialog>
<!-- <el-dialog :title="'自定义属性详情'" v-model="attbute" width="1200px" :before-close="attributeclose" top="30px"
draggable :close-on-click-modal="false" destroy-on-close>
<el-table v-if="result2.length > 0" v-loading="attloading" :data="result1"
:header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(30vh);margin-bottom: 20px;" border>
<el-table-column v-for="item in result2" :prop="item.id" :label="item.name"></el-table-column>
</el-table>
<div v-else
style="width: 100%;height: 285px;display: flex;align-items: center;justify-content: center;border: 1px solid #ebeef5;">
<el-empty description="暂无数据" />
</div>
</el-dialog> -->
<el-dialog :title="title" v-model="logqing" width="60%" :before-close="handleClose1" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<div class="texlog">
<el-scrollbar height="80vh">
{{ logTxt }}
</el-scrollbar>
</div>
</el-dialog>
<el-dialog title="导入试验任务参数设定" v-model="importDialog" width="30%" :before-close="importClose" top="30px"
:close-on-click-modal="false" destroy-on-close>
<!-- importForm -->
<el-form ref="importFormRef" style="max-width: 600px" :model="importForm" :rules="importRules"
label-width="auto">
<el-form-item label="新编号" prop="taskCode">
<div>{{ importForm.taskCode }}</div>
</el-form-item>
<el-form-item label="本地存储空间" prop="localStorageId" style="width: 100%;">
<el-select v-model="importForm.localStorageId" clearable placeholder="请选择本地存储空间">
<el-option v-for="item in localarr" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="备份存储空间" prop="backupStorageId" style="width: 100%">
<el-select v-model="importForm.backupStorageId" clearable placeholder="请选择备份存储空间">
<el-option v-for="item in minioarr" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<div style="width: 100%;display: flex;align-items: center;">
<el-upload v-model="fileList" :auto-upload="false" :show-file-list="false" class="upload-demo"
action="" :on-change="fileChange">
<el-button type="primary" style="padding: 0px 5px;">上传导入文件</el-button>
</el-upload>
<el-input v-model="importForm.fileName" disabled style="margin-left: 10px;" />
</div>
</el-form-item>
</el-form>
<div style="width: 100%;display: flex;justify-content: end;margin-top: 10px;">
<el-button type="primary" @click="importSubmit(importFormRef)">导入</el-button>
</div>
</el-dialog>
</div>
</template>
<style lang="scss" scoped>
.texlog {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.ellipsis {
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
}
.single-line-ellipsis {
width: 270px;
/* 限制容器宽度 */
white-space: nowrap;
/* 禁止文本换行 */
overflow: hidden;
/* 隐藏超出范围的内容 */
text-overflow: ellipsis;
/* 使用省略号 */
}
.record-box {
padding: 20px;
width: 100%;
height: calc(100vh - 130px);
overflow: auto;
background-color: rgba(255, 255, 255, 1);
border: none;
border-radius: 3px;
box-sizing: border-box;
.sou_title {
width: 100%;
display: flex;
justify-content: space-between;
// align-items: center;
margin-bottom: 20px;
.sou_title_left {
width: 80%;
display: flex;
align-items: center;
// justify-content: space-between;
flex-wrap: wrap;
}
}
}
.shuxingtitle {
font-size: 16px;
font-weight: 600;
color: #409eff;
margin-top: 5px;
box-sizing: border-box;
display: flex;
align-items: center;
.kuai {
width: 3px;
height: 14px;
background: #409eff;
}
.txt {
padding: 0px 0px 0px 5px;
}
}
.glose {
cursor: pointer;
}
.glose:hover {
color: #409eff;
}
</style>