实现团队成员更新功能和筛选功能

This commit is contained in:
马诗敏 2025-08-11 15:54:44 +08:00
parent a80a23fd74
commit e60e4cf095
3 changed files with 677 additions and 139 deletions

View File

@ -156,14 +156,14 @@ export interface ProjectDetailResp extends ProjectCard {
export interface TeamMemberResp { export interface TeamMemberResp {
id: string | number id: string | number
name: string name: string
position: string roleType: string
phone?: string phone?: string
email?: string email?: string
avatar?: string avatar?: string
joinDate?: string joinDate?: string
performance?: number performance?: number
remark?: string remark?: string
status?: 'available' | 'busy' | 'offline' status?: 'ACTIVE' | 'SUSPENDED' | 'INACTIVE'
} }
/** 后端返回的团队成员数据结构 */ /** 后端返回的团队成员数据结构 */
@ -182,7 +182,7 @@ export interface BackendTeamMemberResp {
phone: string | null phone: string | null
email: string | null email: string | null
position: string position: string
status: 'ACTIVE' | 'BUSY' | 'OFFLINE' status: 'ACTIVE' | 'SUSPENDED' | 'INACTIVE'
skills: string skills: string
joinDate: string joinDate: string
remark: string remark: string
@ -201,11 +201,11 @@ export interface BackendTeamMemberResp {
export interface TeamMemberQuery extends PageQuery { export interface TeamMemberQuery extends PageQuery {
projectId: string | number projectId: string | number
name?: string // 姓名搜索 name?: string // 姓名搜索
position?: string // 岗位筛选 position?: string // 项目岗位筛选
status?: string // 状态筛选 status?: string // 状态筛选
joinDateStart?: string // 入职日期开始 joinDateStart?: string // 入职日期开始
joinDateEnd?: string // 入职日期结束 joinDateEnd?: string // 入职日期结束
sortBy?: 'name' | 'position' | 'joinDate' | 'status' // 排序字段 sortBy?: 'name' | 'roleType' | 'joinDate' | 'status' // 排序字段
sortOrder?: 'asc' | 'desc' // 排序方向 sortOrder?: 'asc' | 'desc' // 排序方向
} }
@ -213,33 +213,33 @@ export interface TeamMemberQuery extends PageQuery {
export interface TeamMemberExportQuery { export interface TeamMemberExportQuery {
projectId: string | number projectId: string | number
name?: string // 姓名搜索 name?: string // 姓名搜索
position?: string // 岗位筛选 position?: string // 项目岗位筛选
status?: string // 状态筛选 status?: string // 状态筛选
joinDateStart?: string // 入职日期开始 joinDateStart?: string // 入职日期开始
joinDateEnd?: string // 入职日期结束 joinDateEnd?: string // 入职日期结束
sortBy?: 'name' | 'position' | 'joinDate' | 'status' // 排序字段 sortBy?: 'name' | 'roleType' | 'joinDate' | 'status' // 排序字段
sortOrder?: 'asc' | 'desc' // 排序方向 sortOrder?: 'asc' | 'desc' // 排序方向
} }
/** 创建团队成员表单 */ /** 创建团队成员表单 */
export interface CreateTeamMemberForm { export interface CreateTeamMemberForm {
projectId: string | number projectId: string | number
roleType: string // 项目岗位
name: string name: string
phone: string phone: string
email?: string email?: string
position: string status?: 'ACTIVE' | 'SUSPENDED' | 'INACTIVE'
status?: 'available' | 'busy' | 'offline'
joinDate?: string joinDate?: string
remark?: string remark?: string
} }
/** 更新团队成员表单 */ /** 更新团队成员表单 */
export interface UpdateTeamMemberForm { export interface UpdateTeamMemberForm {
roleType?: string // 项目岗位
name?: string name?: string
phone?: string phone?: string
email?: string email?: string
position?: string status?: 'ACTIVE' | 'SUSPENDED' | 'INACTIVE'
status?: 'available' | 'busy' | 'offline'
joinDate?: string joinDate?: string
remark?: string remark?: string
} }
@ -250,7 +250,7 @@ export interface UpdateTeamMemberForm {
export interface BatchOperationForm { export interface BatchOperationForm {
ids: (string | number)[] ids: (string | number)[]
operation: 'delete' | 'updateStatus' operation: 'delete' | 'updateStatus'
status?: 'available' | 'busy' | 'offline' status?: 'ACTIVE' | 'SUSPENDED' | 'INACTIVE'
} }
/** 导入结果响应 */ /** 导入结果响应 */

View File

@ -265,7 +265,7 @@
<div class="member-position">{{ member.position || '未设置岗位' }}</div> <div class="member-position">{{ member.position || '未设置岗位' }}</div>
<div class="member-details"> <div class="member-details">
<span class="member-status" :class="member.status"> <span class="member-status" :class="member.status">
{{ member.status === 'available' ? '在线' : '离线' }} {{ member.status === 'ACTIVE' ? '在线' : '离线' }}
</span> </span>
<span class="member-date">入职: {{ member.joinDate || '未设置' }}</span> <span class="member-date">入职: {{ member.joinDate || '未设置' }}</span>
</div> </div>
@ -468,7 +468,7 @@ const mapProjectRespToProjectCard = (projectResp: any): any => {
position: member.roleTypeDesc || member.jobCodeDesc || '未设置岗位', position: member.roleTypeDesc || member.jobCodeDesc || '未设置岗位',
phone: member.phone || '', // phone: member.phone || '', //
email: member.email || '', // email: member.email || '', //
status: member.status === 'ACTIVE' ? 'available' : 'offline', status: member.status === 'ACTIVE' ? 'ACTIVE' : 'INACTIVE',
skills: [], // skills: [], //
joinDate: member.joinDate || '未设置', joinDate: member.joinDate || '未设置',
remark: member.remark || member.jobDesc || '', remark: member.remark || member.jobDesc || '',
@ -1326,13 +1326,13 @@ onMounted(async () => {
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
&.available { &.ACTIVE {
background: linear-gradient(135deg, #e6f7ff 0%, #bae7ff 100%); background: linear-gradient(135deg, #e6f7ff 0%, #bae7ff 100%);
color: #1890ff; color: #1890ff;
border: 1px solid #91d5ff; border: 1px solid #91d5ff;
} }
&.offline { &.INACTIVE {
background: linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%); background: linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%);
color: #8c8c8c; color: #8c8c8c;
border: 1px solid #d9d9d9; border: 1px solid #d9d9d9;