提交 1b3cb1c4 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 449ef2db
...@@ -121,7 +121,7 @@ export function useProcessProgressQuery(params: { function_name: string }) { ...@@ -121,7 +121,7 @@ export function useProcessProgressQuery(params: { function_name: string }) {
}, },
select: (res) => res.data, select: (res) => res.data,
enabled, enabled,
refetchInterval: enabled ? 1000 : false, refetchInterval: enabled ? 500 : false,
staleTime: 0, staleTime: 0,
gcTime: 0, gcTime: 0,
placeholderData: (): any => { placeholderData: (): any => {
...@@ -144,7 +144,7 @@ export function useProcessProgressQuery(params: { function_name: string }) { ...@@ -144,7 +144,7 @@ export function useProcessProgressQuery(params: { function_name: string }) {
} }
// 组件卸载时清理 // 组件卸载时清理
useEffect(() => { useEffect(() => {
if (query.data?.result === 'SUCCESS' || query.data?.result === 'FAIL' || query.data?.result === null) { if (query.data?.result === 'SUCCESS' || query.data?.result === 'FAIL') {
stop() stop()
} }
return () => { return () => {
......
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/abnormal', data)
}
...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps' ...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps'
import { useSearchParams } from 'react-router' import { useSearchParams } from 'react-router'
import { useAI } from '@/hooks/useAI' import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
...@@ -27,7 +28,7 @@ export default function ButtonModal() { ...@@ -27,7 +28,7 @@ export default function ButtonModal() {
}) })
} }
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
useEffect(() => { useEffect(() => {
...@@ -38,25 +39,33 @@ export default function ButtonModal() { ...@@ -38,25 +39,33 @@ export default function ButtonModal() {
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', action: '取该字段平均值',
rule: '1',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const ruleOptions = [ const ruleOptions = ['取该字段平均值', '删除逻辑错误值', '不处理']
{ label: '取该字段平均值', value: '1' },
{ label: '删除逻辑错误值', value: '2' }, const { mutate, isPending, progress, message, remove } = useProcessData()
{ label: '不处理', value: '3' }, // 开始处理
] const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
const [step, setStep] = useState<number>(-1) // 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择逻辑错误值字段', title: '请选择逻辑错误值字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择逻辑错误值字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择逻辑错误值字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -73,8 +82,8 @@ export default function ButtonModal() { ...@@ -73,8 +82,8 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="逻辑错误值处理字段">{checked}</Form.Item> <Form.Item label="逻辑错误值处理字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}> <Form.Item label="处理规则" name="action" rules={[{ required: true, message: '请选择处理规则' }]}>
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
</> </>
...@@ -84,29 +93,25 @@ export default function ButtonModal() { ...@@ -84,29 +93,25 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>逻辑错误值处理字段:{checked}</p> <p>逻辑错误值处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>检查字段处理规则</>, title: '检查字段处理规则',
description: message[1],
}, },
{ {
title: <>逻辑错误值处理</>, title: '逻辑错误值处理',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: ( description: message[3],
<>
累计处理XX个字段
<br />
累计处理XX条记录
</>
),
}, },
]} ]}
/> />
...@@ -133,12 +138,12 @@ export default function ButtonModal() { ...@@ -133,12 +138,12 @@ export default function ButtonModal() {
)} )}
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -146,7 +151,7 @@ export default function ButtonModal() { ...@@ -146,7 +151,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'abnormal' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
action: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/out-of-range', data)
}
...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps' ...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps'
import { useSearchParams } from 'react-router' import { useSearchParams } from 'react-router'
import { useAI } from '@/hooks/useAI' import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
...@@ -27,7 +28,7 @@ export default function ButtonModal() { ...@@ -27,7 +28,7 @@ export default function ButtonModal() {
}) })
} }
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
useEffect(() => { useEffect(() => {
...@@ -37,26 +38,35 @@ export default function ButtonModal() { ...@@ -37,26 +38,35 @@ export default function ButtonModal() {
}, [searchParams]) }, [searchParams])
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', action: '取该字段平均值',
rule: '1',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const ruleOptions = [ const ruleOptions = ['取该字段平均值', '删除过大值', '不处理']
{ label: '取该字段平均值', value: '1' },
{ label: '删除过大值', value: '2' },
{ label: '不处理', value: '3' },
]
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择过大值字段', title: '请选择过大值字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择过大值字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择过大值字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -73,8 +83,8 @@ export default function ButtonModal() { ...@@ -73,8 +83,8 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="过大值处理字段">{checked}</Form.Item> <Form.Item label="过大值处理字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}> <Form.Item label="处理规则" name="action" rules={[{ required: true, message: '请选择处理规则' }]}>
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
</> </>
...@@ -84,29 +94,25 @@ export default function ButtonModal() { ...@@ -84,29 +94,25 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>过大值处理字段:{checked}</p> <p>过大值处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>检查字段处理规则</>, title: '检查字段处理规则',
description: message[1],
}, },
{ {
title: <>过大值处理</>, title: '过大值处理',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: ( description: message[3],
<>
累计处理XX个字段
<br />
累计处理XX条记录
</>
),
}, },
]} ]}
/> />
...@@ -133,12 +139,12 @@ export default function ButtonModal() { ...@@ -133,12 +139,12 @@ export default function ButtonModal() {
)} )}
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -146,7 +152,7 @@ export default function ButtonModal() { ...@@ -146,7 +152,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'outOfRange' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
action: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/under-range', data)
}
...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps' ...@@ -5,6 +5,7 @@ import AppProgressSteps from '@/components/AppProgressSteps'
import { useSearchParams } from 'react-router' import { useSearchParams } from 'react-router'
import { useAI } from '@/hooks/useAI' import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
...@@ -27,7 +28,7 @@ export default function ButtonModal() { ...@@ -27,7 +28,7 @@ export default function ButtonModal() {
}) })
} }
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
useEffect(() => { useEffect(() => {
...@@ -38,25 +39,33 @@ export default function ButtonModal() { ...@@ -38,25 +39,33 @@ export default function ButtonModal() {
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', action: '取该字段平均值',
rule: '1',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const ruleOptions = [ const ruleOptions = ['取该字段平均值', '删除过小值', '不处理']
{ label: '取该字段平均值', value: '1' },
{ label: '删除过小值', value: '2' }, const { mutate, isPending, progress, message, remove } = useProcessData()
{ label: '不处理', value: '3' }, // 开始处理
] const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
const [step, setStep] = useState<number>(-1) // 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择过小值字段', title: '请选择过小值字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择过小值字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择过小值字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -73,8 +82,8 @@ export default function ButtonModal() { ...@@ -73,8 +82,8 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="过小值处理字段">{checked}</Form.Item> <Form.Item label="过小值处理字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}> <Form.Item label="处理规则" name="action" rules={[{ required: true, message: '请选择处理规则' }]}>
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
</> </>
...@@ -84,29 +93,25 @@ export default function ButtonModal() { ...@@ -84,29 +93,25 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>过小值处理字段:{checked}</p> <p>过小值处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>检查字段处理规则</>, title: '检查字段处理规则',
description: message[1],
}, },
{ {
title: <>过小值处理</>, title: '过小值处理',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: ( description: message[3],
<>
累计处理XX个字段
<br />
累计处理XX条记录
</>
),
}, },
]} ]}
/> />
...@@ -133,12 +138,12 @@ export default function ButtonModal() { ...@@ -133,12 +138,12 @@ export default function ButtonModal() {
)} )}
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -146,7 +151,7 @@ export default function ButtonModal() { ...@@ -146,7 +151,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'underRange' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
action: string
}
...@@ -152,16 +152,9 @@ export default function ButtonModal() { ...@@ -152,16 +152,9 @@ export default function ButtonModal() {
<AppProgressSteps <AppProgressSteps
current={progress} current={progress}
items={[ items={[
{ { title: '检查字段处理规则', description: message[1] },
title: <>检查字段处理规则</>, { title: '缺失值处理', description: message[2] },
}, { title: '处理结果', description: message[3] },
{
title: <>缺失值处理</>,
},
{
title: <>处理结果</>,
description: <>{message[3]}</>,
},
]} ]}
/> />
</Flex> </Flex>
......
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/duplicate', data)
}
...@@ -4,6 +4,7 @@ import AppProgressSteps from '@/components/AppProgressSteps' ...@@ -4,6 +4,7 @@ import AppProgressSteps from '@/components/AppProgressSteps'
import { useSearchParams } from 'react-router' import { useSearchParams } from 'react-router'
import { useAI } from '@/hooks/useAI' import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
...@@ -39,18 +40,28 @@ export default function ButtonModal() { ...@@ -39,18 +40,28 @@ export default function ButtonModal() {
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
rule: '1', action: '保留1条,删除剩余重复数据',
} }
const checkedList: string[] = Form.useWatch('checkedList', form) || [] const checkedList: string[] = Form.useWatch('checkedList', form) || []
const ruleOptions = [ const ruleOptions = ['保留1条,删除剩余重复数据', '全部删除', '不处理']
{ label: '保留1条,删除剩余重复数据', value: '1' },
{ label: '全部删除', value: '2' },
{ label: '不处理', value: '3' },
]
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
const params = { ...values }
mutate(params)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
...@@ -81,7 +92,7 @@ export default function ButtonModal() { ...@@ -81,7 +92,7 @@ export default function ButtonModal() {
</p> </p>
))} ))}
</Form.Item> </Form.Item>
<Form.Item label="处理规则" name="rule"> <Form.Item label="处理规则" name="action">
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
</> </>
...@@ -92,28 +103,15 @@ export default function ButtonModal() { ...@@ -92,28 +103,15 @@ export default function ButtonModal() {
content: ( content: (
<> <>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ { title: '检查字段处理规则', description: message[1] },
title: <>检查字段处理规则</>, { title: '重复值处理', description: message[2] },
}, { title: '处理结果', description: message[3] },
{
title: <>重复值处理</>,
},
{
title: <>处理结果</>,
description: (
<>
累计处理XX个字段
<br />
累计处理XX条记录
</>
),
},
]} ]}
/> />
</Flex> </Flex>
...@@ -144,7 +142,7 @@ export default function ButtonModal() { ...@@ -144,7 +142,7 @@ export default function ButtonModal() {
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -152,7 +150,7 @@ export default function ButtonModal() { ...@@ -152,7 +150,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'duplicate' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
fields: string
action: string
rules: string
rule: string
specify: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/sort', data)
}
...@@ -8,6 +8,7 @@ import { Button, Flex, Modal, Form, Table, Radio } from 'antd' ...@@ -8,6 +8,7 @@ import { Button, Flex, Modal, Form, Table, Radio } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery' import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import type { TableColumnsType } from 'antd' import type { TableColumnsType } from 'antd'
import { useProcessData } from '../query'
interface DataType { interface DataType {
key: number key: number
...@@ -44,7 +45,21 @@ export default function ButtonModal() { ...@@ -44,7 +45,21 @@ export default function ButtonModal() {
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const [dataSource, setDataSource] = useState<DataType[]>([]) const [dataSource, setDataSource] = useState<DataType[]>([])
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
const fields = dataSource.map((item) => {
return { field: item.key, rule: item.new_value }
})
mutate({ fields: JSON.stringify(fields) })
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
useEffect(() => { useEffect(() => {
if (fields?.length) { if (fields?.length) {
...@@ -52,7 +67,7 @@ export default function ButtonModal() { ...@@ -52,7 +67,7 @@ export default function ButtonModal() {
fields.map((item: any, index) => ({ fields.map((item: any, index) => ({
key: index + 1, key: index + 1,
...item, ...item,
new_value: '', new_value: 'default',
})) }))
) )
} }
...@@ -82,9 +97,9 @@ export default function ButtonModal() { ...@@ -82,9 +97,9 @@ export default function ButtonModal() {
) )
const options = [ const options = [
{ label: '无序', value: '1' }, { label: '无序', value: 'default' },
{ label: '升序', value: '2' }, { label: '升序', value: 'asc' },
{ label: '降序', value: '3' }, { label: '降序', value: 'desc' },
] ]
const columns: TableColumnsType<DataType> = [ const columns: TableColumnsType<DataType> = [
...@@ -128,13 +143,17 @@ export default function ButtonModal() { ...@@ -128,13 +143,17 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
style={{ margin: '80px' }} style={{ margin: '80px' }}
current={step} current={progress}
items={[{ title: '第一步\n开始' }, { title: '第二步\n数据排序' }, { title: '第三步\n处理结果' }]} items={[
{ title: '第一步\n开始', description: message[1] },
{ title: '第二步\n数据排序', description: message[2] },
{ title: '第三步\n处理结果', description: message[3] },
]}
/> />
</Flex> </Flex>
), ),
...@@ -158,7 +177,7 @@ export default function ButtonModal() { ...@@ -158,7 +177,7 @@ export default function ButtonModal() {
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -166,7 +185,7 @@ export default function ButtonModal() { ...@@ -166,7 +185,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false}> <Form form={form} labelCol={{ span: 5 }} preserve={false}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'sort' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
fields: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/trim', data)
}
...@@ -4,6 +4,7 @@ import { useDataFieldQuery } from '@/hooks/useQuery' ...@@ -4,6 +4,7 @@ import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import { useAI } from '@/hooks/useAI' import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const { isLoading, post } = useAI({ const { isLoading, post } = useAI({
...@@ -24,33 +25,46 @@ export default function ButtonModal() { ...@@ -24,33 +25,46 @@ export default function ButtonModal() {
}) })
} }
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', field: '',
rule: '1', rule: '开头去空格',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const ruleOptions = [ const ruleOptions = [
{ label: '开头去空格', value: '1' }, { label: '开头去空格', value: '开头去空格' },
{ label: '结尾去空格', value: '2' }, { label: '结尾去空格', value: '结尾去空格' },
{ label: '中间去空格', value: '3' }, { label: '中间去空格', value: '中间去空格' },
{ label: '全部去空格', value: '4' }, { label: '全部去空格', value: '全部去空格' },
] ]
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择数据去空格字段', title: '请选择数据去空格字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择数据去空格字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择数据去空格字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -67,7 +81,7 @@ export default function ButtonModal() { ...@@ -67,7 +81,7 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="数据去空格处理字段">{checked}</Form.Item> <Form.Item label="数据去空格处理字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}> <Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}>
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
...@@ -78,29 +92,25 @@ export default function ButtonModal() { ...@@ -78,29 +92,25 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>数据去空格处理字段:{checked}</p> <p>数据去空格处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>检查字段处理规则</>, title: '检查字段处理规则',
description: message[1],
}, },
{ {
title: <>数据去空格处理</>, title: '数据去空格处理',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: ( description: message[3],
<>
累计处理XX个字段
<br />
累计处理XX条记录
</>
),
}, },
]} ]}
/> />
...@@ -127,12 +137,12 @@ export default function ButtonModal() { ...@@ -127,12 +137,12 @@ export default function ButtonModal() {
)} )}
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -140,7 +150,7 @@ export default function ButtonModal() { ...@@ -140,7 +150,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'trim' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
rule: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/merge', data)
}
import { useState } from 'react' import { useState } from 'react'
import { Button, Flex, Modal, Radio, Input, Form, Select, message } from 'antd' import { Button, Flex, Modal, Radio, Input, Form, Select } from 'antd'
import { useDataQuery, useDataFieldQuery } from '@/hooks/useQuery' import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const { data = { list: [] } } = useDataQuery() // Default value to prevent data being undefined const { fieldOptions } = useDataFieldQuery()
const { data: fields = [] } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const [step, setStep] = useState(-1) const [fields, setFields] = useState<{ field: string; order: number }[]>([])
const [concatenatedFields, setConcatenatedFields] = useState<{ field: string; order: number }[]>([])
// Process the concatenation const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => { const handleStart = () => {
setStep(0) form.validateFields().then((values) => {
// Simulate processing steps with timeouts mutate({ ...values, fields: JSON.stringify(fields) })
setTimeout(() => { })
setStep(1) }
setTimeout(() => {
setStep(3) // 关闭并重置
message.success('数据拼接处理完成!') const handleClose = () => {
}, 1000) setOpen(false)
}, 1000) setCurrent(0)
remove()
}
// 下一步
const handleNext = async () => {
await form.validateFields()
setCurrent(current + 1)
} }
// Add concatenation field // Add concatenation field
const addConcatenationField = () => { const addField = () => {
const newField = form.getFieldValue('fieldToAdd') const newField = form.getFieldValue('fieldToAdd')
if (!newField) { if (!newField) {
message.warning('请选择要添加的字段') message.warning('请选择要添加的字段')
...@@ -35,21 +42,21 @@ export default function ButtonModal() { ...@@ -35,21 +42,21 @@ export default function ButtonModal() {
} }
const updatedFields = [ const updatedFields = [
...concatenatedFields, ...fields,
{ {
field: newField, field: newField,
order: concatenatedFields.length, order: fields.length,
}, },
] ]
setConcatenatedFields(updatedFields) setFields(updatedFields)
form.setFieldsValue({ fieldToAdd: undefined }) form.setFieldsValue({ fieldToAdd: undefined })
} }
// Move field up in order // Move field up in order
const moveFieldUp = (index: number) => { const moveFieldUp = (index: number) => {
if (index <= 0) return if (index <= 0) return
const newFields = [...concatenatedFields] const newFields = [...fields]
const temp = newFields[index] const temp = newFields[index]
newFields[index] = newFields[index - 1] newFields[index] = newFields[index - 1]
newFields[index - 1] = temp newFields[index - 1] = temp
...@@ -59,13 +66,13 @@ export default function ButtonModal() { ...@@ -59,13 +66,13 @@ export default function ButtonModal() {
field.order = idx field.order = idx
}) })
setConcatenatedFields(newFields) setFields(newFields)
} }
// Move field down in order // Move field down in order
const moveFieldDown = (index: number) => { const moveFieldDown = (index: number) => {
if (index >= concatenatedFields.length - 1) return if (index >= fields.length - 1) return
const newFields = [...concatenatedFields] const newFields = [...fields]
const temp = newFields[index] const temp = newFields[index]
newFields[index] = newFields[index + 1] newFields[index] = newFields[index + 1]
newFields[index + 1] = temp newFields[index + 1] = temp
...@@ -75,19 +82,19 @@ export default function ButtonModal() { ...@@ -75,19 +82,19 @@ export default function ButtonModal() {
field.order = idx field.order = idx
}) })
setConcatenatedFields(newFields) setFields(newFields)
} }
// Remove field from list // Remove field from list
const removeField = (index: number) => { const removeField = (index: number) => {
const newFields = concatenatedFields.filter((_, idx) => idx !== index) const newFields = fields.filter((_, idx) => idx !== index)
// Update order property // Update order property
newFields.forEach((field, idx) => { newFields.forEach((field, idx) => {
field.order = idx field.order = idx
}) })
setConcatenatedFields(newFields) setFields(newFields)
} }
// Steps definition // Steps definition
...@@ -108,38 +115,32 @@ export default function ButtonModal() { ...@@ -108,38 +115,32 @@ export default function ButtonModal() {
<Form.Item <Form.Item
label="拼接新字段类型" label="拼接新字段类型"
name="fieldType" name="fieldType"
rules={[{ required: true, message: '请选择拼接新字段类型' }]}> rules={[{ required: true, message: '请选择拼接新字段类型' }]}
<Radio.Group options={[{ label: '文本', value: 'text' }]} /> initialValue="string">
<Radio.Group options={[{ label: '文本', value: 'string' }]} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label="请选择数据拼接字段" label="请选择数据拼接字段"
name="selectedFields" name="fields"
rules={[ rules={[
{ {
required: true, required: true,
message: '请添加至少一个拼接字段', message: '请添加至少一个拼接字段',
validator: () => validator: () => (fields.length > 0 ? Promise.resolve() : Promise.reject('请添加至少一个拼接字段')),
concatenatedFields.length > 0 ? Promise.resolve() : Promise.reject('请添加至少一个拼接字段'),
}, },
]}> ]}>
<div> <div>
<Flex gap={10}> <Flex gap={10}>
<Form.Item name="fieldToAdd" noStyle> <Form.Item name="fieldToAdd" noStyle>
<Select <Select placeholder="选择要添加的字段" options={fieldOptions} />
placeholder="选择要添加的字段"
options={fields.map((item) => ({
label: `${item.name} (${item.english_name})`,
value: item.english_name,
}))}
/>
</Form.Item> </Form.Item>
<Button type="primary" onClick={addConcatenationField}> <Button type="primary" onClick={addField}>
添加拼接字段 添加拼接字段
</Button> </Button>
</Flex> </Flex>
{concatenatedFields.map((item, index) => { {fields.map((item, index) => {
const fieldInfo = fields.find((f) => f.english_name === item.field) const fieldInfo = fieldOptions.find((f) => f.value === item.field)
return ( return (
<Flex key={index} gap={10} style={{ marginTop: '10px' }}> <Flex key={index} gap={10} style={{ marginTop: '10px' }}>
<div style={{ flex: 1, border: '1px solid #d9d9d9', padding: '4px 11px', borderRadius: '6px' }}> <div style={{ flex: 1, border: '1px solid #d9d9d9', padding: '4px 11px', borderRadius: '6px' }}>
...@@ -148,10 +149,7 @@ export default function ButtonModal() { ...@@ -148,10 +149,7 @@ export default function ButtonModal() {
<Button type="text" disabled={index === 0} onClick={() => moveFieldUp(index)}> <Button type="text" disabled={index === 0} onClick={() => moveFieldUp(index)}>
上移 上移
</Button> </Button>
<Button <Button type="text" disabled={index === fields.length - 1} onClick={() => moveFieldDown(index)}>
type="text"
disabled={index === concatenatedFields.length - 1}
onClick={() => moveFieldDown(index)}>
下移 下移
</Button> </Button>
<Button type="text" danger onClick={() => removeField(index)}> <Button type="text" danger onClick={() => removeField(index)}>
...@@ -170,27 +168,23 @@ export default function ButtonModal() { ...@@ -170,27 +168,23 @@ export default function ButtonModal() {
content: ( content: (
<> <>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={handleStart} disabled={step >= 0}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>新增字段</>, title: '新增字段',
description: message[1],
}, },
{ {
title: <>数据拼接</>, title: '数据拼接',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: ( description: message[3],
<>
累计处理{concatenatedFields.length}个字段
<br />
累计处理{data.list?.length || 0}条记录
</>
),
}, },
]} ]}
/> />
...@@ -200,28 +194,6 @@ export default function ButtonModal() { ...@@ -200,28 +194,6 @@ export default function ButtonModal() {
}, },
] ]
// Handle next button logic
const handleNext = async () => {
try {
if (current === 0) {
// Validate the first step form
await form.validateFields(['name', 'english_name', 'fieldType', 'selectedFields'])
}
setCurrent(current + 1)
} catch (error) {
// Form validation error handling
console.error('表单验证失败', error)
}
}
// Reset everything when modal closes
const handleCancel = () => {
setOpen(false)
setCurrent(0)
setStep(-1)
setConcatenatedFields([])
}
return ( return (
<> <>
<Button type="primary" onClick={() => setOpen(true)}> <Button type="primary" onClick={() => setOpen(true)}>
...@@ -239,7 +211,7 @@ export default function ButtonModal() { ...@@ -239,7 +211,7 @@ export default function ButtonModal() {
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={handleCancel}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -247,7 +219,7 @@ export default function ButtonModal() { ...@@ -247,7 +219,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={handleCancel}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false}> <Form form={form} labelCol={{ span: 5 }} preserve={false}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'merge' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
name: string
english_name: string
fields: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/split', data)
}
...@@ -2,36 +2,50 @@ import { useState } from 'react' ...@@ -2,36 +2,50 @@ import { useState } from 'react'
import { Button, Flex, Modal, Radio, Form, Row, Col } from 'antd' import { Button, Flex, Modal, Radio, Form, Row, Col } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery' import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', field: '',
rule: '1', char: ';',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const ruleOptions = [ const ruleOptions = [
{ label: '分号“;”', value: '1' }, { label: '分号“;”', value: ';' },
{ label: '逗号“,”', value: '2' }, { label: '逗号“,”', value: ',' },
{ label: '空格“ ”', value: '3' }, { label: '空格“ ”', value: ' ' },
// { label: '特定字符', value: '4' }, // { label: '特定字符', value: '4' },
// { label: '前几个字符', value: '5' }, // { label: '前几个字符', value: '5' },
] ]
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择数据拆分字段', title: '请选择数据拆分字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择数据拆分字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择数据拆分字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -48,8 +62,8 @@ export default function ButtonModal() { ...@@ -48,8 +62,8 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="数据拆分字段">{checked}</Form.Item> <Form.Item label="数据拆分字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请选择处理规则' }]}> <Form.Item label="处理规则" name="char" rules={[{ required: true, message: '请选择处理规则' }]}>
<Radio.Group options={ruleOptions} /> <Radio.Group options={ruleOptions} />
</Form.Item> </Form.Item>
</> </>
...@@ -59,34 +73,33 @@ export default function ButtonModal() { ...@@ -59,34 +73,33 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>数据拆分处理字段:{checked}</p> <p>数据拆分处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(3)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>计算拆分字段</>, title: '计算拆分字段',
description: message[1],
}, },
{ {
title: <>数据库表增加拆分字段</>, title: '数据库表增加拆分字段',
description: message[2],
}, },
{ {
title: <>更新拆分字段</>, title: '更新拆分字段',
description: message[3],
}, },
{ {
title: <>更新原始字段</>, title: '更新原始字段',
description: message[4],
}, },
{ {
title: ( title: '处理结果',
<> description: message[5],
第五步
<br />
处理结果
</>
),
}, },
]} ]}
/> />
...@@ -108,12 +121,12 @@ export default function ButtonModal() { ...@@ -108,12 +121,12 @@ export default function ButtonModal() {
<Flex justify="center" gap={20}> <Flex justify="center" gap={20}>
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -121,7 +134,7 @@ export default function ButtonModal() { ...@@ -121,7 +134,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'split' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
char: string
rule: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/punctuation', data)
}
...@@ -2,28 +2,42 @@ import { useState } from 'react' ...@@ -2,28 +2,42 @@ import { useState } from 'react'
import { Button, Flex, Modal, Radio, Form, Row, Col, Input } from 'antd' import { Button, Flex, Modal, Radio, Form, Row, Col, Input } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery' import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const { fieldOptions } = useDataFieldQuery() const { fieldOptions, getFieldName } = useDataFieldQuery()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const initialValues = { const initialValues = {
checked: '', field: '',
rule: '', char: '',
} }
const checked = Form.useWatch('checked', form) const field = Form.useWatch('field', form)
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
const steps = [ const steps = [
{ {
title: '请选择去标点字段', title: '请选择去标点字段',
content: ( content: (
<Form.Item name="checked" rules={[{ required: true, message: '请选择去标点字段' }]}> <Form.Item name="field" rules={[{ required: true, message: '请选择去标点字段' }]}>
<Radio.Group> <Radio.Group>
<Row gutter={[10, 10]}> <Row gutter={[10, 10]}>
{fieldOptions.map((item) => ( {fieldOptions.map((item) => (
...@@ -40,8 +54,8 @@ export default function ButtonModal() { ...@@ -40,8 +54,8 @@ export default function ButtonModal() {
title: '配置处理规则', title: '配置处理规则',
content: ( content: (
<> <>
<Form.Item label="数据去标点字段">{checked}</Form.Item> <Form.Item label="数据去标点字段">{getFieldName(field)}</Form.Item>
<Form.Item label="处理规则" name="rule" rules={[{ required: true, message: '请输入处理规则' }]}> <Form.Item label="处理规则" name="char" rules={[{ required: true, message: '请输入处理规则' }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
</> </>
...@@ -51,22 +65,25 @@ export default function ButtonModal() { ...@@ -51,22 +65,25 @@ export default function ButtonModal() {
title: '处理执行', title: '处理执行',
content: ( content: (
<> <>
<p>数据去标点处理字段:{checked}</p> <p>数据去标点处理字段:{getFieldName(field)}</p>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ {
title: <>开始</>, title: '开始',
description: message[1],
}, },
{ {
title: <>数据去标点处理</>, title: '数据去标点处理',
description: message[2],
}, },
{ {
title: <>处理结果</>, title: '处理结果',
description: message[3],
}, },
]} ]}
/> />
...@@ -88,12 +105,12 @@ export default function ButtonModal() { ...@@ -88,12 +105,12 @@ export default function ButtonModal() {
<Flex justify="center" gap={20}> <Flex justify="center" gap={20}>
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>} {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!checked}> <Button type="primary" onClick={() => setCurrent(current + 1)} disabled={!field}>
下一步 下一步
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -101,7 +118,7 @@ export default function ButtonModal() { ...@@ -101,7 +118,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}> <Form form={form} labelCol={{ span: 5 }} preserve={false} initialValues={initialValues}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'punctuation' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
field: string
rule: string
}
import httpRequest from '@/utils/axios'
import type { ProcessDataParams } from './types'
// 缺省值处理
export function processData(data: ProcessDataParams) {
return httpRequest.post('/api/resource/bi/v1/processing/pre-processing/type', data)
}
...@@ -2,6 +2,7 @@ import { useEffect, useState } from 'react' ...@@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'
import { Button, Flex, Modal, Form, Table, Select } from 'antd' import { Button, Flex, Modal, Form, Table, Select } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery' import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps' import AppProgressSteps from '@/components/AppProgressSteps'
import { useProcessData } from '../query'
export default function ButtonModal() { export default function ButtonModal() {
const { data: fields = [] } = useDataFieldQuery() const { data: fields = [] } = useDataFieldQuery()
...@@ -11,7 +12,20 @@ export default function ButtonModal() { ...@@ -11,7 +12,20 @@ export default function ButtonModal() {
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [form] = Form.useForm() const [form] = Form.useForm()
const [dataSource, setDataSource] = useState<{ key: number; raw_value: string; new_value: string }[]>([]) const [dataSource, setDataSource] = useState<{ key: number; raw_value: string; new_value: string }[]>([])
const [step, setStep] = useState<number>(-1) const { mutate, isPending, progress, message, remove } = useProcessData()
// 开始处理
const handleStart = () => {
form.validateFields().then((values) => {
mutate(values)
})
}
// 关闭并重置
const handleClose = () => {
setOpen(false)
setCurrent(0)
remove()
}
useEffect(() => { useEffect(() => {
if (fields?.length) { if (fields?.length) {
...@@ -34,12 +48,7 @@ export default function ButtonModal() { ...@@ -34,12 +48,7 @@ export default function ButtonModal() {
) )
} }
const options = [ const options = [{ label: '文本', value: 'string' }]
{
label: '文本',
value: 'text',
},
]
const steps = [ const steps = [
{ {
title: '请选择转换字段', title: '请选择转换字段',
...@@ -76,21 +85,15 @@ export default function ButtonModal() { ...@@ -76,21 +85,15 @@ export default function ButtonModal() {
content: ( content: (
<> <>
<Flex vertical align="center" style={{ marginTop: '20px' }}> <Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}> <Button type="primary" loading={isPending} onClick={handleStart}>
开始处理 开始处理
</Button> </Button>
<AppProgressSteps <AppProgressSteps
current={step} current={progress}
items={[ items={[
{ { title: '开始', description: message[1] },
title: <>开始</>, { title: '数据类型转换', description: message[2] },
}, { title: '处理结果', description: message[3] },
{
title: <>数据类型转换</>,
},
{
title: <>处理结果</>,
},
]} ]}
/> />
</Flex> </Flex>
...@@ -116,7 +119,7 @@ export default function ButtonModal() { ...@@ -116,7 +119,7 @@ export default function ButtonModal() {
</Button> </Button>
)} )}
{current === steps.length - 1 && ( {current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}> <Button type="primary" disabled={isPending} onClick={handleClose}>
关闭 关闭
</Button> </Button>
)} )}
...@@ -124,7 +127,7 @@ export default function ButtonModal() { ...@@ -124,7 +127,7 @@ export default function ButtonModal() {
} }
destroyOnClose destroyOnClose
width={800} width={800}
onCancel={() => setOpen(false)}> onCancel={handleClose}>
<div style={{ minHeight: 300, padding: '20px 0' }}> <div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} labelCol={{ span: 5 }} preserve={false}> <Form form={form} labelCol={{ span: 5 }} preserve={false}>
{steps.map((item, index) => ( {steps.map((item, index) => (
......
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { message } from 'antd'
import { processData } from './api'
import type { ProcessDataParams } from './types'
import { useProcessProgressQuery } from '@/hooks/useQuery'
// 处理数据
export function useProcessData() {
const queryClient = useQueryClient()
const { data, start, remove } = useProcessProgressQuery({ function_name: 'type' })
const query = useMutation({
mutationFn: (data: ProcessDataParams) => {
start()
return processData(data)
},
onSuccess: () => {
message.success('处理完成')
queryClient.invalidateQueries({ queryKey: ['data'] })
},
})
return { ...query, progress: data.progress, message: data.message, remove }
}
export interface ProcessDataParams {
fields: string
action: string
rules: string
rule: string
specify: string
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论