feat(project): 重构甘特图为vue-ganttastic组件并更新项目统计卡片
Some checks failed
Lint Code / Lint Code (push) Failing after 1m35s

- 替换原有甘特图任务条样式计算,改用vue-ganttastic库渲染任务条和里程碑
- 根据任务状态和进度生成不同颜色,支持关键里程碑标识
- 实现甘特图日期范围计算及任务、里程碑数据格式转换
- 优化甘特图和里程碑的布局与样式,提升交互体验
- 移除右侧项目AI助手相关代码及样式
- 项目首页统计卡片文字和图标调整,展示项目总数、进行中、已完成等状态
- 平均进度条样式优化,补充高风险项目数量显示
This commit is contained in:
2026-03-28 19:22:56 +08:00
parent cfa3a57a57
commit 31627b95c0
2 changed files with 364 additions and 295 deletions

View File

@@ -128,38 +128,43 @@ function getRiskType(risk?: string): "success" | "warning" | "danger" {
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">进行中项目</p>
<p class="text-gray-500 text-sm">项目总数</p>
<p class="text-2xl font-bold mt-1">
{{ statistics.totalCount }}
</p>
<p class="text-xs text-blue-500 mt-1">
<el-icon
><component :is="useRenderIcon('ri/folder-line')"
/></el-icon>
包含各状态项目
</p>
</div>
<div class="stat-icon bg-blue-100">
<el-icon :size="24" color="#409eff">
<component :is="useRenderIcon('ri/folders-line')" />
</el-icon>
</div>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">进行中</p>
<p class="text-2xl font-bold mt-1">
{{ statistics.ongoingCount }}
</p>
<p class="text-xs text-green-500 mt-1">
<el-icon
><component :is="useRenderIcon('ri/arrow-up-line')"
><component :is="useRenderIcon('ri/play-circle-line')"
/></el-icon>
较上月增加2个
{{ statistics.planningCount }} 个规划中
</p>
</div>
<div class="stat-icon bg-blue-100">
<el-icon :size="24" color="#409eff">
<component :is="useRenderIcon('ri/folder-line')" />
</el-icon>
</div>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">已完成项目</p>
<p class="text-2xl font-bold mt-1">
{{ statistics.completedCount }}
</p>
<p class="text-xs text-gray-400 mt-1">本年度累计完成</p>
</div>
<div class="stat-icon bg-green-100">
<el-icon :size="24" color="#67c23a">
<component :is="useRenderIcon('ri/check-line')" />
<component :is="useRenderIcon('ri/play-circle-line')" />
</el-icon>
</div>
</div>
@@ -169,41 +174,50 @@ function getRiskType(risk?: string): "success" | "warning" | "danger" {
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">高风险项目</p>
<p class="text-2xl font-bold mt-1 text-orange-500">
{{ statistics.highRiskCount }}
</p>
<p class="text-xs text-orange-400 mt-1">需要重点关注</p>
</div>
<div class="stat-icon bg-orange-100">
<el-icon :size="24" color="#e6a23c">
<component :is="useRenderIcon('ri/alert-line')" />
</el-icon>
</div>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">平均完成率</p>
<p class="text-gray-500 text-sm">已完成</p>
<p class="text-2xl font-bold mt-1">
{{ Math.round(statistics.averageProgress || 0) }}%
{{ statistics.completedCount }}
</p>
<p class="text-xs text-gray-400 mt-1">
{{ statistics.pausedCount }} 个已暂停 |
{{ statistics.cancelledCount }} 个已取消
</p>
<el-progress
:percentage="Math.round(statistics.averageProgress || 0)"
:show-text="false"
class="mt-2"
style="width: 100px"
/>
</div>
<div class="stat-icon bg-purple-100">
<el-icon :size="24" color="#9b59b6">
<component :is="useRenderIcon('ri/check-double-line')" />
</el-icon>
</div>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-card shadow="hover" class="stat-card">
<div class="flex-bc">
<div>
<p class="text-gray-500 text-sm">平均进度</p>
<p class="text-2xl font-bold mt-1">
{{ Math.round(statistics.averageProgress || 0) }}%
</p>
<p class="text-xs text-orange-400 mt-1">
<el-icon
><component :is="useRenderIcon('ri/alert-line')"
/></el-icon>
{{ statistics.highRiskCount }} 个高风险项目
</p>
</div>
<div class="stat-icon bg-orange-100">
<el-icon :size="24" color="#e6a23c">
<component :is="useRenderIcon('ri/bar-chart-line')" />
</el-icon>
</div>
</div>
<el-progress
:percentage="Math.round(statistics.averageProgress || 0)"
:show-text="false"
class="mt-2"
style="width: 100%"
/>
</el-card>
</el-col>
</el-row>