245 lines
6.2 KiB
TypeScript
245 lines
6.2 KiB
TypeScript
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;
|
||
};
|