|
|
@@ -1,18 +1,21 @@
|
|
|
import React, { useState, useEffect } from 'react';
|
|
|
-import { Card, List, Typography, Spin } from 'antd';
|
|
|
+import { Card, List, Typography, Spin, Table, DatePicker } from 'antd';
|
|
|
import { deviceApi } from '../api/deviceApi';
|
|
|
+import moment from 'moment';
|
|
|
|
|
|
const { Title, Text } = Typography;
|
|
|
+const { RangePicker } = DatePicker;
|
|
|
|
|
|
const AttendanceSystem = () => {
|
|
|
const [deviceInfo, setDeviceInfo] = useState(null);
|
|
|
const [attendanceRecords, setAttendanceRecords] = useState([]);
|
|
|
const [loading, setLoading] = useState(true);
|
|
|
+ const [dateRange, setDateRange] = useState([moment().subtract(7, 'days'), moment()]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
fetchDeviceInfo();
|
|
|
fetchAttendanceRecords();
|
|
|
- }, []);
|
|
|
+ }, [dateRange]);
|
|
|
|
|
|
const fetchDeviceInfo = async () => {
|
|
|
try {
|
|
|
@@ -24,10 +27,10 @@ const AttendanceSystem = () => {
|
|
|
};
|
|
|
|
|
|
const fetchAttendanceRecords = async () => {
|
|
|
+ setLoading(true);
|
|
|
try {
|
|
|
- const endTime = new Date().toISOString();
|
|
|
- const startTime = new Date(new Date().setDate(new Date().getDate() - 7)).toISOString();
|
|
|
- const records = await deviceApi.getAttendanceRecords(startTime, endTime);
|
|
|
+ const [startDate, endDate] = dateRange;
|
|
|
+ const records = await deviceApi.getAttendanceRecords(startDate.toISOString(), endDate.toISOString());
|
|
|
setAttendanceRecords(records);
|
|
|
} catch (error) {
|
|
|
console.error('获取考勤记录失败', error);
|
|
|
@@ -36,6 +39,29 @@ const AttendanceSystem = () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+ const handleDateRangeChange = (dates) => {
|
|
|
+ setDateRange(dates);
|
|
|
+ };
|
|
|
+
|
|
|
+ const columns = [
|
|
|
+ {
|
|
|
+ title: '会友ID',
|
|
|
+ dataIndex: 'personId',
|
|
|
+ key: 'personId',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '姓名',
|
|
|
+ dataIndex: 'name',
|
|
|
+ key: 'name',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '打卡时间',
|
|
|
+ dataIndex: 'timestamp',
|
|
|
+ key: 'timestamp',
|
|
|
+ render: (text) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
return (
|
|
|
<div>
|
|
|
<Title level={2}>考勤系统</Title>
|
|
|
@@ -46,15 +72,16 @@ const AttendanceSystem = () => {
|
|
|
<p><Text strong>设备名称:</Text> {deviceInfo.deviceName}</p>
|
|
|
</Card>
|
|
|
)}
|
|
|
- <Card title="考勤记录">
|
|
|
- <List
|
|
|
+ <Card title="考勤记录" extra={
|
|
|
+ <RangePicker
|
|
|
+ value={dateRange}
|
|
|
+ onChange={handleDateRangeChange}
|
|
|
+ />
|
|
|
+ }>
|
|
|
+ <Table
|
|
|
dataSource={attendanceRecords}
|
|
|
- renderItem={(record, index) => (
|
|
|
- <List.Item key={index}>
|
|
|
- <Text>人员ID: {record.personId}</Text>
|
|
|
- <Text>打卡时间: {record.timestamp}</Text>
|
|
|
- </List.Item>
|
|
|
- )}
|
|
|
+ columns={columns}
|
|
|
+ rowKey={(record) => `${record.personId}-${record.timestamp}`}
|
|
|
/>
|
|
|
</Card>
|
|
|
</Spin>
|