refactor(cleaner): batch query and controlled parallel order processing

This commit is contained in:
test
2026-03-16 21:47:13 +08:00
parent 9248be6310
commit 6a2fba0e57
8 changed files with 484 additions and 236 deletions

View File

@@ -78,6 +78,18 @@ export function useCleaner() {
const saved = sessionStorage.getItem('cleaner_headless')
return saved ? saved === 'true' : true
})
const [queryBatchSize, setQueryBatchSize] = useState(() => {
const saved = sessionStorage.getItem('cleaner_queryBatchSize')
const value = saved ? Number(saved) : 100
if (!Number.isFinite(value)) return 100
return Math.min(100, Math.max(1, Math.trunc(value)))
})
const [processConcurrency, setProcessConcurrency] = useState(() => {
const saved = sessionStorage.getItem('cleaner_processConcurrency')
const value = saved ? Number(saved) : 1
if (!Number.isFinite(value)) return 1
return Math.min(20, Math.max(1, Math.trunc(value)))
})
const [showSettingsMenu, setShowSettingsMenu] = useState(false)
// Inline editing state for manager field (Admin only)
@@ -170,6 +182,14 @@ export function useCleaner() {
sessionStorage.setItem('cleaner_headless', headless.toString())
}, [headless])
useEffect(() => {
sessionStorage.setItem('cleaner_queryBatchSize', queryBatchSize.toString())
}, [queryBatchSize])
useEffect(() => {
sessionStorage.setItem('cleaner_processConcurrency', processConcurrency.toString())
}, [processConcurrency])
useEffect(() => {
sessionStorage.setItem('cleaner_validationMode', valMode)
}, [valMode])
@@ -419,7 +439,9 @@ export function useCleaner() {
orderNumbers: orderNumberList,
materialCodes: materialCodeList,
dryRun,
headless
headless,
queryBatchSize,
processConcurrency
})
const cleanerRunData = response.success ? (response.data as any) : null
@@ -503,6 +525,10 @@ export function useCleaner() {
setIsTypeDialogOpen,
headless,
setHeadless,
queryBatchSize,
setQueryBatchSize,
processConcurrency,
setProcessConcurrency,
showSettingsMenu,
setShowSettingsMenu,
filteredResults,

View File

@@ -46,6 +46,10 @@ const CleanerPage: React.FC = () => {
setIsTypeDialogOpen,
headless,
setHeadless,
queryBatchSize,
setQueryBatchSize,
processConcurrency,
setProcessConcurrency,
showSettingsMenu,
setShowSettingsMenu,
filteredResults,
@@ -458,6 +462,42 @@ const CleanerPage: React.FC = () => {
</button>
</div>
</div>
<div className="border-t border-slate-100 pt-3 space-y-3">
<div>
<div className="text-sm font-medium text-slate-800"></div>
<div className="text-xs text-slate-500 mt-0.5"> 1-100</div>
<input
type="number"
min={1}
max={100}
value={queryBatchSize}
onChange={(e) => {
const raw = Number(e.target.value)
if (!Number.isFinite(raw)) return
setQueryBatchSize(Math.max(1, Math.min(100, Math.trunc(raw))))
}}
className="mt-2 w-full rounded border border-slate-300 px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
</div>
<div>
<div className="text-sm font-medium text-slate-800"></div>
<div className="text-xs text-slate-500 mt-0.5">
1-20
</div>
<input
type="number"
min={1}
max={20}
value={processConcurrency}
onChange={(e) => {
const raw = Number(e.target.value)
if (!Number.isFinite(raw)) return
setProcessConcurrency(Math.max(1, Math.min(20, Math.trunc(raw))))
}}
className="mt-2 w-full rounded border border-slate-300 px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
</div>
</div>
</div>
</div>
)}