Files
wecom_it_smart_desk/docs/07-项目管理/项目状态看板.html
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交
(5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。

一、docs 结构整改(整改 #14)
根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入,
随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录
树并存于 docs/,共 791 文件、双分类体系冲突。

修复动作:
- b2 同名异主题文件改名迁移保全 9 个
- C 类 39 个孤立文件按主题正确归类
- A/B1 类 222 个重复文件删除(新结构已有内容副本)
- 9 个旧独有空目录删除
- 270 处内部引用按 verified 映射改写
- 整改记录 #14 登记于 04-运维文档/部署运维

结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。
残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。

二、compose 双目录对齐(消除踩坑 A)
- docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist
  改为 src/frontend-*/dist(h5 / agent / admin / terminal)
- docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/
- 效果:本地 docker compose up 不再把根目录 stale dist 挂回,
  与线上一致,分叉隐患消除(已 docker compose config 校验通过)

防复发铁律:
- 重构须提交;仓库修复须 git stash -u 或先 commit
- 新结构须 git add 并提交,避免再次 untracked 复活
- H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
2026-08-07 22:31:32 +08:00

876 lines
32 KiB
HTML
Raw 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>项目状态看板 · IT 智能服务台</title>
<style>
:root {
--accent: #07C160;
--accent-soft: #E7F8EF;
--warn: #FA9D3B;
--danger: #FA5151;
--info: #10AEFF;
--text: #1F2329;
--text-soft: #646A73;
--bg: #FFFFFF;
--bg-soft: #F7F8FA;
--border: #DEE0E3;
--shadow: 0 2px 12px rgba(0,0,0,0.06);
--radius: 8px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; scroll-padding-top: 20px; }
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
color: var(--text);
background: var(--bg-soft);
line-height: 1.7;
font-size: 14px;
}
.container { max-width: 1080px; margin: 0 auto; padding: 24px; }
header {
background: linear-gradient(135deg, var(--accent) 0%, #06AD56 100%);
color: #fff;
padding: 24px 28px;
border-radius: var(--radius);
box-shadow: var(--shadow);
margin-bottom: 24px;
position: relative;
}
header h1 { font-size: 24px; font-weight: 600; margin-bottom: 6px; }
header .meta { font-size: 13px; opacity: 0.92; }
header .meta span { margin-right: 18px; }
header .meta strong { font-weight: 600; }
.version-badge {
position: absolute;
top: 24px;
right: 28px;
background: rgba(255,255,255,0.25);
padding: 4px 10px;
border-radius: 12px;
font-size: 12px;
font-weight: 600;
backdrop-filter: blur(8px);
}
.version-badge.draft { background: rgba(250,157,59,0.95); }
.version-badge.frozen { background: rgba(255,255,255,0.95); color: var(--accent); }
h1, h2, h3, h4 { color: var(--text); margin: 28px 0 12px; line-height: 1.4; }
h1 { font-size: 22px; padding-bottom: 8px; border-bottom: 2px solid var(--accent); }
h2 { font-size: 18px; padding-left: 10px; border-left: 4px solid var(--accent); }
h3 { font-size: 16px; color: var(--text-soft); }
h4 { font-size: 14px; color: var(--text-soft); }
p { margin: 8px 0; }
strong { color: var(--text); }
blockquote {
background: var(--accent-soft);
border-left: 4px solid var(--accent);
padding: 10px 16px;
margin: 12px 0;
border-radius: 4px;
color: var(--text);
}
blockquote p { margin: 4px 0; }
code {
background: var(--bg-soft);
padding: 2px 6px;
border-radius: 3px;
font-family: "Cascadia Code", Consolas, monospace;
font-size: 12px;
color: #C7254E;
}
pre {
background: #1F2329;
color: #E7E8EB;
padding: 14px 18px;
border-radius: var(--radius);
overflow-x: auto;
margin: 12px 0;
}
pre code { background: transparent; color: inherit; padding: 0; font-size: 13px; }
hr { border: none; border-top: 1px solid var(--border); margin: 24px 0; }
table {
width: 100%;
border-collapse: collapse;
background: #fff;
border-radius: var(--radius);
overflow: hidden;
box-shadow: var(--shadow);
margin: 12px 0;
font-size: 13px;
}
thead { background: var(--bg-soft); }
th, td {
padding: 8px 12px;
text-align: left;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
th { font-weight: 600; color: var(--text-soft); font-size: 12px; }
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--accent-soft); }
ul, ol { padding-left: 24px; margin: 8px 0; }
li { margin: 4px 0; }
a { color: var(--accent); text-decoration: none; border-bottom: 1px dashed var(--accent); }
a:hover { background: var(--accent-soft); }
footer {
margin-top: 32px;
padding-top: 16px;
border-top: 1px solid var(--border);
color: var(--text-soft);
font-size: 12px;
text-align: center;
}
.toc {
background: #fff;
padding: 12px 20px;
border-radius: var(--radius);
box-shadow: var(--shadow);
margin: 16px 0 24px;
font-size: 13px;
}
.toc-title { font-weight: 600; color: var(--text-soft); margin-bottom: 8px; }
.toc ul { padding-left: 20px; list-style: none; }
.toc li { margin: 4px 0; }
.toc a {
color: var(--text);
border-bottom: none;
display: block;
padding: 4px 8px;
border-radius: 4px;
transition: all 0.15s ease;
}
.toc a:hover {
background: var(--accent-soft);
color: var(--accent);
transform: translateX(2px);
}
:target { background: var(--accent-soft); transition: background 0.5s ease; }
/* 标题旁的"📑 回到目录"小链接 */
.back-to-toc {
display: inline-block;
font-size: 12px;
margin-left: 10px;
padding: 2px 6px;
border-radius: 4px;
border-bottom: none;
opacity: 0.25;
transition: all 0.15s ease;
vertical-align: middle;
}
.back-to-toc:hover {
opacity: 1;
background: var(--accent-soft);
color: var(--accent);
}
.print-only { display: none; }
@media print {
header { background: var(--accent) !important; -webkit-print-color-adjust: exact; }
body { background: #fff; }
.toc, .filter-bar { display: none; }
table { page-break-inside: avoid; }
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>📋 项目状态看板 · IT 智能服务台</h1>
<div class="meta">
<span>📅 <strong>2026-08-06</strong>GMT+8</span>
<span>📂 源文件:<strong>docs/07-项目管理/项目状态看板.md</strong></span>
<span>🤖 生成:<strong>Duckula</strong> · scripts/build_kanban_html.py</span>
</div>
<span class="version-badge frozen">v1.9.1-FROZEN</span>
</header>
<nav class="toc" id="toc"><div class="toc-title">📑 目录</div><ul><li style="margin-left:0px"><a href="#_2">📊 看板概览</a></li><li style="margin-left:0px"><a href="#p0-high-priority">🔴 P0 必做(高优先级 / High Priority</a></li><li style="margin-left:0px"><a href="#p1-medium-priority">🟡 P1 重要(待办 / Medium Priority</a></li><li style="margin-left:0px"><a href="#awaiting-decision">🟢 等用户决策(阻塞项 / Awaiting Decision</a></li><li style="margin-left:0px"><a href="#req-001">⏸️ 安全策略检查平台 (REQ-集成-001) — 已暂停</a></li><li style="margin-left:0px"><a href="#in-progress">🟠 进行中 (In Progress)</a></li><li style="margin-left:0px"><a href="#to-do">🟡 待开始 (To Do)</a></li><li style="margin-left:0px"><a href="#recently-completed">✅ 最近完成 (Recently Completed)</a></li><li style="margin-left:0px"><a href="#2026-07-1516">✅ 近期完成 (2026-07-15~16)</a></li><li style="margin-left:0px"><a href="#_3">📌 重要技术决策与限制记录</a></li><li style="margin-left:0px"><a href="#_4">📈 任务统计</a></li><li style="margin-left:0px"><a href="#_5">🔗 相关文档</a></li><li style="margin-left:0px"><a href="#_6">📝 看板版本变更记录</a></li></ul></nav>
<main>
<h1 id="_1">项目状态看板</h1>
<blockquote>
<p><strong>版本</strong>: v1.9.1-FROZEN | <strong>更新日期</strong>: 2026-08-06(已审核冻结,对外可引用)<br/>
<strong>变更来源</strong>: 2026-08-06 11:46 看板-部署脱节修复(jumpserver-V2 实测 + docker compose 重启 + nginx reload<br/>
<strong>执行人</strong>: DuckulaAI)· <strong>审核人</strong>: Simon2026-08-06 11:36</p>
<p>📐 <strong>文档管理策略(2026-08-05 锁定 / 2026-08-06 修订 / v1.9.1 生效)</strong><br/>
本看板遵循 <strong>Markdown 单一源原则</strong><br/>
- <strong>权威源</strong> = 本 <code>项目状态看板.md</code>(Git 版本控制 / 程序解析 / PR review 均基于此)<br/>
- <strong>人看副本</strong> = <code>项目状态看板.html</code>(由 <code>scripts/build_kanban_html.py</code> 自动派生,<strong>不手维护</strong><br/>
- <strong>归档副本</strong> = <code>项目状态看板-v1.X.Y-FROZEN.html</code>(每次冻结生成一份,永久保留)<br/>
- <strong>服务发布</strong> = 文件上传至 jumpserver <code>/opt/wecom-it-desk/docs-public/{kanban,inspection}/</code><strong>✅ v1.9.1 起已可对外访问</strong>nginx.conf 加 <code>location /docs/</code> 路由 + docker-compose.yml 加 docs-public 挂载 + reload 已生效。外部 URL 实测:<br/>
- 看板:https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html<br/>
- 巡检:https://itsupport.servyou.com.cn/docs/inspection/2026-08/2026-08-06-早班.html<br/>
- 修改流程:改 .md → 跑脚本生成 .html → 归档副本 → 跑部署脚本上传 → commit &amp; push</p>
</blockquote>
<hr/>
<h2 id="_2">📊 看板概览 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>状态</th>
<th>数量</th>
<th>变化</th>
</tr>
</thead>
<tbody>
<tr>
<td>🔴 P0 必做</td>
<td>5</td>
<td>🆕 -1P0-NEW7 已修复)、P0-NEW8 新增(host 文件结构差异)</td>
</tr>
<tr>
<td>🟡 P1 重要</td>
<td>0</td>
<td>持平</td>
</tr>
<tr>
<td>🟢 等用户决策</td>
<td>2</td>
<td>+1 自然日(25→26 天阈值)</td>
</tr>
<tr>
<td>🟠 进行中</td>
<td>1</td>
<td>持平</td>
</tr>
<tr>
<td>🏷️ 看板治理</td>
<td>1</td>
<td>✅ P0-NEW7 已修复(nginx /docs/ 路由上线)</td>
</tr>
<tr>
<td>🟡 待开始</td>
<td>0</td>
<td>持平</td>
</tr>
<tr>
<td>⏸️ 暂停</td>
<td>5</td>
<td>持平</td>
</tr>
<tr>
<td>✅ 已完成</td>
<td>94</td>
<td>+2P1 Nginx 安全响应头关闭 + #104 运行期日志页结案)</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="p0-high-priority">🔴 P0 必做(高优先级 / High Priority <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>立即推进,需当日 / 次日完成。分类说明:<br/>
<strong>🆕 新增</strong> = 本次巡检首次发现;<strong>♻️ 历史遗留</strong> = 已记录但未关闭;<strong>🔥 紧急</strong> = 影响用户可感知功能或多端点</p>
</blockquote>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>类别</th>
<th>阻塞时长</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>P0-1</strong></td>
<td><code>/itportal/</code> 入口 500 错误</td>
<td>♻️ 历史遗留</td>
<td><strong>29 天</strong>(自 2026-07-08</td>
<td>🔴 待部署</td>
<td>2026-08-06 06:00 jumpserver-V2 实测仍 500nginx error: <code>rewrite or internal redirection cycle while internally redirecting to "/itportal/index.html"</code>。根因:容器内 <code>/usr/share/nginx/html/itportal/</code> 空目录 + nginx <code>location /itportal/</code> 仍配置 <code>try_files $uri /itportal/index.html</code>。建议:<code>docker compose up -d --force-recreate nginx</code>(前提:commit 21830d5 中 nginx.conf 已删除该 location 块)</td>
</tr>
<tr>
<td><strong>P0-3</strong></td>
<td><code>closing_service.py:467</code> datetime 时区错位</td>
<td>♻️ 历史遗留</td>
<td>2 天(自 2026-08-03</td>
<td>🔴 待修复</td>
<td><code>datetime.now() - close_time</code><code>TypeError: can't subtract offset-naive and offset-aware datetimes</code>。影响 <code>POST /h5/conversations/current/reopen</code>。同文件 18 处 <code>datetime.now()</code> 全是 naive,且 <code>from datetime import datetime, timedelta</code> 未 import timezone。24h 内未触发,但用户使用 H5 重开会话即会爆</td>
</tr>
<tr>
<td><strong>P0-4</strong></td>
<td><code>employee_profile_service.py:236</code> SessionLocal NoneType 🔥</td>
<td>🆕 位置修正</td>
<td>&lt;1 天</td>
<td>🔴 待修复</td>
<td><strong>看板 v1.8 行号描述错误</strong>:实际错误位置是 <code>app/services/employee_profile_service.py:236</code> 而非 <code>h5_ai_task.py:1198</code><code>db = SessionLocal()</code> 返回 None → <code>TypeError: 'NoneType' object is not callable</code>。2026-08-05 24h 内累计 10+ 次(01:33 / 03:25 / 04:07 / 04:11 多波次),影响 H5 IT 资产推荐异步推送。<strong>同根因 P0-5</strong></td>
</tr>
<tr>
<td><strong>P0-5</strong></td>
<td>容器 <code>app/constants/</code> 打包错误 🔥</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>🔴 待修复</td>
<td>容器内 <code>/app/app/constants/__init__.py</code> 11635 bytes 内容是 automation.py(两个文件互换了),<code>/app/app/constants/automation.py</code> <strong>不存在</strong>。直接后果:连续 10+ 次 <code>ModuleNotFoundError: No module named 'app.constants.ai_reply_mode'</code> + 同根因连锁导致 P0-4SessionLocal 绑定失败)。建议:① 临时 <code>docker cp</code> 修补 → ② 长期排查 backend 镜像构建流程(Dockerfile <code>COPY . .</code> 是 OK 的,最可能是 deploy 脚本里将 automation.py 重命名为 <code>__init__.py</code></td>
</tr>
<tr>
<td><strong>P0-6</strong></td>
<td>后端 OAuth 40029 抖动(用户码失效)</td>
<td>️ 信息类</td>
<td>持续</td>
<td>🟢 已知噪声</td>
<td>218.75.34.87 等外部 IP 持续试探 <code>/api/auth/validate-sso</code> + 偶发 OAuth code 失效。属 WAF 扫描背景噪声,已 fail2ban 监控。无需主动处理</td>
</tr>
<tr>
<td><strong>P0-NEW7</strong></td>
<td>看板-部署脱节:nginx <code>/docs/</code> 路由缺失</td>
<td>✅ 已修复</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-06 11:46 已完成</strong>:① docker-compose.yml 加 <code>docs-public</code> 卷挂载 ② nginx.conf 加 <code>location /docs/ { alias /opt/wecom-it-desk/docs-public/; charset utf-8; add_header Cache-Control "no-cache, must-revalidate"; ... }</code><code>docker compose up -d --force-recreate nginx</code> + <code>nginx -t</code> + <code>nginx -s reload</code><strong>jumpserver-V2 实测</strong>:容器内 <code>curl -sI http://127.0.0.1/docs/kanban/项目状态看板.html</code><strong>200</strong>30765BCache-Control no-cache)。外部 URL <code>https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html</code> 实测完整渲染 v1.9.0-FROZEN 内容 ✓</td>
</tr>
<tr>
<td><strong>P0-NEW8</strong></td>
<td>host 文件结构 vs git 仓库结构差异</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>🔴 待修复</td>
<td><strong>2026-08-06 11:46 P0-NEW7 修复期间发现</strong>:本地 git 仓库结构是 <code>src/backend/</code>,主机实际结构是 <code>app/</code>admin:admin, Aug 3),两者不一致。<code>docker-compose.yml</code><code>backend.context: ./src/backend</code> + <code>./src/backend/app:/app/app</code> 在主机上不存在对应目录,导致 <code>docker compose up -d --force-recreate backend</code> 时挂载空目录、容器内 <code>/app/app</code> 为空、uvicorn 找不到 <code>app.main</code>、启动失败。<strong>临时回退</strong>docker-compose.yml 改 <code>context: ./backend</code> + <code>- ./app:/app/app</code> 适配主机,backend 容器已恢复。但长期需要:① 决定 host 是否同步 git 仓库 ② 是否启用 build context 镜像构建 ③ 迁移路径方案评估</td>
</tr>
</tbody>
</table>
<p><strong>滴答清单跟踪</strong>6 项 P0 已在滴答清单 <code>wecom_it_smart_desk</code> 项目下建任务(标签 <code>work</code>)。新增项 T5 (P0-5 打包错误) + T6 (P0-4 实际位置修正) + T7 (P0-NEW7 看板-部署脱节)due 2026-08-06 17:00。</p>
<hr/>
<h2 id="p1-medium-priority">🟡 P1 重要(待办 / Medium Priority <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>v1.9 已无独立 P1 条目(P1-1 已完成,见最近完成区)。如发现新 P1 在此处新增。</p>
</blockquote>
<hr/>
<h2 id="awaiting-decision">🟢 等用户决策(阻塞项 / Awaiting Decision <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>均超 3 天阈值,需 PM 升级催办</p>
</blockquote>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>阻塞时长</th>
<th>卡点 / Owner</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>BLK-A</strong></td>
<td>企微会议室 Secret</td>
<td>⚠️ <strong>26 天</strong>(自 2026-07-11</td>
<td>需企业微信管理后台申请 / Owner: 平台组</td>
<td>影响会议室预定功能 / <code>/itterminal/</code></td>
</tr>
<tr>
<td><strong>BLK-B</strong></td>
<td>ITSM API 授权</td>
<td>⚠️ <strong>26 天</strong>(自 2026-07-11</td>
<td>需向 ITSM 平台方申请 app_id/app_secret / Owner: 平台组</td>
<td>影响 ITSM 工单卡片跳转</td>
</tr>
</tbody>
</table>
<p><strong>催办机制</strong>:建议 PM 每周一 review(滴答清单循环任务)。</p>
<hr/>
<h2 id="req-001">⏸️ 安全策略检查平台 (REQ-集成-001) — 已暂停 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>#118</td>
<td>火绒API集成</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>复用现有功能,必要性未确认</td>
</tr>
<tr>
<td>#119</td>
<td>联软Excel导入</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>用户-终端关联导入</td>
</tr>
<tr>
<td>#120</td>
<td>数据融合引擎</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>IP/主机名/MAC三级匹配</td>
</tr>
<tr>
<td>#121</td>
<td>策略规则与通知模板</td>
<td>P1</td>
<td>⏸️ 暂停</td>
<td>命中管理、通知发送</td>
</tr>
<tr>
<td>#122</td>
<td>调度执行与导出</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>定时任务、Excel导出</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>暂停原因</strong>: 必要性未确认,待进一步评估后再启动</p>
</blockquote>
<p><strong>关联文档保留</strong><br/>
- PRD: <code>01-产品文档/08-集成生态/PRD-REQ-集成-001-OpenClaw合规检查-v1.0.md</code><br/>
- 原型: <code>01-产品文档/08-集成生态/原型-REQ-集成-001-OpenClaw合规检查-v1.0.html</code><br/>
- 技术方案: <code>02-技术文档/技术架构/技术方案-REQ-集成-001-OpenClaw合规检查-v1.0.md</code></p>
<hr/>
<h2 id="in-progress">🟠 进行中 (In Progress) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>#81</td>
<td>敏感词检测 + 语气优化</td>
<td>P0</td>
<td>🔄 v1.1 阶段1 已完成(07-28</td>
<td>词库入库 + 后台管理 UI(增删改查 + 灰度开关)+ 12 个配套 API 已落地。剩余阶段(语气优化、灰度策略细化)待 v1.2 排期。详见 <code>docs/01-产品文档/00-产品规划/PRD-REQ-通用-004-敏感词检测-v1.2-AI辅助.md</code></td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="to-do">🟡 待开始 (To Do) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>(当前无待开始任务)</td>
<td></td>
<td>#104 已于 2026-08-07 结案并迁入「最近完成」区</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="recently-completed">✅ 最近完成 (Recently Completed) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>负责人</th>
<th>完成日期</th>
</tr>
</thead>
<tbody>
<tr>
<td>#104</td>
<td>运行期结构化日志查看页(筛选 + 下载命中行)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-07</td>
</tr>
<tr>
<td>-</td>
<td>【P1】补齐 Nginx 生产安全响应头(复制 7 个 add_header</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td>2026-08-07</td>
</tr>
<tr>
<td>-</td>
<td>sensitive_words.py 13 端点补 require_admin</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-04</td>
</tr>
<tr>
<td>-</td>
<td>前端 console.log 残留 208 行清理</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td>2026-08-05</td>
</tr>
<tr>
<td>-</td>
<td>/itportal 500 修复(nginx 配置清理)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>-</td>
<td>troubleshooting_templates.py 5 端点补 auth + MOCK 替换 ORM</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>#133</td>
<td>voice_asr.py POST /asr auth 加固(P0 安全巡检)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>-</td>
<td>批次1 P0重构(超时预算切分/RecommendCard/WS全字段)</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次2 P1基础重构(AIService单例/Dify调用点/Matcher/WS/Redis</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次3 P1核心重构(process管线化/结单确认断链修复)</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次4 P2收尾(死代码大扫除)</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>D1合并(双模支持/kfid路由/C7/C8/上下文超限重置)</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>文档重组(docs目录9→10类/PRD合并/技术文档关联REQ)</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-19</td>
</tr>
<tr>
<td>#82</td>
<td>H5右侧栏布局调整</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-17</td>
</tr>
<tr>
<td>#76</td>
<td>ITSM工单卡片跳转(桥接页一步直达 + 扫码登录定为人机校验)</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-17</td>
</tr>
<tr>
<td>BUG-AI-001</td>
<td>打印机路由到行政前台 + [object Object]显示异常</td>
<td>P2</td>
<td>Duckula</td>
<td>2026-07-23</td>
</tr>
<tr>
<td>-</td>
<td>H5用户端原型图 v2.0 更新</td>
<td>-</td>
<td>Duckula</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>#124</td>
<td>坐席端接单按钮状态优化</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>#125</td>
<td>H5选项交互消息重复处理</td>
<td>P0</td>
<td>Simon/Duckula</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>BUG-用户-003</td>
<td>H5 员工端"结束会话失败,请稍后重试"修复</td>
<td>P2</td>
<td>Duckula</td>
<td>2026-07-30</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="2026-07-1516">✅ 近期完成 (2026-07-15~16) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>负责人</th>
<th>完成日期</th>
</tr>
</thead>
<tbody>
<tr>
<td>#117</td>
<td>Neo4j 知识图谱连接修复</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#118</td>
<td>粘贴图片边框问题</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#80</td>
<td>企微图片消息无法预览</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#75</td>
<td>头像同步功能完善</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-15</td>
</tr>
<tr>
<td>#74</td>
<td>IT资产升级卡片免登录修复</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-15</td>
</tr>
<tr>
<td>#73</td>
<td>H5截图功能</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-14</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="_3">📌 重要技术决策与限制记录 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>日期</th>
<th>决策 / 限制</th>
<th>影响范围</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>2026-07-18</td>
<td>D1合并:后端双模支持</td>
<td>H5 AI对话</td>
<td>intent_type/business_category字段透传,主Dify结果直接判断路由</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>kfid路由窗口配置化</td>
<td>H5业务路由</td>
<td>12个职能部门窗口(行政/人力资源/财务/法务/物业),business_contacts表查具体处理人</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>Redis密码轮换</td>
<td>生产环境</td>
<td>新密码32位字母数字,仅存服务器.env,轮换后验证通过</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>process_h5_ai_reply管线化</td>
<td>H5 AI对话</td>
<td>9步骤函数式拆分,try/except 11对→1对</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>结单确认功能断链修复</td>
<td>坐席端</td>
<td>WS类型resolve_confirm,前端case改对应监听+ChatPanel挂载</td>
</tr>
<tr>
<td>2026-07-19</td>
<td>docs目录重组</td>
<td>文档管理</td>
<td>9类→10类(新增运营文档),PRD合并,技术文档关联REQ编号</td>
</tr>
<tr>
<td>2026-07-17</td>
<td>H5 答题功能实现</td>
<td>H5 右侧栏</td>
<td>答题区域通过 showQuiz prop 控制显隐,QueueWaiting 组件始终挂载但默认折叠。修复了答题默认显示和重复出现的 bug。详见任务说明书 #82 v1.1</td>
</tr>
<tr>
<td>2026-07-17</td>
<td>ITSM 工单跳转:扫码登录定为人机校验</td>
<td>8 个运维平台审批卡片</td>
<td>Web ITSM 深链不支持静默企微 OAuth,桥接页跨域预热被拒,仍弹扫码。产品决策保留该扫码环节(企业安全合规可接受的二次身份确认),不视为缺陷。详见 PRD §v2.3、架构 §15.4.9、任务说明书 #76 v3.0</td>
</tr>
<tr>
<td>2026-08-05</td>
<td><strong>看板 v1.8 分区升级</strong></td>
<td>看板管理</td>
<td>新增 🔴 P0 必做 / 🟡 P1 重要 / 🟢 等用户决策三个正式分区,4 维分类(新增/历史遗留/信息/建议)正式纳入看板流转</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>看板 v1.9 看板-现实一致性巡检</strong></td>
<td>看板管理</td>
<td>2026-08-06 06:00 巡检发现 v1.8 中 2 项描述(P0-2 sensitive_words / P1-1 console.log)与现实脱节(代码已修复 / 已清理),v1.9 已迁移至已完成。<strong>新发现</strong>v1.8 顶部"对外发布"声明与现实脱节——nginx 无 <code>/docs/</code> 路由,外部 URL 404。v1.9 修正声明并新增 P0-NEW7(看板-部署脱节治理)。新增治理原则:① 看板冻结前由自动化扫描 P0/P1 条目对应的源码/容器状态 ② 看板顶部"服务发布"声明须配套 curl 实测验证,否则标"已上传服务器,服务状态待验"</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>看板 v1.9 新增治理:自动扫描防脱节</strong></td>
<td>看板管理</td>
<td>未来由 <code>scripts/build_kanban_html.py --check</code> 模式在生成前对每条 P0/P1 描述做源码关键字 / 容器文件存在性校验,避免看板-现实脱节再次发生</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>P0-NEW8host vs git 仓库结构差异</strong></td>
<td>部署架构</td>
<td>P0-NEW7 修复期间触发——本地 git 仓库 <code>src/backend/</code> 与主机实际 <code>app/</code> 结构不一致,docker-compose.yml 路径配置失配引发 backend 容器启动失败。需 PM 决策:① host 是否同步 git 仓库 ② 是否启用 build context 镜像重建 ③ 迁移路径方案</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="_4">📈 任务统计 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>总任务数</strong>: 101v1.9 = 100 + P0-NEW8 host 文件结构差异)</li>
<li><strong>已完成</strong>: 94v1.9 = 91 + nginx /docs/ 路由上线 + P1 安全响应头关闭 + #104 运行期日志页结案)</li>
<li><strong>🔴 P0 必做</strong>: 5P0-1 / 3 / 4 / 5 / 6 / NEW8NEW7 已修复)</li>
<li><strong>🟡 P1 重要</strong>: 0</li>
<li><strong>🟢 等用户决策</strong>: 2BLK-A/B<strong>均超 26 天阈值</strong></li>
<li><strong>🟠 进行中</strong>: 1#81 v1.2 待排期)</li>
<li><strong>🟡 待开始</strong>: 0#104 已于 2026-08-07 生产实测结案,已迁入最近完成区)</li>
<li><strong>⏸️ 暂停</strong>: 5(安全策略检查平台)</li>
</ul>
<hr/>
<h2 id="_5">🔗 相关文档 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li>任务说明书目录: <code>docs/07-项目管理/任务说明书/</code></li>
<li>项目管理主文档: <code>docs/07-项目管理/任务说明书/IT智能服务台-项目管理主文档.md</code></li>
<li><strong>2026-08-05 早班巡检报告(HTML</strong>: <code>docs/07-项目管理/巡检报告/2026-08/2026-08-05-早班.html</code></li>
<li>巡检报告归档目录: <code>docs/07-项目管理/巡检报告/</code></li>
</ul>
<hr/>
<h2 id="_6">📝 看板版本变更记录 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>版本</th>
<th>日期</th>
<th>变更内容</th>
<th>变更人</th>
</tr>
</thead>
<tbody>
<tr>
<td>v1.9.1 补录2</td>
<td>2026-08-07</td>
<td>✅ 【P0】#104 运行期结构化日志查看页 <strong>结案</strong>jumpserver-V2 生产实测四项证据齐备(管理页 200 / 前端 chunk 含筛选+下载命中行 / 后端端点已挂载(4004 = #48 IP 白名单预期门禁,非故障)/ 日志源 JSON 持续写入)。从「待开始」区迁入「最近完成」区;待开始 0 项;已完成 93→94。滴答清单同步完成</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td>v1.9.1 补录</td>
<td>2026-08-07</td>
<td>✅ P1【补齐 Nginx 生产安全响应头】已修复并关闭:生产 nginx.conf 注入 7 安全头(server 级 + 各含 add_header 的 location 内,均带 always),nginx -t 通过 + docker restart wecom_it_nginxorigin 与公网(WAF)双验证通过。补录至最近完成区;已完成 92→93</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td><strong>v1.9.1-FROZEN</strong></td>
<td>2026-08-06 11:50</td>
<td>✅ 冻结:P0-NEW7(看板-部署脱节)已修复。nginx <code>/docs/</code> 路由上线 + docker-compose.yml docs-public 挂载生效;外部 URL 实测 200。修复期间发现并新增 P0-NEW8host 文件结构 vs git 仓库结构差异)。归档副本 <code>项目状态看板-v1.9.1-FROZEN.html</code></td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td><strong>v1.9.0-FROZEN</strong></td>
<td>2026-08-06 11:36</td>
<td>✅ 冻结:v1.9-DRAFT 内容经 PM 审核通过正式生效;归档副本 <code>项目状态看板-v1.9.0-FROZEN.html</code><strong>修正 v1.8.0 起"对外发布"声明与现实脱节</strong>nginx <code>/docs/</code> 路由从未生效,已添加 P0-NEW7 看板-部署脱节);HTML 文件已上传至 jumpserver <code>/opt/wecom-it-desk/docs-public/kanban/</code> + <code>/inspection/2026-08/</code>,但 nginx 服务不可达(详见 P0-NEW7</td>
<td>Simon(审核)</td>
</tr>
<tr>
<td>v1.9.0-DRAFT</td>
<td>2026-08-06</td>
<td>🆕 草稿:① P0 必做 4→5(P0-2 修复迁移至已完成 + P0-5 打包错误 + P0-6 OAuth 信息类 + P0-4 行号描述修正)② P1 重要 1→0(P1-1 清理迁移至已完成)③ 已完成 88→91 ④ 等用户决策 25→26 天阈值 ⑤ 总任务数 96→99 ⑥ 看板顶部版本号自动切换为 draft badge ⑦ 看板与现实脱节条目得到修正</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td><strong>v1.8.0-FROZEN</strong></td>
<td>2026-08-05 19:37</td>
<td>✅ 冻结:v1.8-DRAFT 内容经 PM 审核通过正式生效;归档副本 <code>项目状态看板-v1.8.0-FROZEN.html</code><strong>⚠️ 服务发布声明脱节</strong>(声称发布至 <code>https://itsupport.servyou.com.cn/docs/kanban/</code> + <code>/docs/inspection/</code> 实际 404——nginx 无 <code>/docs/</code> 路由,v1.9 已修正声明并新增 P0-NEW7 治理)</td>
<td>Simon(审核)</td>
</tr>
<tr>
<td>v1.8-DRAFT</td>
<td>2026-08-05</td>
<td>🆕 草稿:新增 🔴 P0 必做分区(4 项)/ 🟡 P1 重要分区(1 项)/ 🟢 等用户决策分区(2 项,25 天阈值);总任务数 92→96;引入 4 维分类(新增/历史遗留/信息/建议);附 HTML 巡检报告归档路径</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td>v1.7</td>
<td>2026-08-03</td>
<td>#81 状态反转:v1.1 阶段1 已完成(07-28)→ 进行中;新增今日完成项 troubleshooting_templates 5 端点 + /itportal 500 修复;统计 92/87/1/1/5/2</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td>v1.5</td>
<td>2026-07-30</td>
<td>追加 BUG-用户-003 修复完成项(H5 结束会话失败回归);总任务数 90→91;已完成 84→85;关联 TC-用户-008;待开始不变</td>
<td>Duckula (AI)</td>
</tr>
<tr>
<td>v1.4</td>
<td>2026-07-24</td>
<td>批量完成项入库(批次 1-4 重构 / D1 合并 / 文档重组 / #124 坐席接单按钮 / #125 H5 选项消息)</td>
<td>Simon</td>
</tr>
</tbody>
</table>
</main>
<footer>
本页面由 <code>build_kanban_html.py</code> 自动生成于 2026-08-07 12:00 (GMT+8) · 数据源:docs/07-项目管理/项目状态看板.md<br>
修改流程:编辑 .md → 跑脚本生成 .html → (可选)部署到 jumpserver → commit & push
</footer>
</div>
</body>
</html>