feat: replace tenants with organization management

This commit is contained in:
2026-07-10 21:27:26 +08:00
parent 8ed1682b90
commit 8f0991a51f
49 changed files with 1292 additions and 698 deletions

View File

@@ -67,11 +67,11 @@ const StudentsPage: React.FC = () => {
const [data, setData] = useState<any[]>([]);
const [loading, setLoading] = useState(false);
const [modalOpen, setModalOpen] = useState(false);
const [tenants, setTenants] = useState<any[]>([]);
const [organizations, setOrganizations] = useState<any[]>([]);
const [editing, setEditing] = useState<any>(null);
const [searchName, setSearchName] = useState('');
const [filterStatus, setFilterStatus] = useState<string | undefined>(undefined);
const [filterTenantId, setFilterTenantId] = useState<number | undefined>(undefined);
const [filterOrganizationId, setFilterOrganizationId] = useState<number | undefined>(undefined);
const [showArchived, setShowArchived] = useState(false);
const [archivedCount, setArchivedCount] = useState(0);
const [selectedRowKeys, setSelectedRowKeys] = useState<number[]>([]);
@@ -136,7 +136,7 @@ const StudentsPage: React.FC = () => {
includeArchived: 'true',
};
if (filterStatus) params.status = filterStatus;
if (filterTenantId) params.tenantId = filterTenantId;
if (filterOrganizationId) params.organizationId = filterOrganizationId;
const res = (await api.get('/students', { params })) as Array<Record<string, unknown>>;
const list = res as Array<Record<string, unknown>>;
const archived = list.filter((r) => r.status === 'archived');
@@ -147,7 +147,7 @@ const StudentsPage: React.FC = () => {
message.error(err?.message || '加载失败,请稍后重试');
}
setLoading(false);
}, [searchName, showArchived, filterStatus, filterTenantId]);
}, [searchName, showArchived, filterStatus, filterOrganizationId]);
useEffect(() => {
fetchData();
@@ -155,9 +155,9 @@ const StudentsPage: React.FC = () => {
useEffect(() => {
api
.get('/tenants', { params: { includeArchived: 'false' } })
.get('/organizations', { params: { includeArchived: 'false' } })
.then((res: unknown) => {
setTenants(res as Array<{ id: number; name: string }>);
setOrganizations(res as Array<{ id: number; name: string }>);
})
.catch(() => {});
}, []);
@@ -325,15 +325,15 @@ const StudentsPage: React.FC = () => {
{ title: '紧急联系人电话', dataIndex: 'emergencyPhone', width: 130 },
{
title: '所属机构',
dataIndex: 'tenant',
dataIndex: 'organization',
width: 100,
render: (tenant: { name?: string } | null) =>
tenant?.name ? (
render: (organization: { name?: string } | null) =>
organization?.name ? (
<Tag
color="purple"
style={{ maxWidth: '100%', overflow: 'hidden', textOverflow: 'ellipsis' }}
>
{tenant.name}
{organization.name}
</Tag>
) : (
'-'
@@ -415,7 +415,7 @@ const StudentsPage: React.FC = () => {
),
},
],
[handleViewSensitive, openDrawer, showArchived, tenants],
[handleViewSensitive, openDrawer, showArchived, organizations],
);
return (
@@ -457,12 +457,12 @@ const StudentsPage: React.FC = () => {
placeholder="所属机构"
allowClear
style={{ width: 140 }}
value={filterTenantId}
value={filterOrganizationId}
onChange={(v) => {
setFilterTenantId(v);
setFilterOrganizationId(v);
}}
>
{tenants.map((t: { id: number; name: string }) => (
{organizations.map((t: { id: number; name: string }) => (
<Select.Option key={t.id} value={t.id}>
{t.name}
</Select.Option>
@@ -502,6 +502,8 @@ const StudentsPage: React.FC = () => {
onClick={() => {
setEditing(null);
form.resetFields();
const host = organizations.find((organization) => organization.isHost);
if (host) form.setFieldValue('organizationId', host.id);
setModalOpen(true);
}}
>
@@ -661,14 +663,21 @@ const StudentsPage: React.FC = () => {
<Form.Item name="emergencyPhone" label="紧急联系人电话">
<Input />
</Form.Item>
<Form.Item name="tenantId" label="所属机构" tooltip="选择租赁方,留空表示本机构">
<Form.Item
name="organizationId"
label="所属机构"
rules={[{ required: true, message: '请选择所属机构' }]}
>
<Select
allowClear
placeholder="选择租赁方"
options={tenants.map((t: { id: number; name: string }) => ({
value: t.id,
label: t.name,
}))}
showSearch
optionFilterProp="label"
placeholder="选择所属机构"
options={organizations.map(
(organization: { id: number; name: string; isHost?: boolean }) => ({
value: organization.id,
label: organization.isHost ? `${organization.name}(本机构)` : organization.name,
}),
)}
/>
</Form.Item>
<Form.Item name="supervisor" label="负责人/班主任">