更新人员组织接口文档

This commit is contained in:
马诗敏 2025-08-15 14:46:18 +08:00
parent 4ea535b82f
commit 2efceee37f
2 changed files with 765 additions and 33 deletions

View File

@ -0,0 +1,486 @@
// ==================== 人员组织管理专用类型定义 ====================
import type {
ProjectResp,
ConstructorResp,
CertificationResp,
WorkGroup,
WorkTypeGroup,
WorkGroupMember
} from './type'
// ==================== 项目相关类型 ====================
/**
*
*/
export interface ProjectWithWorkGroups extends ProjectResp {
workGroups?: WorkGroup[]
// 添加一些前端显示需要的字段
statusLabel?: string // 状态标签文本
workGroupCount?: number // 工作组数量
totalRequiredWorkers?: number // 总需求工人数
totalAssignedWorkers?: number // 总已分配工人数
}
/**
*
*/
export interface ProjectSelectorQuery {
status?: number
projectName?: string
projectCode?: string
farmName?: string
hasWorkGroups?: boolean // 是否包含工作组
page?: number
pageSize?: number
}
// ==================== 工作组表单类型 ====================
/**
*
*/
export interface WorkGroupFormData {
id?: string // 工作组ID编辑时使用
name: string
description: string
projectId: string
workTypeGroups: WorkTypeGroupForm[]
}
/**
*
*/
export interface WorkTypeGroupForm {
id?: string
name: string
requiredCount: number
priority: 'HIGH' | 'MEDIUM' | 'LOW'
assignedCount?: number
workers?: ConstructorResp[] // 已分配的工人
}
/**
*
*/
export interface CreateWorkGroupRequest {
name: string
description: string
projectId: string
workTypeGroups: Array<{
name: string
requiredCount: number
priority: 'HIGH' | 'MEDIUM' | 'LOW'
}>
}
// ==================== 工人筛选和分配类型 ====================
/**
*
*/
export interface WorkerFilterForm {
workTypes: string[]
certificateKeyword: string
experienceMin?: number
experienceMax?: number
status?: string
ratingMin?: number
ratingMax?: number
}
/**
*
*/
export interface WorkerAssignment {
workTypeName: string
workers: ConstructorResp[]
requiredCount: number
assignedCount: number
}
/**
*
*/
export interface WorkerAssignmentMap {
[workTypeName: string]: ConstructorResp[]
}
/**
*
*/
export interface DragAssignmentEvent {
worker: ConstructorResp
fromWorkType?: string
toWorkType: string
workGroupId: string
}
// ==================== 证书查看类型 ====================
/**
*
*/
export interface WorkerCertificateView {
worker: ConstructorResp
certificates: CertificationResp[]
}
/**
*
*/
export interface CertificateStatusDisplay {
status: string
color: string
text: string
icon?: string
}
// ==================== 工作组详情类型 ====================
/**
*
*/
export interface WorkGroupDetailView {
workGroup: WorkGroup
project: ProjectWithWorkGroups
memberDetails: WorkGroupMemberDetail[]
statistics: WorkGroupStatistics
}
/**
*
*/
export interface WorkGroupMemberDetail extends WorkGroupMember {
workTypes: string[]
certifications: CertificationResp[]
experience: number
// rating: number // 已注销
joinDate: string
lastActiveDate?: string
}
/**
*
*/
export interface WorkGroupStatistics {
totalMembers: number
totalRequired: number
completionRate: number
workTypeDistribution: Array<{
workTypeName: string
requiredCount: number
assignedCount: number
completionRate: number
}>
skillCoverage: Array<{
skillName: string
memberCount: number
coverageRate: number
}>
}
// ==================== 工作流步骤类型 ====================
/**
*
*/
export interface PersonnelWorkflowStep {
step: number
name: string
description: string
icon: string
status: 'pending' | 'in-progress' | 'completed' | 'error'
message?: string
canProceed: boolean
canGoBack: boolean
}
/**
*
*/
export interface PersonnelWorkflowStatus {
currentStep: number
steps: PersonnelWorkflowStep[]
projectId: string
lastUpdated: string
}
// ==================== 统计和报表类型 ====================
/**
*
*/
export interface PersonnelOrganizationOverview {
totalProjects: number
activeProjects: number
totalWorkGroups: number
totalWorkers: number
assignedWorkers: number
availableWorkers: number
overallCompletionRate: number
}
/**
*
*/
export interface ProjectPersonnelStats {
projectId: string
projectName: string
workGroupCount: number
totalRequiredWorkers: number
totalAssignedWorkers: number
completionRate: number
workTypeStats: Array<{
workTypeName: string
requiredCount: number
assignedCount: number
shortageCount: number
priority: 'HIGH' | 'MEDIUM' | 'LOW'
}>
}
/**
*
*/
export interface WorkerSkillStats {
skillName: string
totalWorkers: number
availableWorkers: number
assignedWorkers: number
averageExperience: number
// averageRating: number // 已注销
certificationCount: number
}
// ==================== 导入导出类型 ====================
/**
*
*/
export interface WorkerImportTemplate {
headers: string[]
requiredFields: string[]
optionalFields: string[]
sampleData: string[][]
validationRules: Array<{
field: string
rule: string
message: string
}>
}
/**
*
*/
export interface ImportResultDetail {
row: number
data: Record<string, any>
status: 'success' | 'error' | 'warning'
message: string
field?: string
}
/**
*
*/
export interface ImportStatistics {
totalRows: number
successRows: number
errorRows: number
warningRows: number
skippedRows: number
details: ImportResultDetail[]
}
// ==================== 通知和提醒类型 ====================
/**
*
*/
export interface PersonnelAssignmentNotification {
id: string
type: 'email' | 'sms' | 'system' | 'push'
title: string
message: string
recipients: string[]
workGroupId: string
workGroupName: string
projectId: string
projectName: string
status: 'pending' | 'sent' | 'delivered' | 'failed'
sendTime?: string
deliveryTime?: string
readTime?: string
}
/**
*
*/
export interface NotificationTemplate {
id: string
name: string
type: 'email' | 'sms' | 'system'
title: string
content: string
variables: string[]
isDefault: boolean
}
// ==================== 权限和角色类型 ====================
/**
*
*/
export interface PersonnelOrganizationPermissions {
canViewProjects: boolean
canCreateWorkGroups: boolean
canEditWorkGroups: boolean
canDeleteWorkGroups: boolean
canAssignWorkers: boolean
canRemoveWorkers: boolean
canViewWorkerDetails: boolean
canExportData: boolean
canImportData: boolean
canSendNotifications: boolean
}
/**
*
*/
export interface UserRolePermissions {
roleId: string
roleName: string
permissions: PersonnelOrganizationPermissions
projectScope: 'all' | 'assigned' | 'managed'
dataScope: 'all' | 'department' | 'project'
}
// ==================== 搜索和查询类型 ====================
/**
*
*/
export interface AdvancedSearchCriteria {
projectCriteria: {
status?: number[]
farmName?: string
startDate?: string
endDate?: string
projectManager?: string
}
workerCriteria: {
workTypes?: string[]
experienceRange?: [number, number]
// ratingRange?: [number, number] // 已注销
certificationTypes?: string[]
status?: string[]
}
workGroupCriteria: {
status?: string[]
memberCountRange?: [number, number]
createdDateRange?: [string, string]
}
}
/**
*
*/
export interface PersonnelSearchResult {
projects: ProjectWithWorkGroups[]
workers: ConstructorResp[]
workGroups: WorkGroup[]
totalCount: number
searchTime: string
searchCriteria: AdvancedSearchCriteria
}
// ==================== 响应和错误类型 ====================
/**
* API响应包装
*/
export interface ApiResponse<T = any> {
success: boolean
data?: T
message?: string
code?: string | number
timestamp: string
}
/**
*
*/
export interface PaginatedResponse<T = any> {
list: T[]
total: number
page: number
pageSize: number
totalPages: number
hasNext: boolean
hasPrev: boolean
}
/**
*
*/
export interface ErrorResponse {
success: false
error: {
code: string | number
message: string
details?: any
timestamp: string
}
}
// ==================== 工具类型 ====================
/**
*
*/
export interface StatusMapping<T = string> {
[key: string]: T
}
/**
*
*/
export interface ColorMapping {
[key: string]: string
}
/**
*
*/
export interface IconMapping {
[key: string]: string
}
/**
*
*/
export interface ValidationRule {
required?: boolean
min?: number
max?: number
pattern?: RegExp
message?: string
validator?: (value: any) => boolean | string
}
/**
*
*/
export interface FormFieldConfig {
name: string
label: string
type: 'input' | 'select' | 'textarea' | 'number' | 'date' | 'checkbox' | 'radio'
required?: boolean
placeholder?: string
options?: Array<{ label: string; value: any }>
validation?: ValidationRule[]
disabled?: boolean
hidden?: boolean
}

View File

@ -1,54 +1,300 @@
import type * as T from './type'
import http from '@/utils/http'
import request from '@/utils/http'
import type {
ProjectWithWorkGroups,
ConstructorResp,
CertificationResp,
WorkGroup,
WorkTypeGroup,
CreateWorkGroupReq,
AssignWorkerReq,
RemoveWorkerReq,
PageRes,
PageQuery
} from './type'
const BASE_URL = '/project/personnel-organization'
// ==================== 项目相关接口 ====================
/** @desc 获取项目列表 */
export function getProjectList(query?: T.ProjectQuery) {
return http.get<PageRes<T.ProjectResp[]>>('/project/list', query)
/**
*
*/
export function getProjectsWithWorkGroups(params?: {
status?: number
projectName?: string
projectCode?: string
farmName?: string
}) {
return request.get<ProjectWithWorkGroups[]>('/api/projects/with-work-groups', params)
}
/** @desc 获取项目人员组织信息 */
export function getPersonnelOrganization(projectId: string | number) {
return http.get<T.PersonnelOrganizationResp>(`${BASE_URL}/${projectId}`)
/**
*
*/
export function getProjectWithWorkGroups(projectId: string) {
return request.get<ProjectWithWorkGroups>(`/api/projects/${projectId}/with-work-groups`)
}
/** @desc 获取工种列表 */
export function getWorkTypeList() {
return http.get<T.WorkTypeResp[]>('/work-type/list')
// ==================== 工作组管理接口 ====================
/**
*
*/
export function createWorkGroup(data: CreateWorkGroupReq) {
return request.post<WorkGroup>('/api/work-groups', data)
}
/** @desc 获取施工人员列表 */
export function getConstructorList(query: T.ConstructorQuery) {
return http.get<PageRes<T.ConstructorResp[]>>('/constructor/list', query)
/**
*
*/
export function getWorkGroupsByProject(projectId: string) {
return request.get<WorkGroup[]>(`/api/projects/${projectId}/work-groups`)
}
/** @desc 获取施工人员技能证书 */
export function getConstructorCertifications(constructorId: string | number) {
return http.get<T.CertificationResp[]>(`/constructor/${constructorId}/certifications`)
/**
*
*/
export function updateWorkGroup(id: string, data: Partial<CreateWorkGroupReq>) {
return request.put<WorkGroup>(`/api/work-groups/${id}`, data)
}
/** @desc 分配施工人员到项目 */
export function assignConstructorToProject(data: T.AssignConstructorReq) {
return http.post(`${BASE_URL}/assign`, data)
/**
*
*/
export function deleteWorkGroup(id: string) {
return request.del(`/api/work-groups/${id}`)
}
/** @desc 移除项目施工人员 */
export function removeConstructorFromProject(data: T.RemoveConstructorReq) {
return http.delete(`${BASE_URL}/remove`, data)
/**
*
*/
export function getWorkGroupDetail(id: string) {
return request.get<WorkGroup>(`/api/work-groups/${id}`)
}
/** @desc 更新施工人员分配信息 */
export function updateConstructorAssignment(data: T.UpdateAssignmentReq) {
return http.put(`${BASE_URL}/update`, data)
// ==================== 工人管理接口 ====================
/**
*
*/
export function getWorkers(params?: {
workTypes?: string[]
certificateKeyword?: string
status?: string
experienceMin?: number
experienceMax?: number
page?: number
pageSize?: number
}) {
return request.get<PageRes<ConstructorResp>>('/api/workers', params)
}
/** @desc 获取项目人员统计 */
export function getPersonnelStats(projectId: string | number) {
return http.get<T.PersonnelStatsResp>(`${BASE_URL}/${projectId}/stats`)
/**
*
*/
export function getAllWorkers(params?: {
workTypes?: string[]
certificateKeyword?: string
status?: string
experienceMin?: number
experienceMax?: number
}) {
return request.get<ConstructorResp[]>('/api/workers/all', params)
}
/** @desc 导出项目人员组织 */
export function exportPersonnelOrganization(projectId: string | number) {
return http.download(`${BASE_URL}/${projectId}/export`)
/**
*
*/
export function getWorkerDetail(id: string) {
return request.get<ConstructorResp>(`/api/workers/${id}`)
}
/**
*
*/
export function getWorkerCertifications(workerId: string) {
return request.get<CertificationResp[]>(`/api/workers/${workerId}/certifications`)
}
// ==================== 工人分配接口 ====================
/**
*
*/
export function assignWorkerToGroup(data: AssignWorkerReq) {
return request.post('/api/work-groups/assign-worker', data)
}
/**
*
*/
export function removeWorkerFromGroup(data: RemoveWorkerReq) {
return request.post('/api/work-groups/remove-worker', data)
}
/**
*
*/
export function batchAssignWorkers(data: {
workGroupId: string
assignments: Array<{
workTypeName: string
workerIds: string[]
}>
}) {
return request.post('/api/work-groups/batch-assign', data)
}
/**
*
*/
export function getWorkGroupAssignments(workGroupId: string) {
return request.get<{
workTypeName: string
workers: ConstructorResp[]
requiredCount: number
assignedCount: number
}[]>(`/api/work-groups/${workGroupId}/assignments`)
}
// ==================== 统计和查询接口 ====================
/**
*
*/
export function getProjectPersonnelStats(projectId: string) {
return request.get<{
totalWorkers: number
assignedWorkers: number
availableWorkers: number
workTypeStats: Array<{
workTypeName: string
requiredCount: number
assignedCount: number
shortageCount: number
}>
}>(`/api/projects/${projectId}/personnel-stats`)
}
/**
*
*/
export function getWorkTypeStats() {
return request.get<Array<{
name: string
code: string
availableWorkers: number
totalWorkers: number
}>>('/api/work-types/stats')
}
/**
*
*/
export function searchWorkers(keyword: string, params?: {
workTypes?: string[]
status?: string
limit?: number
}) {
return request.get<ConstructorResp[]>('/api/workers/search', {
keyword,
...params
})
}
// ==================== 导入导出接口 ====================
/**
*
*/
export function exportProjectPersonnel(projectId: string, format: 'excel' | 'pdf' = 'excel') {
return request.get(`/api/projects/${projectId}/personnel-export`, {
format
}, {
responseType: 'blob'
})
}
/**
*
*/
export function importWorkers(file: File, projectId?: string) {
const formData = new FormData()
formData.append('file', file)
if (projectId) {
formData.append('projectId', projectId)
}
return request.post<{
success: boolean
totalCount: number
successCount: number
failCount: number
errors?: Array<{
row: number
message: string
}>
}>('/api/workers/import', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
// ==================== 工作流相关接口 ====================
/**
*
*/
export function getPersonnelWorkflowStatus(projectId: string) {
return request.get<{
currentStep: number
steps: Array<{
step: number
name: string
status: 'pending' | 'in-progress' | 'completed' | 'error'
message?: string
}>
}>(`/api/projects/${projectId}/personnel-workflow`)
}
/**
*
*/
export function updateWorkflowStep(projectId: string, step: number, status: string, message?: string) {
return request.patch(`/api/projects/${projectId}/personnel-workflow/step`, {
step,
status,
message
})
}
// ==================== 通知和提醒接口 ====================
/**
*
*/
export function sendAssignmentNotification(data: {
workGroupId: string
workerIds: string[]
message: string
type: 'email' | 'sms' | 'system'
}) {
return request.post('/api/notifications/assignment', data)
}
/**
*
*/
export function getAssignmentNotifications(workGroupId?: string, params?: PageQuery) {
return request.get<PageRes<{
id: string
workGroupId: string
workGroupName: string
message: string
type: string
status: 'sent' | 'delivered' | 'failed'
sendTime: string
}>>('/api/notifications/assignment', {
workGroupId,
...params
})
}