// 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 { return request.post('/usr/login', payload) as unknown as Promise; } /** GET /api/usr/companies —— 登录「版本」下拉项(公司表只读) */ export function fetchCompanies(): Promise { return request.get('/usr/companies') as unknown as Promise; } /** 后端原始用户行(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 本体; * 对 records 逐项做中文键→ASCII 归一后返回 PageResult(D-PLAN-2)。 */ export async function listUsers(query: UserListQuery): Promise> { const params: Record = { 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 >)); 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 { 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 { 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 { 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, })); }