diff --git a/src/main/types/cleaner.types.ts b/src/main/types/cleaner.types.ts index cad992c..b88f732 100644 --- a/src/main/types/cleaner.types.ts +++ b/src/main/types/cleaner.types.ts @@ -2,6 +2,7 @@ export interface CleanerInput { orderNumbers: string[] materialCodes: string[] dryRun: boolean + headless?: boolean onProgress?: (message: string, progress?: number) => void } diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index f8112a9..ceeb89b 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -378,14 +378,16 @@ function App(): React.JSX.Element { {/* ================= 主体内容区域 ================= */}
-
+
{currentPage === 'home' && ( -
- -

欢迎使用 ERP Auto

-

- 自动化处理 ERP 系统中的数据提取和清理任务。请使用上方导航栏选择您需要的功能模块。 -

+
+
+ +

欢迎使用 ERP Auto

+

+ 自动化处理 ERP 系统中的数据提取和清理任务。请使用上方导航栏选择您需要的功能模块。 +

+
)} {currentPage === 'extractor' && } diff --git a/src/renderer/src/pages/CleanerPage.tsx b/src/renderer/src/pages/CleanerPage.tsx index e6e2272..ee49fc3 100644 --- a/src/renderer/src/pages/CleanerPage.tsx +++ b/src/renderer/src/pages/CleanerPage.tsx @@ -65,6 +65,13 @@ const CleanerPage: React.FC = () => { // Material type management dialog state const [isTypeDialogOpen, setIsTypeDialogOpen] = useState(false) + // Execution settings state + const [headless, setHeadless] = useState(() => { + const saved = sessionStorage.getItem('cleaner_headless') + return saved ? saved === 'true' : true + }) + const [showSettingsMenu, setShowSettingsMenu] = useState(false) + // Check admin status and get shared Production IDs on mount React.useEffect(() => { const initializePage = async () => { @@ -100,6 +107,23 @@ const CleanerPage: React.FC = () => { sessionStorage.setItem('cleaner_dryRun', dryRun.toString()) }, [dryRun]) + useEffect(() => { + sessionStorage.setItem('cleaner_headless', headless.toString()) + }, [headless]) + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (showSettingsMenu) { + const target = event.target as HTMLElement + if (!target.closest('[data-settings-menu]')) { + setShowSettingsMenu(false) + } + } + } + document.addEventListener('mousedown', handleClickOutside) + return () => document.removeEventListener('mousedown', handleClickOutside) + }, [showSettingsMenu]) + useEffect(() => { sessionStorage.setItem('cleaner_validationMode', valMode) }, [valMode]) @@ -253,7 +277,8 @@ const CleanerPage: React.FC = () => { const response = await window.electron.cleaner.runCleaner({ orderNumbers: orderNumberList, materialCodes: materialCodeList, - dryRun + dryRun, + headless }) if (response.success && response.data) { @@ -307,10 +332,10 @@ const CleanerPage: React.FC = () => { return (
- {/* 左栏:数据源与执行控制区 */} -
- {/* 1. 数据来源选择 (仅 Admin 可见) */} - {isAdmin && ( + {/* 左栏:数据源与执行控制区 (仅 Admin 可见) */} + {isAdmin && ( +
+ {/* 1. 数据来源选择 */}

@@ -361,10 +386,8 @@ const CleanerPage: React.FC = () => {

- )} - {/* 2. 负责人筛选 (仅 Admin 可见) */} - {isAdmin && ( + {/* 2. 负责人筛选 */}

@@ -414,43 +437,24 @@ const CleanerPage: React.FC = () => { )}

- )} - - {/* 3. 基础执行控制区 */} -
- {isAdmin && ( -
-
-
预览模式 (Dry-Run)
-
- 仅执行页面操作定位,不保存更改 -
-
- -
- )} - -
- -
-
+ )} {/* 右栏:结果表格与工具栏 */} -
+
+ {/* 获取物料状态按钮 */} +
+ +
+ {/* 顶部操作条 */} -
+
{/* 表格区域 */} -
+
@@ -616,37 +620,67 @@ const CleanerPage: React.FC = () => { {/* 底部状态与执行区 */} -
+
共计 {filteredResults.length} 条记录 | 已选中{' '} {selectedItems.size}
- {isAdmin && dryRun && ( - - 当前为预览模式 - - )}
- +
+ + {showSettingsMenu && ( +
+
+
+
+
预览模式 (Dry-Run)
+
+ 仅执行页面操作定位,不保存更改 +
+
+ +
+
+
+
+
+ 后台模式 (Headless) +
+
+ 浏览器在后台运行,不显示界面 +
+
+ +
+
+
+
+ )} +