From 2caf55facc20a24baf3a8eb37e91da0e466c1061 Mon Sep 17 00:00:00 2001 From: mozzie Date: Tue, 3 Sep 2024 14:10:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=8A=E4=BC=A0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=8C=AA=E5=88=B0=E5=90=8E=E7=AB=AF=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/electron/core/auth.ts | 8 +++++ apps/desktop/electron/ipcMainHandlers.ts | 18 ++++++++-- apps/desktop/electron/main.ts | 2 ++ apps/desktop/package.json | 3 +- .../src/pages/Datasource/SeriesTable.tsx | 33 +++++++++--------- apps/desktop/src/pages/Datasource/index.tsx | 34 +++++++++++++------ pnpm-lock.yaml | 8 +++++ 7 files changed, 76 insertions(+), 30 deletions(-) create mode 100644 apps/desktop/electron/core/auth.ts diff --git a/apps/desktop/electron/core/auth.ts b/apps/desktop/electron/core/auth.ts new file mode 100644 index 0000000..8565477 --- /dev/null +++ b/apps/desktop/electron/core/auth.ts @@ -0,0 +1,8 @@ +import { machineIdSync } from "node-machine-id"; + +// Asyncronous call with async/await or Promise + +export const getMachineId = async () => { + const id = await machineIdSync(); + console.log(id); +}; diff --git a/apps/desktop/electron/ipcMainHandlers.ts b/apps/desktop/electron/ipcMainHandlers.ts index 4171f62..11e5424 100644 --- a/apps/desktop/electron/ipcMainHandlers.ts +++ b/apps/desktop/electron/ipcMainHandlers.ts @@ -50,6 +50,9 @@ const registerIpcMainHandlers = ( running ? pythonManager.startFlask() : pythonManager.stopFlask(); }); + /** + * 显示选择文件夹的dialog + */ ipcMain.on("import-dicom-dialog-visible", async (event) => { const result = await dialog.showOpenDialog({ properties: ["openDirectory"], @@ -57,6 +60,7 @@ const registerIpcMainHandlers = ( if (result.canceled) return null; const filePaths = result.filePaths[0]; event.reply("scan-start"); + const scanTimeStart = Date.now(); const dcmPaths = await findDcmFiles(filePaths); const batchSize = os.cpus().length * 1 || 10; const items = await processFilesInBatches(dcmPaths, batchSize); @@ -71,12 +75,22 @@ const registerIpcMainHandlers = ( ); existSeries ? Object.assign(existSeries, item, { updateTime: changeTime }) - : db.data.series.push({ ...item, createTime: changeTime }); + : db.data.series.push({ + ...item, + createTime: changeTime, + updateTime: changeTime, + }); await db.write(); } - event.reply("scan-progress-done", structDicom); + event.reply("scan-progress-done", { + structDicom, + scanDuration: Date.now() - scanTimeStart, + }); }); + /** + * api 获取 列表的中数据 + */ ipcMain.on("db:series:select", async (event, data) => { await db.read(); const seriesList = db.data.series; diff --git a/apps/desktop/electron/main.ts b/apps/desktop/electron/main.ts index fa6d4c0..c833d6a 100644 --- a/apps/desktop/electron/main.ts +++ b/apps/desktop/electron/main.ts @@ -12,6 +12,7 @@ import path from "node:path"; import registerIpcMainHandlers from "./ipcMainHandlers"; import PythonManager from "./core/PythonManager"; import { createDatabase } from "./core/db"; +import { getMachineId, mid } from "./core/auth"; const require = createRequire(import.meta.url); const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -131,6 +132,7 @@ app.on("before-quit", () => { }); app.whenReady().then(() => { + getMachineId(); createWindow(); createTray(); registerGlobalShortcuts(); diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 34b3da8..551f03f 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -59,7 +59,8 @@ "react-router-dom": "^6.26.0", "tailwind-merge": "^2.4.0", "tailwindcss-animate": "^1.0.7", - "zod": "3.23.8" + "zod": "3.23.8", + "node-machine-id": "1.1.12" }, "devDependencies": { "@radix-ui/react-icons": "^1.3.0", diff --git a/apps/desktop/src/pages/Datasource/SeriesTable.tsx b/apps/desktop/src/pages/Datasource/SeriesTable.tsx index 46e22fe..061b25c 100644 --- a/apps/desktop/src/pages/Datasource/SeriesTable.tsx +++ b/apps/desktop/src/pages/Datasource/SeriesTable.tsx @@ -146,7 +146,17 @@ export const columns: ColumnDef[] = [ { id: "updateTime", accessorKey: "updateTime", - header: columnsAlias["updateTime"], + header: ({ column }) => { + return ( + + ); + }, cell: ({ row }) => (
{new Date(row.getValue("updateTime")).toLocaleString()} @@ -185,29 +195,20 @@ export const columns: ColumnDef[] = [ }, ]; -export function SeriesTable() { +interface SeriesTableProps { + data: Series[]; +} + +export function SeriesTable(props: SeriesTableProps) { const [sorting, setSorting] = useState([]); - const [data, setData] = useState([]); const [columnFilters, setColumnFilters] = useState([]); const [columnVisibility, setColumnVisibility] = useState({ SeriesInstanceUID: false, - updateTime: false, }); const [rowSelection, setRowSelection] = useState({}); - useEffect(() => { - window.ipcRenderer.send("db:series:select"); - }, []); - - useEffect(() => { - window.ipcRenderer.on("db:series:select:response", (event, data) => { - console.log(data); - setData(data); - }); - }, []); - const table = useReactTable({ - data, + data: props.data, columns, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, diff --git a/apps/desktop/src/pages/Datasource/index.tsx b/apps/desktop/src/pages/Datasource/index.tsx index f73d575..306d1be 100644 --- a/apps/desktop/src/pages/Datasource/index.tsx +++ b/apps/desktop/src/pages/Datasource/index.tsx @@ -10,8 +10,8 @@ import { Progress } from "@/components/ui/progress"; import { ToastAction } from "@/components/ui/toast"; import { useToast } from "@/components/ui/use-toast"; import { RocketIcon } from "@radix-ui/react-icons"; -import { useEffect, useState } from "react"; -import { SeriesTable } from "./SeriesTable"; +import { useEffect, useRef, useState } from "react"; +import { Series, SeriesTable } from "./SeriesTable"; import { motion } from "framer-motion"; interface ScanProgress { @@ -26,8 +26,9 @@ export const Datasource = () => { const [progress, setProgress] = useState(defaultProgress); const { toast } = useToast(); const [result, setResult] = useState<[]>([]); + + const [seriesData, setSeriesData] = useState([]); const [importDialogVisible, setImportDialogVisible] = useState(false); - const [startTime, setStartTime] = useState(Date.now()); useEffect(() => { const handleScanProgress = (event, data) => { @@ -43,15 +44,13 @@ export const Datasource = () => { useEffect(() => { window.ipcRenderer.once("scan-start", () => { setImportDialogVisible(true); - setStartTime(Date.now()); }); }, []); useEffect(() => { const handleScanFinished = (event, data) => { - const timeDuration = ((Date.now() - startTime) / 1000).toFixed(2); - console.log(data); - setResult(data); + const { scanDuration, structDicom } = data; + setResult(structDicom); setImportDialogVisible(false); if (data.error) { @@ -65,17 +64,20 @@ export const Datasource = () => { toast({ variant: "default", title: "完成", - description: `本次操作共导入${data.length}组序列数据,耗时:${timeDuration} s`, + description: `本次操作共导入${structDicom.length}组序列数据,耗时:${( + scanDuration / 1000 + ).toFixed(2)} s`, action: 启动AI测量, duration: 30 * 1000, }); + window.ipcRenderer.send("db:series:select"); } }; window.ipcRenderer.on("scan-progress-done", handleScanFinished); return () => { window.ipcRenderer.off("scan-progress-done", handleScanFinished); }; - }, [startTime, toast]); + }, [toast]); const handleCancelImport = () => { setImportDialogVisible(false); @@ -84,10 +86,20 @@ export const Datasource = () => { useEffect(() => { if (!importDialogVisible) { setProgress(defaultProgress); - setStartTime(Date.now()); } }, [importDialogVisible]); + useEffect(() => { + window.ipcRenderer.send("db:series:select"); + }, []); + + useEffect(() => { + window.ipcRenderer.on("db:series:select:response", (event, data) => { + console.log(data); + setSeriesData(data); + }); + }, []); + return ( { exit={{ y: 0, opacity: 0 }} transition={{ duration: 0.25 }} > - + {/* 导入数据dialog */} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1de1e5e..a74179e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,6 +112,9 @@ importers: lucide-react: specifier: ^0.408.0 version: 0.408.0(react@18.3.1) + node-machine-id: + specifier: 1.1.12 + version: 1.1.12 object-hash: specifier: ^3.0.0 version: 3.0.0 @@ -2976,6 +2979,9 @@ packages: encoding: optional: true + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -7179,6 +7185,8 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-machine-id@1.1.12: {} + node-releases@2.0.18: {} normalize-path@3.0.0: {}