Files
cn-rdms-web/src/views/workbench/composables/use-workbench-modules.ts

300 lines
8.3 KiB
TypeScript
Raw Normal View History

import type { Component } from 'vue';
import { markRaw, shallowRef } from 'vue';
export type WorkbenchModuleKey =
// 保留:现有 key 沿用(避免影响线上用户布局存储)
| 'myTodo' // A1 · 我的待办
| 'myRequirement' // B9 · 我的需求
| 'myProject' // B7 · 我参与的项目
| 'shortcut' // E19 · 快捷入口
| 'projectHealth' // C15 · 产品 / 项目健康度
| 'favorite' // E21 · 我的收藏 / 关注
// 重构key 沿用,组件内容重写)
| 'myTask' // A2 · 我的今日(原"我的任务"
| 'teamTodo' // C11 · 团队任务看板(原"团队待办汇总"
refactor(workbench): 重构待办面板功能提升用户体验 - 替换原有时间桶过滤为分类标签页和截止时间筛选器 - 添加优先级排序功能,支持任务类别内按优先级排序 - 重构待办数据结构,新增创建时间和优先级字段 - 移除高优先级标记,统一使用优先级枚举值 - 添加个人事项创建对话框和相关操作功能 - 更新模拟数据以匹配新的数据结构和功能需求 - 优化列表排序逻辑,按创建时间升序排列,无截止时间排最后 - 为各类别待办项添加逾期状态标识和计数统计 - 实现分页加载,每页显示5条待办记录 - 更新样式类名以匹配新的逾期判断逻辑 refactor(project): 优化项目执行模块提升性能和可维护性 - 移除执行项点击切换功能相关的事件和方法 - 删除不再使用的select-execution事件发射器 - 移除执行标签的悬停效果和鼠标指针样式 - 重构任务表格视图,将日期格式化函数名称标准化 - 在跨执行模式下也显示进度列,统一界面布局 - 更新最近更新列宽度并调整日期格式显示 - 将默认页面大小从10增加到20以提高加载效率 feat(list): 统一日期格式化功能简化代码维护 - 将日期时间格式化函数重命名为更准确的date格式化 - 在产品列表和项目列表中统一使用新的日期格式化函数 - 移除秒数显示,仅保留年月日格式提高可读性 refactor(todo): 重构待办事项数据模型和过滤逻辑 - 重新定义待办事项分类类型,移除mention添加personal - 新增主标签、截止时间筛选器和优先级类型定义 - 添加创建时间字段用于排序和显示 - 实现基于分类、截止时间和优先级的过滤函数 - 创建优先级权重映射用于排序算法 - 更新待办项构建函数以支持新的排序逻辑 - 修改逾期判断逻辑以适应新的数据结构 - 移除原有的高优先级字段,统一使用优先级枚举 - 添加优先级排序功能支持升序降序切换 - 重构排序算法,优先按创建时间,其次按截止时间排序 refactor(task): 清理任务模块中已废弃的功能 - 移除通过ID选择执行项的相关函数和事件处理器 - 删除任务卡片和表格中的执行项点击切换功能 - 更新任务工作区组件以移除废弃的事件监听 - 调整任务表格视图中进度条的样式和状态显示 refactor(components): 项目列表中添加进度条可视化组件 - 引入Element Plus进度条组件用于项目进度展示 - 在项目列表中添加进度列并实现进度条渲染 - 配置进度条样式包括内嵌文字、成功状态和边框圆角 - 调整进度列宽度以适应进度条显示需求 refactor(widgets): 整理工作台模块配置和清理冗余组件 - 从工作台模块注册中移除已废弃的myTicket组件 - 更新模块注释说明,明确myTicket已废弃的原因 - 删除不再使用的workbench-my-ticket.vue组件文件 - 更新模块总数注释从16个调整为15个
2026-05-25 14:30:44 +08:00
// 新增 15 个(蓝图 2026-05-22原 A3 myTicket 已废弃:与"我的待办 → 工单"重复且工单业务未上线)
| 'mentions' // A4 · @我的提及
| 'approval' // A5 · 待审批(管理者)
| 'worklogReminder' // A6 · 工时填报提醒(动作型)
| 'myExecution' // B8 · 我负责的执行
| 'personalItem' // B10 · 我的个人事项
| 'projectSnapshot' // F23 · 项目深度快照(对象快照 / pin
| 'productSnapshot' // F24 · 产品深度快照(对象快照 / pin
| 'teamWorklog' // C12 · 团队工时分布(管理者)
| 'teamLoad' // C13 · 团队负载(管理者)
| 'riskAlert' // C14 · 风险预警(管理者)
| 'myWeekWorklog' // D16 · 我的本周工时
| 'myCompletionRate' // D17 · 我的完成率
| 'ticketSla' // D18 · 工单 SLA 总览(管理者 + 工单待开发)
| 'recentVisit' // E20 · 最近访问
| 'noticeNotification'; // E22 · 公告 + 通知摘要
// 扩展action动作型 widget、snapshot对象快照型 widget需 pin 一个对象)
export type WorkbenchModuleCategory = 'personal' | 'manager' | 'tool' | 'action' | 'snapshot';
export type WorkbenchColumnId = 'left' | 'right';
export interface WorkbenchModuleMeta {
key: WorkbenchModuleKey;
component: Component;
displayName: string;
icon: string;
category: WorkbenchModuleCategory;
defaultVisible: boolean;
defaultColumn: WorkbenchColumnId;
defaultOrder: number;
}
const placeholder = markRaw({ render: () => null });
const registry: WorkbenchModuleMeta[] = [
// === 保留 6 个:默认布局沿用原配置,用户线上布局 0 影响 ===
{
key: 'myTodo',
component: placeholder,
displayName: '我的待办',
icon: 'mdi:clipboard-text-clock-outline',
category: 'personal',
defaultVisible: true,
defaultColumn: 'left',
defaultOrder: 1
},
{
key: 'myTask',
component: placeholder,
displayName: '我的今日',
icon: 'mdi:calendar-check-outline',
category: 'personal',
defaultVisible: true,
defaultColumn: 'left',
defaultOrder: 2
},
{
key: 'myRequirement',
component: placeholder,
displayName: '我的需求',
icon: 'mdi:file-document-multiple-outline',
category: 'personal',
defaultVisible: true,
defaultColumn: 'left',
defaultOrder: 3
},
{
key: 'myProject',
component: placeholder,
displayName: '我参与的项目',
icon: 'mdi:briefcase-outline',
category: 'personal',
defaultVisible: true,
defaultColumn: 'right',
defaultOrder: 1
},
{
key: 'shortcut',
component: placeholder,
displayName: '快捷入口',
icon: 'mdi:rocket-launch-outline',
category: 'tool',
defaultVisible: true,
defaultColumn: 'right',
defaultOrder: 2
},
{
key: 'projectHealth',
component: placeholder,
displayName: '产品 / 项目健康度',
icon: 'mdi:heart-pulse',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 10
},
{
key: 'teamTodo',
component: placeholder,
displayName: '团队任务看板',
icon: 'mdi:view-column-outline',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 11
},
{
key: 'favorite',
component: placeholder,
displayName: '我的收藏 / 关注',
icon: 'mdi:star-outline',
category: 'tool',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 30
},
refactor(workbench): 重构待办面板功能提升用户体验 - 替换原有时间桶过滤为分类标签页和截止时间筛选器 - 添加优先级排序功能,支持任务类别内按优先级排序 - 重构待办数据结构,新增创建时间和优先级字段 - 移除高优先级标记,统一使用优先级枚举值 - 添加个人事项创建对话框和相关操作功能 - 更新模拟数据以匹配新的数据结构和功能需求 - 优化列表排序逻辑,按创建时间升序排列,无截止时间排最后 - 为各类别待办项添加逾期状态标识和计数统计 - 实现分页加载,每页显示5条待办记录 - 更新样式类名以匹配新的逾期判断逻辑 refactor(project): 优化项目执行模块提升性能和可维护性 - 移除执行项点击切换功能相关的事件和方法 - 删除不再使用的select-execution事件发射器 - 移除执行标签的悬停效果和鼠标指针样式 - 重构任务表格视图,将日期格式化函数名称标准化 - 在跨执行模式下也显示进度列,统一界面布局 - 更新最近更新列宽度并调整日期格式显示 - 将默认页面大小从10增加到20以提高加载效率 feat(list): 统一日期格式化功能简化代码维护 - 将日期时间格式化函数重命名为更准确的date格式化 - 在产品列表和项目列表中统一使用新的日期格式化函数 - 移除秒数显示,仅保留年月日格式提高可读性 refactor(todo): 重构待办事项数据模型和过滤逻辑 - 重新定义待办事项分类类型,移除mention添加personal - 新增主标签、截止时间筛选器和优先级类型定义 - 添加创建时间字段用于排序和显示 - 实现基于分类、截止时间和优先级的过滤函数 - 创建优先级权重映射用于排序算法 - 更新待办项构建函数以支持新的排序逻辑 - 修改逾期判断逻辑以适应新的数据结构 - 移除原有的高优先级字段,统一使用优先级枚举 - 添加优先级排序功能支持升序降序切换 - 重构排序算法,优先按创建时间,其次按截止时间排序 refactor(task): 清理任务模块中已废弃的功能 - 移除通过ID选择执行项的相关函数和事件处理器 - 删除任务卡片和表格中的执行项点击切换功能 - 更新任务工作区组件以移除废弃的事件监听 - 调整任务表格视图中进度条的样式和状态显示 refactor(components): 项目列表中添加进度条可视化组件 - 引入Element Plus进度条组件用于项目进度展示 - 在项目列表中添加进度列并实现进度条渲染 - 配置进度条样式包括内嵌文字、成功状态和边框圆角 - 调整进度列宽度以适应进度条显示需求 refactor(widgets): 整理工作台模块配置和清理冗余组件 - 从工作台模块注册中移除已废弃的myTicket组件 - 更新模块注释说明,明确myTicket已废弃的原因 - 删除不再使用的workbench-my-ticket.vue组件文件 - 更新模块总数注释从16个调整为15个
2026-05-25 14:30:44 +08:00
// === 新增 15 个:默认全部 hidden进 widget 库待用户挑(避免一上来挤爆工作台) ===
{
key: 'mentions',
component: placeholder,
displayName: '@我的提及',
icon: 'mdi:at',
category: 'personal',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 21
},
{
key: 'approval',
component: placeholder,
displayName: '待审批',
icon: 'mdi:checkbox-multiple-marked-outline',
category: 'manager',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 22
},
{
key: 'worklogReminder',
component: placeholder,
displayName: '工时填报提醒',
icon: 'mdi:timer-sand',
category: 'action',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 20
},
{
key: 'myExecution',
component: placeholder,
displayName: '我负责的执行',
icon: 'mdi:flag-checkered',
category: 'personal',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 23
},
{
key: 'personalItem',
component: placeholder,
displayName: '我的个人事项',
icon: 'mdi:format-list-checks',
category: 'personal',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 24
},
{
key: 'projectSnapshot',
component: placeholder,
displayName: '项目深度快照',
icon: 'mdi:image-area',
category: 'snapshot',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 40
},
{
key: 'productSnapshot',
component: placeholder,
displayName: '产品深度快照',
icon: 'mdi:image-area-close',
category: 'snapshot',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 41
},
{
key: 'teamWorklog',
component: placeholder,
displayName: '团队工时分布',
icon: 'mdi:chart-bar',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 12
},
{
key: 'teamLoad',
component: placeholder,
displayName: '团队负载',
icon: 'mdi:scale-balance',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 13
},
{
key: 'riskAlert',
component: placeholder,
displayName: '风险预警',
icon: 'mdi:alert-octagon-outline',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 14
},
{
key: 'myWeekWorklog',
component: placeholder,
displayName: '我的本周工时',
icon: 'mdi:chart-line',
category: 'personal',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 25
},
{
key: 'myCompletionRate',
component: placeholder,
displayName: '我的完成率',
icon: 'mdi:chart-donut',
category: 'personal',
defaultVisible: false,
defaultColumn: 'left',
defaultOrder: 26
},
{
key: 'ticketSla',
component: placeholder,
displayName: '工单 SLA 总览',
icon: 'mdi:timer-alert-outline',
category: 'manager',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 15
},
{
key: 'recentVisit',
component: placeholder,
displayName: '最近访问',
icon: 'mdi:history',
category: 'tool',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 31
},
{
key: 'noticeNotification',
component: placeholder,
displayName: '公告 + 通知',
icon: 'mdi:bullhorn-outline',
category: 'tool',
defaultVisible: false,
defaultColumn: 'right',
defaultOrder: 32
}
];
const registryRef = shallowRef(registry);
export function useWorkbenchModules() {
function getAllModules() {
return registryRef.value;
}
function getModuleMeta(key: WorkbenchModuleKey) {
return registryRef.value.find(m => m.key === key);
}
function registerModuleComponent(key: WorkbenchModuleKey, component: Component) {
const target = registryRef.value.find(m => m.key === key);
if (target) target.component = markRaw(component);
}
return { getAllModules, getModuleMeta, registerModuleComponent };
}