提交代码
This commit is contained in:
		
							parent
							
								
									5d0e5b692e
								
							
						
					
					
						commit
						959ed2c2c9
					
				| 
						 | 
					@ -41,4 +41,12 @@ export function getAnnotationDetails(data) {
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function listSelection(data) {
 | 
				
			||||||
 | 
					  return request({
 | 
				
			||||||
 | 
					    url: '/ai/annotationTask/list/listSelection',
 | 
				
			||||||
 | 
					    method: 'get',
 | 
				
			||||||
 | 
					    params: data
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
 | 
					      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
 | 
				
			||||||
        <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,10 +24,11 @@
 | 
				
			||||||
            type="datetimerange"
 | 
					            type="datetimerange"
 | 
				
			||||||
            range-separator="至"
 | 
					            range-separator="至"
 | 
				
			||||||
            start-placeholder="开始日期"
 | 
					            start-placeholder="开始日期"
 | 
				
			||||||
            end-placeholder="结束日期">
 | 
					            end-placeholder="结束日期"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
          </el-date-picker>
 | 
					          </el-date-picker>
 | 
				
			||||||
        </el-form-item>
 | 
					        </el-form-item>
 | 
				
			||||||
        <el-form-item label="标注类型" prop="annotateType" >
 | 
					        <el-form-item label="标注类型" prop="annotateType">
 | 
				
			||||||
          <el-select v-model="form.annotateType" placeholder="请选择标注类型" clearable style="width: 100%">
 | 
					          <el-select v-model="form.annotateType" placeholder="请选择标注类型" clearable style="width: 100%">
 | 
				
			||||||
            <el-option v-for="dict in dict.type.ai_annotate_type" :key="dict.value" :label="dict.label"
 | 
					            <el-option v-for="dict in dict.type.ai_annotate_type" :key="dict.value" :label="dict.label"
 | 
				
			||||||
                       :value="dict.value"
 | 
					                       :value="dict.value"
 | 
				
			||||||
| 
						 | 
					@ -35,16 +36,18 @@
 | 
				
			||||||
          </el-select>
 | 
					          </el-select>
 | 
				
			||||||
        </el-form-item>
 | 
					        </el-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <el-form-item label="标签" prop="label" >
 | 
					        <el-form-item label="标签" prop="label">
 | 
				
			||||||
          <treeselect v-model="form.label" :disable-branch-nodes="true"  :multiple="true" :options="labelsListOptions" :normalizer="normalizer" placeholder="请选择父节点" />
 | 
					          <treeselect v-model="form.label" :disable-branch-nodes="true" :multiple="true" :options="labelsListOptions"
 | 
				
			||||||
 | 
					                      :normalizer="normalizer" placeholder="请选择标签"
 | 
				
			||||||
 | 
					          />
 | 
				
			||||||
        </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.startTeam"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
          </el-switch>
 | 
					          </el-switch>
 | 
				
			||||||
        </el-form-item>
 | 
					        </el-form-item>
 | 
				
			||||||
        <div v-show="form.isStartTeam">
 | 
					        <div v-show="form.startTeam">
 | 
				
			||||||
          <el-form-item label="选择标注人员" prop="isStartTeam" label-width="100px">
 | 
					          <el-form-item label="选择标注人员" prop="isStartTeam" label-width="100px">
 | 
				
			||||||
            <el-button type="primary" @click="selectOpen=true">选择标注人员</el-button>
 | 
					            <el-button type="primary" @click="selectOpen=true">选择标注人员</el-button>
 | 
				
			||||||
          </el-form-item>
 | 
					          </el-form-item>
 | 
				
			||||||
| 
						 | 
					@ -103,19 +106,20 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import selectPersonnelDialog from '../child/selectPersonnelDialog.vue'
 | 
					import selectPersonnelDialog from '../child/selectPersonnelDialog.vue'
 | 
				
			||||||
import { add } from '@/api/dataCenter/annotationTask'
 | 
					import { add } from '@/api/dataCenter/annotationTask'
 | 
				
			||||||
import {listDataSetLabels } from "@/api/dataCenter/labels";
 | 
					import { listDataSetLabels } from '@/api/dataCenter/labels'
 | 
				
			||||||
import Treeselect from "@riophae/vue-treeselect";
 | 
					import Treeselect from '@riophae/vue-treeselect'
 | 
				
			||||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 | 
					import '@riophae/vue-treeselect/dist/vue-treeselect.css'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  dicts: ['ai_annotate_type'],
 | 
					  dicts: ['ai_annotate_type'],
 | 
				
			||||||
  components: { selectPersonnelDialog, Treeselect},
 | 
					  components: { selectPersonnelDialog, Treeselect },
 | 
				
			||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    open: {
 | 
					    open: {
 | 
				
			||||||
      type: Boolean,
 | 
					      type: Boolean,
 | 
				
			||||||
      default: false,
 | 
					      default: false,
 | 
				
			||||||
      required: true
 | 
					      required: true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    datasetNum:{
 | 
					    datasetNum: {
 | 
				
			||||||
      type: Number,
 | 
					      type: Number,
 | 
				
			||||||
      default: 0,
 | 
					      default: 0,
 | 
				
			||||||
      required: true
 | 
					      required: true
 | 
				
			||||||
| 
						 | 
					@ -136,10 +140,10 @@ export default {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  watch:{
 | 
					  watch: {
 | 
				
			||||||
    isOpen(newVal, oldVal){
 | 
					    isOpen(newVal, oldVal) {
 | 
				
			||||||
      if (newVal){
 | 
					      if (newVal) {
 | 
				
			||||||
        this.getTreeselect();
 | 
					        this.getTreeselect()
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -149,12 +153,12 @@ export default {
 | 
				
			||||||
      tableData: [],
 | 
					      tableData: [],
 | 
				
			||||||
      // 样本标签管理树选项
 | 
					      // 样本标签管理树选项
 | 
				
			||||||
      labelsListOptions: [],
 | 
					      labelsListOptions: [],
 | 
				
			||||||
      labels:[],
 | 
					      labels: [],
 | 
				
			||||||
      selectOpen: false,
 | 
					      selectOpen: false,
 | 
				
			||||||
      form: {}, // 初始化为空
 | 
					      form: {}, // 初始化为空
 | 
				
			||||||
      rules: {
 | 
					      rules: {
 | 
				
			||||||
        taskName: [
 | 
					        taskName: [
 | 
				
			||||||
          { required: true, message: '版本名称不能为空', trigger: 'blur' }
 | 
					          { required: true, message: '任务名称不能为空', trigger: 'blur' }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        annotateType: [
 | 
					        annotateType: [
 | 
				
			||||||
          { required: true, message: '标注类型不能为空', trigger: 'blur' }
 | 
					          { required: true, message: '标注类型不能为空', trigger: 'blur' }
 | 
				
			||||||
| 
						 | 
					@ -162,7 +166,7 @@ export default {
 | 
				
			||||||
        label: [
 | 
					        label: [
 | 
				
			||||||
          { required: true, message: '请选择标签', trigger: 'blur' }
 | 
					          { required: true, message: '请选择标签', trigger: 'blur' }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        data:[
 | 
					        data: [
 | 
				
			||||||
          { required: true, message: '请选择时间', trigger: 'blur' }
 | 
					          { required: true, message: '请选择时间', trigger: 'blur' }
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -171,61 +175,62 @@ export default {
 | 
				
			||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
    normalizer(node) {
 | 
					    normalizer(node) {
 | 
				
			||||||
      if (node.children && !node.children.length) {
 | 
					      if (node.children && !node.children.length) {
 | 
				
			||||||
        delete node.children;
 | 
					        delete node.children
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
        id: node.labelId,
 | 
					        id: node.labelId,
 | 
				
			||||||
        label: node.labelName,
 | 
					        label: node.labelName,
 | 
				
			||||||
        children: node.children
 | 
					        children: node.children
 | 
				
			||||||
      };
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    /** 查询样本标签管理下拉树结构 */
 | 
					    /** 查询样本标签管理下拉树结构 */
 | 
				
			||||||
    getTreeselect() {
 | 
					    getTreeselect() {
 | 
				
			||||||
      listDataSetLabels({}).then(response => {
 | 
					      listDataSetLabels({}).then(response => {
 | 
				
			||||||
        console.log(response)
 | 
					        console.log(response)
 | 
				
			||||||
        this.labelsListOptions = [];
 | 
					        this.labelsListOptions = []
 | 
				
			||||||
        const menu = { labelId: 0, labelName: '主类目', children: [] };
 | 
					        const menu = { labelId: 0, labelName: '主类目', children: [] }
 | 
				
			||||||
        menu.children = this.handleTree(response.data, "labelId");
 | 
					        menu.children = this.handleTree(response.data, 'labelId')
 | 
				
			||||||
        this.labelsListOptions.push(menu);
 | 
					        this.labelsListOptions.push(menu)
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getReviewerMax(row) {
 | 
					    getReviewerMax(row) {
 | 
				
			||||||
      // 假设总数是 this.datasetNum,其他值可以从 tableData 动态计算
 | 
					      // 假设总数是 this.datasetNum,其他值可以从 tableData 动态计算
 | 
				
			||||||
      const totalAssigned = this.tableData
 | 
					      const totalAssigned = this.tableData
 | 
				
			||||||
        .filter(item => item.type === '0' &&  item.id !== row.id)
 | 
					        .filter(item => item.type === '0' && item.id !== row.id)
 | 
				
			||||||
        .reduce((sum, item) => sum + item.num, 0);
 | 
					        .reduce((sum, item) => sum + item.num, 0)
 | 
				
			||||||
      return this.datasetNum - totalAssigned;
 | 
					      return this.datasetNum - totalAssigned
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getLabelingMax(row) {
 | 
					    getLabelingMax(row) {
 | 
				
			||||||
      const totalAssigned = this.tableData
 | 
					      const totalAssigned = this.tableData
 | 
				
			||||||
        .filter(item => item.type === '1' && item.id !== row.id)
 | 
					        .filter(item => item.type === '1' && item.id !== row.id)
 | 
				
			||||||
        .reduce((sum, item) => sum + item.num, 0);
 | 
					        .reduce((sum, item) => sum + item.num, 0)
 | 
				
			||||||
      return this.datasetNum - totalAssigned;
 | 
					      return this.datasetNum - totalAssigned
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    // 数据提交
 | 
					    // 数据提交
 | 
				
			||||||
    submitForm() {
 | 
					    submitForm() {
 | 
				
			||||||
      if (this.tableData.length === 0 && this.form.isStartTeam) {
 | 
					      if (this.tableData.length === 0 && this.form.isStartTeam) {
 | 
				
			||||||
        this.$modal.msgWarning('请选择人员')
 | 
					        this.$modal.msgWarning('请选择人员')
 | 
				
			||||||
        return;
 | 
					        return
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      this.$refs['form'].validate(valid => {
 | 
					      this.$refs['form'].validate(valid => {
 | 
				
			||||||
        if (valid) {
 | 
					        if (valid) {
 | 
				
			||||||
          this.form.labels=this.form.label.join(",")
 | 
					          this.form.labels = this.form.label.join(',')
 | 
				
			||||||
          if(this.form.isStartTeam){
 | 
					          this.form.isStartTeam = this.form.startTeam ? '1' : '0'
 | 
				
			||||||
              let annotators = [];
 | 
					          if (this.form.isStartTeam) {
 | 
				
			||||||
              let reviewers =[];
 | 
					            let annotators = []
 | 
				
			||||||
              this.tableData.forEach((item) => {
 | 
					            let reviewers = []
 | 
				
			||||||
                  if (item.type === '0') {
 | 
					            this.tableData.forEach((item) => {
 | 
				
			||||||
                    reviewers.push(item);
 | 
					              if (item.type === '0') {
 | 
				
			||||||
                  }
 | 
					                reviewers.push(item)
 | 
				
			||||||
                if (item.type === '1') {
 | 
					              }
 | 
				
			||||||
                  annotators.push(item);
 | 
					              if (item.type === '1') {
 | 
				
			||||||
                }
 | 
					                annotators.push(item)
 | 
				
			||||||
              })
 | 
					              }
 | 
				
			||||||
            this.form.annotators = annotators;
 | 
					            })
 | 
				
			||||||
            this.form.reviewers = annotators;
 | 
					            this.form.annotators = annotators
 | 
				
			||||||
 | 
					            this.form.reviewers = annotators
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          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()
 | 
				
			||||||
| 
						 | 
					@ -235,11 +240,11 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    updateData(data) {
 | 
					    updateData(data) {
 | 
				
			||||||
      this.tableData = []
 | 
					      this.tableData = []
 | 
				
			||||||
      let num = Math.max(data.selectReviewer.length,data.selectLabeling.length)
 | 
					      let num = Math.max(data.selectReviewer.length, data.selectLabeling.length)
 | 
				
			||||||
      let minNum = Math.floor(this.datasetNum / num) // 基础分配
 | 
					      let minNum = Math.floor(this.datasetNum / num) // 基础分配
 | 
				
			||||||
      if (minNum < 1) {
 | 
					      if (minNum < 1) {
 | 
				
			||||||
        this.$modal.msgWarning('每人最少分配1张');
 | 
					        this.$modal.msgWarning('每人最少分配1张')
 | 
				
			||||||
        return;
 | 
					        return
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // 处理 Reviewer 的分配
 | 
					      // 处理 Reviewer 的分配
 | 
				
			||||||
      let reviewerRemainder = this.datasetNum % data.selectReviewer.length // 余数
 | 
					      let reviewerRemainder = this.datasetNum % data.selectReviewer.length // 余数
 | 
				
			||||||
| 
						 | 
					@ -275,7 +280,7 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    // 表单重置
 | 
					    // 表单重置
 | 
				
			||||||
    reset() {
 | 
					    reset() {
 | 
				
			||||||
      this.tableData=[];
 | 
					      this.tableData = []
 | 
				
			||||||
      this.form = {} // 清空表单
 | 
					      this.form = {} // 清空表单
 | 
				
			||||||
      this.$refs.form.resetFields() // 调用 Element UI 的重置方法
 | 
					      this.$refs.form.resetFields() // 调用 Element UI 的重置方法
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue