245 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import request from '@/utils/request';
// 用户相关类型定义
export interface User {
id?: number;
username: string;
realName?: string;
phone?: string;
email?: string;
deptId?: number;
deptName?: string;
status?: number;
isAdmin?: number; // 是否管理员:0-否 1-是
avatar?: string;
createTime?: string;
updateTime?: string;
}
export interface PageResult<T> {
records: T[];
total: number;
size: number;
current: number;
pages: number;
}
/**
* 分页查询用户列表
*/
export const getUserList = async (
pageNum: number = 1,
pageSize: number = 10,
keyword?: string,
deptId?: number,
status?: number,
includeChildren?: boolean
): Promise<PageResult<User>> => {
const params: any = { pageNum, pageSize };
if (keyword) params.keyword = keyword;
if (deptId) params.deptId = deptId;
if (status !== undefined) params.status = status;
if (includeChildren !== undefined) params.includeChildren = includeChildren;
const response = await request.get('/users', { params });
return response.data;
};
/**
* 获取全部用户列表
*/
export const getAllUsers = async (): Promise<User[]> => {
const response = await request.get('/users/all');
return response.data || [];
};
/**
* 获取所有需求部门的成员列表(用于跨部门分配)
*/
export const getAllDemandDeptMembers = async (): Promise<User[]> => {
const response = await request.get('/users/demand-dept-members');
return response.data || [];
};
/**
* 根据ID获取用户
*/
export const getUserById = async (id: number): Promise<User> => {
const response = await request.get(`/users/${id}`);
return response.data;
};
/**
* 创建用户
*/
export const createUser = async (user: User): Promise<User> => {
const response = await request.post('/users', user);
return response.data;
};
/**
* 更新用户
*/
export const updateUser = async (id: number, user: Partial<User>): Promise<boolean> => {
const response = await request.put(`/users/${id}`, user);
return response.data;
};
/**
* 删除用户
*/
export const deleteUser = async (id: number): Promise<boolean> => {
const response = await request.delete(`/users/${id}`);
return response.data;
};
/**
* 重置密码
*/
export const resetPassword = async (id: number, newPassword: string = '123456'): Promise<boolean> => {
const response = await request.post(`/users/${id}/reset-password`, { newPassword });
return response.data;
};
/**
* 修改密码
*/
export const changePassword = async (
id: number,
oldPassword: string,
newPassword: string
): Promise<boolean> => {
const response = await request.post(`/users/${id}/change-password`, {
oldPassword,
newPassword
});
return response.data;
};
/**
* 为用户分配角色
*/
export const assignUserRoles = async (userId: number, roleIds: number[]): Promise<boolean> => {
const response = await request.post(`/users/${userId}/roles`, roleIds);
return response.data;
};
/**
* 获取用户的角色ID列表
*/
export const getUserRoleIds = async (userId: number): Promise<number[]> => {
const response = await request.get(`/users/${userId}/roles`);
return response.data;
};
/**
* 启用/禁用用户
*/
export const toggleUserStatus = async (id: number, status: number): Promise<boolean> => {
const response = await request.put(`/users/${id}/status`, null, {
params: { status }
});
return response.data;
};
/**
* 调整用户所属部门
*/
export const updateUserDepartment = async (id: number, deptId: number | null): Promise<any> => {
const response = await request.put(`/users/${id}/department`, { deptId });
return response.data;
};
/**
* 设计师及工作量信息
*/
export interface DesignerWithWorkload {
id: number;
username: string;
realName: string;
deptId?: number;
deptName?: string;
inProgressCount: number; // 进行中的任务数量
earliestDeadline?: string; // 最早预计完成时间
}
/**
* 获取设计师列表及工作量
* @param deptId 部门ID(可选)
* @param taskTypeId 任务类型ID(可选,优先根据任务类型配置的接单部门获取设计师)
*/
export const getDesignersWithWorkload = async (deptId?: number, taskTypeId?: number): Promise<DesignerWithWorkload[]> => {
const params: any = {};
if (taskTypeId) params.taskTypeId = taskTypeId; // 优先使用 taskTypeId
else if (deptId) params.deptId = deptId;
const response = await request.get('/users/designers-with-workload', { params });
return response.data || [];
};
/**
* 设置/取消管理员
*/
export const setAdmin = async (id: number, isAdmin: number): Promise<boolean> => {
const response = await request.put(`/users/${id}/admin`, { isAdmin });
return response.data;
};
export type UserOffboardingScope = 'demand' | 'receiver' | 'all';
export interface UserOffboardingRequest {
fromUserId?: number;
toUserId?: number;
scope: UserOffboardingScope;
disableFromUser: boolean;
reason: string;
}
export interface OffboardingTaskSample {
taskId: number;
taskNo: string;
title: string;
status: string;
roles: string;
}
export interface UserOffboardingPreview {
fromUserId: number;
fromUserName: string;
toUserId: number;
toUserName: string;
scope: UserOffboardingScope;
affectedTaskCount: number;
publisherTaskCount: number;
primaryPublisherTaskCount: number;
detailCompleterTaskCount: number;
receiverTaskCount: number;
receiverTaskItemCount: number;
samples: OffboardingTaskSample[];
}
export interface UserOffboardingExecuteResult {
preview: UserOffboardingPreview;
updatedPublisherTasks: number;
updatedPrimaryPublisherTasks: number;
updatedDetailCompleterTasks: number;
updatedReceiverTasks: number;
updatedReceiverTaskItems: number;
transferLogCount: number;
sourceUserDisabled: boolean;
executedAt: string;
}
export const previewUserOffboarding = async (
payload: UserOffboardingRequest
): Promise<UserOffboardingPreview> => {
const response = await request.post('/users/offboarding/preview', payload);
return response.data;
};
export const executeUserOffboarding = async (
payload: UserOffboardingRequest
): Promise<UserOffboardingExecuteResult> => {
const response = await request.post('/users/offboarding/execute', payload);
return response.data;
};