@qq33357486/oh-my-task 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +315 -0
  3. package/dist/api/middleware/auth.d.ts +26 -0
  4. package/dist/api/middleware/auth.d.ts.map +1 -0
  5. package/dist/api/middleware/auth.js +90 -0
  6. package/dist/api/middleware/auth.js.map +1 -0
  7. package/dist/api/middleware/captcha.d.ts +6 -0
  8. package/dist/api/middleware/captcha.d.ts.map +1 -0
  9. package/dist/api/middleware/captcha.js +47 -0
  10. package/dist/api/middleware/captcha.js.map +1 -0
  11. package/dist/api/middleware/ownerCheck.d.ts +22 -0
  12. package/dist/api/middleware/ownerCheck.d.ts.map +1 -0
  13. package/dist/api/middleware/ownerCheck.js +138 -0
  14. package/dist/api/middleware/ownerCheck.js.map +1 -0
  15. package/dist/api/routes/auth.d.ts +8 -0
  16. package/dist/api/routes/auth.d.ts.map +1 -0
  17. package/dist/api/routes/auth.js +136 -0
  18. package/dist/api/routes/auth.js.map +1 -0
  19. package/dist/api/routes/config.d.ts +3 -0
  20. package/dist/api/routes/config.d.ts.map +1 -0
  21. package/dist/api/routes/config.js +26 -0
  22. package/dist/api/routes/config.js.map +1 -0
  23. package/dist/api/routes/projects.d.ts +3 -0
  24. package/dist/api/routes/projects.d.ts.map +1 -0
  25. package/dist/api/routes/projects.js +54 -0
  26. package/dist/api/routes/projects.js.map +1 -0
  27. package/dist/api/routes/schedule.d.ts +3 -0
  28. package/dist/api/routes/schedule.d.ts.map +1 -0
  29. package/dist/api/routes/schedule.js +92 -0
  30. package/dist/api/routes/schedule.js.map +1 -0
  31. package/dist/api/routes/sops.d.ts +3 -0
  32. package/dist/api/routes/sops.d.ts.map +1 -0
  33. package/dist/api/routes/sops.js +155 -0
  34. package/dist/api/routes/sops.js.map +1 -0
  35. package/dist/api/routes/tasks.d.ts +3 -0
  36. package/dist/api/routes/tasks.d.ts.map +1 -0
  37. package/dist/api/routes/tasks.js +218 -0
  38. package/dist/api/routes/tasks.js.map +1 -0
  39. package/dist/api/routes/tokens.d.ts +3 -0
  40. package/dist/api/routes/tokens.d.ts.map +1 -0
  41. package/dist/api/routes/tokens.js +77 -0
  42. package/dist/api/routes/tokens.js.map +1 -0
  43. package/dist/api/routes/users.d.ts +3 -0
  44. package/dist/api/routes/users.d.ts.map +1 -0
  45. package/dist/api/routes/users.js +94 -0
  46. package/dist/api/routes/users.js.map +1 -0
  47. package/dist/api/routes/versions.d.ts +3 -0
  48. package/dist/api/routes/versions.d.ts.map +1 -0
  49. package/dist/api/routes/versions.js +156 -0
  50. package/dist/api/routes/versions.js.map +1 -0
  51. package/dist/api/server.d.ts +4 -0
  52. package/dist/api/server.d.ts.map +1 -0
  53. package/dist/api/server.js +70 -0
  54. package/dist/api/server.js.map +1 -0
  55. package/dist/db/connection.d.ts +15 -0
  56. package/dist/db/connection.d.ts.map +1 -0
  57. package/dist/db/connection.js +158 -0
  58. package/dist/db/connection.js.map +1 -0
  59. package/dist/db/init.d.ts +2 -0
  60. package/dist/db/init.d.ts.map +1 -0
  61. package/dist/db/init.js +5 -0
  62. package/dist/db/init.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +4 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/mcp/server.d.ts +2 -0
  68. package/dist/mcp/server.d.ts.map +1 -0
  69. package/dist/mcp/server.js +146 -0
  70. package/dist/mcp/server.js.map +1 -0
  71. package/dist/mcp/tools/activate-task.d.ts +10 -0
  72. package/dist/mcp/tools/activate-task.d.ts.map +1 -0
  73. package/dist/mcp/tools/activate-task.js +52 -0
  74. package/dist/mcp/tools/activate-task.js.map +1 -0
  75. package/dist/mcp/tools/add-task-note.d.ts +10 -0
  76. package/dist/mcp/tools/add-task-note.d.ts.map +1 -0
  77. package/dist/mcp/tools/add-task-note.js +46 -0
  78. package/dist/mcp/tools/add-task-note.js.map +1 -0
  79. package/dist/mcp/tools/approve-task.d.ts +10 -0
  80. package/dist/mcp/tools/approve-task.d.ts.map +1 -0
  81. package/dist/mcp/tools/approve-task.js +59 -0
  82. package/dist/mcp/tools/approve-task.js.map +1 -0
  83. package/dist/mcp/tools/archive-version.d.ts +10 -0
  84. package/dist/mcp/tools/archive-version.d.ts.map +1 -0
  85. package/dist/mcp/tools/archive-version.js +57 -0
  86. package/dist/mcp/tools/archive-version.js.map +1 -0
  87. package/dist/mcp/tools/assign-task.d.ts +10 -0
  88. package/dist/mcp/tools/assign-task.d.ts.map +1 -0
  89. package/dist/mcp/tools/assign-task.js +53 -0
  90. package/dist/mcp/tools/assign-task.js.map +1 -0
  91. package/dist/mcp/tools/complete-task.d.ts +10 -0
  92. package/dist/mcp/tools/complete-task.d.ts.map +1 -0
  93. package/dist/mcp/tools/complete-task.js +46 -0
  94. package/dist/mcp/tools/complete-task.js.map +1 -0
  95. package/dist/mcp/tools/create-sop.d.ts +10 -0
  96. package/dist/mcp/tools/create-sop.d.ts.map +1 -0
  97. package/dist/mcp/tools/create-sop.js +90 -0
  98. package/dist/mcp/tools/create-sop.js.map +1 -0
  99. package/dist/mcp/tools/create-task.d.ts +10 -0
  100. package/dist/mcp/tools/create-task.d.ts.map +1 -0
  101. package/dist/mcp/tools/create-task.js +138 -0
  102. package/dist/mcp/tools/create-task.js.map +1 -0
  103. package/dist/mcp/tools/create-version.d.ts +10 -0
  104. package/dist/mcp/tools/create-version.d.ts.map +1 -0
  105. package/dist/mcp/tools/create-version.js +86 -0
  106. package/dist/mcp/tools/create-version.js.map +1 -0
  107. package/dist/mcp/tools/delete-task.d.ts +10 -0
  108. package/dist/mcp/tools/delete-task.d.ts.map +1 -0
  109. package/dist/mcp/tools/delete-task.js +34 -0
  110. package/dist/mcp/tools/delete-task.js.map +1 -0
  111. package/dist/mcp/tools/get-my-tasks.d.ts +10 -0
  112. package/dist/mcp/tools/get-my-tasks.d.ts.map +1 -0
  113. package/dist/mcp/tools/get-my-tasks.js +88 -0
  114. package/dist/mcp/tools/get-my-tasks.js.map +1 -0
  115. package/dist/mcp/tools/get-next-task.d.ts +10 -0
  116. package/dist/mcp/tools/get-next-task.d.ts.map +1 -0
  117. package/dist/mcp/tools/get-next-task.js +84 -0
  118. package/dist/mcp/tools/get-next-task.js.map +1 -0
  119. package/dist/mcp/tools/get-sop.d.ts +10 -0
  120. package/dist/mcp/tools/get-sop.d.ts.map +1 -0
  121. package/dist/mcp/tools/get-sop.js +67 -0
  122. package/dist/mcp/tools/get-sop.js.map +1 -0
  123. package/dist/mcp/tools/get-task-context.d.ts +10 -0
  124. package/dist/mcp/tools/get-task-context.d.ts.map +1 -0
  125. package/dist/mcp/tools/get-task-context.js +114 -0
  126. package/dist/mcp/tools/get-task-context.js.map +1 -0
  127. package/dist/mcp/tools/get-task.d.ts +10 -0
  128. package/dist/mcp/tools/get-task.d.ts.map +1 -0
  129. package/dist/mcp/tools/get-task.js +61 -0
  130. package/dist/mcp/tools/get-task.js.map +1 -0
  131. package/dist/mcp/tools/helpers.d.ts +10 -0
  132. package/dist/mcp/tools/helpers.d.ts.map +1 -0
  133. package/dist/mcp/tools/helpers.js +17 -0
  134. package/dist/mcp/tools/helpers.js.map +1 -0
  135. package/dist/mcp/tools/init-project.d.ts +12 -0
  136. package/dist/mcp/tools/init-project.d.ts.map +1 -0
  137. package/dist/mcp/tools/init-project.js +162 -0
  138. package/dist/mcp/tools/init-project.js.map +1 -0
  139. package/dist/mcp/tools/list-sops.d.ts +10 -0
  140. package/dist/mcp/tools/list-sops.d.ts.map +1 -0
  141. package/dist/mcp/tools/list-sops.js +57 -0
  142. package/dist/mcp/tools/list-sops.js.map +1 -0
  143. package/dist/mcp/tools/list-tasks.d.ts +10 -0
  144. package/dist/mcp/tools/list-tasks.d.ts.map +1 -0
  145. package/dist/mcp/tools/list-tasks.js +96 -0
  146. package/dist/mcp/tools/list-tasks.js.map +1 -0
  147. package/dist/mcp/tools/list-versions.d.ts +10 -0
  148. package/dist/mcp/tools/list-versions.d.ts.map +1 -0
  149. package/dist/mcp/tools/list-versions.js +76 -0
  150. package/dist/mcp/tools/list-versions.js.map +1 -0
  151. package/dist/mcp/tools/reject-task.d.ts +10 -0
  152. package/dist/mcp/tools/reject-task.d.ts.map +1 -0
  153. package/dist/mcp/tools/reject-task.js +63 -0
  154. package/dist/mcp/tools/reject-task.js.map +1 -0
  155. package/dist/mcp/tools/reschedule.d.ts +17 -0
  156. package/dist/mcp/tools/reschedule.d.ts.map +1 -0
  157. package/dist/mcp/tools/reschedule.js +107 -0
  158. package/dist/mcp/tools/reschedule.js.map +1 -0
  159. package/dist/mcp/tools/start-task.d.ts +10 -0
  160. package/dist/mcp/tools/start-task.d.ts.map +1 -0
  161. package/dist/mcp/tools/start-task.js +42 -0
  162. package/dist/mcp/tools/start-task.js.map +1 -0
  163. package/dist/mcp/tools/submit-for-review.d.ts +10 -0
  164. package/dist/mcp/tools/submit-for-review.d.ts.map +1 -0
  165. package/dist/mcp/tools/submit-for-review.js +64 -0
  166. package/dist/mcp/tools/submit-for-review.js.map +1 -0
  167. package/dist/mcp/tools/update-sop.d.ts +10 -0
  168. package/dist/mcp/tools/update-sop.d.ts.map +1 -0
  169. package/dist/mcp/tools/update-sop.js +113 -0
  170. package/dist/mcp/tools/update-sop.js.map +1 -0
  171. package/dist/mcp/tools/update-task-doc.d.ts +10 -0
  172. package/dist/mcp/tools/update-task-doc.d.ts.map +1 -0
  173. package/dist/mcp/tools/update-task-doc.js +70 -0
  174. package/dist/mcp/tools/update-task-doc.js.map +1 -0
  175. package/dist/mcp/tools/update-task.d.ts +10 -0
  176. package/dist/mcp/tools/update-task.d.ts.map +1 -0
  177. package/dist/mcp/tools/update-task.js +106 -0
  178. package/dist/mcp/tools/update-task.js.map +1 -0
  179. package/dist/mcp/tools/utils/config.d.ts +35 -0
  180. package/dist/mcp/tools/utils/config.d.ts.map +1 -0
  181. package/dist/mcp/tools/utils/config.js +81 -0
  182. package/dist/mcp/tools/utils/config.js.map +1 -0
  183. package/dist/services/config.service.d.ts +6 -0
  184. package/dist/services/config.service.d.ts.map +1 -0
  185. package/dist/services/config.service.js +48 -0
  186. package/dist/services/config.service.js.map +1 -0
  187. package/dist/services/project.service.d.ts +29 -0
  188. package/dist/services/project.service.d.ts.map +1 -0
  189. package/dist/services/project.service.js +111 -0
  190. package/dist/services/project.service.js.map +1 -0
  191. package/dist/services/schedule.service.d.ts +104 -0
  192. package/dist/services/schedule.service.d.ts.map +1 -0
  193. package/dist/services/schedule.service.js +362 -0
  194. package/dist/services/schedule.service.js.map +1 -0
  195. package/dist/services/session.service.d.ts +5 -0
  196. package/dist/services/session.service.d.ts.map +1 -0
  197. package/dist/services/session.service.js +30 -0
  198. package/dist/services/session.service.js.map +1 -0
  199. package/dist/services/sop.service.d.ts +53 -0
  200. package/dist/services/sop.service.d.ts.map +1 -0
  201. package/dist/services/sop.service.js +275 -0
  202. package/dist/services/sop.service.js.map +1 -0
  203. package/dist/services/task.service.d.ts +62 -0
  204. package/dist/services/task.service.d.ts.map +1 -0
  205. package/dist/services/task.service.js +546 -0
  206. package/dist/services/task.service.js.map +1 -0
  207. package/dist/services/token.service.d.ts +37 -0
  208. package/dist/services/token.service.d.ts.map +1 -0
  209. package/dist/services/token.service.js +99 -0
  210. package/dist/services/token.service.js.map +1 -0
  211. package/dist/services/user.service.d.ts +95 -0
  212. package/dist/services/user.service.d.ts.map +1 -0
  213. package/dist/services/user.service.js +275 -0
  214. package/dist/services/user.service.js.map +1 -0
  215. package/dist/services/version.service.d.ts +70 -0
  216. package/dist/services/version.service.d.ts.map +1 -0
  217. package/dist/services/version.service.js +225 -0
  218. package/dist/services/version.service.js.map +1 -0
  219. package/dist/types/index.d.ts +207 -0
  220. package/dist/types/index.d.ts.map +1 -0
  221. package/dist/types/index.js +2 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/dist/utils/password.d.ts +16 -0
  224. package/dist/utils/password.d.ts.map +1 -0
  225. package/dist/utils/password.js +37 -0
  226. package/dist/utils/password.js.map +1 -0
  227. package/dist/utils/validation.d.ts +13 -0
  228. package/dist/utils/validation.d.ts.map +1 -0
  229. package/dist/utils/validation.js +20 -0
  230. package/dist/utils/validation.js.map +1 -0
  231. package/package.json +65 -0
  232. package/src/db/schema.sql +162 -0
@@ -0,0 +1,546 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { getDb } from '../db/connection.js';
3
+ import * as versionService from './version.service.js';
4
+ /**
5
+ * 获取任务列表(支持用户过滤)
6
+ */
7
+ export function listTasks(params, userId) {
8
+ const db = getDb();
9
+ const conditions = ['t.deleted_at IS NULL']; // 默认不显示已删除
10
+ const values = [];
11
+ // 用户过滤:通过项目关联
12
+ if (userId) {
13
+ conditions.push('p.owner_id = ?');
14
+ values.push(userId);
15
+ }
16
+ if (params.project_id) {
17
+ conditions.push('t.project_id = ?');
18
+ values.push(params.project_id);
19
+ }
20
+ if (params.version_id !== undefined) {
21
+ if (params.version_id === null) {
22
+ conditions.push('t.version_id IS NULL');
23
+ }
24
+ else {
25
+ conditions.push('t.version_id = ?');
26
+ values.push(params.version_id);
27
+ }
28
+ }
29
+ if (params.parent_id !== undefined) {
30
+ if (params.parent_id === null) {
31
+ conditions.push('t.parent_id IS NULL');
32
+ }
33
+ else {
34
+ conditions.push('t.parent_id = ?');
35
+ values.push(params.parent_id);
36
+ }
37
+ }
38
+ if (params.status) {
39
+ conditions.push('t.status = ?');
40
+ values.push(params.status);
41
+ }
42
+ if (params.assignee_id) {
43
+ conditions.push('t.assignee_id = ?');
44
+ values.push(params.assignee_id);
45
+ }
46
+ const whereClause = `WHERE ${conditions.join(' AND ')}`;
47
+ // 如果需要用户过滤,JOIN projects 表
48
+ const sql = userId
49
+ ? `SELECT t.* FROM tasks t JOIN projects p ON t.project_id = p.id ${whereClause} ORDER BY t.sort_order ASC, t.created_at ASC`
50
+ : `SELECT * FROM tasks ${whereClause.replace(/t\./g, '')} ORDER BY sort_order ASC, created_at ASC`;
51
+ return db.prepare(sql).all(...values);
52
+ }
53
+ /**
54
+ * 根据 ID 获取任务(验证归属)
55
+ */
56
+ export function getTaskById(id, userId) {
57
+ const db = getDb();
58
+ if (userId) {
59
+ const task = db.prepare(`
60
+ SELECT t.* FROM tasks t
61
+ JOIN projects p ON t.project_id = p.id
62
+ WHERE t.id = ? AND p.owner_id = ? AND t.deleted_at IS NULL
63
+ `).get(id, userId);
64
+ return task || null;
65
+ }
66
+ // 兼容旧逻辑
67
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ? AND deleted_at IS NULL').get(id);
68
+ return task || null;
69
+ }
70
+ /**
71
+ * 获取任务详情(含子任务树,验证归属)
72
+ */
73
+ export function getTaskWithChildren(id, userId) {
74
+ const db = getDb();
75
+ // 验证归属
76
+ if (userId) {
77
+ const task = db.prepare(`
78
+ SELECT t.* FROM tasks t
79
+ JOIN projects p ON t.project_id = p.id
80
+ WHERE t.id = ? AND p.owner_id = ? AND t.deleted_at IS NULL
81
+ `).get(id, userId);
82
+ if (!task)
83
+ return null;
84
+ // 获取负责人信息
85
+ let assignee = null;
86
+ if (task.assignee_id) {
87
+ assignee = db.prepare('SELECT * FROM users WHERE id = ?').get(task.assignee_id) || null;
88
+ }
89
+ // 获取 SOP 信息
90
+ let sop = null;
91
+ if (task.sop_id) {
92
+ sop = db.prepare('SELECT * FROM sops WHERE id = ?').get(task.sop_id) || null;
93
+ }
94
+ // 递归获取子任务
95
+ const children = getChildrenRecursive(id, userId);
96
+ return {
97
+ ...task,
98
+ children,
99
+ assignee,
100
+ sop
101
+ };
102
+ }
103
+ // 兼容旧逻辑
104
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ? AND deleted_at IS NULL').get(id);
105
+ if (!task)
106
+ return null;
107
+ // 获取负责人信息
108
+ let assignee = null;
109
+ if (task.assignee_id) {
110
+ assignee = db.prepare('SELECT * FROM users WHERE id = ?').get(task.assignee_id) || null;
111
+ }
112
+ // 获取 SOP 信息
113
+ let sop = null;
114
+ if (task.sop_id) {
115
+ sop = db.prepare('SELECT * FROM sops WHERE id = ?').get(task.sop_id) || null;
116
+ }
117
+ // 递归获取子任务
118
+ const children = getChildrenRecursive(id);
119
+ return {
120
+ ...task,
121
+ children,
122
+ assignee,
123
+ sop
124
+ };
125
+ }
126
+ /**
127
+ * 递归获取子任务(支持用户过滤)
128
+ */
129
+ function getChildrenRecursive(parentId, userId) {
130
+ const db = getDb();
131
+ let children;
132
+ if (userId) {
133
+ children = db.prepare(`
134
+ SELECT t.* FROM tasks t
135
+ JOIN projects p ON t.project_id = p.id
136
+ WHERE t.parent_id = ? AND t.deleted_at IS NULL AND p.owner_id = ?
137
+ ORDER BY t.sort_order ASC, t.created_at ASC
138
+ `).all(parentId, userId);
139
+ }
140
+ else {
141
+ children = db.prepare('SELECT * FROM tasks WHERE parent_id = ? AND deleted_at IS NULL ORDER BY sort_order ASC, created_at ASC').all(parentId);
142
+ }
143
+ return children.map(child => {
144
+ let assignee = null;
145
+ if (child.assignee_id) {
146
+ assignee = db.prepare('SELECT * FROM users WHERE id = ?').get(child.assignee_id) || null;
147
+ }
148
+ let sop = null;
149
+ if (child.sop_id) {
150
+ sop = db.prepare('SELECT * FROM sops WHERE id = ?').get(child.sop_id) || null;
151
+ }
152
+ return {
153
+ ...child,
154
+ children: getChildrenRecursive(child.id, userId),
155
+ assignee,
156
+ sop
157
+ };
158
+ });
159
+ }
160
+ /**
161
+ * 创建任务
162
+ */
163
+ export function createTask(params, createdBy) {
164
+ const db = getDb();
165
+ const id = uuidv4();
166
+ const now = new Date().toISOString();
167
+ // 获取同级任务的最大 sort_order
168
+ const maxOrder = db.prepare('SELECT MAX(sort_order) as max_order FROM tasks WHERE project_id = ? AND parent_id IS ? AND version_id IS ? AND deleted_at IS NULL').get(params.project_id, params.parent_id || null, params.version_id || null);
169
+ const sortOrder = (maxOrder?.max_order ?? -1) + 1;
170
+ db.prepare(`
171
+ INSERT INTO tasks (
172
+ id, project_id, version_id, parent_id, title, description, status,
173
+ assignee_id, estimated_days, start_date, due_date,
174
+ sort_order, created_at, updated_at
175
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
176
+ `).run(id, params.project_id, params.version_id || null, params.parent_id || null, params.title, params.description || null, 'planned', params.assignee_id || null, params.estimated_days ?? 1, params.start_date || null, params.due_date || null, sortOrder, now, now);
177
+ // 记录历史
178
+ addHistory(id, 'created', null, null, null, null, createdBy);
179
+ return getTaskById(id);
180
+ }
181
+ /**
182
+ * 更新任务
183
+ */
184
+ export function updateTask(id, params, updatedBy) {
185
+ const db = getDb();
186
+ const task = getTaskById(id);
187
+ if (!task)
188
+ return null;
189
+ const now = new Date().toISOString();
190
+ const updates = ['updated_at = ?'];
191
+ const values = [now];
192
+ // 记录变更
193
+ const changes = [];
194
+ if (params.title !== undefined && params.title !== task.title) {
195
+ updates.push('title = ?');
196
+ values.push(params.title);
197
+ changes.push({ field: 'title', oldValue: task.title, newValue: params.title });
198
+ }
199
+ if (params.description !== undefined && params.description !== task.description) {
200
+ updates.push('description = ?');
201
+ values.push(params.description);
202
+ changes.push({ field: 'description', oldValue: task.description, newValue: params.description });
203
+ }
204
+ if (params.status !== undefined && params.status !== task.status) {
205
+ updates.push('status = ?');
206
+ values.push(params.status);
207
+ changes.push({ field: 'status', oldValue: task.status, newValue: params.status });
208
+ // 记录实际开始/结束时间
209
+ if (params.status === 'in_progress' && !task.actual_start) {
210
+ updates.push('actual_start = ?');
211
+ values.push(now);
212
+ // 自动锁定版本并设置开始时间(当第一个任务开始时)
213
+ if (task.version_id) {
214
+ const version = versionService.getVersionById(task.version_id);
215
+ if (version) {
216
+ // 如果版本还没有开始时间,设置为今天
217
+ if (!version.start_date) {
218
+ const today = now.split('T')[0]; // 只取日期部分 YYYY-MM-DD
219
+ versionService.updateVersion(task.version_id, { start_date: today });
220
+ }
221
+ // 如果版本还没有锁定,锁定它
222
+ if (!version.locked_at) {
223
+ versionService.lockVersion(task.version_id);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ if (params.status === 'done' && !task.actual_end) {
229
+ updates.push('actual_end = ?');
230
+ values.push(now);
231
+ }
232
+ }
233
+ if (params.assignee_id !== undefined && params.assignee_id !== task.assignee_id) {
234
+ updates.push('assignee_id = ?');
235
+ values.push(params.assignee_id);
236
+ changes.push({ field: 'assignee_id', oldValue: task.assignee_id, newValue: params.assignee_id });
237
+ }
238
+ if (params.estimated_days !== undefined && params.estimated_days !== task.estimated_days) {
239
+ updates.push('estimated_days = ?');
240
+ values.push(params.estimated_days);
241
+ changes.push({ field: 'estimated_days', oldValue: task.estimated_days, newValue: params.estimated_days });
242
+ }
243
+ if (params.start_date !== undefined && params.start_date !== task.start_date) {
244
+ updates.push('start_date = ?');
245
+ values.push(params.start_date);
246
+ changes.push({ field: 'start_date', oldValue: task.start_date, newValue: params.start_date });
247
+ }
248
+ if (params.due_date !== undefined && params.due_date !== task.due_date) {
249
+ updates.push('due_date = ?');
250
+ values.push(params.due_date);
251
+ changes.push({ field: 'due_date', oldValue: task.due_date, newValue: params.due_date });
252
+ }
253
+ if (params.version_id !== undefined && params.version_id !== task.version_id) {
254
+ updates.push('version_id = ?');
255
+ values.push(params.version_id);
256
+ changes.push({ field: 'version_id', oldValue: task.version_id, newValue: params.version_id });
257
+ }
258
+ if (updates.length === 1) {
259
+ // 只有 updated_at,没有实际变更
260
+ return task;
261
+ }
262
+ values.push(id);
263
+ db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = ?`).run(...values);
264
+ // 记录历史
265
+ for (const change of changes) {
266
+ const action = change.field === 'status' ? 'status_changed' :
267
+ change.field === 'assignee_id' ? 'assigned' : 'updated';
268
+ addHistory(id, action, change.field, String(change.oldValue ?? ''), String(change.newValue ?? ''), params.reason || null, updatedBy);
269
+ }
270
+ // 级联状态处理(简化版:只有 done 状态级联)
271
+ if (params.status === 'done') {
272
+ cascadeStatusToChildren(id, 'done', updatedBy);
273
+ }
274
+ if (params.status === 'done' && task.parent_id) {
275
+ checkAndUpdateParentStatus(task.parent_id, updatedBy);
276
+ }
277
+ return getTaskById(id);
278
+ }
279
+ /**
280
+ * 级联更新子任务状态(父带动子)
281
+ */
282
+ function cascadeStatusToChildren(parentId, status, updatedBy) {
283
+ const db = getDb();
284
+ const now = new Date().toISOString();
285
+ const children = db.prepare('SELECT id, status FROM tasks WHERE parent_id = ? AND deleted_at IS NULL').all(parentId);
286
+ for (const child of children) {
287
+ if (child.status !== status) {
288
+ const updates = ['status = ?', 'updated_at = ?', 'actual_end = ?'];
289
+ const values = [status, now, now];
290
+ values.push(child.id);
291
+ db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = ?`).run(...values);
292
+ addHistory(child.id, 'status_changed', 'status', child.status, status, '父任务状态级联', updatedBy);
293
+ }
294
+ cascadeStatusToChildren(child.id, status, updatedBy);
295
+ }
296
+ }
297
+ /**
298
+ * 检查并更新父任务状态(子带动父)
299
+ */
300
+ function checkAndUpdateParentStatus(parentId, updatedBy) {
301
+ const db = getDb();
302
+ const now = new Date().toISOString();
303
+ const parent = db.prepare('SELECT id, status, parent_id FROM tasks WHERE id = ? AND deleted_at IS NULL').get(parentId);
304
+ if (!parent)
305
+ return;
306
+ const children = db.prepare('SELECT status FROM tasks WHERE parent_id = ? AND deleted_at IS NULL').all(parentId);
307
+ if (children.length === 0)
308
+ return;
309
+ const allDone = children.every(c => c.status === 'done');
310
+ if (allDone && parent.status !== 'done') {
311
+ db.prepare('UPDATE tasks SET status = ?, updated_at = ?, actual_end = ? WHERE id = ?').run('done', now, now, parentId);
312
+ addHistory(parentId, 'status_changed', 'status', parent.status, 'done', '子任务状态级联', updatedBy);
313
+ if (parent.parent_id) {
314
+ checkAndUpdateParentStatus(parent.parent_id, updatedBy);
315
+ }
316
+ }
317
+ }
318
+ /**
319
+ * 删除任务(软删除,级联标记所有子任务)
320
+ */
321
+ export function deleteTask(id, userId) {
322
+ const db = getDb();
323
+ const task = getTaskById(id);
324
+ if (!task)
325
+ return false;
326
+ const now = new Date().toISOString();
327
+ // 递归软删除所有子任务
328
+ const children = db.prepare('SELECT id FROM tasks WHERE parent_id = ? AND deleted_at IS NULL').all(id);
329
+ for (const child of children) {
330
+ deleteTask(child.id, userId);
331
+ }
332
+ // 软删除当前任务
333
+ db.prepare('UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE id = ?').run(now, now, id);
334
+ // 记录历史
335
+ addHistory(id, 'updated', 'deleted_at', null, now, '任务已删除', userId);
336
+ return true;
337
+ }
338
+ /**
339
+ * 恢复删除的任务
340
+ */
341
+ export function restoreTask(id, userId) {
342
+ const db = getDb();
343
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
344
+ if (!task || !task.deleted_at)
345
+ return false;
346
+ const now = new Date().toISOString();
347
+ // 恢复当前任务
348
+ db.prepare('UPDATE tasks SET deleted_at = NULL, updated_at = ? WHERE id = ?').run(now, id);
349
+ // 记录历史
350
+ addHistory(id, 'updated', 'deleted_at', task.deleted_at, null, '任务已恢复', userId);
351
+ return true;
352
+ }
353
+ /**
354
+ * 重新排序任务
355
+ */
356
+ export function reorderTasks(taskIds, parentId = null) {
357
+ const db = getDb();
358
+ const now = new Date().toISOString();
359
+ taskIds.forEach((taskId, index) => {
360
+ db.prepare(`
361
+ UPDATE tasks SET sort_order = ?, updated_at = ? WHERE id = ?
362
+ `).run(index, now, taskId);
363
+ });
364
+ }
365
+ /**
366
+ * 添加任务历史记录
367
+ */
368
+ function addHistory(taskId, action, field, oldValue, newValue, reason, changedBy) {
369
+ const db = getDb();
370
+ const id = uuidv4();
371
+ const now = new Date().toISOString();
372
+ db.prepare(`
373
+ INSERT INTO task_history (id, task_id, action, field, old_value, new_value, reason, changed_by, changed_at)
374
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
375
+ `).run(id, taskId, action, field, oldValue, newValue, reason, changedBy || null, now);
376
+ }
377
+ /**
378
+ * 获取任务历史
379
+ */
380
+ export function getTaskHistory(taskId) {
381
+ const db = getDb();
382
+ return db.prepare('SELECT * FROM task_history WHERE task_id = ? ORDER BY changed_at DESC').all(taskId);
383
+ }
384
+ /**
385
+ * 添加任务备注
386
+ */
387
+ export function addTaskNote(taskId, note, userId) {
388
+ const db = getDb();
389
+ const id = uuidv4();
390
+ const now = new Date().toISOString();
391
+ db.prepare(`
392
+ INSERT INTO task_history (id, task_id, action, field, old_value, new_value, reason, changed_by, changed_at)
393
+ VALUES (?, ?, 'noted', NULL, NULL, ?, NULL, ?, ?)
394
+ `).run(id, taskId, note, userId || null, now);
395
+ return db.prepare('SELECT * FROM task_history WHERE id = ?').get(id);
396
+ }
397
+ /**
398
+ * 获取任务完整上下文(用于断点续传)
399
+ */
400
+ export function getTaskContext(taskId, historyLimit = 5) {
401
+ const db = getDb();
402
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ? AND deleted_at IS NULL').get(taskId);
403
+ if (!task)
404
+ return null;
405
+ // 获取负责人信息
406
+ let assignee = null;
407
+ if (task.assignee_id) {
408
+ assignee = db.prepare('SELECT * FROM users WHERE id = ?').get(task.assignee_id) || null;
409
+ }
410
+ // 获取 SOP 信息
411
+ let sop = null;
412
+ if (task.sop_id) {
413
+ sop = db.prepare('SELECT * FROM sops WHERE id = ?').get(task.sop_id) || null;
414
+ }
415
+ // 获取最近历史记录
416
+ const recentHistory = db.prepare('SELECT * FROM task_history WHERE task_id = ? ORDER BY changed_at DESC LIMIT ?').all(taskId, historyLimit);
417
+ // 获取子任务摘要
418
+ const children = db.prepare('SELECT id, title, status FROM tasks WHERE parent_id = ? AND deleted_at IS NULL ORDER BY sort_order ASC').all(taskId);
419
+ const childrenSummary = {
420
+ total: children.length,
421
+ done: children.filter(c => c.status === 'done').length,
422
+ in_progress: children.filter(c => c.status === 'in_progress').length,
423
+ children: children.map(c => ({
424
+ id: c.id,
425
+ title: c.title,
426
+ status: c.status,
427
+ })),
428
+ };
429
+ return {
430
+ id: task.id,
431
+ title: task.title,
432
+ status: task.status,
433
+ assignee,
434
+ start_date: task.start_date,
435
+ due_date: task.due_date,
436
+ estimated_days: task.estimated_days,
437
+ actual_start: task.actual_start,
438
+ actual_end: task.actual_end,
439
+ requirement_doc: task.requirement_doc,
440
+ design_doc: task.design_doc,
441
+ current_status: task.current_status,
442
+ recent_history: recentHistory,
443
+ children_summary: childrenSummary,
444
+ };
445
+ }
446
+ /**
447
+ * 更新任务阶段文档
448
+ */
449
+ export function updateTaskDoc(taskId, docType, content, append = false, userId) {
450
+ const db = getDb();
451
+ const task = getTaskById(taskId);
452
+ if (!task)
453
+ return null;
454
+ const now = new Date().toISOString();
455
+ // 映射文档类型到字段名
456
+ const fieldMap = {
457
+ requirement: 'requirement_doc',
458
+ design: 'design_doc',
459
+ status: 'current_status',
460
+ };
461
+ const field = fieldMap[docType];
462
+ // 计算新内容
463
+ const oldValue = task[field] || '';
464
+ const newValue = append ? (oldValue ? `${oldValue}\n\n${content}` : content) : content;
465
+ // 更新数据库
466
+ db.prepare(`UPDATE tasks SET ${field} = ?, updated_at = ? WHERE id = ?`).run(newValue, now, taskId);
467
+ // 记录历史
468
+ addHistory(taskId, 'updated', field, oldValue, newValue, null, userId);
469
+ return getTaskById(taskId);
470
+ }
471
+ /**
472
+ * 激活任务(将状态改为进行中,可同时设置 SOP)
473
+ */
474
+ export function activateTask(taskId, sopId = null, userId) {
475
+ const db = getDb();
476
+ const task = getTaskById(taskId);
477
+ if (!task || task.deleted_at)
478
+ return null;
479
+ const now = new Date().toISOString();
480
+ const updates = ['status = ?', 'updated_at = ?'];
481
+ const values = ['in_progress', now];
482
+ // 记录实际开始时间
483
+ if (!task.actual_start) {
484
+ updates.push('actual_start = ?');
485
+ values.push(now);
486
+ }
487
+ // 设置 SOP
488
+ if (sopId !== undefined && sopId !== task.sop_id) {
489
+ updates.push('sop_id = ?');
490
+ values.push(sopId);
491
+ addHistory(taskId, 'updated', 'sop_id', task.sop_id, sopId, '激活任务时设置 SOP', userId);
492
+ }
493
+ values.push(taskId);
494
+ db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = ?`).run(...values);
495
+ // 记录状态变更历史
496
+ addHistory(taskId, 'status_changed', 'status', task.status, 'in_progress', '任务已激活', userId);
497
+ // 自动锁定版本并设置开始时间
498
+ if (task.version_id) {
499
+ const version = versionService.getVersionById(task.version_id);
500
+ if (version) {
501
+ if (!version.start_date) {
502
+ const today = now.split('T')[0];
503
+ versionService.updateVersion(task.version_id, { start_date: today });
504
+ }
505
+ if (!version.locked_at) {
506
+ versionService.lockVersion(task.version_id);
507
+ }
508
+ }
509
+ }
510
+ return getTaskWithChildren(taskId);
511
+ }
512
+ /**
513
+ * 设置任务的 SOP
514
+ */
515
+ export function setTaskSOP(taskId, sopId, userId) {
516
+ const db = getDb();
517
+ const task = getTaskById(taskId);
518
+ if (!task || task.deleted_at)
519
+ return null;
520
+ const now = new Date().toISOString();
521
+ db.prepare('UPDATE tasks SET sop_id = ?, updated_at = ? WHERE id = ?').run(sopId, now, taskId);
522
+ addHistory(taskId, 'updated', 'sop_id', task.sop_id, sopId, '设置任务 SOP', userId);
523
+ return getTaskById(taskId);
524
+ }
525
+ /**
526
+ * 完成任务
527
+ */
528
+ export function completeTask(taskId, userId) {
529
+ const db = getDb();
530
+ const task = getTaskById(taskId);
531
+ if (!task || task.deleted_at)
532
+ return null;
533
+ const now = new Date().toISOString();
534
+ db.prepare(`
535
+ UPDATE tasks SET status = ?, actual_end = ?, updated_at = ? WHERE id = ?
536
+ `).run('done', now, now, taskId);
537
+ addHistory(taskId, 'status_changed', 'status', task.status, 'done', '任务已完成', userId);
538
+ // 级联完成子任务
539
+ cascadeStatusToChildren(taskId, 'done', userId);
540
+ // 检查父任务状态
541
+ if (task.parent_id) {
542
+ checkAndUpdateParentStatus(task.parent_id, userId);
543
+ }
544
+ return getTaskWithChildren(taskId);
545
+ }
546
+ //# sourceMappingURL=task.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.service.js","sourceRoot":"","sources":["../../src/services/task.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { UserToken } from '../types/index.js';
2
+ export interface CreateTokenParams {
3
+ user_id: string;
4
+ name: string;
5
+ }
6
+ export interface TokenWithPlain extends UserToken {
7
+ plain_token?: string;
8
+ }
9
+ /**
10
+ * 生成安全的随机 Token
11
+ */
12
+ export declare function generateToken(): string;
13
+ /**
14
+ * 创建 Token
15
+ */
16
+ export declare function createToken(params: CreateTokenParams): TokenWithPlain;
17
+ /**
18
+ * 根据 Token 值查找
19
+ */
20
+ export declare function findTokenByValue(tokenValue: string): UserToken | null;
21
+ /**
22
+ * 列出用户的所有 Token(返回完整 Token,便于复制)
23
+ */
24
+ export declare function listTokens(userId: string): UserToken[];
25
+ /**
26
+ * 删除 Token
27
+ */
28
+ export declare function deleteToken(tokenId: string, userId: string): boolean;
29
+ /**
30
+ * 更新 Token 最后使用时间
31
+ */
32
+ export declare function updateTokenLastUsed(tokenValue: string): void;
33
+ /**
34
+ * 掩码 Token
35
+ */
36
+ export declare function maskToken(token: string): string;
37
+ //# sourceMappingURL=token.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.service.d.ts","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAoCrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAUtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C"}