Skip to content

Commit

Permalink
feat(mis): 完善平台管理的平台用户列表 (#419)
Browse files Browse the repository at this point in the history
  • Loading branch information
qhqhqhq committed Jan 16, 2023
1 parent a91f503 commit 1611749
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 11 deletions.
18 changes: 15 additions & 3 deletions apps/mis-server/src/services/user.ts
Expand Up @@ -441,17 +441,29 @@ export const userServiceServer = plugin((server) => {

getAllUsers: async ({ request, em }) => {

const { page, pageSize } = request;

const [users, count] = await em.findAndCount(User, {}, {
const { page, pageSize, idOrName } = request;

const [users, count] = await em.findAndCount(User, idOrName ? {
$or: [
{ userId: idOrName },
{ name: idOrName },
],
} : {}, {
...paginationProps(page, pageSize || 10),
populate: ["tenant", "accounts", "accounts.account"],
});

return [{
totalCount: count,
platformUsers: users.map((x) => ({
userId: x.userId,
name: x.name,
availableAccounts: x.accounts.getItems()
.filter((ua) => ua.status === UserStatus.UNBLOCKED)
.map((ua) => {
return ua.account.getProperty("accountName");
}),
tenantName: x.tenant.$.name,
createTime: x.createTime.toISOString(),
platformRoles: x.platformRoles.map(platformRoleFromJSON),
})),
Expand Down
65 changes: 65 additions & 0 deletions apps/mis-server/tests/admin/user.test.ts
Expand Up @@ -163,30 +163,95 @@ it("get all users", async () => {
expect(users.platformUsers.map((x) => ({
userId: x.userId,
name: x.name,
availableAccounts: x.availableAccounts,
tenantName: x.tenantName,
createTime: x.createTime,
platformRoles: x.platformRoles,
}))).toIncludeSameMembers([
{
userId: data.userA.userId,
name: data.userA.name,
availableAccounts: [data.accountA.accountName],
tenantName: data.userA.tenant.getProperty("name"),
createTime: data.userA.createTime.toISOString(),
platformRoles: data.userA.platformRoles,
},
{
userId: data.userB.userId,
name: data.userB.name,
availableAccounts: [data.accountA.accountName, data.accountB.accountName],
tenantName: data.userB.tenant.getProperty("name"),
createTime: data.userB.createTime.toISOString(),
platformRoles: data.userB.platformRoles,
},
{
userId: data.userC.userId,
name: data.userC.name,
availableAccounts: [],
tenantName: data.userC.tenant.getProperty("name"),
createTime: data.userC.createTime.toISOString(),
platformRoles: data.userC.platformRoles,
},
]);
});

it("get all users with idOrName", async () => {
const data = await insertInitialData(server.ext.orm.em.fork());

// with id
const users1 = await asyncClientCall(client, "getAllUsers", {
page:1,
pageSize:10,
idOrName: "a",
});

expect(users1.totalCount).toBe(1);
expect(users1.platformUsers.map((x) => ({
userId: x.userId,
name: x.name,
availableAccounts: x.availableAccounts,
tenantName: x.tenantName,
createTime: x.createTime,
platformRoles: x.platformRoles,
}))).toIncludeSameMembers([
{
userId: data.userA.userId,
name: data.userA.name,
availableAccounts: [data.accountA.accountName],
tenantName: data.userA.tenant.getProperty("name"),
createTime: data.userA.createTime.toISOString(),
platformRoles: data.userA.platformRoles,
},
]);

// with name
const users2 = await asyncClientCall(client, "getAllUsers", {
page:1,
pageSize:10,
idOrName: "BName",
});

expect(users2.totalCount).toBe(1);
expect(users2.platformUsers.map((x) => ({
userId: x.userId,
name: x.name,
availableAccounts: x.availableAccounts,
tenantName: x.tenantName,
createTime: x.createTime,
platformRoles: x.platformRoles,
}))).toIncludeSameMembers([
{
userId: data.userB.userId,
name: data.userB.name,
availableAccounts: [data.accountA.accountName, data.accountB.accountName],
tenantName: data.userB.tenant.getProperty("name"),
createTime: data.userB.createTime.toISOString(),
platformRoles: data.userB.platformRoles,
},
]);

});

it("manage platform role", async () => {
const em = server.ext.orm.em.fork();
const data = await insertInitialData(em);
Expand Down
8 changes: 8 additions & 0 deletions apps/mis-web/src/apis/api.mock.ts
Expand Up @@ -140,24 +140,32 @@ export const mockApi: MockApi<typeof api> = {
{
userId: "123",
name: "testuser",
availableAccounts: ["a_123"],
tenantName: "tenant1",
createTime: "2022-10-05T23:49:50.000Z",
platformRoles: [PlatformRole.PLATFORM_FINANCE, PlatformRole.PLATFORM_ADMIN],
},
{
userId: "test01",
name: "test01",
availableAccounts: ["a_test", "a_test01"],
tenantName: "tenant2",
createTime: "2022-10-05T23:49:50.000Z",
platformRoles: [PlatformRole.PLATFORM_FINANCE, PlatformRole.PLATFORM_ADMIN],
},
{
userId: "test02",
name: "test02",
availableAccounts: ["a_test", "a_test02"],
tenantName: "tenant2",
createTime: "2022-10-05T23:49:50.000Z",
platformRoles: [PlatformRole.PLATFORM_FINANCE],
},
{
userId: "test03",
name: "test03",
availableAccounts: ["a_test", "a_test03"],
tenantName: "tenant2",
createTime: "2022-10-05T23:49:50.000Z",
platformRoles: [],
},
Expand Down
2 changes: 1 addition & 1 deletion apps/mis-web/src/layouts/routes.tsx
Expand Up @@ -44,7 +44,7 @@ export const platformAdminRoutes: (platformRoles: PlatformRole[]) => NavItemProp
},
{
Icon: UserOutlined,
text: "全部用户",
text: "平台用户列表",
path: "/admin/users",
},
{
Expand Down
2 changes: 1 addition & 1 deletion apps/mis-web/src/models/User.ts
Expand Up @@ -29,7 +29,7 @@ export const PlatformRole = {
export type PlatformRole = ValueOf<typeof PlatformRole>;

export const PlatformRoleTexts = {
[PlatformRole.PLATFORM_FINANCE]: "财务人员",
[PlatformRole.PLATFORM_FINANCE]: "平台财务人员",
[PlatformRole.PLATFORM_ADMIN]: "平台管理员",
};

Expand Down
40 changes: 37 additions & 3 deletions apps/mis-web/src/pageComponents/admin/AllUsersTable.tsx
Expand Up @@ -12,15 +12,19 @@

import { formatDateTime } from "@scow/lib-web/build/utils/datetime";
import { PlatformUserInfo } from "@scow/protos/build/server/user";
import { App, Divider, Space, Table } from "antd";
import { App, Button, Divider, Form, Input, Space, Table } from "antd";
import React, { useCallback, useState } from "react";
import { useAsync } from "react-async";
import { api } from "src/apis";
import { ChangePasswordModalLink } from "src/components/ChangePasswordModal";
import { FilterFormContainer } from "src/components/FilterFormContainer";
import { PlatformRoleSelector } from "src/components/PlatformRoleSelector";
import { GetAllUsersSchema } from "src/pages/api/admin/getAllUsers";
import { User } from "src/stores/UserStore";

interface FilterForm {
idOrName: string | undefined;
}

interface PageInfo {
page: number;
Expand All @@ -32,21 +36,45 @@ interface Props {
user: User;
}


export const AllUsersTable: React.FC<Props> = ({ refreshToken, user }) => {

const [ query, setQuery ] = useState<FilterForm>(() => {
return { idOrName: undefined };
});

const [form] = Form.useForm<FilterForm>();

const [pageInfo, setPageInfo] = useState<PageInfo>({ page: 1, pageSize: 10 });

const promiseFn = useCallback(async () => {
return await api.getAllUsers({ query: {
page: pageInfo.page,
pageSize: pageInfo.pageSize,
idOrName: query.idOrName,
} });
}, [pageInfo]);
}, [query, pageInfo]);
const { data, isLoading, reload } = useAsync({ promiseFn, watch: refreshToken });

return (
<div>
<FilterFormContainer>
<Form<FilterForm>
layout="inline"
form={form}
initialValues={query}
onFinish={async () => {
const { idOrName } = await form.validateFields();
setQuery({ idOrName: idOrName === "" ? undefined : idOrName });
}}
>
<Form.Item label="用户ID或者姓名" name="idOrName">
<Input />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">搜索</Button>
</Form.Item>
</Form>
</FilterFormContainer>
<UserInfoTable
data={data}
pageInfo={pageInfo}
Expand Down Expand Up @@ -91,6 +119,12 @@ const UserInfoTable: React.FC<UserInfoTableProps> = ({
>
<Table.Column<PlatformUserInfo> dataIndex="userId" title="用户ID" />
<Table.Column<PlatformUserInfo> dataIndex="name" title="姓名" />
<Table.Column<PlatformUserInfo> dataIndex="tenantName" title="所属租户" />
<Table.Column<PlatformUserInfo>
dataIndex="availableAccounts"
title="可用账户"
render={(accounts) => accounts.join(",")}
/>
<Table.Column<PlatformUserInfo>
dataIndex="createTime"
title="创建时间"
Expand Down
4 changes: 3 additions & 1 deletion apps/mis-web/src/pages/api/admin/getAllUsers.ts
Expand Up @@ -32,6 +32,7 @@ export interface GetAllUsersSchema {
*/
pageSize?: number;

idOrName?: string;
};

responses: {
Expand All @@ -49,12 +50,13 @@ export default route<GetAllUsersSchema>("GetAllUsersSchema",
return;
}

const { page = 1, pageSize } = req.query;
const { page = 1, pageSize, idOrName } = req.query;

const client = getClient(UserServiceClient);
const result = await asyncClientCall(client, "getAllUsers", {
page,
pageSize,
idOrName,
});

return {
Expand Down
7 changes: 5 additions & 2 deletions protos/server/user.proto
Expand Up @@ -239,13 +239,16 @@ message GetUsersResponse {
message PlatformUserInfo {
string user_id = 1;
string name = 2;
google.protobuf.Timestamp create_time = 3;
repeated PlatformRole platform_roles = 4;
repeated string available_accounts = 3;
string tenant_name = 4;
google.protobuf.Timestamp create_time = 5;
repeated PlatformRole platform_roles = 6;
}

message GetAllUsersRequest {
uint32 page = 1;
optional uint64 page_size = 2;
optional string id_or_name = 3;
}

message GetAllUsersResponse {
Expand Down

0 comments on commit 1611749

Please sign in to comment.