Files
time-tracking-system/templates/statistics.html
bf1942 8938ce2708 refactor(api): 重构数据库访问为SQLAlchemy绑定的session
- 统一移除手动创建的数据库session,统一使用models模块中的db.session
- 修正项目创建接口,增加开始和结束日期的格式验证与处理
- 更新导入项目接口,使用枚举类型校验项目类型并优化异常处理
- 更新统计接口,避免多次查询假期数据,优化日期字符串处理
- 删除回滚前多余的session关闭调用,改为使用db.session.rollback()
- app.py中重构数据库初始化:统一配置SQLAlchemy,动态创建数据库路径和表
- 项目模型新增开始日期和结束日期字段支持
- 添加导入批次历史记录模型支持
- 优化工具函数中日期类型提示,移除无用导入
- 更新requirements.txt依赖版本回退,确保兼容性
- 前端菜单添加导入历史导航入口,实现页面访问路由绑定
2025-09-04 18:12:24 +08:00

234 lines
11 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>统计分析 - 个人工时记录系统</title>
<link rel="stylesheet" href="/static/css/styles.css">
</head>
<body>
<nav class="navbar">
<div class="nav-container">
<div class="nav-brand">
<h1>个人工时记录系统</h1>
</div>
<ul class="nav-menu">
<li><a href="/" class="nav-link">首页</a></li>
<li><a href="/projects" class="nav-link">项目管理</a></li>
<li><a href="/timerecords" class="nav-link">工时记录</a></li>
<li><a href="/statistics" class="nav-link active">统计分析</a></li>
<li><a href="/import" class="nav-link">导入历史</a></li>
</ul>
</div>
</nav>
<main class="main-content">
<div class="container">
<div class="page-header">
<h2>统计分析</h2>
<div class="page-actions">
<button class="btn btn-primary" onclick="showCreatePeriodModal()">新建周期</button>
</div>
</div>
<!-- 周期选择和控制 -->
<div class="period-control">
<div class="form-row">
<div class="form-group">
<label for="period-select">Cut-Off周期</label>
<select id="period-select" class="form-control" onchange="loadWeeklyStats()">
<option value="">请选择周期</option>
</select>
</div>
<div class="form-group">
<label>或者自定义日期范围</label>
<div class="date-range">
<input type="date" id="custom-start-date" class="form-control" placeholder="开始日期">
<span>-</span>
<input type="date" id="custom-end-date" class="form-control" placeholder="结束日期">
<button class="btn btn-secondary" onclick="loadCustomStats()">查看统计</button>
</div>
</div>
</div>
</div>
<!-- 统计概览 -->
<div id="stats-overview" class="stats-section" style="display:none;">
<div class="period-info">
<h3 id="current-period-name">周期名称</h3>
<p id="period-date-range">日期范围</p>
</div>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-value" id="workday-total">0:00</div>
<div class="stat-label">工作日总工时</div>
</div>
<div class="stat-card">
<div class="stat-value" id="holiday-total">0:00</div>
<div class="stat-label">休息日工时</div>
</div>
<div class="stat-card">
<div class="stat-value" id="weekly-total">0:00</div>
<div class="stat-label">总工时</div>
</div>
<div class="stat-card">
<div class="stat-value" id="completion-rate">0%</div>
<div class="stat-label">目标完成度</div>
</div>
</div>
<div class="working-days-info">
<div class="day-stats">
<span class="day-stat-item"><span class="day-stat-label">工作天数:</span><strong id="working-days">0</strong></span>
<span class="day-stat-item"><span class="day-stat-label">休息日工作:</span><strong id="holiday-work-days">0</strong></span>
<span class="day-stat-item"><span class="day-stat-label">休息天数:</span><strong id="rest-days">0</strong></span>
</div>
</div>
</div>
<!-- 每日工时详情表格 -->
<div id="daily-details" class="table-section" style="display:none;">
<h3>每日工时详情</h3>
<div class="table-container">
<table class="data-table" id="daily-stats-table">
<thead>
<tr>
<th>日期</th>
<th>星期</th>
<th>事件</th>
<th>项目</th>
<th>开始时间</th>
<th>结束时间</th>
<th>Activity Num</th>
<th>工时</th>
</tr>
</thead>
<tbody id="daily-stats-tbody">
</tbody>
</table>
</div>
</div>
<!-- 项目工时分布 -->
<div id="project-distribution" class="chart-section" style="display:none;">
<h3>项目工时分布</h3>
<div class="distribution-layout">
<div class="chart-container">
<canvas id="project-hours-chart"></canvas>
</div>
<div class="table-container distribution-table">
<table class="data-table">
<thead>
<tr>
<th>项目</th>
<th>工时</th>
<th>占比</th>
</tr>
</thead>
<tbody id="project-hours-tbody">
<!-- 数据将由JS填充 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</main>
<!-- 新建Cut-Off周期模态框 -->
<div id="create-period-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3>新建Cut-Off周期</h3>
<button class="close-btn" onclick="closeModal('create-period-modal')">&times;</button>
</div>
<form id="period-form">
<div class="modal-body">
<div class="form-group">
<label for="period_name">周期名称 *</label>
<input type="text" id="period_name" name="period_name" class="form-control"
placeholder="如2024年12月-2025年1月" required>
</div>
<div class="form-row">
<div class="form-group">
<label for="start_date">开始日期 *</label>
<input type="date" id="start_date" name="start_date"
class="form-control" onchange="calculatePeriodInfo()" required>
</div>
<div class="form-group">
<label for="end_date">结束日期 *</label>
<input type="date" id="end_date" name="end_date"
class="form-control" onchange="calculatePeriodInfo()" required>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="weeks">周数</label>
<input type="number" id="weeks" name="weeks" class="form-control"
min="1" readonly>
</div>
<div class="form-group">
<label for="target_hours">目标工时</label>
<input type="number" id="target_hours" name="target_hours"
class="form-control" min="1" step="1">
</div>
</div>
<div class="period-templates">
<h4>快速模板:</h4>
<div class="template-buttons">
<button type="button" class="btn btn-outline" onclick="applyTemplate('four-weeks')">
4周周期 (160小时)
</button>
<button type="button" class="btn btn-outline" onclick="applyTemplate('five-weeks')">
5周周期 (200小时)
</button>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" onclick="closeModal('create-period-modal')">取消</button>
<button type="submit" class="btn btn-primary">创建</button>
</div>
</form>
</div>
</div>
<!-- 周期管理模态框 -->
<div id="manage-periods-modal" class="modal">
<div class="modal-content large">
<div class="modal-header">
<h3>Cut-Off周期管理</h3>
<button class="close-btn" onclick="closeModal('manage-periods-modal')">&times;</button>
</div>
<div class="modal-body">
<div class="table-container">
<table class="data-table" id="periods-table">
<thead>
<tr>
<th>周期名称</th>
<th>开始日期</th>
<th>结束日期</th>
<th>周数</th>
<th>目标工时</th>
<th>操作</th>
</tr>
</thead>
<tbody id="periods-tbody">
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" onclick="closeModal('manage-periods-modal')">关闭</button>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="/static/js/common.js"></script>
<script src="/static/js/statistics.js"></script>
</body>