usrApi.ts 3.03 KB
// REQ-USR-004: USR 模块 API 封装(登录 + 版本下拉取数)。页面只调本文件,不散用 axios。
// REQ-USR-003: 新增用户列表分页查询 listUsers(GET /api/usr/users,中文键归一 D-PLAN-2)。
import request from './request';
import type {
  LoginPayload,
  LoginResult,
  CompanyOption,
  UserVO,
  PageResult,
  UserListQuery,
} 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,
  };
}