From 6c02793d2fe3423c3c097390955fa59bc5790fe9 Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Wed, 5 Nov 2025 16:33:03 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90LiLi=E3=80=91=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E5=BD=B1=E5=83=8F=E6=8B=96=E6=8B=BD=E4=B8=8A=E4=BC=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/utils/index.js | 26 +
.../trial-document/components/uploadFiles.vue | 119 +++--
.../components/uploadClinicalData.vue | 88 ++--
.../components/uploadDicomFiles2.vue | 489 ++++++++++--------
.../components/uploadNonDicomFiles.vue | 120 +++--
5 files changed, 492 insertions(+), 350 deletions(-)
diff --git a/src/utils/index.js b/src/utils/index.js
index 792ed76a..2cf77d16 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -196,4 +196,30 @@ export function workSpeedclose(isForce = false) {
lastPercentage = 0;
imageId = null;
percentageById = {};
+}
+export async function readEntry(entry) {
+ const files = [];
+
+ // 如果是文件夹,创建读取器并递归读取其内容
+ if (entry.isDirectory) {
+ const directoryReader = entry.createReader();
+ const entries = await new Promise((resolve, reject) => {
+ directoryReader.readEntries(resolve, reject); // readEntries是异步的
+ });
+
+ // 递归读取文件夹内的每一项
+ for (const subEntry of entries) {
+ const subFiles = await readEntry(subEntry);
+ files.push(...subFiles);
+ }
+ }
+ // 如果是文件,则将其转换为File对象
+ else if (entry.isFile) {
+ const file = await new Promise((resolve, reject) => {
+ entry.file(resolve, reject); // entry.file()是异步的
+ });
+ files.push(file);
+ }
+
+ return files;
}
\ No newline at end of file
diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue
index 7a61f8f9..22cfa3d6 100644
--- a/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue
+++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue
@@ -30,49 +30,52 @@
-
-
-
-
-
-
-
-
-
- {{
- scope.row.size && scope.row.size > 0
- ? `${(scope.row.size / 1024 / 1024).toFixed(3)}MB`
- : '0MB'
- }}
-
-
-
-
-
-
-
- {{ $fd('NoneDicomUploadStatus', scope.row.status) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -91,6 +94,7 @@
import baseModel from '@/components/BaseModel'
import { deepClone } from '@/utils/index.js'
import store from '@/store'
+import { readEntry } from '@/utils/index'
export default {
name: 'uploadFiles',
props: {
@@ -131,16 +135,41 @@ export default {
}
},
methods: {
+ handleDragover(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ },
+ handleDrop(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ this.beginScanFiles(e, true)
+ },
// 获取待上传文件信息
handleSelectionChange(selection) {
this.selectArr = selection
},
// 扫描待上传文件
- beginScanFiles(e) {
+ async beginScanFiles(e, isDrop = false) {
if (this.fileInput) {
this.fileInput = null
}
- var files = [...e.target.files]
+ var files = []
+ if (isDrop) {
+ const items = e.dataTransfer.items;
+ const allFiles = []; // 用于存储所有找到的文件
+
+ // 遍历拖拽项
+ for (const item of items) {
+ const entry = item.webkitGetAsEntry(); // 获取文件系统入口
+ if (entry) {
+ const files = await readEntry(entry); // 递归读取入口内容
+ allFiles.push(...files);
+ }
+ }
+ files = allFiles
+ } else {
+ files = [...e.target.files]
+ }
if (this.limitLength && this.fileList.length >= this.limitLength)
return this.$message.warning(
this.$t('trials:trialDocument:message:limitLength')
diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue
index 28c0101b..dbbc8e51 100644
--- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue
+++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue
@@ -2,8 +2,8 @@
@@ -180,32 +180,36 @@
" />
-
-
-
-
-
-
-
- {{
- $FormatSize(scope.row.Size)
+ handleDrop(e, cd.Id, cd.ClinicalDataTrialSetId)">
+
+
+
+
+
+
+
+ {{
+ $FormatSize(scope.row.Size)
}}
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -274,6 +278,7 @@ import PreviousFiles from "./previousFiles";
import clinicalDataQuestions from "@/components/clinicalDataQuestions";
import PreviewFile from "@/components/PreviewFile/index";
import moment from "moment";
+import { readEntry } from '@/utils/index'
export default {
name: "ClinicalData",
components: {
@@ -333,14 +338,39 @@ export default {
this.getClinicalData();
},
methods: {
- beginScanFiles(e, id, clinicalDataTrialSetId) {
+ handleDragover(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ },
+ handleDrop(e, id, clinicalDataTrialSetId) {
+ e.stopPropagation();
+ e.preventDefault();
+ this.beginScanFiles(e, id, clinicalDataTrialSetId, true)
+ },
+ async beginScanFiles(e, id, clinicalDataTrialSetId, isDrop = false) {
this.currentRow = {
Id: id,
ClinicalDataTrialSetId: clinicalDataTrialSetId,
SubjectId: this.data.SubjectId,
};
this.currentRow.TrialId = this.$route.query.trialId;
- var files = e.target.files;
+ var files = [];
+ if (isDrop) {
+ const items = e.dataTransfer.items;
+ const allFiles = []; // 用于存储所有找到的文件
+
+ // 遍历拖拽项
+ for (const item of items) {
+ const entry = item.webkitGetAsEntry(); // 获取文件系统入口
+ if (entry) {
+ const files = await readEntry(entry); // 递归读取入口内容
+ allFiles.push(...files);
+ }
+ }
+ files = allFiles
+ } else {
+ files = e.target.files
+ }
this.fileList = [];
for (var i = 0; i < files.length; ++i) {
const fileName = files[i].name;
diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue
index 839190c1..cb076822 100644
--- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue
+++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue
@@ -142,257 +142,259 @@
-
-
-