提交代码

This commit is contained in:
jiang 2024-11-25 18:10:02 +08:00
parent 8eb22eaff4
commit ce08ffde29
6 changed files with 174 additions and 50 deletions

View File

@ -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',
})
}

View File

@ -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">

View File

@ -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();

View File

@ -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(){

View File

@ -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} 个文件`);

View File

@ -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(() => {});
} }
} }
}; };