feat: 完成员工排班模块并统一门店抽屉底部操作样式

This commit is contained in:
2026-02-16 22:43:45 +08:00
parent aebd0c285b
commit becef7e6cb
43 changed files with 5127 additions and 53 deletions

View File

@@ -0,0 +1,186 @@
/**
* 文件职责:员工排班模块 API 与 DTO 定义。
* 1. 维护员工、班次模板、排班表类型。
* 2. 提供查询、保存、删除、复制接口。
*/
import type { PaginatedResult } from '#/api/store';
import { requestClient } from '#/api/request';
/** 员工角色 */
export type StaffRoleType = 'cashier' | 'chef' | 'courier' | 'manager';
/** 员工状态 */
export type StaffStatus = 'active' | 'leave' | 'resigned';
/** 班次类型 */
export type ShiftType = 'evening' | 'full' | 'morning' | 'off';
/** 员工档案 */
export interface StoreStaffDto {
avatarColor: string;
email: string;
hiredAt: string;
id: string;
name: string;
permissions: string[];
phone: string;
roleType: StaffRoleType;
status: StaffStatus;
}
/** 班次模板条目 */
export interface ShiftTemplateItemDto {
endTime: string;
startTime: string;
}
/** 门店班次模板 */
export interface StoreShiftTemplatesDto {
evening: ShiftTemplateItemDto;
full: ShiftTemplateItemDto;
morning: ShiftTemplateItemDto;
}
/** 单日排班 */
export interface StaffDayShiftDto {
dayOfWeek: number;
endTime: string;
shiftType: ShiftType;
startTime: string;
}
/** 员工排班 */
export interface StaffScheduleDto {
shifts: StaffDayShiftDto[];
staffId: string;
}
/** 门店排班聚合 */
export interface StoreStaffScheduleDto {
schedules: StaffScheduleDto[];
storeId: string;
templates: StoreShiftTemplatesDto;
weekStartDate: string;
}
/** 员工列表查询参数 */
export interface StoreStaffListQuery {
keyword?: string;
page: number;
pageSize: number;
roleType?: StaffRoleType;
status?: StaffStatus;
storeId: string;
}
/** 保存员工参数 */
export interface SaveStoreStaffParams {
email: string;
id?: string;
name: string;
permissions: string[];
phone: string;
roleType: StaffRoleType;
status: StaffStatus;
storeId: string;
}
/** 删除员工参数 */
export interface DeleteStoreStaffParams {
staffId: string;
storeId: string;
}
/** 保存班次模板参数 */
export interface SaveStoreStaffTemplatesParams {
storeId: string;
templates: StoreShiftTemplatesDto;
}
/** 保存个人排班参数 */
export interface SaveStoreStaffPersonalScheduleParams {
shifts: StaffDayShiftDto[];
staffId: string;
storeId: string;
}
/** 保存周排班参数 */
export interface SaveStoreStaffWeeklyScheduleParams {
schedules: StaffScheduleDto[];
storeId: string;
}
/** 复制排班参数 */
export interface CopyStoreStaffScheduleParams {
copyScope: 'template_and_schedule';
sourceStoreId: string;
targetStoreIds: string[];
}
/** 获取员工列表 */
export async function getStoreStaffListApi(params: StoreStaffListQuery) {
return requestClient.get<PaginatedResult<StoreStaffDto>>('/store/staff', {
params,
});
}
/** 新增/编辑员工 */
export async function saveStoreStaffApi(data: SaveStoreStaffParams) {
return requestClient.post<StoreStaffDto>('/store/staff/save', data);
}
/** 删除员工 */
export async function deleteStoreStaffApi(data: DeleteStoreStaffParams) {
return requestClient.post('/store/staff/delete', data);
}
/** 获取门店排班配置 */
export async function getStoreStaffScheduleApi(
storeId: string,
weekStartDate?: string,
) {
return requestClient.get<StoreStaffScheduleDto>('/store/staff/schedule', {
params: {
storeId,
weekStartDate,
},
});
}
/** 保存班次模板 */
export async function saveStoreStaffTemplatesApi(
data: SaveStoreStaffTemplatesParams,
) {
return requestClient.post<StoreShiftTemplatesDto>(
'/store/staff/template/save',
data,
);
}
/** 保存单员工排班 */
export async function saveStoreStaffPersonalScheduleApi(
data: SaveStoreStaffPersonalScheduleParams,
) {
return requestClient.post<StaffScheduleDto>(
'/store/staff/schedule/personal/save',
data,
);
}
/** 保存周排班 */
export async function saveStoreStaffWeeklyScheduleApi(
data: SaveStoreStaffWeeklyScheduleParams,
) {
return requestClient.post<StoreStaffScheduleDto>(
'/store/staff/schedule/weekly/save',
data,
);
}
/** 复制班次模板与排班 */
export async function copyStoreStaffScheduleApi(
data: CopyStoreStaffScheduleParams,
) {
return requestClient.post('/store/staff/copy', data);
}