提交代码
This commit is contained in:
parent
8eb22eaff4
commit
ce08ffde29
|
|
@ -49,6 +49,15 @@ export function updateFile(data) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function moveFile(data) {
|
||||||
|
return request({
|
||||||
|
url: '/ai/dataSetBasicFile/moveFile',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 删除文件基础
|
// 删除文件基础
|
||||||
export function delFile(fileId) {
|
export function delFile(fileId) {
|
||||||
return request({
|
return request({
|
||||||
|
|
@ -63,6 +72,13 @@ export function dataRecovery(fileId) {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
export function emptyRecycleBin() {
|
||||||
|
return request({
|
||||||
|
url: '/ai/dataSetBasicFile/emptyRecycleBin',
|
||||||
|
method: 'post',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-dialog title="创建标注任务" :visible.sync="isOpen" width="500px" append-to-body @close="cancel" :close-on-click-modal="false">
|
<el-dialog title="创建标注任务" :visible.sync="isOpen" width="700px" append-to-body @close="cancel"
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="70px">
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="70px">
|
||||||
<el-form-item label="名称" prop="taskName">
|
<el-form-item label="名称" prop="taskName">
|
||||||
<el-input v-model="form.taskName" maxlength="20" placeholder="请输入版本名称" />
|
<el-input v-model="form.taskName" maxlength="20" placeholder="请输入版本名称"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="描述" prop="taskDesc">
|
<el-form-item label="描述" prop="taskDesc">
|
||||||
<el-input
|
<el-input
|
||||||
|
|
@ -24,7 +26,8 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="是否启用标注团队" prop="isStartTeam" label-width="130px">
|
<el-form-item label="是否启用标注团队" prop="isStartTeam" label-width="130px">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="form.isStartTeam">
|
v-model="form.isStartTeam"
|
||||||
|
>
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<div v-show="form.isStartTeam">
|
<div v-show="form.isStartTeam">
|
||||||
|
|
@ -34,20 +37,39 @@
|
||||||
<el-form-item label="分配数量" prop="isStartTeam" label-width="100px">
|
<el-form-item label="分配数量" prop="isStartTeam" label-width="100px">
|
||||||
<el-table
|
<el-table
|
||||||
size="mini"
|
size="mini"
|
||||||
:data="tableData">
|
:data="tableData"
|
||||||
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="date"
|
|
||||||
label="姓名"
|
label="姓名"
|
||||||
max-width="180">
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column
|
|
||||||
prop="name"
|
prop="name"
|
||||||
label="角色"
|
align="center"
|
||||||
max-width="180">
|
max-width="180"
|
||||||
|
>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="address"
|
prop="type"
|
||||||
label="数量">
|
label="角色"
|
||||||
|
align="center"
|
||||||
|
max-width="180"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.type === '0' ? '审核人员' : '标注人员' }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="num"
|
||||||
|
align="center"
|
||||||
|
label="数量"
|
||||||
|
max-width="50"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input-number
|
||||||
|
v-model="scope.row.num"
|
||||||
|
:min="1"
|
||||||
|
:max="scope.row.type === '0' ? getReviewerMax(scope.row) : getLabelingMax(scope.row)"
|
||||||
|
style="width: 150px"
|
||||||
|
></el-input-number>
|
||||||
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -58,8 +80,7 @@
|
||||||
<el-button @click="cancel">取 消</el-button>
|
<el-button @click="cancel">取 消</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<select-personnel-dialog dataset-id="" :open="selectOpen" @dialog-cancel="handleCancel" @update-data="updateData"/>
|
||||||
<select-personnel-dialog dataset-id="" :open="selectOpen" @dialog-cancel="handleCancel" @update-data ="updateData"/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -71,74 +92,124 @@ import { add } from '@/api/dataCenter/releaseVersion'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
dicts: ['ai_annotate_type'],
|
dicts: ['ai_annotate_type'],
|
||||||
components: {selectPersonnelDialog},
|
components: { selectPersonnelDialog },
|
||||||
props: {
|
props: {
|
||||||
open: {
|
open: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
required: true,
|
required: true
|
||||||
},
|
},
|
||||||
datasetId:{
|
datasetNum:{
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
required: true,
|
required: true
|
||||||
|
},
|
||||||
|
datasetId: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isOpen: {
|
isOpen: {
|
||||||
get() {
|
get() {
|
||||||
return this.open;
|
return this.open
|
||||||
},
|
},
|
||||||
set(value) {
|
set(value) {
|
||||||
this.$emit('update:open', value);
|
this.$emit('update:open', value)
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tableData:[],
|
tableData: [],
|
||||||
selectOpen:false,
|
selectOpen: false,
|
||||||
form: {}, // 初始化为空
|
form: {}, // 初始化为空
|
||||||
rules:{
|
rules: {
|
||||||
versionName:[
|
versionName: [
|
||||||
{ required: true, message: '版本名称不能为空', trigger: 'blur' },
|
{ required: true, message: '版本名称不能为空', trigger: 'blur' }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
getReviewerMax(row) {
|
||||||
|
// 假设总数是 this.datasetNum,其他值可以从 tableData 动态计算
|
||||||
|
const totalAssigned = this.tableData
|
||||||
|
.filter(item => item.type === '0' && item.id !== row.id)
|
||||||
|
.reduce((sum, item) => sum + item.num, 0);
|
||||||
|
return this.datasetNum - totalAssigned;
|
||||||
|
},
|
||||||
|
getLabelingMax(row) {
|
||||||
|
const totalAssigned = this.tableData
|
||||||
|
.filter(item => item.type === '1' && item.id !== row.id)
|
||||||
|
.reduce((sum, item) => sum + item.num, 0);
|
||||||
|
return this.datasetNum - totalAssigned;
|
||||||
|
},
|
||||||
// 数据提交
|
// 数据提交
|
||||||
submitForm() {
|
submitForm() {
|
||||||
this.$refs["form"].validate(valid => {
|
this.$refs['form'].validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
this.form.datasetId = this.datasetId;
|
this.form.datasetId = this.datasetId
|
||||||
add(this.form).then(response => {
|
add(this.form).then(response => {
|
||||||
this.$modal.msgSuccess("发布成功");
|
this.$modal.msgSuccess('发布成功')
|
||||||
this.cancel();
|
this.cancel()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
updateData(data){
|
updateData(data) {
|
||||||
console.log(data)
|
this.tableData = []
|
||||||
|
let num = Math.max(data.selectReviewer.length,data.selectLabeling.length)
|
||||||
|
let minNum = Math.floor(this.datasetNum / num) // 基础分配
|
||||||
|
if (minNum < 1) {
|
||||||
|
this.$modal.msgWarning('每人最少分配1张');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 处理 Reviewer 的分配
|
||||||
|
let reviewerRemainder = this.datasetNum % data.selectReviewer.length // 余数
|
||||||
|
let reviewerNum = Math.floor(this.datasetNum / data.selectReviewer.length) // 基础分配
|
||||||
|
data.selectReviewer.forEach(item => {
|
||||||
|
item.num = reviewerNum // 默认基础分配
|
||||||
|
if (reviewerRemainder > 0) {
|
||||||
|
item.num += 1 // 如果有余数,额外分配 1
|
||||||
|
reviewerRemainder-- // 减少余数
|
||||||
|
}
|
||||||
|
this.tableData.push(item)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 处理 Labeling 的分配
|
||||||
|
let labelingRemainder = this.datasetNum % data.selectLabeling.length // 余数
|
||||||
|
let labelingNum = Math.floor(this.datasetNum / data.selectLabeling.length) // 基础分配
|
||||||
|
|
||||||
|
data.selectLabeling.forEach(item => {
|
||||||
|
item.num = labelingNum // 默认基础分配
|
||||||
|
if (labelingRemainder > 0) {
|
||||||
|
item.num += 1 // 如果有余数,额外分配 1
|
||||||
|
labelingRemainder-- // 减少余数
|
||||||
|
}
|
||||||
|
this.tableData.push(item)
|
||||||
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
// 取消按钮
|
// 取消按钮
|
||||||
cancel() {
|
cancel() {
|
||||||
this.isOpen = false;
|
this.isOpen = false
|
||||||
this.reset();
|
this.reset()
|
||||||
this.$emit('dialog-cancel'); // 通知父组件
|
this.$emit('dialog-cancel') // 通知父组件
|
||||||
},
|
},
|
||||||
// 表单重置
|
// 表单重置
|
||||||
reset() {
|
reset() {
|
||||||
this.form = {}; // 清空表单
|
this.tableData=[];
|
||||||
this.$refs.form.resetFields(); // 调用 Element UI 的重置方法
|
this.form = {} // 清空表单
|
||||||
|
this.$refs.form.resetFields() // 调用 Element UI 的重置方法
|
||||||
},
|
},
|
||||||
// 处理取消事件
|
// 处理取消事件
|
||||||
handleCancel() {
|
handleCancel() {
|
||||||
this.selectOpen = false;
|
this.selectOpen = false
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|
|
||||||
|
|
@ -118,11 +118,13 @@ export default {
|
||||||
};
|
};
|
||||||
this.form.selectReviewer.forEach((id) => {
|
this.form.selectReviewer.forEach((id) => {
|
||||||
const result = this.reviewer.find(item => item.id === id);
|
const result = this.reviewer.find(item => item.id === id);
|
||||||
data.selectReviewer.push(result);
|
|
||||||
|
data.selectReviewer.push({id: result.id, name: result.name,num:0,type:'0'});
|
||||||
})
|
})
|
||||||
this.form.selectLabeling.forEach((id) => {
|
this.form.selectLabeling.forEach((id) => {
|
||||||
const result = this.labeling.find(item => item.id === id);
|
const result = this.labeling.find(item => item.id === id);
|
||||||
data.selectLabeling.push(result);
|
console.log(result)
|
||||||
|
data.selectLabeling.push({id: result.id, name: result.name,num:0,type:'1'});
|
||||||
})
|
})
|
||||||
this.$emit('update-data', data); // 触发事件并传递数据
|
this.$emit('update-data', data); // 触发事件并传递数据
|
||||||
this.cancel();
|
this.cancel();
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@
|
||||||
<!--版本发布-->
|
<!--版本发布-->
|
||||||
<release-version-dialog :dataset-id="datasetId" :open="releaseOpen" @dialog-cancel="handleCancel"/>
|
<release-version-dialog :dataset-id="datasetId" :open="releaseOpen" @dialog-cancel="handleCancel"/>
|
||||||
<!--创建标注任务-->
|
<!--创建标注任务-->
|
||||||
<annotation-task-dialog :dataset-id="datasetId" :open="annotationOpen" @dialog-cancel="handleCancel"/>
|
<annotation-task-dialog :datasetNum="datasetNum" :dataset-id="datasetId" :open="annotationOpen" @dialog-cancel="handleCancel"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -169,6 +169,7 @@ export default {
|
||||||
name: "DataSet",
|
name: "DataSet",
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
datasetNum:0,
|
||||||
datasetId: 0,
|
datasetId: 0,
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
loading: true,
|
loading: true,
|
||||||
|
|
@ -241,6 +242,7 @@ export default {
|
||||||
handleAnnotation(row){
|
handleAnnotation(row){
|
||||||
this.annotationOpen = true;
|
this.annotationOpen = true;
|
||||||
this.datasetId = row.datasetId;
|
this.datasetId = row.datasetId;
|
||||||
|
this.datasetNum = row.notAnnotatedCount;
|
||||||
},
|
},
|
||||||
handleUpdate(){
|
handleUpdate(){
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
:on-change="handleChange"
|
:on-change="handleChange"
|
||||||
:on-exceed="handleExceed"
|
:on-exceed="handleExceed"
|
||||||
accept="*"
|
accept="*"
|
||||||
|
:before-upload="beforeUpload"
|
||||||
:directory="true"
|
:directory="true"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|
@ -37,6 +38,7 @@
|
||||||
<span style="margin-left: 2%;font-size: 18px">{{ filename }}</span>
|
<span style="margin-left: 2%;font-size: 18px">{{ filename }}</span>
|
||||||
</div>
|
</div>
|
||||||
<el-progress :color="progress === 100 ? '#13ce66' : '#6E6A6A4C'" :percentage="progress"></el-progress>
|
<el-progress :color="progress === 100 ? '#13ce66' : '#6E6A6A4C'" :percentage="progress"></el-progress>
|
||||||
|
<span v-if="uploadFailed[filename]" style="font-size: 12px;color: red">文件上传失败</span>
|
||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
</div>
|
</div>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
|
|
@ -147,6 +149,7 @@ export default {
|
||||||
uploadNextChunk(); // 上传下一个分片
|
uploadNextChunk(); // 上传下一个分片
|
||||||
} else {
|
} else {
|
||||||
this.startNextUpload(); // 上传下一个文件
|
this.startNextUpload(); // 上传下一个文件
|
||||||
|
this.checkAllUploadsComplete(); // 检查是否所有文件上传完成
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|
@ -156,7 +159,14 @@ export default {
|
||||||
};
|
};
|
||||||
uploadNextChunk(); // 开始上传第一个分片
|
uploadNextChunk(); // 开始上传第一个分片
|
||||||
},
|
},
|
||||||
|
checkAllUploadsComplete() {
|
||||||
|
const allComplete = Object.values(this.uploadProgress).every(progress => progress === 100);
|
||||||
|
if (allComplete) {
|
||||||
|
this.$message.success("所有文件上传完成!");
|
||||||
|
this.drawer = false; // 自动关闭弹窗
|
||||||
|
this.getList && this.getList(); // 重新加载列表
|
||||||
|
}
|
||||||
|
},
|
||||||
// 启动队列中的下一个文件上传(控制并发)
|
// 启动队列中的下一个文件上传(控制并发)
|
||||||
startNextUpload() {
|
startNextUpload() {
|
||||||
Object.keys(this.uploadsNum).forEach(fileName => {
|
Object.keys(this.uploadsNum).forEach(fileName => {
|
||||||
|
|
@ -170,7 +180,14 @@ export default {
|
||||||
const nextFile = this.queue.shift(); // 获取下一个文件
|
const nextFile = this.queue.shift(); // 获取下一个文件
|
||||||
this.uploadChunks(nextFile); // 开始上传该文件
|
this.uploadChunks(nextFile); // 开始上传该文件
|
||||||
},
|
},
|
||||||
|
beforeUpload(file) {
|
||||||
|
const maxSize = 2 * 1024 * 1024*1024; // 限制文件最大为 5MB
|
||||||
|
if (file.size > maxSize) {
|
||||||
|
this.$message.error('文件大小不能超过 2GB');
|
||||||
|
return false; // 阻止上传
|
||||||
|
}
|
||||||
|
return true; // 允许上传
|
||||||
|
},
|
||||||
// 处理超出文件数限制的情况
|
// 处理超出文件数限制的情况
|
||||||
handleExceed(files, fileList) {
|
handleExceed(files, fileList) {
|
||||||
this.$message.warning(`最多只能选择50个文件,当前选择了 ${files.length + fileList.length} 个文件`);
|
this.$message.warning(`最多只能选择50个文件,当前选择了 ${files.length + fileList.length} 个文件`);
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,14 @@
|
||||||
@click="dataRecovery"
|
@click="dataRecovery"
|
||||||
v-hasPermi="['dataCenter:dataSetBasicFile:dataRecovery']"
|
v-hasPermi="['dataCenter:dataSetBasicFile:dataRecovery']"
|
||||||
>还原</el-button>
|
>还原</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
plain
|
||||||
|
icon="el-icon-refresh"
|
||||||
|
size="mini"
|
||||||
|
@click="emptyRecycleBin"
|
||||||
|
v-hasPermi="['dataCenter:dataSetBasicFile:dataRecovery']"
|
||||||
|
>清空回收站</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
@ -74,7 +82,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { delList, dataRecovery } from "@/api/dataCenter/basicFile";
|
import { delList, dataRecovery,emptyRecycleBin} from "@/api/dataCenter/basicFile";
|
||||||
export default {
|
export default {
|
||||||
name: "File",
|
name: "File",
|
||||||
data() {
|
data() {
|
||||||
|
|
@ -157,6 +165,14 @@ export default {
|
||||||
this.getList();
|
this.getList();
|
||||||
this.$modal.msgSuccess("还原成功");
|
this.$modal.msgSuccess("还原成功");
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
|
},
|
||||||
|
emptyRecycleBin(){
|
||||||
|
this.$modal.confirm('是否确认清空回收站?').then(function() {
|
||||||
|
return emptyRecycleBin();
|
||||||
|
}).then(() => {
|
||||||
|
this.getList();
|
||||||
|
this.$modal.msgSuccess("清空成功");
|
||||||
|
}).catch(() => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue