tangning 3 週間 前
コミット
28a4cbce24
2 ファイル変更87 行追加3 行削除
  1. 52 0
      src/utils/file/download.ts
  2. 35 3
      src/views/work/query.vue

+ 52 - 0
src/utils/file/download.ts

@@ -144,3 +144,55 @@ export function downloadByUrl({
   openWindow(url, { target });
   return true;
 }
+
+export async function downloadImage(imgUrl, fileName) {
+  try {
+    // 1. 请求图片资源(获取Blob)
+    const response = await fetch(imgUrl, {
+      headers: {
+        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
+      },
+      mode: 'cors', // 跨域需要服务端配置Access-Control-Allow-Origin
+      credentials: 'omit'
+    });
+
+    if (!response.ok) {
+      throw new Error(`请求失败:${response.status}`);
+    }
+
+    // 2. 获取Blob数据并识别文件类型
+    const blob = await response.blob();
+    const fileType = blob.type || 'image/png'; // 默认png
+    const ext = fileType.split('/')[1] || 'png'; // 提取后缀(jpg/png/gif等)
+
+    // 3. 创建临时下载链接
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    // 核心:设置download属性实现重命名(自动拼接后缀)
+    a.download = `${fileName}.${ext}`;
+    a.style.display = 'none';
+    document.body.appendChild(a);
+
+    // 4. 触发下载
+    a.click();
+
+    // 5. 清理临时资源
+    document.body.removeChild(a);
+    URL.revokeObjectURL(url);
+
+    console.log(`图片下载成功:${fileName}.${ext}`);
+  } catch (error) {
+    console.error('图片下载失败:', error.message);
+    // 兼容方案:跨域无CORS时降级处理(新开窗口)
+    if (error.message.includes('CORS') || error.message.includes('跨域')) {
+      const a = document.createElement('a');
+      a.href = imgUrl;
+      a.target = '_blank';
+      document.body.appendChild(a);
+      a.click();
+      document.body.removeChild(a);
+      alert('当前图片跨域且未配置CORS,已为你打开图片页面,请手动右键保存并重命名');
+    }
+  }
+}

+ 35 - 3
src/views/work/query.vue

@@ -21,6 +21,7 @@
       <BasicTable @register="registerTable" v-show="tableType == null">
         <template #toolbar>
           <a-button type="primary" @click="handleExport"> 导出</a-button>
+          <a-button type="primary" @click="handleExportImg"> 批量导出签收图片</a-button>
         </template>
         <template #action="{ record }">
           <TableAction
@@ -75,6 +76,7 @@
   import recoveryModal from './recoveryModal.vue';
   import { useModal } from '/@/components/Modal';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import { downloadImage } from '/@/utils/file/download';
   import { useRouter } from 'vue-router';
   import { queryList, faultAllList, getByRoleType } from '/@/api/spares';
   import { DownExport } from '/@/api/equity';
@@ -93,7 +95,7 @@
       const { t } = useI18n();
       const permissionStore = usePermissionStore();
       const router = useRouter();
-      const { createConfirm } = useMessage();
+      const { createConfirm, createMessage } = useMessage();
       const { getCheckPerm } = permissionStore;
       const tableType = ref<Recordable>(null); //0看看 、1看见、2深时
       onMounted(() => {
@@ -519,11 +521,15 @@
         schemas: getSchemas(false),
       };
       const [registerRecovery, { openModal }] = useModal();
-      const [registerTable, { reload: reload0 }] = useTable({
+      const [registerTable, { reload: reload0, getSelectRows }] = useTable({
         api: queryList,
         columns: columns,
         useSearchForm: true,
-        // searchInfo: { status: tableType },
+        rowSelection: {
+          type: 'checkbox',
+          getCheckboxProps: getrowSelection,
+        },
+        searchInfo: { status: tableType },
         formConfig: searchForm,
         showTableSetting: true,
         showIndexColumn: false,
@@ -554,6 +560,12 @@
       onActivated(() => {
         reload();
       });
+      function getrowSelection(record) {
+        return {
+          disabled: record.status != 110, // Column configuration not to be checked
+          name: record.name,
+        };
+      }
       const reload = () => {
         reload1();
         reload0();
@@ -567,6 +579,25 @@
           ...record,
         });
       }
+      function handleExportImg() {
+        let list = getSelectRows();
+        if (list.length == 0) {
+          createMessage.error('请选择一条数据');
+          return;
+        }
+        list.map((item) => {
+          if (item.sendTrackingImgArray) {
+            item.sendTrackingImgArray.map((ele, index) => {
+              downloadImage(
+                ele,
+                `${item.repairId} ${item.customerName || ''}_${item.sendTrackingNum || ''}${
+                  index + 1
+                }.jpg`,
+              );
+            });
+          }
+        });
+      }
       function changeTable(val: string) {
         tableType.value = val;
         if (tableType.value == null) {
@@ -598,6 +629,7 @@
         handleRecover,
         registerRecovery,
         handleExport,
+        handleExportImg,
       };
     },
   });