提交代码
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) {
 | 
			
		||||
  return request({
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +72,13 @@ export function dataRecovery(fileId) {
 | 
			
		|||
    method: 'post',
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
export function emptyRecycleBin() {
 | 
			
		||||
  return request({
 | 
			
		||||
    url: '/ai/dataSetBasicFile/emptyRecycleBin',
 | 
			
		||||
    method: 'post',
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,11 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <div>
 | 
			
		||||
    <el-dialog title="创建标注任务" :visible.sync="isOpen" width="500px" append-to-body @close="cancel" :close-on-click-modal="false">
 | 
			
		||||
      <el-form ref="form"  :model="form" :rules="rules" label-width="70px">
 | 
			
		||||
    <el-dialog title="创建标注任务" :visible.sync="isOpen" width="700px" append-to-body @close="cancel"
 | 
			
		||||
               :close-on-click-modal="false"
 | 
			
		||||
    >
 | 
			
		||||
      <el-form ref="form" :model="form" :rules="rules" label-width="70px">
 | 
			
		||||
        <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 label="描述" prop="taskDesc">
 | 
			
		||||
          <el-input
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +26,8 @@
 | 
			
		|||
        </el-form-item>
 | 
			
		||||
        <el-form-item label="是否启用标注团队" prop="isStartTeam" label-width="130px">
 | 
			
		||||
          <el-switch
 | 
			
		||||
            v-model="form.isStartTeam">
 | 
			
		||||
            v-model="form.isStartTeam"
 | 
			
		||||
          >
 | 
			
		||||
          </el-switch>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <div v-show="form.isStartTeam">
 | 
			
		||||
| 
						 | 
				
			
			@ -34,20 +37,39 @@
 | 
			
		|||
          <el-form-item label="分配数量" prop="isStartTeam" label-width="100px">
 | 
			
		||||
            <el-table
 | 
			
		||||
              size="mini"
 | 
			
		||||
              :data="tableData">
 | 
			
		||||
              :data="tableData"
 | 
			
		||||
            >
 | 
			
		||||
              <el-table-column
 | 
			
		||||
                prop="date"
 | 
			
		||||
                label="姓名"
 | 
			
		||||
                max-width="180">
 | 
			
		||||
              </el-table-column>
 | 
			
		||||
              <el-table-column
 | 
			
		||||
                prop="name"
 | 
			
		||||
                label="角色"
 | 
			
		||||
                max-width="180">
 | 
			
		||||
                align="center"
 | 
			
		||||
                max-width="180"
 | 
			
		||||
              >
 | 
			
		||||
              </el-table-column>
 | 
			
		||||
              <el-table-column
 | 
			
		||||
                prop="address"
 | 
			
		||||
                label="数量">
 | 
			
		||||
                prop="type"
 | 
			
		||||
                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>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
| 
						 | 
				
			
			@ -58,8 +80,7 @@
 | 
			
		|||
        <el-button @click="cancel">取 消</el-button>
 | 
			
		||||
      </template>
 | 
			
		||||
    </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>
 | 
			
		||||
 | 
			
		||||
</template>
 | 
			
		||||
| 
						 | 
				
			
			@ -71,74 +92,124 @@ import { add } from '@/api/dataCenter/releaseVersion'
 | 
			
		|||
 | 
			
		||||
export default {
 | 
			
		||||
  dicts: ['ai_annotate_type'],
 | 
			
		||||
  components: {selectPersonnelDialog},
 | 
			
		||||
  components: { selectPersonnelDialog },
 | 
			
		||||
  props: {
 | 
			
		||||
    open: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: false,
 | 
			
		||||
      required: true,
 | 
			
		||||
      required: true
 | 
			
		||||
    },
 | 
			
		||||
    datasetId:{
 | 
			
		||||
    datasetNum:{
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 0,
 | 
			
		||||
      required: true,
 | 
			
		||||
      required: true
 | 
			
		||||
    },
 | 
			
		||||
    datasetId: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 0,
 | 
			
		||||
      required: true
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    isOpen: {
 | 
			
		||||
      get() {
 | 
			
		||||
        return this.open;
 | 
			
		||||
        return this.open
 | 
			
		||||
      },
 | 
			
		||||
      set(value) {
 | 
			
		||||
        this.$emit('update:open', value);
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
        this.$emit('update:open', value)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      tableData:[],
 | 
			
		||||
      selectOpen:false,
 | 
			
		||||
      tableData: [],
 | 
			
		||||
      selectOpen: false,
 | 
			
		||||
      form: {}, // 初始化为空
 | 
			
		||||
      rules:{
 | 
			
		||||
        versionName:[
 | 
			
		||||
          { required: true, message: '版本名称不能为空', trigger: 'blur' },
 | 
			
		||||
      rules: {
 | 
			
		||||
        versionName: [
 | 
			
		||||
          { required: true, message: '版本名称不能为空', trigger: 'blur' }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  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() {
 | 
			
		||||
      this.$refs["form"].validate(valid => {
 | 
			
		||||
      this.$refs['form'].validate(valid => {
 | 
			
		||||
        if (valid) {
 | 
			
		||||
          this.form.datasetId = this.datasetId;
 | 
			
		||||
          this.form.datasetId = this.datasetId
 | 
			
		||||
          add(this.form).then(response => {
 | 
			
		||||
            this.$modal.msgSuccess("发布成功");
 | 
			
		||||
            this.cancel();
 | 
			
		||||
            this.$modal.msgSuccess('发布成功')
 | 
			
		||||
            this.cancel()
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    updateData(data){
 | 
			
		||||
      console.log(data)
 | 
			
		||||
    updateData(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() {
 | 
			
		||||
      this.isOpen = false;
 | 
			
		||||
      this.reset();
 | 
			
		||||
      this.$emit('dialog-cancel'); // 通知父组件
 | 
			
		||||
      this.isOpen = false
 | 
			
		||||
      this.reset()
 | 
			
		||||
      this.$emit('dialog-cancel') // 通知父组件
 | 
			
		||||
    },
 | 
			
		||||
    // 表单重置
 | 
			
		||||
    reset() {
 | 
			
		||||
      this.form = {}; // 清空表单
 | 
			
		||||
      this.$refs.form.resetFields(); // 调用 Element UI 的重置方法
 | 
			
		||||
      this.tableData=[];
 | 
			
		||||
      this.form = {} // 清空表单
 | 
			
		||||
      this.$refs.form.resetFields() // 调用 Element UI 的重置方法
 | 
			
		||||
    },
 | 
			
		||||
    // 处理取消事件
 | 
			
		||||
    handleCancel() {
 | 
			
		||||
      this.selectOpen = false;
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
      this.selectOpen = false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,11 +118,13 @@ export default {
 | 
			
		|||
          };
 | 
			
		||||
          this.form.selectReviewer.forEach((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) => {
 | 
			
		||||
            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.cancel();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -152,7 +152,7 @@
 | 
			
		|||
    <!--版本发布-->
 | 
			
		||||
    <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>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
| 
						 | 
				
			
			@ -169,6 +169,7 @@ export default {
 | 
			
		|||
  name: "DataSet",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      datasetNum:0,
 | 
			
		||||
      datasetId: 0,
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
| 
						 | 
				
			
			@ -241,6 +242,7 @@ export default {
 | 
			
		|||
    handleAnnotation(row){
 | 
			
		||||
      this.annotationOpen = true;
 | 
			
		||||
      this.datasetId = row.datasetId;
 | 
			
		||||
      this.datasetNum = row.notAnnotatedCount;
 | 
			
		||||
    },
 | 
			
		||||
    handleUpdate(){
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@
 | 
			
		|||
      :on-change="handleChange"
 | 
			
		||||
      :on-exceed="handleExceed"
 | 
			
		||||
      accept="*"
 | 
			
		||||
      :before-upload="beforeUpload"
 | 
			
		||||
      :directory="true"
 | 
			
		||||
    >
 | 
			
		||||
      <el-row>
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +38,7 @@
 | 
			
		|||
          <span style="margin-left: 2%;font-size: 18px">{{ filename }}</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <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>
 | 
			
		||||
      </div>
 | 
			
		||||
    </el-drawer>
 | 
			
		||||
| 
						 | 
				
			
			@ -147,6 +149,7 @@ export default {
 | 
			
		|||
              uploadNextChunk(); // 上传下一个分片
 | 
			
		||||
            } else {
 | 
			
		||||
              this.startNextUpload(); // 上传下一个文件
 | 
			
		||||
              this.checkAllUploadsComplete(); // 检查是否所有文件上传完成
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
          .catch((error) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +159,14 @@ export default {
 | 
			
		|||
      };
 | 
			
		||||
      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() {
 | 
			
		||||
      Object.keys(this.uploadsNum).forEach(fileName => {
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +180,14 @@ export default {
 | 
			
		|||
      const nextFile = this.queue.shift(); // 获取下一个文件
 | 
			
		||||
      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) {
 | 
			
		||||
      this.$message.warning(`最多只能选择50个文件,当前选择了 ${files.length + fileList.length} 个文件`);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,14 @@
 | 
			
		|||
        @click="dataRecovery"
 | 
			
		||||
        v-hasPermi="['dataCenter:dataSetBasicFile:dataRecovery']"
 | 
			
		||||
      >还原</el-button>
 | 
			
		||||
      <el-button
 | 
			
		||||
        type="danger"
 | 
			
		||||
        plain
 | 
			
		||||
        icon="el-icon-refresh"
 | 
			
		||||
        size="mini"
 | 
			
		||||
        @click="emptyRecycleBin"
 | 
			
		||||
        v-hasPermi="['dataCenter:dataSetBasicFile:dataRecovery']"
 | 
			
		||||
      >清空回收站</el-button>
 | 
			
		||||
    </el-col>
 | 
			
		||||
    <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
 | 
			
		||||
    </el-row>
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +82,7 @@
 | 
			
		|||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { delList, dataRecovery } from "@/api/dataCenter/basicFile";
 | 
			
		||||
import { delList, dataRecovery,emptyRecycleBin} from "@/api/dataCenter/basicFile";
 | 
			
		||||
export default {
 | 
			
		||||
  name: "File",
 | 
			
		||||
  data() {
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +165,14 @@ export default {
 | 
			
		|||
        this.getList();
 | 
			
		||||
        this.$modal.msgSuccess("还原成功");
 | 
			
		||||
      }).catch(() => {});
 | 
			
		||||
    },
 | 
			
		||||
    emptyRecycleBin(){
 | 
			
		||||
      this.$modal.confirm('是否确认清空回收站?').then(function() {
 | 
			
		||||
        return emptyRecycleBin();
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        this.getList();
 | 
			
		||||
        this.$modal.msgSuccess("清空成功");
 | 
			
		||||
      }).catch(() => {});
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue