refactor(cleaner): batch query and controlled parallel order processing
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user