fix: resolve all admin typecheck errors (typed api wrapper, unused imports, missing hooks, PermissionButton children)

This commit is contained in:
2026-07-06 01:02:26 +08:00
parent 4a48a65a48
commit 6b0a21d266
22 changed files with 4051 additions and 273 deletions

View File

@@ -29,35 +29,7 @@ import PermissionButton from '../../components/PermissionButton';
const { RangePicker } = DatePicker;
const expenseTypeOptions = [
{ value: 'water', label: '水费' },
{ value: 'electricity', label: '电费' },
{ value: 'cleaning', label: '保洁费' },
{ value: 'damage', label: '损坏赔偿' },
{ value: 'other', label: '其他' },
];
const personalExpenseTypeOptions = [
{ value: 'damage', label: '物品损坏' },
{ value: 'cleaning', label: '保洁费' },
{ value: 'penalty', label: '罚款' },
{ value: 'key', label: '钥匙费' },
{ value: 'remote', label: '空调遥控器' },
{ value: 'deposit_deduction', label: '押金扣除' },
{ value: 'other', label: '其他' },
];
const typeMap: Record<string, string> = {
water: '水费',
electricity: '电费',
cleaning: '保洁费',
damage: '损坏赔偿',
penalty: '罚款',
key: '钥匙费',
remote: '空调遥控器',
deposit_deduction: '押金扣除',
other: '其他',
};
const ExpensesPage: React.FC = () => {
const [roomExpenses, setRoomExpenses] = useState<any[]>([]);
@@ -78,6 +50,31 @@ const ExpensesPage: React.FC = () => {
const [selectedRoomKeys, setSelectedRoomKeys] = useState<number[]>([]);
const [selectedPersonalKeys, setSelectedPersonalKeys] = useState<number[]>([]);
// Dynamic expense type options from API
const [typeOptions, setTypeOptions] = useState<{ value: string; label: string }[]>([]);
const [personalTypeOptions, setPersonalTypeOptions] = useState<{ value: string; label: string }[]>([]);
const [typeMap, setTypeMap] = useState<Record<string, string>>({});
useEffect(() => {
api.get<Array<{ code: string; name: string; category: string }>>('/expense-types').then((types) => {
const roomTypes: { value: string; label: string }[] = [];
const personalTypes: { value: string; label: string }[] = [];
const map: Record<string, string> = {};
for (const t of types) {
map[t.code] = t.name;
if (t.category === 'room' || t.category === 'both') {
roomTypes.push({ value: t.code, label: t.name });
}
if (t.category === 'personal' || t.category === 'both') {
personalTypes.push({ value: t.code, label: t.name });
}
}
setTypeOptions(roomTypes);
setPersonalTypeOptions(personalTypes);
setTypeMap(map);
}).catch(() => {});
}, []);
const handleBatchDeleteRoom = async () => {
try {
const res: any = await api.post('/expenses/room/batch-delete', { ids: selectedRoomKeys });
@@ -237,7 +234,7 @@ const ExpensesPage: React.FC = () => {
setRoomModal(true);
}}
>
{''}
</PermissionButton>
<Popconfirm
title="确定删除?"
@@ -252,7 +249,9 @@ const ExpensesPage: React.FC = () => {
size="small"
danger
icon={<DeleteOutlined />}
/>
>
</PermissionButton>
</Popconfirm>
</Space>
),
@@ -291,7 +290,7 @@ const ExpensesPage: React.FC = () => {
setPersonalModal(true);
}}
>
{''}
</PermissionButton>
<Popconfirm
title="确定删除?"
@@ -306,7 +305,9 @@ const ExpensesPage: React.FC = () => {
size="small"
danger
icon={<DeleteOutlined />}
/>
>
</PermissionButton>
</Popconfirm>
</Space>
),
@@ -347,7 +348,7 @@ const ExpensesPage: React.FC = () => {
style={{ width: 120 }}
value={roomTypeFilter}
onChange={(v) => setRoomTypeFilter(v)}
options={expenseTypeOptions}
options={typeOptions}
/>
<Upload
accept=".xlsx,.xls"
@@ -480,7 +481,7 @@ const ExpensesPage: React.FC = () => {
style={{ width: 120 }}
value={personalTypeFilter}
onChange={(v) => setPersonalTypeFilter(v)}
options={personalExpenseTypeOptions}
options={personalTypeOptions}
/>
<Upload
accept=".xlsx,.xls"
@@ -625,7 +626,7 @@ const ExpensesPage: React.FC = () => {
/>
</Form.Item>
<Form.Item name="expenseType" label="费用类型" rules={[{ required: true }]}>
<Select options={expenseTypeOptions} />
<Select options={typeOptions} />
</Form.Item>
<Form.Item name="amount" label="金额(元)" rules={[{ required: true }]}>
<InputNumber min={0} precision={2} style={{ width: '100%' }} />
@@ -670,7 +671,7 @@ const ExpensesPage: React.FC = () => {
/>
</Form.Item>
<Form.Item name="expenseType" label="费用类型" rules={[{ required: true }]}>
<Select options={personalExpenseTypeOptions} />
<Select options={personalTypeOptions} />
</Form.Item>
<Form.Item name="amount" label="金额(元)" rules={[{ required: true }]}>
<InputNumber min={0} precision={2} style={{ width: '100%' }} />