Install
openclaw skills install @endcy/zentao-work-stats禅道(Zentao)用户工作内容分析工具。通过数据库只读查询分析指定用户在指定时间段内的需求、任务、Bug、工时日志,生成 Markdown 格式的工作报告。仅支持 SQL SELECT 查询,不修改任何数据。
openclaw skills install @endcy/zentao-work-stats连接禅道数据库,通过主表 + zt_action 操作日志综合追踪指定用户在指定时间段内的所有工作内容,生成完整的分析报告。
高优先级触发(明确的统计生成动作):
低优先级触发(需要确认意图):
不触发的情况:
激活前必须确认:
WHF01089)2026年、2026-01-01 到 2026-07-23)只读操作 — 所有数据库操作均为 SELECT 查询,严禁任何 INSERT/UPDATE/DELETE。
双表追踪 — 不能仅查主表(zt_story/zt_task/zt_bug),必须结合 zt_action + zt_history 操作日志表,才能完整追踪用户参与的所有记录。原因:禅道流程流转后,主表的 assignedTo 等字段可能变为 closed 等非用户值,导致遗漏。
先确认后生成 — 分析前需确认以下信息:
WHF01089)2026年、2026-01-01 到 2026-07-23)从 config.json 读取连接信息。配置文件路径:与本 SKILL.md 同目录下的 config.json。
重要:配置文件中包含数据库凭据,请确保:
⚠️ 数据敏感性:本技能访问禅道数据库中的用户工作数据,包括:
⚠️ 授权要求:
⚠️ 报告安全:
⚠️ 最小权限原则:
| 表名 | 用途 | 关键字段 |
|---|---|---|
zt_story | 需求主表 | id, title, pri, status, stage, estimate, openedBy, assignedTo, closedBy |
zt_task | 任务主表 | id, name, type, pri, estimate, consumed, left, status, openedBy, assignedTo, finishedBy, closedBy |
zt_bug | Bug主表 | id, title, severity, pri, status, openedBy, assignedTo, resolvedBy, resolution, resolvedDate |
zt_effort | 工时日志表 | id, objectType, objectID, date, consumed, left, work, account |
zt_user | 用户表 | account, realname, email, dept, role |
zt_product | 产品表 | id, name |
zt_execution | 执行/迭代表 | id, name, project |
| 表名 | 用途 | 关键字段 |
|---|---|---|
zt_action | 操作日志 | objectType, objectID, actor, action, date, comment |
zt_history | 字段变更明细 | action(关联zt_action.id), field, old, new, diff |
| action 值 | 含义 | 适用对象 |
|---|---|---|
opened | 创建 | story/task/bug |
assigned | 指派 | story/task/bug |
started | 开始 | task/bug |
finished | 完成 | task |
resolved | 解决 | bug |
closed | 关闭 | story/task/bug |
commented | 评论 | story/task/bug |
edited | 编辑 | story/task/bug |
linked2project | 关联项目 | story/bug |
linked2execution | 关联执行 | story/task |
config.json 获取数据库连接配置pymysql 是否已安装(不要主动安装,如果未安装则提示用户自行安装):try:
import pymysql
print("pymysql 已安装")
except ImportError:
print("请先安装 pymysql: pip install pymysql")
raise
import pymysql
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT 1")
print("连接成功")
conn.close()
查询用户基本信息、产品名称、执行名称、用户列表等基础数据:
# 用户信息
cursor.execute("SELECT account, realname, dept, role FROM zt_user WHERE account = %s", (user,))
# 产品映射
cursor.execute("SELECT id, name FROM zt_product")
# 执行映射
cursor.execute("SELECT id, name, project FROM zt_execution")
# 用户映射
cursor.execute("SELECT account, realname FROM zt_user")
这是核心步骤。 对 story/task/bug 分别执行:
# 查询用户在指定时间范围内参与的所有对象ID
cursor.execute("""
SELECT DISTINCT a.objectID
FROM zt_action a
WHERE a.actor = %s
AND a.objectType = %s -- 'story' / 'task' / 'bug'
AND a.date >= %s AND a.date <= %s
ORDER BY a.objectID
""", (user, object_type, start_date, end_date))
然后对每个对象ID:
# 注意 `left` 和 `work` 是 MySQL 保留字,需用反引号转义
cursor.execute("""
SELECT id, objectType, objectID, date, consumed, `left`, `work`, `begin`, `end`
FROM zt_effort
WHERE account = %s AND date >= %s AND date <= %s
ORDER BY date ASC
""", (user, start_date, end_date))
cursor.execute("""
SELECT DATE_FORMAT(date, '%Y-%m') as month, objectType, action, COUNT(*) as cnt
FROM zt_action
WHERE actor = %s AND date >= %s AND date <= %s
GROUP BY month, objectType, action
ORDER BY month, objectType
""", (user, start_date, end_date))
将收集到的数据整理为 Markdown 格式报告,结构参见 references/report-template.md。
{工作目录}/用户{账号}_{年份}年工作分析报告.md)left、work、begin、end 等是 MySQL 保留字,SQL 中必须用反引号包裹:`left`、`work`date >= 'YYYY-MM-DD' AND date <= 'YYYY-MM-DD 23:59:59' 确保包含结束日期当天deleted = '0' 排除已删除记录禅道在流程流转时,assignedTo 在关闭后会变成 closed,不再保留具体用户名。只有通过 zt_action 操作日志才能追踪到所有参与人。
work、left、begin、end 是 MySQL 保留字,SQL 中必须用反引号包裹。在 Python 内联字符串中注意反引号转义。
某些禅道版本可能没有 zt_execution 表(旧版使用 zt_project),查询前先检查表是否存在,不存在则跳过。
| 版本 | 日期 | 作者 | 变更 |
|---|---|---|---|
| 1.0.0 | 2026-07-23 | - | 初始版本,支持通过主表+zt_action双表追踪生成用户工作内容分析报告 |