实现打印界面跳转自动搜索工号

This commit is contained in:
Vectorune
2025-11-11 16:45:54 +08:00
parent e8f47684fb
commit fe309da1e5
2 changed files with 161 additions and 132 deletions

View File

@ -154,8 +154,22 @@ function QueryConditionBox(props) {
</Row>
<Flex justify={"space-between"} align={"center"}>
<Flex justify={"start"} align={"center"}>
<Button icon={<PlusOutlined/>}
onClick={() => navigate('/generate-certificate')}>生成新证明</Button>
{/*修改生成新证明按钮的点击事件*/}
<Button
icon={<PlusOutlined />}
onClick={() => {
const selectedStaffNumbers = form.getFieldValue('staffNumber') || [];
const baseUrl = '/generate-certificate';
// 携带工号和来源标记(用于区分跳转场景)
if (selectedStaffNumbers.length > 0) {
navigate(`${baseUrl}?staffNumber=${selectedStaffNumbers[0]}&from=print`);
} else {
navigate(baseUrl);
}
}}
>
生成新证明
</Button>
</Flex>
<Flex justify={"center"} align={"center"} gap={"large"}>
<Button type={"primary"} htmlType={"submit"} icon={<SearchOutlined/>}>搜索</Button>

View File

@ -1,24 +1,25 @@
import React, {useEffect} from 'react';
import {Button, Flex, Form, Input, message, Spin, Table, Typography} from "antd";
import React, { useEffect, useState, useRef } from 'react';
import { Button, Flex, Form, Input, message, Spin, Table, Typography } from "antd";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import { useSearchParams } from 'react-router-dom';
const ChooseUser = props => {
const {allowNext, request, setRequest} = props;
const {Title, Text} = Typography;
const { allowNext, request, setRequest } = props;
const [searchParams] = useSearchParams(); // 获取URL参数
const [autoProcessed, setAutoProcessed] = useState(false); // 防止重复处理
const { Title, Text } = Typography;
const [messageApi, contextHolder] = message.useMessage();
const [form] = Form.useForm();
const dataFetchRef = useRef(false); // 防止重复请求
const commonAxios = creatMessageCommonAxios(messageApi);
// 初始加载标记
const [isInitialLoad, setIsInitialLoad] = useState(true);
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
hidden: true,
width: 0,
},
{
title: '工号',
@ -41,107 +42,121 @@ const ChooseUser = props => {
},
];
const [staffInfo, setStaffInfo] = React.useState([]);
const [staffInfo, setStaffInfo] = useState([]);
const [staffNumberPrefix, setStaffNumberPrefix] = useState("");
const [spinning, setSpinning] = useState(true);
const [staffNumberPrefix, setStaffNumberPrefix] = React.useState("");
const [spinning, setSpinning] = React.useState(true);
// 处理选中行逻辑
const handleRowSelect = (selectedRowKeys, selectedRows) => {
console.log(`选中行: ${selectedRowKeys}`, selectedRows);
allowNext(selectedRows.length > 0);
if (selectedRows.length > 0) {
setRequest({ ...request, stuffNumber: selectedRows[0].staffNumber });
}
};
const rowSelection = {
onChange: (selectedRowKeys, selectedRows) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
allowNext(selectedRows.length > 0);
setRequest({...request, stuffNumber: selectedRows[0].staffNumber});
//sessionStorage.setItem('chooseUser', selectedRowKeys)
//sessionStorage.removeItem('certificateParam');
//sessionStorage.removeItem('targetKeys');
//sessionStorage.removeItem('generate-request');
},
//defaultSelectedRowKeys: () => {
// const selectedRowKeys = [];
// let selected = sessionStorage.getItem('chooseUser');
// if (selected) {
// // 转换为number
// selectedRowKeys.push(selected);
// allowNext(selectedRowKeys.length > 0);
// }
// return selectedRowKeys;
//}
// 移除默认选中行的缓存恢复
onChange: handleRowSelect,
defaultSelectedRowKeys: () => [],
};
useEffect(() => {
commonAxios.get(`/api/auth/query/registered?page=1&size=10`).then((response) => {
if (response.data.data != null) {
let list = response.data.data.list;
// 为list设置key=id
list.forEach((item) => {
item.key = item.id;
});
setStaffInfo(list);
} else {
setStaffInfo([]);
}
});
setSpinning(false);
}, []);
// 通用搜索函数
const fetchStaffData = (staffNumber) => {
if (dataFetchRef.current) return;
dataFetchRef.current = true;
const onSearch = () => {
setSpinning(true);
commonAxios.get(`/api/auth/query/registered?staffNumber=${staffNumberPrefix}&page=1&size=10`).then((response) => {
if (response.data.data != null) {
let list = response.data.data.list;
// 为list设置key=id
list.forEach((item) => {
item.key = item.id;
});
// 仅在有工号时才拼接参数,否则查询全部
const params = staffNumber ? `&staffNumber=${staffNumber}` : '';
commonAxios.get(`/api/auth/query/registered?page=1&size=10${params}`)
.then((response) => {
if (response.data.data?.list) {
const list = response.data.data.list.map(item => ({ ...item, key: item.id }));
setStaffInfo(list);
return list;
} else {
setStaffInfo([]);
return [];
}
})
.then((list) => {
const fromPrint = searchParams.get('from') === 'print';
if (fromPrint && list.length === 1 && !autoProcessed) {
handleRowSelect([list[0].id], [list[0]]);
setAutoProcessed(true);
}
})
.catch(() => {
messageApi.error('搜索失败,请重试');
setStaffInfo([]);
})
.finally(() => {
setSpinning(false);
dataFetchRef.current = false;
});
};
// 监听URL参数从打印界面跳转时处理
useEffect(() => {
const staffNumber = searchParams.get('staffNumber');
const fromPrint = searchParams.get('from') === 'print'; // 标记来自打印界面
// 优先处理:如果有工号参数且来自打印界面,执行搜索
if (staffNumber && fromPrint && !autoProcessed) {
form.setFieldsValue({ 'staff-number': staffNumber });
setStaffNumberPrefix(staffNumber);
fetchStaffData(staffNumber);
setIsInitialLoad(false); // 已处理参数,无需再加载全部
}
// 次要处理:无参数时,初始加载全部数据(仅执行一次)
else if (isInitialLoad) {
fetchStaffData(''); // 空参数表示查询全部
setIsInitialLoad(false);
}
}, [searchParams, form, autoProcessed, isInitialLoad]); // 添加isInitialLoad依赖
// 手动搜索
const onSearch = () => {
fetchStaffData(staffNumberPrefix);
};
return (
<div>
{contextHolder}
<Flex vertical justiffy={"start"} align={"start"} gap={"large"}>
<Flex vertical justify={"start"} align={"start"} gap={"large"}>
<div>
<Title level={4}>选择用户</Title>
<Text level={4}
type={'secondary'}>指示EFC系统为何人生成报告选择后这份报告将会出现在您和该同事的EFC系统证明管理画面中</Text>
<Text type={'secondary'}>
指示EFC系统为何人生成报告选择后这份报告将会出现在您和该同事的EFC系统证明管理画面中
</Text>
</div>
<Form
form={form}
layout={"inline"}
>
<Form.Item
name='staff-number'
>
<Input placeholder={"工号"} onChange={(event) => setStaffNumberPrefix(event.target.value)}/>
<Form form={form} layout={"inline"}>
<Form.Item name='staff-number'>
<Input
placeholder={"工号"}
onChange={(e) => setStaffNumberPrefix(e.target.value)}
onPressEnter={onSearch} // 支持回车搜索
/>
</Form.Item>
<Button type={"primary"} onClick={() => onSearch()}>搜索</Button>
<Button type={"primary"} onClick={onSearch}>搜索</Button>
</Form>
<div style={{width: '100%'}}>
<div style={{ width: '100%' }}>
<Spin spinning={spinning}>
<Table
columns={columns}
dataSource={staffInfo}
pagination={false}
rowSelection={{
type: 'radio',
...rowSelection,
}}
rowSelection={{ type: 'radio', ...rowSelection }}
locale={{ emptyText: '暂无数据,请输入工号搜索' }}
/>
</Spin>
</div>
</Flex>
</div>
)
;
}
;
);
};
ChooseUser.propTypes = {};