usrApi.ts
5.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// REQ-USR-004: USR 模块 API 封装(登录 + 版本下拉取数)。页面只调本文件,不散用 axios。
// REQ-USR-003: 新增用户列表分页查询 listUsers(GET /api/usr/users,中文键归一 D-PLAN-2)。
// REQ-USR-001 / REQ-USR-002: 用户单据写/读封装(create/update/detail/employees/permissions,D1/D2/D4)。
import request from './request';
import type {
LoginPayload,
LoginResult,
CompanyOption,
UserVO,
PageResult,
UserListQuery,
UserCreateReq,
UserUpdateReq,
EmployeeOption,
PermissionItem,
} from './types';
// 响应拦截器已拆 Result.data,故此处返回类型即业务数据本体。
// axios 实例的方法类型仍标注为 AxiosResponse,运行时已被拦截器解包,用 as unknown 桥接。
/** POST /api/usr/login —— 登录认证,成功返回 { token, user } */
export function login(payload: LoginPayload): Promise<LoginResult> {
return request.post('/usr/login', payload) as unknown as Promise<LoginResult>;
}
/** GET /api/usr/companies —— 登录「版本」下拉项(公司表只读) */
export function fetchCompanies(): Promise<CompanyOption[]> {
return request.get('/usr/companies') as unknown as Promise<CompanyOption[]>;
}
/** 后端原始用户行(docs/05 以中文键名 `员工名`/`部门` 给出,关联职员表派生) */
interface RawUserRecord {
id: number;
sUserName: string;
员工名?: string | null;
employeeName?: string | null;
sUserNo: string | null;
部门?: string | null;
departmentName?: string | null;
sUserType: string;
sLanguage: string;
iIsVoid: number;
tLastLoginDate: string | null;
sCreator: string;
tCreateDate: string;
}
/** 把后端中文键 `员工名`/`部门` 归一为 ASCII `employeeName`/`departmentName`(D-PLAN-2 / spec D9) */
function normalizeUserRecord(raw: RawUserRecord): UserVO {
return {
id: raw.id,
sUserName: raw.sUserName,
employeeName: raw.employeeName ?? raw['员工名'] ?? null,
sUserNo: raw.sUserNo,
departmentName: raw.departmentName ?? raw['部门'] ?? null,
sUserType: raw.sUserType,
sLanguage: raw.sLanguage,
iIsVoid: raw.iIsVoid,
tLastLoginDate: raw.tLastLoginDate,
sCreator: raw.sCreator,
tCreateDate: raw.tCreateDate,
};
}
/**
* GET /api/usr/users —— 用户列表分页查询(只读,BR5)。
* query 走 axios params;`queryValue` 为空字符串时省略(空为全部,BR3)。
* 响应拦截器已拆 Result.data,故此处拿到 PageResult<RawUserRecord> 本体;
* 对 records 逐项做中文键→ASCII 归一后返回 PageResult<UserVO>(D-PLAN-2)。
*/
export async function listUsers(query: UserListQuery): Promise<PageResult<UserVO>> {
const params: Record<string, unknown> = {
pageNum: query.pageNum,
pageSize: query.pageSize,
};
if (query.queryField) params.queryField = query.queryField;
if (query.matchType) params.matchType = query.matchType;
if (query.queryValue) params.queryValue = query.queryValue;
const page = (await (request.get('/usr/users', { params }) as unknown as Promise<
PageResult<RawUserRecord>
>));
return {
records: (page.records ?? []).map(normalizeUserRecord),
total: page.total,
pageNum: page.pageNum,
pageSize: page.pageSize,
};
}
// === REQ-USR-001 / REQ-USR-002 用户单据写/读封装(FE-04) ===
/** POST /api/usr/users —— 新增用户(body 不含密码/审计字段,BR9),返回新建主键 id */
export function createUser(body: UserCreateReq): Promise<{ id: number }> {
return request.post('/usr/users', body) as unknown as Promise<{ id: number }>;
}
/** PUT /api/usr/users/{id} —— 修改用户(body 不含 sUserName,BR3;permissionIds 全量覆盖,BR11) */
export function updateUser(id: number, body: UserUpdateReq): Promise<{ id: number }> {
return request.put('/usr/users/' + id, body) as unknown as Promise<{ id: number }>;
}
/**
* edit 预填:复用 GET /api/usr/users 列表端点(「等于」匹配 + pageSize=1)定位单条(D4)。
* 复用 listUsers 的中文键归一,返回 records[0] ?? null。
*/
export async function getUserDetail(params: {
queryField: string;
queryValue: string;
}): Promise<UserVO | null> {
const page = await listUsers({
queryField: params.queryField,
matchType: '等于',
queryValue: params.queryValue,
pageNum: 1,
pageSize: 1,
});
return page.records[0] ?? null;
}
/** 后端原始员工行(GET /api/usr/employees,D1) */
interface RawEmployeeRecord {
iIncrement: number;
sEmployeeName: string;
sEmployeeNo: string | null;
}
/** GET /api/usr/employees —— 员工名下拉数据源,归一为 EmployeeOption(D1) */
export async function listEmployees(): Promise<EmployeeOption[]> {
const rows = (await (request.get('/usr/employees') as unknown as Promise<
RawEmployeeRecord[]
>)) ?? [];
return rows.map((r) => ({
value: r.iIncrement,
label: r.sEmployeeName,
sEmployeeNo: r.sEmployeeNo ?? null,
}));
}
/** 后端原始权限行(GET /api/usr/permissions,D2/D3) */
interface RawPermissionRecord {
iIncrement: number;
sPermissionName: string;
sPermissionCategory: string;
}
/** GET /api/usr/permissions —— 权限分类列表数据源,归一为 PermissionItem(D2/D3) */
export async function listPermissions(): Promise<PermissionItem[]> {
const rows = (await (request.get('/usr/permissions') as unknown as Promise<
RawPermissionRecord[]
>)) ?? [];
return rows.map((r) => ({
id: r.iIncrement,
name: r.sPermissionName,
category: r.sPermissionCategory,
}));
}