diff --git a/apps/dmp/core/domain/User/UserService.ts b/apps/dmp/core/domain/User/UserService.ts index 9177a99..b8c55d1 100644 --- a/apps/dmp/core/domain/User/UserService.ts +++ b/apps/dmp/core/domain/User/UserService.ts @@ -17,8 +17,9 @@ export class UserService { async signIn(user: Pick) { const { code, data, msg } = await this.userRepository.authLogin(user); - this.user.signIn(data as User); - return { success: code === 0, msg, data: data as User }; + const success = code === 0; + if (success) this.user.signIn(data as User); + return { success, msg, data: data as User }; } /** diff --git a/apps/dmp/core/domain/User/entities/User.ts b/apps/dmp/core/domain/User/entities/User.ts index 21f2495..07ce0c5 100644 --- a/apps/dmp/core/domain/User/entities/User.ts +++ b/apps/dmp/core/domain/User/entities/User.ts @@ -35,9 +35,9 @@ export class User { } /** - * 获取角色菜单 + * 获取用户拥有的角色名数组 */ - getRolesName() { + getRolesNames() { return this.roles?.map((r: { name: string }) => r.name); } } diff --git a/apps/dmp/src/modules/Admin/Dicom/Upload/DicomUploader/index.tsx b/apps/dmp/src/modules/Admin/Dicom/Upload/DicomUploader/index.tsx index 39cc2a2..0c94128 100644 --- a/apps/dmp/src/modules/Admin/Dicom/Upload/DicomUploader/index.tsx +++ b/apps/dmp/src/modules/Admin/Dicom/Upload/DicomUploader/index.tsx @@ -1,7 +1,7 @@ import React, { useRef, useState } from "react"; import { Study, parseDcmFiles } from "./util"; import { Button } from "antd"; -import { CloudUploadOutlined } from "@ant-design/icons"; +import { FolderOutlined } from "@ant-design/icons"; declare module "react" { interface InputHTMLAttributes extends HTMLAttributes { @@ -59,11 +59,11 @@ export const useDicomUploader = () => { onChange={(e) => handleFileChange(e)} /> ); diff --git a/apps/dmp/src/modules/Admin/Dicom/Upload/index.tsx b/apps/dmp/src/modules/Admin/Dicom/Upload/index.tsx index d33febe..dbafffd 100644 --- a/apps/dmp/src/modules/Admin/Dicom/Upload/index.tsx +++ b/apps/dmp/src/modules/Admin/Dicom/Upload/index.tsx @@ -1,4 +1,14 @@ -import { Button, Col, Divider, Modal, Row, Select, Space, Spin } from "antd"; +import { + Button, + Col, + Divider, + Modal, + Progress, + Row, + Select, + Space, + message, +} from "antd"; import { useDicomUploader } from "./DicomUploader"; import { Series, Study } from "./DicomUploader/util"; import { DicomTable } from "./DicomTable"; @@ -7,7 +17,8 @@ import { Typography } from "antd"; import { useState } from "react"; import { User } from "@@/domain/User/entities/User"; import { limitConcurrency } from "./limitConcurrency"; -import { useProgress } from "./useProgress"; +import { CloudUploadOutlined, InboxOutlined } from "@ant-design/icons"; +import { openOHIFViewer, flatternStudies, FlatStudyItem } from "./util"; const { Text } = Typography; @@ -15,21 +26,9 @@ interface DicomUploadProps { children?: JSX.Element; } -/** - * 新窗口打开ohif阅片 - */ -const openOHIFViewer = ( - StudyInstanceUID: string, - SeriesInstanceUID: string -) => { - const target = `http://localhost:3000/viewer/${StudyInstanceUID}?SeriesInstanceUID=${SeriesInstanceUID}`; - window.open(target, "_blank"); -}; - export const DicomUpload = (props: DicomUploadProps) => { + const [messageApi, contextHolder] = message.useMessage(); const { UploadInput, fileCalculator, studys, isLoading } = useDicomUploader(); - const { ProgressModal, showProgress, hideProgress, updatePercent } = - useProgress(); const { dicomDomainService, userDomainService } = useDomain(); const { dcmFileNum, totalFileNum, dcmFileSize } = fileCalculator; const [selectRows, setSelectedRows] = useState([]); @@ -38,7 +37,12 @@ export const DicomUpload = (props: DicomUploadProps) => { const [selectAnnotator, setSelectAnnotator] = useState( undefined ); + const [visible, setVisible] = useState(false); + const [percent, setPercent] = useState(0); + /** + * 单个序列阅片 + */ const onUploadFiles = async (study: Study, series: Series) => { const { SeriesInstanceUID, subs } = series; const { StudyInstanceUID } = study; @@ -50,20 +54,60 @@ export const DicomUpload = (props: DicomUploadProps) => { if (instances.length === subs.length) { openOHIFViewer(StudyInstanceUID, SeriesInstanceUID); } else { - const uploadFunc = (f: File) => () => dicomDomainService.upload2Pacs(f); - showProgress(); + setVisible(true); limitConcurrency( - series.subs.map(uploadFunc), + series.subs.map((f: File) => () => dicomDomainService.upload2Pacs(f)), 10, (completed, total) => { console.log(`${completed} out of ${total} tasks completed.`); - updatePercent(Math.floor((completed / total) * 100)); + setPercent(Math.floor((completed / total) * 100)); }, - () => hideProgress() + () => { + setVisible(false); + setPercent(0); + openOHIFViewer(StudyInstanceUID, SeriesInstanceUID); + } ); } }; + /** + * 上传全部 + */ + const onUploadEntiredDicom = () => { + const items = flatternStudies(studys); + // 过滤存在pacs中的序列 + const checkExistPromises = items.map( + (item) => + new Promise(async (resolve) => { + const instances = await dicomDomainService.existInPacs({ + SeriesInstanceUID: item.SeriesInstanceUID, + StudyInstanceUID: item.StudyInstanceUID, + }); + const existInPacs = instances.length === item.Files.length; + resolve(existInPacs ? false : item); + }) + ) as Promise[]; + // 上传到pacs + Promise.all(checkExistPromises).then((result) => { + const files = result.map((i) => (!i ? [] : i.Files)).flat(); + if (files.length === 0) return messageApi.info("全部影像均已存在pacs中"); + setVisible(true); + limitConcurrency( + files.map((f: File) => () => dicomDomainService.upload2Pacs(f)), + 10, + (completed, total) => { + console.log(`${completed} out of ${total} tasks completed.`); + setPercent(Math.floor((completed / total) * 100)); + }, + () => { + setVisible(false); + setPercent(0); + } + ); + }); + }; + const onClickAssign = () => { userDomainService.getDmpAnnotators().then((res) => { setIsModalOpen(true); @@ -71,15 +115,19 @@ export const DicomUpload = (props: DicomUploadProps) => { }); }; - const dcmFileInfo = !!totalFileNum && ( - - 扫描总文件数: {totalFileNum} - - 包含: {dcmFileNum} 个dicom文件 - - dcm文件总体积: {dcmFileSize} - - ); + /** + * 统计信息 + */ + const DicomFileInfo = () => + !!totalFileNum && ( + + 扫描总文件数: {totalFileNum} + + 包含: {dcmFileNum} 个dicom文件 + + dcm文件总体积: {dcmFileSize} + + ); /** * 分配任务 @@ -98,6 +146,15 @@ export const DicomUpload = (props: DicomUploadProps) => { +