usrApi.ts 5.5 KB
// 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,
  }));
}