无人机管理后台前端(已迁走)
shuishen
2025-04-28 e8c0b3c2c024b0ed12fa371fc69019c0849083c9
Merge branch 'test' of http://139.196.74.78:10010/r/drone/drone-web-manage into test
2 files modified
214 ■■■■■ changed files
src/views/system/dept.vue 91 ●●●●● patch | view | raw | blame | history
src/views/tickets/ticket.vue 123 ●●●● patch | view | raw | blame | history
src/views/system/dept.vue
@@ -482,31 +482,39 @@
        this.selectionList = [];
        this.$refs.crud.toggleSelection();
      },
      beforeOpen(done, type) {
        if (['add', 'edit'].includes(type)) {
          this.initData();
        }
        if (['edit', 'view'].includes(type)) {
          getDept(this.form.id).then((res) => {
            const areaCode = res.data.data.areaCode;
            const areaName = res.data.data.areaName;
            // 生成完整的行政区划代码
            const fullAreaCode = this.getFullAreaCode(areaCode);
            this.form = Object.assign({}, res.data.data, {
              hasChildren: this.form.hasChildren,
              // 使用完整的行政区划代码
              areaCode: fullAreaCode,
              areaName: areaName || '',
            });
          });
        } else if (type === 'add') {
          this.form.areaCode = '';
          this.form.areaName = '';
        }
        done();
      },
// 修改 beforeOpen 方法
beforeOpen(done, type) {
  if (['add', 'edit'].includes(type)) {
    this.initData();
  }
  if (['edit', 'view'].includes(type)) {
    getDept(this.form.id).then((res) => {
      const data = res.data.data;
      const areaCode = data.areaCode;
      const areaName = data.areaName;
      // 生成完整的行政区划代码(考虑不同级别)
      const fullAreaCode = this.getFullAreaCode(areaCode);
      this.form = Object.assign({}, data, {
        hasChildren: this.form.hasChildren,
        areaCode: fullAreaCode,
        areaName: areaName || '',
      });
      // 调试输出
      console.log('回显数据:', {
        originalAreaCode: areaCode,
        fullAreaCode: fullAreaCode,
        areaName: areaName
      });
    });
  } else if (type === 'add') {
    this.form.areaCode = '';
    this.form.areaName = '';
  }
  done();
},
      beforeClose(done) {
        this.parentId = '';
        const column = this.findObject(this.option.column, 'parentId');
@@ -559,14 +567,31 @@
          resolve(res.data.data);
        });
      },
      // 新增:获取完整的行政区划代码
      getFullAreaCode(countyCode) {
        if (!countyCode) return '';
        // 县级代码是12位,省级代码取前2位,市级代码取前4位
        const provinceCode = countyCode.substring(0, 2) + '0000000000';
        const cityCode = countyCode.substring(0, 4) + '00000000';
        return `${provinceCode},${cityCode},${countyCode}`;
      },
// 修改 getFullAreaCode 方法
getFullAreaCode(areaCode) {
  if (!areaCode) return '';
  // 根据编码长度判断层级
  const code = areaCode.toString();
  // 如果已经是完整的逗号分隔格式,直接返回
  if (code.includes(',')) return code;
  // 处理不同级别的编码
  if (code.endsWith('0000000000')) {
    // 省级编码
    return code;
  } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
    // 市级编码
    const provinceCode = code.substring(0, 2) + '0000000000';
    return `${provinceCode},${code}`;
  } else {
    // 县级编码
    const provinceCode = code.substring(0, 2) + '0000000000';
    const cityCode = code.substring(0, 4) + '00000000';
    return `${provinceCode},${cityCode},${code}`;
  }
},
    },
  };
  </script>
src/views/tickets/ticket.vue
@@ -980,7 +980,7 @@
            startTime: item.create_time,
            aiType: item.ai_types,
            content: item.content, // 将后端返回的 content 映射为 content
            type: this.types.find(t => t.value === item.event_dict_key)?.label,
            type: this.types.find(t => t.value === item.work_order_type_dict_key)?.label,
            keyData: (!isNaN(longitude) && !isNaN(latitude))
              ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
              : '未知位置',
@@ -1032,7 +1032,7 @@
          return;
        }
        // 验证图片上传
        // 修改图片验证逻辑
        if (!this.form.photos || this.form.photos.length === 0) {
          this.$message.warning('请上传工单图片');
          return;
@@ -1045,7 +1045,7 @@
          longitude: String(this.form.location[0]),
          latitude: String(this.form.location[1]),
          address: this.form.address,
          eventDictKey: this.form.type,
          workOrderTypeDictKey: this.form.type,
          aiType: Array.isArray(this.form.algorithm) ? this.form.algorithm : [this.form.algorithm], // 传数组
          updateUser: this.form.handler,
          createDept: this.form.department,
@@ -1056,9 +1056,17 @@
          submitData.id = this.form.id;
        }
        // 获取文件对象
        const file = this.form.photos[0].raw;
        if (!file) {
        // 修改获取文件的逻辑
        let file = null;
        const photoInfo = this.form.photos[0];
        if (photoInfo.raw) {
          // 如果有新上传的文件,使用新文件
          file = photoInfo.raw;
        } else if (photoInfo.existingUrl) {
          // 如果是已存在的图片,将URL添加到提交数据中
          submitData.photoUrl = photoInfo.existingUrl;
        } else {
          this.$message.warning('图片文件无效,请重新上传');
          return;
        }
@@ -1099,8 +1107,10 @@
          longitude: this.form.location?.[0] ? String(this.form.location[0]) : undefined,
          latitude: this.form.location?.[1] ? String(this.form.location[1]) : undefined,
          address: this.form.address || undefined,
          eventDictKey: this.form.type || undefined,
          aiType: Array.isArray(this.form.algorithm) ? this.form.algorithm : [this.form.algorithm], // 传数组
          workOrderTypeDictKey: this.form.type || undefined,
          aiType: this.form.algorithm && this.form.algorithm.length > 0
            ? this.form.algorithm
            : undefined, // 传数组
          updateUser: handlerValue,
          createDept: this.form.department || undefined,
          isDraft: 1
@@ -1461,7 +1471,7 @@
              发起时间: item.create_time || '',
              关联算法: item.ai_types || '',
              工单内容: item.address || '',
              工单类型: this.types.find(t => t.value === item.event_dict_key)?.label || '',
              工单类型: this.types.find(t => t.value === item.work_order_type_dict_key)?.label || '',
              经纬度: (!isNaN(longitude) && !isNaN(latitude)) ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}` : '',
              创建人: item.create_user || '',
              处理人: item.update_user || '',
@@ -1508,8 +1518,12 @@
    // 文件改变时的钩子
    handleFileChange(file, fileList) {
      this.form.photos = fileList;
      this.currentDetail.photos = fileList;
      // 保持最新的文件列表
      this.form.photos = fileList.map(item => ({
        ...item,
        existingUrl: item.url && !item.raw ? item.url : null // 标记已存在的图片URL
      }));
      this.currentDetail.photos = this.form.photos;
    },
    // 文件移除时的钩子
@@ -1803,7 +1817,7 @@
      }
      // 获取工单类型值 - 从types中找到匹配的值
      const typeValue = this.types.find(t => t.label === row.type)?.value || row.event_dict_key;
      const typeValue = this.types.find(t => t.label === row.type)?.value || row.work_order_type_dict_key;
      // 获取处理人ID - 使用userNameToIdMap映射
      const handlerId = this.userNameToIdMap[row.handler] || row.handler;
@@ -1817,26 +1831,47 @@
        映射后类型值: typeValue
      });
      // 修改算法数组的处理逻辑
      let algorithmArr = [];
      if (Array.isArray(row.aiType)) {
        algorithmArr = row.aiType;
      } else if (typeof row.aiType === 'string' && row.aiType) {
        algorithmArr = row.aiType.split(',').map(i => i.trim());
      }
      this.form = {
        id: row.id,
        name: row.orderName,
        type: typeValue,
        department: deptId,
        handler: handlerId, // 使用映射后的处理人ID
        algorithm: algorithmArr, // 回显为数组
        location: Array.isArray(row.location) && row.location.length >= 2
          ? [Number(row.location[0]), Number(row.location[1])]
          : [],
        address: row.address || '',
        content: row.content,
        photos: [],
      };
  if (Array.isArray(row.aiType)) {
    algorithmArr = row.aiType;
  } else if (typeof row.aiType === 'string' && row.aiType) {
    // 首先尝试将字符串按照逗号或顿号分割
    algorithmArr = row.aiType.split(/[,、]/).map(item => item.trim());
  }
  // 确保算法值与选项匹配
  algorithmArr = algorithmArr.map(item => {
    // 如果是字符串值,尝试找到对应的 dict_key
    if (typeof item === 'string') {
      const matchedAlgorithm = this.algorithms.find(
        algo => algo.dict_value === item || algo.dict_key === item
      );
      return matchedAlgorithm ? matchedAlgorithm.dict_key : item;
    }
    return item;
  }).filter(Boolean); // 过滤掉无效值
  console.log('算法处理:', {
    原始值: row.aiType,
    分割后: algorithmArr,
  });
  this.form = {
    id: row.id,
    name: row.orderName,
    type: typeValue,
    department: deptId,
    handler: handlerId,
    algorithm: algorithmArr,
    location: Array.isArray(row.location) && row.location.length >= 2
      ? [Number(row.location[0]), Number(row.location[1])]
      : [],
    address: row.address || '',
    content: row.content,
    photos: [],
  };
      this.form.location = Array.isArray(row.location) && row.location.length >= 2
        ? [
          Number(row.location[0]),
@@ -1853,14 +1888,36 @@
      }
      // 如果有图片,添加到表单中
      if (row.photo_url) {
        // 创建一个带有必要信息的文件对象
        this.form.photos = [{
          name: 'existing-photo',
          url: row.photo_url
          name: 'existing-photo.jpg', // 添加默认扩展名
          url: row.photo_url,         // 用于预览的URL
          status: 'success',          // 标记为已上传成功
          raw: null,                  // 初始化为null
          existingUrl: row.photo_url  // 保存原始URL,用于区分是否为已存在的图片
        }];
      }
      // 调试输出
      console.log('编辑表单数据:', {
        原始算法值: row.aiType,
        处理后算法值: algorithmArr,
        表单数据: this.form
      });
      this.dialogVisible = true;
    },
    // 添加数据监听以确保算法数据的响应性
    watch: {
      'form.algorithm': {
        handler(newVal) {
          console.log('算法值变化:', newVal);
        },
        deep: true
      }
    },
    // 添加删除方法
    handleDelete(row) {
      this.$confirm('确认删除该工单?', '提示', {