项目管理界面:照 dsh-task-board 模式新建(目标=项目 · 只读复用现有看板 · 端口20100)
用户逐字:「不动现有任务会话看板 不是让你整体搬是照的他的模式做一个 项目管理的界面
来管理 执行任务,目标等于项目」
- 新增 交付物/项目管理界面/{project-board.py,.html,-launch.py}
- 映射:目标→项目、任务类别→工作流、台账条目→卡片、会话→可跳转
- 数据源=现有看板已算好的 /board.json(⛔ 不重算、⛔ 不直读台账)
- 列=机制真实四态(待执行/执行中/有阻碍/已完成),⛔ 不硬套它那五列
- 现有看板 20099 / board.py / board.html 零改动
- 坑:pythonw.exe 下 sys.stdout is None ⇒ print/flush 崩(终端好、计划任务死)⇒ 加 _say() 兜
This commit is contained in:
1 parent
87a9c97b54
commit
1b68b1ac3f
4 files changed
+651
No files matched your search
@@ -218,6 +218,73 @@
|
||||
- **C**:真要在 **DSH** 里用(那与本技能无关,装进 DSH 即可)
|
||||
⇒ 三选一才谈得上下一步,⛔ 别猜。
|
||||
|
||||
---
|
||||
|
||||
## 三十九、新建「项目管理界面」(照 dsh-task-board 模式 · 目标=项目)— 已交付在跑
|
||||
|
||||
### 用户纠正我(逐字)
|
||||
|
||||
> 「**不动现有任务会话看板**,**不是让你整体搬**,是照的他的模式做一个 **项目管理的界面**
|
||||
> 来管理 执行任务,**目标等于项目**」
|
||||
|
||||
⇒ ⚠️ 我上一轮把问题问成"要不要移植/怎么移植"=**问错了方向**:用户要的是**新做一个界面**,
|
||||
⛔ 不是搬迁、⛔ 不是改现有看板。
|
||||
|
||||
### 交付物(新建,⛔ 现有看板零改动)
|
||||
|
||||
📁 `交付物/项目管理界面/`(**3 个文件**)
|
||||
|
||||
| 文件 | 作用 |
|
||||
|---|---|
|
||||
| `project-board.py` | 只读服务 + 映射层(`--serve 20100`/`--once` 打摘要) |
|
||||
| `project-board.html` | 界面:项目下拉 + 四列卡片 + 点开抽屉 |
|
||||
| `project-board-launch.py` | **启动器**(计划任务动作指向它,⛔ 不直起业务脚本) |
|
||||
|
||||
- **端口 20100**(现有看板 20099 **不动**);计划任务 **`dsh-project-board-keepalive`**(5 分钟判活)。
|
||||
- ✅ 实测:20100 `HTTP 200`;`/api/projects` 返回 2 个项目/12 张卡片;20099 同时 `HTTP 200`(互不影响)。
|
||||
|
||||
### 🔴 映射关系(唯一真源 = 现有看板的 `/board.json`,⛔ 不重算)
|
||||
|
||||
| 它的概念 | 本机制 | 数据来源 |
|
||||
|---|---|---|
|
||||
| 项目 | **目标** | `goals[]`(`goal.short`/`tab_created`) |
|
||||
| 工作流分组 | **任务类别** | `labor[]` |
|
||||
| 卡片 | **台账条目** | `tasks{}`(`state` → 列) |
|
||||
| 点卡片 → 会话 | **会话跳转** | `sessions[].id8` |
|
||||
|
||||
🔴 **关键决定:⛔ 不直读台账、⛔ 不重算** —— 复用现有看板**已经算好的** `/board.json`
|
||||
(重算 = 把 `board.py` 那套逻辑抄第二份 ⇒ 同族 P0「一条规则两份实现」必漂)。
|
||||
|
||||
### 🔴 列用**机制真实四态**,⛔ 不硬套它那五列
|
||||
|
||||
- 它:待规划/待办/进行中/已完成/已失败(5 列)
|
||||
- 本机制台账只有 **待执行/执行中/有阻碍/已完成**(4 态)
|
||||
- ⇒ 硬套 5 列会**凭空多出机制里不存在的「待规划」**(看着像有、其实永远空)⇒ ⛔ 不做。
|
||||
- ⚠️ 用户问「什么工作流状态 干啥用的」⇒ 就是这一列的含义,已当面解释。
|
||||
|
||||
### 🔴🔴 本轮踩的真坑:`pythonw.exe` 下 `sys.stdout is None`(终端好、计划任务死)
|
||||
|
||||
- **症状**:计划任务 `Result=1`,**20100 起不来**;但**前台跑同一脚本一切正常**。
|
||||
- **根因**:计划任务用 `pythonw.exe`(**无控制台**)⇒ **`sys.stdout is None`**
|
||||
⇒ 我写的 `sys.stdout.flush()` 抛 `AttributeError: 'NoneType' object has no attribute 'flush'`
|
||||
⇒ 进程**当场崩**。而 `Result=1` 只说"失败",**看不出为什么**。
|
||||
- **诊断方法(✅ 可复用)**:加一个**只写异常到文件**的 wrapper(`launch-diag.py`),
|
||||
指向计划任务动作 ⇒ 异常立刻现形(⛔ 别靠猜 `Result=1`)。
|
||||
- **修法**:加 `_say()` —— **有 stdout 才写、没有就静默丢**;⛔ 常驻进程不许因为没地方打印就崩。
|
||||
- 🔴 **同族铁律**:**`pythonw.exe` 下 `print`/`sys.stdout` 一律不可靠**
|
||||
⇒ 凡"计划任务跑的脚本"⛔ 不许裸用 `print`。
|
||||
|
||||
### ⚠️ 另一条弯路(别重蹈)
|
||||
|
||||
- 我一度以为是**中文路径**(`交付物/项目管理界面`)导致计划任务失败 ⇒ 复制到 ASCII 路径 `tmp/pm-board` **对照**
|
||||
⇒ **同样 `Result=1`** ⇒ 证明**与路径无关**,真因是上面那条。
|
||||
- ⇒ 教训:**路径猜测**要有对照实验才下结论(我用了一轮,但及时纠正并清理了临时副本)。
|
||||
|
||||
### 清理
|
||||
|
||||
- `tmp/pm-board/`(对照实验副本)**已删**;计划任务已**重指回正式交付目录**。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user