From af206480fb8925b27305f0f5fc3e729e64ba8b52 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 10 Jun 2026 04:05:18 +0000 Subject: [PATCH] =?UTF-8?q?feat(ai-kb):=20=E8=90=BD=E5=9C=B0=20RAG=20?= =?UTF-8?q?=E7=9F=A5=E8=AF=86=E5=BA=93=E4=B8=8E=E7=81=B0=E5=BA=A6=E9=93=BE?= =?UTF-8?q?=E8=B7=AF(48=20feature=20/=20546=20chunk)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ai-kb-reindex.yml | 97 ++ CLAUDE.md | 26 + .../Controllers/Api/AssistantController.php | 11 +- app/Module/AI.php | 29 +- config/ai.php | 57 + resources/ai-kb/README.md | 80 ++ resources/ai-kb/_eval/golden-50q.yaml | 575 +++++++++ resources/ai-kb/_eval/golden-v0.yaml | 129 ++ resources/ai-kb/_meta/feature-map.yaml | 1087 +++++++++++++++++ resources/ai-kb/_meta/tool-binding.yaml | 198 +++ resources/ai-kb/_schema/chunk-style.md | 243 ++++ resources/ai-kb/_schema/frontmatter.md | 129 ++ resources/ai-kb/en/concept/.gitkeep | 0 resources/ai-kb/en/faq/.gitkeep | 0 resources/ai-kb/en/glossary/.gitkeep | 0 resources/ai-kb/en/howto/.gitkeep | 0 resources/ai-kb/en/menu-map/.gitkeep | 0 resources/ai-kb/en/shortcut/.gitkeep | 0 resources/ai-kb/zh/concept/.gitkeep | 0 .../ai-kb/zh/concept/abuse-report/overview.md | 60 + .../ai-kb/zh/concept/ai-assistant/auth.md | 64 + .../zh/concept/ai-assistant/embed-entry.md | 61 + .../zh/concept/ai-assistant/float-button.md | 51 + .../zh/concept/ai-assistant/match-elements.md | 56 + .../zh/concept/ai-assistant/mobile-entry.md | 63 + .../ai-kb/zh/concept/ai-assistant/modal.md | 68 ++ .../ai-kb/zh/concept/ai-assistant/model.md | 68 ++ .../zh/concept/ai-assistant/multimodal.md | 59 + .../zh/concept/ai-assistant/page-action.md | 53 + .../concept/ai-assistant/page-context-tool.md | 56 + .../zh/concept/ai-assistant/page-context.md | 78 ++ .../ai-kb/zh/concept/ai-assistant/privacy.md | 80 ++ .../ai-kb/zh/concept/ai-assistant/session.md | 70 ++ .../zh/concept/ai-assistant/streaming.md | 74 ++ .../zh/concept/ai-assistant/tool-call.md | 53 + .../zh/concept/ai-assistant/tools-list.md | 66 + .../ai-kb/zh/concept/ai-assistant/tools.md | 51 + .../concept/ai-assistant/welcome-prompts.md | 75 ++ .../ai-kb/zh/concept/application/center.md | 42 + .../ai-kb/zh/concept/application/classify.md | 48 + resources/ai-kb/zh/concept/approve/form.md | 59 + resources/ai-kb/zh/concept/approve/history.md | 49 + resources/ai-kb/zh/concept/approve/node.md | 58 + resources/ai-kb/zh/concept/approve/notify.md | 47 + .../ai-kb/zh/concept/approve/overview.md | 46 + resources/ai-kb/zh/concept/approve/plugin.md | 43 + .../ai-kb/zh/concept/approve/process-inst.md | 51 + .../ai-kb/zh/concept/approve/template.md | 48 + .../ai-kb/zh/concept/apps/admin-apps/list.md | 42 + .../zh/concept/apps/admin-apps/visibility.md | 45 + .../ai-kb/zh/concept/apps/system-apps/list.md | 53 + .../zh/concept/apps/system-apps/relation.md | 50 + .../zh/concept/apps/system-apps/visibility.md | 50 + .../ai-kb/zh/concept/appstore/overview.md | 54 + resources/ai-kb/zh/concept/bot/overview.md | 46 + resources/ai-kb/zh/concept/bot/system-list.md | 58 + resources/ai-kb/zh/concept/bot/webhook.md | 64 + resources/ai-kb/zh/concept/calendar/allday.md | 54 + .../zh/concept/calendar/edit-via-detail.md | 52 + resources/ai-kb/zh/concept/calendar/filter.md | 53 + .../ai-kb/zh/concept/calendar/overview.md | 53 + .../ai-kb/zh/concept/calendar/task-only.md | 55 + .../ai-kb/zh/concept/calendar/timezone.md | 51 + resources/ai-kb/zh/concept/checkin/face.md | 39 + .../ai-kb/zh/concept/checkin/overview.md | 46 + resources/ai-kb/zh/concept/checkin/plugin.md | 41 + resources/ai-kb/zh/concept/checkin/remind.md | 46 + resources/ai-kb/zh/concept/checkin/rule.md | 49 + .../ai-kb/zh/concept/compliance/overview.md | 54 + .../ai-kb/zh/concept/dashboard/overview.md | 56 + .../ai-kb/zh/concept/data-export/overview.md | 52 + .../zh/concept/desktop-notify/overview.md | 53 + .../ai-kb/zh/concept/desktop-notify/tray.md | 61 + resources/ai-kb/zh/concept/drawio/overview.md | 55 + resources/ai-kb/zh/concept/drawio/plugin.md | 53 + resources/ai-kb/zh/concept/drawio/template.md | 60 + .../zh/concept/electron-client/notify.md | 60 + .../zh/concept/electron-client/overview.md | 53 + .../zh/concept/electron-client/platforms.md | 59 + .../ai-kb/zh/concept/electron-client/proxy.md | 61 + .../zh/concept/electron-client/shortcut.md | 66 + .../ai-kb/zh/concept/electron-client/tray.md | 61 + .../ai-kb/zh/concept/email-notice/overview.md | 46 + .../zh/concept/email-notice/scenarios.md | 53 + .../ai-kb/zh/concept/favorite/overview.md | 48 + resources/ai-kb/zh/concept/favorite/recent.md | 62 + resources/ai-kb/zh/concept/file/preview.md | 50 + resources/ai-kb/zh/concept/file/tree.md | 47 + resources/ai-kb/zh/concept/file/version.md | 54 + .../ai-kb/zh/concept/fileview/overview.md | 48 + resources/ai-kb/zh/concept/fileview/plugin.md | 53 + .../ai-kb/zh/concept/fileview/supported.md | 61 + resources/ai-kb/zh/concept/kpi/overview.md | 62 + resources/ai-kb/zh/concept/kpi/plugin.md | 60 + resources/ai-kb/zh/concept/kpi/scoring.md | 73 ++ resources/ai-kb/zh/concept/ldap/overview.md | 60 + .../ai-kb/zh/concept/license/overview.md | 59 + .../ai-kb/zh/concept/meeting/overview.md | 44 + resources/ai-kb/zh/concept/meeting/tourist.md | 62 + resources/ai-kb/zh/concept/memos/overview.md | 55 + resources/ai-kb/zh/concept/memos/plugin.md | 52 + resources/ai-kb/zh/concept/memos/tag.md | 57 + resources/ai-kb/zh/concept/messenger/bot.md | 60 + .../ai-kb/zh/concept/messenger/dialog-type.md | 56 + .../ai-kb/zh/concept/messenger/notify.md | 52 + .../zh/concept/messenger/read-receipt.md | 52 + .../zh/concept/messenger/task-mention.md | 54 + .../ai-kb/zh/concept/messenger/unread.md | 55 + resources/ai-kb/zh/concept/micro-app/list.md | 49 + resources/ai-kb/zh/concept/micro-app/menu.md | 56 + .../ai-kb/zh/concept/micro-app/overview.md | 49 + .../ai-kb/zh/concept/micro-app/permission.md | 51 + .../ai-kb/zh/concept/minder/collaboration.md | 50 + resources/ai-kb/zh/concept/minder/overview.md | 45 + resources/ai-kb/zh/concept/minder/plugin.md | 48 + .../zh/concept/mobile-client/feature-diff.md | 73 ++ .../ai-kb/zh/concept/mobile-client/gesture.md | 65 + .../ai-kb/zh/concept/mobile-client/notify.md | 67 + .../ai-kb/zh/concept/mobile-client/offline.md | 62 + .../zh/concept/mobile-client/overview.md | 56 + .../zh/concept/mobile-notify/overview.md | 52 + .../ai-kb/zh/concept/office/collaboration.md | 56 + resources/ai-kb/zh/concept/office/overview.md | 48 + resources/ai-kb/zh/concept/office/plugin.md | 54 + resources/ai-kb/zh/concept/okr/cycle.md | 57 + resources/ai-kb/zh/concept/okr/kr.md | 59 + resources/ai-kb/zh/concept/okr/objective.md | 58 + resources/ai-kb/zh/concept/okr/overview.md | 56 + resources/ai-kb/zh/concept/okr/plugin.md | 52 + resources/ai-kb/zh/concept/okr/team.md | 62 + .../ai-kb/zh/concept/org-department/deputy.md | 52 + .../zh/concept/org-department/overview.md | 46 + resources/ai-kb/zh/concept/project/dialog.md | 55 + .../ai-kb/zh/concept/project/flow-default.md | 55 + .../ai-kb/zh/concept/project/permission.md | 64 + .../ai-kb/zh/concept/project/personal.md | 54 + resources/ai-kb/zh/concept/project/role.md | 55 + .../ai-kb/zh/concept/project/statistics.md | 57 + .../ai-kb/zh/concept/push-notice/alias.md | 62 + .../ai-kb/zh/concept/push-notice/overview.md | 48 + .../ai-kb/zh/concept/push-notice/scenarios.md | 57 + resources/ai-kb/zh/concept/report/analysis.md | 51 + resources/ai-kb/zh/concept/report/link.md | 59 + resources/ai-kb/zh/concept/report/overview.md | 43 + resources/ai-kb/zh/concept/report/type.md | 50 + .../ai-kb/zh/concept/role-permission/admin.md | 48 + .../role-permission/department-role.md | 54 + .../zh/concept/role-permission/overview.md | 43 + .../concept/role-permission/project-role.md | 58 + .../zh/concept/role-permission/super-admin.md | 49 + .../zh/concept/role-permission/task-role.md | 59 + resources/ai-kb/zh/concept/search/engine.md | 55 + .../ai-kb/zh/concept/search/intelligent.md | 59 + resources/ai-kb/zh/concept/search/overview.md | 48 + resources/ai-kb/zh/concept/task/color.md | 51 + resources/ai-kb/zh/concept/task/deadline.md | 53 + .../ai-kb/zh/concept/task/description.md | 49 + resources/ai-kb/zh/concept/task/dialog.md | 50 + resources/ai-kb/zh/concept/task/flow.md | 54 + resources/ai-kb/zh/concept/task/notify.md | 51 + .../ai-kb/zh/concept/task/owner-assist.md | 58 + resources/ai-kb/zh/concept/task/priority.md | 51 + resources/ai-kb/zh/concept/task/related.md | 55 + .../ai-kb/zh/concept/task/subtask-limits.md | 54 + resources/ai-kb/zh/concept/task/subtask.md | 45 + resources/ai-kb/zh/concept/task/tag.md | 56 + resources/ai-kb/zh/concept/task/visibility.md | 52 + .../ai-kb/zh/concept/user-account/info.md | 65 + .../concept/user-account/reg-need-invite.md | 53 + .../ai-kb/zh/concept/user-settings/privacy.md | 60 + .../zh/concept/user-settings/shortcut.md | 66 + resources/ai-kb/zh/concept/view/entry.md | 46 + resources/ai-kb/zh/concept/view/kanban.md | 48 + .../zh/concept/web-client/compatibility.md | 54 + .../ai-kb/zh/concept/web-client/overview.md | 50 + .../ai-kb/zh/concept/web-client/shortcut.md | 54 + resources/ai-kb/zh/faq/.gitkeep | 0 .../ai-kb/zh/faq/ai-assistant/disabled.md | 68 ++ .../ai-kb/zh/faq/ai-assistant/mcp-down.md | 57 + .../ai-kb/zh/faq/ai-assistant/model-empty.md | 55 + .../ai-kb/zh/faq/ai-assistant/no-tool-call.md | 51 + .../ai-kb/zh/faq/ai-assistant/tool-failed.md | 49 + .../zh/faq/ai-assistant/tool-permission.md | 54 + resources/ai-kb/zh/faq/apps/.gitkeep | 0 .../ai-kb/zh/faq/appstore/cannot-install.md | 62 + resources/ai-kb/zh/faq/bot/permission.md | 48 + .../ai-kb/zh/faq/calendar/ical-export.md | 49 + .../zh/faq/calendar/meeting-not-shown.md | 53 + .../ai-kb/zh/faq/calendar/mobile-readonly.md | 50 + resources/ai-kb/zh/faq/checkin/face-fail.md | 41 + resources/ai-kb/zh/faq/checkin/late.md | 47 + .../ai-kb/zh/faq/checkin/mac-not-match.md | 45 + .../zh/faq/common-faq/account-cant-login.md | 67 + .../common-faq/account-email-not-verified.md | 66 + .../faq/common-faq/account-forget-password.md | 66 + .../ai-kb/zh/faq/common-faq/account-locked.md | 69 ++ .../account-multi-device-conflict.md | 72 ++ .../ai-kb/zh/faq/common-faq/ai-no-models.md | 51 + resources/ai-kb/zh/faq/common-faq/ai-slow.md | 53 + .../ai-kb/zh/faq/common-faq/ai-token-cost.md | 60 + .../zh/faq/common-faq/ai-tool-permission.md | 51 + .../zh/faq/common-faq/ai-wrong-answer.md | 50 + .../ai-kb/zh/faq/common-faq/data-import.md | 65 + .../ai-kb/zh/faq/common-faq/deploy-backup.md | 67 + .../ai-kb/zh/faq/common-faq/deploy-perf.md | 73 ++ .../ai-kb/zh/faq/common-faq/deploy-ssl.md | 69 ++ .../ai-kb/zh/faq/common-faq/deploy-storage.md | 69 ++ .../ai-kb/zh/faq/common-faq/deploy-update.md | 59 + .../zh/faq/common-faq/language-cant-change.md | 66 + .../zh/faq/common-faq/notify-desktop-fail.md | 63 + .../zh/faq/common-faq/notify-email-fail.md | 56 + .../zh/faq/common-faq/notify-mobile-fail.md | 55 + .../zh/faq/common-faq/notify-no-receive.md | 49 + .../zh/faq/common-faq/notify-too-many.md | 54 + .../faq/common-faq/permission-admin-area.md | 48 + .../permission-cannot-add-member.md | 49 + .../permission-cannot-edit-project.md | 49 + .../common-faq/permission-cannot-see-task.md | 50 + .../zh/faq/common-faq/permission-readonly.md | 52 + .../zh/faq/common-faq/plugin-not-loaded.md | 59 + .../zh/faq/common-faq/search-no-result.md | 71 ++ .../ai-kb/zh/faq/common-faq/sync-ldap.md | 63 + .../zh/faq/common-faq/sync-multi-device.md | 52 + .../zh/faq/common-faq/sync-offline-data.md | 61 + .../zh/faq/common-faq/sync-task-not-update.md | 50 + .../common-faq/sync-websocket-disconnect.md | 58 + .../zh/faq/common-faq/theme-cant-change.md | 67 + .../zh/faq/common-faq/upload-disk-full.md | 58 + .../zh/faq/common-faq/upload-image-error.md | 50 + .../zh/faq/common-faq/upload-size-limit.md | 50 + .../ai-kb/zh/faq/common-faq/upload-stuck.md | 50 + .../zh/faq/common-faq/upload-type-block.md | 51 + resources/ai-kb/zh/faq/dashboard/refresh.md | 51 + .../ai-kb/zh/faq/desktop-notify/permission.md | 67 + .../ai-kb/zh/faq/electron-client/logs.md | 74 ++ .../ai-kb/zh/faq/email-notice/troubleshoot.md | 59 + resources/ai-kb/zh/faq/ldap/troubleshoot.md | 76 ++ resources/ai-kb/zh/faq/license/expire.md | 73 ++ resources/ai-kb/zh/faq/meeting/cannot-join.md | 62 + .../zh/faq/mobile-client/cannot-login.md | 79 ++ .../ai-kb/zh/faq/mobile-client/push-fail.md | 78 ++ .../ai-kb/zh/faq/mobile-notify/permission.md | 73 ++ resources/ai-kb/zh/faq/okr/cannot-install.md | 48 + .../zh/faq/project/permission-denied-task.md | 52 + .../zh/faq/project/permission-to-create.md | 51 + .../ai-kb/zh/faq/push-notice/troubleshoot.md | 62 + resources/ai-kb/zh/faq/report/permission.md | 53 + .../faq/role-permission/permission-denied.md | 48 + resources/ai-kb/zh/faq/search/no-result.md | 48 + .../zh/faq/user-account/delete-restore.md | 54 + resources/ai-kb/zh/faq/view/mobile.md | 51 + resources/ai-kb/zh/glossary/.gitkeep | 0 resources/ai-kb/zh/glossary/main.md | 87 ++ resources/ai-kb/zh/howto/.gitkeep | 0 .../ai-kb/zh/howto/abuse-report/handle.md | 58 + .../ai-kb/zh/howto/ai-assistant/close.md | 69 ++ .../zh/howto/ai-assistant/create-task.md | 59 + .../zh/howto/ai-assistant/element-action.md | 69 ++ .../ai-kb/zh/howto/ai-assistant/entry.md | 52 + .../zh/howto/ai-assistant/float-button.md | 59 + .../zh/howto/ai-assistant/image-upload.md | 69 ++ .../howto/ai-assistant/intelligent-search.md | 62 + .../ai-kb/zh/howto/ai-assistant/list-tasks.md | 66 + .../zh/howto/ai-assistant/model-switch.md | 59 + .../ai-kb/zh/howto/ai-assistant/new-chat.md | 64 + .../zh/howto/ai-assistant/page-action.md | 67 + .../zh/howto/ai-assistant/project-init.md | 62 + .../zh/howto/ai-assistant/report-draft.md | 56 + .../zh/howto/ai-assistant/search-files.md | 56 + .../zh/howto/ai-assistant/search-help-docs.md | 56 + .../zh/howto/ai-assistant/search-users.md | 61 + .../zh/howto/ai-assistant/send-message.md | 59 + .../zh/howto/ai-assistant/session-delete.md | 63 + .../zh/howto/ai-assistant/session-list.md | 70 ++ .../zh/howto/ai-assistant/session-save.md | 67 + .../ai-kb/zh/howto/ai-assistant/shortcut.md | 59 + resources/ai-kb/zh/howto/ai-assistant/stop.md | 63 + .../zh/howto/ai-assistant/subtask-suggest.md | 58 + .../zh/howto/ai-assistant/task-mention.md | 62 + .../zh/howto/ai-assistant/task-summary.md | 58 + .../ai-kb/zh/howto/application/menu-admin.md | 53 + resources/ai-kb/zh/howto/application/sort.md | 47 + resources/ai-kb/zh/howto/approve/cc.md | 46 + resources/ai-kb/zh/howto/approve/comment.md | 58 + resources/ai-kb/zh/howto/approve/delete.md | 57 + resources/ai-kb/zh/howto/approve/detail.md | 53 + resources/ai-kb/zh/howto/approve/doto.md | 51 + resources/ai-kb/zh/howto/approve/export.md | 63 + resources/ai-kb/zh/howto/approve/install.md | 56 + resources/ai-kb/zh/howto/approve/my-start.md | 49 + resources/ai-kb/zh/howto/approve/my-todo.md | 57 + resources/ai-kb/zh/howto/approve/start.md | 55 + resources/ai-kb/zh/howto/approve/template.md | 60 + .../ai-kb/zh/howto/apps/admin-apps/.gitkeep | 0 .../howto/apps/admin-apps/checkin-setting.md | 47 + .../ai-kb/zh/howto/apps/admin-apps/email.md | 46 + .../ai-kb/zh/howto/apps/admin-apps/export.md | 50 + .../ai-kb/zh/howto/apps/admin-apps/ldap.md | 46 + .../zh/howto/apps/admin-apps/meeting-mgmt.md | 46 + .../ai-kb/zh/howto/apps/admin-apps/push.md | 47 + .../ai-kb/zh/howto/apps/admin-apps/report.md | 44 + .../ai-kb/zh/howto/apps/admin-apps/team.md | 46 + .../ai-kb/zh/howto/apps/micro-apps/.gitkeep | 0 .../ai-kb/zh/howto/apps/system-apps/.gitkeep | 0 .../zh/howto/apps/system-apps/add-task.md | 45 + .../zh/howto/apps/system-apps/approve.md | 56 + .../ai-kb/zh/howto/apps/system-apps/bot.md | 51 + .../zh/howto/apps/system-apps/checkin.md | 46 + .../zh/howto/apps/system-apps/create-group.md | 42 + .../howto/apps/system-apps/create-project.md | 42 + .../ai-kb/zh/howto/apps/system-apps/export.md | 56 + .../zh/howto/apps/system-apps/favorite.md | 42 + .../zh/howto/apps/system-apps/meeting.md | 46 + .../ai-kb/zh/howto/apps/system-apps/recent.md | 44 + .../ai-kb/zh/howto/apps/system-apps/report.md | 45 + resources/ai-kb/zh/howto/appstore/install.md | 58 + .../ai-kb/zh/howto/appstore/uninstall.md | 58 + resources/ai-kb/zh/howto/appstore/update.md | 60 + resources/ai-kb/zh/howto/bot/create.md | 58 + resources/ai-kb/zh/howto/bot/invite.md | 53 + resources/ai-kb/zh/howto/bot/mention.md | 53 + resources/ai-kb/zh/howto/calendar/create.md | 53 + resources/ai-kb/zh/howto/calendar/drag.md | 61 + resources/ai-kb/zh/howto/calendar/view.md | 56 + resources/ai-kb/zh/howto/checkin/export.md | 52 + resources/ai-kb/zh/howto/checkin/face.md | 45 + resources/ai-kb/zh/howto/checkin/record.md | 46 + resources/ai-kb/zh/howto/checkin/regular.md | 41 + resources/ai-kb/zh/howto/checkin/setting.md | 49 + resources/ai-kb/zh/howto/checkin/wifi.md | 45 + resources/ai-kb/zh/howto/compliance/config.md | 70 ++ resources/ai-kb/zh/howto/dashboard/assist.md | 54 + .../ai-kb/zh/howto/dashboard/collapse.md | 53 + resources/ai-kb/zh/howto/dashboard/overdue.md | 54 + resources/ai-kb/zh/howto/dashboard/today.md | 52 + resources/ai-kb/zh/howto/dashboard/todo.md | 56 + .../ai-kb/zh/howto/data-export/approve.md | 51 + .../ai-kb/zh/howto/data-export/checkin.md | 54 + .../ai-kb/zh/howto/data-export/project.md | 51 + .../ai-kb/zh/howto/data-export/report.md | 52 + resources/ai-kb/zh/howto/data-export/task.md | 53 + resources/ai-kb/zh/howto/data-export/user.md | 55 + .../ai-kb/zh/howto/desktop-notify/toggle.md | 55 + resources/ai-kb/zh/howto/drawio/create.md | 60 + .../zh/howto/electron-client/auto-start.md | 70 ++ .../zh/howto/electron-client/download.md | 73 ++ .../zh/howto/electron-client/uninstall.md | 79 ++ .../ai-kb/zh/howto/electron-client/update.md | 62 + .../ai-kb/zh/howto/electron-client/window.md | 58 + .../ai-kb/zh/howto/email-notice/config.md | 55 + .../ai-kb/zh/howto/email-notice/send-test.md | 55 + .../ai-kb/zh/howto/email-notice/user-opt.md | 48 + resources/ai-kb/zh/howto/favorite/add.md | 54 + resources/ai-kb/zh/howto/favorite/list.md | 65 + resources/ai-kb/zh/howto/favorite/remove.md | 53 + resources/ai-kb/zh/howto/file/create.md | 56 + .../ai-kb/zh/howto/file/delete-restore.md | 56 + resources/ai-kb/zh/howto/file/move.md | 49 + resources/ai-kb/zh/howto/file/public-link.md | 53 + resources/ai-kb/zh/howto/file/rename.md | 48 + resources/ai-kb/zh/howto/file/search.md | 53 + resources/ai-kb/zh/howto/file/share.md | 55 + resources/ai-kb/zh/howto/file/upload.md | 53 + resources/ai-kb/zh/howto/kpi/create.md | 69 ++ resources/ai-kb/zh/howto/ldap/config.md | 79 ++ resources/ai-kb/zh/howto/ldap/sync.md | 79 ++ resources/ai-kb/zh/howto/license/apply.md | 77 ++ .../ai-kb/zh/howto/meeting/audio-video.md | 56 + resources/ai-kb/zh/howto/meeting/chat.md | 50 + resources/ai-kb/zh/howto/meeting/close.md | 55 + resources/ai-kb/zh/howto/meeting/create.md | 64 + .../ai-kb/zh/howto/meeting/from-dialog.md | 56 + resources/ai-kb/zh/howto/meeting/invite.md | 50 + resources/ai-kb/zh/howto/meeting/join.md | 52 + resources/ai-kb/zh/howto/meeting/share.md | 52 + resources/ai-kb/zh/howto/memos/create.md | 56 + resources/ai-kb/zh/howto/messenger/chain.md | 59 + .../ai-kb/zh/howto/messenger/create-group.md | 52 + .../ai-kb/zh/howto/messenger/dissolve.md | 53 + resources/ai-kb/zh/howto/messenger/exit.md | 53 + resources/ai-kb/zh/howto/messenger/history.md | 60 + resources/ai-kb/zh/howto/messenger/member.md | 56 + resources/ai-kb/zh/howto/messenger/mention.md | 59 + resources/ai-kb/zh/howto/messenger/mute.md | 57 + resources/ai-kb/zh/howto/messenger/pin.md | 55 + resources/ai-kb/zh/howto/messenger/quote.md | 54 + resources/ai-kb/zh/howto/messenger/recall.md | 65 + .../ai-kb/zh/howto/messenger/rename-group.md | 58 + resources/ai-kb/zh/howto/messenger/search.md | 56 + .../ai-kb/zh/howto/messenger/send-file.md | 66 + .../ai-kb/zh/howto/messenger/send-image.md | 62 + .../ai-kb/zh/howto/messenger/send-text.md | 57 + resources/ai-kb/zh/howto/messenger/todo.md | 59 + .../ai-kb/zh/howto/messenger/transfer.md | 55 + resources/ai-kb/zh/howto/messenger/vote.md | 64 + resources/ai-kb/zh/howto/micro-app/install.md | 53 + resources/ai-kb/zh/howto/micro-app/sort.md | 51 + .../ai-kb/zh/howto/micro-app/uninstall.md | 51 + resources/ai-kb/zh/howto/minder/create.md | 54 + .../ai-kb/zh/howto/mobile-client/download.md | 71 ++ .../ai-kb/zh/howto/mobile-client/login.md | 67 + .../ai-kb/zh/howto/mobile-client/update.md | 76 ++ .../ai-kb/zh/howto/mobile-notify/silent.md | 59 + .../ai-kb/zh/howto/mobile-notify/toggle.md | 55 + resources/ai-kb/zh/howto/office/create.md | 57 + resources/ai-kb/zh/howto/okr/align.md | 58 + resources/ai-kb/zh/howto/okr/create.md | 60 + resources/ai-kb/zh/howto/okr/review.md | 63 + .../ai-kb/zh/howto/okr/update-progress.md | 57 + .../zh/howto/org-department/add-deputy.md | 57 + .../ai-kb/zh/howto/org-department/add.md | 62 + .../zh/howto/org-department/del-deputy.md | 57 + .../ai-kb/zh/howto/org-department/delete.md | 60 + .../zh/howto/org-department/deputy-view.md | 60 + .../ai-kb/zh/howto/org-department/list.md | 54 + .../ai-kb/zh/howto/org-department/sync.md | 63 + .../ai-kb/zh/howto/project/archive-delete.md | 63 + .../ai-kb/zh/howto/project/column-add.md | 58 + .../ai-kb/zh/howto/project/column-edit.md | 55 + .../ai-kb/zh/howto/project/column-remove.md | 54 + resources/ai-kb/zh/howto/project/create.md | 51 + resources/ai-kb/zh/howto/project/exit.md | 54 + resources/ai-kb/zh/howto/project/export.md | 53 + .../ai-kb/zh/howto/project/flow-create.md | 56 + resources/ai-kb/zh/howto/project/flow-edit.md | 69 ++ resources/ai-kb/zh/howto/project/invite.md | 58 + resources/ai-kb/zh/howto/project/member.md | 56 + resources/ai-kb/zh/howto/project/search.md | 57 + resources/ai-kb/zh/howto/project/sort.md | 57 + resources/ai-kb/zh/howto/project/transfer.md | 46 + resources/ai-kb/zh/howto/project/update.md | 55 + .../ai-kb/zh/howto/push-notice/config.md | 60 + .../ai-kb/zh/howto/push-notice/silent.md | 56 + .../ai-kb/zh/howto/report/ai-generate.md | 49 + resources/ai-kb/zh/howto/report/create.md | 57 + resources/ai-kb/zh/howto/report/edit.md | 58 + resources/ai-kb/zh/howto/report/my.md | 58 + .../ai-kb/zh/howto/report/read-unread.md | 62 + resources/ai-kb/zh/howto/report/receive.md | 59 + resources/ai-kb/zh/howto/report/share.md | 58 + resources/ai-kb/zh/howto/report/submit.md | 53 + resources/ai-kb/zh/howto/report/template.md | 53 + .../zh/howto/role-permission/grant-admin.md | 56 + .../howto/role-permission/transfer-owner.md | 61 + resources/ai-kb/zh/howto/search/contact.md | 55 + resources/ai-kb/zh/howto/search/file.md | 55 + resources/ai-kb/zh/howto/search/message.md | 56 + resources/ai-kb/zh/howto/search/project.md | 54 + resources/ai-kb/zh/howto/search/task.md | 58 + .../ai-kb/zh/howto/system-setting/ai-bot.md | 61 + .../ai-kb/zh/howto/system-setting/ai-model.md | 55 + .../zh/howto/system-setting/auto-archive.md | 65 + .../zh/howto/system-setting/chat-mute.md | 63 + .../ai-kb/zh/howto/system-setting/checkin.md | 68 ++ .../howto/system-setting/column-template.md | 76 ++ .../zh/howto/system-setting/e2e-encryption.md | 56 + .../howto/system-setting/file-upload-limit.md | 58 + .../ai-kb/zh/howto/system-setting/file.md | 62 + .../ai-kb/zh/howto/system-setting/general.md | 79 ++ .../ai-kb/zh/howto/system-setting/meeting.md | 60 + .../zh/howto/system-setting/msg-time-limit.md | 60 + .../howto/system-setting/password-policy.md | 58 + .../ai-kb/zh/howto/system-setting/priority.md | 68 ++ .../zh/howto/system-setting/registration.md | 68 ++ .../howto/system-setting/task-ai-analyze.md | 64 + .../howto/system-setting/task-visibility.md | 58 + .../zh/howto/system-setting/third-access.md | 66 + .../howto/system-setting/todo-permission.md | 58 + .../zh/howto/system-setting/video-process.md | 65 + resources/ai-kb/zh/howto/task/archive.md | 55 + resources/ai-kb/zh/howto/task/attachment.md | 54 + resources/ai-kb/zh/howto/task/complete.md | 50 + resources/ai-kb/zh/howto/task/copy.md | 48 + resources/ai-kb/zh/howto/task/create-full.md | 51 + resources/ai-kb/zh/howto/task/create-quick.md | 45 + .../ai-kb/zh/howto/task/create-via-mention.md | 49 + .../ai-kb/zh/howto/task/delete-restore.md | 49 + resources/ai-kb/zh/howto/task/edit-basic.md | 51 + resources/ai-kb/zh/howto/task/move-column.md | 49 + .../ai-kb/zh/howto/task/move-cross-project.md | 52 + resources/ai-kb/zh/howto/task/recurring.md | 53 + resources/ai-kb/zh/howto/task/sort.md | 48 + .../ai-kb/zh/howto/task/subtask-create.md | 53 + resources/ai-kb/zh/howto/task/template.md | 46 + .../ai-kb/zh/howto/user-account/delete.md | 59 + .../ai-kb/zh/howto/user-account/device.md | 58 + .../zh/howto/user-account/email-verify.md | 54 + .../ai-kb/zh/howto/user-account/import.md | 52 + .../zh/howto/user-account/login-codeimg.md | 49 + .../zh/howto/user-account/login-qrcode.md | 49 + .../ai-kb/zh/howto/user-account/login.md | 54 + .../ai-kb/zh/howto/user-account/logout.md | 47 + .../ai-kb/zh/howto/user-account/password.md | 56 + .../ai-kb/zh/howto/user-account/register.md | 54 + .../ai-kb/zh/howto/user-account/search.md | 60 + .../ai-kb/zh/howto/user-settings/app-sort.md | 68 ++ .../ai-kb/zh/howto/user-settings/checkin.md | 67 + .../ai-kb/zh/howto/user-settings/email.md | 57 + .../ai-kb/zh/howto/user-settings/language.md | 62 + .../zh/howto/user-settings/notification.md | 56 + .../ai-kb/zh/howto/user-settings/password.md | 61 + .../ai-kb/zh/howto/user-settings/profile.md | 62 + .../ai-kb/zh/howto/user-settings/tags.md | 61 + .../ai-kb/zh/howto/user-settings/theme.md | 63 + resources/ai-kb/zh/howto/view/filter.md | 59 + resources/ai-kb/zh/howto/view/flow.md | 58 + resources/ai-kb/zh/howto/view/gantt.md | 58 + .../ai-kb/zh/howto/view/kanban-add-column.md | 46 + .../zh/howto/view/kanban-column-color.md | 54 + resources/ai-kb/zh/howto/view/list.md | 60 + resources/ai-kb/zh/howto/view/sort.md | 53 + resources/ai-kb/zh/howto/view/switch.md | 58 + resources/ai-kb/zh/menu-map/.gitkeep | 0 .../ai-kb/zh/menu-map/abuse-report/entry.md | 50 + .../ai-kb/zh/menu-map/application/entry.md | 39 + resources/ai-kb/zh/menu-map/approve/entry.md | 46 + resources/ai-kb/zh/menu-map/apps/.gitkeep | 0 .../zh/menu-map/apps/admin-apps/entry.md | 48 + .../zh/menu-map/apps/system-apps/entry.md | 42 + resources/ai-kb/zh/menu-map/appstore/entry.md | 55 + resources/ai-kb/zh/menu-map/bot/entry.md | 48 + resources/ai-kb/zh/menu-map/calendar/entry.md | 52 + resources/ai-kb/zh/menu-map/checkin/entry.md | 45 + .../ai-kb/zh/menu-map/compliance/entry.md | 57 + .../ai-kb/zh/menu-map/dashboard/entry.md | 47 + .../ai-kb/zh/menu-map/data-export/entry.md | 52 + resources/ai-kb/zh/menu-map/drawio/entry.md | 55 + resources/ai-kb/zh/menu-map/favorite/entry.md | 57 + resources/ai-kb/zh/menu-map/file/entry.md | 44 + resources/ai-kb/zh/menu-map/kpi/entry.md | 57 + resources/ai-kb/zh/menu-map/meeting/entry.md | 43 + resources/ai-kb/zh/menu-map/memos/entry.md | 50 + .../menu-map/menu-navigation/ai-assistant.md | 42 + .../zh/menu-map/menu-navigation/ai-config.md | 47 + .../zh/menu-map/menu-navigation/apps-sort.md | 47 + .../ai-kb/zh/menu-map/menu-navigation/apps.md | 46 + .../zh/menu-map/menu-navigation/appstore.md | 44 + .../zh/menu-map/menu-navigation/bot-mgmt.md | 47 + .../zh/menu-map/menu-navigation/calendar.md | 42 + .../menu-map/menu-navigation/checkin-rule.md | 46 + .../zh/menu-map/menu-navigation/checkin.md | 41 + .../zh/menu-map/menu-navigation/dashboard.md | 42 + .../menu-navigation/data-export-mgmt.md | 48 + .../menu-map/menu-navigation/email-config.md | 44 + .../zh/menu-map/menu-navigation/favorite.md | 41 + .../zh/menu-map/menu-navigation/files.md | 43 + .../zh/menu-map/menu-navigation/language.md | 44 + .../zh/menu-map/menu-navigation/license.md | 43 + .../zh/menu-map/menu-navigation/logout.md | 48 + .../zh/menu-map/menu-navigation/messages.md | 50 + .../menu-map/menu-navigation/my-projects.md | 43 + .../zh/menu-map/menu-navigation/my-tasks.md | 43 + .../menu-map/menu-navigation/new-approve.md | 41 + .../zh/menu-map/menu-navigation/new-group.md | 39 + .../menu-map/menu-navigation/new-meeting.md | 40 + .../menu-map/menu-navigation/new-project.md | 38 + .../zh/menu-map/menu-navigation/new-report.md | 39 + .../zh/menu-map/menu-navigation/new-task.md | 41 + .../menu-navigation/notification-setting.md | 45 + .../menu-map/menu-navigation/notifications.md | 47 + .../menu-navigation/password-change.md | 43 + .../zh/menu-map/menu-navigation/profile.md | 45 + .../zh/menu-map/menu-navigation/recent.md | 41 + .../zh/menu-map/menu-navigation/search.md | 43 + .../menu-navigation/system-setting.md | 43 + .../zh/menu-map/menu-navigation/team-mgmt.md | 46 + .../zh/menu-map/menu-navigation/theme.md | 42 + .../ai-kb/zh/menu-map/messenger/entry.md | 46 + .../ai-kb/zh/menu-map/micro-app/entry.md | 51 + resources/ai-kb/zh/menu-map/minder/entry.md | 51 + resources/ai-kb/zh/menu-map/office/entry.md | 58 + resources/ai-kb/zh/menu-map/okr/entry.md | 47 + .../ai-kb/zh/menu-map/org-department/entry.md | 58 + resources/ai-kb/zh/menu-map/project/entry.md | 52 + resources/ai-kb/zh/menu-map/report/entry.md | 43 + .../zh/menu-map/role-permission/entry.md | 59 + resources/ai-kb/zh/menu-map/search/entry.md | 47 + .../ai-kb/zh/menu-map/system-setting/entry.md | 55 + .../zh/menu-map/system-setting/menu-map.md | 50 + .../ai-kb/zh/menu-map/user-account/entry.md | 57 + .../ai-kb/zh/menu-map/user-settings/entry.md | 50 + resources/ai-kb/zh/shortcut/.gitkeep | 0 resources/ai-kb/zh/shortcut/dialog.md | 47 + resources/ai-kb/zh/shortcut/global.md | 48 + resources/ai-kb/zh/shortcut/messenger.md | 44 + resources/ai-kb/zh/shortcut/mobile-gesture.md | 51 + resources/ai-kb/zh/shortcut/task.md | 48 + .../js/components/AIAssistant/index.vue | 4 + 588 files changed, 33431 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ai-kb-reindex.yml create mode 100644 config/ai.php create mode 100644 resources/ai-kb/README.md create mode 100644 resources/ai-kb/_eval/golden-50q.yaml create mode 100644 resources/ai-kb/_eval/golden-v0.yaml create mode 100644 resources/ai-kb/_meta/feature-map.yaml create mode 100644 resources/ai-kb/_meta/tool-binding.yaml create mode 100644 resources/ai-kb/_schema/chunk-style.md create mode 100644 resources/ai-kb/_schema/frontmatter.md create mode 100644 resources/ai-kb/en/concept/.gitkeep create mode 100644 resources/ai-kb/en/faq/.gitkeep create mode 100644 resources/ai-kb/en/glossary/.gitkeep create mode 100644 resources/ai-kb/en/howto/.gitkeep create mode 100644 resources/ai-kb/en/menu-map/.gitkeep create mode 100644 resources/ai-kb/en/shortcut/.gitkeep create mode 100644 resources/ai-kb/zh/concept/.gitkeep create mode 100644 resources/ai-kb/zh/concept/abuse-report/overview.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/auth.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/embed-entry.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/float-button.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/match-elements.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/mobile-entry.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/modal.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/model.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/multimodal.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/page-action.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/page-context-tool.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/page-context.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/privacy.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/session.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/streaming.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/tool-call.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/tools-list.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/tools.md create mode 100644 resources/ai-kb/zh/concept/ai-assistant/welcome-prompts.md create mode 100644 resources/ai-kb/zh/concept/application/center.md create mode 100644 resources/ai-kb/zh/concept/application/classify.md create mode 100644 resources/ai-kb/zh/concept/approve/form.md create mode 100644 resources/ai-kb/zh/concept/approve/history.md create mode 100644 resources/ai-kb/zh/concept/approve/node.md create mode 100644 resources/ai-kb/zh/concept/approve/notify.md create mode 100644 resources/ai-kb/zh/concept/approve/overview.md create mode 100644 resources/ai-kb/zh/concept/approve/plugin.md create mode 100644 resources/ai-kb/zh/concept/approve/process-inst.md create mode 100644 resources/ai-kb/zh/concept/approve/template.md create mode 100644 resources/ai-kb/zh/concept/apps/admin-apps/list.md create mode 100644 resources/ai-kb/zh/concept/apps/admin-apps/visibility.md create mode 100644 resources/ai-kb/zh/concept/apps/system-apps/list.md create mode 100644 resources/ai-kb/zh/concept/apps/system-apps/relation.md create mode 100644 resources/ai-kb/zh/concept/apps/system-apps/visibility.md create mode 100644 resources/ai-kb/zh/concept/appstore/overview.md create mode 100644 resources/ai-kb/zh/concept/bot/overview.md create mode 100644 resources/ai-kb/zh/concept/bot/system-list.md create mode 100644 resources/ai-kb/zh/concept/bot/webhook.md create mode 100644 resources/ai-kb/zh/concept/calendar/allday.md create mode 100644 resources/ai-kb/zh/concept/calendar/edit-via-detail.md create mode 100644 resources/ai-kb/zh/concept/calendar/filter.md create mode 100644 resources/ai-kb/zh/concept/calendar/overview.md create mode 100644 resources/ai-kb/zh/concept/calendar/task-only.md create mode 100644 resources/ai-kb/zh/concept/calendar/timezone.md create mode 100644 resources/ai-kb/zh/concept/checkin/face.md create mode 100644 resources/ai-kb/zh/concept/checkin/overview.md create mode 100644 resources/ai-kb/zh/concept/checkin/plugin.md create mode 100644 resources/ai-kb/zh/concept/checkin/remind.md create mode 100644 resources/ai-kb/zh/concept/checkin/rule.md create mode 100644 resources/ai-kb/zh/concept/compliance/overview.md create mode 100644 resources/ai-kb/zh/concept/dashboard/overview.md create mode 100644 resources/ai-kb/zh/concept/data-export/overview.md create mode 100644 resources/ai-kb/zh/concept/desktop-notify/overview.md create mode 100644 resources/ai-kb/zh/concept/desktop-notify/tray.md create mode 100644 resources/ai-kb/zh/concept/drawio/overview.md create mode 100644 resources/ai-kb/zh/concept/drawio/plugin.md create mode 100644 resources/ai-kb/zh/concept/drawio/template.md create mode 100644 resources/ai-kb/zh/concept/electron-client/notify.md create mode 100644 resources/ai-kb/zh/concept/electron-client/overview.md create mode 100644 resources/ai-kb/zh/concept/electron-client/platforms.md create mode 100644 resources/ai-kb/zh/concept/electron-client/proxy.md create mode 100644 resources/ai-kb/zh/concept/electron-client/shortcut.md create mode 100644 resources/ai-kb/zh/concept/electron-client/tray.md create mode 100644 resources/ai-kb/zh/concept/email-notice/overview.md create mode 100644 resources/ai-kb/zh/concept/email-notice/scenarios.md create mode 100644 resources/ai-kb/zh/concept/favorite/overview.md create mode 100644 resources/ai-kb/zh/concept/favorite/recent.md create mode 100644 resources/ai-kb/zh/concept/file/preview.md create mode 100644 resources/ai-kb/zh/concept/file/tree.md create mode 100644 resources/ai-kb/zh/concept/file/version.md create mode 100644 resources/ai-kb/zh/concept/fileview/overview.md create mode 100644 resources/ai-kb/zh/concept/fileview/plugin.md create mode 100644 resources/ai-kb/zh/concept/fileview/supported.md create mode 100644 resources/ai-kb/zh/concept/kpi/overview.md create mode 100644 resources/ai-kb/zh/concept/kpi/plugin.md create mode 100644 resources/ai-kb/zh/concept/kpi/scoring.md create mode 100644 resources/ai-kb/zh/concept/ldap/overview.md create mode 100644 resources/ai-kb/zh/concept/license/overview.md create mode 100644 resources/ai-kb/zh/concept/meeting/overview.md create mode 100644 resources/ai-kb/zh/concept/meeting/tourist.md create mode 100644 resources/ai-kb/zh/concept/memos/overview.md create mode 100644 resources/ai-kb/zh/concept/memos/plugin.md create mode 100644 resources/ai-kb/zh/concept/memos/tag.md create mode 100644 resources/ai-kb/zh/concept/messenger/bot.md create mode 100644 resources/ai-kb/zh/concept/messenger/dialog-type.md create mode 100644 resources/ai-kb/zh/concept/messenger/notify.md create mode 100644 resources/ai-kb/zh/concept/messenger/read-receipt.md create mode 100644 resources/ai-kb/zh/concept/messenger/task-mention.md create mode 100644 resources/ai-kb/zh/concept/messenger/unread.md create mode 100644 resources/ai-kb/zh/concept/micro-app/list.md create mode 100644 resources/ai-kb/zh/concept/micro-app/menu.md create mode 100644 resources/ai-kb/zh/concept/micro-app/overview.md create mode 100644 resources/ai-kb/zh/concept/micro-app/permission.md create mode 100644 resources/ai-kb/zh/concept/minder/collaboration.md create mode 100644 resources/ai-kb/zh/concept/minder/overview.md create mode 100644 resources/ai-kb/zh/concept/minder/plugin.md create mode 100644 resources/ai-kb/zh/concept/mobile-client/feature-diff.md create mode 100644 resources/ai-kb/zh/concept/mobile-client/gesture.md create mode 100644 resources/ai-kb/zh/concept/mobile-client/notify.md create mode 100644 resources/ai-kb/zh/concept/mobile-client/offline.md create mode 100644 resources/ai-kb/zh/concept/mobile-client/overview.md create mode 100644 resources/ai-kb/zh/concept/mobile-notify/overview.md create mode 100644 resources/ai-kb/zh/concept/office/collaboration.md create mode 100644 resources/ai-kb/zh/concept/office/overview.md create mode 100644 resources/ai-kb/zh/concept/office/plugin.md create mode 100644 resources/ai-kb/zh/concept/okr/cycle.md create mode 100644 resources/ai-kb/zh/concept/okr/kr.md create mode 100644 resources/ai-kb/zh/concept/okr/objective.md create mode 100644 resources/ai-kb/zh/concept/okr/overview.md create mode 100644 resources/ai-kb/zh/concept/okr/plugin.md create mode 100644 resources/ai-kb/zh/concept/okr/team.md create mode 100644 resources/ai-kb/zh/concept/org-department/deputy.md create mode 100644 resources/ai-kb/zh/concept/org-department/overview.md create mode 100644 resources/ai-kb/zh/concept/project/dialog.md create mode 100644 resources/ai-kb/zh/concept/project/flow-default.md create mode 100644 resources/ai-kb/zh/concept/project/permission.md create mode 100644 resources/ai-kb/zh/concept/project/personal.md create mode 100644 resources/ai-kb/zh/concept/project/role.md create mode 100644 resources/ai-kb/zh/concept/project/statistics.md create mode 100644 resources/ai-kb/zh/concept/push-notice/alias.md create mode 100644 resources/ai-kb/zh/concept/push-notice/overview.md create mode 100644 resources/ai-kb/zh/concept/push-notice/scenarios.md create mode 100644 resources/ai-kb/zh/concept/report/analysis.md create mode 100644 resources/ai-kb/zh/concept/report/link.md create mode 100644 resources/ai-kb/zh/concept/report/overview.md create mode 100644 resources/ai-kb/zh/concept/report/type.md create mode 100644 resources/ai-kb/zh/concept/role-permission/admin.md create mode 100644 resources/ai-kb/zh/concept/role-permission/department-role.md create mode 100644 resources/ai-kb/zh/concept/role-permission/overview.md create mode 100644 resources/ai-kb/zh/concept/role-permission/project-role.md create mode 100644 resources/ai-kb/zh/concept/role-permission/super-admin.md create mode 100644 resources/ai-kb/zh/concept/role-permission/task-role.md create mode 100644 resources/ai-kb/zh/concept/search/engine.md create mode 100644 resources/ai-kb/zh/concept/search/intelligent.md create mode 100644 resources/ai-kb/zh/concept/search/overview.md create mode 100644 resources/ai-kb/zh/concept/task/color.md create mode 100644 resources/ai-kb/zh/concept/task/deadline.md create mode 100644 resources/ai-kb/zh/concept/task/description.md create mode 100644 resources/ai-kb/zh/concept/task/dialog.md create mode 100644 resources/ai-kb/zh/concept/task/flow.md create mode 100644 resources/ai-kb/zh/concept/task/notify.md create mode 100644 resources/ai-kb/zh/concept/task/owner-assist.md create mode 100644 resources/ai-kb/zh/concept/task/priority.md create mode 100644 resources/ai-kb/zh/concept/task/related.md create mode 100644 resources/ai-kb/zh/concept/task/subtask-limits.md create mode 100644 resources/ai-kb/zh/concept/task/subtask.md create mode 100644 resources/ai-kb/zh/concept/task/tag.md create mode 100644 resources/ai-kb/zh/concept/task/visibility.md create mode 100644 resources/ai-kb/zh/concept/user-account/info.md create mode 100644 resources/ai-kb/zh/concept/user-account/reg-need-invite.md create mode 100644 resources/ai-kb/zh/concept/user-settings/privacy.md create mode 100644 resources/ai-kb/zh/concept/user-settings/shortcut.md create mode 100644 resources/ai-kb/zh/concept/view/entry.md create mode 100644 resources/ai-kb/zh/concept/view/kanban.md create mode 100644 resources/ai-kb/zh/concept/web-client/compatibility.md create mode 100644 resources/ai-kb/zh/concept/web-client/overview.md create mode 100644 resources/ai-kb/zh/concept/web-client/shortcut.md create mode 100644 resources/ai-kb/zh/faq/.gitkeep create mode 100644 resources/ai-kb/zh/faq/ai-assistant/disabled.md create mode 100644 resources/ai-kb/zh/faq/ai-assistant/mcp-down.md create mode 100644 resources/ai-kb/zh/faq/ai-assistant/model-empty.md create mode 100644 resources/ai-kb/zh/faq/ai-assistant/no-tool-call.md create mode 100644 resources/ai-kb/zh/faq/ai-assistant/tool-failed.md create mode 100644 resources/ai-kb/zh/faq/ai-assistant/tool-permission.md create mode 100644 resources/ai-kb/zh/faq/apps/.gitkeep create mode 100644 resources/ai-kb/zh/faq/appstore/cannot-install.md create mode 100644 resources/ai-kb/zh/faq/bot/permission.md create mode 100644 resources/ai-kb/zh/faq/calendar/ical-export.md create mode 100644 resources/ai-kb/zh/faq/calendar/meeting-not-shown.md create mode 100644 resources/ai-kb/zh/faq/calendar/mobile-readonly.md create mode 100644 resources/ai-kb/zh/faq/checkin/face-fail.md create mode 100644 resources/ai-kb/zh/faq/checkin/late.md create mode 100644 resources/ai-kb/zh/faq/checkin/mac-not-match.md create mode 100644 resources/ai-kb/zh/faq/common-faq/account-cant-login.md create mode 100644 resources/ai-kb/zh/faq/common-faq/account-email-not-verified.md create mode 100644 resources/ai-kb/zh/faq/common-faq/account-forget-password.md create mode 100644 resources/ai-kb/zh/faq/common-faq/account-locked.md create mode 100644 resources/ai-kb/zh/faq/common-faq/account-multi-device-conflict.md create mode 100644 resources/ai-kb/zh/faq/common-faq/ai-no-models.md create mode 100644 resources/ai-kb/zh/faq/common-faq/ai-slow.md create mode 100644 resources/ai-kb/zh/faq/common-faq/ai-token-cost.md create mode 100644 resources/ai-kb/zh/faq/common-faq/ai-tool-permission.md create mode 100644 resources/ai-kb/zh/faq/common-faq/ai-wrong-answer.md create mode 100644 resources/ai-kb/zh/faq/common-faq/data-import.md create mode 100644 resources/ai-kb/zh/faq/common-faq/deploy-backup.md create mode 100644 resources/ai-kb/zh/faq/common-faq/deploy-perf.md create mode 100644 resources/ai-kb/zh/faq/common-faq/deploy-ssl.md create mode 100644 resources/ai-kb/zh/faq/common-faq/deploy-storage.md create mode 100644 resources/ai-kb/zh/faq/common-faq/deploy-update.md create mode 100644 resources/ai-kb/zh/faq/common-faq/language-cant-change.md create mode 100644 resources/ai-kb/zh/faq/common-faq/notify-desktop-fail.md create mode 100644 resources/ai-kb/zh/faq/common-faq/notify-email-fail.md create mode 100644 resources/ai-kb/zh/faq/common-faq/notify-mobile-fail.md create mode 100644 resources/ai-kb/zh/faq/common-faq/notify-no-receive.md create mode 100644 resources/ai-kb/zh/faq/common-faq/notify-too-many.md create mode 100644 resources/ai-kb/zh/faq/common-faq/permission-admin-area.md create mode 100644 resources/ai-kb/zh/faq/common-faq/permission-cannot-add-member.md create mode 100644 resources/ai-kb/zh/faq/common-faq/permission-cannot-edit-project.md create mode 100644 resources/ai-kb/zh/faq/common-faq/permission-cannot-see-task.md create mode 100644 resources/ai-kb/zh/faq/common-faq/permission-readonly.md create mode 100644 resources/ai-kb/zh/faq/common-faq/plugin-not-loaded.md create mode 100644 resources/ai-kb/zh/faq/common-faq/search-no-result.md create mode 100644 resources/ai-kb/zh/faq/common-faq/sync-ldap.md create mode 100644 resources/ai-kb/zh/faq/common-faq/sync-multi-device.md create mode 100644 resources/ai-kb/zh/faq/common-faq/sync-offline-data.md create mode 100644 resources/ai-kb/zh/faq/common-faq/sync-task-not-update.md create mode 100644 resources/ai-kb/zh/faq/common-faq/sync-websocket-disconnect.md create mode 100644 resources/ai-kb/zh/faq/common-faq/theme-cant-change.md create mode 100644 resources/ai-kb/zh/faq/common-faq/upload-disk-full.md create mode 100644 resources/ai-kb/zh/faq/common-faq/upload-image-error.md create mode 100644 resources/ai-kb/zh/faq/common-faq/upload-size-limit.md create mode 100644 resources/ai-kb/zh/faq/common-faq/upload-stuck.md create mode 100644 resources/ai-kb/zh/faq/common-faq/upload-type-block.md create mode 100644 resources/ai-kb/zh/faq/dashboard/refresh.md create mode 100644 resources/ai-kb/zh/faq/desktop-notify/permission.md create mode 100644 resources/ai-kb/zh/faq/electron-client/logs.md create mode 100644 resources/ai-kb/zh/faq/email-notice/troubleshoot.md create mode 100644 resources/ai-kb/zh/faq/ldap/troubleshoot.md create mode 100644 resources/ai-kb/zh/faq/license/expire.md create mode 100644 resources/ai-kb/zh/faq/meeting/cannot-join.md create mode 100644 resources/ai-kb/zh/faq/mobile-client/cannot-login.md create mode 100644 resources/ai-kb/zh/faq/mobile-client/push-fail.md create mode 100644 resources/ai-kb/zh/faq/mobile-notify/permission.md create mode 100644 resources/ai-kb/zh/faq/okr/cannot-install.md create mode 100644 resources/ai-kb/zh/faq/project/permission-denied-task.md create mode 100644 resources/ai-kb/zh/faq/project/permission-to-create.md create mode 100644 resources/ai-kb/zh/faq/push-notice/troubleshoot.md create mode 100644 resources/ai-kb/zh/faq/report/permission.md create mode 100644 resources/ai-kb/zh/faq/role-permission/permission-denied.md create mode 100644 resources/ai-kb/zh/faq/search/no-result.md create mode 100644 resources/ai-kb/zh/faq/user-account/delete-restore.md create mode 100644 resources/ai-kb/zh/faq/view/mobile.md create mode 100644 resources/ai-kb/zh/glossary/.gitkeep create mode 100644 resources/ai-kb/zh/glossary/main.md create mode 100644 resources/ai-kb/zh/howto/.gitkeep create mode 100644 resources/ai-kb/zh/howto/abuse-report/handle.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/close.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/create-task.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/element-action.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/entry.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/float-button.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/image-upload.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/intelligent-search.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/list-tasks.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/model-switch.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/new-chat.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/page-action.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/project-init.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/report-draft.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/search-files.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/search-help-docs.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/search-users.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/send-message.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/session-delete.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/session-list.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/session-save.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/shortcut.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/stop.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/subtask-suggest.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/task-mention.md create mode 100644 resources/ai-kb/zh/howto/ai-assistant/task-summary.md create mode 100644 resources/ai-kb/zh/howto/application/menu-admin.md create mode 100644 resources/ai-kb/zh/howto/application/sort.md create mode 100644 resources/ai-kb/zh/howto/approve/cc.md create mode 100644 resources/ai-kb/zh/howto/approve/comment.md create mode 100644 resources/ai-kb/zh/howto/approve/delete.md create mode 100644 resources/ai-kb/zh/howto/approve/detail.md create mode 100644 resources/ai-kb/zh/howto/approve/doto.md create mode 100644 resources/ai-kb/zh/howto/approve/export.md create mode 100644 resources/ai-kb/zh/howto/approve/install.md create mode 100644 resources/ai-kb/zh/howto/approve/my-start.md create mode 100644 resources/ai-kb/zh/howto/approve/my-todo.md create mode 100644 resources/ai-kb/zh/howto/approve/start.md create mode 100644 resources/ai-kb/zh/howto/approve/template.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/.gitkeep create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/checkin-setting.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/email.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/export.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/ldap.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/meeting-mgmt.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/push.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/report.md create mode 100644 resources/ai-kb/zh/howto/apps/admin-apps/team.md create mode 100644 resources/ai-kb/zh/howto/apps/micro-apps/.gitkeep create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/.gitkeep create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/add-task.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/approve.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/bot.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/checkin.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/create-group.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/create-project.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/export.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/favorite.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/meeting.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/recent.md create mode 100644 resources/ai-kb/zh/howto/apps/system-apps/report.md create mode 100644 resources/ai-kb/zh/howto/appstore/install.md create mode 100644 resources/ai-kb/zh/howto/appstore/uninstall.md create mode 100644 resources/ai-kb/zh/howto/appstore/update.md create mode 100644 resources/ai-kb/zh/howto/bot/create.md create mode 100644 resources/ai-kb/zh/howto/bot/invite.md create mode 100644 resources/ai-kb/zh/howto/bot/mention.md create mode 100644 resources/ai-kb/zh/howto/calendar/create.md create mode 100644 resources/ai-kb/zh/howto/calendar/drag.md create mode 100644 resources/ai-kb/zh/howto/calendar/view.md create mode 100644 resources/ai-kb/zh/howto/checkin/export.md create mode 100644 resources/ai-kb/zh/howto/checkin/face.md create mode 100644 resources/ai-kb/zh/howto/checkin/record.md create mode 100644 resources/ai-kb/zh/howto/checkin/regular.md create mode 100644 resources/ai-kb/zh/howto/checkin/setting.md create mode 100644 resources/ai-kb/zh/howto/checkin/wifi.md create mode 100644 resources/ai-kb/zh/howto/compliance/config.md create mode 100644 resources/ai-kb/zh/howto/dashboard/assist.md create mode 100644 resources/ai-kb/zh/howto/dashboard/collapse.md create mode 100644 resources/ai-kb/zh/howto/dashboard/overdue.md create mode 100644 resources/ai-kb/zh/howto/dashboard/today.md create mode 100644 resources/ai-kb/zh/howto/dashboard/todo.md create mode 100644 resources/ai-kb/zh/howto/data-export/approve.md create mode 100644 resources/ai-kb/zh/howto/data-export/checkin.md create mode 100644 resources/ai-kb/zh/howto/data-export/project.md create mode 100644 resources/ai-kb/zh/howto/data-export/report.md create mode 100644 resources/ai-kb/zh/howto/data-export/task.md create mode 100644 resources/ai-kb/zh/howto/data-export/user.md create mode 100644 resources/ai-kb/zh/howto/desktop-notify/toggle.md create mode 100644 resources/ai-kb/zh/howto/drawio/create.md create mode 100644 resources/ai-kb/zh/howto/electron-client/auto-start.md create mode 100644 resources/ai-kb/zh/howto/electron-client/download.md create mode 100644 resources/ai-kb/zh/howto/electron-client/uninstall.md create mode 100644 resources/ai-kb/zh/howto/electron-client/update.md create mode 100644 resources/ai-kb/zh/howto/electron-client/window.md create mode 100644 resources/ai-kb/zh/howto/email-notice/config.md create mode 100644 resources/ai-kb/zh/howto/email-notice/send-test.md create mode 100644 resources/ai-kb/zh/howto/email-notice/user-opt.md create mode 100644 resources/ai-kb/zh/howto/favorite/add.md create mode 100644 resources/ai-kb/zh/howto/favorite/list.md create mode 100644 resources/ai-kb/zh/howto/favorite/remove.md create mode 100644 resources/ai-kb/zh/howto/file/create.md create mode 100644 resources/ai-kb/zh/howto/file/delete-restore.md create mode 100644 resources/ai-kb/zh/howto/file/move.md create mode 100644 resources/ai-kb/zh/howto/file/public-link.md create mode 100644 resources/ai-kb/zh/howto/file/rename.md create mode 100644 resources/ai-kb/zh/howto/file/search.md create mode 100644 resources/ai-kb/zh/howto/file/share.md create mode 100644 resources/ai-kb/zh/howto/file/upload.md create mode 100644 resources/ai-kb/zh/howto/kpi/create.md create mode 100644 resources/ai-kb/zh/howto/ldap/config.md create mode 100644 resources/ai-kb/zh/howto/ldap/sync.md create mode 100644 resources/ai-kb/zh/howto/license/apply.md create mode 100644 resources/ai-kb/zh/howto/meeting/audio-video.md create mode 100644 resources/ai-kb/zh/howto/meeting/chat.md create mode 100644 resources/ai-kb/zh/howto/meeting/close.md create mode 100644 resources/ai-kb/zh/howto/meeting/create.md create mode 100644 resources/ai-kb/zh/howto/meeting/from-dialog.md create mode 100644 resources/ai-kb/zh/howto/meeting/invite.md create mode 100644 resources/ai-kb/zh/howto/meeting/join.md create mode 100644 resources/ai-kb/zh/howto/meeting/share.md create mode 100644 resources/ai-kb/zh/howto/memos/create.md create mode 100644 resources/ai-kb/zh/howto/messenger/chain.md create mode 100644 resources/ai-kb/zh/howto/messenger/create-group.md create mode 100644 resources/ai-kb/zh/howto/messenger/dissolve.md create mode 100644 resources/ai-kb/zh/howto/messenger/exit.md create mode 100644 resources/ai-kb/zh/howto/messenger/history.md create mode 100644 resources/ai-kb/zh/howto/messenger/member.md create mode 100644 resources/ai-kb/zh/howto/messenger/mention.md create mode 100644 resources/ai-kb/zh/howto/messenger/mute.md create mode 100644 resources/ai-kb/zh/howto/messenger/pin.md create mode 100644 resources/ai-kb/zh/howto/messenger/quote.md create mode 100644 resources/ai-kb/zh/howto/messenger/recall.md create mode 100644 resources/ai-kb/zh/howto/messenger/rename-group.md create mode 100644 resources/ai-kb/zh/howto/messenger/search.md create mode 100644 resources/ai-kb/zh/howto/messenger/send-file.md create mode 100644 resources/ai-kb/zh/howto/messenger/send-image.md create mode 100644 resources/ai-kb/zh/howto/messenger/send-text.md create mode 100644 resources/ai-kb/zh/howto/messenger/todo.md create mode 100644 resources/ai-kb/zh/howto/messenger/transfer.md create mode 100644 resources/ai-kb/zh/howto/messenger/vote.md create mode 100644 resources/ai-kb/zh/howto/micro-app/install.md create mode 100644 resources/ai-kb/zh/howto/micro-app/sort.md create mode 100644 resources/ai-kb/zh/howto/micro-app/uninstall.md create mode 100644 resources/ai-kb/zh/howto/minder/create.md create mode 100644 resources/ai-kb/zh/howto/mobile-client/download.md create mode 100644 resources/ai-kb/zh/howto/mobile-client/login.md create mode 100644 resources/ai-kb/zh/howto/mobile-client/update.md create mode 100644 resources/ai-kb/zh/howto/mobile-notify/silent.md create mode 100644 resources/ai-kb/zh/howto/mobile-notify/toggle.md create mode 100644 resources/ai-kb/zh/howto/office/create.md create mode 100644 resources/ai-kb/zh/howto/okr/align.md create mode 100644 resources/ai-kb/zh/howto/okr/create.md create mode 100644 resources/ai-kb/zh/howto/okr/review.md create mode 100644 resources/ai-kb/zh/howto/okr/update-progress.md create mode 100644 resources/ai-kb/zh/howto/org-department/add-deputy.md create mode 100644 resources/ai-kb/zh/howto/org-department/add.md create mode 100644 resources/ai-kb/zh/howto/org-department/del-deputy.md create mode 100644 resources/ai-kb/zh/howto/org-department/delete.md create mode 100644 resources/ai-kb/zh/howto/org-department/deputy-view.md create mode 100644 resources/ai-kb/zh/howto/org-department/list.md create mode 100644 resources/ai-kb/zh/howto/org-department/sync.md create mode 100644 resources/ai-kb/zh/howto/project/archive-delete.md create mode 100644 resources/ai-kb/zh/howto/project/column-add.md create mode 100644 resources/ai-kb/zh/howto/project/column-edit.md create mode 100644 resources/ai-kb/zh/howto/project/column-remove.md create mode 100644 resources/ai-kb/zh/howto/project/create.md create mode 100644 resources/ai-kb/zh/howto/project/exit.md create mode 100644 resources/ai-kb/zh/howto/project/export.md create mode 100644 resources/ai-kb/zh/howto/project/flow-create.md create mode 100644 resources/ai-kb/zh/howto/project/flow-edit.md create mode 100644 resources/ai-kb/zh/howto/project/invite.md create mode 100644 resources/ai-kb/zh/howto/project/member.md create mode 100644 resources/ai-kb/zh/howto/project/search.md create mode 100644 resources/ai-kb/zh/howto/project/sort.md create mode 100644 resources/ai-kb/zh/howto/project/transfer.md create mode 100644 resources/ai-kb/zh/howto/project/update.md create mode 100644 resources/ai-kb/zh/howto/push-notice/config.md create mode 100644 resources/ai-kb/zh/howto/push-notice/silent.md create mode 100644 resources/ai-kb/zh/howto/report/ai-generate.md create mode 100644 resources/ai-kb/zh/howto/report/create.md create mode 100644 resources/ai-kb/zh/howto/report/edit.md create mode 100644 resources/ai-kb/zh/howto/report/my.md create mode 100644 resources/ai-kb/zh/howto/report/read-unread.md create mode 100644 resources/ai-kb/zh/howto/report/receive.md create mode 100644 resources/ai-kb/zh/howto/report/share.md create mode 100644 resources/ai-kb/zh/howto/report/submit.md create mode 100644 resources/ai-kb/zh/howto/report/template.md create mode 100644 resources/ai-kb/zh/howto/role-permission/grant-admin.md create mode 100644 resources/ai-kb/zh/howto/role-permission/transfer-owner.md create mode 100644 resources/ai-kb/zh/howto/search/contact.md create mode 100644 resources/ai-kb/zh/howto/search/file.md create mode 100644 resources/ai-kb/zh/howto/search/message.md create mode 100644 resources/ai-kb/zh/howto/search/project.md create mode 100644 resources/ai-kb/zh/howto/search/task.md create mode 100644 resources/ai-kb/zh/howto/system-setting/ai-bot.md create mode 100644 resources/ai-kb/zh/howto/system-setting/ai-model.md create mode 100644 resources/ai-kb/zh/howto/system-setting/auto-archive.md create mode 100644 resources/ai-kb/zh/howto/system-setting/chat-mute.md create mode 100644 resources/ai-kb/zh/howto/system-setting/checkin.md create mode 100644 resources/ai-kb/zh/howto/system-setting/column-template.md create mode 100644 resources/ai-kb/zh/howto/system-setting/e2e-encryption.md create mode 100644 resources/ai-kb/zh/howto/system-setting/file-upload-limit.md create mode 100644 resources/ai-kb/zh/howto/system-setting/file.md create mode 100644 resources/ai-kb/zh/howto/system-setting/general.md create mode 100644 resources/ai-kb/zh/howto/system-setting/meeting.md create mode 100644 resources/ai-kb/zh/howto/system-setting/msg-time-limit.md create mode 100644 resources/ai-kb/zh/howto/system-setting/password-policy.md create mode 100644 resources/ai-kb/zh/howto/system-setting/priority.md create mode 100644 resources/ai-kb/zh/howto/system-setting/registration.md create mode 100644 resources/ai-kb/zh/howto/system-setting/task-ai-analyze.md create mode 100644 resources/ai-kb/zh/howto/system-setting/task-visibility.md create mode 100644 resources/ai-kb/zh/howto/system-setting/third-access.md create mode 100644 resources/ai-kb/zh/howto/system-setting/todo-permission.md create mode 100644 resources/ai-kb/zh/howto/system-setting/video-process.md create mode 100644 resources/ai-kb/zh/howto/task/archive.md create mode 100644 resources/ai-kb/zh/howto/task/attachment.md create mode 100644 resources/ai-kb/zh/howto/task/complete.md create mode 100644 resources/ai-kb/zh/howto/task/copy.md create mode 100644 resources/ai-kb/zh/howto/task/create-full.md create mode 100644 resources/ai-kb/zh/howto/task/create-quick.md create mode 100644 resources/ai-kb/zh/howto/task/create-via-mention.md create mode 100644 resources/ai-kb/zh/howto/task/delete-restore.md create mode 100644 resources/ai-kb/zh/howto/task/edit-basic.md create mode 100644 resources/ai-kb/zh/howto/task/move-column.md create mode 100644 resources/ai-kb/zh/howto/task/move-cross-project.md create mode 100644 resources/ai-kb/zh/howto/task/recurring.md create mode 100644 resources/ai-kb/zh/howto/task/sort.md create mode 100644 resources/ai-kb/zh/howto/task/subtask-create.md create mode 100644 resources/ai-kb/zh/howto/task/template.md create mode 100644 resources/ai-kb/zh/howto/user-account/delete.md create mode 100644 resources/ai-kb/zh/howto/user-account/device.md create mode 100644 resources/ai-kb/zh/howto/user-account/email-verify.md create mode 100644 resources/ai-kb/zh/howto/user-account/import.md create mode 100644 resources/ai-kb/zh/howto/user-account/login-codeimg.md create mode 100644 resources/ai-kb/zh/howto/user-account/login-qrcode.md create mode 100644 resources/ai-kb/zh/howto/user-account/login.md create mode 100644 resources/ai-kb/zh/howto/user-account/logout.md create mode 100644 resources/ai-kb/zh/howto/user-account/password.md create mode 100644 resources/ai-kb/zh/howto/user-account/register.md create mode 100644 resources/ai-kb/zh/howto/user-account/search.md create mode 100644 resources/ai-kb/zh/howto/user-settings/app-sort.md create mode 100644 resources/ai-kb/zh/howto/user-settings/checkin.md create mode 100644 resources/ai-kb/zh/howto/user-settings/email.md create mode 100644 resources/ai-kb/zh/howto/user-settings/language.md create mode 100644 resources/ai-kb/zh/howto/user-settings/notification.md create mode 100644 resources/ai-kb/zh/howto/user-settings/password.md create mode 100644 resources/ai-kb/zh/howto/user-settings/profile.md create mode 100644 resources/ai-kb/zh/howto/user-settings/tags.md create mode 100644 resources/ai-kb/zh/howto/user-settings/theme.md create mode 100644 resources/ai-kb/zh/howto/view/filter.md create mode 100644 resources/ai-kb/zh/howto/view/flow.md create mode 100644 resources/ai-kb/zh/howto/view/gantt.md create mode 100644 resources/ai-kb/zh/howto/view/kanban-add-column.md create mode 100644 resources/ai-kb/zh/howto/view/kanban-column-color.md create mode 100644 resources/ai-kb/zh/howto/view/list.md create mode 100644 resources/ai-kb/zh/howto/view/sort.md create mode 100644 resources/ai-kb/zh/howto/view/switch.md create mode 100644 resources/ai-kb/zh/menu-map/.gitkeep create mode 100644 resources/ai-kb/zh/menu-map/abuse-report/entry.md create mode 100644 resources/ai-kb/zh/menu-map/application/entry.md create mode 100644 resources/ai-kb/zh/menu-map/approve/entry.md create mode 100644 resources/ai-kb/zh/menu-map/apps/.gitkeep create mode 100644 resources/ai-kb/zh/menu-map/apps/admin-apps/entry.md create mode 100644 resources/ai-kb/zh/menu-map/apps/system-apps/entry.md create mode 100644 resources/ai-kb/zh/menu-map/appstore/entry.md create mode 100644 resources/ai-kb/zh/menu-map/bot/entry.md create mode 100644 resources/ai-kb/zh/menu-map/calendar/entry.md create mode 100644 resources/ai-kb/zh/menu-map/checkin/entry.md create mode 100644 resources/ai-kb/zh/menu-map/compliance/entry.md create mode 100644 resources/ai-kb/zh/menu-map/dashboard/entry.md create mode 100644 resources/ai-kb/zh/menu-map/data-export/entry.md create mode 100644 resources/ai-kb/zh/menu-map/drawio/entry.md create mode 100644 resources/ai-kb/zh/menu-map/favorite/entry.md create mode 100644 resources/ai-kb/zh/menu-map/file/entry.md create mode 100644 resources/ai-kb/zh/menu-map/kpi/entry.md create mode 100644 resources/ai-kb/zh/menu-map/meeting/entry.md create mode 100644 resources/ai-kb/zh/menu-map/memos/entry.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/ai-assistant.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/ai-config.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/apps-sort.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/apps.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/appstore.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/bot-mgmt.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/calendar.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/checkin-rule.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/checkin.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/dashboard.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/data-export-mgmt.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/email-config.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/favorite.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/files.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/language.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/license.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/logout.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/messages.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/my-projects.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/my-tasks.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-approve.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-group.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-meeting.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-project.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-report.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/new-task.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/notification-setting.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/notifications.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/password-change.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/profile.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/recent.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/search.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/system-setting.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/team-mgmt.md create mode 100644 resources/ai-kb/zh/menu-map/menu-navigation/theme.md create mode 100644 resources/ai-kb/zh/menu-map/messenger/entry.md create mode 100644 resources/ai-kb/zh/menu-map/micro-app/entry.md create mode 100644 resources/ai-kb/zh/menu-map/minder/entry.md create mode 100644 resources/ai-kb/zh/menu-map/office/entry.md create mode 100644 resources/ai-kb/zh/menu-map/okr/entry.md create mode 100644 resources/ai-kb/zh/menu-map/org-department/entry.md create mode 100644 resources/ai-kb/zh/menu-map/project/entry.md create mode 100644 resources/ai-kb/zh/menu-map/report/entry.md create mode 100644 resources/ai-kb/zh/menu-map/role-permission/entry.md create mode 100644 resources/ai-kb/zh/menu-map/search/entry.md create mode 100644 resources/ai-kb/zh/menu-map/system-setting/entry.md create mode 100644 resources/ai-kb/zh/menu-map/system-setting/menu-map.md create mode 100644 resources/ai-kb/zh/menu-map/user-account/entry.md create mode 100644 resources/ai-kb/zh/menu-map/user-settings/entry.md create mode 100644 resources/ai-kb/zh/shortcut/.gitkeep create mode 100644 resources/ai-kb/zh/shortcut/dialog.md create mode 100644 resources/ai-kb/zh/shortcut/global.md create mode 100644 resources/ai-kb/zh/shortcut/messenger.md create mode 100644 resources/ai-kb/zh/shortcut/mobile-gesture.md create mode 100644 resources/ai-kb/zh/shortcut/task.md diff --git a/.github/workflows/ai-kb-reindex.yml b/.github/workflows/ai-kb-reindex.yml new file mode 100644 index 000000000..909280a98 --- /dev/null +++ b/.github/workflows/ai-kb-reindex.yml @@ -0,0 +1,97 @@ +name: "AI-KB Reindex" + +# 主仓库 ai-kb 内容变更后,远程触发 AI 插件 `POST /kb/reindex` 增量入库。 +# 失败不阻塞 PR/发布;AI 容器下次启动会自动 ingest_all 兜底(plan §三 / R9)。 + +on: + push: + branches: + - "pro" + paths: + - "resources/ai-kb/**" + workflow_dispatch: + inputs: + mode: + description: "incremental | full" + required: false + default: "incremental" + paths: + description: "JSON 数组,相对 resources/ai-kb/ 的路径(mode=incremental 时使用)" + required: false + default: "[]" + +jobs: + reindex: + permissions: + contents: read + runs-on: ubuntu-latest + timeout-minutes: 5 + # 不被其他 job 依赖;失败不阻塞合并。 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 # 用于 git diff HEAD~1 HEAD + + - name: Resolve changed paths + id: paths + run: | + set -euo pipefail + MODE="${{ github.event.inputs.mode || 'incremental' }}" + + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + INPUT_PATHS='${{ github.event.inputs.paths }}' + if [ -z "${INPUT_PATHS}" ] || [ "${INPUT_PATHS}" = "[]" ]; then + MODE="full" + PATHS_JSON="[]" + else + PATHS_JSON="${INPUT_PATHS}" + fi + else + CHANGED=$(git diff --name-only HEAD~1 HEAD -- 'resources/ai-kb/**/*.md' 'resources/ai-kb/**/*.yaml' 'resources/ai-kb/**/*.yml' || true) + if [ -z "${CHANGED}" ]; then + echo "No ai-kb file changes detected; skip reindex call." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + PATHS_JSON=$(printf '%s\n' "${CHANGED}" \ + | sed 's|^resources/ai-kb/||' \ + | jq -R . | jq -cs .) + fi + + echo "mode=${MODE}" >> "$GITHUB_OUTPUT" + echo "paths_json=${PATHS_JSON}" >> "$GITHUB_OUTPUT" + echo "skip=false" >> "$GITHUB_OUTPUT" + + - name: Trigger /kb/reindex + if: steps.paths.outputs.skip != 'true' + env: + AI_SERVICE_URL: ${{ secrets.AI_SERVICE_URL }} + KB_INGEST_TOKEN: ${{ secrets.KB_INGEST_TOKEN }} + MODE: ${{ steps.paths.outputs.mode }} + PATHS_JSON: ${{ steps.paths.outputs.paths_json }} + run: | + set -euo pipefail + if [ -z "${AI_SERVICE_URL:-}" ] || [ -z "${KB_INGEST_TOKEN:-}" ]; then + echo "::warning ::AI_SERVICE_URL or KB_INGEST_TOKEN secret not set; skip remote reindex." + exit 0 + fi + + BODY=$(jq -cn --arg mode "$MODE" --argjson paths "$PATHS_JSON" '{mode:$mode, paths:$paths}') + echo "Posting body: $BODY" + + HTTP_CODE=$(curl -sS -o /tmp/kb-reindex.json -w '%{http_code}' \ + --max-time 90 \ + --retry 2 --retry-delay 5 --retry-connrefused \ + -X POST "${AI_SERVICE_URL%/}/kb/reindex" \ + -H "X-Ingest-Token: ${KB_INGEST_TOKEN}" \ + -H 'Content-Type: application/json' \ + -d "$BODY" || true) + + echo "HTTP $HTTP_CODE" + cat /tmp/kb-reindex.json || true + + if [ "$HTTP_CODE" != "200" ]; then + echo "::warning ::reindex returned HTTP $HTTP_CODE — AI 容器下次启动会 ingest_all 兜底(参见 plan §三/R9)" + exit 0 # 不阻塞 push / 发布 + fi diff --git a/CLAUDE.md b/CLAUDE.md index 0b384e749..8c32212b6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,6 +49,32 @@ Laravel 8 (LaravelS/Swoole) + Vue 2 (Vite) + Electron。开源任务/项目管 - 新增用户可见文本须追加原文(简体中文)到:前端 `language/original-web.txt`,后端 `language/original-api.txt`(去重) - 前端翻译用 `$L("文本")`,动态值用 `(*)` 占位:`$L('共(*)条', n)`——禁止拼接翻译 +## DooTask AI 知识库 (ai-kb) 同步规则 + +`dootask/resources/ai-kb/` 是**专给 AI 助手 RAG 检索的功能知识库**,与人类文档(`dootask-website`)独立。它直接影响产品内 AI 助手能否正确回答用户的「X 怎么用」。 + +**何时必须同步更新 ai-kb**: + +- 新增、修改、删除任何用户可见的功能、菜单、按钮、流程、字段 +- 调整 API 行为(错误码、参数含义、返回结构) +- 引入新插件 / 微应用,或修改权限 / 角色定义 + +**操作步骤**: + +1. 在 `resources/ai-kb/_meta/feature-map.yaml` 找到对应 `feature` 的 chunk 清单 +2. 按 `resources/ai-kb/_schema/chunk-style.md` 风格修改对应 markdown +3. 更新 frontmatter 的 `last_verified` 字段为当前主程序版本号 +4. 该功能没有对应 chunk 时,按 `resources/ai-kb/_schema/frontmatter.md` 规范新建 + +**禁止**: + +- 跨章节指代("如上图所示"、"在前面一节")——RAG 切块后会丢失上下文 +- 把 dootask-website 的人类教程或截图直接复制过来 +- 单独提交「只改 ai-kb」的 PR——应与触发它的主代码改动同一个 PR +- 改产品代码但不改 ai-kb(PR review 应拦截) + +**自动化**:合入 main 后 CI 自动调用 AI 插件的 `POST /kb/reindex` 增量入库;失败由 AI 容器重启自动 `ingest_all` 兜底。 + ## Playwright 测试 - Playwright 测试结果放在 `tests/playwright-results/`,包含测试环境、测试用例、结果截图等信息 diff --git a/app/Http/Controllers/Api/AssistantController.php b/app/Http/Controllers/Api/AssistantController.php index bce68fc57..5384e7f8b 100644 --- a/app/Http/Controllers/Api/AssistantController.php +++ b/app/Http/Controllers/Api/AssistantController.php @@ -46,8 +46,17 @@ class AssistantController extends AbstractController $modelType = trim(Request::input('model_type', '')); $modelName = trim(Request::input('model_name', '')); $contextInput = Request::input('context', []); + // ai-kb 检索语种;缺省 zh,前端传 'zh' / 'en' + $supportedLocales = config('ai.rag_supported_locales', ['zh', 'en']); + $locale = trim(Request::input('locale', 'zh')); + if (!in_array($locale, $supportedLocales, true)) { + $locale = 'zh'; + } - return AI::createStreamKey($modelType, $modelName, $contextInput); + // 灰度判定(参考 config/ai.php):总开关 + canary 白名单 + $ragEnabled = AI::ragEnabledFor((int) $user->userid); + + return AI::createStreamKey($modelType, $modelName, $contextInput, $locale, $ragEnabled); } /** diff --git a/app/Module/AI.php b/app/Module/AI.php index 0c310c605..f0a034ddd 100644 --- a/app/Module/AI.php +++ b/app/Module/AI.php @@ -140,7 +140,31 @@ class AI * @param mixed $contextInput * @return array */ - public static function createStreamKey($modelType, $modelName, $contextInput = []) + /** + * 判定当前用户是否启用 ai-kb RAG(灰度判定) + * + * 规则(参考 config/ai.php): + * - 总开关 rag_enabled=false → 关闭所有(kill switch) + * - rag_canary_userids 为空 → 全员启用 + * - 否则仅白名单 userid 启用 + */ + public static function ragEnabledFor(int $userid): bool + { + if (!config('ai.rag_enabled', true)) { + return false; + } + $raw = trim((string) config('ai.rag_canary_userids', '')); + if ($raw === '') { + return true; + } + $allow = array_filter(array_map( + fn($v) => (int) trim($v), + explode(',', $raw) + ), fn($v) => $v > 0); + return in_array($userid, $allow, true); + } + + public static function createStreamKey($modelType, $modelName, $contextInput = [], $locale = 'zh', $ragEnabled = true) { $modelType = trim((string)$modelType); $modelName = trim((string)$modelName); @@ -221,6 +245,9 @@ class AI 'model_type' => $remoteModelType, 'model_name' => $modelName, 'context' => $contextJson, + 'locale' => $locale, + // ai-kb 灰度透传:1 启用 RAG(hint + search_help_docs tool),0 关闭 + 'rag_enabled' => $ragEnabled ? '1' : '0', ]; $baseUrl = trim((string)($setting[$modelType . '_base_url'] ?? '')); diff --git a/config/ai.php b/config/ai.php new file mode 100644 index 000000000..27ec8fdd0 --- /dev/null +++ b/config/ai.php @@ -0,0 +1,57 @@ + filter_var(env('RAG_ENABLED', true), FILTER_VALIDATE_BOOLEAN), + + /* + |-------------------------------------------------------------------------- + | RAG canary 白名单 + |-------------------------------------------------------------------------- + | 逗号分隔的 userid 列表。 + | 留空表示 全员启用(Stage 3 broad rollout)。 + | 有值表示 仅白名单 userid 命中 RAG(Stage 2 canary)。 + */ + 'rag_canary_userids' => env('RAG_CANARY_USERIDS', ''), + + /* + |-------------------------------------------------------------------------- + | RAG 检索语种受控集合 + |-------------------------------------------------------------------------- + | 前端可传的 locale 值;不在集合内默认回退到 zh。 + | P0 仅启用 zh;P1 起开放 en。 + */ + 'rag_supported_locales' => ['zh', 'en'], +]; diff --git a/resources/ai-kb/README.md b/resources/ai-kb/README.md new file mode 100644 index 000000000..2f540e389 --- /dev/null +++ b/resources/ai-kb/README.md @@ -0,0 +1,80 @@ +# ai-kb — DooTask AI 助手知识库 + +这是**专为大语言模型(LLM)检索使用**的 DooTask 功能知识库,不是给人类阅读的产品文档(那个在 [dootask-website](https://github.com/dootask/dootask-website) 仓库的 `help/docs`)。 + +它的唯一消费者是 AI 助手:用户问"看板列怎么改名 / 审批可以分支吗 / 5.4 有什么新功能"时,助手通过 RAG 检索这里的内容来作答。 + +## 目录结构 + +``` +ai-kb/ +├── _schema/ 写作规范(必读) +│ ├── frontmatter.md frontmatter 字段规范 + 受控词表 +│ └── chunk-style.md chunk 写作风格 + 正反例 +├── _meta/ 元数据(CI 与脚本读取) +│ ├── feature-map.yaml feature 全集 + 每个 feature 的 chunk 清单 +│ └── tool-binding.yaml chunk ↔ MCP 工具映射 +├── _eval/ 回归测试 +│ └── golden-50q.yaml 50 题评估集 +├── zh/ 中文知识库(P0 主战场) +│ ├── concept/ 「是什么」 +│ ├── howto/ 「怎么做」(含 apps/ 子目录覆盖应用中心) +│ ├── faq/ 「为什么 / 出错怎么办」 +│ ├── menu-map/ 「X 入口在哪」 +│ ├── glossary/ 术语 + 别名 +│ └── shortcut/ 快捷键、移动端手势 +└── en/ 英文知识库(P1 起草,P0 保留空目录) +``` + +## 为什么不复用 dootask-website 的人类文档 + +| 维度 | 人类文档 | ai-kb | +|---|---|---| +| 阅读单位 | 一篇文章 | 一个 chunk(128-512 token) | +| 自包含性 | 假设从头读 | 每个 chunk 独立可懂 | +| 跨章节指代 | 「如上图所示」可以 | 禁止 | +| 截图 | 必要 | 禁止依赖(用文字描述) | +| 同义词 | 一处定义 | 显式列别名 | +| 否定信息 | 少 | 必备 | +| 元数据 | 标题即可 | 严格 frontmatter | + +直接对人类文档做 RAG 召回率低、易编造,所以这里独立维护。 + +## 怎么开始写一个 chunk + +1. 通读 [`_schema/frontmatter.md`](./_schema/frontmatter.md) — 字段规范与受控词表 +2. 通读 [`_schema/chunk-style.md`](./_schema/chunk-style.md) — 写作风格与正反例 +3. 在 [`_meta/feature-map.yaml`](./_meta/feature-map.yaml) 找到对应 feature 的 chunk 清单和归属批次 +4. 在对应 `zh///.md` 路径下新建文件 +5. 提交 PR,CI 会自动跑 lint;通过且 review 完毕后合入 main,CI 自动触发 AI 插件的 `POST /kb/reindex` 入库 + +## 改 DooTask 主程序后必须同步更新这里 + +**这是硬性约束** —— 详见主仓库根目录 `CLAUDE.md` 中「DooTask AI 知识库 (ai-kb) 同步规则」章节。新增/修改/删除任何用户可见的功能、菜单、按钮、流程、字段、API 行为、权限角色,都必须在**同一 PR**里更新对应 chunk 并把 frontmatter 的 `last_verified` 改成当前版本号。 + +不更新的代价是 AI 助手给用户讲错路径,比 PR 多写两行成本高得多。 + +## 工程接口(代码在 AI 插件那一侧) + +ingest、检索、lint、eval 的实现在 `dootask-plugins/system-plugins/ai/src/helper/kb/`。本目录纯内容,不放 Python 代码。 + +AI 插件容器通过只读 volume mount 看到本目录: +```yaml +volumes: + - ../../../dootask/resources/ai-kb:/app/kb-content:ro +``` + +触发入库(CI 或运维手动): +```bash +curl -X POST 'http://ai-service/kb/reindex' \ + -H "X-Ingest-Token: $KB_INGEST_TOKEN" \ + -d '{"paths":["zh/howto/task-create.md"], "mode":"incremental"}' +``` + +容器启动时 lifespan 会自动跑一次 `ingest_all` 作为兜底。 + +## 维护责任 + +- **内容**:产品功能负责人 / PM / 技术写作者按 `_meta/feature-map.yaml` 中的 `owner` 列认领 +- **schema 与受控词表**:架构组维护,修改需走 PR +- **lint / ingest / retriever 代码**:AI 插件维护组 diff --git a/resources/ai-kb/_eval/golden-50q.yaml b/resources/ai-kb/_eval/golden-50q.yaml new file mode 100644 index 000000000..e61af2435 --- /dev/null +++ b/resources/ai-kb/_eval/golden-50q.yaml @@ -0,0 +1,575 @@ +# 50 题回归测试集(S5 完整验收) +# +# 字段: +# id 测试题 id +# q 用户提问 +# locale zh / en +# expected_chunk_ids 期望被 retriever 召回的 chunk id(≥1 条命中即 recall=1) +# expected_answer 期望答案要点(LLM-judge 用,自然语言描述关键事实) +# must_say 正例:答案必须包含的关键词中至少 1 条 / 拒答桶:拒答关键词 +# must_not_say 答案禁止出现的内容(编造点) +# bucket easy / medium / hard / honest-negative +# feature 对应 feature(追溯定位) +# +# 分布(plan §4.1): +# 一级导航 + 项目/任务核心 12 (easy 6 / med 6) +# 视图/会议/报告/审批/签到/OKR 10 +# 应用中心 6 (easy 4 / med 2) +# 用户/组织/系统管理 6 (med 4 / hard 2) +# AI/搜索/终端 4 (medium) +# 快捷键/术语 4 (easy) +# 跨模块组合 3 (hard) +# 中英混合 2 (medium) +# 诚实性 negative 3 +# ---合计--- 50 + +version: 3 +last_updated: 2026-06-10 + +tests: + + # ----- 桶 1: 一级导航 + 项目/任务核心 12 ----- + + - id: q1 + q: "看板列怎么改名?" + locale: zh + expected_chunk_ids: [project.column.howto.edit, view.kanban.howto.column-color] + expected_answer: "在项目看板视图,点击列标题右侧「···」菜单选「修改」,在弹窗中输入新列表名保存;同一菜单还可设置列颜色、归档、删除列,列顺序通过拖拽调整。" + must_say: [列, 改名, 重命名] + must_not_say: [] + bucket: easy + feature: project + + - id: q2 + q: "怎么快速创建一个任务?" + locale: zh + expected_chunk_ids: [task.create.howto.quick] + expected_answer: "在项目看板任意列底部点击添加区域,输入任务描述回车即可创建;或左上角「新建任务」按钮(快捷键 Ctrl/Cmd+K 或 Ctrl/Cmd+N)。" + must_say: [快速, 创建, 任务] + must_not_say: [] + bucket: easy + feature: task + + - id: q3 + q: "DooTask 的默认工作流是什么样的?" + locale: zh + expected_chunk_ids: [project.flow.concept.default] + expected_answer: "默认 5 个流程节点:待处理 / 进行中 / 待测试 / 已完成 / 已取消,可自定义。" + must_say: [待处理, 进行中, 已完成] + must_not_say: [] + bucket: easy + feature: project + + - id: q4 + q: "仪表盘上有哪些卡片?" + locale: zh + expected_chunk_ids: [dashboard.concept] + expected_answer: "仪表盘顶部有「今日到期 / 超期任务 / 待完成任务」3 个统计卡片,下方按今日到期、超期、待完成、协助的任务分组列出任务,是个人工作台。" + must_say: [仪表盘, 卡片] + must_not_say: [] + bucket: easy + feature: dashboard + + - id: q5 + q: "日历入口在哪?" + locale: zh + expected_chunk_ids: [calendar.entry.menu-map, menu-navigation.calendar.menu-map] + expected_answer: "左侧主导航点击「日历」即可进入(与仪表盘、消息、文件、应用并列)。" + must_say: [日历] + must_not_say: [] + bucket: easy + feature: calendar + + - id: q6 + q: "子任务可以再嵌套子任务吗?" + locale: zh + expected_chunk_ids: [task.subtask.limits.concept] + expected_answer: "DooTask 子任务只支持单层,不能继续嵌套子子任务。" + must_say: [子任务, 不支持嵌套, 不能嵌套, 单层, 只支持] + must_not_say: [支持多层嵌套, 可以无限嵌套] + bucket: easy + feature: task + + - id: q7 + q: "想改任务负责人怎么改?" + locale: zh + expected_chunk_ids: [task.edit.howto.basic, role-permission.task-role.concept] + expected_answer: "打开任务详情,在「负责人」字段下拉选择新成员;只有项目成员可被指派。" + must_say: [负责人] + must_not_say: [] + bucket: medium + feature: task + + - id: q8 + q: "我要离职了,能不能把项目移交给同事?" + locale: zh + expected_chunk_ids: [project.transfer.howto] + expected_answer: "项目页右上角「···」菜单选「移交项目」,选择新负责人确认即可;仅项目主负责人可操作,移交后项目群归属同步变更。" + must_say: [移交, 转让, 项目] + must_not_say: [] + bucket: medium + feature: project + + - id: q9 + q: "任务快到截止时间会怎么提醒我?" + locale: zh + expected_chunk_ids: [task.notify.concept, mobile-client.notify.concept] + expected_answer: "到期前约 1 小时和超期约 1 小时后,「task-alert」任务提醒机器人会私聊发送「任务即将超时 / 已超时」提醒(需管理员开启 APP 推送设置);消息经站内/桌面通知和移动端推送触达。" + must_say: [提醒] + must_not_say: [] + bucket: hard + feature: task + + - id: q10 + q: "项目里的任务能导出 Excel 吗?" + locale: zh + expected_chunk_ids: [project.export.howto] + expected_answer: "限管理员:左上角菜单「团队管理」子菜单(或应用中心「数据导出」)选「导出任务统计」,选成员(最多 100 人)和时间范围(最长 90 天)导出 Excel;另有「导出超期任务」。" + must_say: [导出, Excel] + must_not_say: [] + bucket: medium + feature: project + + - id: q11 + q: "删除看板列时,列里已有的任务怎么办?" + locale: zh + expected_chunk_ids: [project.column.howto.remove] + expected_answer: "删除列会级联删除(软删除)该列下未归档的任务;被删任务可在项目菜单「已删除任务」中查看并「还原」。删除前也可先把任务拖到其他列。" + must_say: [删除, 任务] + must_not_say: [自动迁移到其它列] + bucket: medium + feature: project + + - id: q12 + q: "把任务从一个项目搬到另一个项目" + locale: zh + expected_chunk_ids: [task.move.howto.cross-project] + expected_answer: "任务操作菜单选「移动」,在「移动任务」弹窗选择目标项目与列表,可同时重设任务状态、负责人、协助人后确认;任务主要字段保留。" + must_say: [跨项目, 移动] + must_not_say: [] + bucket: medium + feature: task + + # ----- 桶 2: 视图/会议/报告/审批/签到/OKR 10 ----- + + - id: q13 + q: "甘特图视图怎么用?" + locale: zh + expected_chunk_ids: [view.gantt.howto] + expected_answer: "在项目视图切换器选「甘特图」,可拖动任务条调整开始/结束时间。" + must_say: [甘特图] + must_not_say: [] + bucket: easy + feature: view + + - id: q14 + q: "怎么创建一个会议?" + locale: zh + expected_chunk_ids: [meeting.create.howto] + expected_answer: "左上角「+」下拉选「新会议」(Ctrl/Cmd+J),或应用中心「在线会议」;填会议主题、邀请成员后点「开始会议」;他人可凭会议频道 ID 加入。" + must_say: [会议, 创建, 新建] + must_not_say: [] + bucket: easy + feature: meeting + + - id: q15 + q: "怎么写一份工作报告?" + locale: zh + expected_chunk_ids: [report.create.howto] + expected_answer: "应用中心打开「工作报告」新建汇报,选「周报 / 日报」,系统按任务数据自动生成「已完成工作 / 未完成的工作」内容模板,编辑后选择汇报对象提交。" + must_say: [报告] + must_not_say: [] + bucket: easy + feature: report + + - id: q16 + q: "审批流可以分支吗?" + locale: zh + expected_chunk_ids: [approve.node.concept, approve.template.howto] + expected_answer: "DooTask 审批支持单人 / 会签(多人同意/否决)/ 抄送等节点;P0 版本暂不支持按表单条件路由的「条件分支」,需拆为多个流程模板。" + must_say: [分支, 不支持, 节点] + must_not_say: [完全支持条件分支, 可以任意配置条件路由] + verify_note: "审批为 AppStore 插件(docker/appstore/apps/approve),流程设计器以 iframe 加载(approve/setting.vue:24),源码不在主仓库;主仓库仅可证实存在「抄送」节点(approve/details.vue:117-124),会签/条件分支能力无法用代码裁决" + bucket: medium + feature: approve + + - id: q17 + q: "签到打卡数据怎么导出?" + locale: zh + expected_chunk_ids: [checkin.export.howto, data-export.checkin.howto] + expected_answer: "限管理员:应用中心「数据导出」(或左上角菜单 → 团队管理)选「导出签到数据」,选成员(最多 100 人)、日期范围(最长 35 天)和时间段导出 Excel;普通员工没有此权限。" + must_say: [签到, 导出] + must_not_say: [] + bucket: easy + feature: checkin + + - id: q18 + q: "OKR 怎么和上级对齐?" + locale: zh + expected_chunk_ids: [okr.align.howto] + expected_answer: "在 OKR 详情勾选「对齐到」选择上级 O;个人 OKR 拆解自团队 / 部门 / 公司 OKR。" + must_say: [OKR, 对齐] + must_not_say: [] + verify_note: "OKR 为 AppStore 插件(docker/appstore/apps/okr),源码不在主仓库,「对齐到」具体交互无法用主仓库代码裁决" + bucket: medium + feature: okr + + - id: q19 + q: "让 AI 帮我写周报" + locale: zh + expected_chunk_ids: [report.ai-generate.howto, ai-assistant.report-draft.howto] + expected_answer: "在工作报告编辑页点「AI 整理汇报」(需先填写汇报内容,新建时系统已按任务自动生成内容),AI 助手会在此基础上整理润色,结果可应用回编辑器继续编辑。" + must_say: [AI, 周报, 报告] + must_not_say: [] + bucket: medium + feature: report + + - id: q20 + q: "WiFi 自动签到怎么用?" + locale: zh + expected_chunk_ids: [checkin.wifi.howto, checkin.mac-not-match.faq] + expected_answer: "前提:管理员开启签到功能并在公司 OpenWrt 路由器执行系统生成的安装脚本(路由器每分钟上报在线设备 MAC)。个人在「签到打卡」→ 签到设置 → WiFi 签到中填写自己设备的 MAC 地址,设备连上该 WiFi 即自动打卡;不在该网络时不会自动签到。" + must_say: [WiFi, MAC, 自动] + must_not_say: [] + bucket: medium + feature: checkin + + - id: q21 + q: "我加入会议失败怎么办?" + locale: zh + expected_chunk_ids: [meeting.cannot-join.faq] + expected_answer: "常见原因:会议号已结束 / 无效;分享链接过期;网络受限(声网 Agora 域名被拦截);管理员未配置 Agora。" + must_say: [会议, 失败] + must_not_say: [] + bucket: hard + feature: meeting + + - id: q22 + q: "在群聊里能直接开会议吗?" + locale: zh + expected_chunk_ids: [meeting.from-dialog.howto] + expected_answer: "聊天输入框右侧「展开(+)」工具菜单选「新会议」,会自动把当前会话成员(不含机器人)填入邀请名单;会话列表右键联系人也有「发起会议」。" + must_say: [会议, 对话, 发起] + must_not_say: [] + bucket: medium + feature: meeting + + # ----- 桶 3: 应用中心 6 ----- + + - id: q23 + q: "微应用是什么?" + locale: zh + expected_chunk_ids: [micro-app.concept] + expected_answer: "微应用是 DooTask 中以独立卡片/页面形式嵌入的插件式应用,从「应用商店」安装,登录态(用户 token)自动继承。" + must_say: [微应用, 插件] + must_not_say: [] + bucket: easy + feature: micro-app + + - id: q24 + q: "怎么装一个新的应用?" + locale: zh + expected_chunk_ids: [micro-app.install.howto] + expected_answer: "管理员在应用页的「应用商店」(仅管理员可见)找到目标应用点击安装,安装后应用出现在所有用户的应用面板。" + must_say: [安装, 应用] + must_not_say: [] + bucket: easy + feature: micro-app + + - id: q25 + q: "系统应用和微应用有什么区别?" + locale: zh + expected_chunk_ids: [app-system.relation.concept] + expected_answer: "系统应用是内置卡片(工作报告/签到打卡/在线会议/我的收藏等),无需安装;微应用来自应用商店安装(如审批中心、OKR、AI 助手);管理员应用(LDAP/邮件通知/APP 推送/数据导出/团队管理等)仅管理员可见。" + must_say: [系统应用, 微应用, 区别] + must_not_say: [] + bucket: medium + feature: app-system + + - id: q26 + q: "我的收藏应用入口在哪?" + locale: zh + expected_chunk_ids: [app-system.favorite.howto, menu-navigation.favorite.menu-map] + expected_answer: "应用中心「我的收藏」卡片,或左上角主菜单「我的收藏」;里面是你收藏的任务、项目、文件、消息。" + must_say: [收藏] + must_not_say: [] + bucket: easy + feature: app-system + + - id: q27 + q: "应用顺序能调整吗?" + locale: zh + expected_chunk_ids: [micro-app.sort.howto] + expected_answer: "应用页右上角「···」菜单选「调整排序」进入排序模式,拖动卡片调整顺序后点「保存」;排序仅自己可见,可「恢复默认」。" + must_say: [应用, 排序, 拖] + must_not_say: [] + bucket: easy + feature: micro-app + + - id: q28 + q: "为什么我的 DooTask 看不到 OKR?" + locale: zh + expected_chunk_ids: [okr.cannot-install.faq] + expected_answer: "OKR 是应用商店插件,需管理员先在「应用商店」安装后才会显示;安装失败可查看应用商店安装日志、检查网络能否拉取镜像。" + must_say: [OKR, 安装, 应用市场] + must_not_say: [] + bucket: medium + feature: okr + + # ----- 桶 4: 用户/组织/系统管理 6 ----- + + - id: q29 + q: "注销账号以后还能恢复吗?" + locale: zh + expected_chunk_ids: [user-account.delete-restore.faq] + expected_answer: "注销(删除帐号)不可恢复,系统仅保留昵称等基础信息用于历史消息展示;管理员能恢复的是「已离职」状态的帐号(且离职时移交的数据无法恢复),与注销不同。" + must_say: [注销, 不可恢复, 无法恢复] + must_not_say: [] + bucket: medium + feature: user-account + + - id: q30 + q: "AI 模型在哪里配置?" + locale: zh + expected_chunk_ids: [menu-navigation.ai-config.menu-map, system-setting.ai-model.howto] + expected_answer: "管理员打开应用中的「AI 助手」,在助手设置面板(仅管理员可见)配置各模型提供商的 API Key / Base URL / 模型列表与默认模型,可一键获取默认模型列表。" + must_say: [AI, 模型, 配置] + must_not_say: [] + bucket: medium + feature: system-setting + + - id: q31 + q: "操作时提示「权限不足」,是哪里没设?" + locale: zh + expected_chunk_ids: [role-permission.permission-denied.faq] + expected_answer: "通常因为操作超出当前角色权限。可能:非项目负责人无法修改项目设置;非管理员无法访问系统设置;任务可见用户名单未包含你。建议联系管理员或项目负责人调整。" + must_say: [权限, 角色] + must_not_say: [] + bucket: medium + feature: role-permission + + - id: q32 + q: "怎么把超级管理员转给别人?" + locale: zh + expected_chunk_ids: [role-permission.transfer-owner.howto] + expected_answer: "DooTask 没有单独的「转让超级管理员」功能,采用多管理员模型:管理员在「团队管理」成员操作菜单中对目标成员「设为管理员」,如需移交可再取消自己的管理员身份。" + must_say: [管理员, 团队管理] + must_not_say: [] + bucket: medium + feature: role-permission + + - id: q33 + q: "LDAP 用户同步不到 DooTask 怎么办?" + locale: zh + expected_chunk_ids: [ldap.troubleshoot.faq, ldap.sync.howto] + expected_answer: "检查 LDAP 配置(Host / Port / Base DN / 绑定 DN 及密码)是否正确,可用「测试连接」验证;确认网络/防火墙放通;注意 LDAP 用户是在登录 DooTask 时才同步创建,不是批量预同步。" + must_say: [LDAP] + must_not_say: [] + bucket: hard + feature: ldap + + - id: q34 + q: "管理员怎么一次性批量导入员工?" + locale: zh + expected_chunk_ids: [user-account.import.howto] + expected_answer: "管理员在「团队管理」点「批量导入」,上传 xls/xlsx/csv 文件(列顺序:邮箱、昵称、初始密码、职位(选填)),先预览校验再确认导入;可下载官方模板。" + must_say: [批量, 导入, 用户, Excel] + must_not_say: [] + bucket: hard + feature: user-account + + # ----- 桶 5: AI / 搜索 / 终端 4 ----- + + - id: q35 + q: "AI 助手怎么换一个模型?" + locale: zh + expected_chunk_ids: [ai-assistant.model-switch.howto, ai-assistant.model.concept] + expected_answer: "在 AI 助手浮窗底部输入区的模型下拉切换;可选模型由管理员在「AI 助手」应用的设置面板配置。" + must_say: [AI, 模型, 切换] + must_not_say: [] + bucket: medium + feature: ai-assistant + + - id: q36 + q: "智能搜索是什么?" + locale: zh + expected_chunk_ids: [search.intelligent.concept] + expected_answer: "智能搜索基于 Manticore Search 插件,支持关键词 / 语义(向量)/ 混合搜索,可搜任务、项目、文件内容、消息、联系人;未安装插件时回退普通 MySQL 关键词搜索。" + must_say: [智能搜索, 语义] + must_not_say: [] + bucket: medium + feature: search + + - id: q37 + q: "桌面端怎么设置开机自启?" + locale: zh + expected_chunk_ids: [electron-client.auto-start.howto] + expected_answer: "桌面端没有内置「开机自启」开关,需在操作系统的启动项中手动添加(如 Windows 启动文件夹 / 任务计划、macOS 系统设置的登录项)。" + must_say: [开机自启, 桌面端] + must_not_say: [] + bucket: medium + feature: electron-client + + - id: q38 + q: "手机端收不到推送通知" + locale: zh + expected_chunk_ids: [mobile-client.push-fail.faq] + expected_answer: "检查:App 通知权限是否开启、系统省电模式是否限制后台、UMENG 推送是否配置完成、网络是否受限。" + must_say: [推送, 移动端, App] + must_not_say: [] + bucket: medium + feature: mobile-client + + # ----- 桶 6: 快捷键 / 术语 4 ----- + + - id: q39 + q: "任务编辑时有什么快捷键?" + locale: zh + expected_chunk_ids: [shortcut.task.shortcut] + expected_answer: "任务编辑快捷键:Ctrl/Cmd + S 保存任务修改;任务名输入框回车直接保存(Shift+回车换行);详细描述为 TinyMCE 富文本编辑器,支持 Ctrl/Cmd + B 加粗等通用富文本快捷键。" + must_say: [快捷键, 任务] + must_not_say: [] + bucket: easy + feature: shortcut + + - id: q40 + q: "DooTask 全局快捷键有哪些?" + locale: zh + expected_chunk_ids: [shortcut.global.shortcut] + expected_answer: "全局快捷键(Ctrl/Cmd 组合):B 新建项目、F 或 / 搜索、K 或 N 新建任务、U 创建群组、J 新会议、I 呼出 AI 助手(需安装 AI 插件)、S 保存任务、, 打开设置;Ctrl/Cmd+Alt+L 下载内容(桌面端)。" + must_say: [快捷键] + must_not_say: [] + bucket: easy + feature: shortcut + + - id: q41 + q: "怎么关掉当前弹窗?" + locale: zh + expected_chunk_ids: [shortcut.dialog.shortcut] + expected_answer: "按 Esc 关闭弹窗或抽屉;某些表单弹窗需要先取消编辑态再 Esc。" + must_say: [Esc, 关闭] + must_not_say: [] + bucket: easy + feature: shortcut + + - id: q42 + q: "手机上有什么手势操作?" + locale: zh + expected_chunk_ids: [shortcut.mobile-gesture.shortcut, mobile-client.gesture.concept] + expected_answer: "移动端主要手势:长按列表项(会话、项目、文件等)弹出操作菜单;列表滚动到底自动加载更多。" + must_say: [手势, 移动, 长按] + must_not_say: [左滑显示任务操作菜单] + verify_note: "代码仅证实长按手势(v-longpress 指令,manage.vue/messenger.vue/file.vue)与滚动加载;未找到左滑操作菜单、下拉刷新手势的实现(移动端为 WebView 壳加载同一 SPA)" + bucket: easy + feature: shortcut + + # ----- 桶 7: 跨模块组合 3 ----- + + - id: q43 + q: "任务到期了 DooTask 通过哪些方式通知我?涉及桌面端、手机端、邮件?" + locale: zh + expected_chunk_ids: + - task.notify.concept + - mobile-client.notify.concept + - electron-client.notify.concept + expected_answer: "到期前/超期后约 1 小时,task-alert 机器人私聊发送提醒(依赖管理员开启「APP 推送」设置):桌面端收到站内消息并弹系统通知(依赖系统通知权限)、移动端走 UMENG 推送;任务到期提醒不发邮件——邮件通知仅覆盖未读聊天消息(文本/文件/语音/会议类),不含此类模板提醒。" + must_say: [桌面, 移动, 推送, 提醒] + must_not_say: [] + bucket: hard + feature: task + + - id: q44 + q: "项目里我改不了任务,提示权限不足,怎么排查?" + locale: zh + expected_chunk_ids: + - project.permission-denied-task.faq + - role-permission.permission-denied.faq + - role-permission.project-role.concept + expected_answer: "首先确认你在该项目里的角色(负责人/管理员/成员)和任务权限点;其次检查该项目自定义权限规则;若仍受限请联系项目负责人或管理员调整。" + must_say: [权限, 项目, 角色] + must_not_say: [] + bucket: hard + feature: role-permission + + - id: q45 + q: "在群聊里讨论时直接派一个任务出去要怎么操作?" + locale: zh + expected_chunk_ids: + - task.create.howto.via-mention + - messenger.task-mention.concept + expected_answer: "右键(移动端长按)群里某条文本消息选「新任务」,消息内容自动填入任务描述,可设项目、负责人、截止时间后添加;输入框输入 # 只能引用/关联已有任务,不能新建。" + must_say: [任务, 对话] + must_not_say: [] + bucket: hard + feature: task + + # ----- 桶 8: 中英混合提问 2(locale=zh,测中英查询鲁棒性)----- + + - id: q46 + q: "How to create a quick task in DooTask?" + locale: zh + expected_chunk_ids: [task.create.howto.quick] + expected_answer: "On the Kanban board, click the add area at the bottom of any column, type the task name and press Enter; or use the top-left New Task button (Ctrl/Cmd+K or N)." + must_say: [quick, task, create] + must_not_say: [] + bucket: medium + feature: task + + - id: q47 + q: "checkin export 怎么用?" + locale: zh + expected_chunk_ids: [checkin.export.howto, data-export.checkin.howto] + expected_answer: "Admin opens the Data Export app (or top-left menu → Team Management) → Export Checkin Data, picks members and a date range (max 35 days) and downloads Excel; regular users have no permission." + must_say: [签到, 导出, export] + must_not_say: [] + bucket: medium + feature: checkin + + # ----- 桶 9: 诚实性 negative 3 ----- + + - id: q48 + q: "DooTask 怎么训练一个自己的大语言模型?" + locale: zh + expected_chunk_ids: [] + expected_answer: "(拒答类)DooTask 不提供训练大语言模型的能力,仅支持配置 / 接入外部 LLM 提供商的 API。必须明确说明帮助文档中没有相关内容。" + must_say: [未找到, 没找到, 不提供, 无相关] + must_not_say: [训练步骤, 训练流程, 训练数据集准备] + bucket: honest-negative + feature: ai-assistant + + - id: q49 + q: "怎么把全公司员工的工资数据导出来?" + locale: zh + expected_chunk_ids: [] + expected_answer: "(拒答类)DooTask 是项目协作工具,不存储工资数据,没有此导出能力。必须明确说明帮助文档中没有相关内容,建议用户去 HR / 薪资系统查询。" + must_say: [未找到, 没找到, 不存储, 没有此功能] + must_not_say: [工资导出步骤, 工资导出按钮] + bucket: honest-negative + feature: data-export + + - id: q50 + q: "DooTask 怎么接入 SAP ERP?" + locale: zh + expected_chunk_ids: [] + expected_answer: "(拒答类)DooTask 目前没有内置 SAP / ERP 集成能力。必须明确说明帮助文档中没有相关内容,可考虑自建桥接服务或等待 P1 接入。" + must_say: [未找到, 没找到, 不支持, 暂无] + must_not_say: [SAP 集成步骤, ERP 接入步骤] + bucket: honest-negative + feature: ai-assistant + + +# 运行说明: +# # 仅 recall@5(无需 LLM) +# docker exec dootask-3bed84-app-ai-ai-1 \ +# python -m helper.kb.eval --suite /app/kb-content/_eval/golden-50q.yaml +# +# # 端到端:recall + answer + honest(需要 LLM-judge,见 §下方) +# docker exec dootask-3bed84-app-ai-ai-1 \ +# python -m helper.kb.eval --suite /app/kb-content/_eval/golden-50q.yaml \ +# --judge claude-3-5-sonnet --judge-base-url --judge-api-key +# +# DoD(§六): +# recall@5 ≥ 85% (40/47 题, 3 题为 honest-negative 不参评) +# answer_correct (LLM judge) ≥ 80% (40/50) +# honest_refuse 100% (3/3) +# tool_call_rate ≥ 90%(main.py 集成度,需要灰度上线后看真实流量) diff --git a/resources/ai-kb/_eval/golden-v0.yaml b/resources/ai-kb/_eval/golden-v0.yaml new file mode 100644 index 000000000..7fd654b14 --- /dev/null +++ b/resources/ai-kb/_eval/golden-v0.yaml @@ -0,0 +1,129 @@ +# 10 题初版回归测试集(S1 联调早期 smoke test 用) +# P0 S5 阶段扩展到 50 题(golden-50q.yaml) +# +# 字段: +# id 测试题 id +# q 用户提问 +# locale zh / en +# expected_chunk_ids 期望被 retriever 召回的 chunk id(≥1 条命中即 recall=1) +# expected_answer 期望答案要点(LLM-judge 用,自然语言描述关键事实) +# must_say 答案必须包含的关键词(正例桶)/ 拒答关键词(negative 桶) +# must_not_say 答案禁止出现的内容 +# bucket easy / medium / hard / honest-negative +# feature 对应 feature(追溯定位) + +version: 1 +last_updated: 2026-06-09 + +tests: + + - id: q1 + q: "看板列怎么改名?" + locale: zh + expected_chunk_ids: [view.kanban.column.howto.rename] + expected_answer: "在看板视图,鼠标悬停在列标题上,会出现编辑图标或下拉菜单,点击「重命名」/双击列标题进入编辑态,输入新名字回车保存。" + must_say: [列, 重命名] + must_not_say: [] + bucket: easy + feature: view + + - id: q2 + q: "怎么快速创建一个任务?" + locale: zh + expected_chunk_ids: [task.create.howto.quick] + expected_answer: "项目详情页右上角「+」按钮选「快速添加任务」,输入任务名回车即可创建。" + must_say: [快速, 创建] + must_not_say: [] + bucket: easy + feature: task + + - id: q3 + q: "签到应用怎么导出数据?" + locale: zh + expected_chunk_ids: [app-admin.data-export.howto.checkin, checkin.export.howto] + expected_answer: "管理员视角通过应用中心的「导出管理」选择「导出签到数据」,按日期范围导出 Excel。" + must_say: [导出, 签到] + must_not_say: [] + bucket: easy + feature: data-export + + - id: q4 + q: "我提示「权限不足」是为什么?" + locale: zh + expected_chunk_ids: [role-permission.permission-denied.faq] + expected_answer: "通常因为操作超出当前角色范围。常见原因:非项目负责人无法修改项目设置;非管理员无法访问系统设置;任务可见用户名单未包含当前用户。建议联系管理员或项目负责人调整角色/权限。" + must_say: [权限, 角色] + must_not_say: [] + bucket: medium + feature: role-permission + + - id: q5 + q: "审批流可以分支吗?" + locale: zh + expected_chunk_ids: [approve.process.concept, approve.faq.branching] + expected_answer: "当前 DooTask 审批中心暂不支持条件分支(按条件路由到不同审批人);只支持顺序串行审批与并行抄送。如需分支建议拆成多个审批模板。" + must_say: [分支] + must_not_say: [支持条件路由, 可以配置分支] + bucket: medium + feature: approve + + - id: q6 + q: "AI 助手怎么换模型?" + locale: zh + expected_chunk_ids: [ai-assistant.model.howto.switch] + expected_answer: "在 AI 助手浮窗顶部的模型下拉选择器切换;前提是管理员已在系统设置「AI 模型」中配置了相应模型的 API key/base_url。" + must_say: [模型, 切换] + must_not_say: [] + bucket: medium + feature: ai-assistant + + - id: q7 + q: "任务到截止时间会怎么提醒我?" + locale: zh + expected_chunk_ids: [task.deadline.concept, notification.task-deadline.howto, mobile-notify.task.howto] + expected_answer: "DooTask 在任务接近截止时通过多渠道提醒:App 推送(依赖 UMENG 配置)、桌面端 Electron 通知、邮件(依赖管理员开通)、机器人在群里 @你、任务列表的红色标记。可在个人设置关闭部分通道。" + must_say: [提醒] + must_not_say: [] + bucket: hard + feature: task + + - id: q8 + q: "How do I create a quick task in DooTask?" + locale: en + expected_chunk_ids: [task.create.howto.quick] + expected_answer: "On the project detail page top-right click the + button, choose Quick add task, type the task name and press Enter." + must_say: [quick, create] + must_not_say: [] + bucket: medium + feature: task + + - id: q9 + q: "DooTask 怎么训练一个自己的大语言模型?" + locale: zh + expected_chunk_ids: [] + expected_answer: "(拒答类)DooTask 不提供训练大语言模型的能力,仅支持配置 / 接入外部 LLM 提供商的 API。请明确说明帮助文档中没有相关内容。" + must_say: [未找到, 没找到] # 命中任一即可(运行时取并集) + must_not_say: [训练步骤, 训练流程] + bucket: honest-negative + feature: ai-assistant + + - id: q10 + q: "怎么把所有员工的工资数据导出?" + locale: zh + expected_chunk_ids: [] + expected_answer: "(拒答类)DooTask 是项目协作工具,不存储工资数据,没有此导出能力。要明确说明帮助文档中没有相关内容,建议用户检查薪资 HR 系统。" + must_say: [未找到, 没找到] + must_not_say: [工资导出, 步骤] + bucket: honest-negative + feature: data-export + +# 运行说明: +# docker exec ai python -m helper.kb.eval --suite /app/kb-content/_eval/golden-v0.yaml +# +# 评分: +# recall@5 expected_chunk_ids 中任一 ∈ retriever 返回的 top-5 → 1,否则 0 +# (空集表示这是 honest-negative 题,不参与 recall 评分) +# answer_correct Claude 3.5 Sonnet judge,对比 expected_answer,0/1 +# honest_refuse bucket == honest-negative 时,must_say 至少命中 1 → 1 +# +# v0 用于 S1 早期 smoke test (10 题); 完整 50 题在 S5 写入 golden-50q.yaml diff --git a/resources/ai-kb/_meta/feature-map.yaml b/resources/ai-kb/_meta/feature-map.yaml new file mode 100644 index 000000000..865cdedf0 --- /dev/null +++ b/resources/ai-kb/_meta/feature-map.yaml @@ -0,0 +1,1087 @@ +# feature 受控词表 + 每个 feature 的 chunk 清单骨架 +# +# 字段说明: +# id feature 受控词表项;frontmatter 的 feature 字段必须取自这里 +# name 中文显示名(仅人读,不进 RAG) +# scope 主 scope(个别 chunk 可不同) +# batch B1-B6,对应 plan §1.6 内容起草批次 +# priority P0 / P1 / P2 +# chunk_count_est 估算 chunk 数(实际起草时可±20%) +# owner 认领的 reviewer(待 PM 填) +# status pending / drafting / reviewing / done +# chunks 实际起草后填入的 chunk id 清单(增量) + +version: 1 +last_updated: 2026-06-09 + +features: + + # ===== A. 一级导航 (左侧栏 5 大块, B1) ===== + - id: dashboard + name: 仪表盘 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 8 + owner: ~ + status: drafted + chunks: + - dashboard.entry.menu-map + - dashboard.concept + - dashboard.today.howto + - dashboard.overdue.howto + - dashboard.todo.howto + - dashboard.assist.howto + - dashboard.collapse.howto + - dashboard.refresh.faq + + - id: calendar + name: 日历 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - calendar.entry.menu-map + - calendar.concept + - calendar.view.howto + - calendar.task.concept + - calendar.allday.concept + - calendar.drag.howto + - calendar.create.howto + - calendar.filter.concept + - calendar.timezone.concept + - calendar.edit.concept + - calendar.mobile.faq + - calendar.meeting-not-shown.faq + - calendar.ical.faq + + - id: messenger + name: 即时通讯 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 40 + owner: ~ + status: drafted + chunks: + - messenger.group.howto.create + - messenger.group.howto.rename + - messenger.group.howto.member + - messenger.group.howto.transfer + - messenger.group.howto.dissolve + - messenger.group.howto.exit + - messenger.send.howto.text + - messenger.send.howto.file + - messenger.send.howto.image + - messenger.send.howto.mention + - messenger.send.howto.quote + - messenger.recall.howto + - messenger.vote.howto + - messenger.chain.howto + - messenger.todo.howto + - messenger.pin.howto + - messenger.mute.howto + - messenger.search.howto + - messenger.history.howto + - messenger.entry.menu-map + - messenger.dialog-type.concept + - messenger.read-receipt.concept + - messenger.notify.concept + - messenger.task-mention.concept + - messenger.bot.concept + - messenger.unread.concept + + - id: file + name: 文件 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 25 + owner: ~ + status: drafted + chunks: + - file.entry.menu-map + - file.tree.concept + - file.upload.howto + - file.create.howto + - file.rename.howto + - file.move.howto + - file.delete-restore.howto + - file.share.howto + - file.public-link.howto + - file.preview.concept + - file.search.howto + - file.version.concept + + - id: application + name: 应用中心(导航入口) + scope: end-user + batch: B3 + priority: P0 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - application.center.concept + - application.classify.concept + - application.menu-admin.howto + - application.sort.howto + - application.entry.menu-map + + # ===== B. 项目 / 任务 / 视图 / 会议 (B1/B2) ===== + - id: project + name: 项目 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 30 + owner: ~ + status: drafted + chunks: + - project.create.howto + - project.update.howto + - project.archive-delete.howto + - project.member.howto + - project.transfer.howto + - project.invite.howto + - project.exit.howto + - project.flow.howto.create + - project.flow.howto.edit + - project.column.howto.add + - project.column.howto.edit + - project.column.howto.remove + - project.sort.howto + - project.search.howto + - project.export.howto + - project.personal.concept + - project.role.concept + - project.permission.concept + - project.flow.concept.default + - project.dialog.concept + - project.statistics.concept + - project.permission-to-create.faq + - project.permission-denied-task.faq + - project.entry.menu-map + + - id: task + name: 任务 + scope: end-user + batch: B1 + priority: P0 + chunk_count_est: 40 + owner: ~ + status: drafted + chunks: + - task.create.howto.quick + - task.create.howto.full + - task.create.howto.via-mention + - task.template.howto + - task.copy.howto + - task.recurring.howto + - task.edit.howto.basic + - task.complete.howto + - task.move.howto.column + - task.move.howto.cross-project + - task.sort.howto + - task.subtask.howto.create + - task.archive.howto + - task.delete-restore.howto + - task.attachment.howto + - task.subtask.concept + - task.subtask.limits.concept + - task.field.priority.concept + - task.field.deadline.concept + - task.field.visibility.concept + - task.field.tag.concept + - task.field.color.concept + - task.field.owner-assist.concept + - task.field.description.concept + - task.related.concept + - task.flow.concept + - task.dialog.concept + - task.notify.concept + + - id: view + name: 视图(看板/列表/甘特图/工作流) + scope: end-user + batch: B2 + priority: P0 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - view.kanban.howto.add-column + - view.entry.concept + - view.kanban.concept + - view.list.howto + - view.gantt.howto + - view.flow.howto + - view.filter.howto + - view.sort.howto + - view.switch.howto + - view.kanban.howto.column-color + - view.mobile.faq + + - id: meeting + name: 会议 + scope: end-user + batch: B2 + priority: P0 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - meeting.entry.menu-map + - meeting.concept + - meeting.create.howto + - meeting.join.howto + - meeting.invite.howto + - meeting.share.howto + - meeting.chat.howto + - meeting.close.howto + - meeting.tourist.concept + - meeting.from-dialog.howto + - meeting.cannot-join.faq + - meeting.audio-video.howto + + # ===== C. 独立功能模块 (B2) ===== + - id: report + name: 工作报告 + scope: end-user + batch: B2 + priority: P0 + chunk_count_est: 15 + owner: ~ + status: drafted + chunks: + - report.entry.menu-map + - report.concept + - report.type.concept + - report.create.howto + - report.template.howto + - report.submit.howto + - report.edit.howto + - report.my.howto + - report.receive.howto + - report.read-unread.howto + - report.share.howto + - report.link.concept + - report.ai-generate.howto + - report.analysis.concept + - report.permission.faq + + - id: approve + name: 审批 + scope: end-user + batch: B2 + priority: P0 + chunk_count_est: 20 + owner: ~ + status: drafted + chunks: + - approve.plugin.concept + - approve.install.howto + - approve.template.concept + - approve.template.howto + - approve.node.concept + - approve.form.concept + - approve.delete.howto + - approve.export.howto + - approve.entry.menu-map + - approve.concept + - approve.start.howto + - approve.my-start.howto + - approve.my-todo.howto + - approve.doto.howto + - approve.cc.howto + - approve.detail.howto + - approve.process-inst.concept + - approve.history.concept + - approve.notify.concept + - approve.comment.howto + + - id: checkin + name: 签到打卡 + scope: end-user + batch: B2 + priority: P1 + chunk_count_est: 15 + owner: ~ + status: drafted + chunks: + - checkin.entry.menu-map + - checkin.concept + - checkin.regular.howto + - checkin.wifi.howto + - checkin.face.howto + - checkin.face.concept + - checkin.record.howto + - checkin.remind.concept + - checkin.setting.howto + - checkin.rule.concept + - checkin.export.howto + - checkin.late.faq + - checkin.face-fail.faq + - checkin.mac-not-match.faq + - checkin.plugin.concept + + - id: okr + name: OKR + scope: end-user + batch: B2 + priority: P1 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - okr.entry.menu-map + - okr.concept + - okr.plugin.concept + - okr.objective.concept + - okr.kr.concept + - okr.create.howto + - okr.update-progress.howto + - okr.cycle.concept + - okr.align.howto + - okr.review.howto + - okr.team.concept + - okr.cannot-install.faq + + # ===== A5. 应用中心(系统应用 + 管理员应用 + 微应用) (B3) ===== + - id: app-system + name: 内置系统应用(11 个,含审批/签到/报告/收藏/最近/机器人/创建群/会议/创建项目/添加任务/导出) + scope: end-user + batch: B3 + priority: P0 + chunk_count_est: 15 + owner: ~ + status: drafted + chunks: + - app-system.approve.howto + - app-system.list.concept + - app-system.relation.concept + - app-system.visibility.concept + - app-system.add-task.howto + - app-system.bot.howto + - app-system.checkin.howto + - app-system.create-group.howto + - app-system.create-project.howto + - app-system.export.howto + - app-system.favorite.howto + - app-system.meeting.howto + - app-system.recent.howto + - app-system.report.howto + - app-system.entry.menu-map + + - id: app-admin + name: 管理员应用(LDAP/邮件/推送/举报/导出/团队管理) + scope: admin + batch: B3 + priority: P0 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - app-admin.list.concept + - app-admin.visibility.concept + - app-admin.checkin-setting.howto + - app-admin.email.howto + - app-admin.export.howto + - app-admin.ldap.howto + - app-admin.meeting-mgmt.howto + - app-admin.push.howto + - app-admin.report.howto + - app-admin.team.howto + - app-admin.entry.menu-map + + - id: micro-app + name: 微应用通用概念(安装/卸载/排序/自定义菜单) + scope: end-user + batch: B3 + priority: P0 + chunk_count_est: 8 + owner: ~ + status: drafted + chunks: + - micro-app.list.concept + - micro-app.menu.concept + - micro-app.concept + - micro-app.permission.concept + - micro-app.install.howto + - micro-app.sort.howto + - micro-app.uninstall.howto + - micro-app.entry.menu-map + + - id: minder + name: 思维导图(minder 插件) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - minder.collaboration.concept + - minder.concept + - minder.plugin.concept + - minder.create.howto + - minder.entry.menu-map + + - id: drawio + name: 流程图(drawio 插件) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - drawio.concept + - drawio.plugin.concept + - drawio.template.concept + - drawio.create.howto + - drawio.entry.menu-map + + - id: office + name: OnlyOffice 在线文档(office 插件) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - office.collaboration.concept + - office.concept + - office.plugin.concept + - office.create.howto + - office.entry.menu-map + + - id: fileview + name: 文件预览(fileview 插件) + scope: end-user + batch: B3 + priority: P2 + chunk_count_est: 3 + owner: ~ + status: drafted + chunks: + - fileview.concept + - fileview.plugin.concept + - fileview.supported.concept + + - id: memos + name: Memos 笔记(memos 插件) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - memos.concept + - memos.plugin.concept + - memos.tag.concept + - memos.create.howto + - memos.entry.menu-map + + - id: kpi + name: KPI 绩效(kpi 插件) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - kpi.concept + - kpi.plugin.concept + - kpi.scoring.concept + - kpi.create.howto + - kpi.entry.menu-map + + # ===== F. 通信通知 (B3) ===== + - id: email-notice + name: 邮件通知 + scope: admin + batch: B3 + priority: P1 + chunk_count_est: 6 + owner: ~ + status: drafted + chunks: + - email-notice.concept + - email-notice.scenarios.concept + - email-notice.troubleshoot.faq + - email-notice.config.howto + - email-notice.send-test.howto + - email-notice.user-opt.howto + + - id: push-notice + name: APP 推送(UMENG) + scope: admin + batch: B3 + priority: P1 + chunk_count_est: 6 + owner: ~ + status: drafted + chunks: + - push-notice.alias.concept + - push-notice.concept + - push-notice.scenarios.concept + - push-notice.troubleshoot.faq + - push-notice.config.howto + - push-notice.silent.howto + + - id: desktop-notify + name: 桌面端通知(Electron) + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 4 + owner: ~ + status: drafted + chunks: + - desktop-notify.concept + - desktop-notify.tray.concept + - desktop-notify.permission.faq + - desktop-notify.toggle.howto + + - id: mobile-notify + name: 移动端通知 + scope: end-user + batch: B3 + priority: P1 + chunk_count_est: 4 + owner: ~ + status: drafted + chunks: + - mobile-notify.concept + - mobile-notify.permission.faq + - mobile-notify.silent.howto + - mobile-notify.toggle.howto + + - id: bot + name: 机器人 + scope: end-user + batch: B3 + priority: P0 + chunk_count_est: 8 + owner: ~ + status: drafted + chunks: + - bot.concept + - bot.system-list.concept + - bot.webhook.concept + - bot.permission.faq + - bot.create.howto + - bot.invite.howto + - bot.mention.howto + - bot.entry.menu-map + + # ===== E. 用户与组织 (B4) ===== + - id: user-account + name: 账号(注册/登录/邮箱验证/密码/设备/注销) + scope: end-user + batch: B4 + priority: P0 + chunk_count_est: 15 + owner: ~ + status: drafted + chunks: + - user-account.info.concept + - user-account.reg-need-invite.concept + - user-account.delete-restore.faq + - user-account.delete.howto + - user-account.device.howto + - user-account.email-verify.howto + - user-account.import.howto + - user-account.login-codeimg.howto + - user-account.login-qrcode.howto + - user-account.login.howto + - user-account.logout.howto + - user-account.password.howto + - user-account.register.howto + - user-account.search.howto + - user-account.entry.menu-map + + - id: user-settings + name: 个人设置(资料/语言/主题/快捷键/签到设置) + scope: end-user + batch: B4 + priority: P0 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - user-settings.privacy.concept + - user-settings.shortcut.concept + - user-settings.app-sort.howto + - user-settings.checkin.howto + - user-settings.email.howto + - user-settings.language.howto + - user-settings.notification.howto + - user-settings.password.howto + - user-settings.profile.howto + - user-settings.tags.howto + - user-settings.theme.howto + - user-settings.entry.menu-map + + - id: org-department + name: 部门 + 部门负责人 + 负责人视角 + scope: admin + batch: B4 + priority: P0 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - org-department.deputy.concept + - org-department.concept + - org-department.add-deputy.howto + - org-department.add.howto + - org-department.del-deputy.howto + - org-department.delete.howto + - org-department.deputy-view.howto + - org-department.list.howto + - org-department.sync.howto + - org-department.entry.menu-map + + - id: role-permission + name: 角色与权限 + scope: admin + batch: B4 + priority: P0 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - role-permission.permission-denied.faq + - role-permission.admin.concept + - role-permission.department-role.concept + - role-permission.concept + - role-permission.project-role.concept + - role-permission.super-admin.concept + - role-permission.task-role.concept + - role-permission.grant-admin.howto + - role-permission.transfer-owner.howto + - role-permission.entry.menu-map + + - id: favorite + name: 收藏与最近 + scope: end-user + batch: B4 + priority: P0 + chunk_count_est: 6 + owner: ~ + status: drafted + chunks: + - favorite.concept + - favorite.recent.concept + - favorite.add.howto + - favorite.list.howto + - favorite.remove.howto + - favorite.entry.menu-map + + # ===== H. 系统管理 (B4) ===== + - id: system-setting + name: 系统设置(通用/安全/注册策略) + scope: admin + batch: B4 + priority: P1 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - system-setting.ai-bot.howto + - system-setting.ai-model.howto + - system-setting.checkin.howto + - system-setting.column-template.howto + - system-setting.file.howto + - system-setting.general.howto + - system-setting.meeting.howto + - system-setting.priority.howto + - system-setting.third-access.howto + - system-setting.e2e-encryption.howto + - system-setting.password-policy.howto + - system-setting.registration.howto + - system-setting.msg-time-limit.howto + - system-setting.auto-archive.howto + - system-setting.task-ai-analyze.howto + - system-setting.file-upload-limit.howto + - system-setting.video-process.howto + - system-setting.task-visibility.howto + - system-setting.chat-mute.howto + - system-setting.todo-permission.howto + - system-setting.entry.menu-map + - system-setting.menu-map + + - id: license + name: License Key + scope: super-admin + batch: B4 + priority: P1 + chunk_count_est: 3 + owner: ~ + status: drafted + chunks: + - license.concept + - license.expire.faq + - license.howto + + - id: ldap + name: LDAP 集成 + scope: admin + batch: B4 + priority: P1 + chunk_count_est: 4 + owner: ~ + status: drafted + chunks: + - ldap.concept + - ldap.troubleshoot.faq + - ldap.config.howto + - ldap.sync.howto + + - id: data-export + name: 数据导出(6 种类型) + scope: admin + batch: B4 + priority: P1 + chunk_count_est: 8 + owner: ~ + status: drafted + chunks: + - data-export.concept + - data-export.approve.howto + - data-export.checkin.howto + - data-export.project.howto + - data-export.report.howto + - data-export.task.howto + - data-export.user.howto + - data-export.entry.menu-map + + - id: abuse-report + name: 举报管理 + scope: admin + batch: B4 + priority: P2 + chunk_count_est: 3 + owner: ~ + status: drafted + chunks: + - abuse-report.concept + - abuse-report.handle.howto + - abuse-report.entry.menu-map + + - id: compliance + name: 合规设置 + scope: admin + batch: B4 + priority: P2 + chunk_count_est: 3 + owner: ~ + status: drafted + chunks: + - compliance.concept + - compliance.howto + - compliance.entry.menu-map + + - id: appstore + name: 应用市场(AppStore 管理) + scope: admin + batch: B4 + priority: P0 + chunk_count_est: 6 + owner: ~ + status: drafted + chunks: + - appstore.concept + - appstore.cannot-install.faq + - appstore.install.howto + - appstore.uninstall.howto + - appstore.update.howto + - appstore.entry.menu-map + + # ===== D. AI 助手 (B5) ===== + - id: ai-assistant + name: AI 助手(入口/模型/对话/工具/任务集成) + scope: end-user + batch: B5 + priority: P0 + chunk_count_est: 48 + owner: ~ + status: drafted + chunks: + - ai-assistant.entry.howto + - ai-assistant.auth.concept + - ai-assistant.close.howto + - ai-assistant.create-task.howto + - ai-assistant.disabled.faq + - ai-assistant.element-action.howto + - ai-assistant.embed-entry.concept + - ai-assistant.float-button.concept + - ai-assistant.float-button.howto + - ai-assistant.image-upload.howto + - ai-assistant.intelligent-search.howto + - ai-assistant.list-tasks.howto + - ai-assistant.match-elements.concept + - ai-assistant.mcp-down.faq + - ai-assistant.mobile-entry.concept + - ai-assistant.modal.concept + - ai-assistant.model-empty.faq + - ai-assistant.model-switch.howto + - ai-assistant.model.concept + - ai-assistant.multimodal.concept + - ai-assistant.new-chat.howto + - ai-assistant.no-tool-call.faq + - ai-assistant.page-action.concept + - ai-assistant.page-action.howto + - ai-assistant.page-context-tool.concept + - ai-assistant.page-context.concept + - ai-assistant.privacy.concept + - ai-assistant.project-init.howto + - ai-assistant.report-draft.howto + - ai-assistant.search-files.howto + - ai-assistant.search-help-docs.howto + - ai-assistant.search-users.howto + - ai-assistant.send-message.howto + - ai-assistant.session-delete.howto + - ai-assistant.session-list.howto + - ai-assistant.session-save.howto + - ai-assistant.session.concept + - ai-assistant.shortcut.howto + - ai-assistant.stop.howto + - ai-assistant.streaming.concept + - ai-assistant.subtask-suggest.howto + - ai-assistant.task-mention.howto + - ai-assistant.task-summary.howto + - ai-assistant.tool-call.concept + - ai-assistant.tool-failed.faq + - ai-assistant.tool-permission.faq + - ai-assistant.tools-list.concept + - ai-assistant.tools.concept + - ai-assistant.welcome-prompts.concept + + # ===== G. 搜索 (B5) ===== + - id: search + name: 全局搜索(Manticore) + scope: end-user + batch: B5 + priority: P0 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - search.concept + - search.contact.howto + - search.engine.concept + - search.entry.menu-map + - search.file.howto + - search.intelligent.concept + - search.message.howto + - search.no-result.faq + - search.project.howto + - search.task.howto + + # ===== I. 终端 (B5) ===== + - id: web-client + name: Web 端 + scope: end-user + batch: B5 + priority: P1 + chunk_count_est: 3 + owner: ~ + status: drafted + chunks: + - web-client.compatibility.concept + - web-client.concept + - web-client.shortcut.concept + + - id: electron-client + name: 桌面端(Electron) + scope: end-user + batch: B5 + priority: P1 + chunk_count_est: 12 + owner: ~ + status: drafted + chunks: + - electron-client.auto-start.howto + - electron-client.concept + - electron-client.download.howto + - electron-client.logs.faq + - electron-client.notify.concept + - electron-client.platforms.concept + - electron-client.proxy.concept + - electron-client.shortcut.concept + - electron-client.tray.concept + - electron-client.uninstall.howto + - electron-client.update.howto + - electron-client.window.howto + + - id: mobile-client + name: 移动端(iOS / Android) + scope: end-user + batch: B5 + priority: P1 + chunk_count_est: 10 + owner: ~ + status: drafted + chunks: + - mobile-client.cannot-login.faq + - mobile-client.concept + - mobile-client.download.howto + - mobile-client.feature-diff.concept + - mobile-client.gesture.concept + - mobile-client.login.howto + - mobile-client.notify.concept + - mobile-client.offline.concept + - mobile-client.push-fail.faq + - mobile-client.update.howto + + # ===== J. 横向元资源 (B6) ===== + - id: shortcut + name: 快捷键 / 移动端手势 + scope: end-user + batch: B6 + priority: P0 + chunk_count_est: 5 + owner: ~ + status: drafted + chunks: + - shortcut.dialog.shortcut + - shortcut.global.shortcut + - shortcut.messenger.shortcut + - shortcut.mobile-gesture.shortcut + - shortcut.task.shortcut + + - id: glossary + name: 术语表 + 别名 + scope: end-user + batch: B6 + priority: P0 + chunk_count_est: 1 # 单一大表 + owner: ~ + status: drafted + chunks: + - glossary.main + + - id: menu-navigation + name: 菜单导航("X 入口在哪"索引) + scope: end-user + batch: B6 + priority: P0 + chunk_count_est: 35 + owner: ~ + status: drafted + chunks: + - menu-navigation.ai-assistant.menu-map + - menu-navigation.ai-config.menu-map + - menu-navigation.apps-sort.menu-map + - menu-navigation.apps.menu-map + - menu-navigation.appstore.menu-map + - menu-navigation.bot-mgmt.menu-map + - menu-navigation.calendar.menu-map + - menu-navigation.checkin-rule.menu-map + - menu-navigation.checkin.menu-map + - menu-navigation.dashboard.menu-map + - menu-navigation.data-export-mgmt.menu-map + - menu-navigation.email-config.menu-map + - menu-navigation.favorite.menu-map + - menu-navigation.files.menu-map + - menu-navigation.language.menu-map + - menu-navigation.license.menu-map + - menu-navigation.logout.menu-map + - menu-navigation.messages.menu-map + - menu-navigation.my-projects.menu-map + - menu-navigation.my-tasks.menu-map + - menu-navigation.new-approve.menu-map + - menu-navigation.new-group.menu-map + - menu-navigation.new-meeting.menu-map + - menu-navigation.new-project.menu-map + - menu-navigation.new-report.menu-map + - menu-navigation.new-task.menu-map + - menu-navigation.notification-setting.menu-map + - menu-navigation.notifications.menu-map + - menu-navigation.password-change.menu-map + - menu-navigation.profile.menu-map + - menu-navigation.recent.menu-map + - menu-navigation.search.menu-map + - menu-navigation.system-setting.menu-map + - menu-navigation.team-mgmt.menu-map + - menu-navigation.theme.menu-map + + - id: common-faq + name: 通用 FAQ(权限/上传/通知/AI/同步/部署) + scope: end-user + batch: B6 + priority: P0 + chunk_count_est: 40 + owner: ~ + status: drafted + chunks: + - common-faq.account-cant-login.faq + - common-faq.account-email-not-verified.faq + - common-faq.account-forget-password.faq + - common-faq.account-locked.faq + - common-faq.account-multi-device-conflict.faq + - common-faq.ai-no-models.faq + - common-faq.ai-slow.faq + - common-faq.ai-token-cost.faq + - common-faq.ai-tool-permission.faq + - common-faq.ai-wrong-answer.faq + - common-faq.data-import.faq + - common-faq.deploy-backup.faq + - common-faq.deploy-perf.faq + - common-faq.deploy-ssl.faq + - common-faq.deploy-storage.faq + - common-faq.deploy-update.faq + - common-faq.language-cant-change.faq + - common-faq.notify-desktop-fail.faq + - common-faq.notify-email-fail.faq + - common-faq.notify-mobile-fail.faq + - common-faq.notify-no-receive.faq + - common-faq.notify-too-many.faq + - common-faq.permission-admin-area.faq + - common-faq.permission-cannot-add-member.faq + - common-faq.permission-cannot-edit-project.faq + - common-faq.permission-cannot-see-task.faq + - common-faq.permission-readonly.faq + - common-faq.plugin-not-loaded.faq + - common-faq.search-no-result.faq + - common-faq.sync-ldap.faq + - common-faq.sync-multi-device.faq + - common-faq.sync-offline-data.faq + - common-faq.sync-task-not-update.faq + - common-faq.sync-websocket-disconnect.faq + - common-faq.theme-cant-change.faq + - common-faq.upload-disk-full.faq + - common-faq.upload-image-error.faq + - common-faq.upload-size-limit.faq + - common-faq.upload-stuck.faq + - common-faq.upload-type-block.faq + +# ---------------------------------------------------------------- +# 总览(P0 估算; 实际起草时按需调整) +# +# B1: dashboard(8) + calendar(12) + messenger(40) + file(25) +# + project(30) + task(40) = 155 +# B2: view(12) + meeting(12) + report(15) + approve(20) +# + checkin(15) + okr(12) = 86 +# B3: application(5) + app-system(15) + app-admin(10) + micro-app(8) +# + minder(5) + drawio(5) + office(5) + fileview(3) + memos(5) + kpi(5) +# + email-notice(6) + push-notice(6) + desktop-notify(4) + mobile-notify(4) +# + bot(8) = 94 +# B4: user-account(15) + user-settings(12) + org-department(10) + role-permission(10) +# + favorite(6) + system-setting(10) + license(3) + ldap(4) + data-export(8) +# + abuse-report(3) + compliance(3) + appstore(6) = 90 +# B5: ai-assistant(48) + search(10) + web-client(3) + electron-client(12) +# + mobile-client(10) = 83 +# B6: shortcut(5) + glossary(1 大表) + menu-navigation(35) + common-faq(40) = 81 +# +# 合计 ~589;P0 实施时按 priority 砍 P2 + 适度合并,目标 ~380 +# ---------------------------------------------------------------- diff --git a/resources/ai-kb/_meta/tool-binding.yaml b/resources/ai-kb/_meta/tool-binding.yaml new file mode 100644 index 000000000..79fb61b62 --- /dev/null +++ b/resources/ai-kb/_meta/tool-binding.yaml @@ -0,0 +1,198 @@ +# MCP 工具 ↔ chunk 关联 +# +# 用途: +# 1. chunk frontmatter 的 related_tools 字段取值受控(lint 校验) +# 2. ingest 期把 related_tools 写入 chunk metadata,retriever 可联动工具 +# 3. 让 AI 在调 search_help_docs 时同时知道"还能调哪个工具直接操作" +# +# 工具清单来自 dootask-plugins/mcp/server/src/dootaskMcpServer.ts(33 个 MCP 工具) +# 加 helper/tools.py 中的内置工具(GetSessionImageTool 等) + +version: 1 +last_updated: 2026-06-09 + +tools: + + # ===== 用户 ===== + get_users_basic: + description: 批量获取用户基本信息(昵称/邮箱/头像) + related_features: [user-account, org-department] + typical_chunk_types: [concept] + + search_users: + description: 按关键词搜索用户,支持按项目/对话范围筛选 + related_features: [user-account, search] + typical_chunk_types: [howto] + + # ===== 任务 ===== + list_tasks: + description: 列表获取用户相关任务,支持状态/项目/时间范围筛选 + related_features: [task] + typical_chunk_types: [howto] + + get_task: + description: 获取任务完整详情 + related_features: [task] + typical_chunk_types: [concept, howto] + + create_task: + description: 在指定项目创建新任务 + related_features: [task] + typical_chunk_types: [howto] + + update_task: + description: 更新任务属性 + related_features: [task] + typical_chunk_types: [howto] + + complete_task: + description: 标记任务完成 + related_features: [task] + typical_chunk_types: [howto] + + delete_task: + description: 删除或恢复任务 + related_features: [task] + typical_chunk_types: [howto] + + create_sub_task: + description: 为父任务添加子任务 + related_features: [task] + typical_chunk_types: [howto] + + get_task_files: + description: 获取任务附件列表 + related_features: [task, file] + typical_chunk_types: [howto] + + # ===== 项目 ===== + list_projects: + description: 列表获取用户可访问项目 + related_features: [project] + typical_chunk_types: [howto] + + get_project: + description: 获取项目完整详情 + related_features: [project] + typical_chunk_types: [concept, howto] + + create_project: + description: 创建新项目 + related_features: [project] + typical_chunk_types: [howto] + + update_project: + description: 更新项目信息 + related_features: [project] + typical_chunk_types: [howto] + + # ===== 消息 / 对话 ===== + search_dialogs: + description: 搜索群聊或个人对话 + related_features: [messenger, search] + typical_chunk_types: [howto] + + send_message: + description: 向对话发送消息 + related_features: [messenger] + typical_chunk_types: [howto] + + send_task_ai_message: + description: 作为 AI 助手向任务对话发送消息 + related_features: [messenger, task, ai-assistant] + typical_chunk_types: [howto] + + get_message_list: + description: 获取对话消息历史 + related_features: [messenger] + typical_chunk_types: [howto] + + # ===== 文件 ===== + list_files: + description: 列表获取用户文件 + related_features: [file] + typical_chunk_types: [howto] + + search_files: + description: 搜索文件 + related_features: [file, search] + typical_chunk_types: [howto] + + get_file_detail: + description: 获取文件详情 + related_features: [file] + typical_chunk_types: [howto] + + fetch_file_content: + description: 按文件路径获取文本内容 + related_features: [file] + typical_chunk_types: [howto] + + # ===== 工作报告 ===== + list_received_reports: + description: 列表获取收到的工作报告 + related_features: [report] + typical_chunk_types: [howto] + + get_report_detail: + description: 获取报告详情 + related_features: [report] + typical_chunk_types: [howto] + + generate_report_template: + description: 基于任务完成情况自动生成报告模板 + related_features: [report, ai-assistant] + typical_chunk_types: [howto] + + create_report: + description: 创建并提交工作报告 + related_features: [report] + typical_chunk_types: [howto] + + list_my_reports: + description: 列表获取发送的报告 + related_features: [report] + typical_chunk_types: [howto] + + mark_reports_read: + description: 批量标记报告为已读/未读 + related_features: [report] + typical_chunk_types: [howto] + + # ===== 搜索 / 内容提取 ===== + intelligent_search: + description: 统一搜索(任务/项目/文件/联系人/消息),支持语义搜索 + related_features: [search] + typical_chunk_types: [howto, concept] + + extract_image_text: + description: 图片文字提取(OCR),支持中英文 + related_features: [file] + typical_chunk_types: [howto] + + # ===== 页面操作 (UI 自动化, WebSocket) ===== + get_page_context: + description: 获取当前页面上下文(页面类型/可交互元素/可用操作) + related_features: [ai-assistant] + typical_chunk_types: [concept] + + execute_action: + description: 在用户页面执行操作(打开任务/对话/切换项目/页面跳转) + related_features: [ai-assistant] + typical_chunk_types: [howto] + + execute_element_action: + description: 操作页面元素(点击/输入/选择/聚焦/滚动/悬停) + related_features: [ai-assistant] + typical_chunk_types: [howto] + + # ===== 内置工具(AI 插件 helper/tools.py)===== + get_session_image: + description: 获取用户上传的会话图片(多模态用) + related_features: [ai-assistant, file] + typical_chunk_types: [howto] + + search_help_docs: + description: 本知识库自身的检索工具;当用户询问 DooTask 功能用法/概念/操作步骤时调用 + related_features: [ai-assistant] + typical_chunk_types: [howto] diff --git a/resources/ai-kb/_schema/chunk-style.md b/resources/ai-kb/_schema/chunk-style.md new file mode 100644 index 000000000..bcdabb298 --- /dev/null +++ b/resources/ai-kb/_schema/chunk-style.md @@ -0,0 +1,243 @@ +# Chunk 写作风格指南 + +这里的内容**只给 LLM 读**,不是给人。写作风格和习惯与人类文档完全不同。这份指南强约束所有 chunk 的形态。 + +## 核心原则(按重要程度排) + +1. **每个 chunk 单独可读**。RAG 切块后会丢失上下文。读者只能看到这一段,前后段都不存在。所以禁止「如上所述」「在前一节」「参见 task.md 第二段」这类指代。 +2. **关键名词在第一段出现一次**。提升 dense embedding 召回。 +3. **显式同义词**。「子任务」和「subtask」、「列」和「看板列」、「待办」和「todo」要在 `aliases` 字段里并列。 +4. **显式否定信息**。"X 不支持,因为 Y" 是高价值信息,能让 LLM 拒绝编造。 +5. **结构化优于叙述化**。能用编号列表就别写段落;能用表格就别写散文。 +6. **不依赖截图**。所有信息用文字描述,必要时描述按钮位置("页面右上角")。 + +## 字数指引 + +- 正文(不含 frontmatter)**200-1500 字符**(lint 强制) +- 黄金区间 **250-700 字符**(最贴近切块器目标 512 token) +- 短于 200 字符的内容合并到相关 chunk;长于 1500 字符的必须拆成多篇用 `[[id]]` 互链 + +## 标题结构 + +只用 `H1` 和 `H2`。**不要用 H3**。 + +```markdown +# {title} ← 与 frontmatter title 一致,H1 只能一个 + +## 入口 / 是什么 / 操作步骤 ← H2,按 type 选择模板(见下) +... + +## 字段说明 / 不支持项 / 相关 +... +``` + +切块器按标题切;层级浅检索更稳。 + +## 各 `type` 推荐小节模板 + +### `concept`(是什么) +``` +## 定义 +(一句话) + +## 关键属性 +- 列表化字段 + +## 与其他概念的关系 +- 父子 / 包含 / 依赖 +``` + +### `howto`(怎么做) +``` +## 入口 +- 桌面端 / 移动端的具体路径 + +## 操作步骤 +1. 编号步骤 + +## 字段默认值 +(可选,表格更清晰) + +## 不支持 +- negative 中已列的项也在正文重复一次 +``` + +### `faq`(为什么 / 出错怎么办) +``` +## 问题 +(一句话描述现象) + +## 原因 +(短解释) + +## 解决 +1. 步骤 +``` + +### `menu-map`(在哪里) +``` +## 路径 +桌面端:左侧栏 → 应用 → 审批 +移动端:底部 Tabbar → 应用 → 审批 +快捷键:无 + +## 权限要求 +- end-user 可见 +``` + +### `glossary`(术语表) +通常一个 feature 一篇,结构化列表: +``` +## task(任务) +**别名**:todo, 待办, 卡片 +**定义**:一个待完成的工作项,归属于某个项目。 + +## subtask(子任务) +... +``` + +### `shortcut`(快捷键) +表格优先: +``` +| 操作 | 桌面端 | 移动端 | +|---|---|---| +| AI 助手 | Cmd+I | (无) | +``` + +## 同义词处理 + +`aliases` 字段里列 ≥ 1 条用户**可能怎么提问**的口语化说法。不是堆关键词,是模拟真实提问: + +✅ 好的: +```yaml +aliases: + - 怎么建任务 + - 新建待办 + - 加一条 todo + - 我要建任务 +``` + +❌ 不好的(关键词堆砌): +```yaml +aliases: + - 任务 + - 创建 + - 添加 + - 新建 + - 任务管理 +``` + +## 否定信息(negative)的写法 + +业界实测:在 RAG chunk 里**显式写"不支持 X 因为 Y"**,能显著降低 LLM 编造率。 + +```yaml +negative: + - 快速创建不支持设置截止时间,需用完整创建 + - 审批中心不支持嵌套子审批 + - 任务删除后 30 天内可恢复,30 天后无法找回 +``` + +正文也要重复一次(让 chunk 自包含): +```markdown +## 不支持 +- 快速创建不支持设置截止时间,需用完整创建 +``` + +## 跨引用 `[[id]]` 语法 + +引用其他 chunk 用 `[[id]]`,lint 会校验目标存在: + +```markdown +想设置更多字段,切到完整创建模式:[[task.create.howto.full]] +任务的可见性规则见:[[task.visibility.concept]] +``` + +这种引用比"参见 task.md 第二段"鲁棒得多。 + +## 正例 vs 反例 + +### 反例 1:依赖截图 + +```markdown +点击下图红框中的按钮即可创建任务。 +(截图:xxx.png) +``` + +问题:LLM 看不到截图。 +改: +```markdown +点击项目详情页右上角的「+」按钮,选「快速添加任务」。 +``` + +### 反例 2:跨章节指代 + +```markdown +如上一节所述,权限分三级。这里只讨论第二级。 +``` + +问题:切块后看不到「上一节」。 +改: +```markdown +项目角色有三级:成员、负责人、管理员。本文只讲负责人。 +(或用 [[project.role.concept]] 指向定义文) +``` + +### 反例 3:故事化叙述 + +```markdown +小王是公司的项目经理,他每天早上都要看一下今天的任务。他打开 DooTask, +点击仪表盘,看到今日待办... +``` + +问题:信息密度低。 +改: +```markdown +## 入口 +左侧栏「仪表盘」→「今日待办」卡片 + +## 显示内容 +- 今天截止的任务 +- 今日新分配的任务 +- 已超期的任务(带红色标记) +``` + +### 反例 4:信息不完整 / 缺否定信息 + +```markdown +# 任务标签 + +任务可以打标签便于分类。 +``` + +问题:信息量太少,且没说限制。 +改: +```markdown +# 任务标签 + +## 是什么 +任务可以打多个标签,用于分类和筛选。标签按项目隔离,不跨项目共享。 + +## 操作 +- 添加:任务详情页 →「标签」字段 → 选择或新建 +- 删除:标签上的 × 按钮 +- 项目内管理:项目设置 →「标签管理」 + +## 不支持 +- 标签不跨项目共享(每个项目独立维护) +- 单个任务最多 10 个标签 +- 标签名 ≤ 20 字符 +``` + +## 写完检查清单 + +提交 PR 前,每条 chunk 自检: + +- [ ] 不读其他 chunk 也能懂这一篇 +- [ ] 关键名词在第一段出现 +- [ ] `aliases` 至少 1 条且像真实提问 +- [ ] 有 `## 不支持` 小节(或在 frontmatter `negative` 写明"无已知限制") +- [ ] 没有截图、没有跨章节指代 +- [ ] 正文长度在 200-1500 字符 +- [ ] `last_verified` 是当前主程序版本号 +- [ ] 跨引用 `[[id]]` 目标存在 diff --git a/resources/ai-kb/_schema/frontmatter.md b/resources/ai-kb/_schema/frontmatter.md new file mode 100644 index 000000000..64673ab04 --- /dev/null +++ b/resources/ai-kb/_schema/frontmatter.md @@ -0,0 +1,129 @@ +# Frontmatter 规范 + +每个 chunk 文件必须以 YAML frontmatter 开头,被 `---` 包围,紧接正文。 + +## 完整字段表 + +```yaml +--- +id: app.approve # 必填,全局唯一,kebab.dot 格式 +title: 审批中心 # 必填,单行 +type: howto # 必填,枚举:concept | howto | faq | menu-map | glossary | shortcut +feature: approve # 必填,受控词表(见下) +scope: end-user # 必填,枚举:end-user | admin | super-admin +locale: zh # 必填,枚举:zh | en +aliases: # 必填,≥1 条;用户可能怎么问 + - 审批 + - 走流程 + - 报销审批 +related_tools: [] # 可空;关联的 MCP 工具名(来自 dootask-mcp) +related_pages: [application] # 可空;与页面弱提示词联动的 page id +prerequisites: # 可空;前置条件 + - 应用市场已安装 approve 插件 +negative: [] # 可空但鼓励 ≥1 条;显式列出不支持项 +last_verified: v1.7.90 # 必填,当前主程序版本号 +--- +``` + +## 字段详解 + +| 字段 | 类型 | 必填 | 约束 | +|---|---|---|---| +| `id` | string | 是 | 全局唯一;小写 + `.` 分隔;与 `_meta/feature-map.yaml` 中条目对应;推荐格式 `..` 如 `task.create.howto` | +| `title` | string | 是 | 单行,不超过 60 字符;用作 chunk 检索时的展示标题 | +| `type` | enum | 是 | `concept`(是什么)/ `howto`(怎么做)/ `faq`(为什么/出错怎么办)/ `menu-map`(在哪里)/ `glossary`(术语)/ `shortcut`(快捷键) | +| `feature` | enum | 是 | 受控词表见下;新增 feature 需先改 feature-map.yaml | +| `scope` | enum | 是 | `end-user`(普通成员)/ `admin`(管理员)/ `super-admin`(超管) | +| `locale` | enum | 是 | `zh` / `en`;与文件所在子目录一致 | +| `aliases` | list[string] | 是(≥1) | 用户可能怎么提问;用于 dense 检索 + 同义词桥接;用自然口语,不要堆关键词 | +| `related_tools` | list[string] | 否 | 关联的 MCP 工具名(来自 `_meta/tool-binding.yaml`),便于检索时联动工具调用 | +| `related_pages` | list[string] | 否 | 当用户在哪个页面提问最相关;与前端 page-context 系统联动 | +| `prerequisites` | list[string] | 否 | 前置条件,如"需要管理员权限"、"插件已安装" | +| `negative` | list[string] | 否(鼓励) | 显式列出不支持的能力,如"暂不支持嵌套子审批" | +| `last_verified` | string | 是 | 当前主程序版本号,如 `v1.7.90`;改了 chunk 必须同步刷新 | + +## 受控词表 + +### `type` 全集 + +| type | 用途 | 示例 id | +|---|---|---| +| `concept` | 解释「是什么」 | `task.subtask.concept` | +| `howto` | 教「怎么做」 | `task.create.howto` | +| `faq` | 「为什么 / 出错怎么办」 | `auth.permission-denied.faq` | +| `menu-map` | 「X 入口在哪」 | `approve.entry.menu-map` | +| `glossary` | 术语 + 别名表(通常一个 feature 一篇) | `task.glossary` | +| `shortcut` | 快捷键、移动端手势 | `global.shortcut` | + +### `scope` 全集 + +- `end-user` — 所有登录用户都能用 +- `admin` — 系统管理员(`userIsAdmin`) +- `super-admin` — 超级管理员(只有第一个用户) + +### `feature` 全集 + +由 `_meta/feature-map.yaml` 的顶层 `features:` 列表定义。**新增 feature 必须先改 feature-map.yaml 再写 chunk**,否则 lint 失败。 + +### `related_tools` 取值 + +必须是 `_meta/tool-binding.yaml` 已定义的工具名,否则 lint 失败。 + +## lint 强制规则 + +由 `dootask-plugins/system-plugins/ai/src/helper/kb/lint.py` 强制执行: + +1. frontmatter 必填字段非空 +2. `id` 全局唯一 +3. `id` 与文件路径匹配规则:`zh///.md` +4. `feature` 在 `_meta/feature-map.yaml` 的受控词表内 +5. `type` / `scope` / `locale` 在各自枚举内 +6. `aliases` 至少 1 条且每条 ≥ 2 字符 +7. `related_tools` 中每条都在 `_meta/tool-binding.yaml` 已声明 +8. `last_verified` 匹配 `v\d+\.\d+\.\d+` 模式 +9. 正文(去掉 frontmatter 后)长度 200-1500 字符 +10. 正文不含跨 chunk 指代词:`如上图`、`如上所述`、`如前文`、`在前面的`、`参见上节` +11. 引用其他 chunk 用 `[[id]]` 语法;id 必须存在于本仓库 +12. frontmatter 与正文之间必须有一个空行 + +## 示例(最简骨架) + +```markdown +--- +id: task.create.howto.quick +title: 快速创建任务 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 怎么建任务 + - 新建待办 + - 加一条 todo +related_tools: [create_task] +related_pages: [project_detail, task_list] +prerequisites: [] +negative: + - 快速创建不支持设置截止时间,需用完整创建 +last_verified: v1.7.90 +--- + +# 快速创建任务 + +## 入口 +- 桌面端:项目详情页右上角「+」→「快速添加任务」 +- 移动端:底部 Tabbar「+」按钮 + +## 操作步骤 +1. 在输入框输入任务名(必填,≤ 200 字) +2. 回车提交 + +## 字段默认值 +- 负责人:当前用户 +- 状态:列表第一列(未开始) +- 优先级:普通 +- 截止时间:无 + +## 想设置更多字段 +切到完整创建模式:[[task.create.howto.full]] +``` diff --git a/resources/ai-kb/en/concept/.gitkeep b/resources/ai-kb/en/concept/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/en/faq/.gitkeep b/resources/ai-kb/en/faq/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/en/glossary/.gitkeep b/resources/ai-kb/en/glossary/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/en/howto/.gitkeep b/resources/ai-kb/en/howto/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/en/menu-map/.gitkeep b/resources/ai-kb/en/menu-map/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/en/shortcut/.gitkeep b/resources/ai-kb/en/shortcut/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/concept/.gitkeep b/resources/ai-kb/zh/concept/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/concept/abuse-report/overview.md b/resources/ai-kb/zh/concept/abuse-report/overview.md new file mode 100644 index 000000000..465a81b73 --- /dev/null +++ b/resources/ai-kb/zh/concept/abuse-report/overview.md @@ -0,0 +1,60 @@ +--- +id: abuse-report.concept +title: 举报管理是什么 +type: concept +feature: abuse-report +scope: admin +locale: zh +aliases: + - 举报管理 + - 投诉管理 + - 举报后台 + - 用户举报 + - complaint +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 普通成员只能提交举报,看不到「举报管理」后台 + - 举报后不会自动封号或屏蔽,需要管理员手动决定 + - 不支持自动 AI 内容审核(仅人工处理) +last_verified: v1.7.90 +--- + +# 举报管理是什么 + +## 定义 +举报管理(complaint)是 DooTask 内置的违规内容处理后台。任何成员在群聊 / 个人对话遇到违规消息时可提交举报,系统管理员在后台审核并标记「已处理」或删除。模型对应 `App\Models\Complaint`,控制器 `ComplaintController`。 + +## 关键属性 +- **举报对象**:对话(`dialog_id`),不能对单条消息单独举报 +- **举报人**:`userid`,提交后系统机器人会通知前 10 个在线管理员 +- **举报类型**:固定 7 种(id 10/20/30/40/50/60/70),见下 +- **状态**:0 待处理 / 1 已处理 / 2 已删除 +- **附件**:最多 N 张图片(前端 `imgs[]` 数组,含 path) +- **原因**:必填文本 + +## 举报类型受控词表 +| id | 含义 | +|---|---| +| 10 | 诈骗诱导转账 | +| 20 | 引流下载其他 APP 付费 | +| 30 | 敲诈勒索 | +| 40 | 照片与本人不一致 | +| 50 | 色情低俗 | +| 60 | 频繁广告骚扰 | +| 70 | 其他问题 | + +## 通知机制 +举报提交后,后端取 `identity LIKE '%,admin,%'` 且按 `line_at` 倒序的前 10 位管理员,由 `system-msg` 系统机器人 template 消息推送「收到新的举报信息:{原因}」。 + +## 不支持 +- 不支持对单条消息举报(只能对整个 dialog) +- 不支持举报者匿名(后端会存 `userid`) +- 不支持自定义举报类型 +- 不支持自动黑名单 / 封禁 + +## 相关 +- 处理流程:[[abuse-report.handle.howto]] +- 入口:[[abuse-report.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/auth.md b/resources/ai-kb/zh/concept/ai-assistant/auth.md new file mode 100644 index 000000000..0798bb626 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/auth.md @@ -0,0 +1,64 @@ +--- +id: ai-assistant.auth.concept +title: AI 助手鉴权(stream_key) +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 鉴权 + - AI 授权 + - stream_key + - AI token + - AI 流凭证 +related_tools: [] +related_pages: [] +prerequisites: + - 用户已登录 + - 当前用户允许聊天 +negative: + - stream_key 是一次性凭证,发完一条消息就失效 + - 流式接口 /ai/invoke/stream/* 不在主仓库,由 dootask-ai 容器提供 + - 普通用户不需要关心 stream_key,前端自动获取 +last_verified: v1.7.90 +--- + +# AI 助手鉴权(stream_key) + +## 定义 +AI 助手发送提问前必须先调用 `POST api/assistant/auth` 生成一次性 `stream_key`,再用它去开 SSE 流(`/ai/invoke/stream/{stream_key}`),既复用登录态又避免把用户 token 暴露给 ai 容器。 + +## 数据流 +1. 用户点发送 +2. 前端 `POST api/assistant/auth`,参数:`model_type`、`model_name`、`context`(JSON)、`locale`(zh/en) +3. 后端 `AssistantController::auth` 校验登录 + 聊天权限,写入临时凭证 +4. 返回 `{stream_key: "xxx"}` +5. 前端开 SSE:`ai/invoke/stream/{stream_key}` +6. ai 容器消费凭证、转发上游模型,推回 `append/replace/done` + +## 关键约束 +- **一次性**:一个 stream_key 仅能开一次 SSE 流 +- **绑定用户**:内嵌 `userid`,越权使用被拒 +- **携带 context**:对话历史在 auth 阶段写入;ai 容器不反向查 DooTask 库 +- **插件校验**:`AssistantController` 构造函数先做 `Apps::isInstalledThrow('ai')`;未装直接抛错 + +## 权限校验 +`User::auth()->checkChatInformation()`:未登录 / 被禁止聊天 / 激活异常都会拒绝。 + +## 相关接口 +| 接口 | 用途 | +|---|---| +| `POST api/assistant/auth` | 生成 stream_key | +| `GET api/assistant/models` | 拉可用模型列表 | +| `POST api/assistant/session/list` | 历史会话 | +| `POST api/assistant/session/save` | 保存当前会话 | +| `POST api/assistant/session/delete` | 删除 / 清空 | + +## 不支持 +- 不支持复用 stream_key +- 不支持匿名调用 +- 不支持终端用户直接管理 token + +## 相关 +- [[ai-assistant.privacy.concept]] +- [[ai-assistant.streaming.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/embed-entry.md b/resources/ai-kb/zh/concept/ai-assistant/embed-entry.md new file mode 100644 index 000000000..d6d88a25d --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/embed-entry.md @@ -0,0 +1,61 @@ +--- +id: ai-assistant.embed-entry.concept +title: 业务嵌入式 AI 入口 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 嵌入业务 + - 任务里 AI + - 项目 AI 生成 + - 工作报告 AI + - 消息里 AI + - AI 业务入口 +related_tools: [] +related_pages: [task_detail, project_create, report_edit, dialog] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已配置至少一个 AI 模型 +negative: + - 嵌入式入口与浮窗对话不共用同一会话池(按 sessionKey 隔离) + - 嵌入入口大多有自定义 system 提示词,输出格式可能强约束(如 JSON) + - 不是所有页面都有 AI 按钮,只有这里列出的业务场景才内嵌 +last_verified: v1.7.90 +--- + +# 业务嵌入式 AI 入口 + +## 定义 +除浮按钮和快捷键外,DooTask 在多个业务表单内嵌入了「上下文相关」的 AI 入口。它们与全局浮窗调的是同一个 AI 助手组件,但通过 `sessionKey` + `onBeforeSend` + `onApply` 等参数定制行为,让 AI 直接产出可应用到表单的结构化内容。 + +## 已知嵌入入口 + +| 入口 | 触发位置 | sessionKey | 典型用途 | +|---|---|---|---| +| 项目创建 | 新建项目弹窗 AI 按钮 | `project-create` | 生成项目名 + 看板列 | +| 任务创建 | 添加任务弹窗 AI 按钮 | `task-add` | 生成任务标题 / 描述 / 子任务 | +| 工作汇报 | 汇报编辑器 AI 工具 | `report-edit` | 基于近期任务生成草稿 | +| 消息输入 | 群 / 私聊输入栏 AI 图标 | `chat-message` | 帮你写消息草稿 | +| 任务讨论 | 任务详情 @AI | — | 机器人方式触发 | + +## 与浮窗的区别 +- **会话池隔离**:不同 `sessionKey` 走不同桶;项目创建会话不会和任务创建混在一起 +- **上下文重建**:嵌入入口通过 `onBeforeSend` 重写 context(不走默认助手 system 提示) +- **应用按钮**:回答下方有「应用此内容」按钮,自动回填原表单 +- **加载提示**:可自定义「正在生成项目结构…」之类提示 + +## 应用此内容 +回答完成后弹出 `Button`: +1. 点击触发 `onApply` 回调 +2. 解析 AI 输出(通常 JSON)并填入原表单 +3. 应用成功后嵌入弹窗自动关闭 + +## 不支持 +- 嵌入会话不出现在浮窗历史下拉里 +- 不能在嵌入入口切回浮窗系统提示词 +- 没有 AI 按钮的页面(日历 / 文件 / 个人设置)不能内嵌唤起 + +## 相关 +- [[ai-assistant.entry.howto]] +- [[ai-assistant.session.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/float-button.md b/resources/ai-kb/zh/concept/ai-assistant/float-button.md new file mode 100644 index 000000000..017ffdf72 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/float-button.md @@ -0,0 +1,51 @@ +--- +id: ai-assistant.float-button.concept +title: AI 助手浮按钮 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 浮窗按钮 + - AI 浮窗 + - AI 浮窗怎么用 + - 屏幕角落的 AI 球 + - AI 小球 + - 那个小气泡 + - 浮动按钮 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已在系统设置「AI 模型」中配置至少一个模型 +negative: + - 浮按钮位置只保留水平/垂直两个距离,不存绝对坐标,换屏分辨率不会跑出屏外 + - 收起状态下点击直接打开 AI 助手,不会再触发拖动 + - 拖动 ≥ 5px 或按下 ≥ 200ms 算拖动;小于该阈值才视为点击 +last_verified: v1.7.90 +--- + +# AI 助手浮按钮 + +## 定义 +浮按钮是 DooTask 桌面端 / 移动端常驻在屏幕角落的圆形 AI 入口,44px 直径,点击呼出 AI 助手浮窗或弹窗。它独立挂在 `` 上,与当前路由解耦,**任何登录后页面都能看到**(登录页除外)。 + +## 关键属性 +- **位置存储**:只保存两个距离(距左 / 距右 + 距上 / 距下)和「贴边收起」状态,写入 IndexedDB key `aiAssistant.floatButtonPosition` +- **默认位置**:桌面端右下角(距右 24px、距底 100px);移动端竖屏靠右、距底约 1/4 屏高 +- **可拖动**:桌面端鼠标按住拖动;移动端单指触摸拖动 +- **贴边收起**:靠近左 / 右屏幕边缘 ≤ 12px 时延迟自动收起为竖条(桌面端 1 秒、移动端 5 秒) +- **收起态再点开**:收起状态下点按钮直接打开 AI 助手,不会再拖动 + +## 显示条件 +- 已安装 ai 插件(`microAppsIds` 包含 `ai`) +- 已登录(`userId > 0`) +- 当前不在登录页 +- AI 助手弹窗未打开时 + +## 与浮窗的关系 +浮按钮只是「入口」,点击触发 `openAIAssistantGlobal` 事件。真正的对话窗口由 [[ai-assistant.modal.concept]] 渲染。 + +## 不支持 +- 不支持双击 / 长按弹出菜单(除了移动端长按用于拖动) +- 不支持把浮按钮完全隐藏后再用快捷键恢复——隐藏需在「个人设置」关闭(详见 [[ai-assistant.float-button.howto]]) diff --git a/resources/ai-kb/zh/concept/ai-assistant/match-elements.md b/resources/ai-kb/zh/concept/ai-assistant/match-elements.md new file mode 100644 index 000000000..fb0ea5425 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/match-elements.md @@ -0,0 +1,56 @@ +--- +id: ai-assistant.match-elements.concept +title: AI 怎么找到页面元素 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - match_elements + - AI 找按钮 + - 元素匹配 + - 向量匹配元素 + - AI 怎么知道点哪 + - AI 元素识别 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 +negative: + - 匹配纯依赖元素可见文本/aria-label/title,无文本的图标按钮命中率低 + - 单次匹配上限 50 个候选元素 + - 不持久化匹配结果,每轮交互需重新取上下文 +last_verified: v1.7.90 +--- + +# AI 怎么找到页面元素 + +## 定义 +当 AI 想操作页面元素(点按钮、填表)时,先调 `get_page_context` 拿到候选元素列表(每条含 ref / name / role),再通过后端 API `POST api/assistant/match-elements` 把"用户意图描述"和"候选列表"提交给 embedding 服务,返回按余弦相似度排序的命中元素。 + +## 工作流 +1. **采集**:前端按 ARIA 角色扫描,给每个可交互元素分配 ref(e1, e2...)和 name +2. **关键词过滤**:先用 query 做子串匹配 +3. **向量匹配**:关键词没命中时对 query 和元素 name 求 embedding,取相似度 top-K(默认 10,最多 50) +4. **执行**:模型拿匹配元素的 ref 调 `execute_element_action` + +## 元素信息字段 +- `ref`:本轮唯一标识(e1, e2...) +- `name`:可见文本 / aria-label / title +- `role`:ARIA 角色(button / textbox / link 等) +- `selector` + `nth`:兜底选择器 + +## 命中率 +- 有清晰文本的按钮:高 +- 仅 icon 无 aria-label:低,建议加 title +- 隐藏元素:默认不采集 + +## 不支持 +- 不支持图像 OCR 识图(仅基于文本) +- 不支持「按位置」找元素("左上角第三个") +- 不能跨 iframe 匹配 + +## 相关 +- 取页面上下文:[[ai-assistant.page-context-tool.concept]] +- 操作元素:[[ai-assistant.element-action.howto]] +- 页面操作机制:[[ai-assistant.page-action.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/mobile-entry.md b/resources/ai-kb/zh/concept/ai-assistant/mobile-entry.md new file mode 100644 index 000000000..3be3e4a17 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/mobile-entry.md @@ -0,0 +1,63 @@ +--- +id: ai-assistant.mobile-entry.concept +title: 移动端 AI 助手入口 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 手机上怎么用 AI + - 移动端 AI 入口 + - 手机 AI 助手 + - 移动端 AI 浮球 + - 手机 AI 弹窗 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已配置至少一个 AI 模型 +negative: + - 移动端没有键盘快捷键 + - 浮按钮位置不在桌面 / 移动间同步 + - AI 弹窗在移动端走全屏,不能调整大小 +last_verified: v1.7.90 +--- + +# 移动端 AI 助手入口 + +## 定义 +移动端指通过 iOS / Android App 或手机浏览器访问 DooTask(`isMobile = true`,含竖横屏窄屏)。AI 助手在移动端有两类入口:**浮按钮小球** 和 **业务页面内嵌按钮**。 + +## 浮按钮(主入口) +- 屏幕右侧默认距底约 1/4 屏高悬浮 +- 加载后自动收起为屏幕边缘 48px 高竖条 +- 单指按住可拖动到任何位置;松开后靠近左右边缘会再次自动收起 +- 单击展开 AI 助手;展开后**全屏**弹窗,覆盖整个视口 + +## 全屏对话 +- 移动端 AI 弹窗强制全屏(`is-mobile-fullscreen`) +- 顶部有标题栏 + 关闭按钮 + 历史会话下拉 +- 不能调整大小、不能拖动窗口 + +## 业务嵌入入口 +- 任务详情底部输入区 AI 图标 +- 工作汇报编辑器工具栏「AI 生成」 +- 消息会话群里 @AI +- 创建项目名右侧 AI 按钮 + +## 与桌面端的差异 +| 维度 | 桌面端 | 移动端 | +|---|---|---| +| 弹窗形态 | 浮窗或 modal | 全屏 modal | +| 浮按钮自动收起延迟 | 1 秒 | 5 秒(加载即收起) | +| 快捷键 | Cmd/Ctrl + I | 无 | +| 默认浮按钮位置 | 右下距底 100px | 右侧距底 1/4 屏高 | + +## 不支持 +- 不支持移动端快捷收起 / 展开浮按钮(必须靠拖动) +- 不支持移动端关闭浮按钮本身 +- 不支持移动端浮窗与桌面浮窗位置同步 + +## 相关 +- [[ai-assistant.float-button.concept]] +- [[ai-assistant.modal.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/modal.md b/resources/ai-kb/zh/concept/ai-assistant/modal.md new file mode 100644 index 000000000..34bcb9de7 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/modal.md @@ -0,0 +1,68 @@ +--- +id: ai-assistant.modal.concept +title: AI 助手弹窗形态 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 浮窗 + - AI 弹窗 + - AI 全屏 + - AI 窗口 + - AI 模态框 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 移动端浮窗一律全屏,不能调整大小 + - 桌面端浮窗最小 380×400,最大 800×900 + - 弹窗 z-index 每 5/20 秒自动调高确保覆盖其他模态 +last_verified: v1.7.90 +--- + +# AI 助手弹窗形态 + +## 定义 +AI 助手有两种渲染形态,由打开时的 `displayMode` 决定: +- `chat`:**浮窗**(默认,可拖动 / 调整大小 / 桌面右下角) +- `modal`:**居中模态**(默认 600px 宽,移动端自动全屏) + +## chat 浮窗(桌面端默认) +- 通过 `v-transfer-dom` 挂到 ``,避免被父容器裁切 +- 自带 8 个 resize 控制点(四边 + 四角),可拖拽改大小 +- 标题栏可拖动整窗,双击切换全屏 +- 位置 / 尺寸记忆到 IndexedDB(`aiAssistant.chatPosition` / `aiAssistant.chatSize`) + +## 尺寸约束(chat 浮窗) +| 维度 | 最小 | 最大 | 默认 | +|---|---|---|---| +| 宽度 | 380 | 800 | 460 | +| 高度 | 400 | 900 | 600 | + +## modal 模态(业务嵌入入口默认) +- iView `Modal` 组件渲染,居中遮罩 +- 宽度:新建会话 440,已有对话 600 +- 桌面端遮罩点击**不**关闭(`mask-closable: false`) +- 移动端强制全屏 + +## 移动端 +- 不论 displayMode 是什么都全屏 +- 顶部有标题栏、关闭、历史下拉 +- 关闭按钮 `Icon type="ios-close"` 位于右上 +- 输入区固定在底部 + +## z-index 自适应 +- 初始 `topZIndex = max(modalTransferIndex, 1000) + 1000` +- 弹窗打开期间每 5 秒重新评估(高于新模态) +- 关闭后每 20 秒评估 + +## 不支持 +- 不支持最小化为小球(要小球用浮按钮) +- 不支持多窗口同时打开多个对话 +- 不支持自定义 z-index + +## 相关 +- [[ai-assistant.float-button.concept]] +- [[ai-assistant.close.howto]] +- [[ai-assistant.mobile-entry.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/model.md b/resources/ai-kb/zh/concept/ai-assistant/model.md new file mode 100644 index 000000000..3b8d7f67c --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/model.md @@ -0,0 +1,68 @@ +--- +id: ai-assistant.model.concept +title: AI 助手可用模型 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 模型 + - 可以选哪些 AI + - DooTask AI 模型 + - GPT Claude DeepSeek + - AI 服务商 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已在系统设置「AI 模型」中配置至少一个模型的 API Key +negative: + - 终端用户不能自己加模型 / 改 API Key,必须由管理员配置 + - 没有「免费内置模型」,DooTask 不自带 API Key + - 模型下拉为空 = 管理员未配 / 未启用任何模型 +last_verified: v1.7.90 +--- + +# AI 助手可用模型 + +## 定义 +AI 助手在浮窗底部下拉框展示的「可选模型」,全部来自管理员在系统设置 →「AI 模型」中配置并启用的服务商。前端通过 `GET api/assistant/models` 拉当前生效配置,按服务商分组渲染。 + +## 支持的服务商分组 +按 `AIBotMap` 顺序展示(每组最多前 5 个模型 + 默认模型): + +| key | 显示名 | +|---|---| +| `openai` | ChatGPT | +| `claude` | Claude | +| `deepseek` | DeepSeek | +| `gemini` | Gemini | +| `grok` | Grok | +| `ollama` | Ollama(本地) | +| `zhipu` | 智谱清言 | +| `qianwen` | 通义千问 | +| `wenxin` | 文心一言 | + +## 模型 ID +前端模型选项内部 id 是 `{type}:{value}`,如 `openai:gpt-4o`。`type` 路由到对应服务商 SDK,`value` 是模型名(透传上游)。 + +## 默认模型 +每个分组带 `defaultModel`(管理员设置)。首次打开按此顺序选定: +1. 用户上次选过的模型(IndexedDB `aiAssistant.model`) +2. 第一个有 `defaultModel` 的分组的默认模型 +3. 第一个分组的第一个模型 +4. 否则空 + +## 模型能力差异 +- **多模态**:仅部分模型支持,如 `gpt-4o`、`claude-3-5-sonnet`、`gemini-1.5-pro` +- **长文本**:默认 context 取最近 10 轮,超出截断;与模型最大 token 无关 + +## 不支持 +- 不支持同一问题同时发多个模型对比 +- 不支持终端用户自定义模型 / 改 API Key / base_url +- 切换模型不会清空历史会话,会用新模型续接 + +## 相关 +- [[ai-assistant.model-switch.howto]] +- [[ai-assistant.model-empty.faq]] +- [[ai-assistant.multimodal.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/multimodal.md b/resources/ai-kb/zh/concept/ai-assistant/multimodal.md new file mode 100644 index 000000000..0e2d56e5c --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/multimodal.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.multimodal.concept +title: AI 助手多模态(图片输入) +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 看图 + - 上传图片给 AI + - 视觉模型 + - AI 多模态 + - AI 识图 + - AI 看截图 +related_tools: [] +related_pages: [] +prerequisites: + - 当前模型支持视觉输入(如 gpt-4o / claude-3.5-sonnet / gemini-1.5-pro) +negative: + - 仅图片,不支持视频 / 音频 / 文档 + - 一次最多 5 张图片 + - 图片会被压缩到长边 1568px JPEG,原图不保留 + - 切到不支持视觉的模型后发图会上游报错 +last_verified: v1.7.90 +--- + +# AI 助手多模态(图片输入) + +## 定义 +多模态指 AI 助手允许用户在对话中**同时附带图片**。图片以 base64 拼到 `content` 数组(`{type: 'image_url', image_url: {url: dataUrl}}`),与文本一起发给视觉模型解析。 + +## 三种添加方式 +1. **点击图片按钮**:浮窗底部图片图标,弹系统文件选择器 +2. **拖放**:把图片拖到浮窗,松手上传 +3. **粘贴**:在输入框 Ctrl/Cmd + V 粘贴剪贴板里的图片 + +## 数量与大小约束 +- 单次最多 5 张(`maxImages`),超出 toast「最多上传 5 张图片」 +- 自动压缩:长边 ≤ 1568px、统一转 JPEG +- 原文件不上传,只上传压缩后的 dataUrl + +## 视觉模型要求 +- 必须选视觉模型才能正确解析(`openai:gpt-4o`、`claude:claude-3-5-sonnet`、`gemini:gemini-1.5-pro` 等) +- 非视觉模型(如 `deepseek:deepseek-chat`、`grok:grok-2`)通常忽略图片或上游报错 + +## 持久化 +- 图片随会话一起保存 +- 服务端转存到 `public/uploads/assistant/YYYYMM/{userid}/xxx.jpg` +- 再次打开会话通过 `serverImageMap` 拿回 URL 显示 + +## 不支持 +- 不支持视频 / PDF / 音频;只接受 `image/*` MIME +- 不支持单张超大图保持原始分辨率 +- 不支持拖到收起的浮按钮上(先展开) +- 不支持「不压缩直发」开关 + +## 相关 +- [[ai-assistant.image-upload.howto]] +- [[ai-assistant.model-switch.howto]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/page-action.md b/resources/ai-kb/zh/concept/ai-assistant/page-action.md new file mode 100644 index 000000000..2fc97a158 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/page-action.md @@ -0,0 +1,53 @@ +--- +id: ai-assistant.page-action.concept +title: AI 操作页面的机制 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 控制页面 + - AI 自动操作 + - execute_action 是什么 + - AI 跳转页面 + - 页面自动化 + - AI 点按钮 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - AI 的页面操作仅在浏览器/桌面端会话窗口内生效,无法控制其他用户的页面 + - 一次只能操作当前会话所在的页面,不能开新标签页 + - 关闭浏览器或切到别的标签页时,页面操作会断连失败 +last_verified: v1.7.90 +--- + +# AI 操作页面的机制 + +## 定义 +AI 助手通过 `execute_action`(高层导航)和 `execute_element_action`(低层元素操作)两个 MCP 工具操作用户当前页面。后端通过 WebSocket 把指令推给前端,前端的 `action-executor.js` 执行真实 DOM 行为或路由跳转,结果回传给 AI 让对话继续。 + +## 两层接口 +- **高层 execute_action**:语义化命名(如 `open_task`、`navigate_to_dashboard`),参数明确(任务 ID),由前端封装好 router 调用;优先用这层,稳定不易错 +- **低层 execute_element_action**:基于元素 ref 的通用动作(click/type/select/focus/scroll/hover),用于没封装好的细节操作 + +## 受支持的高层动作 +- `open_task`、`open_dialog`、`open_project`、`open_file`、`open_folder` +- `navigate_to_dashboard / messenger / calendar / files` + +## 受支持的低层元素动作 +- `click`、`type`、`select`、`focus`、`scroll`、`hover` + +## 不支持 +- 不能模拟键盘组合键、不能拖拽 +- 不能操作 iframe 内的内容 +- 不能跳转外部 URL(goForward 只走应用内路由) +- 不能伪造非用户主动触发的事件(如自动提交表单审批通过) + +## 相关 +- 让 AI 跳页面:[[ai-assistant.page-action.howto]] +- AI 操作元素:[[ai-assistant.element-action.howto]] +- 元素查找接口:[[ai-assistant.match-elements.concept]] +- 取页面上下文:[[ai-assistant.page-context-tool.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/page-context-tool.md b/resources/ai-kb/zh/concept/ai-assistant/page-context-tool.md new file mode 100644 index 000000000..22134f9f2 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/page-context-tool.md @@ -0,0 +1,56 @@ +--- +id: ai-assistant.page-context-tool.concept +title: AI 怎么知道你在哪个页面 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - get_page_context + - AI 看页面 + - 页面上下文 + - AI 怎么知道当前页 + - AI 读取页面 + - AI 上下文采集 +related_tools: [get_page_context] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 仅当用户在 AI 浮窗当前会话所在的浏览器/桌面端窗口时才能采集 + - 不能跨标签 / 跨设备同步采集,每个 socket 只对应一个页面 + - 不读取密码框/被遮挡元素/隐藏元素 +last_verified: v1.7.90 +--- + +# AI 怎么知道你在哪个页面 + +## 定义 +AI 通过 MCP 工具 `get_page_context` 向当前用户的浏览器请求页面上下文,包括:当前路由名(如 `manage-project`)、URL、标题、可交互元素清单(带 ref / name / role)、该页可用的高层动作。结果由前端 `page-context-collector.js` 实时收集后回传。 + +## 返回字段 +- `page_type`:路由名(如 `manage-task`) +- `page_url` / `page_title` +- `elements`:可交互元素(ref / name / role) +- `total_count` / `has_more` / `offset`:分页 +- `available_actions`:该页可用的高层动作(如项目页可 `open_task`) +- `ref_map`:ref → 定位信息 + +## 调用模式 +- **轻量**:`interactive_only=true` + `max_elements=20` +- **完整**:默认前 100 个(含内容) +- **搜索**:传 `query` 先关键词后向量匹配 + +## 隐式触发 +用户在浮窗里问"这个页面有什么操作"、"帮我点这页的某按钮"、"切到下一项目"时,AI 都会先调 `get_page_context` 再决定下一步。 + +## 不支持 +- 不返回每个元素的位置坐标(仅 selector) +- 不会返回 input 框的当前值(不读取用户私有输入) +- 不能在弹窗/抽屉之外拿到全屏快照(仅 DOM 节点) + +## 相关 +- 元素匹配:[[ai-assistant.match-elements.concept]] +- 操作元素:[[ai-assistant.element-action.howto]] +- 页面操作机制:[[ai-assistant.page-action.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/page-context.md b/resources/ai-kb/zh/concept/ai-assistant/page-context.md new file mode 100644 index 000000000..aa505e10b --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/page-context.md @@ -0,0 +1,78 @@ +--- +id: ai-assistant.page-context.concept +title: AI 助手页面上下文(弱提示词) +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 知道当前页面 + - 页面感知 + - AI 上下文 + - 弱提示词 + - 当前页面注入 + - AI 现在在哪 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 弱提示词只传「页面类型 / 实体 id / 名称 / 对话类型」四类,不传业务详细数据 + - 详细数据需要 AI 通过 MCP 工具自取 + - 嵌入入口(专用 onBeforeSend)不走弱提示词机制 +last_verified: v1.7.90 +--- + +# AI 助手页面上下文(弱提示词) + +## 定义 +**弱提示词**是 AI 助手浮窗对话时自动注入的极简「我现在在哪」描述,让 AI 知道用户提问发生在哪个项目 / 任务 / 对话页,能正确解析「这个项目 / 这条任务」之类指代。 + +## 注入格式 +渲染为一行 `system` 消息穿插到 context 历史: + +``` +[当前页面] 项目详情页(project_id=123,名称:DooTask) +[页面切换] 任务详情页(task_id=4567,名称:修复 SSE 断流) +``` + +前缀:`[当前页面]` 首次注入,`[页面切换]` 后续在不同页面再提问时。 + +## 注入的字段 +仅四类,绝不带其他业务数据: + +| 字段 | 含义 | +|---|---| +| `type` | 实体类型(task / dialog / project / file / report) | +| `id` | 实体 id | +| `name` | 实体名称 | +| `dialogType` | 群聊 / 私聊,仅 dialog 有 | + +## 为什么穿插历史 +用户可能在不同项目 / 任务页连续提问。只放当前页会让历史里两个「这个项目」失去锚点。穿插能给历史每条用户消息打上「问题发生时所在的页面」,AI 才能正确分辨。 + +## 可识别的页面 +- 任务详情弹窗(最高优先)→ `task:{id}` +- 对话详情弹窗 → `dialog:{id}` +- 仪表盘 → `dashboard` +- 项目列表 / 详情 → `project-list` / `project:{id}` +- 消息列表 / 会话 → `messenger` / `dialog:{id}` +- 日历 → `calendar` +- 文件列表 / 详情 → `file-list` / `file:{id}` +- 工作汇报编辑 / 详情 → `report:{id}` + +## 何时不注入 +- 不可识别路由(登录页、个人设置等) +- 同 `contextKey` 连续提问 +- 嵌入入口(带 `onBeforeSend`) + +## 详细数据怎么拿 +弱提示词只告「在哪」,不告「内容」。AI 需要看任务描述、项目统计时通过 MCP 工具自取(如 `get_task`、`get_project_data`)。 + +## 不支持 +- 不支持把整页内容塞给 AI +- 不支持用户手动关闭弱提示词 +- 不支持自定义注入字段 + +## 相关 +- [[ai-assistant.embed-entry.concept]] +- [[ai-assistant.welcome-prompts.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/privacy.md b/resources/ai-kb/zh/concept/ai-assistant/privacy.md new file mode 100644 index 000000000..0fef75770 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/privacy.md @@ -0,0 +1,80 @@ +--- +id: ai-assistant.privacy.concept +title: AI 助手数据隐私 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 数据安全 + - AI 对话保存在哪 + - AI 会泄露吗 + - AI 上传图片去哪 + - DooTask AI 隐私 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 对话会通过 ai 插件转发给管理员配置的上游 LLM 服务商,受其隐私条款约束 + - 不存在「AI 完全本地化」开关,除非管理员只配 Ollama 本地模型 + - 用户无法自助导出会话(只能在浮窗手动清空历史) +last_verified: v1.7.90 +--- + +# AI 助手数据隐私 + +## 数据存到哪里 + +### 对话内容 +- 数据库表:`ai_assistant_sessions`,按 `userid` 行级隔离 +- 其他普通用户绝对看不到别人会话 +- 仅当前用户、系统管理员可通过后台数据库访问 + +### 图片 +- 路径:`public/uploads/assistant/YYYYMM/{userid}/xxx.jpg` +- 按用户 id 分目录,删除会话时物理删除 + +### 配置 / 模型选择 +- 存 IndexedDB `aiAssistant.model`(仅当前浏览器) +- 浮按钮位置 / 输入历史也存 IndexedDB,不上传 + +## 数据传给谁 + +``` +浏览器 + → DooTask 后端 (POST api/assistant/auth) + → ai 插件容器 (dootask-ai) + → 上游 LLM 服务商 (OpenAI / Claude / DeepSeek 等) +``` + +- 上游服务商由**系统管理员**决定 +- 选 Ollama 本地模型则对话不出 DooTask 部署网络 +- 选公网服务则按服务商隐私条款处理 + +## 发送上去的内容 +- 本次提问的文本 + 图片(多模态时) +- 当前会话最近 10 轮 context +- 当前页面弱提示词(仅页面类型 + 实体 id + 名称,**不含**业务详细数据) +- DooTask 默认 system prompt + +## 不会发送的 +- 用户密码、token、密钥 +- 不在 context 窗口内的历史会话 +- 其他用户对话 +- 私聊 / 群聊具体消息(除非用户主动复制到提问) +- 完整页面业务数据(只发弱提示词) + +## 清理与删除 +- 单条 / 清空当前桶:[[ai-assistant.session-delete.howto]] +- 清浏览器 IndexedDB:清掉模型选择、浮按钮位置、输入历史 +- 上游侧保留多久取决于服务商(如 OpenAI 默认 30 天) + +## 不支持 +- 不支持端到端加密让管理员都看不到 +- 不支持把某条对话标记「不发送」 +- 不支持自助导出全部历史 + +## 相关 +- [[ai-assistant.auth.concept]] +- [[ai-assistant.session.concept]] +- [[ai-assistant.page-context.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/session.md b/resources/ai-kb/zh/concept/ai-assistant/session.md new file mode 100644 index 000000000..8c8f9f6fd --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/session.md @@ -0,0 +1,70 @@ +--- +id: ai-assistant.session.concept +title: AI 助手会话 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 会话 + - AI 历史 + - AI 对话记录 + - AI session + - session_key + - 会话桶 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 单个桶最多 20 条会话,超过自动淘汰最早 + - 嵌入式入口的会话不出现在浮窗历史里 + - 删除会话不可恢复,对应图片也会从 public/uploads 物理删除 +last_verified: v1.7.90 +--- + +# AI 助手会话 + +## 定义 +会话(session)是 AI 助手中一组连续的用户提问 + AI 回答集合,按「场景桶」隔离持久化到 `ai_assistant_sessions` 表,归当前用户所有。 + +## 关键属性 + +| 字段 | 含义 | +|---|---| +| `session_key` | **场景桶**,浮窗用 `global`,嵌入入口用各自 key | +| `session_id` | 唯一 id,格式 `session-{时间戳}-{随机串}` | +| `title` | 自动取首条用户消息前 20 字 | +| `data` | JSON 数组,存所有 user/assistant/system 消息 | +| `images` | JSON 对象 `{imageId: 服务端路径}` | +| `updated_at` | 历史列表按其倒序 | + +## 持久化时机 +- 流式回答完成后立即保存 +- 编辑历史问题、删除消息后保存 +- 普通编辑期间有 2 秒防抖 + +## 桶(session_key)的作用 +不同业务入口走不同桶: +- `global`:浮窗 + 快捷键 + 顶部「+」菜单 +- `project-create`:新建项目 AI 助手 +- `task-add`:新建任务 AI 助手 +- `report-edit`:工作汇报 AI +- `chat-message`:消息输入 AI + +切桶时先保存当前会话再载入目标桶历史列表,避免互相串扰。 + +## 数量限制 +- 每个桶最多保留 20 条(`maxSessionsPerKey`) +- 超过从最旧的开始淘汰 +- 单会话内最多 50 条 message(`maxResponses`) + +## 不支持 +- 不支持跨用户 / 跨桶搜索;只查当前用户当前桶 +- 不支持把某条会话从一个桶导到另一个桶 +- 不支持手动改会话标题 + +## 相关 +- [[ai-assistant.session-list.howto]] +- [[ai-assistant.new-chat.howto]] +- [[ai-assistant.session-delete.howto]] +- [[ai-assistant.embed-entry.concept]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/streaming.md b/resources/ai-kb/zh/concept/ai-assistant/streaming.md new file mode 100644 index 000000000..baac2499a --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/streaming.md @@ -0,0 +1,74 @@ +--- +id: ai-assistant.streaming.concept +title: AI 助手流式输出 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 流式回答 + - 边写边出 + - AI 一边打字一边显示 + - SSE 流 + - AI 实时输出 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不支持 WebSocket 推送,固定走 SSE + - 不支持手动重试单条;流断后该 message 标记 error,需重新发送 + - 同会话并发流会被前一个的发送动作清掉 +last_verified: v1.7.90 +--- + +# AI 助手流式输出 + +## 定义 +AI 助手通过 **SSE(Server-Sent Events)** 接收上游 LLM 的逐 token 输出,每收到一个 chunk 就追加到当前 message 的 `rawOutput`,呈现 ChatGPT 般「边写边出」的效果。 + +## 数据流 +1. `POST api/assistant/auth` → 拿 stream_key +2. `EventSource ai/invoke/stream/{stream_key}` +3. 监听三类事件: + - `append` → 追加(`entry.rawOutput += chunk`) + - `replace` → 整段替换(`entry.rawOutput = chunk`) + - `done` → 流结束(`entry.status = 'completed'`) +4. 断流 / 异常 → `handleStreamFailed` + +## 事件类型 + +| 事件 | 用途 | +|---|---| +| `append` | 普通增量 token(最常见) | +| `replace` | 整段替换(工具结果回填、思考链重写) | +| `done` | 流结束,payload 含 `error` 字段表示上游报错 | + +## 状态机 +每条 AI message 4 个状态: +- `waiting` → 已发出但首个 chunk 未到 +- `streaming` → 正在接收 chunk +- `completed` → `done` 正常收到 +- `error` → 上游错误、连接失败、用户中断 + +## 并发与归属 +- 每个流绑定 `owner = {sessionKey, sessionId, localId}` +- 用户切到其他会话后,原流仍后台跑,结束时写回原会话存储 +- 发新问题前会清掉同会话的所有活跃流,防止两段对话错位 + +## 中断恢复保护 +- 关浮窗 / 页面崩溃后,下次加载会话发现 message 仍是 `streaming/waiting` 则归一为 `error` +- 避免「永远转圈」(`sanitizeResponsesForPersist`) + +## 滚动行为 +- 视图在最底部时新 chunk 自动 `scrollToBottom` +- 用户向上翻历史时(距底 > 20px)不强制下拉 + +## 不支持 +- 不支持 WebSocket +- 不支持 chunk 级别撤销 +- 不支持自动重试断流 + +## 相关 +- [[ai-assistant.stop.howto]] +- [[ai-assistant.modal.concept]] +- [[ai-assistant.session-save.howto]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/tool-call.md b/resources/ai-kb/zh/concept/ai-assistant/tool-call.md new file mode 100644 index 000000000..63fcce66d --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/tool-call.md @@ -0,0 +1,53 @@ +--- +id: ai-assistant.tool-call.concept +title: 工具调用的流式事件结构 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - tool_call 是什么 + - AI 工具调用的过程 + - 工具调用气泡 + - AI 调用了工具显示什么 + - tool_call 事件 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 单次回复可包含多次工具调用(并行或串行),不限于一次 + - 工具调用结果不计入用户上下文 token,但会消耗会话 token + - 用户不能在前端取消已发出的工具调用,只能整体中断本轮回复 +last_verified: v1.7.90 +--- + +# 工具调用的流式事件结构 + +## 定义 +AI 助手回复以流式 SSE 推送给前端,事件中除了文本增量,还会出现工具调用片段。每次工具调用在浮窗里渲染为一个独立气泡,展示"工具名 + 参数 + 状态",让用户能看到 AI 在背后做什么。 + +## 一次完整工具调用的事件序列 +1. `tool_call_start`:模型决定调工具,前端插入气泡,状态置「执行中」 +2. `tool_call_arguments`(可多次):参数 JSON 增量流式拼接 +3. `tool_call_result`:后端/前端返回结果,状态变「完成」或「失败」 +4. 模型基于结果继续生成 `message` 文本 + +## 气泡可见信息 +- 工具名(如 `list_tasks`) +- 入参 JSON(折叠/展开) +- 出参摘要(成功)或错误码(失败) +- 执行耗时 + +## 与普通文本的关系 +- 工具结果不直接回给用户,而是回灌给模型 +- 模型读结果后再生成下一段自然语言回答("我找到 3 条任务……") +- 用户体感是"AI 一边查一边说" + +## 不支持 +- 工具调用进行中无法手动改参数;要重来需点重试或重新提问 +- 失败的工具调用不会自动二次重试(模型可能换工具或道歉) + +## 相关 +- 工具机制总览:[[ai-assistant.tools.concept]] +- 工具清单:[[ai-assistant.tools-list.concept]] +- 失败处理:[[ai-assistant.tool-failed.faq]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/tools-list.md b/resources/ai-kb/zh/concept/ai-assistant/tools-list.md new file mode 100644 index 000000000..a57e2a4a1 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/tools-list.md @@ -0,0 +1,66 @@ +--- +id: ai-assistant.tools-list.concept +title: AI 助手可用工具清单 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 有哪些工具 + - AI 能调用什么 + - AI 工具列表 + - MCP 工具有哪些 + - AI 都能做什么 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 工具集合由系统维护,普通用户无法自定义增减 + - 列表项名是后端工具名(snake_case),用户不需要记 + - 不在清单中的能力 AI 无法直接执行(例如改系统设置、装插件) +last_verified: v1.7.90 +--- + +# AI 助手可用工具清单 + +## 用户与组织 +- `get_users_basic`:批量取用户昵称/邮箱/头像 +- `search_users`:按关键词找人,支持按项目/对话筛选 + +## 任务 +- `list_tasks`:列任务(状态/项目/时间筛选) +- `get_task`:取任务完整详情 +- `create_task`、`update_task`、`complete_task`、`delete_task` +- `create_sub_task`:建子任务 +- `get_task_files`:取任务附件 + +## 项目 +- `list_projects`、`get_project`、`create_project`、`update_project` + +## 消息与对话 +- `search_dialogs`:搜对话 +- `send_message`:发消息 +- `send_task_ai_message`:作为 AI 向任务讨论区发消息 +- `get_message_list`:取历史消息 + +## 文件 +- `list_files`、`search_files`、`get_file_detail`、`fetch_file_content` +- `extract_image_text`:图片 OCR + +## 工作报告 +- `list_received_reports`、`list_my_reports`、`get_report_detail`、`create_report`、`mark_reports_read` +- `generate_report_template`:基于已完成任务生成报告草稿 + +## 搜索 +- `intelligent_search`:跨任务/项目/文件/联系人/消息统一语义搜索 + +## 页面自动化 +- `get_page_context`:取当前页面结构与可交互元素 +- `execute_action`:打开任务/项目/对话或跳功能页 +- `execute_element_action`:点击/输入/选择/聚焦/滚动/悬停 + +## 知识库 +- `search_help_docs`:检索本知识库(DooTask 功能说明) +- `get_session_image`:取用户上传到会话的图片 diff --git a/resources/ai-kb/zh/concept/ai-assistant/tools.md b/resources/ai-kb/zh/concept/ai-assistant/tools.md new file mode 100644 index 000000000..b55a3fef1 --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/tools.md @@ -0,0 +1,51 @@ +--- +id: ai-assistant.tools.concept +title: AI 助手的工具调用机制 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 工具 + - AI 调工具 + - 怎么让 AI 调工具 + - 让 AI 调用工具 + - MCP 工具 + - AI 怎么操作系统 + - function calling + - AI 能做什么 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 工具是否可用取决于所选模型是否支持 tool/function calling,部分模型仅能纯文本回答 + - 工具调用结果会展示给用户,不会静默执行 + - 用户没权限的操作(如读不到的任务)即使 AI 调工具也会被后端拒绝 +last_verified: v1.7.90 +--- + +# AI 助手的工具调用机制 + +## 定义 +DooTask AI 助手通过 MCP(Model Context Protocol)协议调用工具,把"问 AI"扩展为"让 AI 帮我做事"。AI 收到用户请求后判断是否需要调工具,例如查任务、发消息、跳页面,由插件 `mcp_server` 把请求路由到对应的后端 API 或前端动作执行器,再把结果回灌给模型,模型基于结果继续回答。 + +## 工具来源 +- **dootask-mcp 内置工具**:33 个,覆盖任务/项目/消息/文件/报告/搜索/页面操作 +- **AI 助手内置工具**:`search_help_docs`(检索本知识库)、`get_session_image`(取多模态图片) +- 工具清单维护在仓库 `resources/ai-kb/_meta/tool-binding.yaml` + +## 工具分两类 +- **数据工具**:直接调后端 API(如 `create_task`、`send_message`),不依赖前端 UI +- **页面工具**:通过 WebSocket 命令前端浏览器(如 `execute_action` 打开任务、`execute_element_action` 点按钮) + +## 触发条件 +- AI 模型本身必须支持 tool calling(OpenAI / Claude / DeepSeek / Qwen 等主流模型均支持) +- 管理员在系统设置「AI 模型」中开启该模型 +- `mcp_server` 插件已安装并运行 + +## 相关 +- 工具完整清单:[[ai-assistant.tools-list.concept]] +- 工具调用流式事件结构:[[ai-assistant.tool-call.concept]] +- 工具调用失败处理:[[ai-assistant.tool-failed.faq]] diff --git a/resources/ai-kb/zh/concept/ai-assistant/welcome-prompts.md b/resources/ai-kb/zh/concept/ai-assistant/welcome-prompts.md new file mode 100644 index 000000000..1234c555b --- /dev/null +++ b/resources/ai-kb/zh/concept/ai-assistant/welcome-prompts.md @@ -0,0 +1,75 @@ +--- +id: ai-assistant.welcome-prompts.concept +title: AI 助手欢迎语与快捷提示 +type: concept +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 欢迎页 + - AI 快捷提示 + - AI 推荐问法 + - AI 起手 + - AI 建议 + - AI 提示卡片 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 用户不能自定义快捷提示卡片 + - 卡片在每次场景切换时会重抽,并非固定不变 + - 卡片点击只是把文本填入输入框,不会自动发送 +last_verified: v1.7.90 +--- + +# AI 助手欢迎语与快捷提示 + +## 定义 +打开 AI 助手浮窗、**还没有任何对话**时显示的引导界面,包含 AI 图标 + 「欢迎使用 AI 助手」标题 + 若干个**快捷提示卡片**。卡片内容根据当前页面场景动态切换。 + +## 卡片分类 +按四类设计确保多样性: + +| 类型 | 含义 | 示例 | +|---|---|---| +| `query` | 查询 / 概览 | 「我今天有哪些任务?」 | +| `action` | 推进 / 操作 | 「帮我把这条任务标记完成」 | +| `sync` | 同步 / 协作 | 「给项目组发一条进度更新」 | +| `review` | 复盘 / 总结 | 「总结一下这周的工作」 | + +## 与页面场景联动 +卡片基于以下数据动态生成: +- 当前路由(仪表盘 / 项目 / 任务 / 消息 / 文件 / 日历) +- 当前打开的弹窗(任务 / 对话) +- 当前项目 / 任务 / 对话 id +- 当前语言(中 / 英) + +切换页面时通过 `welcomePromptsKey` watcher 触发,100ms 防抖避免闪屏。 + +## 点击行为 +1. 点击某张卡片 +2. 卡片文本被填入输入框 +3. 输入框自动获焦 +4. **不会**自动发送,需手动按发送或回车 + +## 显示条件 +- AI 助手浮窗已打开 +- `visibleResponses.length === 0`(当前会话无消息) +- `displayMode === 'chat'`(modal 模式由业务方控制) + +## 何时刷新 +- 路由变更 +- 打开 / 关闭任务弹窗 +- 打开 / 关闭对话弹窗 +- 切换项目 + +均走 `welcomePromptsKey` watcher + 100ms 防抖。 + +## 不支持 +- 不支持自定义卡片文案 +- 不支持「关闭欢迎提示卡片」开关 +- 不支持把某条卡片置顶或常驻 + +## 相关 +- [[ai-assistant.modal.concept]] +- [[ai-assistant.page-context.concept]] diff --git a/resources/ai-kb/zh/concept/application/center.md b/resources/ai-kb/zh/concept/application/center.md new file mode 100644 index 000000000..52773539c --- /dev/null +++ b/resources/ai-kb/zh/concept/application/center.md @@ -0,0 +1,42 @@ +--- +id: application.center.concept +title: 应用中心是什么 +type: concept +feature: application +scope: end-user +locale: zh +aliases: + - 应用中心 + - 应用入口 + - 微应用在哪 + - 怎么打开应用 + - 应用是什么 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 应用中心不是「应用市场」(AppStore),后者是管理员安装/卸载插件的独立入口 + - 普通成员看不到管理员应用区(如 LDAP、邮件通知、数据导出等) +last_verified: v1.7.90 +--- + +# 应用中心是什么 + +## 定义 +应用中心是 DooTask 左侧栏的一级导航之一,聚合了「系统应用」「管理员应用」「微应用」三类卡片,是用户开启大部分非核心模块的统一入口。 + +## 入口 +- 桌面端:左侧栏「应用」图标(位列仪表盘 / 日历 / 消息 / 文件之后) +- 移动端:底部 Tabbar 「应用」 + +## 三类应用 +- **系统应用**:内置固定功能,所有用户可见(审批、签到、工作报告、我的收藏、最近打开、机器人、创建群组、在线会议、创建项目、添加任务、导出管理) +- **管理员应用**:仅系统管理员可见(LDAP、邮件通知、APP 推送、举报管理、数据导出、团队管理) +- **微应用**:由已安装插件提供(OKR、思维导图、流程图、在线文档、Memos、KPI 等),列表随安装情况变化 + +## 个性化 +- 拖拽:长按卡片可调整顺序(仅影响个人视图) +- 管理员可在「自定义应用菜单」里调整全员可见的应用项 + +## 与「应用市场」的区别 +应用中心是**使用**应用的入口;应用市场(AppStore)是**安装/卸载/配置**插件的入口,仅管理员可见。 diff --git a/resources/ai-kb/zh/concept/application/classify.md b/resources/ai-kb/zh/concept/application/classify.md new file mode 100644 index 000000000..4a542b354 --- /dev/null +++ b/resources/ai-kb/zh/concept/application/classify.md @@ -0,0 +1,48 @@ +--- +id: application.classify.concept +title: 应用中心的三类应用 +type: concept +feature: application +scope: end-user +locale: zh +aliases: + - 应用分类 + - 系统应用是什么 + - 管理员应用是什么 + - 微应用是什么 + - 应用怎么区分 + - 应用类型 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 普通成员看不到「管理员应用」分区 + - 微应用不固定,随插件安装/卸载动态变化 +last_verified: v1.7.90 +--- + +# 应用中心的三类应用 + +## 定义 +应用中心把所有可点击的入口卡片分成三类:系统应用、管理员应用、微应用。三者按数据源、可见范围、是否依赖插件来区分。 + +## 三类对比 + +| 类别 | 数据来源 | 可见范围 | 是否依赖插件 | +|---|---|---|---| +| 系统应用 | 主程序硬编码(11 个固定项) | 所有登录用户 | 否,主程序内置 | +| 管理员应用 | 主程序硬编码(LDAP / 邮件 / 推送 / 举报 / 数据导出 / 团队管理) | 仅 `userIsAdmin` | 否 | +| 微应用 | 已安装插件提供的 menu 注册项 | 由插件 `visible_to` 决定(admin / all) | 是 | + +## 关键差异 +- **是否能被卸载**:系统应用和管理员应用无法卸载;微应用随插件卸载消失 +- **能否自定义**:管理员可在「自定义应用菜单」给微应用追加 / 覆盖入口配置,系统应用不能动 +- **排序**:三类卡片混合后由用户拖拽个性化(仅本人可见) + +## 与「应用市场」的关系 +- 应用中心 = **使用**入口 +- 应用市场(AppStore)= 安装 / 卸载 / 配置插件,仅管理员可见,会改变可用的微应用清单 + +## 相关 +- 系统应用完整列表见:[[app-system.list.concept]] +- 拖拽排序:[[application.sort.howto]] diff --git a/resources/ai-kb/zh/concept/approve/form.md b/resources/ai-kb/zh/concept/approve/form.md new file mode 100644 index 000000000..a2ccb4ace --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/form.md @@ -0,0 +1,59 @@ +--- +id: approve.form.concept +title: 审批表单字段 +type: concept +feature: approve +scope: admin +locale: zh +aliases: + - 审批表单 + - 表单字段 + - 表单设计 + - 自定义字段 + - 申请单字段 + - 表单组件有哪些 + - 申请类型字段 +related_tools: [] +related_pages: [application] +prerequisites: + - 当前用户是系统管理员 + - 在流程模板编辑器中 +negative: + - 当前版本不支持公式字段(如「时长 = 结束时间 - 开始时间」自动算) + - 不支持联动字段(A 字段值变化时显示/隐藏 B 字段) + - 不支持把表单字段值用作下一节点审批人路由依据(无条件分支) + - 表单字段一旦发布后改动,已提交的旧实例展示按当时快照不回填 +last_verified: v1.7.90 +--- + +# 审批表单字段 + +## 定义 +审批表单是发起人填写的申请单结构,由若干**字段组件**拼成。管理员在流程模板编辑器(iframe 内)拖拽这些组件即可设计表单。表单值随流程实例一起存到插件库的 `var` 字段(JSON),并随状态变化贯穿始终。 + +## 内置字段组件 +- **单行文本**:限长字符串,如「申请人姓名」「合同编号」 +- **多行文本**:长描述,如「请假事由」「报销说明」 +- **数字**:整数 / 小数,如「报销金额」 +- **日期 / 日期时间**:年-月-日 或精确到分钟,常用于开始/结束时间 +- **单选 / 多选 / 下拉**:固定选项集,如「假期类型」可枚举「年假/事假/病假/调休/产假/陪产假/婚假/丧假/哺乳假/产检假/其他」 +- **附件 / 图片**:上传文件,前端控件复用主程序 `ImgUpload`;图片限制宽高与张数(默认上限 3 张、2048×2048) +- **明细 / 子表**:一对多结构,如报销单的多行费用明细 +- **金额 / 时长**:业务语义字段(基于数字字段封装) + +## 必填、提示、默认值 +- 每个字段可配置 `required`(必填)、占位提示、默认值 +- 必填项校验在发起页前端拦截;提交到主程序 `process__start` 再做二次校验 + +## 与流程节点的关系 +- 表单字段是"装数据的",节点是"管流转的",两者解耦 +- 节点拿不到 form 字段做路由决策(不支持条件分支) + +## 数据存储 +- 表单值在主程序前端组成 `var` JSON 后随 `proc_name + department_id` 一起调 `approve/process/start` +- 插件把 `var` 整体存进 proc inst 行;后续审批人查看时反序列化展示 + +## 不支持 +- 不支持字段联动 / 公式 / 条件分支 +- 不支持表单级权限(不能按角色显示不同字段) +- 不支持跨流程模板字段复用 diff --git a/resources/ai-kb/zh/concept/approve/history.md b/resources/ai-kb/zh/concept/approve/history.md new file mode 100644 index 000000000..c35e61548 --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/history.md @@ -0,0 +1,49 @@ +--- +id: approve.history.concept +title: 审批流程历史 History +type: concept +feature: approve +scope: end-user +locale: zh +aliases: + - 审批历史 + - 审批操作记录 + - 流程留痕 + - 谁审过 + - 流程节点历史 + - ProcInstHistory +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 历史记录不可手动编辑,只由系统在节点流转时写入 + - 删除审批(process/delById)会连带删除该流程的全部历史 + - 历史不会单独导出,导出走 admin 的 approve/export 数据导出 +last_verified: v1.7.90 +--- + +# 审批流程历史 History + +## 定义 +流程历史(`ApproveProcInstHistory`,表 `approve_proc_inst_history`)是每个流程实例([[approve.process-inst.concept]])在节点流转时留下的快照,记录谁发起、当前节点、最近意见、整体状态,用于已结束审批的留档查询和驱动「已办」「抄送我(已结束)」两类列表。 + +## 关键字段 +- **proc_def_id / proc_def_name**:所属模板 ID 和名称 +- **title**:审批标题 +- **start_user_id / start_user_name**:发起人 +- **department_id / department / company**:发起部门和公司 +- **node_id / candidate / task_id**:当前节点、候选人 userid 串、task ID +- **start_time / end_time / duration**:开始/结束/持续时长 +- **state**:0 待审批 / 1 审批中 / 2 通过 / 3 拒绝 / 4 撤回 +- **is_finished / var**:是否结束 / 表单数据 JSON +- **latest_comment / global_comment**:最近一次意见 / 全文评论汇总 + +## 谁会读取 +- 「已办」:`approve/procHistory/findTask` +- 「抄送我」已结束:`approve/procHistory/findProcNotify` +- 「已发起」已结束:`approve/procHistory/startByMyself` +- 详情页流程图:合并 `node_infos` 与历史渲染 + +## 副作用:用户请假/外出状态 +静态方法 `getUserApprovalStatus(userid)` 按当前时间是否落在某条已通过的「请假/外出」表单时段内,决定用户在系统其他地方的「请假中」标签。1 分钟缓存。 diff --git a/resources/ai-kb/zh/concept/approve/node.md b/resources/ai-kb/zh/concept/approve/node.md new file mode 100644 index 000000000..e0f5ac7e5 --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/node.md @@ -0,0 +1,58 @@ +--- +id: approve.node.concept +title: 审批节点类型 +type: concept +feature: approve +scope: admin +locale: zh +aliases: + - 审批节点 + - 单人审批 + - 会签是什么 + - 顺序会签 + - 并行会签 + - 或签 + - 多人审批怎么配 + - 审批人怎么设 +related_tools: [] +related_pages: [application] +prerequisites: + - 当前用户是系统管理员 + - 在流程模板编辑器中 +negative: + - 当前版本不支持条件分支节点(按表单字段值自动路由到不同审批人),节点链只能串行/并行 + - 不支持嵌套子流程节点 + - 不支持回退到任意节点:拒绝直接结束流程,不能让发起人改了再走原路 +last_verified: v1.7.90 +--- + +# 审批节点类型 + +## 定义 +流程模板由若干**节点**串成一条链。一个节点 = 一步审批/抄送。节点决定"这一步由谁参与、用什么方式参与、参与后流程怎么走"。审批人来源支持指定具体用户、按角色/部门负责人动态解析。每条流程发起后会生成对应的"审批任务(task)"分发到各节点候选人手上。 + +## 主要节点类型 +- **发起节点**:流程起点,自动以申请人身份填充;不需要配置审批人 +- **单人审批**:1 个候选人,处理后流程进入下一节点 +- **顺序会签**:多个审批人按顺序处理,前一人通过才轮到下一人;任一人拒绝整单拒绝 +- **并行会签**:多个审批人同时收到任务,**全部**通过才进入下一节点;任一人拒绝整单拒绝 +- **或签**:多个候选人同时收到任务,**任一人**处理即代表全节点完成(典型用于"任一主管审批") +- **抄送节点**:通知性节点,候选人只收到通知(在「抄送我的」Tab 看到),无须操作,流程不等待 + +## 审批人来源 +- 指定具体用户:在编辑器里勾选成员列表 +- 部门负责人:动态解析为发起人当前部门的 `owner_userid`(在 `UserDepartment` 表里维护) +- 角色:按主程序角色匹配 +- 发起人自选:留空让发起人发起时手动指定 + +## 节点完成后的通知 +节点产生新任务后,主程序通过 `approval-alert` 机器人在群聊推送"待你审批"模板消息给候选人;状态变更(通过/拒绝/撤回)也走同一机器人推送。 + +## 与状态的关系 +- 整单状态:审批中(1)/ 通过(2)/ 拒绝(3)/ 撤回(4) +- 当前所在节点 + 候选人由插件维护,主程序通过 `process__getProcessById` 拿到 + +## 不支持 +- 不支持条件分支(不能按表单字段值 IF X 自动路由到分支 A);需要按条件走不同审批人时,把流程拆成多个流程模板(如「请假 3 天以内」「请假 3 天以上」各建一个),由发起人按情况选择 +- 不支持任意节点回退 +- 不支持节点级 SLA 超时自动转交 diff --git a/resources/ai-kb/zh/concept/approve/notify.md b/resources/ai-kb/zh/concept/approve/notify.md new file mode 100644 index 000000000..944d89515 --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/notify.md @@ -0,0 +1,47 @@ +--- +id: approve.notify.concept +title: 审批通知与「审批助手」机器人 +type: concept +feature: approve +scope: end-user +locale: zh +aliases: + - 审批机器人 + - 审批通知 + - 审批助手 + - approval-alert + - 怎么收到审批提醒 + - 审批卡片 +related_tools: [] +related_pages: [application, messenger] +prerequisites: + - 应用市场已安装 approve 插件 + - 当前账号未屏蔽「审批助手」机器人会话 +negative: + - 不支持改成第三方 webhook 推送 + - 不支持邮件 / 短信 / APP 推送渠道(只发应用内聊天) + - 不支持自定义模板文案 + - 机器人不能被「@」也不能直接对话指令 +last_verified: v1.7.90 +--- + +# 审批通知与「审批助手」机器人 + +## 定义 +审批的所有通知都通过系统机器人「审批助手」(userid `approval-alert`)的 1 对 1 私聊推送,消息类型 `template`(卡片)。卡片含标题、关键字段、缩略图(请假类带图片时),底部「查看详情」跳进审批详情。 + +## 何时发卡片 +后端 `approveMsg()` 按 `type` 投递: + +| type | 触发 | 收件人 | 标题样例 | +|---|---|---|---| +| `approve_reviewer` | 到我作审批人节点 | 待审批人 | {发起人} 提交的「{模板}」待你审批 | +| `approve_notifier` | 到我所在 notifier 节点 | 抄送人 | 抄送 {发起人} 提交的「{模板}」记录 | +| `approve_comment_notifier` | 我参与的审批被加全文评论 | 其他相关方 | {评论人} 评论了 {发起人} 的「{模板}」审批 | +| `approve_submitter` | 我发起的被通过/拒绝 | 发起人 | 您发起的「{模板}」已通过 / 被 {审批人} 拒绝 | + +## 卡片更新机制 +审批人同意/拒绝、发起人撤销时不发新卡,而用 `msg_id` 反查原卡片调 `change-{msg_id}` 原地更新(绿-通过/红-拒绝/灰-撤回),避免聊天里堆几十条。 + +## 未读徽标 +`approve_reviewer` 推送时附带 WebSocket 事件 `approve/unread`,「审批」入口和 Tab「待办」名后的数字立即 +1,处理后 -1。数量接口 `approve/process/doto`。 diff --git a/resources/ai-kb/zh/concept/approve/overview.md b/resources/ai-kb/zh/concept/approve/overview.md new file mode 100644 index 000000000..4f10fad2a --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/overview.md @@ -0,0 +1,46 @@ +--- +id: approve.concept +title: 审批中心是什么 +type: concept +feature: approve +scope: end-user +locale: zh +aliases: + - 审批是什么 + - 审批流程是什么 + - approve 插件 + - 什么是流程审批 + - 工作流 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 审批是独立插件,未安装时整个功能不可用 + - 不支持条件分支(按表单值路由到不同审批人) + - 不支持嵌套子审批 + - 表单不支持公式计算字段 +last_verified: v1.7.90 +--- + +# 审批中心是什么 + +## 定义 +审批中心(approve)是 DooTask 的内置流程审批应用,用于在企业内提交、流转、处理表单类申请。典型场景:请假、出差、报销、用印、采购、合同会签。它是独立插件(独立 docker 服务 + 独立数据库),主程序通过 `ApproveController` 代理调用并把消息回写到聊天会话。 + +## 三个核心对象 +- **流程模板 ProcDef**:管理员预先定义的审批样板,含表单字段、审批人节点、抄送人节点。普通用户只能选用,不能修改 +- **流程实例 ProcInst**:一次具体的审批运行;用户每提交一次就生成一条,详见 [[approve.process-inst.concept]] +- **节点 Node**:模板里的步骤;常见类型 `starter`(发起)、`approver`(审批人)、`notifier`(抄送)、`end`(结束) + +## 三类角色 +- **发起人**:提交审批的人,能撤回未结束的审批、能给已结束的审批补评论 +- **审批人**:在「待办」看到任务,可同意或拒绝 +- **抄送人**:在「抄送我」看到知会,无须操作 + +## 状态机 +流程实例的 `state`:1 审批中、2 已通过、3 已拒绝、4 已撤回。详情页右上角用 Tag 显示,列表也按这个色区分。 + +## 与项目/任务/聊天的关系 +- 审批不属于任何项目,是独立工作流 +- 所有通知通过「审批助手」机器人发到 1 对 1 聊天([[approve.notify.concept]]) diff --git a/resources/ai-kb/zh/concept/approve/plugin.md b/resources/ai-kb/zh/concept/approve/plugin.md new file mode 100644 index 000000000..1962916e3 --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/plugin.md @@ -0,0 +1,43 @@ +--- +id: approve.plugin.concept +title: 审批插件架构 +type: concept +feature: approve +scope: end-user +locale: zh +aliases: + - 审批是插件吗 + - approve 插件是什么 + - 审批中心怎么部署的 + - 为什么审批要单独装 + - 审批不在主程序里吗 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - approve 不是主程序内置功能,必须先在应用市场安装插件才能用 + - 审批数据存在独立的 `<前缀>approve_*` 数据表里,不在主程序业务表 + - 卸载插件时若勾选「删除数据」会清空全部审批数据,无法恢复 +last_verified: v1.7.90 +--- + +# 审批插件架构 + +## 定义 +审批(approve)是 DooTask 的独立插件,由 `kuaifan/dooapprove` Docker 镜像提供一套独立的工作流引擎服务。主程序通过反向代理与之通信,所有审批的流程定义、实例、任务、历史都由插件维护,不在主程序业务表里。 + +## 关键属性 +- **独立容器**:插件作为 docker-compose 服务名 `approve` 启动,端口仅在内网暴露 +- **独立数据库表**:复用主库实例但表前缀为 `approve_`(如 `pre_approve_*`),与主程序业务表逻辑隔离 +- **HTTP 反代**:主程序 nginx 把 `/approve/` 转给插件容器;`/approve/api/` 先经 `/approveAuth` 校验主程序 token 再放行 +- **业务桥接**:主程序 `ApproveController` 通过 `http://approve` 调用插件 REST 接口(路径前缀 `/api/v1/workflow/...`),把结果包成 `Base::retSuccess` 返回前端 +- **通知桥接**:审批状态变化通过 `approval-alert` 机器人在 DooTask 群聊中下发模板消息 + +## 与主程序的关系 +- 主程序登录 token = 审批插件身份凭据(通过 `verifyToken` 接口校验) +- 主程序用户/部门/机器人是审批的"人员主数据",审批不复制用户表 +- 用户感知不到容器分离:在 [[app-system.approve.howto]] 描述的「审批中心」页面内完成所有操作 + +## 不支持 +- 主程序无法直接 SQL 查询审批数据,必须经插件 API +- 关闭/卸载插件后无法发起新审批:「应用 - 审批」入口在新发起处会报错(`Apps::isInstalledThrow`) diff --git a/resources/ai-kb/zh/concept/approve/process-inst.md b/resources/ai-kb/zh/concept/approve/process-inst.md new file mode 100644 index 000000000..f6c567ab9 --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/process-inst.md @@ -0,0 +1,51 @@ +--- +id: approve.process-inst.concept +title: 流程实例 ProcInst 是什么 +type: concept +feature: approve +scope: end-user +locale: zh +aliases: + - 流程实例 + - 审批单 + - ProcInst + - 审批运行 + - 一次审批 + - 流程 ID +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 流程实例不可改字段,提交后表单只读 + - 一旦后续节点已被任何审批人处理,发起人不能再撤销 + - 已结束的实例只有发起人或管理员能删([[approve.doto.howto]]) +last_verified: v1.7.90 +--- + +# 流程实例 ProcInst 是什么 + +## 定义 +流程实例(ProcInst)是「一次具体的审批运行」的对象,由发起审批时创建。模板(ProcDef)是图纸,实例是按图纸跑出来的一条具体审批单。每提交一次就生成一个新实例,有唯一数字 ID。后端表 `approve_proc_inst`,主程序通过 `approve/process/findById` 取数据。 + +## 关键属性 +- **id**:实例唯一 ID +- **proc_def_name**:模板名(如「请假申请」) +- **start_user_id / start_user_name**:发起人 ID 和昵称 +- **start_time**:提交时间 +- **state**:1 审批中 / 2 已通过 / 3 已拒绝 / 4 已撤回 +- **is_finished**:是否结束(state ≠ 1 即结束) +- **task_id**:当前 task ID(处理动作要带) +- **candidate**:当前候选审批人 userid 逗号串 +- **node_id / node_infos**:当前节点 ID + 所有节点状态数组,用于渲染流程图 +- **var**:表单字段对象(type / start_time / end_time / description / other 等) +- **global_comments**:全文评论数组([[approve.comment.howto]]) + +## 生命周期 +1. **创建**:`approve/process/start`,state=1 +2. **流转**:每次 `approve/task/complete` 推进节点 +3. **结束**:state 变 2/3/4 +4. **清理**:仅结束态可调 `approve/process/delById` 物理删除 + +## 与历史记录的关系 +每次节点流转写一条 [[approve.history.concept]](`approve_proc_inst_history`),实例被删后历史也消失。 diff --git a/resources/ai-kb/zh/concept/approve/template.md b/resources/ai-kb/zh/concept/approve/template.md new file mode 100644 index 000000000..ecefbb1dc --- /dev/null +++ b/resources/ai-kb/zh/concept/approve/template.md @@ -0,0 +1,48 @@ +--- +id: approve.template.concept +title: 流程模板(流程定义) +type: concept +feature: approve +scope: admin +locale: zh +aliases: + - 流程模板 + - 审批模板 + - 流程定义 + - procdef 是什么 + - 流程名称 + - 审批流程是什么 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 流程模板只能由系统管理员创建、编辑、删除;普通成员只能基于已发布模板发起申请 + - 删除模板会同时清空该模板下的所有审批数据,不可恢复 + - 模板间不可复制:每个模板都要在编辑器里独立配置节点和表单 +last_verified: v1.7.90 +--- + +# 流程模板(流程定义) + +## 定义 +流程模板(Process Definition,简称 procdef)是审批插件里"审批种类"的元数据,定义了一类审批的全部行为:表单字段、节点顺序、每个节点的审批人/抄送人。普通成员发起的每一单审批(流程实例)都必须基于某个已发布的流程模板。常见模板:请假申请、报销申请、出差申请、用印申请、采购申请。 + +## 关键属性 +- **唯一性**:以 `name` 区分(如「请假申请」),同名模板不允许重复创建 +- **版本**:每次发布累计 `version`;旧版本会被新版本顶替,进行中的审批仍按当时的版本走完 +- **状态**:草稿(编辑中)/ 已发布(前台可选) +- **存储位置**:插件独立数据库 `<前缀>approve_*` 表,不在主程序业务表 +- **生效范围**:全租户共享,不按部门隔离;要按部门分模板请改用不同 `name` + +## 与流程实例的关系 +- 一个模板(procdef)= 一份蓝图 +- 用户每发起一单 = 创建一个流程实例(proc inst),状态独立流转 +- 删除模板:插件会同时清空所有以该模板发起的实例,**不可恢复** + +## 与节点 / 表单的关系 +- 流程模板包含两部分配置:**节点链**(决定走哪几步、由谁审批)见 [[approve.node.concept]]、**表单字段**(决定申请人填什么)见 [[approve.form.concept]] +- 节点和表单在同一个流程编辑器(iframe 内)一起设计、一起发布 + +## 创建入口 +管理员在审批中心顶部「流程设置」按钮 → 「+」新建,详细步骤见 [[approve.template.howto]]。 diff --git a/resources/ai-kb/zh/concept/apps/admin-apps/list.md b/resources/ai-kb/zh/concept/apps/admin-apps/list.md new file mode 100644 index 000000000..23e14a9c9 --- /dev/null +++ b/resources/ai-kb/zh/concept/apps/admin-apps/list.md @@ -0,0 +1,42 @@ +--- +id: app-admin.list.concept +title: 管理员应用全集 +type: concept +feature: app-admin +scope: admin +locale: zh +aliases: + - 管理员应用有哪些 + - 管理员能用哪些应用 + - 后台管理应用 + - 管理员入口 + - 管理员卡片 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(userIsAdmin) +negative: + - 普通成员看不到管理员应用区,整块都不会渲染 + - 管理员应用不通过应用市场安装,是主程序内置 + - 超级管理员专属功能(如 License Key、合规设置)不属于这里,需走系统设置 +last_verified: v1.7.90 +--- + +# 管理员应用全集 + +## 定义 +管理员应用是 DooTask 应用中心「管理员」分区里的卡片,仅系统管理员(`userIsAdmin`)可见,用于打开管理类抽屉/弹窗,无需进入「系统设置」深层菜单。 + +## 当前内置 6 个 +- **LDAP**:第三方目录服务接入与同步 +- **邮件通知**:SMTP 服务器与通知开关配置 +- **APP 推送**:移动端 UMENG 推送配置 +- **举报管理**:处理用户举报记录 +- **数据导出**:任务/超期/审批/签到等 4 种数据导出 +- **团队管理**:成员列表 / 部门管理 / 邀请加入 + +## 与签到/会议管理的关系 +签到管理、会议管理在「常用」分区,所有用户都能看到。但它们的「设置」入口(签到规则、会议参数)由抽屉右上角「设置」链接打开,仅管理员可见,详见 [[app-admin.checkin-setting.howto]]、[[app-admin.meeting-mgmt.howto]]。 + +## 可见性细则 +见 [[app-admin.visibility.concept]]。 diff --git a/resources/ai-kb/zh/concept/apps/admin-apps/visibility.md b/resources/ai-kb/zh/concept/apps/admin-apps/visibility.md new file mode 100644 index 000000000..827359723 --- /dev/null +++ b/resources/ai-kb/zh/concept/apps/admin-apps/visibility.md @@ -0,0 +1,45 @@ +--- +id: app-admin.visibility.concept +title: 管理员应用对谁可见 +type: concept +feature: app-admin +scope: admin +locale: zh +aliases: + - 谁能看到管理员应用 + - 普通成员能看到 LDAP 吗 + - 管理员应用权限 + - 为什么我看不到管理员分区 + - 管理员区不显示 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 部门负责人 / 部门管理员不属于系统管理员,看不到管理员应用 + - 没有「按应用单独授权管理员卡片」的细粒度开关 + - 关掉账号管理员身份后,应用中心管理员区在下次刷新前可能仍有缓存 +last_verified: v1.7.90 +--- + +# 管理员应用对谁可见 + +## 定义 +应用中心「管理员」分区(Admin row)只对系统管理员渲染,判断字段是前端 Vuex 的 `userIsAdmin`,对应后端 `User::isAdmin()`。普通成员、临时帐号、部门负责人均看不到这块。 + +## 判定逻辑 +- 后端:用户 `identity` 字段包含 `admin` → `isAdmin() = true` +- 前端:`store.state.userIsAdmin` 为 `true` 才挂载管理员卡片列表 +- 任一管理员应用项都带 `show: this.userIsAdmin` 过滤 +- 整个「管理员」标题区也用 `adminAppItems.length > 0` 判定,0 项则连标题都不显示 + +## 普通成员看到什么 +- 只看「常用」分区(系统应用 + 微应用,不含管理员卡片) +- 微应用如果设了 `visible_to: admin`,普通成员也看不到 + +## 升级身份后 +- 让某成员变成管理员:系统管理员在「团队管理」勾选其「管理员」身份 +- 该用户刷新页面后才能看到管理员应用区,应用中心不会自动热更新 + +## 相关 +- 管理员应用清单:[[app-admin.list.concept]] +- 入口在哪:[[app-admin.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/apps/system-apps/list.md b/resources/ai-kb/zh/concept/apps/system-apps/list.md new file mode 100644 index 000000000..cd2c4d83b --- /dev/null +++ b/resources/ai-kb/zh/concept/apps/system-apps/list.md @@ -0,0 +1,53 @@ +--- +id: app-system.list.concept +title: 系统应用全集列表 +type: concept +feature: app-system +scope: end-user +locale: zh +aliases: + - 系统应用有哪些 + - 内置应用清单 + - DooTask 自带应用 + - 都有什么应用 + - 应用中心默认有什么 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 列表是主程序硬编码,不能通过插件追加或卸载 + - 不同终端因屏幕方向会再追加日历 / 文件 / 设置三个入口 +last_verified: v1.7.90 +--- + +# 系统应用全集列表 + +## 定义 +系统应用是 DooTask 主程序在应用中心「常用」区硬编码的内置入口,所有登录用户可见。共 11 个固定项,外加少量按终端形态动态出现的入口。 + +## 11 个核心系统应用 + +| value | 名称 | 作用 | +|---|---|---| +| approve | 审批中心 | 发起 / 处理审批流(依赖 approve 插件) | +| signin | 签到打卡 | 上下班打卡(依赖 signin 设置,face 插件可选) | +| report | 工作报告 | 日报 / 周报 / 月报 | +| favorite | 我的收藏 | 查看收藏的任务 / 文件 / 消息 | +| recent | 最近打开 | 最近访问过的对象索引 | +| mybot | 我的机器人 | 自建消息机器人管理 | +| createGroup | 创建群组 | 直接打开创建群对话框 | +| meeting | 在线会议 | 进入会议入口 | +| addProject | 创建项目 | 直接打开创建项目对话框 | +| addTask | 添加任务 | 跨项目快速建任务 | +| exportManage | 导出管理 | 导出任务统计 / 超期 / 审批 / 签到数据 | + +## 仅竖屏额外出现 +移动端 / 桌面竖屏布局时,应用中心还会追加日历(calendar)、文件(file)、设置(setting)三个入口,以替代横屏被收起的左侧导航。 + +## 角标 +- approve 卡片右上角显示「审批未读数」 +- report 卡片右上角显示「工作报告未读数」 + +## 相关 +- 三类应用怎么区分:[[application.classify.concept]] +- 哪些卡片普通成员/管理员能看见:[[app-system.visibility.concept]] diff --git a/resources/ai-kb/zh/concept/apps/system-apps/relation.md b/resources/ai-kb/zh/concept/apps/system-apps/relation.md new file mode 100644 index 000000000..c58b6261c --- /dev/null +++ b/resources/ai-kb/zh/concept/apps/system-apps/relation.md @@ -0,0 +1,50 @@ +--- +id: app-system.relation.concept +title: 系统应用 vs 微应用 vs 管理员应用 +type: concept +feature: app-system +scope: end-user +locale: zh +aliases: + - 系统应用和微应用的区别 + - 微应用是什么 + - 管理员应用和系统应用的区别 + - 三种应用怎么区分 + - 哪些是内置哪些是插件 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 系统应用无法卸载或禁用 + - 微应用列表会随插件安装 / 卸载变化 + - 三类之间无法相互转换(如不能把系统应用改成微应用) +last_verified: v1.7.90 +--- + +# 系统应用 vs 微应用 vs 管理员应用 + +## 定义 +DooTask 应用中心同时呈现三种来源不同的卡片:系统应用(内置)、管理员应用(内置管理工具)、微应用(插件提供)。三者按数据来源、可见范围、能否卸载、是否依赖插件来区分。 + +## 对比表 + +| 维度 | 系统应用 | 管理员应用 | 微应用 | +|---|---|---|---| +| 数量是否固定 | 是(内置约 11 个) | 是(6 个:LDAP / 邮件通知 / APP 推送 / 举报管理 / 数据导出 / 团队管理) | 否,随插件变化 | +| 数据来源 | 主程序硬编码 | 主程序硬编码 | 已安装插件的 menu 注册 | +| 是否需要安装 | 不需要 | 不需要 | 需要管理员从「应用商店」安装 | +| 默认可见 | 所有登录用户 | 仅 `userIsAdmin` | 由插件 `visible_to` 决定 | +| 能否卸载 | 否 | 否 | 是,通过应用商店 | +| 升级方式 | 跟随主程序版本 | 跟随主程序版本 | 应用商店单独升级 | + +## 典型例子 +- 系统应用:工作报告、签到打卡、在线会议、我的收藏、最近打开、我的机器人、创建群组、群接龙、群投票、创建项目、添加任务 +- 管理员应用:LDAP、邮件通知、APP 推送、举报管理、数据导出、团队管理;管理员分区还有「应用商店」入口 +- 微应用(装插件后出现):审批中心(approve 插件)、OKR、AI 助手(ai 插件)、思维导图(minder)、流程图(drawio)、在线文档(OnlyOffice) + +## 共同点 +- 三类都展示在应用中心,混合后受拖拽排序(见 [[application.sort.howto]])影响 +- 都不在左侧主导航一级栏出现 + +## 想看系统应用完整列表 +全集见:[[app-system.list.concept]] diff --git a/resources/ai-kb/zh/concept/apps/system-apps/visibility.md b/resources/ai-kb/zh/concept/apps/system-apps/visibility.md new file mode 100644 index 000000000..89ba3039b --- /dev/null +++ b/resources/ai-kb/zh/concept/apps/system-apps/visibility.md @@ -0,0 +1,50 @@ +--- +id: app-system.visibility.concept +title: 系统应用对谁可见 +type: concept +feature: app-system +scope: end-user +locale: zh +aliases: + - 系统应用权限 + - 谁能看到这些应用 + - 普通员工能用哪些应用 + - 管理员独享的应用 + - 应用可见性 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 没有按部门 / 按角色单独控制系统应用可见性的开关 + - 普通成员无法通过设置「解锁」管理员应用区 +last_verified: v1.7.90 +--- + +# 系统应用对谁可见 + +## 定义 +系统应用按主程序写死的两条规则展示:常用区对所有登录用户开放,管理员区仅 `userIsAdmin` 用户可见。无法精细到部门或角色级别。 + +## 普通成员(end-user)能看到 +所有 11 个常用系统应用都对普通成员开放:审批、签到、工作报告、我的收藏、最近打开、机器人、创建群组、在线会议、创建项目、添加任务、导出管理。 + +但是否能正常用,还要看附加条件: +- approve:需安装 approve 插件,未安装时点开会提示 +- signin 的人脸打卡:需安装 face 插件 +- meeting:需主程序的会议模块启用 +- 在权限不足时(如非管理员开导出),后端仍会拒绝 + +## 管理员(admin)额外能看到 +管理员区独立显示,仅 `userIsAdmin` 用户能看见: +- LDAP 设置 +- 邮件通知 +- APP 推送 +- 举报管理 +- 数据导出(与常用区的「导出管理」是不同入口,前者偏配置后者偏一键导出) +- 团队管理 + +## 超级管理员(super-admin) +应用中心层面没有超管专属卡片;超管的差异点在「设置」内部页面,不在应用中心。 + +## 想详细看每个卡片做什么 +全集列表见:[[app-system.list.concept]] diff --git a/resources/ai-kb/zh/concept/appstore/overview.md b/resources/ai-kb/zh/concept/appstore/overview.md new file mode 100644 index 000000000..287d2b03a --- /dev/null +++ b/resources/ai-kb/zh/concept/appstore/overview.md @@ -0,0 +1,54 @@ +--- +id: appstore.concept +title: 应用市场是什么 +type: concept +feature: appstore +scope: admin +locale: zh +aliases: + - 应用商店 + - 应用市场 + - AppStore + - 插件市场 + - 装插件在哪 + - 插件管理 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 不是 iOS / Android 那种第三方应用商店,仅装 DooTask 内部插件 + - 普通成员看不到「应用商店」入口 + - 不支持单用户安装,所有插件对全员生效 +last_verified: v1.7.90 +--- + +# 应用市场是什么 + +## 定义 +应用市场(AppStore)是 DooTask 的插件管理后台,让系统管理员一键安装 / 卸载 / 更新各种功能插件,例如 AI 助手、审批、签到、OnlyOffice 等。其本体是一个名为 `appstore` 的微应用,注册在 `application/admin` 位置(见 `store/mutations.js` 第 396 行)。 + +## 关键属性 +- **微应用形态**:通过 `MicroApps` 加载 iframe,URL 为 `appstore/internal` +- **后端校验**:`App\Module\Apps::isInstalled($appId)` 读取 `docker/appstore/config/{appId}/config.yml` 中 `status: installed` 判断 +- **未安装会抛 ApiException**:`Apps::isInstalledThrow()` 提示「应用「X」未安装」 +- **跨容器调度**:内部调 `http://appstore` 服务 API 完成安装动作 +- **生命周期 Hook**:用户创建 / 离职会调 `dispatchUserHook` 通知各插件(user_onboard / offboard / update) + +## 插件类型 +- 官方内置:ai、approve、checkin/face、office、drawio、minder、okr、search(manticore)、fileview +- 社区插件:以 `community_` 前缀命名,如 `community_kuaifan_memos`、`community_kuaifan_kpi`、`community_Learntotolearn_roomly` + +## 与「微应用菜单」的区别 +- **应用市场**:管理插件「装/卸/更新」的容器 +- **微应用菜单**:插件装好后注册到「应用」页的菜单项,普通成员可见的入口 + +## 不支持 +- 不支持卸载 `appstore` 自身(`isInstalled('appstore')` 强制返回 true) +- 不支持普通成员浏览未装插件列表 +- 不支持安装非 DooTask 兼容的任意 Docker 镜像 + +## 相关 +- 安装:[[appstore.install.howto]] +- 卸载:[[appstore.uninstall.howto]] +- 入口:[[appstore.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/bot/overview.md b/resources/ai-kb/zh/concept/bot/overview.md new file mode 100644 index 000000000..23a40b457 --- /dev/null +++ b/resources/ai-kb/zh/concept/bot/overview.md @@ -0,0 +1,46 @@ +--- +id: bot.concept +title: 机器人是什么 +type: concept +feature: bot +scope: end-user +locale: zh +aliases: + - 机器人 + - bot + - robot + - DooTask 机器人 + - 机器人有什么用 + - 机器人分几种 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - 机器人本质是特殊 User(users.bot = 1),不能用普通账号登录网页 + - 机器人不能登录前端 UI,只能通过 token 调用 API 或被 @ 触发 + - 普通用户最多创建 50 个自建机器人 +last_verified: v1.7.90 +--- + +# 机器人是什么 + +## 定义 +DooTask 的机器人(bot / robot)是一种特殊用户账号(数据库 `users.bot = 1`),可以加入会话、收发消息、被 @ 触发,但不能登录 UI。它通常用于自动通知、外部系统接入、AI 对话。 + +## 三类机器人 +DooTask 把机器人分三类,能力依次递增: + +- **内置系统机器人**(system bot):邮箱以 `@bot.system` 结尾,由系统创建并维护,如「任务提醒」「审批」「签到打卡」「AI 助手」「会议通知」。普通用户不能新建或删除,仅管理员可改设置。详见 [[bot.system-list.concept]]。 +- **用户自建机器人**(UserBot):任何登录用户都可在「应用 → 我的机器人」里创建,用于把外部系统消息推进 DooTask,或拿到 token 后由外部代码代发消息。详见 [[bot.create.howto]]。 +- **Webhook 接入**:自建机器人配置 `webhook_url` 后,收到的群消息 / @触发 / 成员变更等事件会被 POST 到该地址,外部服务可据此回复。详见 [[bot.webhook.concept]]。 + +## 关键属性 +- 机器人有独立 `userid`、`token`、头像、昵称 +- 像普通用户一样被加入群([[bot.invite.howto]])或被 @ +- 群聊里必须 @ 机器人才会触发回复,单聊则任意消息都触发([[bot.mention.howto]]) +- 自建机器人可设 `clear_day`(消息保留天数,1-999,默认 90 天) + +## 不支持 +- 机器人之间不会互相触发(避免死循环),收到对方消息直接忽略 +- 系统机器人不能由普通用户删除(删除会报「系统机器人不能删除」) +- 单个用户不能创建超过 50 个自建机器人(超出报「超过最大创建数量」) diff --git a/resources/ai-kb/zh/concept/bot/system-list.md b/resources/ai-kb/zh/concept/bot/system-list.md new file mode 100644 index 000000000..df63c3f1d --- /dev/null +++ b/resources/ai-kb/zh/concept/bot/system-list.md @@ -0,0 +1,58 @@ +--- +id: bot.system-list.concept +title: 内置系统机器人有哪些 +type: concept +feature: bot +scope: end-user +locale: zh +aliases: + - 系统机器人有哪些 + - 内置机器人清单 + - 自带的机器人 + - 任务提醒机器人 + - 审批机器人 + - 签到机器人 + - 会议机器人 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - 系统机器人名单写死在 `UserBot::systemBotName`,不支持自助新增类型 + - 系统机器人不可删除;仅管理员能改昵称 / 头像 + - 部分机器人依赖对应插件已安装(AI、审批等),否则不出现 +last_verified: v1.7.90 +--- + +# 内置系统机器人有哪些 + +DooTask 自带一组系统机器人,邮箱统一以 `@bot.system` 结尾,由后端 `UserBot::systemBotName` 维护。普通用户能用,但不能创建或删除(详见 [[bot.permission.faq]])。 + +## 通知/提醒类 +- `system-msg@bot.system`「系统消息」:系统公告、登录提醒、版本通知 +- `task-alert@bot.system`「任务提醒」:任务被分配、截止时间临近、状态变更 +- `todo-alert@bot.system`「待办提醒」:个人待办到期提醒 +- `meeting-alert@bot.system`「会议通知」:会议邀请、开始/结束提醒(需会议插件) +- `okr-alert@bot.system`「OKR 提醒」:OKR 周期推进、KR 更新(需 OKR 插件) +- `approval-alert@bot.system`「审批」:审批待办、结果通知(需审批插件) + +## 互动/办公类 +- `check-in@bot.system`「签到打卡」:单聊里发指令打卡,支持手动 / 定位 / 路由器 MAC / 人脸 +- `anon-msg@bot.system`「匿名消息」:在他人单聊里以匿名身份发消息 +- `bot-manager@bot.system`「机器人管理」:用 `/list` `/newbot` `/setname` 等斜杠指令管理自建机器人 + +## AI 对话类 +- `ai-openai@bot.system`「ChatGPT」 +- `ai-claude@bot.system`「Claude」 +- `ai-deepseek@bot.system`「DeepSeek」 +- `ai-gemini@bot.system`「Gemini」 +- `ai-grok@bot.system`「Grok」 +- `ai-ollama@bot.system`「Ollama」 +- `ai-zhipu@bot.system`「智谱清言」 +- `ai-qianwen@bot.system`「通义千问」 +- `ai-wenxin@bot.system`「文心一言」 + +AI 机器人都需要在「系统设置 → AI 设置」里填 API Key 才能启用,未配置则报「机器人未启用」。 + +## 不支持 +- 系统机器人的指令、行为由后端写死,无法自定义回复逻辑 +- AI 机器人在群聊里必须 @ 才回复;私聊不需要 @ diff --git a/resources/ai-kb/zh/concept/bot/webhook.md b/resources/ai-kb/zh/concept/bot/webhook.md new file mode 100644 index 000000000..05358990f --- /dev/null +++ b/resources/ai-kb/zh/concept/bot/webhook.md @@ -0,0 +1,64 @@ +--- +id: bot.webhook.concept +title: 机器人 Webhook 接入 +type: concept +feature: bot +scope: end-user +locale: zh +aliases: + - webhook + - 机器人回调 + - 外部系统接入机器人 + - 机器人事件订阅 + - 怎么让机器人自动回复 + - bot 推送地址 +related_tools: [] +related_pages: [application] +prerequisites: + - 已创建用户机器人([[bot.create.howto]]) +negative: + - webhook_url 必须以 `http://` 或 `https://` 开头,否则不发送 + - URL 长度最大 255 字符 + - 调用超时 30 秒,超时不重试 + - 用户自建机器人收到斜杠开头(`/...`)的消息直接忽略,不会触发 webhook +last_verified: v1.7.90 +--- + +# 机器人 Webhook 接入 + +## 定义 +Webhook 是把「机器人收到的事件」用 HTTP POST 推到外部服务的地址。外部服务回 `{"code":200,"message":"..."}` 时,DooTask 会把 `message` 作为机器人的文本回复发回会话。 + +## 可订阅事件 +后端常量见 `App\Models\UserBot`: + +| 事件 key | 触发时机 | +|---|---| +| `message` | 机器人收到消息(单聊任意消息;群聊需 @ 机器人) | +| `dialog_open` | 用户首次打开和机器人的会话 | +| `member_join` | 群聊里机器人或他人加入 | +| `member_leave` | 群聊里成员离开 | + +不勾任何事件时默认按 `[message]` 处理(参考 `normalizeWebhookEvents`)。 + +## 请求体字段 +`event = message` 时主要字段: + +- `event`: `message` +- `text`: 用户的纯文本指令 +- `reply_text`: 若是引用回复,被引用消息的文本 +- `token`: 机器人当次有效的 API token,可调 DooTask API 代发消息 +- `dialog_id` / `dialog_type` / `session_id` +- `msg_id` / `msg_uid` / `mention`(是否被 @) +- `bot_uid`: 机器人 userid +- `msg_user`: 发送方信息(userid / email / nickname / 临时 token) +- `extras`: JSON 字符串,含 `timestamp` 等 +- `version`: 当前 DooTask 版本 + +## 设置 +在「我的机器人」编辑面板填 `webhook_url` 并勾事件;或单聊「机器人管理」里 `/webhook `。 + +## 不支持 +- 不支持鉴权签名(如 HMAC),请用 HTTPS + 服务端校验 `token` +- 不支持调用失败重试 / 死信队列;失败仅在后端 info 日志记录 +- 不能区分 webhook 收到的消息是来自哪个具体群成员之外的额外字段 diff --git a/resources/ai-kb/zh/concept/calendar/allday.md b/resources/ai-kb/zh/concept/calendar/allday.md new file mode 100644 index 000000000..2ada378ad --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/allday.md @@ -0,0 +1,54 @@ +--- +id: calendar.allday.concept +title: 日历的全天事件 vs 定时事件 +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 全天事件 + - 定时事件 + - 跨天任务 + - 日历事件类型 + - 任务跨多天日历 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 没有任务 type 字段区分,全天 / 定时是按时间范围**自动判定** + - 任务的 end_at 含具体时分时被识别为定时事件 + - 跨多天的任务在月视图渲染为横条,在周 / 日视图同样横跨 +last_verified: v1.7.90 +--- + +# 日历的全天事件 vs 定时事件 + +## 定义 +DooTask 日历把每个任务自动分类成「全天」或「定时」,规则只看任务的 start_at / end_at 时间范围,没有独立的 `is_allday` 标签: + +- **全天事件**:`start_at <= 今天 00:01` 且 `end_at >= 今天 23:59`(或更长) +- **定时事件**:start_at / end_at 都在同一天内的具体时段 + +## 渲染差异 +| 类型 | 月视图 | 周视图 | 日视图 | +|---|---|---|---| +| 全天 | 单元格顶部横条 | 顶部全天条带 | 顶部全天条 | +| 定时 | 显示时段标记 | 纵向时段块 | 纵向时段块 | + +## 怎么把任务变成全天 +- 创建 / 编辑任务时只填日期(不填时分)→ 默认 end_at 设为当天 23:59:59 +- 跨多天的任务自然变全天(横跨多个单元格) + +## 怎么把任务变成定时 +- 编辑 end_at 时填具体时分(如 14:00-15:30) +- 周 / 日视图能看到准确的时段块 + +## 跨多天任务 +- 一个任务 start_at 在周一、end_at 在周三 → 在月视图横跨 3 格 +- 在周视图顶部连续横条 +- 在日视图每一天都看到这条事件 + +## 不支持 +- 任务无独立 `is_allday` 字段,全靠时间范围推断 +- 编辑日历事件时不能切换"按全天 / 定时" +- 不能给单个任务设"每天某时段重复" diff --git a/resources/ai-kb/zh/concept/calendar/edit-via-detail.md b/resources/ai-kb/zh/concept/calendar/edit-via-detail.md new file mode 100644 index 000000000..6432ff2ad --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/edit-via-detail.md @@ -0,0 +1,52 @@ +--- +id: calendar.edit.concept +title: 在日历事件上能做什么操作 +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历事件点击 + - 点日历任务怎么办 + - 日历任务详情 + - 日历改任务 + - 日历事件编辑 +related_tools: [update_task, complete_task, delete_task] +related_pages: [calendar, task_detail] +prerequisites: [] +negative: + - 日历上无独立的"事件编辑"窗口,所有改动走任务详情页 + - 无法在日历直接添加协作者、改可见性等非时间字段 + - 移动端日历仅查看([[calendar.mobile.faq]]) +last_verified: v1.7.90 +--- + +# 在日历事件上能做什么操作 + +## 是什么 +日历显示的"事件"本质是 ProjectTask 任务的时间投影([[calendar.concept]])。点击事件 / 拖动 / 右键的所有操作最终都改 ProjectTask 字段。 + +## 桌面端操作矩阵 + +| 操作 | 做法 | 改的字段 | +|---|---|---| +| 看任务详情 | 单击事件块 | 无(跳转任务详情页) | +| 改 end_at 时间 | 拖动事件块([[calendar.drag.howto]]) | end_at / start_at | +| 改 duration | 拖事件边缘 | start_at 或 end_at | +| 完成任务 | 进任务详情勾选完成([[task.complete.howto]]) | complete_at | +| 删除任务 | 进任务详情删除([[task.delete-restore.howto]]) | deleted_at | +| 改其他字段(描述 / 优先级 / 标签) | 进任务详情编辑([[task.edit.howto.basic]]) | 各字段 | + +## 移动端操作矩阵 +- 单击事件 → 跳转任务详情 +- 所有编辑都在任务详情里做 +- 拖动 / 右键 / 改 duration 都不支持 + +## 创建新事件 +- 在日历空白处单击 / 拖框 → 详见 [[calendar.create.howto]] +- 创建的是带时间的任务,不是独立事件 + +## 不支持 +- 日历事件无独立的"右键菜单"提供任务字段一键编辑 +- 不能在日历"复制事件"为下一周(用 [[task.recurring.howto]] 循环代替) +- 不能给日历事件单独打 calendar 标签(任务标签是 [[task.field.tag.concept]]) diff --git a/resources/ai-kb/zh/concept/calendar/filter.md b/resources/ai-kb/zh/concept/calendar/filter.md new file mode 100644 index 000000000..16dad60c4 --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/filter.md @@ -0,0 +1,53 @@ +--- +id: calendar.filter.concept +title: 日历的过滤维度(按项目分色) +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历筛选 + - 日历按项目 + - 日历分组 + - 项目颜色日历 + - 怎么筛日历事件 +related_tools: [list_tasks, list_projects] +related_pages: [calendar] +prerequisites: [] +negative: + - 日历无显式"项目筛选"按钮,仅按 calendarId(项目 id)分组着色 + - 不能"只看 X 项目,隐藏其他" + - 不能按负责人、优先级、标签过滤事件 +last_verified: v1.7.90 +--- + +# 日历的过滤维度(按项目分色) + +## 定义 +DooTask 日历前端把每个任务的 `project_id` 作为 `calendarId`,按项目分组并赋不同颜色,让用户视觉上区分不同项目的任务。这是日历能做的"过滤 / 分组"上限。 + +## 颜色规则 +- 每个项目自动分配一个颜色(按 project_id 散列) +- 同项目所有任务共用一个颜色 +- 颜色不直接用 [[task.field.priority.concept]] 的 p_color 或 [[task.field.color.concept]] 的 color +- 仅在日历视图独立设色,不影响列表 / 看板 + +## 显式筛选(不支持) +| 维度 | 是否支持 | 替代 | +|---|---|---| +| 按项目 | 部分(仅着色) | 进项目详情看 | +| 按负责人 | ✗ | 仪表盘 / 项目页 | +| 按优先级 | ✗ | 项目列表 | +| 按标签 | ✗ | 项目列表 | +| 按是否完成 | ✗(默认隐藏完成) | 任务列表 | +| 按工作流状态 | ✗ | 项目工作流视图 | + +## 想做"只看 X 项目的日历" +- 进项目详情 → 切到日历视图(每个项目有自己的日历视图) +- 比全局日历的筛选粒度更细 +- 但项目级日历也仅显示该项目的任务 + +## 不支持 +- 日历无显式筛选 UI +- 不能保存"筛选预设"(如"只看紧急任务") +- 不能按用户标签 / 部门做日历视图 diff --git a/resources/ai-kb/zh/concept/calendar/overview.md b/resources/ai-kb/zh/concept/calendar/overview.md new file mode 100644 index 000000000..7bfc9a889 --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/overview.md @@ -0,0 +1,53 @@ +--- +id: calendar.concept +title: 日历是什么 / 数据源 +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历是什么 + - 日历显示什么 + - 日历数据从哪 + - 日历来自任务吗 + - 任务怎么变日历事件 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 日历**没有独立的事件表**,全部从 ProjectTask 派生 + - 不显示会议(Meeting)、签到、报告,仅显示任务 + - 仅显示当前用户作为负责人(owner=1)的任务,不显示协作任务 +last_verified: v1.7.90 +--- + +# 日历是什么 / 数据源 + +## 定义 +DooTask 日历是把 [[task.field.deadline.concept]] 有 end_at 的任务按时间轴铺到月 / 周 / 日格子里的展示视图。它**没有独立的 schedule / event 表**,所有事件完全来自 `ProjectTask` 表,按 `start_at` 和 `end_at` 字段绘制。 + +## 数据规则 +- 数据源:ProjectTask 表 +- 必备字段:`end_at` 非空(没 end_at 的任务不会出现在日历) +- 关系:`ProjectTaskUser.owner = 1` 命中当前用户 +- 状态:`archived_at IS NULL`(已归档不显示) +- 范围:按当前可视时间范围 `rangeTime` 查询,切换月 / 周 / 日时自动调整 + +## 事件分类 +| 类型 | 判断规则 | 显示样式 | +|---|---|---| +| 全天 | start_at <= 今天 00:01 且 end_at >= 今天 23:59 | 顶部横条 | +| 定时 | start_at / end_at 在同一天内的具体时段 | 时间段块 | + +详见 [[calendar.allday.concept]]。 + +## 与其他模块的关系 +- **仪表盘**([[dashboard.concept]]):列表形式,按今日 / 超期 / 待完成分类,不显示位置 +- **任务列表**:按列表展示,可看已完成 / 已归档 +- **日历**:按时间格展示,仅未归档 + 有 end_at + 我是负责人 + +## 不支持 +- 没有独立日历事件(必须先建任务,详见 [[calendar.create.howto]]) +- 不能订阅他人 / 部门日历 +- 不能 iCal 导出 / 外部日历同步 +- 详见 [[calendar.ical.faq]] diff --git a/resources/ai-kb/zh/concept/calendar/task-only.md b/resources/ai-kb/zh/concept/calendar/task-only.md new file mode 100644 index 000000000..01ebd4e73 --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/task-only.md @@ -0,0 +1,55 @@ +--- +id: calendar.task.concept +title: 日历只显示「我作为负责人的任务」 +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历看不到协作任务 + - 日历只有自己负责的 + - 日历不显示别人安排 + - 协作任务在哪 + - 日历过滤范围 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 日历不显示 ProjectTaskUser.owner=0(协作 / assist)的任务 + - 想看协作任务请到 [[dashboard.assist.howto]] + - 不能切换"显示所有项目任务包括别人的" +last_verified: v1.7.90 +--- + +# 日历只显示「我作为负责人的任务」 + +## 定义 +DooTask 日历的过滤规则相当窄:仅展示 `ProjectTaskUser.owner = 1` 命中当前用户的、有 end_at 的、未归档的任务。所以**协作的任务不会出现在日历上**。这是设计:日历是"我自己要安排时间做什么"的视图,避免被他人的任务挤满。 + +## 不显示的内容 +| 类型 | 为什么不显示 | +|---|---| +| 我是协作者(assist)的任务 | owner=1 过滤掉 | +| 我没设 end_at 的任务 | end_at 是日历定位依据 | +| 已归档的任务 | archived_at 过滤 | +| 已完成的任务 | 大部分场景仅显示未完成(视前端配置) | +| 别人的任务 | 没在 ProjectTaskUser 命中我 | +| 会议(Meeting) | 不是 ProjectTask | +| 签到 / 报告 | 不是 ProjectTask | + +详见 [[calendar.meeting-not-shown.faq]]。 + +## 怎么看协作任务 +- 仪表盘「[[dashboard.assist.howto]]」分组 +- 任务列表设过滤器「协作的任务」 +- 项目详情页所有视图都能看到(不分负责人 / 协作) + +## 怎么让任务出现在日历 +1. 你必须是该任务负责人([[task.field.owner-assist.concept]] owner=1) +2. 任务必须有 end_at 字段([[task.field.deadline.concept]]) +3. 任务未归档、未完成(默认前端配置) + +## 不支持 +- 不能切换"也显示协作任务" +- 不能给团队成员的日历做合并视图 +- 不能看别人日历 diff --git a/resources/ai-kb/zh/concept/calendar/timezone.md b/resources/ai-kb/zh/concept/calendar/timezone.md new file mode 100644 index 000000000..8551ea0f9 --- /dev/null +++ b/resources/ai-kb/zh/concept/calendar/timezone.md @@ -0,0 +1,51 @@ +--- +id: calendar.timezone.concept +title: 日历的时区处理 +type: concept +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历时区 + - 跨时区任务 + - 不同地区看任务时间 + - 时区不一样任务时间 + - 国际团队日历 +related_tools: [list_tasks] +related_pages: [calendar, user_settings] +prerequisites: [] +negative: + - 任务数据库无时区字段,时间按 UTC 存储 + - 日历显示按用户当前浏览器的本地时区 + - 同一任务在不同时区用户看到的时段会差几小时 +last_verified: v1.7.90 +--- + +# 日历的时区处理 + +## 定义 +DooTask 任务的 `start_at` / `end_at` 在数据库**统一按 UTC 存储**,但前端展示时按浏览器的本地时区呈现。日历组件也按这个规则渲染。所以**跨时区的团队成员看到的同一任务时段可能不一样**,但 UTC 真值一致。 + +## 显示规则 +- 浏览器自动识别本地时区 +- 日历事件块按 `(start_at UTC) → 本地时区` 的转换显示 +- 日 / 周视图的时段标尺也按本地时区 +- 用户切换电脑时区 / 出差 → 日历事件位置相应平移 + +## 时区选择器 +- 日历组件支持显示时区切换器(`timezonesCollapsed=false`) +- 在桌面端日历视图右上角可展开切换显示时区 +- 切换显示时区只影响**前端展示**,不修改任务的 UTC 字段 + +## 跨时区团队的注意事项 +1. 北京同事建一个"今天 09:00"的任务(UTC 01:00) +2. 巴黎同事(UTC+1)看到"今天 02:00" +3. 旧金山同事(UTC-7)看到"今天前一天 18:00" + +如果团队都用同一约定时区(如 UTC+8),任务时间会一致。 + +## 不支持 +- 任务无 timezone 字段(不能为单个任务指定时区) +- 不能给"全公司"设固定时区 +- 不能给日历事件标注"按某时区显示" +- 不支持时区随项目 / 用户偏好设置自动切换 diff --git a/resources/ai-kb/zh/concept/checkin/face.md b/resources/ai-kb/zh/concept/checkin/face.md new file mode 100644 index 000000000..2234c887d --- /dev/null +++ b/resources/ai-kb/zh/concept/checkin/face.md @@ -0,0 +1,39 @@ +--- +id: checkin.face.concept +title: 人脸签到原理与依赖 +type: concept +feature: checkin +scope: end-user +locale: zh +aliases: + - 人脸识别原理 + - face 插件 + - 人脸签到依赖 + - 刷脸打卡怎么工作的 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 face 插件 +last_verified: v1.7.90 +--- + +# 人脸签到原理与依赖 + +## 定义 +人脸签到是 DooTask 签到的一种方式,依赖独立的 **face 插件**提供人脸识别后端服务(容器名 `face`,内部端口 7788)。主程序只负责存储人脸图片地址 (`UserCheckinFace.faceimg`) 和触发签到记录写入,**所有特征提取、比对都由 face 插件完成**。 + +## 工作流程 +1. 成员在签到设置上传人脸图片 +2. 主程序把图片 base64 后 POST 到 `http://face:7788/user`,参数含 `enrollid`(成员 ID)、`name`(昵称)、`backupnum=50` +3. face 容器把特征存入设备库 +4. 现场人脸识别一体机扫到该成员 → 调主程序 API 写一条 `UserCheckinRecord` + +## 关键依赖 +- **face 插件**:人脸识别引擎容器,未安装会抛 `Apps::isInstalledThrow('face')` 异常 +- **人脸识别一体机硬件**:插件 README 注明「需配合指定硬件设备使用」 +- **管理员开关**:「签到方式」勾选「人脸签到」+「允许修改」开启「允许成员上传人脸图片」 + +## 不支持 +- 主程序自带的浏览器 / WebRTC 摄像头不能直接当人脸打卡器 +- face 插件镜像较大(约 15MB+),首次安装下载较慢 +- 删除成员或卸载插件后,face 容器内的特征不会自动清空,需要管理员手动删除 diff --git a/resources/ai-kb/zh/concept/checkin/overview.md b/resources/ai-kb/zh/concept/checkin/overview.md new file mode 100644 index 000000000..c672386a5 --- /dev/null +++ b/resources/ai-kb/zh/concept/checkin/overview.md @@ -0,0 +1,46 @@ +--- +id: checkin.concept +title: 签到打卡是什么 +type: concept +feature: checkin +scope: end-user +locale: zh +aliases: + - 签到打卡 + - 上下班打卡 + - 考勤 + - DooTask 签到 + - 打卡功能 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 签到不支持节假日 / 调休的精细配置,只识别基础节假日(自动跳过提醒) + - 不是 KPI / 工资系统,仅记录打卡时间,不算迟到 / 早退分数 + - 数据无法跨企业 / 跨实例同步 +last_verified: v1.7.90 +--- + +# 签到打卡是什么 + +## 定义 +签到打卡是 DooTask 内置的考勤记录功能,用于成员每天上下班打卡。打卡数据存到 `UserCheckinRecord` 表,按天聚合多次打卡时间,并自动切分为「上班 / 下班」时段。功能由系统管理员在「签到设置」全局开关,开启后所有成员都可参与。 + +## 支持的签到方式 +DooTask 提供 4 种签到方式,管理员可在「签到设置 → 签到方式」勾选启用: + +- **人脸签到(face)**:通过外接人脸识别设备扫脸,需安装 [[checkin.plugin.concept]] 中的 face 插件 +- **WiFi 签到(auto)**:办公网路由器(OpenWrt)定时上报 MAC,落到办公网即自动签到,详见 [[checkin.wifi.howto]] +- **定位签到(locat)**:移动 App 在「签到机器人」对话里发送位置,落在允许半径内打卡 +- **手动签到(manual)**:在「签到机器人」对话框输入指令打卡 + +## 涉及的数据 +- `UserCheckinRecord`:每天每次打卡记录(含时间数组) +- `UserCheckinMac`:成员的 MAC 地址(最多 3 个) +- `UserCheckinFace`:成员的人脸图片(仅 1 张) +- `checkinSetting`:系统签到全局参数 + +## 相关概念 +- 签到规则与配置:[[checkin.rule.concept]] +- 签到提醒机制:[[checkin.remind.concept]] +- 是否是插件:[[checkin.plugin.concept]] diff --git a/resources/ai-kb/zh/concept/checkin/plugin.md b/resources/ai-kb/zh/concept/checkin/plugin.md new file mode 100644 index 000000000..8bc289c5d --- /dev/null +++ b/resources/ai-kb/zh/concept/checkin/plugin.md @@ -0,0 +1,41 @@ +--- +id: checkin.plugin.concept +title: 签到是插件还是内置功能 +type: concept +feature: checkin +scope: end-user +locale: zh +aliases: + - 签到是插件吗 + - 签到要装吗 + - checkin 插件 + - 人脸签到是插件吗 + - 签到要不要安装 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 应用市场没有名为「checkin」或「签到」的独立插件 + - 卸载 face 插件不会影响 WiFi / 定位 / 手动签到 +last_verified: v1.7.90 +--- + +# 签到是插件还是内置功能 + +## 结论 +签到打卡的**主体功能是 DooTask 内置的**,不需要单独安装插件。模型 (`UserCheckinRecord` / `UserCheckinMac` / `UserCheckinFace`)、签到机器人 (`check-in@bot.system`)、提醒任务 (`CheckinRemindTask`)、设置接口都打包在主程序里,开箱即用。 + +## 各签到方式的依赖 +- **手动签到(manual)**:无依赖,主程序自带 +- **WiFi 签到(auto)**:无插件依赖,只需要管理员在 OpenWrt 路由器执行一键安装脚本 +- **定位签到(locat)**:无插件依赖,但需要管理员在「签到设置」配置百度 / 高德 / 腾讯地图 Key,且只支持移动端 App +- **人脸签到(face)**:**需要安装 face 插件**(应用市场搜「Face check-in」),并配套人脸识别硬件设备 + +## 关联应用市场 +- `face` 插件:人脸识别后端服务,未装时人脸上传 / 现场刷脸都会失败,详见 [[checkin.face.concept]] +- `approve` 插件:影响提醒筛选——已请假 / 外出审批的成员不会收到缺卡提醒 + +## 不支持 +- 没有第三方「考勤」插件取代内置签到 +- 没法只装签到不装签到机器人(机器人是系统自动创建的) +- 主程序版本升级后签到能力随版本走,无独立版本号 diff --git a/resources/ai-kb/zh/concept/checkin/remind.md b/resources/ai-kb/zh/concept/checkin/remind.md new file mode 100644 index 000000000..5930131dd --- /dev/null +++ b/resources/ai-kb/zh/concept/checkin/remind.md @@ -0,0 +1,46 @@ +--- +id: checkin.remind.concept +title: 签到提醒怎么发的 +type: concept +feature: checkin +scope: end-user +locale: zh +aliases: + - 签到提醒 + - 打卡提醒 + - 上班提醒 + - 缺卡提醒 + - 为什么收不到打卡提醒 + - 谁会收到签到提醒 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不是所有人都会收到提醒,新成员入职 3 天内无打卡记录不会被提醒 + - 法定节假日不会发提醒(主程序内置节假日表自动跳过) + - 已请假 / 外出审批通过的成员不会被提醒 +last_verified: v1.7.90 +--- + +# 签到提醒怎么发的 + +## 定义 +签到提醒是由 `CheckinRemindTask` 异步任务通过签到机器人 (`check-in@bot.system`) 在群外私聊推送的两类消息,用于催员工按时打卡。任务每分钟跑一次,只在触发窗口内的当日推一次。 + +## 两种提醒 +- **打卡提醒(in)**:上班时间前的「快到上班时间了,别忘了打卡哦」,提前分钟数由「签到打卡提醒」字段控制(默认 5 分钟) +- **缺卡提醒(exceed)**:上班时间过去后还没打卡发的「上班时间到了,你还没有打卡哦」,延后分钟数由「签到缺卡提醒」字段控制(默认 10 分钟) + +提前 / 延后值都可在管理员「签到设置」里改,设为 0 则关闭对应提醒。 + +## 提醒对象筛选 +任务按下面规则逐个判断每位在职非机器人成员,全部命中才推送: + +- 当天还没有 `UserCheckinRecord`(已打卡的不推) +- 过去 3 天内有过签到记录(排除新人 / 长期不打卡者) +- 没有请假 / 外出的审批正在生效(依赖 approve 插件的 `ApproveProcInstHistory::userIsLeave`) + +## 关联设置 +- 「签到设置 → 功能开启」必须为「开启」 +- 「签到时间」第一段被视为上班时间,提醒以它为基准 +- 节假日识别由 `Extranet::isHoliday()` 查询,命中节假日全员不推 diff --git a/resources/ai-kb/zh/concept/checkin/rule.md b/resources/ai-kb/zh/concept/checkin/rule.md new file mode 100644 index 000000000..f4004290b --- /dev/null +++ b/resources/ai-kb/zh/concept/checkin/rule.md @@ -0,0 +1,49 @@ +--- +id: checkin.rule.concept +title: 签到规则与全局配置 +type: concept +feature: checkin +scope: admin +locale: zh +aliases: + - 签到规则 + - 签到全局设置 + - 上下班时间设置 + - 签到方式配置 + - 签到时间窗口 + - 管理员怎么开签到 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员身份 +last_verified: v1.7.90 +--- + +# 签到规则与全局配置 + +## 入口 +桌面端 / 移动端:「应用」→「签到打卡」→ 抽屉右上角「签到设置」(仅管理员可见) +也可走:管理后台 → 系统设置 → 签到 + +## 主要字段 +配置存储在 `checkinSetting` 系统设置项,关键字段: + +- **功能开启(open)**:`open` / `close`,关闭后整套签到能力对所有人停用 +- **签到时间(time)**:`[上班时间, 下班时间]`,如 `["09:00", "18:00"]`,提醒任务基于这两个时间点 +- **最早可提前(advance)/ 最晚可延后(delay)**:上下班时间前后允许签到的分钟数,超过会被拒 +- **签到打卡提醒(remindin)**:上班前 N 分钟推「打卡提醒」 +- **签到缺卡提醒(remindexceed)**:上班后 N 分钟推「缺卡提醒」 +- **签到方式(modes)**:勾选启用的方式列表,从 `face` / `auto`(WiFi)/ `locat`(定位)/ `manual`(手动)中多选 +- **允许修改(edit / face_upload)**:是否允许成员自行改 MAC / 上传人脸 + +## 子方式额外配置 +- **人脸签到**:签到备注 + 重复打卡提醒开关 +- **WiFi 签到**:路由器一键安装命令 +- **定位签到**:百度 / 高德 / 腾讯三选一的地图 Key + 允许签到坐标 + 半径(50-5000 米) +- **手动签到**:签到备注 + +## 不支持 +- 不支持按部门 / 角色配置不同上下班时间,全员一套 +- 不支持配置自定义节假日;节假日由内置接口 `Extranet::isHoliday()` 判断 +- 不支持多班次 / 排班 +- 改完设置即时生效,但已生成的签到记录不会回溯调整 diff --git a/resources/ai-kb/zh/concept/compliance/overview.md b/resources/ai-kb/zh/concept/compliance/overview.md new file mode 100644 index 000000000..af2f85acd --- /dev/null +++ b/resources/ai-kb/zh/concept/compliance/overview.md @@ -0,0 +1,54 @@ +--- +id: compliance.concept +title: DooTask 合规能力概览 +type: concept +feature: compliance +scope: admin +locale: zh +aliases: + - 合规 + - 合规能力 + - GDPR 支持 + - 数据合规 + - 隐私合规 + - 数据保留 +related_tools: [] +related_pages: [] +prerequisites: + - 多数动作需要系统管理员权限 +negative: + - DooTask 主程序没有专门的「合规设置」集中页面 + - 不内置 GDPR DSR 工单系统,需要管理员人工响应 + - 不支持自动数据保留周期清理(需手动或脚本) + - 没有自动获取用户同意(cookie banner 等)的开关 +last_verified: v1.7.90 +--- + +# DooTask 合规能力概览 + +## 定义 +DooTask 主程序没有把「合规」做成单独菜单,但通过多个分散功能覆盖了数据合规、用户隐私、内容审核等场景。这里把和合规相关的现有能力索引到一起,方便管理员对照内部合规要求逐项检查。 + +## 涉及的现有能力 +| 维度 | 现有手段 | 主程序入口 | +|---|---|---| +| 内容审核 | 用户举报 + 管理员处理 | [[abuse-report.concept]] | +| 数据导出(数据可携性) | 任务 / 审批 / 签到 Excel 导出 | [[data-export.concept]] | +| 账号下线 / 数据删除 | 团队管理 → 删除成员;Apps 触发 `user_offboard` hook | 团队管理 | +| 审计 | 操作日志(部分模块)+ 审批历史 | 模块自带 | +| 访问控制 | 项目 / 任务 / 系统三级权限 + LDAP | [[role-permission.permission-denied.faq]] | +| 数据本地化 | 全私有部署 + Docker,所有数据库在自有服务器 | 部署阶段 | +| 加密传输 | HTTPS(需自配 Nginx 证书) | 部署阶段 | + +## 删除请求(GDPR 第 17 条) +用户被删除时,主程序会调用 `Apps::dispatchUserHook($user, 'user_offboard')`,把删除事件以 `event_type=delete` 推送到 appstore 微服务,由各插件自行清理用户数据。具体执行情况依赖每个插件实现。 + +## 不支持 +- 没有内置的合规配置面板 +- 没有自动数据保留策略(你需要外部脚本定期清理) +- 没有内置数据出口审计(数据导出动作未单独留审计日志) +- 不内置 cookie 同意弹窗、隐私政策签署、DSR 工单等模块 + +## 相关 +- 合规配置项细节:[[compliance.howto]] +- 入口与责任人:[[compliance.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/dashboard/overview.md b/resources/ai-kb/zh/concept/dashboard/overview.md new file mode 100644 index 000000000..f4967f622 --- /dev/null +++ b/resources/ai-kb/zh/concept/dashboard/overview.md @@ -0,0 +1,56 @@ +--- +id: dashboard.concept +title: 仪表盘是什么 / 显示哪些卡片 +type: concept +feature: dashboard +scope: end-user +locale: zh +aliases: + - 仪表盘是什么 + - 仪表盘有什么 + - 仪表盘卡片 + - 仪表盘有哪些卡片 + - 仪表盘显示什么 + - 仪表盘显示哪些卡片 + - 个人工作台 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 仪表盘只显示「我作为负责人 owner=1」的任务,协作任务在专门的分组 + - 仪表盘不显示项目进度 / 团队整体数据,仅个人视角 + - 仪表盘不显示已完成任务(默认) +last_verified: v1.7.90 +--- + +# 仪表盘是什么 / 显示哪些卡片 + +## 定义 +DooTask 仪表盘(Dashboard)是当前用户的个人工作台,回答「今天我要做什么」。仪表盘由顶部 3 张数字卡片 + 下方 4 个分组列表卡片组成,从前端 store 的 `dashboardTask` 与 `assistTask` getter 实时计算,按时间分类显示当前用户名下的未完成任务。 + +## 顶部 3 张数字卡片 +| 卡片 | 含义 | +|---|---| +| 今日到期 | end_at 在今天范围内、未完成、未归档的任务数 | +| 超期任务 | end_at 已过今天 23:59:59 但未完成的任务数 | +| 待完成 | 没设 end_at 或 end_at 还未到的未完成任务数 | + +## 下方 4 张分组卡片 +1. **今日到期** 卡片 — 今天必须完成的任务 +2. **超期任务** 卡片 — 需要立刻处理或调整截止时间的任务 +3. **待完成** 卡片 — 后续要做的任务(含无截止时间) +4. **协助的任务** 卡片 — 我作为 [[task.field.owner-assist.concept]] 中协作者(assist)的任务,独立于上面三组 + +## 数据来源 +- 全部从 ProjectTask 表派生([[task.field.deadline.concept]] 的 end_at 字段) +- 仅算 owner=1 命中当前用户的(前 3 组),assist 命中的(第 4 组) +- 已归档([[task.archive.howto]])/ 已完成([[task.complete.howto]])的任务不显示 + +## 与「项目统计」的区别 +- 仪表盘:个人视角,全部项目 +- [[project.statistics.concept]]:单项目视角,整项目 + +## 不支持 +- 不显示团队 / 部门维度的汇总 +- 不能切换看别人的仪表盘 +- 不能增加自定义卡片 diff --git a/resources/ai-kb/zh/concept/data-export/overview.md b/resources/ai-kb/zh/concept/data-export/overview.md new file mode 100644 index 000000000..93b68e26b --- /dev/null +++ b/resources/ai-kb/zh/concept/data-export/overview.md @@ -0,0 +1,52 @@ +--- +id: data-export.concept +title: 数据导出概览 +type: concept +feature: data-export +scope: admin +locale: zh +aliases: + - 数据导出是什么 + - 导出 Excel + - 导出报表 + - 后台能导出哪些数据 + - 管理员导出 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(userIsAdmin) +negative: + - 导出文件不直接下载到浏览器,而是由系统机器人发到管理员的私聊 + - 不支持普通成员自助导出,全部入口仅管理员可见 + - 不支持导出原始 JSON / 数据库表,只导出预设字段的 Excel +last_verified: v1.7.90 +--- + +# 数据导出概览 + +## 定义 +数据导出是 DooTask 内置的管理员功能,把系统数据按预设字段整理成 Excel 文件,通过系统机器人(`system-msg`)异步发到管理员的私聊。需要系统管理员(`userIsAdmin`)才能触发。 + +## 支持的导出类型 +后台「数据导出」菜单实际提供 4 类导出,分别对应不同的 API: + +| 名称 | API | 说明 | +|---|---|---| +| 任务统计 | `api/project/task/export` | 按成员 + 时间段导出任务,含负责人/工时/状态 | +| 超期任务 | `api/project/task/exportoverdue` | 全系统未完成且已超期的任务 | +| 审批数据 | `api/approve/export` | 按流程分类 + 状态 + 时间段导出审批单 | +| 签到数据 | `api/system/checkin/export` | 按成员 + 日期段 + 时间段导出签到记录 | + +## 关键属性 +- **异步生成**:触发后立即返回,文件由 Swoole 协程后台生成(`go(...)`),完成后才发消息 +- **下载链接限时**:消息中的下载链接(`api/.../down`)使用 `Down::cache_decode()` 解码,链接过期文件失效 +- **机器人通知**:所有导出完成消息发送方都是 `system-msg` 系统机器人 +- **范围限制**:每种导出都有自己的成员数 / 日期范围上限(通常单次 ≤ 35 天、≤ 50 个成员),具体在每个子类型的提示文案里说明 + +## 不支持 +- 不支持导出工作报告、用户列表、项目列表(产品里未开放对应入口) +- 不支持自定义字段选择,导出列固定 +- 不支持定时 / 周期性自动导出 + +## 入口 +管理员侧入口和操作步骤见 [[data-export.entry.menu-map]]。 diff --git a/resources/ai-kb/zh/concept/desktop-notify/overview.md b/resources/ai-kb/zh/concept/desktop-notify/overview.md new file mode 100644 index 000000000..d798cabae --- /dev/null +++ b/resources/ai-kb/zh/concept/desktop-notify/overview.md @@ -0,0 +1,53 @@ +--- +id: desktop-notify.concept +title: 桌面通知是什么 +type: concept +feature: desktop-notify +scope: end-user +locale: zh +aliases: + - 桌面通知 + - 桌面端通知 + - 系统通知栏 + - 弹窗通知 + - 电脑右下角通知 + - 任务栏闪烁 +related_tools: [] +related_pages: [] +prerequisites: + - 使用 DooTask 桌面端(Electron 客户端)或允许了浏览器通知的 Web 版 +negative: + - Web 版需用户在浏览器对话框中点「允许」才能弹出通知,否则只能在 APP 内提示 + - 桌面通知不走友盟,与 APP 推送是完全独立的通道 + - 关闭 DooTask 进程后不会有通知(与移动端不同,没有后台守护服务) +last_verified: v1.7.90 +--- + +# 桌面通知是什么 + +## 定义 +桌面通知是 DooTask 桌面端(Electron 客户端)和 Web 版在新消息到达时,通过操作系统原生通知 API 弹出的提示框。桌面端调用 `new Notification()`(Node 端),Web 版用浏览器 Notification API。 + +## 关键属性 +- **触发**:新消息到达时由前端 `pages/manage.vue` 调用 `openNotification` 走 IPC 给主进程 +- **内容**:标题(单聊=昵称 / 群聊=群名)、正文(消息预览)、图标(发送者头像) +- **快捷回复**:桌面端通知支持 hasReply=true 直接在通知框输入回复,回填到 DooTask +- **点击行为**:点通知会把主窗口拉前并打开对应会话 +- **Dock 角标 / 任务栏**:macOS 显示 Dock badge 数字,Windows 任务栏闪烁,托盘可显示未读数 + +## 平台差异 +| 系统 | 通知风格 | Dock/Tray | +|---|---|---| +| macOS | 通知中心 | Dock badge + 托盘 Title 文字 | +| Windows | 操作中心 | 任务栏闪烁(窗口失焦时) | +| Linux | libnotify | 仅通知 | + +## 与其他通知的关系 +- [[push-notice.concept]] 友盟推送只走移动 APP,桌面端不参与 +- [[email-notice.concept]] 邮件只用于汇总未读或系统验证,与桌面通知并行 +- 浏览器 Web 版桌面通知由浏览器实现,关闭浏览器即失效 + +## 不支持 +- 不支持自定义通知音效(用系统默认) +- 不支持自定义通知时长(受系统通知中心控制) +- 不能按会话单独配置桌面通知开关(要总开关或会话级免打扰 [[push-notice.silent.howto]]) diff --git a/resources/ai-kb/zh/concept/desktop-notify/tray.md b/resources/ai-kb/zh/concept/desktop-notify/tray.md new file mode 100644 index 000000000..b5d428f3e --- /dev/null +++ b/resources/ai-kb/zh/concept/desktop-notify/tray.md @@ -0,0 +1,61 @@ +--- +id: desktop-notify.tray.concept +title: Dock 角标与任务栏 +type: concept +feature: desktop-notify +scope: end-user +locale: zh +aliases: + - Dock 角标 + - macOS 红点 + - 任务栏未读 + - 托盘红点 + - 任务栏闪烁 + - 未读数字 + - Tray + - badge +related_tools: [] +related_pages: [] +prerequisites: + - 使用 DooTask 桌面端(Electron) +negative: + - 任务栏闪烁只在 Windows 平台 + 窗口失焦时生效;macOS 不闪 + - Dock badge 只在 macOS 显示;Windows 不显示数字角标 + - Linux 通常没有 Dock badge 与任务栏闪烁(依桌面环境而异) +last_verified: v1.7.90 +--- + +# Dock 角标与任务栏 + +## 定义 +DooTask 桌面端通过 Electron 主进程的 IPC 通道 `setDockBadge` 在 macOS Dock、Windows 任务栏、系统托盘上同步展示未读消息数,让用户在不切回 DooTask 窗口时也能感知到「有未读」。 + +## 平台行为 +| 平台 | 表现 | 数据来源 | +|---|---|---| +| macOS | Dock 图标右上角红色数字 | `app.dock.setBadge(text)` | +| macOS | 托盘图标右侧显示未读数文字 | `mainTray.setTitle(text)` | +| Windows | 窗口失焦时任务栏图标闪烁(黄色) | `mainWindow.flashFrame(true)` | +| Windows | 系统托盘有图标,右键菜单含显示/退出 | Tray + contextMenu | +| Linux | 无 Dock badge / 闪烁;仅托盘 | 通常依赖桌面环境 | + +## 数字含义 +未读数 = 当前用户所有「未读 + 非静默」的消息条数;按下面规则计算: +- 已读会话不计 +- 标记为免打扰(silence=1)的会话不计 +- 系统静默消息(silence=1)不计 +- 多设备共享同一个未读数(后端聚合) + +## 清零时机 +- 打开一个会话并阅读到底 → 该会话未读清零,Dock badge 减 +- 全部会话已读后 Dock badge 完全消失 +- macOS Dock 上的红点消失 = 0;Windows 任务栏闪烁会在窗口被点击聚焦时自动停止 + +## 托盘点击行为 +- macOS / Windows:单击托盘图标 → 显示主窗口(被最小化或隐藏时拉前) +- Windows 托盘还可右键 → 「显示」/「退出」 + +## 跟桌面通知的区别 +- 桌面通知是**一次性**事件,弹出后消失;详见 [[desktop-notify.concept]] +- Dock badge / 任务栏是**持续状态**,反映当前未读总数 +- 两者数据源相同但展示方式独立:通知被系统抑制不影响角标更新 diff --git a/resources/ai-kb/zh/concept/drawio/overview.md b/resources/ai-kb/zh/concept/drawio/overview.md new file mode 100644 index 000000000..e446d3f9f --- /dev/null +++ b/resources/ai-kb/zh/concept/drawio/overview.md @@ -0,0 +1,55 @@ +--- +id: drawio.concept +title: 流程图(drawio)是什么 +type: concept +feature: drawio +scope: end-user +locale: zh +aliases: + - drawio + - 流程图 + - 画流程图 + - draw.io + - DooTask 流程图 + - UML 图 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 drawio 插件 +negative: + - 流程图编辑能力不是主程序内置,未装 drawio 插件无法新建 `drawio` 类型文件 + - 不支持把 drawio 图形直接嵌入到任务详情/讨论消息中(只能作为文件链接发送) + - 大图(千级节点)渲染会变慢,建议拆图 +last_verified: v1.7.90 +--- + +# 流程图(drawio)是什么 + +## 定义 +流程图是 DooTask 文件系统中的一种文件类型(`type=drawio`),用于绘制流程图、UML、ER 图、网络拓扑、思维导图等通用图形。它由独立的 drawio 插件提供编辑器(基于开源 jgraph/drawio),主程序通过 iframe 嵌入 `drawio/webapp/index.html`,文件内容存到 DooTask 自己的文件库里。 + +## 关键属性 +- **文件类型**:`drawio`(与 `mind` 思维导图、`document` 文本、`word/excel/ppt` 平行) +- **存储位置**:DooTask 文件系统(个人文件 / 项目文件 / 共享) +- **编辑器**:嵌入式 drawio 完整编辑器,含图形库、画布、属性面板 +- **导出**:支持导出 PNG / PDF(依赖插件内置的 export-server,缺它则导出失效) +- **历史版本**:随 DooTask 文件历史一同保存 + +## 支持的图形类型 +- 流程图、泳道图 +- UML 类图、时序图、用例图 +- 网络拓扑、机柜图 +- 实体关系(ER)图 +- 思维导图(更建议用专用的 minder 插件) +- 各类业务建模、原型草图 + +## 与其他文件类型的关系 +- **vs minder 思维导图**:思维导图专注放射结构,节点编辑更轻;drawio 是通用图形,自由度高 +- **vs OnlyOffice Word/Excel**:OnlyOffice 支持多人实时;drawio 单人编辑 +- **vs DooTask 内置 document**:document 是富文本/Markdown,没有矢量图形能力 + +## 相关 +- 插件元信息:[[drawio.plugin.concept]] +- 创建流程图:[[drawio.create.howto]] +- 入口在哪:[[drawio.entry.menu-map]] +- 内置模板:[[drawio.template.concept]] diff --git a/resources/ai-kb/zh/concept/drawio/plugin.md b/resources/ai-kb/zh/concept/drawio/plugin.md new file mode 100644 index 000000000..cd3b1253d --- /dev/null +++ b/resources/ai-kb/zh/concept/drawio/plugin.md @@ -0,0 +1,53 @@ +--- +id: drawio.plugin.concept +title: drawio 插件元信息 +type: concept +feature: drawio +scope: admin +locale: zh +aliases: + - drawio 插件 + - 流程图插件 + - 安装 drawio + - drawio 插件版本 + - draw.io 集成 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 主程序不内置流程图编辑器,未装插件时新建文件菜单不会显示「图表」 + - 插件体积大约 700MB,下载较慢,需要稳定网络 + - 缺少同包的 export-server 时,PNG/PDF 导出会失败 +last_verified: v1.7.90 +--- + +# drawio 插件元信息 + +## 定义 +流程图能力由 `drawio` 插件提供(应用市场 app id 为 `drawio`,当前主版本 30.0.4,基于开源 jgraph/drawio)。插件包内除了 drawio 前端,还包含一个 export-server(镜像 `kuaifan/export-server`)负责把图形导出为 PNG/PDF。主程序仅以 iframe 加载 `drawio/webapp/index.html`,编辑器交互与文件保存全部跑在前端 + 主程序文件 API。 + +## 关键属性 +- **作者**:社区维护(Community),上游 https://www.drawio.com/ +- **分类**:微应用(不在管理员应用区) +- **包大小**:约 700MB(含 drawio 资源 + export-server 镜像) +- **运行形态**:静态资源 + 一个导出服务容器 +- **关键依赖**:`webapp/index.html` 的 `EXPORT_URL` 指向插件内的 `/drawio/export/`,删 export-server 会导致导出 PNG/PDF 失效 +- **数据存储**:图形内容存到主程序文件表(`type=drawio`),不在插件容器单独存 + +## 安装与启用 +1. 在应用市场(管理员入口)搜索「Drawio」或「流程图」 +2. 点击安装,等待资源下载(约 700MB,请通过「安装日志」查看进度) +3. 安装完成后插件自动启用,文件新建菜单立即出现「图表」选项 + +## 卸载影响 +- 卸载后菜单消失,原有 `drawio` 文件保留在文件库中但无法继续编辑/预览 +- 重新安装后旧文件继续可用 + +## 已知限制 +- 网络不畅时首次加载图形库较慢 +- 离线环境需提前推到内网镜像源 + +## 相关 +- 是什么:[[drawio.concept]] +- 入口在哪:[[drawio.entry.menu-map]] +- 内置模板:[[drawio.template.concept]] diff --git a/resources/ai-kb/zh/concept/drawio/template.md b/resources/ai-kb/zh/concept/drawio/template.md new file mode 100644 index 000000000..6455099bc --- /dev/null +++ b/resources/ai-kb/zh/concept/drawio/template.md @@ -0,0 +1,60 @@ +--- +id: drawio.template.concept +title: drawio 内置图形与模板 +type: concept +feature: drawio +scope: end-user +locale: zh +aliases: + - drawio 模板 + - drawio 图形库 + - drawio 能画什么 + - 流程图都有哪些类型 + - drawio 支持的图形 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 drawio 插件 +negative: + - DooTask 不提供「业务模板市场」,新建图永远是空白画布 + - 不能直接将 drawio 图形粘贴到 DooTask 任务详情或讨论消息 + - 模板/形状无法跨公司账号共享(每个部署独立) +last_verified: v1.7.90 +--- + +# drawio 内置图形与模板 + +## 定义 +drawio 编辑器自带丰富的图形库(Shape Libraries)和绘图分类,但 DooTask 集成时**不预置业务模板**。每次新建图都从空白画布开始,需要绘图者从图形库手动拖出元素或在 drawio 内的「File → New From Template」选择官方模板。 + +## 主要图形分类 +drawio 左侧图形库可勾选启用以下分类(部分): +- 通用形状(General) +- 流程图(Flowchart) +- 泳道图(Swimlanes) +- UML(类图、时序图、用例图、状态图、活动图) +- 实体关系(ER) +- 网络与基础设施(Cisco / AWS / Azure / GCP / Kubernetes 图标) +- 软件架构(C4 模型) +- 业务流程(BPMN) +- 思维导图(mockup) +- 电气、布线、机柜 +- 安卓/iOS 线框图 + +## 选用方式 +- 编辑器左下角「More Shapes」勾选要启用的图形库 +- 直接从左侧图形库拖元素到画布 +- 通过菜单 `File → New From Template` 选择官方预设模板(流程示例、组织结构等) + +## 与思维导图(minder)对比 +- drawio 也能画思维导图,但灵活但偏「画」 +- 专注思维导图推荐用专门的 [[minder.concept]] 插件,节点操作更顺手 + +## 不支持 +- DooTask 主程序不预置业务模板(如审批流程模板等) +- 模板不能跨部署共享,只能依赖 drawio 上游内置的模板 +- 不能上传自定义图形库到所有用户 + +## 相关 +- 是什么:[[drawio.concept]] +- 创建:[[drawio.create.howto]] diff --git a/resources/ai-kb/zh/concept/electron-client/notify.md b/resources/ai-kb/zh/concept/electron-client/notify.md new file mode 100644 index 000000000..d2075f7ff --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/notify.md @@ -0,0 +1,60 @@ +--- +id: electron-client.notify.concept +title: 桌面端原生通知 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面通知 + - 桌面端推送 + - 收不到通知 + - 弹出通知 + - 通知中心 + - 桌面端消息提醒 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 桌面端通知不依赖浏览器权限,但需要系统级允许 DooTask 发通知 + - 系统勿扰模式 / 专注模式开启时,不会弹出但会进通知中心 + - 桌面端通知与移动端 UMENG 推送是两套独立通道,见 [[mobile-client.notify.concept]] +last_verified: v1.7.90 +--- + +# 桌面端原生通知 + +## 定义 +桌面端的「原生通知」是通过操作系统通知中心弹出的提示(macOS 通知中心 / Windows 操作中心),区别于网页端的浏览器通知。新消息、任务变更、AI 响应等事件会触发,即使 App 处于后台 / 最小化也能收到。 + +## 触发场景 +- 新消息(私聊 / 群聊) +- 任务被分配 / @ 提醒 +- 项目变更(状态、负责人) +- 截止提醒 +- 系统通知(管理员推送) + +## 系统授权 +首次启动会向操作系统申请通知权限: +- **macOS**:系统设置 → 「通知」→ 找到「DooTask」→ 允许「允许通知」、选择「横幅」或「提醒」样式 +- **Windows**:设置 → 「系统」→「通知」→ 找到「DooTask」→ 打开 + +未授权时 App 仍能收到消息,但不会弹系统通知,只会在 App 内显示红点 / 角标。 + +## 应用内开关 +DooTask 内部还有一层免打扰开关: +- 个人设置 → 「通知」→ 开关「桌面通知」/「声音」 +- 单个会话 / 项目 → 「免打扰」可单独静音 + +通知触发顺序:**系统权限 → 应用免打扰 → 单会话免打扰**,任一环节关闭都收不到。 + +## 通知样式 +- 标题:消息来源(如群名、发送人) +- 正文:消息预览(开启「消息预览」时显示;关闭则只显示「您有一条新消息」) +- 点击通知:激活窗口并跳到对应会话 / 任务 + +## 不支持 +- 不支持自定义通知音效(用系统默认) +- 不支持通知中折叠 / 分组(每条独立) +- 系统勿扰模式开启时不弹横幅,但仍写入通知中心 +- 与浏览器 Notifications API 不通用,网页端单独管理 diff --git a/resources/ai-kb/zh/concept/electron-client/overview.md b/resources/ai-kb/zh/concept/electron-client/overview.md new file mode 100644 index 000000000..9b769a1c8 --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/overview.md @@ -0,0 +1,53 @@ +--- +id: electron-client.concept +title: 桌面端是什么 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面端 + - 桌面版 + - 桌面客户端 + - 客户端 + - 装到电脑上 + - Electron 端 + - Mac 版 + - Windows 版 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 桌面端不能改服务器地址,首次启动时录入,后续切换需在登录页注销重设 + - 桌面端没有「独立内核更新」,功能更新依赖服务器后端 + 客户端版本同步 + - 桌面端无法离线使用,所有数据走与网页端相同的 HTTP / WebSocket +last_verified: v1.7.90 +--- + +# 桌面端是什么 + +## 定义 +桌面端是 DooTask 的本地客户端,基于 Electron 38 打包,套壳一份 Chromium 内核 + 复用网页端代码,再补足系统集成能力(托盘、原生通知、全局快捷键、截图、下载管理、本地 MCP)。当前应用版本独立于服务器主程序版本,自带更新通道。 + +## 关键属性 +- **跨平台**:macOS / Windows / Linux 三大桌面系统都有官方包 +- **数据互通**:登录任意服务器后,数据与网页端、移动端完全一致 +- **系统集成**:原生通知、托盘、全局快捷键、屏幕截图、下载管理器 +- **多窗口 / 多 Tab**:支持把任务、文件、应用拖出独立窗口 +- **本地 MCP**:内置 fastmcp 服务,供 AI 助手调本机能力 + +## 与网页端的差异 +- 桌面端默认拦截外链,在内置浏览器打开;网页端走系统浏览器 +- 桌面端有「关闭即托盘 / 退出」选项,网页端关掉就是关掉 +- 桌面端能注册 `Cmd/Ctrl + I`(AI 助手)等系统级快捷键 +- 桌面端有内置截图工具([[electron-client.shortcut.concept]]) + +## 何时选桌面端 +- 长时间办公(挂在后台 / 收推送) +- 需要原生通知不丢消息 +- 频繁用 AI 助手 / 快捷键 +- 经常处理文件(下载管理更直观) + +## 不支持 +- 不支持移动端的触屏手势 +- 桌面端窗口最小化默认不退出后端连接(`window-all-closed` 在 macOS 不退出) diff --git a/resources/ai-kb/zh/concept/electron-client/platforms.md b/resources/ai-kb/zh/concept/electron-client/platforms.md new file mode 100644 index 000000000..b8ffc7ef3 --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/platforms.md @@ -0,0 +1,59 @@ +--- +id: electron-client.platforms.concept +title: 桌面端支持平台 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 支持哪些系统 + - 支持的操作系统 + - macOS 能用吗 + - Windows 能用吗 + - Linux 能用吗 + - M1 M2 能用吗 + - ARM 版 + - 苹果芯片 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不提供 32 位 Windows 安装包(只有 x64 / arm64) + - macOS 13 之前的旧版可能因 Electron 38 不兼容无法启动 + - Linux 版只打 deb / rpm,不打 snap / flatpak +last_verified: v1.7.90 +--- + +# 桌面端支持平台 + +## 系统支持矩阵 + +| 系统 | 架构 | 包格式 | 说明 | +|---|---|---|---| +| macOS | x64(Intel) | dmg / zip / pkg | 推荐 macOS 13+ | +| macOS | arm64(Apple Silicon) | dmg / zip / pkg | M1 / M2 / M3 / M4 | +| macOS | universal | dmg / pkg | 通用包(同时兼容 Intel 和 Apple Silicon) | +| Windows | x64 | NSIS 安装包(.exe) | 推荐 Windows 10+ | +| Windows | arm64 | NSIS 安装包(.exe) | Surface Pro X 等 ARM 笔记本 | +| Linux | x64 | deb(Ubuntu/Debian) / rpm(RHEL/CentOS/Fedora) | 通过 Electron Forge 打包 | + +## 安装包命名约定 +官方发布的安装包名格式:`DooTask-v{version}-{os}-{arch}.{ext}`,例如: +- `DooTask-v1.7.90-mac-arm64.dmg`(Apple Silicon) +- `DooTask-v1.7.90-mac-x64.dmg`(Intel Mac) +- `DooTask-v1.7.90-mac-universal.pkg`(macOS 通用包) +- `DooTask-v1.7.90-win-x64.exe`(Windows 64 位) +- `DooTask-v1.7.90-win-arm64.exe`(Windows ARM) + +## 如何选择对应包 +- **Apple Silicon Mac**(M1/M2/M3/M4):选 `mac-arm64` 或 `mac-universal` +- **Intel Mac**:选 `mac-x64` 或 `mac-universal` +- **不确定 Mac 芯片**:点苹果菜单 → 「关于本机」查看「芯片」字段 +- **Windows**:绝大多数选 `win-x64`;Surface Pro X 等 ARM 笔记本选 `win-arm64` +- **Linux**:Ubuntu / Debian 用 deb,CentOS / Fedora 用 rpm + +## 不支持 +- Windows 7 / 8 / 8.1(Electron 38 不再支持) +- 不支持 32 位 Windows(`ia32`) +- 不支持 macOS 12 及更早版本(部分系统 API 调用失败) +- 国产 ARM Linux(如龙芯、华为鲲鹏)无官方包,可自行 build diff --git a/resources/ai-kb/zh/concept/electron-client/proxy.md b/resources/ai-kb/zh/concept/electron-client/proxy.md new file mode 100644 index 000000000..2d48c674d --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/proxy.md @@ -0,0 +1,61 @@ +--- +id: electron-client.proxy.concept +title: 桌面端代理设置 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面端代理 + - 客户端代理 + - 桌面端走代理 + - HTTP 代理 + - SOCKS 代理 + - 公司代理 + - VPN 设置 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 桌面端**没有内置代理设置面板**,默认跟随操作系统代理配置 + - 不支持在 App 内直接填写代理服务器地址 / 鉴权 + - 全代理 / 分流策略需要在系统或网络层面解决 +last_verified: v1.7.90 +--- + +# 桌面端代理设置 + +## 代理来源 +DooTask 桌面端基于 Electron,网络请求默认遵循**操作系统的代理设置**(从 Chromium 继承)。客户端内**没有**独立的代理配置入口。代理生效路径: +- macOS:系统设置 → 「网络」→ 当前网络 → 「详细信息」→「代理」 +- Windows:设置 → 「网络和 Internet」→「代理」 +- Linux:多数发行版在「设置 → 网络 → 代理」 + +## 适用场景 +- 内网部署需走公司 HTTP 代理出公网 +- 通过 VPN 客户端访问私有 DooTask 实例 +- 测试环境需经过 mitm / Charles 抓包(配 PAC 或全局代理) + +## 启动参数(进阶) +Electron 支持启动时通过命令行参数注入代理。例如 macOS 终端启动: +```bash +open -a DooTask --args \ + --proxy-server="http://192.168.1.10:8080" \ + --proxy-bypass-list="*.internal.com" +``` +Windows 在快捷方式属性里给 `dootask.exe` 加同样参数。这种方式属于绕过系统代理,生效优先级最高。 + +## 鉴权代理 +需要用户名 / 密码的代理: +- 操作系统代理面板里录入凭证(macOS 钥匙串、Windows 凭据管理器) +- Chromium 弹出鉴权对话框时输入 + +## 故障排查 +- 客户端打不开 / 登录失败,先确认浏览器(系统默认浏览器)能否打开 DooTask 网址 +- 抓包检查请求是否经过预期代理 +- 走代理后 WebSocket 连接可能被部分企业代理阻断,需让运维放通 `wss://` + +## 不支持 +- 客户端 UI 无代理配置项,无法在 App 内切换代理 +- 不支持代理协议自动切换(SOCKS5 / HTTP / HTTPS) +- 不支持单 App 独立代理(全系统级) diff --git a/resources/ai-kb/zh/concept/electron-client/shortcut.md b/resources/ai-kb/zh/concept/electron-client/shortcut.md new file mode 100644 index 000000000..23392a56c --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/shortcut.md @@ -0,0 +1,66 @@ +--- +id: electron-client.shortcut.concept +title: 桌面端全局快捷键 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面端快捷键 + - 全局快捷键 + - 桌面热键 + - 截图快捷键 + - AI 助手快捷键 + - 怎么截图 + - 新建任务快捷键 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 全局快捷键仅在 DooTask 进程运行中(含后台 / 托盘)生效,App 退出后不可用 + - 快捷键冲突时(被其他软件占用)DooTask 注册会失败,无错误提示 + - 部分快捷键(如截图)用户可自定义按键,默认未绑定 +last_verified: v1.7.90 +--- + +# 桌面端全局快捷键 + +## 快捷键总览 +桌面端注册了一组系统级全局快捷键,在 App 处于后台 / 最小化 / 托盘时也能触发。下表 `Mod` 在 macOS 是 `Command`、Windows / Linux 是 `Ctrl`。 + +| 操作 | macOS | Windows / Linux | 备注 | +|---|---|---|---| +| AI 助手 | Cmd + I | Ctrl + I | 需安装 AI 微应用 | +| 新建任务 | Cmd + N | Ctrl + N | 弹出快速创建 | +| 新建项目 | Cmd + B | Ctrl + B | | +| 新会议 | Cmd + J | Ctrl + J | | +| 打开设置 | Cmd + , | Ctrl + , | | +| 下载内容 | Cmd + Option + L | Ctrl + Alt + L | 打开下载管理器 | +| 截图 | Cmd + Shift + (自定义字母) | Ctrl + Shift + (自定义字母) | 用户在设置里指定字母 | + +## 应用内导航 +| 操作 | macOS | Windows | +|---|---|---| +| 后退 | Cmd + ← | Alt + ← | +| 前进 | Cmd + → | Alt + → | +| 刷新 | Cmd + R | Ctrl + R / F5 | +| 强制刷新 | Cmd + Shift + R | Ctrl + Shift + R | +| 关闭窗口 | Cmd + W | Ctrl + W | +| 退出 App | Cmd + Q | Alt + F4 | + +## 自定义截图快捷键 +1. 个人设置 → 「键盘」→「截图快捷键」 +2. 输入框只接受一个字母 / 数字(自动大写) +3. 实际组合键为:`Mod + Shift + 你填的字母` +4. 留空表示不绑定 + +## 注册原理 +桌面端通过 Electron `globalShortcut.register` 在 App 启动时注册,App 退出时 `unregisterAll`。冲突时(被其他 App 抢先注册)会静默失败。 + +## 与网页端的对比 +网页端只有应用内键盘(必须 DooTask 标签页激活才生效),没有系统级全局快捷键。详见 [[web-client.shortcut.concept]]。 + +## 不支持 +- 不支持把全部快捷键改成自定义(仅截图键可自定义) +- 不支持「按键组合录制」(只能输入字母) +- 不支持移动端手势(那是 [[mobile-client.gesture.concept]] 的能力) diff --git a/resources/ai-kb/zh/concept/electron-client/tray.md b/resources/ai-kb/zh/concept/electron-client/tray.md new file mode 100644 index 000000000..174cb84c7 --- /dev/null +++ b/resources/ai-kb/zh/concept/electron-client/tray.md @@ -0,0 +1,61 @@ +--- +id: electron-client.tray.concept +title: 桌面端系统托盘 +type: concept +feature: electron-client +scope: end-user +locale: zh +aliases: + - 系统托盘 + - 最小化到托盘 + - 托盘图标 + - 后台运行 + - 关闭后还在 + - 任务栏图标 + - 状态栏图标 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - Linux 端没有托盘(仅 macOS / Windows 实现) + - 托盘菜单只在 Windows 上提供「显示 / 退出」右键菜单;macOS 点击直接呼出窗口 + - 托盘红点 / 角标数量来自服务器未读计数,需在线才会更新 +last_verified: v1.7.90 +--- + +# 桌面端系统托盘 + +## 定义 +系统托盘是 DooTask 桌面端在 macOS 菜单栏 / Windows 任务栏右下角驻留的小图标,用于让 App 在窗口关闭后仍在后台运行,持续接收消息、显示未读数。 + +## 平台支持 +- **macOS**:在屏幕顶部菜单栏出现 DooTask 图标(模板图,跟随系统深浅色) +- **Windows**:在右下角任务栏托盘区出现 DooTask 图标 +- **Linux**:不创建托盘 + +## 行为 + +### 点击托盘图标 +- macOS / Windows 单击:呼出 / 隐藏主窗口 + +### Windows 右键托盘 +- 「显示」:把主窗口拉到前台 +- 「退出」:完全退出 App(不再后台保留) + +### macOS 关闭主窗口 +- 直接点窗口左上角红色 × 仅隐藏窗口,App 继续在 Dock 和菜单栏运行 +- 真正退出要用菜单 → 「DooTask」→「退出 DooTask」(Cmd + Q) + +### Windows 关闭主窗口 +- 关闭按钮的具体行为可由用户在设置里选(隐藏到托盘 / 直接退出),取决于客户端版本 +- 完全退出请用托盘右键「退出」或菜单「文件」→「退出」 + +## 托盘提示与角标 +- 鼠标悬停托盘图标:显示「DooTask」名称 +- macOS:有未读消息时托盘文字会显示数字(如「3」) +- Dock 角标(macOS)/ 任务栏角标(Windows):由系统决定显示方式 + +## 不支持 +- Linux 桌面环境(GNOME / KDE)无托盘集成 +- 托盘图标不可自定义颜色 / 形状 +- 不支持自定义右键菜单项(目前仅「显示 / 退出」) diff --git a/resources/ai-kb/zh/concept/email-notice/overview.md b/resources/ai-kb/zh/concept/email-notice/overview.md new file mode 100644 index 000000000..792a97367 --- /dev/null +++ b/resources/ai-kb/zh/concept/email-notice/overview.md @@ -0,0 +1,46 @@ +--- +id: email-notice.concept +title: 邮件通知是什么 +type: concept +feature: email-notice +scope: admin +locale: zh +aliases: + - 邮件通知 + - 邮件提醒 + - SMTP 通知 + - 系统发邮件 + - 邮箱通知 + - 收不到邮件 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已在系统设置「邮箱设置」配好 SMTP 服务器 +negative: + - 未配置 SMTP 时所有邮件功能都不发邮件,但不会报错给用户 + - 邮件通道只用于系统通知(注册验证 / 改邮箱 / 未读消息 / 删除账号验证),不能用作客户营销邮件 + - 邮件发送依赖第三方 SMTP,DooTask 自身不内置邮件服务器 +last_verified: v1.7.90 +--- + +# 邮件通知是什么 + +## 定义 +邮件通知是 DooTask 通过管理员配置的 SMTP 服务器,向用户邮箱发送系统通知的能力。系统级配置存放在 `emailSetting`,包含 SMTP 服务器、端口、账号、密码、忽略地址、未读消息提醒规则等字段。 + +## 关键属性 +- **全局开关**:未配 SMTP 时邮件链路不工作(不报错,也不发出) +- **注册验证**:`reg_verify` = open 时新注册账号需邮箱验证才能登录,修改邮箱/删除账号也走验证码 +- **未读消息提醒**:`notice_msg` = open 时按时间范围 `msg_unread_time_ranges` 把未读消息汇总成邮件发送 +- **忽略地址**:`ignore_addr` 列表中的邮箱永远不收邮件(如内部测试号、机器人号) +- **发件人**:系统别名(System Alias)+ SMTP 账号,如 `Task ` + +## 触发邮件的场景 +具体场景见 [[email-notice.scenarios.concept]]。 + +## 与其他通知的关系 +- **APP 推送**(友盟):见 [[push-notice.concept]],独立通道 +- **桌面通知**(Electron):本地系统通知,不走邮件 +- **移动端通知**:iOS/Android 推送,不走邮件 + +邮件、APP 推送、桌面通知三个通道**并行触发**,互不影响。 diff --git a/resources/ai-kb/zh/concept/email-notice/scenarios.md b/resources/ai-kb/zh/concept/email-notice/scenarios.md new file mode 100644 index 000000000..1f1a6f186 --- /dev/null +++ b/resources/ai-kb/zh/concept/email-notice/scenarios.md @@ -0,0 +1,53 @@ +--- +id: email-notice.scenarios.concept +title: 邮件通知场景 +type: concept +feature: email-notice +scope: admin +locale: zh +aliases: + - 什么时候发邮件 + - 邮件场景 + - 系统会发哪些邮件 + - 邮件触发 + - 邮件类型 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已配置 SMTP,见 [[email-notice.config.howto]] +negative: + - 任务分配、审批通知、@提及不会单独发邮件,只通过站内消息和 APP 推送 + - 未读消息邮件只汇总指定时间窗口内的未读,不是每条消息都发 + - 邮件发送失败不会重试,也不会通知发起方 +last_verified: v1.7.90 +--- + +# 邮件通知场景 + +## 定义 +DooTask 仅在少数系统级事件中通过邮件触达用户。所有事件都走管理员配置的 SMTP 通道。 + +## 全部触发场景 +| 场景 | 收件人 | 触发条件 | +|---|---|---| +| 注册邮箱验证 | 新注册用户 | `reg_verify` 开启时,注册即发验证链接 | +| 修改邮箱验证码 | 用户原邮箱 | 用户提交「修改邮箱」时发 6 位验证码(30 分钟有效)| +| 注销账号验证码 | 用户当前邮箱 | 用户提交「删除账号」时发验证码 | +| 未读消息汇总 | 启用通知的用户 | `notice_msg` 开启且在 `msg_unread_time_ranges` 时间范围内,未读消息超过指定分钟数时按用户汇总发送 | +| 测试邮件 | 管理员指定地址 | 管理员点「邮件发送测试」时发一封测试 | + +## 未读消息邮件的精细规则 +- 单聊未读 ≥ `msg_unread_user_minute` 分钟才汇入下次邮件 +- 群聊未读 ≥ `msg_unread_group_minute` 分钟才汇入下次邮件 +- 任一值 = -1 → 该类型完全不发 +- 仅 `text / file / record / meeting` 这 4 类消息会被汇总 +- 标记为静默(silence)的消息不进邮件 +- 忽略地址列表里的用户永远不收 + +## 不在邮件范围内 +- 任务创建 / 状态变更 / 截止提醒 +- 审批通过 / 驳回 / 抄送 +- 项目邀请 +- @提及 / 引用 / 评论 + +以上靠 [[push-notice.concept]] 和站内消息(WebSocket)通知。 diff --git a/resources/ai-kb/zh/concept/favorite/overview.md b/resources/ai-kb/zh/concept/favorite/overview.md new file mode 100644 index 000000000..2c3fae144 --- /dev/null +++ b/resources/ai-kb/zh/concept/favorite/overview.md @@ -0,0 +1,48 @@ +--- +id: favorite.concept +title: 收藏与最近 +type: concept +feature: favorite +scope: end-user +locale: zh +aliases: + - 收藏是什么 + - 最近打开是什么 + - 我的收藏和最近浏览 + - 收藏夹 + - 收藏功能介绍 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 收藏只对自己可见,不能分享给其他成员 + - 收藏不会跟随对象状态变化(收藏一个任务后,任务被删除则收藏项失效) + - 不支持给收藏分组 / 打标签 / 排序,列表按收藏时间倒序 +last_verified: v1.7.90 +--- + +# 收藏与最近 + +## 定义 +DooTask 用两套独立机制保存「常用入口」与「访问历史」: + +- **收藏(UserFavorite)**:用户主动「加星」保存的对象,列表稳定,仅本人可见 +- **最近打开(UserRecentItem)**:系统自动记录最近访问的任务和文件,按浏览时间倒序,不依赖手动操作 +- **任务浏览历史(UserTaskBrowse)**:任务详情页底层的访问记录,给「最近浏览」与统计使用 + +## 收藏的关键属性 +- 支持 4 种对象类型:**任务(task)、项目(project)、文件(file)、消息(message)** +- 每个收藏可加 ≤ 255 字符的备注 +- 同一对象只能收藏一次,再次「加星」即取消(toggle 语义) +- 删除被收藏对象,收藏项保留但实际数据为空 + +## 最近打开的关键属性 +- 自动记录:进入任务详情、打开文件、查看任务附件、查看消息附件 +- 来源标记:保留进入路径(来自项目、文件柜、任务、对话),便于反向回跳 +- 仅展示最近一段时间内的访问,不做长期归档 + +## 与收藏的区别 +- **收藏**:用户决定保留,长期稳定;适合「常用项目」「重要任务」 +- **最近打开**:系统自动维护,会被新访问覆盖;适合「我刚才看的那个文件」 + +详见 [[favorite.recent.concept]]。 diff --git a/resources/ai-kb/zh/concept/favorite/recent.md b/resources/ai-kb/zh/concept/favorite/recent.md new file mode 100644 index 000000000..3eade29a4 --- /dev/null +++ b/resources/ai-kb/zh/concept/favorite/recent.md @@ -0,0 +1,62 @@ +--- +id: favorite.recent.concept +title: 最近打开是什么 +type: concept +feature: favorite +scope: end-user +locale: zh +aliases: + - 最近打开 + - 最近访问 + - 最近浏览 + - 最近看过的任务 + - 最近用过的文件 + - 历史记录 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 最近打开不可手动添加,全部由系统自动写入 + - 不能合并多个设备的访问记录(按账号聚合,但同账号不同端共用) + - 不会无限保留,旧记录会被新访问覆盖 / 清理 +last_verified: v1.7.90 +--- + +# 最近打开是什么 + +## 定义 +最近打开由 `UserRecentItem` 模型维护,是系统自动记录的「我最近访问过的对象」。每次打开任务、文件、任务附件、消息附件时自动写入,按 `browsed_at` 倒序展示。它和「我的收藏」(见 [[favorite.concept]])是两套独立机制。 + +## 支持的对象类型 +| target_type | 含义 | +|---|---| +| `task` | 任务(打开任务详情时记录) | +| `file` | 文件柜中的文件 | +| `task_file` | 任务下的附件 | +| `message_file` | 聊天消息中的附件 | + +## 来源标记 +每条记录还会保存「从哪里进入的」(`source_type` + `source_id`): + +- `project` — 从项目内进入的任务 +- `project_task` — 从任务页打开的任务附件 +- `filesystem` — 从文件柜打开 +- `dialog` — 从对话打开的消息附件 + +通过来源可以反向回跳到原入口。 + +## 与收藏的区别 +- **收藏**:用户主动「加星」,长期稳定,本人可见,最多 4 种类型(任务 / 项目 / 文件 / 消息)。详见 [[favorite.concept]] +- **最近打开**:系统自动写入,按浏览时间排序,会被新访问覆盖;不含「项目」和「消息」(消息附件除外) + +## 与「任务浏览历史」的关系 +任务详情页另有一份 `UserTaskBrowse` 表,专门记录任务粒度的浏览历史,用于「最近浏览过的任务」推荐。「最近打开」是更上层的聚合视图,覆盖任务和文件两类。 + +## 入口 +- 桌面端:左侧栏「应用」→「最近打开」 +- 移动端:底部 Tabbar「应用」→「最近打开」 + +## 操作能力 +- 查看:分页浏览、按类型过滤 +- 删除单条:列表中点「删除」即可(不会影响原对象) +- 不支持手动添加;不支持永久保留某条 diff --git a/resources/ai-kb/zh/concept/file/preview.md b/resources/ai-kb/zh/concept/file/preview.md new file mode 100644 index 000000000..39807949f --- /dev/null +++ b/resources/ai-kb/zh/concept/file/preview.md @@ -0,0 +1,50 @@ +--- +id: file.preview.concept +title: 文件预览类型 +type: concept +feature: file +scope: end-user +locale: zh +aliases: + - 文件能不能预览 + - 在线看文件 + - 文档预览 + - 支持哪些文件预览 + - excel 能直接看吗 +related_tools: [get_file_detail, fetch_file_content] +related_pages: [file] +prerequisites: [] +negative: + - office 类(doc/xls/ppt 等)预览需要管理员在应用市场安装 office 插件(OnlyOffice) + - 其他格式(PDF / CAD / OFD 等)预览需要 fileview 插件 + - 未安装对应插件时打开会提示「未安装」,但仍可下载 + - 视频 / 音频不在文件预览里直接播放,会触发下载 +last_verified: v1.7.90 +--- + +# 文件预览类型 + +## 定义 +文件预览指在浏览器内不下载即可查看的能力。DooTask 不同文件类型走不同预览管线,依赖不同插件。 + +## 浏览器直接预览(无需插件) +- **document**:内置在线文档(Markdown 渲染器) +- **txt / code**:纯文本与代码高亮 +- **picture**:jpg / png / webp / gif / bmp 直接渲染 +- **mind**:思维导图(需 minder 插件,但产品默认随包提供) +- **drawio**:流程图(需 drawio 插件) + +## 需安装插件预览 +- **word / excel / ppt**:内置类型,但实际渲染由 OnlyOffice 完成,需 office 插件 +- **pdf / cad / ofd / tif** 等:由 fileview 插件提供 +- **wps**:fileview 插件 + +## 不支持预览的类型 +- **archive**(zip / rar / 7z 等):只能下载,无在线解压 +- **media**(mp3 / mp4 / mov 等):从文件入口直接下载,预览能力依赖浏览器原生 +- **axure(rp)**:仅记录类型,需用 Axure 客户端查看 + +## 在线编辑 vs 仅预览 +- 在线编辑:document、word/excel/ppt(office 插件)、mind、drawio +- 仅预览:pdf、其他 fileview 支持的类型 +- 编辑权限受 FileUser 权限位(读写 / 只读)控制 diff --git a/resources/ai-kb/zh/concept/file/tree.md b/resources/ai-kb/zh/concept/file/tree.md new file mode 100644 index 000000000..461ad1e1a --- /dev/null +++ b/resources/ai-kb/zh/concept/file/tree.md @@ -0,0 +1,47 @@ +--- +id: file.tree.concept +title: 文件树结构 +type: concept +feature: file +scope: end-user +locale: zh +aliases: + - 文件夹结构 + - 文件父子关系 + - 文件嵌套 + - 文件树 + - 文件层级 +related_tools: [list_files, get_file_detail] +related_pages: [file] +prerequisites: [] +negative: + - 单个文件夹下最多 300 个直接子文件 / 子文件夹 + - 不支持软链接 / 快捷方式(一个文件只能在一个位置) + - 不支持跨用户的全局共享根目录 +last_verified: v1.7.90 +--- + +# 文件树结构 + +## 定义 +DooTask 的文件以树形结构组织:每个文件或文件夹(type=folder)通过 `pid` 字段指向父级,根目录 `pid=0`。系统额外维护 `pids` 字段(递归祖先 ID 串)用于快速查询路径与权限。 + +## 关键属性 +- **pid**:直接父文件夹 ID,0 表示根 +- **pids**:祖先链字符串如 `,5,12,28,`,用于 LIKE 查询子树 +- **type=folder**:文件夹本身也是 File 表的一条记录 +- **userid**:拥有者(与共享文件夹一致时表示共享根) +- **pshare**:所属共享根 ID,0 表示不在任何共享内 + +## 容量限制 +- 单文件夹直接子项数量上限 300(含子文件夹) +- 整树深度无强制上限但超过 10 层不推荐 +- 共享文件夹最多 100 个共享成员 + +## 与「项目任务文件」的区别 +- 文件树:用户的网盘,独立功能 +- 项目任务文件:附在任务下的附件(`project_task_files` 表),不进入文件树 +- 两者完全隔离,互不可见 + +## 文件类型枚举 +folder(文件夹)/ document(在线文档)/ mind(思维导图)/ drawio(流程图)/ word / excel / ppt / picture / archive / pdf / txt / code / media 等。 diff --git a/resources/ai-kb/zh/concept/file/version.md b/resources/ai-kb/zh/concept/file/version.md new file mode 100644 index 000000000..8c07d60dd --- /dev/null +++ b/resources/ai-kb/zh/concept/file/version.md @@ -0,0 +1,54 @@ +--- +id: file.version.concept +title: 文件版本历史 +type: concept +feature: file +scope: end-user +locale: zh +aliases: + - 文件历史版本 + - 恢复旧版本 + - 文件回滚 + - 谁改过这个文件 + - 文档历史 +related_tools: [get_file_detail] +related_pages: [file] +prerequisites: [] +negative: + - 版本历史仅对在线编辑类(document / word / excel / ppt / mind / drawio)有效 + - 普通上传文件覆盖后只会替换最新版,无完整历史 + - 没有版本数量上限,但定期清理由系统设置决定 + - 不支持「版本备注」字段(只看保存人 + 时间 + 大小) +last_verified: v1.7.90 +--- + +# 文件版本历史 + +## 定义 +对支持在线编辑的文件,每次保存都会在 `file_contents` 表插入新记录(FileContent),形成版本历史。文件本身(File 表)只指向最新版,但通过 `whereFid + orderByDesc('id')` 可查到所有历史版本。 + +## 关键属性 +- **fid**:所属文件 ID +- **content**:JSON 元数据,包含真实存储路径 url、类型 type、扩展 ext +- **text**:提取出的纯文本(用于全文检索) +- **size**:本版本大小(字节) +- **userid**:本次保存人 +- **created_at**:保存时间 + +## 哪些文件类型有版本 +- document(在线文档) +- word / excel / ppt(通过 OnlyOffice 在线编辑) +- mind(思维导图) +- drawio(流程图) + +## 哪些文件类型没有版本 +- 上传二进制(pdf / archive / picture / media 等)覆盖上传只保留最新一版 +- folder 本身无内容,无版本 + +## 查看与恢复 +- 入口:文件预览页 / 编辑页 → 顶部菜单「历史记录」 +- 列表显示每一版的保存人头像 + 时间 + 大小 +- 选某一版可「预览」或「恢复」(恢复 = 把该历史版复制为新的最新版,保留中间版本) + +## 与"文件协作锁" +DooTask 在线 Office 编辑通过 OnlyOffice 提供多人协作,多人编辑同一文档时由 OnlyOffice 自身的协同逻辑保证一致性,并在最后一个编辑者关闭后回写一版到 FileContent。 diff --git a/resources/ai-kb/zh/concept/fileview/overview.md b/resources/ai-kb/zh/concept/fileview/overview.md new file mode 100644 index 000000000..3b44d9a8a --- /dev/null +++ b/resources/ai-kb/zh/concept/fileview/overview.md @@ -0,0 +1,48 @@ +--- +id: fileview.concept +title: 文件预览(fileview)是什么 +type: concept +feature: fileview +scope: end-user +locale: zh +aliases: + - fileview + - 文件预览 + - 在线预览 + - 预览 PDF + - 预览 Word + - kkfileview + - 在线看文件 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 fileview 插件 +negative: + - fileview 只提供「只读预览」,不能在线编辑(编辑要装 OnlyOffice,见 [[office.concept]]) + - 主程序本身能直接预览图片(jpg/png/gif 等)和文本/代码,这些不需要 fileview + - 视频/音频在线播放走主程序自带能力,也不属于 fileview 范畴 +last_verified: v1.7.90 +--- + +# 文件预览(fileview)是什么 + +## 定义 +fileview 是 DooTask 的**通用文件在线预览**能力,基于开源 kkfileview 引擎,由独立插件提供。所有不能被主程序直接渲染的文件类型(PDF、Word 系、Excel 系、PPT 系、Visio、CAD 等)在点击文件名时会跳转到 fileview 的预览页(路径 `fileview/onlinePreview?url=`),返回浏览器内可滚动、可缩放、可翻页的页面。 + +## 关键属性 +- **只读**:仅查看,不可编辑(编辑能力需 OnlyOffice 插件) +- **入口**:点击文件即可,主程序对超出本地预览范围的文件自动 301 到 fileview 路径 +- **格式覆盖**:远超主程序自带能力,包括 Office 全家桶、PDF、各类压缩包、3D 模型、CAD 等(详见 [[fileview.supported.concept]]) +- **加载机制**:fileview 后端拉取文件 → 转码或解析 → 推送渲染结果到浏览器 +- **依赖**:依赖独立 fileview 容器持续运行 + +## 与其他预览能力的关系 +- **图片**(jpg/jpeg/png/gif/bmp 等):主程序内置直接渲染,不走 fileview +- **代码/文本**(2MB 内、扩展名属于 `codeExt` 列表):主程序内嵌 AceEditor 渲染,不走 fileview +- **Word/Excel/PPT**:装了 OnlyOffice 时走 OnlyOffice 编辑器(可编辑);没装但装了 fileview 则走 fileview 只读预览 +- **思维导图(mind)/ 流程图(drawio)**:DooTask 自己的图形文件,由 minder/drawio 插件渲染,不走 fileview + +## 相关 +- 插件元信息:[[fileview.plugin.concept]] +- 支持的文件类型:[[fileview.supported.concept]] +- 在线编辑 Office 文档:[[office.concept]] diff --git a/resources/ai-kb/zh/concept/fileview/plugin.md b/resources/ai-kb/zh/concept/fileview/plugin.md new file mode 100644 index 000000000..d9bb4b068 --- /dev/null +++ b/resources/ai-kb/zh/concept/fileview/plugin.md @@ -0,0 +1,53 @@ +--- +id: fileview.plugin.concept +title: fileview 插件元信息 +type: concept +feature: fileview +scope: admin +locale: zh +aliases: + - fileview 插件 + - kkfileview 插件 + - 安装文件预览 + - 文件预览插件版本 + - 预览插件多大 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 未安装 fileview 插件时,PDF/Office 等文件点击后会报错或下载,无法在线预览 + - 主程序不内置 kkfileview,本插件是唯一来源 + - 不能离线安装到不联网的环境(需访问应用市场镜像源) +last_verified: v1.7.90 +--- + +# fileview 插件元信息 + +## 定义 +文件在线预览由 `fileview` 插件提供(应用市场 app id 为 `fileview`,当前主版本 4.4.0,基于开源 kkfileview 引擎)。主程序在用户点击文件时判断扩展名,若属于 fileview 范畴则 301 跳转到 `fileview/onlinePreview?url=`,由 fileview 容器渲染。 + +## 关键属性 +- **作者**:社区维护(Community),上游 https://kkview.cn/ +- **分类**:微应用(不在管理员应用区,但行为更像「基础设施」——不直接出现在「应用中心」用户菜单,由文件页自动触发) +- **包大小**:约 630MB(含 LibreOffice + 各类转码工具) +- **运行形态**:独立 Docker 容器,对接主程序 nginx 上的 `/fileview/` 反代 +- **渲染方式**:服务器侧用 LibreOffice 把 docx/pptx 转 PDF 再推到浏览器;纯 PDF 直接 PDF.js 渲染;图片格式化预览 +- **跨设备**:桌面端、移动端均能预览 + +## 安装与启用 +1. 在应用市场(管理员入口)搜索「FileView」或「文件预览」 +2. 点击安装,等待镜像下载(约 630MB,按「安装日志」判断进度) +3. 安装完成后插件自动启用,所有未被主程序原生预览覆盖的文件点击后会自动用 fileview 渲染 + +## 卸载影响 +- 卸载后点击 PDF/Office 等文件会失败(路径仍指向 fileview 但容器不存在) +- 重装后自动恢复 + +## 与 OnlyOffice 共存 +- 同时装了 office 和 fileview:Word/Excel/PPT 优先走 OnlyOffice 编辑器(可编辑) +- 只装 fileview:Word/Excel/PPT 只能用 fileview 只读预览 +- 只装 office:fileview 才能预览的格式(如 PDF、Visio、CAD 等)无法在线预览 + +## 相关 +- 是什么:[[fileview.concept]] +- 支持的文件类型:[[fileview.supported.concept]] diff --git a/resources/ai-kb/zh/concept/fileview/supported.md b/resources/ai-kb/zh/concept/fileview/supported.md new file mode 100644 index 000000000..4a5c50dbc --- /dev/null +++ b/resources/ai-kb/zh/concept/fileview/supported.md @@ -0,0 +1,61 @@ +--- +id: fileview.supported.concept +title: fileview 支持的文件类型 +type: concept +feature: fileview +scope: end-user +locale: zh +aliases: + - fileview 支持什么格式 + - 哪些文件能在线预览 + - DooTask 预览的格式 + - 能不能预览 PDF + - 能不能预览 CAD + - 预览支持的扩展名 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 fileview 插件 +negative: + - 加密/密码保护的 Office 文档预览失败(fileview 解不开) + - 超大文件(>100MB)预览很慢甚至超时 + - 不能在预览页里编辑/批注 +last_verified: v1.7.90 +--- + +# fileview 支持的文件类型 + +## 定义 +fileview 插件基于开源 kkfileview 引擎,可在线预览 30+ 种文件格式。主程序对扩展名做粗分流:图片、代码文本、视频音频走主程序自带能力;其余几乎全部交给 fileview。 + +## 主要支持的格式分类 +- **PDF**:pdf +- **Word 系**:doc, docx, dot, dotx, odt, ott, rtf +- **Excel 系**:xls, xlsx, xlsm, xlt, xltx, ods, ots, csv, tsv +- **PowerPoint 系**:ppt, pptx, pps, ppsx, pot, potx, odp, otp +- **WPS 系**:wps, et, dps(与 Office 同一套转码路径) +- **OpenDocument 全系**:odt/ods/odp/ott/ots/otp 等 +- **流程图 / 矢量**:vsd, vsdx(Visio),drawio 文件由 drawio 插件直接打开不走 fileview +- **CAD**:dwg +- **3D**:obj, stl +- **电子书**:epub, mobi +- **压缩包**:zip, rar, 7z, tar, gz(展开目录树预览) +- **邮件/日历**:eml, ics +- **代码(大文件兜底)**:当代码文本 > 2MB 主程序不再内嵌渲染,可由 fileview 兜底 + +## 主程序不走 fileview 的格式 +- 图片:jpg, jpeg, webp, png, gif, bmp(主程序内置渲染) +- 视频/音频:mp3, wav, mp4, flv 等(内置播放器) +- 代码/文本 ≤ 2MB(内嵌 AceEditor) +- 思维导图(mind)→ minder 插件 +- 流程图(drawio)→ drawio 插件 +- Word/Excel/PPT 若装了 OnlyOffice → 走 OnlyOffice 编辑器(可编辑) + +## 不支持 +- 加密 / 密码保护的 Office 文档无法预览 +- 不保证体积过大(数百 MB 起)的文件能正常预览(可能超时或加载缓慢) +- 不能在预览页里编辑(fileview 只读) + +## 相关 +- 插件元信息:[[fileview.plugin.concept]] +- 是什么:[[fileview.concept]] diff --git a/resources/ai-kb/zh/concept/kpi/overview.md b/resources/ai-kb/zh/concept/kpi/overview.md new file mode 100644 index 000000000..cec43b913 --- /dev/null +++ b/resources/ai-kb/zh/concept/kpi/overview.md @@ -0,0 +1,62 @@ +--- +id: kpi.concept +title: KPI 绩效考核是什么 +type: concept +feature: kpi +scope: end-user +locale: zh +aliases: + - KPI + - 绩效 + - 绩效考核 + - 绩效管理 + - 员工评估 + - Key Performance Indicator +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 kpi 插件 +negative: + - KPI 不是 OKR,与 OKR 在 DooTask 中是两个独立插件 + - KPI 不是主程序内置功能,未装插件时不可用 + - KPI 用户角色与 DooTask 系统角色不完全等价(详见正文) +last_verified: v1.7.90 +--- + +# KPI 绩效考核是什么 + +## 定义 +KPI(Key Performance Indicator,关键绩效指标)在 DooTask 中由独立插件 `community_kuaifan_kpi` 提供,是面向企业和组织的现代化绩效考核管理系统。它支持创建考核任务、按模板录入指标评分、邀请同事评分、HR 审核与异议处理,让多角色协作完成员工绩效评估。 + +## 在 DooTask 中的形态 +- 通过应用市场安装的社区插件(基于 Next.js + Go) +- 与 DooTask 用户体系打通:用户信息、部门信息自动同步 +- 与 DooTask 主程序作为应用插件集成,菜单挂在「应用」下 + +## 用户角色 +KPI 内部有自己独立的三级角色(与 DooTask 系统角色不完全等价): + +- **employee(普通员工)**:查看 / 填写自己的考核、提交异议、参与邀请评分 +- **manager(部门主管)**:员工的全部能力 + 评估下属、导出数据 +- **hr(HR 管理员)**:完整系统权限,管理部门 / 员工 / 模板 / 规则 / 异议 + +## 关键能力 +- **考核管理**:创建、填写、管理绩效考核 +- **邀请评分**:多角度 360 度评价(详见 [[kpi.create.howto]]) +- **异议处理**:员工可申诉,HR 审核调整得分 +- **统计分析**:数据图表与报表,支持 Excel 导出 +- **KPI 模板**:HR 维护通用模板供考核复用 + +## KPI 与 OKR 的区别 +- **KPI**:直接考核指标,与绩效 / 薪酬绑定,偏重「不能丢分」 +- **OKR**:目标管理工具,鼓励挑战性目标,与考核解耦 + +## 不支持 +- 不直接对接 DooTask 任务完成情况自动算绩效 +- 不支持脱离 DooTask 单独登录使用 + +## 相关 +- 插件元信息:[[kpi.plugin.concept]] +- 入口在哪:[[kpi.entry.menu-map]] +- 创建考核:[[kpi.create.howto]] +- 评分机制:[[kpi.scoring.concept]] diff --git a/resources/ai-kb/zh/concept/kpi/plugin.md b/resources/ai-kb/zh/concept/kpi/plugin.md new file mode 100644 index 000000000..bdf7bd0fe --- /dev/null +++ b/resources/ai-kb/zh/concept/kpi/plugin.md @@ -0,0 +1,60 @@ +--- +id: kpi.plugin.concept +title: KPI 插件元信息 +type: concept +feature: kpi +scope: end-user +locale: zh +aliases: + - KPI 插件 + - kpi 怎么装 + - 绩效插件 + - 绩效考核插件 + - community_kuaifan_kpi +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - KPI 不是主程序内置功能,未装插件时入口不会出现 + - 插件升级不通过 git pull,需要在应用市场更新 + - 主程序版本必须高于 1.4.67,否则插件无法安装 +last_verified: v1.7.90 +--- + +# KPI 插件元信息 + +## 定义 +KPI 绩效考核在 DooTask 中由社区插件提供,应用市场 app id 为 `community_kuaifan_kpi`(当前版本 0.1.9),feature 短名 `kpi`。主程序不内置任何 KPI 代码,所有绩效逻辑都跑在独立 Docker 容器中,作为应用插件挂载到 DooTask 界面。 + +## 关键属性 +- **作者**:DooTask 官方 +- **要求**:主程序版本 > 1.4.67(依赖新 API 能力) +- **运行形态**:单个 Docker 容器(镜像 `dootask/kpi:`) +- **数据存储**:独立 SQLite 数据库,本地卷 `kpi_data` 挂载到 `/web/db`,不入主库 +- **菜单注入**:安装后在「应用中心」注册「绩效考核」入口 +- **重启策略**:`unless-stopped`,主机重启容器自动恢复 + +## 用户生命周期钩子 +插件订阅了 DooTask 的用户事件,自动维护 KPI 内部用户: + +- `user_onboard`:DooTask 创建用户时,自动在 KPI 内建号 + - 部门不存在则自动创建该部门 + - DooTask 管理员自动设为 HR 角色 + - 部门负责人自动设为 manager 角色 + - 其余设为 employee 角色 +- `user_offboard`:DooTask 删除用户时,KPI 同步清理 + +## 信息同步规则 +用户登录 KPI 时: + +- 自动更新姓名、职位 +- **角色保持不变**(不会因为 DooTask 角色变化而重新分配 KPI 角色) + +## 不支持 +- 不能离线安装到不联网的环境(需访问应用市场镜像源) +- 不能在主程序 < 1.4.67 的环境上安装 + +## 相关 +- 是什么:[[kpi.concept]] +- 入口在哪:[[kpi.entry.menu-map]] +- 评分机制:[[kpi.scoring.concept]] diff --git a/resources/ai-kb/zh/concept/kpi/scoring.md b/resources/ai-kb/zh/concept/kpi/scoring.md new file mode 100644 index 000000000..085db839c --- /dev/null +++ b/resources/ai-kb/zh/concept/kpi/scoring.md @@ -0,0 +1,73 @@ +--- +id: kpi.scoring.concept +title: KPI 评分机制与权重 +type: concept +feature: kpi +scope: end-user +locale: zh +aliases: + - KPI 怎么算分 + - 绩效权重 + - 自评权重 + - 上级评分 + - 邀请评分权重 + - 绩效规则 + - 最终得分怎么来的 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 kpi 插件 +negative: + - 仅 HR 管理员可以配置绩效规则 + - 权重百分比合计必须为 100%,否则保存不通过 + - 关闭绩效规则开关后,系统回退到默认评分方式 + - 配置修改后立即生效,仅影响后续新发起的考核 +last_verified: v1.7.90 +--- + +# KPI 评分机制与权重 + +## 定义 +KPI 插件的「绩效规则」用于配置不同评分来源在最终得分中的权重比例。系统会根据规则把自评、上级评分、邀请评分按比例加权,自动算出员工的最终绩效得分。 + +## 评分来源 +一次考核可能涉及最多三种评分来源: + +- **自评**:员工对照模板给自己打分 +- **上级评分**:直属主管打分 +- **邀请评分**:HR 邀请的第三方人员打分(可选环节,仅在 HR 发起邀请后生效) + +## 配置场景 +绩效规则按是否有邀请评分分为两套权重配置: + +- **无邀请评分场景** + - 自评权重 + 上级评分权重 = 100% +- **有邀请评分场景** + - 自评权重 + 邀请评分权重 + 上级评分权重 = 100% + +## 配置流程 +1. HR 进入 KPI 的「绩效规则」配置页 +2. 打开绩效规则开关,规则生效 +3. 按公司制度分别设置两种场景下各来源的权重百分比 +4. 保存后立即生效,影响后续新发起的考核 +5. 若关闭开关,系统使用默认评分方式 + +## HR 审核环节 +- 主管评估、邀请评分完成后,HR 在「审核」环节查看汇总结果 +- 系统按绩效规则自动算出最终得分,HR 可手动调整 +- 员工在「待确认」状态查看最终分;有异议可申诉,HR 审核后再调分 + +## 异议处理对得分的影响 +- 员工提交异议后考核状态变为「异议处理中」 +- HR 可填写处理原因并调整最终得分 +- 处理后员工需重新确认;如仍有异议可再次提交(每轮异议都需 HR 重新处理) + +## 不支持 +- 不支持非 HR 角色配置绩效规则 +- 不支持单条考核临时改权重(只能改全局规则) +- 不支持权重为负值或合计不等于 100% + +## 相关 +- KPI 是什么:[[kpi.concept]] +- 创建考核:[[kpi.create.howto]] +- 入口在哪:[[kpi.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/ldap/overview.md b/resources/ai-kb/zh/concept/ldap/overview.md new file mode 100644 index 000000000..640a913e9 --- /dev/null +++ b/resources/ai-kb/zh/concept/ldap/overview.md @@ -0,0 +1,60 @@ +--- +id: ldap.concept +title: LDAP 集成是什么 +type: concept +feature: ldap +scope: admin +locale: zh +aliases: + - LDAP + - AD 登录 + - Active Directory + - 域账号登录 + - 企业目录 + - LDAP 集成 + - LDAP 是什么 + - 单点登录 LDAP +related_tools: [] +related_pages: [] +prerequisites: + - 已部署可达的 LDAP / AD 服务 +negative: + - 不支持 OAuth / SAML / OIDC(这页只讲 LDAP) + - 不支持多 LDAP 域,只能配置 1 个 default connection + - LDAP 用户没邮箱属性就无法首次登录(会抛「LDAP 用户缺少邮箱属性」) + - LDAP 用户密码不存到本地,本地密码用随机串占位 +last_verified: v1.7.90 +--- + +# LDAP 集成是什么 + +## 定义 +LDAP(Lightweight Directory Access Protocol)集成让 DooTask 用企业已有的 LDAP / Active Directory 账号体系做认证。开启后用户在登录页输入企业域账号 + 密码,DooTask 通过 LDAP 协议向目录服务器认证,认证成功后在本地自动创建或合并账号。 + +实现位于 `app/Ldap/LdapUser.php`,依赖 `directorytree/ldaprecord` 库。设置存在 `setting` 表的 `thirdAccessSetting` 分组。 + +## 关键属性 + +- **ldap_open** — 总开关;非 `open` 时所有 LDAP 调用直接 short-circuit 返回 +- **ldap_host / ldap_port** — 目录服务器地址(端口默认 389) +- **ldap_user_dn / ldap_password** — 管理员 Bind DN 与密码,用于搜索用户 +- **ldap_base_dn** — 搜索基准 DN,限定查找范围 +- **ldap_login_attr** — 登录属性,可选 `cn` / `uid` / `mail` / `sAMAccountName` / `userPrincipalName`,默认 `cn` +- **ldap_sync_local** — 本地账号反向写入 LDAP 的开关 + +## 工作流程 + +1. 用户在 DooTask 登录页输入企业账号 + 密码 +2. 后端用管理员 Bind 搜索 `loginAttr=用户名` 的 entry +3. 拿到该 entry 的真实 DN,用「DN + 用户输入的密码」二次 Bind +4. Bind 成功 → 从 entry 中提取邮箱(按 `mail / cn / uid / userPrincipalName` 顺序) +5. 本地按 email 查找用户:找不到则注册(本地密码随机),找到则合并 +6. 同步昵称、头像(`jpegPhoto` 字段)到本地账号 + +## 与其他概念的关系 + +- **本地账号**:本地账号若没 `ldap` identity,被 LDAP 用户合并时会打上 `ldap` 标 +- **同步本地**(`ldap_sync_local=open`):本地用户登录或注册时反向把账号写到 LDAP,便于统一管控 +- **Swoole 协程**:连接在容器中共享,认证成功后会立刻还原成管理员绑定,避免污染下一个请求 + +配置入口见 [[system-setting.third-access.howto]] 或 [[ldap.config.howto]]。 diff --git a/resources/ai-kb/zh/concept/license/overview.md b/resources/ai-kb/zh/concept/license/overview.md new file mode 100644 index 000000000..756be9b6f --- /dev/null +++ b/resources/ai-kb/zh/concept/license/overview.md @@ -0,0 +1,59 @@ +--- +id: license.concept +title: License Key 是什么 +type: concept +feature: license +scope: super-admin +locale: zh +aliases: + - License + - 授权码 + - 许可证 + - License Key 是什么 + - 多少人能用 + - 用户上限 + - 终端授权 + - 怎么算授权 + - SN 是什么 + - 绑定 MAC +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限才能查看 + - 仅超级管理员能保存 License +negative: + - 3 人以下的部署不强制 License(不绑 SN / MAC,但仍受人数限制) + - 一份 License 不能拆给多个 DooTask 终端共用 + - 过期或人数超限不会立刻锁死功能,但会在管理端持续报错提示 +last_verified: v1.7.90 +--- + +# License Key 是什么 + +## 定义 +License Key 是 DooTask 终端的授权凭证,决定一个部署允许多少注册用户、绑定哪台机器、有效期到何时。它是一段加密字符串,由官方根据「终端 SN + MAC + 人数 + 过期时间」签发。 + +后端通过 `api/system/license` 接口读写,存储在主程序根目录的 License 文件中(由 `Doo::licenseSave/licenseContent` 管理)。 + +## 关键属性 + +- **license(content)** — License 原文字符串 +- **info.people** — 允许的最大用户数;0 表示无限制 +- **info.sn** — 授权绑定的终端 SN +- **info.mac** — 授权允许的 MAC 列表(数组) +- **info.expired_at** — 过期时间(字符串,空字符串/0 表示永久) +- **doo_sn / doo_version** — 当前终端的 SN 与主程序版本 +- **macs** — 当前服务器实际网卡 MAC 列表 +- **user_count** — 当前非机器人、未禁用的活跃用户数 + +## 与其他概念的关系 + +- **小团队豁免**:`info.people <= 3` 时不校验 SN / MAC,相当于「3 人内永久免费」 +- **超额提示**:`user_count > info.people` 时返回 `error: 终端用户数超过License限制` +- **绑定校验**:SN 不匹配 → `终端SN与License不匹配`;MAC 不在白名单 → `终端MAC与License不匹配` +- **过期校验**:当前时间 > `expired_at` → `终端License已过期` + +## 使用场景 +- 申请新的 License:见 [[license.howto]] +- 处理过期或失效:见 [[license.expire.faq]] +- 管理后台「License」页会汇总 `error` 数组,展示所有不满足的规则 diff --git a/resources/ai-kb/zh/concept/meeting/overview.md b/resources/ai-kb/zh/concept/meeting/overview.md new file mode 100644 index 000000000..b5b65448c --- /dev/null +++ b/resources/ai-kb/zh/concept/meeting/overview.md @@ -0,0 +1,44 @@ +--- +id: meeting.concept +title: 在线会议是什么 +type: concept +feature: meeting +scope: end-user +locale: zh +aliases: + - 会议是什么 + - 视频会议 + - 在线会议 + - DooTask 会议 + - 音视频会议 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已在系统设置开启会议并填入服务密钥 +negative: + - 不支持会议录制(当前版本无录制按钮) + - 不支持屏幕共享(仅音视频通话) + - 不支持会议预约(无法预定将来某个时间的会议,只能即时发起) + - 不支持等候室 / 主持人审批入会 +last_verified: v1.7.90 +--- + +# 在线会议是什么 + +## 定义 +在线会议是 DooTask 内置的音视频通话能力,基于 Agora(声网)RTC 实现。任何登录用户可即时发起一个会议频道,邀请同事或通过分享链接让访客加入,会议中可开关麦克风/摄像头、互相邀请。 + +## 关键属性 +- **频道标识**:每个会议有一个 `meetingid`(11 位大写字母数字串),是用户可见的会议号 +- **底层频道**:服务端按 `meetingid` 派生一个内部 `channel`,配合 Agora token 鉴权 +- **创建人**:发起人记为 `userid`;访客加入时 `userid` 为空 +- **生命周期**:会议在所有人离开 10 分钟后由 [[meeting.close.howto]] 自动关闭并写 `end_at` +- **邀请方式**:直接拉成员 + 分享链接(6 小时有效)两种,详见 [[meeting.invite.howto]] / [[meeting.share.howto]] +- **会议消息**:发起 / 邀请会在对方对话生成一张「会议卡片」消息,结束后卡片自动更新为「已结束」 + +## 与其他能力的关系 +- 与「即时通讯」:会议入口集成在对话窗口;会议事件以消息形式回写到对话 +- 与「日历」:发起的会议不会自动写入日历(需要手动建日历事件) + +## 不支持 +- 录制、屏幕共享、会议预约、等候室、主持人踢人等高级能力当前版本均不提供 diff --git a/resources/ai-kb/zh/concept/meeting/tourist.md b/resources/ai-kb/zh/concept/meeting/tourist.md new file mode 100644 index 000000000..ba6500a13 --- /dev/null +++ b/resources/ai-kb/zh/concept/meeting/tourist.md @@ -0,0 +1,62 @@ +--- +id: meeting.tourist.concept +title: 会议访客(免登录加入) +type: concept +feature: meeting +scope: end-user +locale: zh +aliases: + - 访客加入会议 + - 不登录开会 + - 外部人员加入 + - 临时身份开会 + - 没账号能开会吗 +related_tools: [] +related_pages: [] +prerequisites: + - 发起人已生成会议分享链接 +negative: + - 访客无法主动邀请其他人 + - 访客身份仅在当前会议有效,不会保留到系统 + - 访客退出后再次进入需要重新填写姓名 +last_verified: v1.7.90 +--- + +# 会议访客(免登录加入) + +## 定义 +访客是指未注册 / 未登录 DooTask、通过会议分享链接以临时身份加入会议的用户。访客信息不写入用户表,仅缓存 6 小时。 + +## 如何成为访客 +1. 拿到形如 `/meeting//` 的会议分享链接 +2. 在浏览器打开(不需要登录) +3. 加入对话框里填写「你的姓名」作为临时昵称 +4. 选择是否开启麦克风 / 摄像头,点「加入会议」 + +## 关键属性 +| 属性 | 值 | +|---|---| +| 用户身份 | 临时 uid,无系统 userid | +| 昵称来源 | 入会时手动填写 | +| 头像 | 自动按昵称生成默认头像 | +| 有效期 | 6 小时(与 sharekey TTL 一致) | +| 数据存储 | Redis 缓存,键 `meeting_share_link_code_` | + +## 访客在会议中能做什么 +- 收听 / 发言(麦克风) +- 开关自己的摄像头 +- 看到其他参会人的画面和昵称 + +## 访客在会议中不能做什么 +- 不能邀请其他成员(无「邀请」按钮,仅能「复制链接」转发) +- 不能查看会议外的对话或卡片 +- 不能在系统其他模块出现(个人主页、@提及等都搜不到) + +## 不支持 +- 不支持设置访客头像(自动按昵称生成) +- 不支持把访客转为正式用户(需另行注册) +- 不支持禁止某访客重新加入(只能等链接过期) + +## 相关 +- 生成分享链接:[[meeting.share.howto]] +- 加入流程:[[meeting.join.howto]] diff --git a/resources/ai-kb/zh/concept/memos/overview.md b/resources/ai-kb/zh/concept/memos/overview.md new file mode 100644 index 000000000..aa861cdad --- /dev/null +++ b/resources/ai-kb/zh/concept/memos/overview.md @@ -0,0 +1,55 @@ +--- +id: memos.concept +title: Memos 是什么 +type: concept +feature: memos +scope: end-user +locale: zh +aliases: + - Memos + - 速记 + - 笔记应用 + - 个人笔记 + - 想法记录 + - 碎片笔记 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 memos 插件 +negative: + - Memos 不是主程序内置功能,未装插件时不可用 + - Memos 默认走 SQLite 本地存储,不接 DooTask 主库 + - 不支持游客 / 未登录访问 +last_verified: v1.7.90 +--- + +# Memos 是什么 + +## 定义 +Memos(笔记 / 速记)是一款隐私优先、轻量级的开源笔记服务(开源项目 [usememos.com](https://www.usememos.com)),在 DooTask 中以独立插件形式集成,主要用来快速记录想法、待办、链接、代码片段等碎片化内容。每条记录就是一条「memo」,时间倒序排列在时间线上。 + +## 在 DooTask 中的形态 +- 通过应用市场安装的社区插件,与主程序同源、共用 TLS +- 走主程序 nginx 子路径 `/apps/memos/` 反向代理,用户无需额外登录 +- 数据自托管,使用 SQLite,存放于应用目录 `data/memos` + +## 关键特性 +- **轻量速记**:以时间线方式记录碎片想法,类似 Twitter/微博风格 +- **隐私优先**:数据完全自托管,不上传第三方 +- **单点登录**:DooTask 登录态自动同步,免输密码 +- **标签 / 分类**:支持 `#标签` 语法分类整理(详见 [[memos.tag.concept]]) + +## 适用场景 +- 工作日志、灵感速记 +- 临时收藏链接 / 代码片段 +- 个人学习笔记 / 读书摘录 +- 团队不强协作场景下的轻量笔记 + +## 不支持 +- 不替代正式文档(如需协作文档请用项目内文档) +- Memos 不直接与任务 / 项目数据互通 + +## 相关 +- 插件元信息:[[memos.plugin.concept]] +- 入口在哪:[[memos.entry.menu-map]] +- 怎么写一条:[[memos.create.howto]] diff --git a/resources/ai-kb/zh/concept/memos/plugin.md b/resources/ai-kb/zh/concept/memos/plugin.md new file mode 100644 index 000000000..6b9ba9ad7 --- /dev/null +++ b/resources/ai-kb/zh/concept/memos/plugin.md @@ -0,0 +1,52 @@ +--- +id: memos.plugin.concept +title: Memos 插件元信息 +type: concept +feature: memos +scope: end-user +locale: zh +aliases: + - Memos 插件 + - memos 怎么装 + - memos 应用市场 + - 笔记插件 + - community_kuaifan_memos +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - Memos 不是主程序内置功能,未装插件时入口不会出现 + - 插件升级不通过 git pull,需要在应用市场更新 + - 插件不能离线安装到不联网的环境 +last_verified: v1.7.90 +--- + +# Memos 插件元信息 + +## 定义 +Memos 在 DooTask 中由社区插件提供,应用市场 app id 为 `community_kuaifan_memos`(当前版本 0.29.0),feature 短名 `memos`。主程序不内置任何 Memos 代码,所有笔记逻辑都跑在独立容器中,通过 nginx 反向代理 `/apps/memos/` 子路径挂载到 DooTask 界面。 + +## 关键属性 +- **作者**:DooTask 官方(基于开源项目 usememos/memos) +- **运行形态**:两个 Docker 容器 + - `memos-server`:自构建 Memos 镜像(`dootask/memos-server:0.29.0`),前端打补丁支持子路径 + - `memos-proxy`:鉴权代理(`dootask/memos:`),校验 DooTask 用户令牌、自动建号 / 免密登录 +- **数据存储**:SQLite,本地卷 `memos-data` 挂载到 `/var/opt/memos`,不入主库 +- **菜单注入**:安装后在「应用中心」注册「Memos 笔记」入口 +- **会话有效期**:访问令牌过期后通过 `memos_refresh` cookie 自动续期,最长 30 天 + +## 安装配置项 +- **管理员**:在安装界面选择若干 DooTask 用户作为 Memos 管理员,其余用户以普通成员身份登录 +- **内部密钥**:用于派生账号密码与签名会话,安装后请勿修改 + +## 单点登录机制 +- 用户打开插件时,代理自动在 Memos 内建号、用确定性密码登录 +- 屏蔽 Memos 原生的直接登录与自助注册接口(防止绕过 DooTask 鉴权) + +## 不支持 +- 不能用 Memos 原生账号密码登录(仅支持 DooTask SSO) +- 不能选择不安装 `memos-proxy`(鉴权必经路径) + +## 相关 +- 是什么:[[memos.concept]] +- 入口在哪:[[memos.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/memos/tag.md b/resources/ai-kb/zh/concept/memos/tag.md new file mode 100644 index 000000000..cebb4678e --- /dev/null +++ b/resources/ai-kb/zh/concept/memos/tag.md @@ -0,0 +1,57 @@ +--- +id: memos.tag.concept +title: Memos 标签与分类 +type: concept +feature: memos +scope: end-user +locale: zh +aliases: + - Memos 标签 + - memos 怎么分类 + - 笔记标签 + - 笔记分类 + - 标签筛选 + - "#标签" +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 memos 插件 +negative: + - 标签是每个用户私有的(不与其他 DooTask 用户共用) + - 标签不与 DooTask 主程序的任务标签互通 +last_verified: v1.7.90 +--- + +# Memos 标签与分类 + +## 定义 +Memos 没有独立的「分类」字段,靠 `#标签` 语法在 memo 正文中内联标记。任何写在 `#xxx` 形式的词都会被识别为标签,自动聚合到侧边栏的标签列表,便于后续筛选检索。 + +## 关键属性 +- **写法**:在内容里直接写 `#项目A` `#读书笔记`,可一条 memo 多个标签 +- **嵌套**:支持斜杠分层,例如 `#工作/会议纪要`,侧栏会折叠展示 +- **私有**:每个 Memos 账号的标签彼此隔离(每个 DooTask 用户在 Memos 内是独立账号) +- **聚合方式**:Memos 自动扫描所有 memo 正文,无需手动维护「标签库」 + +## 使用方式 +- **添加**:写 memo 时在内容里直接打 `#标签名`,保存即生效 +- **筛选**:点击侧栏中对应标签,时间线只显示带该标签的 memo +- **删除**:把所有 memo 里这个 `#标签` 的字符删掉,标签自动消失(无独立删除按钮) + +## 与可见性的关系 +- 标签本身只是文本标记,不影响 memo 的可见性(私有 / 工作区 / 公开) +- 想限定某类笔记只自己可见,应改对应 memo 的可见性,而不是靠标签 + +## 适用场景 +- 按项目 / 主题 / 周期分组浏览 +- 给读书摘录 / 灵感速记打主题 +- 搭配搜索定位历史笔记 + +## 不支持 +- 不能改某个标签的名字(要重命名只能逐条编辑替换原文) +- 不能给标签设颜色或图标 +- 不能从 DooTask 主程序任务的标签自动同步过来 + +## 相关 +- Memos 是什么:[[memos.concept]] +- 写一条 memo:[[memos.create.howto]] diff --git a/resources/ai-kb/zh/concept/messenger/bot.md b/resources/ai-kb/zh/concept/messenger/bot.md new file mode 100644 index 000000000..fb80a7ef5 --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/bot.md @@ -0,0 +1,60 @@ +--- +id: messenger.bot.concept +title: 系统机器人会话 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 系统机器人 + - 机器人会话 + - 任务提醒机器人 + - 签到机器人 + - 谁给我发的系统消息 + - 这个机器人是谁 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 机器人会话不能被踢出 / 屏蔽,会随对应业务消息长期保留 + - 不能 @ 机器人触发动作,机器人是单向推送通道 + - 机器人不会触发未读 mention 数(不被加入 @ 提及统计) +last_verified: v1.7.90 +--- + +# 系统机器人会话 + +DooTask 内置一组「系统机器人」(bot=1 的特殊用户),每个机器人有自己的单聊会话,用来推送特定类型的系统消息。出现在用户的消息列表里,但发送者是机器人而非真人。 + +## 定义 + +- bot_type=system-msg:系统消息(默认) +- bot_type=task-alert:任务提醒(截止 / 分配 / 完成 / 修改) +- bot_type=todo-alert:待办提醒 +- bot_type=check-in:签到打卡通知 +- bot_type=approval-alert:审批流转通知 +- bot_type=meeting-alert:会议通知 +- bot_type=anon-msg:匿名消息中转 +- bot_type=okr-alert:OKR 推送 +- bot_type=user-auto-xxxxxx:用户自定义机器人(6-20 字符标识) + +## 关键属性 + +- 每个 bot_type 在每个用户处单独建一个单聊会话 +- 推送方式:调用 sendbot 接口或对应业务事件触发 +- 消息为 markdown 文本,最长 2000 字符 +- 机器人消息可被自己撤回(不受 msg_rev_limit 限制) + +## 与普通消息的区别 + +| 维度 | 真人消息 | 机器人消息 | +|---|---|---| +| 发送者 | 真实 userid | bot=1 的虚拟账号 | +| 撤回时限 | 受 msg_rev_limit 控制 | 无限制 | +| @ 提醒 | 计入 mention 统计 | 不计入 | + +## 不支持 + +- 不支持给机器人单聊发消息(机器人不会回应) +- 不支持把机器人加入群组 +- 不支持自定义机器人头像 / 替换内置机器人头像 diff --git a/resources/ai-kb/zh/concept/messenger/dialog-type.md b/resources/ai-kb/zh/concept/messenger/dialog-type.md new file mode 100644 index 000000000..9db9e601d --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/dialog-type.md @@ -0,0 +1,56 @@ +--- +id: messenger.dialog-type.concept +title: 对话类型 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 都有什么会话 + - 群有哪几种 + - 项目讨论组是什么 + - 任务讨论是什么 + - 单聊和群聊区别 + - 全员群是什么 +related_tools: [search_dialogs] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 用户不能手动把单聊(type=user)升级成群聊,需重新建群并把对方加入 + - 项目群 / 任务群 / 部门群 / 全员群不允许普通成员解散 + - 单聊不能设免打扰按群粒度,但可在系统设置里设置「个人会话静默」全局策略 +last_verified: v1.7.90 +--- + +# 对话类型 + +DooTask 的「会话」(也叫对话、Dialog)有两大类:单聊(type=user)和群聊(type=group)。群聊按 group_type 又分多个子类,影响成员管理权限和能否解散。 + +## 定义 + +| type | group_type | 说明 | +|---|---|---| +| user | — | 单聊(两人) | +| group | user | 普通自建群(群主可改名、加人、解散、转让) | +| group | project | 项目讨论组(与项目同生命周期) | +| group | task | 任务讨论组(按任务参与人自动维护) | +| group | department | 部门群(按部门成员自动维护) | +| group | all | 全员群(系统级,仅管理员可改名) | +| group | okr | OKR 评论会话 | + +## 关键属性 + +- 单聊的 dialog_id 由系统按双方 userid 自动分配,找对方即可打开 +- 项目群、任务群、部门群、全员群属于自动维护类型,成员变化跟随源数据 +- 群主(owner_id)+ 群管理员(deputy_ids)只对 group_type=user 的普通群有完整管理权 + +## 与其他概念的关系 + +- 单聊与「联系人」一一对应,给某人发消息会自动创建或复用单聊 +- 项目群与项目(project)双向关联,详见项目讨论概念 [[project.dialog.concept]] +- 任务群与任务(task)双向关联,详见任务讨论概念 [[task.dialog.concept]] + +## 不支持 + +- 不能将单聊转换成群聊 +- 不能将自动维护型群(项目 / 任务 / 部门 / 全员)改成普通群 diff --git a/resources/ai-kb/zh/concept/messenger/notify.md b/resources/ai-kb/zh/concept/messenger/notify.md new file mode 100644 index 000000000..29c8407e8 --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/notify.md @@ -0,0 +1,52 @@ +--- +id: messenger.notify.concept +title: 消息提醒规则 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 消息怎么提醒 + - 通知规则 + - 收不到通知 + - 谁会被提醒 + - 群消息提醒 + - 提醒在哪 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 不支持按关键词触发提醒(无关键词订阅功能) + - 免打扰开启后仅压制弹窗通知,未读数仍累计 + - 系统通知(notice)、模板消息(template)默认静默推送,不触发响铃 / 振动 +last_verified: v1.7.90 +--- + +# 消息提醒规则 + +DooTask 的消息提醒(notify)由「消息属性 + 用户偏好 + 系统通道」三层决定:服务端推送时打 silence 标志,客户端再根据用户的免打扰、勿扰时段过滤是否弹窗。 + +## 定义 + +- 强提醒:弹出系统通知 + 红点 + 数字未读 +- 弱提醒:仅累计未读 + 红点,不弹窗(如免打扰、silence=yes) +- 无提醒:静默写入,连未读都不增加(如系统重发、内部刷新) + +## 关键属性 + +- @ 提及(mention):即使开免打扰也强制弹窗 +- @所有人:群广播,所有成员强提醒 +- 消息标 silence=yes:以弱提醒入库,常用于 AI 流式增量 +- 通知 / 模板 / 系统消息(type=notice/template):默认走弱提醒 + +## 用户级配置 + +- 单个会话免打扰:群级开关,详见免打扰说明 +- 全局系统配置:管理员可设 user_private_chat_mute / user_group_chat_mute 默认值 +- 桌面端 / 移动端各自的系统通知开关在客户端设置里 + +## 不支持 + +- 不支持按时间段(如 22:00-08:00 勿扰)的定时静默,仅支持按会话开关 +- 不支持自定义提醒铃声(系统默认) +- 不支持把单聊设免打扰;单聊静默只能依赖客户端通知开关 diff --git a/resources/ai-kb/zh/concept/messenger/read-receipt.md b/resources/ai-kb/zh/concept/messenger/read-receipt.md new file mode 100644 index 000000000..4590f7935 --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/read-receipt.md @@ -0,0 +1,52 @@ +--- +id: messenger.read-receipt.concept +title: 已读未读状态 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 已读未读 + - 谁看过了 + - 消息已读 + - 谁还没看 + - 看消息回执 + - 已读列表 +related_tools: [get_message_list] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 已读未读不支持手动关闭显示,是系统统一行为 + - 通知类消息(notice)、系统消息不计入已读统计 + - 离开会话不会自动标记已读,需要打开会话并向上滚动经过该消息 +last_verified: v1.7.90 +--- + +# 已读未读状态 + +DooTask 的「已读未读」(read receipt)以消息 + 用户两两组合粒度记录。每个对话成员对每条消息有一行 `web_socket_dialog_msg_reads`,未读 read_at=null,已读后写入时间戳。 + +## 定义 + +- 未读(unread):read_at 为 null +- 已读(read):read_at 有值 +- @提及未读(mention):未读 + mention=1 的子集,会在会话列表右侧显示带数字的「@」标记 +- 红点(dot):服务端推送轻提示,刷新会话即清除 + +## 关键属性 + +- 未读数:会话级 / 全局级两个统计;会话内可点「未读消息」气泡跳转最早未读 +- 已读列表:群消息支持查看「谁已读 / 谁未读」,调用 readlist 接口 +- 标记未读(mark_unread):用户主动把已读会话再次置成未读,便于稍后处理 + +## 与其他概念的关系 + +- 与免打扰:开免打扰后不弹通知但仍累计未读;@仍强制提醒 +- 与标记未读:mark_unread=1 时打开会话会自动清除标记 +- 与隐藏:隐藏的会话依然计入未读总数 + +## 不支持 + +- 不支持「单条消息按用户级别已读时间戳」的展示,仅二元 has-read / not-read +- 不支持「24h 内未读自动清除」 +- 不支持已读后再撤销已读 diff --git a/resources/ai-kb/zh/concept/messenger/task-mention.md b/resources/ai-kb/zh/concept/messenger/task-mention.md new file mode 100644 index 000000000..26246db5d --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/task-mention.md @@ -0,0 +1,54 @@ +--- +id: messenger.task-mention.concept +title: 对话内 #任务 引用与创建 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么at任务 + - 群里发任务 + - 怎么发个任务链接 + - 消息里引用任务 + - 怎么把任务发到群 + - 群里建任务 +related_tools: [create_task, send_message] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - "#任务 弹窗仅在群对话支持,单聊不显示创建按钮" + - 引用任务需当前用户有该任务的可见权限,否则群其他成员看到的是「无权访问」占位 + - 不支持引用未保存的草稿任务,必须先创建 +last_verified: v1.7.90 +--- + +# 对话内 #任务 引用与创建 + +在 messenger 输入框中输入 `#` 会触发任务面板,可:1) 引用已有任务(生成可点击的 #任务名 链接卡);2) 直接基于输入内容快速创建新任务(自动归属当前任务群对应的项目或弹出项目选择)。 + +## 定义 + +- 任务引用:以 `#任务名` 形态嵌入消息文本 +- 任务速建:通过 #提及面板的「+ 创建新任务」入口走完整流程,详见 [[task.create.howto.via-mention]] + +## 关键属性 + +- 引用渲染:群里其他成员看到链接卡片,标题、负责人、状态实时刷新 +- 权限保护:被引用任务对查看人不可见时显示"无权访问" +- 在任务群(group_type=task)里 #提及会优先把任务挂到本群对应的源任务上 + +## 与其他类似语法 + +- `@用户`:人员提及,详见 @提及成员 +- `#任务`:任务引用 / 创建 +- `~文件`:文件引用(通过 sendfileid 发分享链接) + +## 与转发任务的区别 + +- #任务 引用:在文本内嵌入链接卡 +- sendtaskid 转发:发一条独立的任务卡片消息(带留言),适合「把任务派到群里讨论」 + +## 不支持 + +- 不支持在单聊里"快速创建任务"卡片 +- 不支持 # 多个任务并列(每条消息逐个 # 即可,但不能"批量创建") diff --git a/resources/ai-kb/zh/concept/messenger/unread.md b/resources/ai-kb/zh/concept/messenger/unread.md new file mode 100644 index 000000000..4c2f17644 --- /dev/null +++ b/resources/ai-kb/zh/concept/messenger/unread.md @@ -0,0 +1,55 @@ +--- +id: messenger.unread.concept +title: 未读数和标记未读 +type: concept +feature: messenger +scope: end-user +locale: zh +aliases: + - 未读数 + - 红点是什么 + - 怎么显示未读数 + - 标记未读 + - 把消息标记为未读 + - 群里多少条没看 +related_tools: [get_message_list] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 红点(dot)和未读数(unread)是两个独立机制:dot 是轻提示,unread 按消息粒度统计 + - 未读数总上限受展示限制(一般 99+ 截断),实际 DB 仍精确 + - 标记未读(mark_unread)只对自己有效,且打开会话会自动清除 +last_verified: v1.7.90 +--- + +# 未读数和标记未读 + +「未读数」(unread count)是每个用户在每个会话里未读消息的条数,按 dialog_msg_reads.read_at=null 实时计算。「标记未读」(mark_unread)是用户主动把已读会话再次置成未读,用于稍后处理。 + +## 定义 + +- unread:会话当前未读消息条数 +- unread_one:是否仅有 1 条(用于「N 条新消息」气泡显示) +- mention:未读 + 被 @ 的消息条数 +- mention_ids:被 @ 的消息 ID 列表 +- mark_unread:用户主动标记未读(1=已标) +- dot:服务端轻量推送红点,刷新即清 + +## 关键属性 + +- 进入会话并向上滚动经过该消息 → 自动标已读 +- 主动「标记已读 / 一键已读」→ chunkById 批量写 read_at +- 主动「标记未读」→ mark_unread=1,列表上显示红点;打开会话自动清除 +- 免打扰开启 / 关闭都不影响未读计数 + +## 与会话列表显示的关系 + +- 未读 > 0 显示「N」徽标 +- mention > 0 显示「@N」徽标,优先级高于普通未读 +- mark_unread=1 显示红点但不显数字 + +## 不支持 + +- 不支持「将整个会话彻底清零未读但不打开」(必须打开或调用一键已读) +- 不支持按消息类型筛选未读(如只看图片未读) +- 不支持把未读数同步到其他客户端的"动态"提示 diff --git a/resources/ai-kb/zh/concept/micro-app/list.md b/resources/ai-kb/zh/concept/micro-app/list.md new file mode 100644 index 000000000..723da3f7c --- /dev/null +++ b/resources/ai-kb/zh/concept/micro-app/list.md @@ -0,0 +1,49 @@ +--- +id: micro-app.list.concept +title: 当前可用微应用 +type: concept +feature: micro-app +scope: end-user +locale: zh +aliases: + - 有哪些微应用 + - 插件清单 + - 应用市场有什么 + - 装了哪些应用 + - 可用微应用 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 这是常见插件示例,不是出厂强制清单;实际可见列表随已安装情况而变 + - 没装的插件菜单不会出现,不能简单从「应用」中心看出全部 + - 自部署或第三方仓库的插件不在此列 +last_verified: v1.7.90 +--- + +# 当前可用微应用 + +## 定义 +DooTask 应用市场提供一组官方与社区维护的微应用。下面列的是较常见的几类,实际能在应用中心看到的微应用取决于本实例已安装了哪些,参考服务器 `docker/appstore/apps/` 目录即可知。 + +## 常见微应用 +- **OKR**(id `okr`)— 目标 + 关键结果管理,参考 [[okr.concept]] +- **审批中心**(id `approve`)— 流程审批,参考 [[approve.concept]] +- **思维导图 Minder**(id `minder`)— 文件类型 `.km` +- **流程图 Drawio**(id `drawio`)— 文件类型 `.drawio` +- **OnlyOffice**(id `office`)— Word / Excel / PPT 在线编辑 +- **文件预览 fileview**(id `fileview`)— PDF / 图片 / 文档预览渲染 +- **人脸识别签到**(id `face`)— 配合签到使用 +- **AI 助手**(id `ai`)— 见 [[ai-assistant.entry.howto]] +- **Memos 笔记**(社区 `community_kuaifan_memos`)— 个人记事本 +- **KPI**(社区 `community_kuaifan_kpi`)— 绩效考核 +- **Manticore 搜索**(id `manticore`)— 全文搜索引擎 + +## 怎么知道我这装了哪些 +- 应用中心「常用」分区里非系统应用的卡片都来自微应用 +- 完整插件列表见应用市场「已安装」标签 +- 前端 Vuex 字段 `microAppsIds` 是已装插件 id 数组 + +## 没装的怎么办 +- 让管理员去应用市场安装:[[micro-app.install.howto]] +- 不是所有插件都能在私有化部署的实例上装(依赖镜像源连通) diff --git a/resources/ai-kb/zh/concept/micro-app/menu.md b/resources/ai-kb/zh/concept/micro-app/menu.md new file mode 100644 index 000000000..721cd3199 --- /dev/null +++ b/resources/ai-kb/zh/concept/micro-app/menu.md @@ -0,0 +1,56 @@ +--- +id: micro-app.menu.concept +title: 自定义微应用菜单 +type: concept +feature: micro-app +scope: admin +locale: zh +aliases: + - 自定义应用菜单 + - 自定义微应用 + - 接入第三方网页 + - microapp_menu + - 加个外链应用 + - 自建应用卡片 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 自定义菜单不会自动同步给已离线的用户,需刷新页面 + - 不支持把自定义菜单注入到「应用市场」或「系统设置」 + - 自定义菜单的 URL 必须能被 DooTask 前端 iframe / 跳转打开,未对外的内网地址需自行确保连通 +last_verified: v1.7.90 +--- + +# 自定义微应用菜单 + +## 定义 +自定义微应用菜单(microapp_menu)让管理员把任意外部网页或服务以「微应用卡片」的形式接入 DooTask,无需打成插件。配置保存到系统设置项 `microapp_menu`,按用户身份过滤后下发到前端 `microAppsMenus` 状态。 + +## 关键属性 +- **应用 ID**:唯一标识,例如 `custom-okr` +- **菜单位置 location**: + - `application` — 应用中心「常用」分区 + - `application/admin` — 应用中心「管理员」分区 + - `main/menu` — 主导航栏一级菜单 +- **可见范围 visible_to**:`all`(所有成员)/ `admin`(仅管理员) +- **类型 type**:`iframe` / `iframe_blank` / `inline` / `inline_blank` / `external` +- **URL**:支持 `{user_token}` 占位符做 SSO +- **其他选项**:`keep_alive` 保持激活、`auto_dark_theme` 跟随暗黑、`immersive` 沉浸式、`transparent` 透明背景、`disable_scope_css` 禁用作用域样式 + +## 配置入口 +- 桌面端:左侧栏「应用」→ 右上角「⋯」→「自定义应用菜单」 +- 仅 `userIsAdmin = true` 显示该入口 + +## 接口 +- 获取:`POST api/system/microapp_menu?type=get` +- 保存:`POST api/system/microapp_menu?type=save`(限管理员) + +## 与插件微应用的关系 +- 插件微应用:通过应用市场安装后自动注册菜单,不可在此页编辑 +- 自定义菜单:完全由管理员手填,专门用于接入未打包成插件的外部系统 + +## 相关 +- 在哪能看到:[[micro-app.entry.menu-map]] +- 微应用整体概念:[[micro-app.concept]] diff --git a/resources/ai-kb/zh/concept/micro-app/overview.md b/resources/ai-kb/zh/concept/micro-app/overview.md new file mode 100644 index 000000000..d50ac92a9 --- /dev/null +++ b/resources/ai-kb/zh/concept/micro-app/overview.md @@ -0,0 +1,49 @@ +--- +id: micro-app.concept +title: 微应用是什么 +type: concept +feature: micro-app +scope: end-user +locale: zh +aliases: + - 微应用是什么 + - 什么是微应用 + - 插件应用 + - 第三方应用 + - 微应用和系统应用的区别 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 微应用不是 DooTask 主程序代码,是独立插件提供 + - 微应用与「应用商店(应用市场 / AppStore)」不是同一个东西,应用商店是用来安装它们的入口 + - 不是所有微应用都被自动安装,未装时菜单不会出现 +last_verified: v1.7.90 +--- + +# 微应用是什么 + +## 定义 +微应用是由「应用商店」(也叫应用市场 / AppStore)安装的插件提供的一类应用,以独立卡片 / 页面形式嵌入 DooTask 主框架(iframe / inline 等方式)。每个微应用对应一个独立 Docker 容器或前端资源包,挂载到「应用」中心或主导航上让用户访问。 + +## 与系统应用的区别 +| 维度 | 系统应用 | 微应用 | +|---|---|---| +| 来源 | 主程序内置代码 | 应用商店已安装插件 | +| 是否需要安装 | 不需要 | 需要管理员在应用商店点装 | +| 卸载后影响 | 不能卸载 | 卸载后菜单消失,业务数据保留在数据库 | +| 升级方式 | 跟主程序版本走 | 应用商店单独更新 | + +## 关键属性 +- **登录态继承**:打开微应用时自动带上当前用户 token,无需再次登录 +- **菜单注入**:插件通过 `microapp_menu` 接口或自带 `menu_items` 配置注册到 `location: application`、`application/admin` 或 `main/menu` +- **显示条件**:受 `visible_to`(all / admin)与系统管理员身份共同控制 +- **生命周期**:独立容器;主程序与微应用之间通过 nginx 反代和 token 鉴权交互 + +## 当前可见列表 +随已安装插件而变,详见 [[micro-app.list.concept]]。 + +## 相关 +- 怎么安装:[[micro-app.install.howto]] +- 在哪能看到:[[micro-app.entry.menu-map]] +- 自定义菜单:[[micro-app.menu.concept]] diff --git a/resources/ai-kb/zh/concept/micro-app/permission.md b/resources/ai-kb/zh/concept/micro-app/permission.md new file mode 100644 index 000000000..a74107c96 --- /dev/null +++ b/resources/ai-kb/zh/concept/micro-app/permission.md @@ -0,0 +1,51 @@ +--- +id: micro-app.permission.concept +title: 微应用权限 +type: concept +feature: micro-app +scope: end-user +locale: zh +aliases: + - 微应用权限 + - 谁能用微应用 + - 微应用对谁可见 + - 微应用登录态 + - 微应用 SSO + - 微应用 token +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 没有「整体禁用所有微应用」的开关,按单个插件 / 单条菜单控制 + - 微应用内部的细粒度权限(如「谁能改 OKR」)由插件自身实现,不归 DooTask 主程序管 + - 临时帐号 / 受限身份的功能限制对微应用同样生效(如禁止创建群、禁止文件分享) +last_verified: v1.7.90 +--- + +# 微应用权限 + +## 定义 +微应用权限分两层:**主程序层**控制谁能看到 / 进入这个微应用;**插件内部**控制进入后能做什么。前者由 DooTask 主程序按用户身份 + 菜单配置过滤,后者由每个插件自行实现。 + +## 主程序层判断 +- **可见范围 visible_to**:菜单注册时声明 + - `all` — 所有成员可见 + - `admin` — 仅系统管理员可见(应用中心走「管理员」分区) +- **管理员判断**:基于 `userIsAdmin`,对应 `User::isAdmin()` +- **菜单位置 location**:决定渲染在哪里(应用中心 / 主导航 / 管理员区) +- **临时帐号限制**:受限身份在主程序的所有限制(禁止创建群、禁止文件分享等)同样作用于微应用调用主程序接口 + +## 登录态传递 +- 微应用通过 URL `?token={user_token}` 拿到当前用户身份 +- 微应用自己再调用 DooTask 后端时携带该 token +- 后端会校验 token 关联的用户身份,决定是否放行接口 + +## 插件内部权限 +- 由插件自行实现,DooTask 不强制规范 +- 比如 OKR 内部有「目标负责人」「KR 协作者」概念 +- 比如 approve 内部有「审批人」「抄送人」「发起人」概念 +- 主程序对此不做拦截,只负责把用户身份传过去 + +## 与系统应用对比 +- 系统应用走主程序权限体系,由 [[role-permission.permission-denied.faq]] 覆盖 +- 微应用主程序层只控可见性,业务权限由插件自管 diff --git a/resources/ai-kb/zh/concept/minder/collaboration.md b/resources/ai-kb/zh/concept/minder/collaboration.md new file mode 100644 index 000000000..c49016dd4 --- /dev/null +++ b/resources/ai-kb/zh/concept/minder/collaboration.md @@ -0,0 +1,50 @@ +--- +id: minder.collaboration.concept +title: 思维导图是否支持多人协作编辑 +type: concept +feature: minder +scope: end-user +locale: zh +aliases: + - 思维导图协作 + - 思维导图多人编辑 + - 脑图共享编辑 + - 思维导图能不能一起改 + - minder 实时同步 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 minder 插件 +negative: + - 同一张 mind 文件同一时间不支持多人实时同步编辑,与 OnlyOffice 不同 + - 多人同时打开并保存可能导致后保存方覆盖前保存方 + - 不支持节点级别的细粒度评论或讨论 +last_verified: v1.7.90 +--- + +# 思维导图是否支持多人协作编辑 + +## 定义 +DooTask 思维导图(minder 插件)以**单人编辑 + 多人查看**模式运作。文件内容存到 DooTask 文件系统,所有有权限的成员都能打开看到当前最新版本,但同一时间多人编辑保存会出现「后写覆盖前写」。 + +## 关键属性 +- **多人可见**:所有对文件有读权限的成员都能打开预览 +- **保存机制**:编辑器内修改后由前端发起保存请求,整张图作为一个 JSON 文件覆盖式保存 +- **没有实时同步**:与 OnlyOffice([[office.collaboration.concept]])不同,思维导图不通过 WebSocket 推送其他人的实时改动 +- **冲突表现**:A、B 同时打开编辑,A 先保存,B 后保存——最终内容只剩 B 的版本,A 的改动丢失 +- **历史版本**:可借助 DooTask 文件版本历史回滚到之前的快照 + +## 推荐协作模式 +- 同一时间由一人改,其他人通过群聊/讨论沟通后再轮换编辑 +- 大型导图按子分支拆成多张文件,分人维护 +- 改完后通过文件「发送」/「链接」/「共享」分享给团队 +- 误覆盖可在文件详情 →「历史版本」中恢复 + +## 与其他场景对比 +- **drawio 流程图**:同样是单人编辑,多人同时编辑也会出现覆盖 +- **OnlyOffice Word/Excel/PPT**:自带多人实时协作,多端同时编辑会合并 +- **DooTask 在线文档(document)**:基于富文本编辑器,亦不支持多人实时 + +## 相关 +- 是什么:[[minder.concept]] +- OnlyOffice 协作能力对比:[[office.collaboration.concept]] diff --git a/resources/ai-kb/zh/concept/minder/overview.md b/resources/ai-kb/zh/concept/minder/overview.md new file mode 100644 index 000000000..261942c8b --- /dev/null +++ b/resources/ai-kb/zh/concept/minder/overview.md @@ -0,0 +1,45 @@ +--- +id: minder.concept +title: 思维导图(minder)是什么 +type: concept +feature: minder +scope: end-user +locale: zh +aliases: + - 思维导图 + - 脑图 + - mind map + - minder 是什么 + - DooTask 思维导图 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 minder 插件 +negative: + - 思维导图功能不是主程序内置,未安装 minder 插件无法新建 `mind` 类型文件 + - 不能在思维导图节点上直接附加 DooTask 任务/评论(节点只是图形元素) + - 节点数量过多(数千节点)可能影响渲染性能 +last_verified: v1.7.90 +--- + +# 思维导图(minder)是什么 + +## 定义 +思维导图是 DooTask 文件系统中的一种文件类型(`type=mind`),用于以放射状结构表达想法、计划、知识结构。它由独立的 minder 插件提供编辑器,主程序通过 iframe 嵌入插件页面,文件内容存到 DooTask 自己的文件库里。 + +## 关键属性 +- **文件类型**:`mind`(区别于 `document` 文本、`drawio` 图表、`word/excel/ppt`) +- **存储位置**:与其他文件一样存在 DooTask 文件系统(个人文件 / 项目文件 / 共享) +- **编辑器**:嵌入的 KityMinder 风格编辑器,支持多种结构(默认、组织结构、文件树、右展开、鱼骨图、天盘)和多套主题 +- **操作支持**:拖拽、缩放、节点折叠/展开、键盘快捷键、导出图片 +- **历史版本**:随 DooTask 文件历史一同保存 + +## 与其他文件类型的关系 +- **vs drawio**:drawio 适合流程图/UML/网络拓扑等任意图形;思维导图专注放射状层级结构,节点编辑更轻 +- **vs 文档(document)**:文档是富文本/Markdown;思维导图是图形化结构 + +## 相关 +- 插件元信息:[[minder.plugin.concept]] +- 创建一张思维导图:[[minder.create.howto]] +- 入口在哪:[[minder.entry.menu-map]] +- 是否支持协作编辑:[[minder.collaboration.concept]] diff --git a/resources/ai-kb/zh/concept/minder/plugin.md b/resources/ai-kb/zh/concept/minder/plugin.md new file mode 100644 index 000000000..581a73d1a --- /dev/null +++ b/resources/ai-kb/zh/concept/minder/plugin.md @@ -0,0 +1,48 @@ +--- +id: minder.plugin.concept +title: minder 插件元信息 +type: concept +feature: minder +scope: admin +locale: zh +aliases: + - minder 插件 + - 思维导图插件 + - 思维导图怎么安装 + - 安装 minder + - minder 插件版本 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 主程序不内置思维导图编辑器,未装插件时新建文件菜单不会显示「思维导图」 + - 插件升级不通过 git pull,需要在应用市场更新 + - 不能离线安装到不联网的环境(需访问应用市场镜像源) +last_verified: v1.7.90 +--- + +# minder 插件元信息 + +## 定义 +思维导图能力由独立插件 `minder` 提供(应用市场 app id 为 `minder`,当前主版本 0.1.3)。主程序通过 iframe 内嵌插件提供的编辑器页面,文件内容仍保存在 DooTask 主库;卸载插件后已有 `mind` 文件无法继续编辑/预览,但文件本身不会被删除。 + +## 关键属性 +- **作者**:DooTask 官方 +- **分类**:微应用(在「应用中心」中列出,作为微应用菜单项;不在管理员应用区) +- **包大小**:约 20MB(安装较慢,请通过应用市场的「安装日志」查看进度) +- **运行形态**:随主程序部署的静态资源 + iframe 嵌入,无独立后端进程 +- **数据存储**:思维导图内容存到 DooTask 主程序文件表(`type=mind`),不在插件容器单独存 +- **触发场景**:用户在文件页「新建 → 思维导图」时由主程序加载插件 iframe + +## 安装与启用 +1. 在应用市场(管理员入口)搜索「Minder」或「思维导图」 +2. 点击安装,等待资源加载(约 20MB) +3. 安装完成后插件自动启用,文件新建菜单立即出现「思维导图」选项 + +## 卸载影响 +- 卸载后菜单消失,原有 `mind` 文件保留在文件库中但无法打开 +- 重新安装后旧文件继续可用 + +## 相关 +- 是什么:[[minder.concept]] +- 入口在哪:[[minder.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/mobile-client/feature-diff.md b/resources/ai-kb/zh/concept/mobile-client/feature-diff.md new file mode 100644 index 000000000..e69b6731e --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-client/feature-diff.md @@ -0,0 +1,73 @@ +--- +id: mobile-client.feature-diff.concept +title: 移动端与桌面端功能差异 +type: concept +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端不能干什么 + - 手机端和桌面端区别 + - 桌面端有哪些移动端没有 + - 移动端功能少 + - 移动端缺什么 + - App 功能限制 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 移动端缺失的复杂功能不会硬塞,大屏复杂操作仍建议在桌面端完成 + - 桌面端独有的能力(截图、全局快捷键、托盘)由原生 OS 集成,移动端无对应概念 + - 微应用 / 插件部分能在移动端打开(走 WebView),但触屏不一定可用 +last_verified: v1.7.90 +--- + +# 移动端与桌面端功能差异 + +## 共有核心功能 +两端都支持: +- 消息(私聊、群聊、@、置顶、撤回) +- 任务(列表、详情、状态、负责人、子任务) +- 项目(成员、视图基本浏览) +- 文件(上传、下载、预览) +- 通知与日程 +- AI 助手(基础对话) + +## 移动端独有 +- 底部 Tabbar 原生导航 +- 系统级推送(UMENG,见 [[mobile-client.notify.concept]]) +- 手势操作(左滑会话项 / 长按消息等,见 [[mobile-client.gesture.concept]]) +- 移动键盘的「发送按钮」配置(切换 Enter 是发送还是换行) +- 二维码扫码 / 调起相机拍摄上传 + +## 桌面端独有 +- 多窗口 / 分屏([[electron-client.window.howto]]) +- 系统托盘 / 后台驻留([[electron-client.tray.concept]]) +- 全局快捷键([[electron-client.shortcut.concept]]) +- 截图工具(自定义快捷键) +- 下载管理器(Cmd/Ctrl + Alt + L) +- 多 Tab 会话切换 +- 本地 MCP 服务(供 AI 调本机) +- 部分微应用的「拖出独立窗口」 + +## 移动端功能弱化 +| 功能 | 桌面端 | 移动端 | +|---|---|---| +| 富文本编辑 | 完整 TinyMCE | 简化版,不支持嵌套表格 / 公式 | +| 白板 / 流程图 / 思维导图 | 可编辑 | 仅可查看 | +| OnlyOffice 文档编辑 | 完整 | 通常仅预览 | +| 视图编辑 | 看板 / 表格 / 甘特图全编辑 | 主要浏览 + 简单状态切换 | +| 项目设置 | 完整 | 关键项可改,复杂配置建议桌面 | +| 报表 / 仪表盘 | 完整图表 + 编辑 | 仅查看 | +| 会议 | 创建 / 主持 / 屏幕共享 | 主要参会,部分高级功能受限 | + +## 选哪端做什么 +- **创建复杂任务 / 编辑长文档** → 桌面端 +- **快速回消息 / 收推送 / 移动审批** → 移动端 +- **正式会议主持** → 桌面端 +- **会议参与 / 听讲** → 移动端均可 + +## 不支持 +- 移动端不可能与桌面端 100% 对齐(小屏交互限制) +- 不支持「移动端开启桌面模式」(无类似切换开关) +- 不保证各 App 版本功能一致:不同版本支持的功能可能略有差异,以最新版为准 diff --git a/resources/ai-kb/zh/concept/mobile-client/gesture.md b/resources/ai-kb/zh/concept/mobile-client/gesture.md new file mode 100644 index 000000000..3eaf1af10 --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-client/gesture.md @@ -0,0 +1,65 @@ +--- +id: mobile-client.gesture.concept +title: 移动端手势操作 +type: concept +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端手势 + - 手势操作 + - 长按 + - 滑动 + - 下拉刷新 + - 上拉加载 + - 侧滑返回 + - 手机怎么操作 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不支持自定义手势(无「手势绑定动作」设置) + - 不支持 3D Touch / Force Touch(iPhone XS 之后机型已弱化) + - 网页端没有这些手势,只在 App 里有 +last_verified: v1.7.90 +--- + +# 移动端手势操作 + +## 通用手势 + +| 手势 | 触发位置 | 行为 | +|---|---|---| +| 点击 | 任意可交互元素 | 打开 / 选中 | +| 长按 | 消息气泡 | 弹出操作菜单(复制、撤回、转发、回复、翻译等) | +| 长按 | 任务卡片 | 弹出快捷操作(完成、归档、更多) | +| 双击 | 消息气泡 | 部分版本支持快速点赞 | +| 下拉 | 列表顶部 | 刷新 | +| 上拉 | 列表底部 | 加载更多 | +| 左滑 | 会话列表项 | 出现「置顶 / 免打扰 / 删除」按钮 | +| 左滑 | 任务列表项 | 出现「归档 / 删除」按钮 | +| 右滑 | 屏幕左边缘 | 返回上一页(iOS / 部分 Android) | +| 双指捏合 | 图片预览 / 文件 | 缩放 | + +## 消息相关 +- **长按消息**:复制 / 撤回(2 分钟内) / 转发 / 回复 / @TA / 翻译 / 收藏 / 删除 +- **左划聊天列表**:置顶 / 免打扰 / 删除会话 +- **下拉聊天页**:加载历史消息 + +## 任务相关 +- **长按任务卡片**:快速完成 / 修改优先级 / 转交 +- **左划任务列表项**:归档 / 删除 + +## 文件 / 图片预览 +- 双指捏合:缩放 +- 单指拖动:平移(放大状态下) +- 双击:回正 / 放大 + +## 全局返回 +- iOS:屏幕左边缘右滑返回上一页(系统手势,所有页面通用) +- Android:用底部导航的「返回键」或手势系统的「侧边返回」 + +## 不支持 +- 不支持自定义手势绑定动作(列表里的手势是固定的) +- 不支持手势穿透到底层(模态弹窗强制拦截手势) +- 不支持桌面端的全局快捷键 / 截图,详见 [[electron-client.shortcut.concept]] diff --git a/resources/ai-kb/zh/concept/mobile-client/notify.md b/resources/ai-kb/zh/concept/mobile-client/notify.md new file mode 100644 index 000000000..0a184ac47 --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-client/notify.md @@ -0,0 +1,67 @@ +--- +id: mobile-client.notify.concept +title: 移动端推送通知 +type: concept +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端推送 + - 手机推送 + - App 通知 + - UMENG 推送 + - 友盟推送 + - 收不到手机通知 + - 锁屏推送 + - 后台推送 +related_tools: [] +related_pages: [] +prerequisites: + - 已登录过 App 且设备别名已注册到友盟 +negative: + - 推送通道走 UMENG(友盟),需服务端配置 AppKey / Master Secret,自部署默认未开启 + - 国内 Android 推送依赖各厂商通道(华为 / 小米 / OPPO / vivo / 魅族),后台杀进程后到达率与设备绑定 + - 推送内容受隐私设置影响:锁屏隐藏详情时只显示「您有一条新消息」 +last_verified: v1.7.90 +--- + +# 移动端推送通知 + +## 定义 +移动端推送通知是 DooTask 服务端通过 UMENG(友盟)推送平台向已登录设备投递的消息提醒,即使 App 处于后台 / 锁屏 / 杀进程也能到达(取决于厂商通道)。区别于桌面端原生通知([[electron-client.notify.concept]]),属于完全不同的通道。 + +## 推送通道架构 +- 用户登录后 App 调 `/api/users/umeng/alias` 把设备 token 与用户 ID 绑定 +- 服务端在 `WebSocketDialogMsgTask` 中向离线 / 后台用户额外发起 UMENG 推送 +- UMENG 把推送下发到 APNs(iOS)或各厂商通道(Android),最终弹到设备 + +## 触发推送的事件 +- 新私聊 / 群聊消息 +- @ 你的消息 +- 任务相关:被分配、被 @、状态变更、任务即将超时 / 已超时定时提醒(由 task-alert「任务提醒」机器人私聊发送,详见 [[task.notify.concept]]) +- 项目重要变更 +- 系统公告 / 管理员推送 + +## 收不到推送的原因(排序) +1. **服务端未配置 UMENG**:自部署版本默认未填 AppKey,推送整体不可用 +2. **App 未授权通知**:手机系统设置 → 「通知」→「DooTask」必须打开「允许通知」 +3. **后台被系统杀死**:Android 厂商电池优化会把 App 列入限制,导致离线推送无法激活 +4. **应用内免打扰**:DooTask 个人设置或单会话开了免打扰 +5. **网络问题**:UMENG 服务器与手机的连接断开 + +## 提高到达率(Android) +- 「电池」→ 把 DooTask 加入「不限制 / 后台运行白名单」 +- 「自启动管理」→ 允许 DooTask 自启动 +- 「电池优化」→ 把 DooTask 设为「不优化」 +- 部分品牌(华为)需在「应用启动管理」里手动启用所有开关 + +## 推送内容显示 +- 通常显示「发送人 + 消息预览」 +- 锁屏隐藏详情或群聊不显示发送人,可在系统通知设置调整 +- 详情显示策略以服务端推送结构为准,App 不能单独配置 + +## 不支持 +- 不支持脱离 UMENG 的 P2P 推送(架构上依赖) +- 不支持「按场景拆开关」(只能整体开 / 关) +- 见到推送但点开 App 没新消息,通常是 WebSocket 已经在线时推送延迟 +- 详细收不到处理见 [[mobile-client.push-fail.faq]] diff --git a/resources/ai-kb/zh/concept/mobile-client/offline.md b/resources/ai-kb/zh/concept/mobile-client/offline.md new file mode 100644 index 000000000..d64e71850 --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-client/offline.md @@ -0,0 +1,62 @@ +--- +id: mobile-client.offline.concept +title: 移动端离线行为 +type: concept +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 离线 + - 没网 + - 弱网 + - 断网 + - 离线能用吗 + - 离线消息 + - 移动端离线 + - 收不到消息怎么办 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不支持「完全离线编辑后联网同步」(不是离线优先架构) + - 离线时新发消息不会本地排队稍后投递,会直接报失败需用户重试 + - 离线下文件不能预览(下载完成的文件可在系统文件管理器看) +last_verified: v1.7.90 +--- + +# 移动端离线行为 + +## 定义 +「离线」在 DooTask 移动端指设备无网络 / 网络不可达 DooTask 服务器的状态。App 不是离线优先架构(本地无完整数据副本),所以离线能力很有限。 + +## 离线下能做什么 +- **查看已加载的消息**:聊天页打开过的最近消息会缓存,可滚动查看(不能加载更早历史) +- **查看任务列表的缓存**:最近访问的任务列表标题、状态可能仍能看到 +- **预览已下载的文件**:之前点开下载到本地的文件能继续看 +- **写消息草稿**:输入框打的字会保留,但发送会失败 + +## 离线下不能做什么 +- 新建任务 / 项目 +- 发送消息(界面会提示发送失败 / 红色感叹号) +- 加载会话历史 / 任务详情 +- 预览未下载过的文件 +- 接收新消息 / 推送 + +## 网络恢复后 +- **WebSocket 自动重连**:App 检测到网络回来后会尝试重连 +- **新消息补拉**:成功重连后会拉取断网期间的新消息 +- **发送失败的消息**:不会自动重发,用户需手动点重试 + +## 离线推送 +即使设备完全离线,服务端仍会通过 UMENG 通道下发推送([[mobile-client.notify.concept]]),iOS 设备会在恢复网络后由 APNs 投递。Android 则取决于厂商通道是否能在弱网下唤醒。 + +## 弱网体验优化 +- App 会自动重试关键请求(消息发送) +- 切换 WiFi / 4G 时会重新握手 WebSocket +- 后台切回前台会触发会话列表刷新 + +## 不支持 +- 不支持完整离线模式(无本地完整数据库) +- 不支持离线后联网自动重发已失败的消息 +- 不支持离线编辑任务详情(必须在线) +- 不是离线优先产品:与某些离线优先的笔记类 App 不同,DooTask 设计以联网为前提 diff --git a/resources/ai-kb/zh/concept/mobile-client/overview.md b/resources/ai-kb/zh/concept/mobile-client/overview.md new file mode 100644 index 000000000..b13b2c79b --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-client/overview.md @@ -0,0 +1,56 @@ +--- +id: mobile-client.concept +title: 移动端是什么 +type: concept +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端 + - 手机端 + - App + - 手机版 + - 移动版 + - 手机怎么用 + - iOS 客户端 + - 安卓客户端 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 移动端不是网页直接套壳,是基于 EEUI 框架的原生混合 App + - 移动端不支持桌面端的全局快捷键 / 截图工具 / 多窗口 + - 移动端不能改服务器地址(首次登录设置后存住,需重置才能切换) +last_verified: v1.7.90 +--- + +# 移动端是什么 + +## 定义 +DooTask 移动端是 iOS 与 Android 双平台的原生 App,基于 EEUI 框架开发,内置 WebView 渲染部分页面、原生组件实现导航 / 弹窗 / 推送。用户代理(UA)包含 `eeui` 标识,服务端据此识别请求来自 App。 + +## 关键属性 +- **跨平台**:iOS 与 Android 各有独立安装包 +- **数据互通**:与网页端、桌面端共用同一份后端 API 和账号 +- **原生体验**:底部 Tabbar、原生手势、原生输入法、原生推送 +- **小巧专注**:核心是消息 + 任务 + 通知,功能集合比桌面端轻量 + +## 与桌面 / 网页端的差异 +- 导航形态:移动端用底部 Tabbar(消息 / 任务 / 应用 / 我的),桌面端用左侧栏 +- 输入习惯:发送按钮 / 换行按钮在移动端可切换(键盘上的「发送」是发还是换行) +- 推送通道:走 UMENG 系统推送([[mobile-client.notify.concept]]),不是 WebSocket 自送 +- 富文本编辑器在小屏上做了简化 + +## 设备识别 +- 前端通过 UA `/eeui/i` 检测 `$isEEUIApp`,据此走移动端专属逻辑 +- 服务端调用别名注册接口(`/api/users/umeng/alias`)记录该设备 ID,用于推送路由 + +## 何时选移动端 +- 出差 / 通勤时收消息和处理任务 +- 配合桌面端使用,做「随身确认」型操作 +- 需要原生推送即时到达 + +## 不支持 +- 不支持复杂富文本编辑(超长公式、表格嵌套) +- 不支持白板、流程图、思维导图等画布类应用的编辑模式 +- 不支持桌面端的截图工具 / 多窗口 diff --git a/resources/ai-kb/zh/concept/mobile-notify/overview.md b/resources/ai-kb/zh/concept/mobile-notify/overview.md new file mode 100644 index 000000000..959650cc0 --- /dev/null +++ b/resources/ai-kb/zh/concept/mobile-notify/overview.md @@ -0,0 +1,52 @@ +--- +id: mobile-notify.concept +title: 移动端通知是什么 +type: concept +feature: mobile-notify +scope: end-user +locale: zh +aliases: + - 移动端通知 + - 手机通知 + - iOS 通知 + - Android 通知 + - APP 通知 + - 移动端推送 +related_tools: [] +related_pages: [] +prerequisites: + - 已下载并登录 DooTask 移动端 APP(iOS / Android) +negative: + - 移动端通知由两部分组成:离线友盟推送 + 前台 APP 内浮层;二者不能任选其一 + - 未授予系统通知权限时,连前台浮层通知都不显示(依赖 setVibrate 系统调用会被拒) + - DooTask 不内嵌任何「不推送某类消息」的细粒度开关,免打扰只能按会话或时段 +last_verified: v1.7.90 +--- + +# 移动端通知是什么 + +## 定义 +移动端通知是 DooTask iOS / Android APP 收到新消息的两种提醒形式:APP 在后台或被关闭时通过友盟下发系统通知栏推送([[push-notice.concept]]),APP 在前台运行时则在屏幕顶部展示一段浮层通知。 + +## 两种形态 +| 形态 | 触发场景 | 实现 | +|---|---|---| +| 系统通知栏推送 | APP 后台 / 退出 / 锁屏 | 友盟 UMENG 通道,详见 [[push-notice.concept]] | +| APP 内浮层 | APP 前台运行 + 不在该会话 | `MobileNotification` 组件,屏幕顶部下拉横幅,点击进入会话 | + +## APP 内浮层属性 +- 显示头像 + 发送者昵称 + 消息摘要 +- 默认显示 6 秒后自动收起;可手动下拉关闭 +- 同时调用原生 `setVibrate` 触发短振动 +- 点击会话直接打开 + +## 与桌面端通知的区别 +- 移动端有「APP 后台 → 系统推送」(友盟),桌面端没有 +- 桌面端通知可在通知里直接快速回复,移动端浮层不支持快捷回复 +- 移动端推送会触发振动 + 角标,桌面端只闪烁/角标,不振动 + +## 相关 +- 友盟通道与别名机制:[[push-notice.alias.concept]] +- 触发条件细节:[[push-notice.scenarios.concept]] +- 系统通知权限:[[mobile-notify.permission.faq]] +- 关闭单个会话的免打扰:[[push-notice.silent.howto]] diff --git a/resources/ai-kb/zh/concept/office/collaboration.md b/resources/ai-kb/zh/concept/office/collaboration.md new file mode 100644 index 000000000..88f3ee1ab --- /dev/null +++ b/resources/ai-kb/zh/concept/office/collaboration.md @@ -0,0 +1,56 @@ +--- +id: office.collaboration.concept +title: OnlyOffice 多人协作编辑 +type: concept +feature: office +scope: end-user +locale: zh +aliases: + - office 协作 + - Word 一起编辑 + - 多人同时编辑文档 + - 在线协作 Excel + - 协同编辑 PPT + - OnlyOffice 协作 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 office(OnlyOffice)插件 + - 协作各方对该文件均有「编辑」权限 +negative: + - 与 minder([[minder.collaboration.concept]])和 drawio 不同,OnlyOffice 才提供真正的多人实时编辑 + - 同一文件大规模并发(数十人)依赖 Document Server 资源,组织内建议 ≤ 10 人同时改 + - 离线编辑不支持,没有「断网继续编辑、上线合并」的模式 +last_verified: v1.7.90 +--- + +# OnlyOffice 多人协作编辑 + +## 定义 +DooTask 在线 Word/Excel/PPT(office 插件)原生支持**多人实时协作编辑**。多人同时打开同一文件时,OnlyOffice Document Server 通过 WebSocket 推送他人光标和实时改动,最终内容由 Document Server 合并后回写到 DooTask 文件库,不存在「后保存覆盖前保存」的问题。 + +## 关键属性 +- **会话识别**:主程序用 `documentKey` 标识同一份文档的协作会话,所有人加入同一 key 即进入同一编辑会话 +- **实时光标**:能看到其他人当前在哪个段落/单元格,配色按用户区分 +- **冲突处理**:编辑级别合并(不是文件级覆盖),单元格/字符级冲突由 OnlyOffice 自动协商 +- **保存触发**:所有人都离开编辑器后由 Document Server 把最终版本写回 DooTask 文件表 +- **历史版本**:随 DooTask 文件版本保留,可回溯 + +## 编辑模式 +OnlyOffice 提供两种协作模式: +- **快速模式**:所有改动实时显示给所有人(默认) +- **严格模式**:自己的改动暂存,需手动点「保存」才同步给他人——适合需要审稿的场景,在 OnlyOffice 编辑器内切换 + +## 权限组合 +- A、B 同为编辑权限:均可实时改 +- A 编辑、B 只读:B 仅看,无法输入 +- A 关闭、B 仍开着:B 单人继续,A 再打开时进入同一会话 + +## 与其他文件类型的对比 +- **vs DooTask 内置 document**:document 是富文本/Markdown 编辑器,**不支持**多人实时 +- **vs minder 思维导图**:思维导图是单人编辑,多人同时保存会覆盖 +- **vs drawio 流程图**:同样是单人编辑,多人同时保存会覆盖 + +## 相关 +- 是什么:[[office.concept]] +- 插件元信息:[[office.plugin.concept]] diff --git a/resources/ai-kb/zh/concept/office/overview.md b/resources/ai-kb/zh/concept/office/overview.md new file mode 100644 index 000000000..cb29aea39 --- /dev/null +++ b/resources/ai-kb/zh/concept/office/overview.md @@ -0,0 +1,48 @@ +--- +id: office.concept +title: 在线文档(OnlyOffice)是什么 +type: concept +feature: office +scope: end-user +locale: zh +aliases: + - 在线文档 + - 在线 Word + - 在线 Excel + - 在线 PPT + - OnlyOffice + - office 编辑 + - 怎么在线编辑 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 office(OnlyOffice)插件 +negative: + - 在线编辑能力不是主程序内置,未装 OnlyOffice 插件时打开 Word/Excel/PPT 只能调 fileview 预览(详见 [[fileview.concept]]),不能编辑 + - 单文档大小过大(数十 MB 起)打开很慢,建议拆分 + - 不支持把 docx 直接转成 DooTask 自带的 `document` 文件类型 +last_verified: v1.7.90 +--- + +# 在线文档(OnlyOffice)是什么 + +## 定义 +DooTask 通过 OnlyOffice 插件提供 Word/Excel/PowerPoint 文件的**在线编辑与多人实时协作**。文件存在 DooTask 文件系统(文件类型分别为 `word`/`excel`/`ppt`),编辑器以 iframe 形式嵌入 OnlyOffice Document Server 提供的页面,多人同时打开同一文件时能看到他人光标和实时改动。 + +## 关键属性 +- **文件类型**:`word`(doc/docx/dot/dotx/odt/ott/rtf)、`excel`(xls/xlsx/xlsm/xlt/xltx/ods/ots/csv/tsv)、`ppt`(ppt/pptx/pps/ppsx/pot/potx/odp/otp) +- **存储位置**:DooTask 文件系统(个人文件 / 项目文件 / 共享) +- **编辑能力**:直接在浏览器编辑文档,与桌面端 Office 体验接近 +- **实时协作**:多人同时打开会自动建立协作会话,详见 [[office.collaboration.concept]] +- **历史版本**:随 DooTask 文件历史一同保存 + +## 与其他文件类型的关系 +- **vs document(Markdown/富文本)**:DooTask 自带的 `document` 文件是轻量富文本,无法编辑真正的 docx 二进制 +- **vs fileview 预览**:fileview 提供只读的多格式文件预览(包括 office 文件),不能编辑 +- **vs minder / drawio**:那些是图形文件,无法用 OnlyOffice 打开 + +## 相关 +- 插件元信息:[[office.plugin.concept]] +- 创建在线文档:[[office.create.howto]] +- 多人协作能力:[[office.collaboration.concept]] +- 入口在哪:[[office.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/office/plugin.md b/resources/ai-kb/zh/concept/office/plugin.md new file mode 100644 index 000000000..cfcaf18b7 --- /dev/null +++ b/resources/ai-kb/zh/concept/office/plugin.md @@ -0,0 +1,54 @@ +--- +id: office.plugin.concept +title: OnlyOffice 插件元信息 +type: concept +feature: office +scope: admin +locale: zh +aliases: + - OnlyOffice 插件 + - office 插件 + - 安装 OnlyOffice + - 安装在线文档 + - onlyoffice 版本 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 主程序不内置 docx/xlsx/pptx 在线编辑,未装插件时双击 Word/Excel/PPT 只能调 fileview 预览 + - 插件体积约 1.3GB,下载较慢,需要稳定网络与充足磁盘 + - 不能离线安装到不联网的环境(需访问应用市场镜像源) +last_verified: v1.7.90 +--- + +# OnlyOffice 插件元信息 + +## 定义 +在线 Word/Excel/PPT 编辑由 `office` 插件提供(应用市场 app id 为 `office`,包名 OnlyOffice,当前主版本 9.4.0)。插件包含 OnlyOffice Document Server 完整容器;主程序通过 iframe 嵌入 Document Server 的编辑器页面,借助 OnlyOffice 内置 WebSocket 实现多人实时协作。 + +## 关键属性 +- **作者**:社区维护(Community),上游 https://www.onlyoffice.com/ +- **分类**:微应用(不在管理员应用区) +- **包大小**:约 1.3GB(含 Document Server,下载慢,按「安装日志」判断进度) +- **运行形态**:独立 Docker 容器(OnlyOffice Document Server) +- **数据存储**:编辑结果由 OnlyOffice 回写到 DooTask 文件表,文件本体存到主程序的文件系统,不在 Document Server 长期持久化 +- **协议**:内部通过 JWT 令牌与 OnlyOffice 通信,主程序签发 documentKey 标识文件版本 + +## 安装与启用 +1. 在应用市场(管理员入口)搜索「OnlyOffice」或「在线文档」 +2. 点击安装,等待镜像下载(约 1.3GB,请通过「安装日志」查看进度) +3. 安装完成后插件自动启用,文件新建菜单立即出现「Word / Excel / PPT」选项 +4. 上传/打开已有 docx/xlsx/pptx 文件即可在线编辑 + +## 卸载影响 +- 卸载后文件库中的 Word/Excel/PPT 文件保留,但无法在线编辑,回退到 fileview 预览(若未装 fileview 则无法预览) +- 重装后所有文件自动恢复在线编辑能力 + +## 已知限制 +- 部署在公网时建议为 Document Server 配置 HTTPS,否则浏览器可能拦截 WebSocket +- 同一文件大量并发协作(数十人)需要更强的 Document Server 资源 + +## 相关 +- 是什么:[[office.concept]] +- 多人协作机制:[[office.collaboration.concept]] +- 入口在哪:[[office.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/okr/cycle.md b/resources/ai-kb/zh/concept/okr/cycle.md new file mode 100644 index 000000000..979476a17 --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/cycle.md @@ -0,0 +1,57 @@ +--- +id: okr.cycle.concept +title: OKR 周期 +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 周期 + - 季度 OKR + - Q1 Q2 Q3 Q4 + - OKR 时间段 + - OKR 多久一轮 + - 年度 OKR +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 +negative: + - OKR 周期非全平台统一,由公司 / 团队按内部约定决定 + - 周期内频繁改 O 会降低聚焦度,不建议中途大改 +last_verified: v1.7.90 +--- + +# OKR 周期 + +## 定义 +OKR 周期是一组 OKR 的有效时间盒。每个周期内设定一批 O 与 KR,周期末统一评审打分,下一周期重新设定。常见的周期长度有季度(Q1/Q2/Q3/Q4)和年度,部分团队也会用半年或月度。 + +## 常见周期模式 +- **季度 OKR**:每 3 个月一轮,最主流,节奏适中 +- **年度 OKR**:通常承载战略级目标,跨度大、调整少 +- **半年 / 双月**:折中节奏,按业务变化速度选 +- **公司 / 团队 / 个人多层周期**:上层周期可以更长,下层周期更短 + +## 周期内三个阶段 +1. **设定期**:周期开始前 1-2 周写 O 和 KR,与上下级对齐 +2. **执行期**:周期内推进,按节奏更新进度(参见 [[okr.update-progress.howto]]) +3. **评审期**:周期末打分复盘(参见 [[okr.review.howto]]) + +## 在 DooTask OKR 插件中的体现 +- 创建 OKR 时需指定所属周期 +- 「我的 OKR」、「OKR 结果」按周期筛选展示 +- 历史周期数据保留,可回看复盘 + +## 周期切换注意 +- 周期未结束前不要急着开新周期 OKR +- 评审完成后再开下一周期,避免新旧周期混淆 +- 跨周期延续的目标可在新周期重新写一遍,不要简单复制 + +## 不支持 +- 周期粒度由团队约定,OKR 插件不强制规定季度还是年度 +- 周期内频繁改 O 内容会影响聚焦,不推荐 + +## 相关 +- OKR 总览:[[okr.concept]] +- 评审打分:[[okr.review.howto]] diff --git a/resources/ai-kb/zh/concept/okr/kr.md b/resources/ai-kb/zh/concept/okr/kr.md new file mode 100644 index 000000000..68d776e27 --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/kr.md @@ -0,0 +1,59 @@ +--- +id: okr.kr.concept +title: Key Result(KR,关键结果)是什么 +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - KR + - Key Result + - 关键结果 + - OKR 的 KR + - 怎么写 KR + - KR 怎么量化 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 +negative: + - KR 必须可量化(数字 / 完成度 / 状态),不能写成模糊描述 + - 单个 O 的 KR 数量建议 2-5 个,不宜过多 +last_verified: v1.7.90 +--- + +# Key Result(KR,关键结果)是什么 + +## 定义 +Key Result(缩写 KR)是 OKR 方法论中衡量 Objective 是否达成的「关键结果」。KR 必须可量化(带数字 / 完成度 / 是否完成的二值状态),周期内可以更新进度,周期末给出 0-100% 的最终得分。 + +## 关键属性 +- **可量化**:必须能用数字、百分比、完成状态来衡量 +- **结果导向**:描述达成的结果,而不是过程动作 +- **可追踪**:周期内可以定期更新当前进度 +- **挑战性**:好的 KR 让人觉得「拼一拼能到 70%」,而不是稳拿 100% + +## 好 KR 的写法 +- 量化模板:动词 + 指标 + 当前值→目标值 + 时限 +- 例:「将新用户首日留存率从 35% 提升到 50%」 +- 例:「完成 3 场行业大会的 keynote 分享」 +- 例:「上线 v2.0 并通过验收」 + +## 反例 +- 「提升满意度」——没数字,无法判断是否达成 +- 「努力做好客户支持」——描述态度而非结果 +- 「写 50 篇日报」——是过程指标,不是结果 + +## 进度与打分 +- 周期内:把 KR 的当前实际值更新进系统,得到 0-100% 进度 +- 周期末:根据最终值给 KR 打分(参见 [[okr.review.howto]]) +- 一个 O 的总分常按 KR 加权平均得出 + +## 与 O 的关系 +- KR 是 O 的衡量手段;没有 O 的 KR 是孤立指标 +- 一个 O 的所有 KR 全部达成 ≈ O 达成;多数达成可视为部分达成 + +## 相关 +- O 的概念:[[okr.objective.concept]] +- 更新进度:[[okr.update-progress.howto]] +- 周期评审:[[okr.review.howto]] diff --git a/resources/ai-kb/zh/concept/okr/objective.md b/resources/ai-kb/zh/concept/okr/objective.md new file mode 100644 index 000000000..9298a7c05 --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/objective.md @@ -0,0 +1,58 @@ +--- +id: okr.objective.concept +title: Objective(O,目标)是什么 +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - O 是什么 + - Objective + - 目标 + - OKR 的 O + - 怎么写 O + - 目标怎么定 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 +negative: + - O 本身不携带数字指标,量化交给 KR + - 一个 O 不建议拆出超过 5 个 KR,否则失焦 +last_verified: v1.7.90 +--- + +# Objective(O,目标)是什么 + +## 定义 +Objective(缩写 O)是 OKR 方法论中的「目标」,一句话回答「我们这个周期想达成什么」。O 是定性的、激励性的方向描述,本身不带具体数字,量化由 KR 承担。 + +## 关键属性 +- **定性**:用语言描述方向,不直接写百分比 / 数量 +- **聚焦**:单个用户或团队每周期通常只设 3-5 个 O +- **激励性**:鼓励挑战性目标,能让团队达到 60-70% 就算成功 +- **可记忆**:一句话能讲清楚,不堆砌定语 + +## 好 O 的特征 +- 短:一句话讲完 +- 有方向感:表达「往哪里走」 +- 与战略对齐:能回答「为什么做这件事」 +- 时间盒匹配周期:在一个周期(季度 / 年度)内能产出结果 + +## 反例 +- 「提升用户满意度 20%」——这是 KR,不是 O(O 不带数字) +- 「做完所有任务」——太空,没有方向 +- 「研发一个新功能」——粒度太细,更像任务 + +## 与 KR 的关系 +- 一个 O 配 2-5 个 KR(详见 [[okr.kr.concept]]) +- O 描述目的,KR 描述衡量;分别承担定性与定量 +- 没有 KR 的 O 是空话;没有 O 的 KR 是孤立指标 + +## 与团队结构的关系 +- 个人 O、团队 O、公司 O 可以分层对齐 +- 上下级对齐方式见 [[okr.align.howto]] + +## 相关 +- 怎么创建:[[okr.create.howto]] +- 周期:[[okr.cycle.concept]] diff --git a/resources/ai-kb/zh/concept/okr/overview.md b/resources/ai-kb/zh/concept/okr/overview.md new file mode 100644 index 000000000..7171445f9 --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/overview.md @@ -0,0 +1,56 @@ +--- +id: okr.concept +title: OKR 是什么 +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - OKR + - OKR 是什么 + - 目标管理 + - Objectives and Key Results + - 目标与关键结果 + - OKR 怎么用 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 +negative: + - OKR 不是 KPI,不直接与绩效或薪酬挂钩 + - DooTask 主程序不内置 OKR,必须装 okr 插件才能用 +last_verified: v1.7.90 +--- + +# OKR 是什么 + +## 定义 +OKR(Objectives and Key Results,目标与关键结果)是一种目标管理方法,将「想做成什么」(Objective,O)和「怎么衡量做成了」(Key Result,KR)分开。一个 O 拆成 2-5 个可量化的 KR,周期内逐项更新进度,周期末统一打分复盘。 + +## 在 DooTask 中的形态 +OKR 在 DooTask 中以独立插件形式提供(appstore 应用 id:`okr`),不是主程序内置功能。插件提供: + +- 目标设定与分解(O + KR) +- 关键成果跟踪(KR 进度) +- 进度实时更新 +- 团队协作与反馈 +- 数据可视化展示(管理员可看 OKR 结果分析) + +## 关键概念 +- **O(Objective)**:定性的目标,回答「想达成什么」,详见 [[okr.objective.concept]] +- **KR(Key Result)**:可量化的关键结果,回答「如何衡量达成」,详见 [[okr.kr.concept]] +- **周期(Cycle)**:OKR 通常按季度或年度运行,详见 [[okr.cycle.concept]] +- **对齐(Alignment)**:个人 / 团队 OKR 关联到上级 OKR,详见 [[okr.align.howto]] + +## OKR 与 KPI 的区别 +- **KPI**:直接考核指标,与绩效 / 薪酬绑定,偏重「不能丢分」 +- **OKR**:目标管理工具,鼓励挑战性目标(70% 完成度即合格),与考核解耦 + +## 适用场景 +- 团队希望聚焦少数关键目标 +- 跨部门需要对齐战略方向 +- 季度 / 年度滚动复盘 + +## 相关 +- 入口在哪:[[okr.entry.menu-map]] +- 怎么创建:[[okr.create.howto]] diff --git a/resources/ai-kb/zh/concept/okr/plugin.md b/resources/ai-kb/zh/concept/okr/plugin.md new file mode 100644 index 000000000..0db522dfc --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/plugin.md @@ -0,0 +1,52 @@ +--- +id: okr.plugin.concept +title: OKR 插件元信息 +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 插件 + - OKR 是不是要装 + - okr 应用 + - OKR 装多大 + - OKR 怎么安装 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - OKR 不是主程序内置功能,未装插件时不可用 + - 插件升级不通过 git pull,需要在应用市场更新 +last_verified: v1.7.90 +--- + +# OKR 插件元信息 + +## 定义 +OKR 在 DooTask 中由独立插件 `okr` 提供(应用市场 app id 为 `okr`,当前主版本 0.5.8)。主程序不内置 OKR 任何代码,所有目标管理逻辑都跑在独立容器里,通过 nginx 反向代理 `/apps/okr/` 路径挂载到 DooTask 界面。 + +## 关键属性 +- **作者**:DooTask 官方 +- **包大小**:约 15MB(安装较慢,请通过安装日志查看进度) +- **运行形态**:独立 Docker 容器(镜像 `kuaifan/doookr`),通过环境变量复用主程序的数据库 +- **菜单注入**:安装后自动在「应用中心」注册两个入口(OKR 管理 + OKR 结果) +- **数据存储**:与主程序共享同一个 MySQL/MariaDB 实例(独立表前缀由插件管理) +- **要求**:主程序版本 > 1.1.66 + +## 安装与启用 +1. 应用市场搜索「OKR」或「目标管理」 +2. 点击安装,等待镜像拉取与容器启动 +3. 安装完成后插件自动启用,菜单立即出现,无需重启主程序 +4. 默认配置适配大多数场景,可在插件设置中按需调整 + +## 升级与卸载 +- 升级:应用市场看到新版本时点击「更新」 +- 卸载:应用市场对应插件 →「卸载」;卸载后菜单消失,业务数据保留在数据库中 + +## 不支持 +- 不能离线安装到不联网的环境(需访问应用市场镜像源) +- 不能选择安装到非 Docker 部署的 DooTask(插件依赖容器化) + +## 相关 +- 看不到 / 装不上:[[okr.cannot-install.faq]] +- 入口在哪:[[okr.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/okr/team.md b/resources/ai-kb/zh/concept/okr/team.md new file mode 100644 index 000000000..e5fd2b5cc --- /dev/null +++ b/resources/ai-kb/zh/concept/okr/team.md @@ -0,0 +1,62 @@ +--- +id: okr.team.concept +title: 团队 OKR 与个人 OKR +type: concept +feature: okr +scope: end-user +locale: zh +aliases: + - 团队 OKR + - 个人 OKR + - 部门 OKR + - 公司 OKR + - OKR 层级 + - OKR 分层 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 +negative: + - 团队 OKR 不是个人 OKR 的简单加和 + - 个人 OKR 不必把团队 KR 完全分担,可基于职责选择关联 +last_verified: v1.7.90 +--- + +# 团队 OKR 与个人 OKR + +## 定义 +OKR 按主体层级可分为公司 OKR、团队(部门)OKR、个人 OKR。各层级各有 O 和 KR,通过「对齐」建立因果关联,形成自上而下的目标树。 + +## 三个层级的差异 +- **公司 OKR**:跨部门的战略级方向,周期通常更长(年度),数量少(3-5 个 O) +- **团队 OKR**:部门 / 小组负责的目标,承接公司 O,周期常用季度 +- **个人 OKR**:成员自己的工作目标,承接所在团队 OKR,颗粒度最细 + +## 谁负责 +- **公司 OKR**:CEO / 高管层 +- **团队 OKR**:团队 leader 牵头,团队共同认领 +- **个人 OKR**:成员本人;直属上级辅助审阅 + +## 对齐路径 +- 个人 OKR → 团队 OKR → 公司 OKR,形成可追溯链路 +- 同一团队的多个个人 OKR 可分别承接团队不同 KR +- 详细操作见 [[okr.align.howto]] + +## 团队 OKR 的特征 +- 团队 KR 数量通常 3-5 个 +- 团队 KR 由若干成员合力完成,但应明确「主负责人」 +- 团队 KR 进度通常由 leader 汇总更新 + +## 个人 OKR 的特征 +- 个人 O 不必覆盖所有日常工作,只挑这个周期最重要的方向 +- 个人 KR 与所在岗位职责高度相关 +- 数量通常 2-4 个 O + +## 不支持 +- 团队 OKR 不会自动汇总所有个人 OKR 的进度 +- 一个个人不属于两个团队时,需自行决定主对齐方向 + +## 相关 +- 对齐:[[okr.align.howto]] +- OKR 概念:[[okr.concept]] +- 周期:[[okr.cycle.concept]] diff --git a/resources/ai-kb/zh/concept/org-department/deputy.md b/resources/ai-kb/zh/concept/org-department/deputy.md new file mode 100644 index 000000000..a5030a2b8 --- /dev/null +++ b/resources/ai-kb/zh/concept/org-department/deputy.md @@ -0,0 +1,52 @@ +--- +id: org-department.deputy.concept +title: 部门负责人与部门管理员 +type: concept +feature: org-department +scope: end-user +locale: zh +aliases: + - 部门负责人 + - 部门管理员 + - deputy + - 部门负责人是谁 + - 部门负责人能干嘛 + - 主管 + - 部门主管 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 一个部门只能有 1 个部门负责人(owner_userid),不能空 + - 部门负责人不能同时是自己部门的部门管理员(接口会拦截) + - 部门管理员不能罢免自己(只有系统管理员能罢免) + - 部门负责人/管理员不等于系统管理员(userIsAdmin),不能进系统设置 + - 罢免部门管理员会同步把他从该部门移除并退出部门群 +last_verified: v1.7.90 +--- + +# 部门负责人与部门管理员 + +## 定义 +部门里有两种"领导"角色,权限近似但有差别: + +- **部门负责人(owner)**:每个部门唯一,存在部门表的 `owner_userid` 字段;自动成为部门群群主(role=1) +- **部门管理员(deputy)**:每个部门可多人,存在 `user_department_owners` 表;在部门群里 role=2 + +两者在前端常合称"部门负责人",在 RAG 检索中"deputy = 部门管理员"。 + +## 关键属性 +- 任命/罢免接口分别为 `department__adddeputy` / `department__deldeputy`,仅系统管理员可调用 +- 任命部门管理员会自动把该用户加入部门(写入 `users.department`)并加入部门群(important=true 不可被普通群操作打散) +- 部门负责人是 owner_userid 字段的唯一持有人;变更走 `department__add`(传 id + 新 owner_userid 即编辑) + +## 能做什么 +开启系统设置「部门负责人视角」后: +- 只读查看本部门及所有下级部门成员参与的**项目**与**任务** +- 不能修改项目设置、任务、成员 +- 通过右上角头像菜单切换到「负责人视角」选择部门,见 [[org-department.deputy-view.howto]] +- 「项目级开关」:每个项目可单独关闭"部门负责人视角可见"(`projects.department_owner_view`) + +## 与其他概念的关系 +- 与系统管理员:互不重叠;系统管理员有进入团队管理的权限,部门负责人仅有查看下属数据的只读视角 +- 与项目负责人:不冲突;同一用户可在 A 部门做负责人 + 在 B 项目做负责人 diff --git a/resources/ai-kb/zh/concept/org-department/overview.md b/resources/ai-kb/zh/concept/org-department/overview.md new file mode 100644 index 000000000..d424d4ba0 --- /dev/null +++ b/resources/ai-kb/zh/concept/org-department/overview.md @@ -0,0 +1,46 @@ +--- +id: org-department.concept +title: 部门是什么 +type: concept +feature: org-department +scope: end-user +locale: zh +aliases: + - 部门 + - 组织架构 + - 公司部门 + - 部门是什么 + - 部门结构 + - 部门树 + - 部门和子部门 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 部门层级最多 3 级(顶级 + 2 层子部门) + - 每个部门最多 20 个直属子部门 + - 全系统最多 200 个部门 + - 同一用户最多负责(owner_userid)10 个部门 + - 部门不能跨实例迁移 +last_verified: v1.7.90 +--- + +# 部门是什么 + +## 定义 +部门(department)是 DooTask 用于描述公司组织结构的树形单位。每个部门有名称、上级部门(parent_id)、唯一的部门负责人(owner_userid)和可选的部门管理员(deputy)。部门之间通过 parent_id 形成树形结构,最多 3 级。 + +## 关键属性 +- **name**:部门名称,2-20 字,不能含特殊符号或字符串 `(M)` +- **parent_id**:上级部门 ID;为 0 表示顶级部门 +- **owner_userid**:部门负责人 userid,必填且唯一 +- **deputy_userids**:部门管理员列表,存于 `user_department_owners` 表,可多人 +- **dialog_id**:每个部门自动绑定一个部门群(group_type=`department`),成员关系与部门成员对齐 + +## 与其他概念的关系 +- **用户与部门**:用户的 `department` 字段保存其所在部门 ID 列表,用逗号包围(如 `,1,3,`);同一用户可属于多个部门 +- **部门与群聊**:每个部门有一个部门群,部门负责人是群主、部门管理员在群里 role=2 +- **负责人视角**:开启系统设置「部门负责人视角」后,负责人/管理员可只读查看本部门及所有下级部门成员参与的项目和任务,见 [[org-department.deputy.concept]] + +## 入口 +管理入口仅限系统管理员:[[org-department.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/project/dialog.md b/resources/ai-kb/zh/concept/project/dialog.md new file mode 100644 index 000000000..ebf3aa9f8 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/dialog.md @@ -0,0 +1,55 @@ +--- +id: project.dialog.concept +title: 项目聊天室(自动建群) +type: concept +feature: project +scope: end-user +locale: zh +aliases: + - 项目群聊 + - 项目对话 + - 项目里聊天 + - 项目群 + - 自动建群 +related_tools: [send_message, get_message_list] +related_pages: [project_detail, messenger] +prerequisites: [] +negative: + - 项目群成员同步自 ProjectUser,不能单独加非项目成员到群 + - 个人项目([[project.personal.concept]])无群(仅自己一人) + - 群解散需要先删项目,否则无法手动解散 +last_verified: v1.7.90 +--- + +# 项目聊天室(自动建群) + +## 定义 +DooTask 团队项目(personal=0)创建时自动生成一个 WebSocketDialog 群聊,对应 `Project.dialog_id` 字段。所有项目成员(ProjectUser)自动加入群聊;项目成员变更(加 / 删 / 转让)时,群成员同步变更。 + +## 群成员同步规则 +- 加项目成员 → 自动入群([[project.member.howto]]) +- 删项目成员 → 自动出群 +- 转让拥有者([[project.transfer.howto]]) → 群 owner_id 同步换 +- 群 role 字段镜像 ProjectUser.owner(0/1/2) + +## 入口 +- 桌面端:项目顶部「💬 项目对话」按钮 → 弹出对话面板 +- 桌面端:左侧栏「消息」→ 找项目同名群聊 +- 移动端:项目详情底部「💬」 + +## 与任务对话的关系 +- 项目群聊:全项目级,所有成员都在 +- 任务聊天室([[task.dialog.concept]] / [[task.related.concept]]):任务级,只可见用户在 + +两者独立,互不嵌套。 + +## 群名变更 +- 默认与项目名同步 +- 改项目名不会自动改群名(设计:群可有自己的展示名) +- 想同步:管理员需在群设置里手动改 + +## 不支持 +- 不能给项目关掉群聊(dialog_id 一旦创建无法置空) +- 不能加非项目成员进群(即便是临时访客) +- 不能合并两个项目的群聊 +- 个人项目不会自动建群 diff --git a/resources/ai-kb/zh/concept/project/flow-default.md b/resources/ai-kb/zh/concept/project/flow-default.md new file mode 100644 index 000000000..4191863d6 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/flow-default.md @@ -0,0 +1,55 @@ +--- +id: project.flow.concept.default +title: 默认工作流(待处理 / 进行中 / 待测试 / 已完成 / 已取消) +type: concept +feature: project +scope: end-user +locale: zh +aliases: + - 默认工作流 + - 5 个流程节点 + - 待处理 进行中 + - 已完成 已取消 + - DooTask 默认流程 +related_tools: [get_project] +related_pages: [project_settings, project_flow] +prerequisites: [] +negative: + - 默认 5 节点可改名 / 改色 / 加节点 / 删节点 + - 已取消(status=end)也会触发 complete_at 自动写入(与「已完成」同等待遇) + - 重命名节点不会回填已存在任务的 flow_item_name 快照 +last_verified: v1.7.90 +--- + +# 默认工作流(待处理 / 进行中 / 待测试 / 已完成 / 已取消) + +## 定义 +DooTask 创建项目时若勾选「启用工作流」,会自动套用一套预置的 5 节点流程,覆盖最常见的「待办 → 工作 → 检查 → 收尾」工序: + +| 节点 | 状态 | 默认颜色 | 默认 turns(可流转到) | +|---|---|---|---| +| 待处理 | start | 灰 | 进行中 | +| 进行中 | progress | 蓝 | 待测试、已完成 | +| 待测试 | test | 黄 | 进行中、已完成 | +| 已完成 | end | 绿 | (终点) | +| 已取消 | end | 红 | (终点) | + +## 特点 +- 「已完成」和「已取消」都是 `status=end`,拖任务到这两个节点都会触发 `complete_at` 自动写入 +- 「已取消」用于"做了但不再继续"的语义,与「已完成」字段值无差异(仅节点名 / 色不同) +- 「待测试」适合产品 / 开发流程 +- 节点之间的流转规则按上表,可在项目设置改 + +## 与「列」(column)的关系 +- 默认工作流的 5 节点不强制绑定列;你可手动给每个节点配 columnid,让看板列与工作流状态联动 +- 不绑定列时:看板视图按列分栏,工作流视图按 flow_item 分栏 + +## 自定义修改 +- 进 [[project.flow.howto.create]] 编辑节点 +- 加节点、改名、改色、改 turns、绑定列均支持 +- 拖动调整节点顺序(sort) + +## 不支持 +- 默认 5 节点不能"恢复初始" +- 修改默认节点后不会同步给其他项目(每项目独立) +- 重命名节点不影响已存在任务的 flow_item_name 快照(这是设计:避免历史任务突然显示新名) diff --git a/resources/ai-kb/zh/concept/project/permission.md b/resources/ai-kb/zh/concept/project/permission.md new file mode 100644 index 000000000..b0f1fea56 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/permission.md @@ -0,0 +1,64 @@ +--- +id: project.permission.concept +title: 项目任务权限点(ProjectPermission) +type: concept +feature: project +scope: admin +locale: zh +aliases: + - 项目权限 + - 任务权限点 + - TASK_ADD 权限 + - 权限规则配置 + - 谁能改任务 +related_tools: [get_project] +related_pages: [project_settings, project_permission] +prerequisites: + - 是项目拥有者(owner=1)或管理员(owner=2) +negative: + - 权限规则只控制任务操作(add/update/remove/move 等),不控制项目设置 + - 拥有者 / 管理员的权限不可被 ProjectPermission 限制(默认全开) + - 权限规则只能在「项目级」配置,不能按列、按标签细分 +last_verified: v1.7.90 +--- + +# 项目任务权限点(ProjectPermission) + +## 定义 +DooTask 用 `ProjectPermission` 表细化「谁能做什么任务级操作」。每条规则按 4 类主体 + 11 个权限点矩阵展开。规则只针对 owner=0 的普通成员;拥有者 / 管理员默认全开。 + +## 4 类权限主体 +- `project_leader` — 项目拥有者(隐式全开) +- `project_member` — 项目内任意普通成员 +- `task_leader` — 该任务的负责人(owner=1 in ProjectTaskUser) +- `task_assist` — 该任务的协作者(owner=0 in ProjectTaskUser) + +## 11 个权限点 +| 点 | 含义 | +|---|---| +| TASK_LIST_ADD | 加列 | +| TASK_LIST_UPDATE | 改列名 / 颜色 | +| TASK_LIST_REMOVE | 删列 | +| TASK_LIST_SORT | 列排序 | +| TASK_ADD | 加任务([[task.create.howto.quick]]) | +| TASK_UPDATE | 改任务字段 | +| TASK_TIME | 改计划时间 | +| TASK_STATUS | 改工作流 / 完成 | +| TASK_REMOVE | 删任务 | +| TASK_ARCHIVED | 归档任务 | +| TASK_MOVE | 跨列 / 跨项目移动 | + +## 在哪配 +- 桌面端:项目设置 → 「权限规则」面板 +- 用矩阵勾选:每个权限点 × 每类主体 + +## 默认值 +新建项目时: +- project_member:TASK_ADD / TASK_UPDATE / TASK_STATUS / TASK_TIME / TASK_ARCHIVED / TASK_MOVE / TASK_LIST_SORT 全开 +- task_leader / task_assist:全开(任务自己人改自己的任务) +- TASK_LIST_ADD / TASK_LIST_UPDATE / TASK_LIST_REMOVE:仅拥有者 / 管理员 + +## 不支持 +- 不能按列、按标签做细粒度限制 +- 不能限制拥有者 / 管理员(始终全开) +- 不支持「按部门角色」自动套用权限 diff --git a/resources/ai-kb/zh/concept/project/personal.md b/resources/ai-kb/zh/concept/project/personal.md new file mode 100644 index 000000000..5cf9e4e32 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/personal.md @@ -0,0 +1,54 @@ +--- +id: project.personal.concept +title: 个人项目 vs 团队项目 +type: concept +feature: project +scope: end-user +locale: zh +aliases: + - 个人项目 + - 私人项目 + - 团队项目 + - 个人和团队项目区别 + - personal 项目 +related_tools: [create_project, list_projects] +related_pages: [project_list] +prerequisites: [] +negative: + - 个人项目每个用户只能有 1 个 + - 个人项目不能邀请其他成员 + - 个人项目不能开启工作流 +last_verified: v1.7.90 +--- + +# 个人项目 vs 团队项目 + +## 定义 +DooTask 用 `personal` 字段区分两类项目: +- `personal=0` — **团队项目**(默认):可邀请多人协作 +- `personal=1` — **个人项目**:仅创建者自己可见可改,每用户限 1 个 + +## 关键差异 + +| 维度 | 团队项目 | 个人项目 | +|---|---|---| +| 数量上限 | 不限 | 每用户 1 个 | +| 邀请成员 | ✓ | ✗ | +| 群聊(dialog_id) | 自动建群聊,全员加入 | 仅自己 | +| 工作流(flow) | ✓ | ✗ | +| 权限角色 | 拥有者 / 管理员 / 成员 | 仅拥有者 | +| 创建权限管控 | 受站点 project_add_permission 限制 | 不受限制 | +| 转让(transfer) | ✓ | ✗ | + +## 用途 +- **个人项目**:用作自己的待办列表,把私事 / 学习 / 副业任务藏起来 +- **团队项目**:所有协作场景,包括开发、产品、运营、客户跟进 + +## 互转 +- 个人项目不能直接转团队项目 +- 想"开放"个人项目,需要新建团队项目,再用 [[task.move.howto.cross-project]] 把任务搬过去 + +## 不支持 +- 不能在个人项目里邀请协作者(任务的 owner / assist 都只能是自己) +- 不能给个人项目设置工作流、权限规则 +- 站点限制项目创建权限时,个人项目不受限(始终可创建) diff --git a/resources/ai-kb/zh/concept/project/role.md b/resources/ai-kb/zh/concept/project/role.md new file mode 100644 index 000000000..0ffd07191 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/role.md @@ -0,0 +1,55 @@ +--- +id: project.role.concept +title: 项目角色(拥有者 / 管理员 / 成员) +type: concept +feature: project +scope: end-user +locale: zh +aliases: + - 项目角色 + - 项目拥有者 + - 项目负责人 + - 项目管理员 + - 项目普通成员 +related_tools: [get_project] +related_pages: [project_settings, project_member] +prerequisites: [] +negative: + - 一个项目只能有 1 个拥有者(owner=1) + - 项目管理员不能罢免其他管理员、不能转让拥有者 + - 项目角色与系统角色(站点管理员)独立,互不继承 +last_verified: v1.7.90 +--- + +# 项目角色(拥有者 / 管理员 / 成员) + +## 定义 +DooTask 项目角色用 `ProjectUser.owner` 字段 3 个值表达: +- `0` — **普通成员**(OWNER_MEMBER) +- `1` — **项目拥有者** / **项目负责人**(OWNER_PRIMARY),每项目唯一 +- `2` — **项目管理员** / **项目副手**(OWNER_DEPUTY) + +加上群聊里同步的 `WebSocketDialogUser.role` 字段,保持与 ProjectUser.owner 一致。 + +## 权限差异 + +| 行为 | 拥有者 1 | 管理员 2 | 成员 0 | +|---|---|---|---| +| 改项目设置(名称 / 自动归档 / AI 分析等) | ✓ | ✓ | ✗ | +| 加 / 删成员 | ✓ | ✓ | ✗ | +| 任命 / 罢免管理员 | ✓ | ✗ | ✗ | +| 转让项目([[project.transfer.howto]]) | ✓ | ✗ | ✗ | +| 归档 / 删除项目 | ✓ | ✗ | ✗ | +| 改工作流 / 列 / 标签 | ✓ | ✓ | ✗ | +| 改自己创建的任务 | ✓ | ✓ | ✓ | +| 改别人创建的任务 | ✓ | ✓ | 仅当是负责人 / 协作者 / 有 TASK_UPDATE 权限 | +| 任务级权限(TASK_ADD / UPDATE 等) | 详见 [[project.permission.concept]] | + +## 转换规则 +- 拥有者通过 `transfer` 接口把角色让给另一个成员,自己变回成员(owner=0) +- 个人项目(personal=1)的拥有者转让时,原拥有者名字会自动加到项目前缀 + +## 不支持 +- 不支持多人共拥有者(最多 1 个 owner=1) +- 用户离开项目后他名下任务不会保留原负责人:任务 owner 会被转给操作人或拥有者 +- 项目角色不能继承自部门负责人 / 站点管理员 diff --git a/resources/ai-kb/zh/concept/project/statistics.md b/resources/ai-kb/zh/concept/project/statistics.md new file mode 100644 index 000000000..4dcef2882 --- /dev/null +++ b/resources/ai-kb/zh/concept/project/statistics.md @@ -0,0 +1,57 @@ +--- +id: project.statistics.concept +title: 项目统计(任务数 / 完成率 / 我的待办) +type: concept +feature: project +scope: end-user +locale: zh +aliases: + - 项目进度 + - 项目完成率 + - 项目里我有多少任务 + - 项目任务数 + - 项目进度统计 +related_tools: [get_project, list_tasks] +related_pages: [project_detail, dashboard] +prerequisites: [] +negative: + - 统计不含归档任务(archived_at 非空的不计) + - 统计实时计算,没有定时缓存,大项目(>10000 任务)会略慢 + - 「我的待办」按 ProjectTaskUser 命中当前用户 + complete_at 为空 +last_verified: v1.7.90 +--- + +# 项目统计(任务数 / 完成率 / 我的待办) + +## 项目级统计字段 +DooTask 项目列表与详情页展示一组实时统计,主要来自 `Project::getTaskStatistics()` 方法。 + +| 字段 | 含义 | +|---|---| +| `task_num` | 项目内未归档任务总数 | +| `task_complete` | 已完成任务数(complete_at 非空 + 未归档) | +| `task_percent` | 完成率(task_complete / task_num) | +| `task_my_num` | 当前用户名下的任务数(负责人 + 协作者) | +| `task_my_complete` | 当前用户名下已完成 | +| `task_my_percent` | 当前用户完成率 | + +## 显示位置 +- 项目列表卡片:「X / Y 完成」+ 进度条 +- 项目详情页顶部:完整统计 + 我的细分 +- 仪表盘「今日待办」/「我的任务」卡片:跨项目汇总 + +## 计算口径 +- **不含归档任务**(archived_at 非空的任务不在分母) +- 不含已删任务(deleted_at 非空) +- 「我的」只看 ProjectTaskUser,按 userid 命中(不论 owner=0/1) +- 子任务计入分母(不是只看父任务) + +## 用户级跨项目统计(user__counts) +- 当前用户的全部项目数 +- 待完成任务总数(跨项目) +- 已完成任务总数(跨项目) + +## 不支持 +- 没有按时间段的统计(只能用导出 [[project.export.howto]] 自己分析) +- 不能按标签 / 列分组统计 +- 不能给"未指派任务"算独立指标 diff --git a/resources/ai-kb/zh/concept/push-notice/alias.md b/resources/ai-kb/zh/concept/push-notice/alias.md new file mode 100644 index 000000000..85a3e2c99 --- /dev/null +++ b/resources/ai-kb/zh/concept/push-notice/alias.md @@ -0,0 +1,62 @@ +--- +id: push-notice.alias.concept +title: 友盟 Alias 用户绑定 +type: concept +feature: push-notice +scope: end-user +locale: zh +aliases: + - UmengAlias + - 友盟别名 + - 设备绑定 + - 推送绑定 + - 怎么收到推送 + - 推送目标 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已开启 APP 推送 + - 用户在移动端 APP 已登录 +negative: + - Web 端 / 桌面端不写 UmengAlias 表,因此不通过友盟推送 + - 别名 30 天未活跃即不再用于推送(updated_at 过期) + - 调试模式(isDebug=1)的 APP 不会注册别名,避免污染生产推送 +last_verified: v1.7.90 +--- + +# 友盟 Alias 用户绑定 + +## 定义 +`umeng_alias` 是 DooTask 用来记录「某用户的某台移动设备应该接收哪些推送」的绑定表。每次移动 APP 启动登录后会调用 `api/users/umeng/alias` 注册或更新这条记录,后端按 `userid → alias` 反向查到所有活跃设备来发推送。 + +## 关键字段 +| 字段 | 说明 | +|---|---| +| userid | DooTask 用户 ID | +| alias | 友盟 alias,用户在友盟侧的唯一标识 | +| platform | ios / android(其他平台调用会被拒) | +| device | 设备型号 | +| device_hash | 设备指纹,关联 UserDevice 表 | +| version | APP 版本号(含 versionName) | +| ua | userAgent | +| is_notified | 系统通知权限(0=未授予 / 1=已授予) | +| updated_at | 最后活跃时间;超过 30 天的别名不再被推送选中 | + +## 注册逻辑 +APP 启动 → 调 `api/users/umeng/alias?action=update`: +1. 校验 platform 必须是 ios / android +2. 校验 alias 长度 2-20 字符 +3. 校验 isDebug=0(调试模式拒绝) +4. 表里同 `userid + alias + platform` 存在则更新;不存在则插入 + +退出登录时可调 `action=remove` 删别名。 + +## 多设备规则 +- 同一 userid 可绑定多台设备,每个设备一条记录 +- 推送时按 platform 分组,每个用户每平台最多取最近 5 个 alias 一起发(按 updated_at 倒序) +- 角标数取自该用户未读且非静默消息总数(WebSocketDialogMsgRead) + +## 解绑 +- 用户卸载 APP 后系统不会主动删除别名记录;该别名后续推送会在友盟侧失败,不影响其他设备 +- 30 天未活跃自动从推送目标中剔除(但记录仍在表里) +- 管理员可在数据库直接清理 `umeng_alias` diff --git a/resources/ai-kb/zh/concept/push-notice/overview.md b/resources/ai-kb/zh/concept/push-notice/overview.md new file mode 100644 index 000000000..6bd5079be --- /dev/null +++ b/resources/ai-kb/zh/concept/push-notice/overview.md @@ -0,0 +1,48 @@ +--- +id: push-notice.concept +title: APP 推送是什么 +type: concept +feature: push-notice +scope: end-user +locale: zh +aliases: + - APP 推送 + - 手机推送 + - 友盟推送 + - UMENG + - 移动通知 + - 后台推送 + - 推送消息 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已在系统设置「APP 推送」配置友盟 appkey + - 用户在 iOS / Android 客户端登录并允许通知 +negative: + - Web 端、桌面端(Electron)不走友盟推送,靠 WebSocket + 本地通知 + - 未配置友盟 appkey 时所有 APP 推送链路不工作,但站内消息正常 + - 不支持替换为其他推送服务(如 FCM、个推、极光) +last_verified: v1.7.90 +--- + +# APP 推送是什么 + +## 定义 +APP 推送是 DooTask 通过友盟(UMENG)通道向移动端 APP(iOS / Android)发送的离线消息通知。即便 APP 被后台杀掉或网络断开后再回来,推送也能触达手机系统通知栏。 + +## 关键属性 +- **通道**:友盟 UMENG,分 iOS / Android 两套独立配置(`ios_key`、`ios_secret`、`android_key`、`android_secret`) +- **别名机制**:用户每次登录移动端会注册一个 alias 到 `umeng_alias` 表,详见 [[push-notice.alias.concept]] +- **触发**:默认配置下,对方收到新会话消息(且非自己发的、非静默)就会触发 +- **PC 在线优化**:若用户 PC 端 60 秒内活跃过,APP 推送会延迟 10 秒;这期间消息被读则跳过推送 +- **角标**:iOS 直接传 `badge`;Android 传 `set_badge`(最大 99) + +## 与其他通知的关系 +- 跟[[email-notice.concept]]:邮件是 SMTP,APP 推送是友盟,两条独立链路 +- 跟[[desktop-notify.concept]]:桌面通知靠 Electron 本地 `Notification`,与友盟无关 +- 跟[[mobile-notify.concept]]:APP 内的浮层通知,前台收到推送时显示 + +## 不支持 +- 没有「按消息类型订阅」(无法只推@提及不推普通消息) +- 不能自定义推送音效(用系统默认) +- AI 助手消息也不例外:同样走推送,标题取自定义昵称或「AI 助手」 diff --git a/resources/ai-kb/zh/concept/push-notice/scenarios.md b/resources/ai-kb/zh/concept/push-notice/scenarios.md new file mode 100644 index 000000000..c67667907 --- /dev/null +++ b/resources/ai-kb/zh/concept/push-notice/scenarios.md @@ -0,0 +1,57 @@ +--- +id: push-notice.scenarios.concept +title: APP 推送触发场景 +type: concept +feature: push-notice +scope: end-user +locale: zh +aliases: + - 什么时候推送 + - APP 推送场景 + - 哪些情况推 + - 推送规则 + - 不推送的情况 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已开启 APP 推送,详见 [[push-notice.config.howto]] + - 用户在移动端登录并注册了 UmengAlias +negative: + - 任务创建 / 分配 / 截止提醒不直接发友盟推送,通过聊天消息携带 + - 审批通过 / 驳回不直接发友盟推送,通过聊天消息携带 + - 自己发的消息不会推给自己 +last_verified: v1.7.90 +--- + +# APP 推送触发场景 + +## 定义 +DooTask 仅在用户**收到新会话消息**且满足若干前置条件时触发友盟推送。推送内容为「发件人 + 消息预览」,点击进入对应会话。 + +## 触发条件(全部满足才推) +1. 管理员后台「APP 推送」总开关 = open +2. 友盟 iOS / Android 至少一端配了 key/secret +3. 收件人 `umeng_alias` 表 30 天内有效别名 +4. 消息发送者 ≠ 收件人本人 +5. 该会话对收件人的 `silence` 标记 = 0(非免打扰) +6. 消息本身没带 silence=true 静默标志 +7. 收件人未禁用(`disable_at` 为 NULL) + +## PC 在线时的延迟逻辑 +- 收件人 PC 端 60 秒内有心跳:先**不推**,把任务放进 10 秒延迟队列 +- 10 秒后再检查该消息是否已读:已读则跳过,未读才推 +- 设计目的:用户在电脑前已经看到消息时不再叨扰手机 + +## 推送内容 +- **单聊**:标题 = 发件人昵称;正文 = 消息预览 +- **群聊**:标题 = 群名;正文 = `昵称: 消息预览` +- **AI 助手**:标题取 `msg.nickname` 自定义昵称或默认「AI 助手」 +- 附加数据:`dialog_id`、`msg_id`、`badge`(未读总数) + +## 不触发推送的情形 +- 任务更新、审批结果、@提及通过同一条聊天消息送达,那条消息会推;但脱离聊天消息的「纯系统事件」(如签到提醒 TodoRemindTask)按内部参数决定(默认不推送本人) +- 标记为已读的旧消息 +- 静默发送的系统消息 + +## 调试推送 +若想确认是否推送,看 `umeng_logs` 表 request/response 字段。 diff --git a/resources/ai-kb/zh/concept/report/analysis.md b/resources/ai-kb/zh/concept/report/analysis.md new file mode 100644 index 000000000..571c9e290 --- /dev/null +++ b/resources/ai-kb/zh/concept/report/analysis.md @@ -0,0 +1,51 @@ +--- +id: report.analysis.concept +title: 工作汇报的 AI 解读 +type: concept +feature: report +scope: end-user +locale: zh +aliases: + - AI 解读工作汇报 + - 工作汇报 AI 总结 + - 周报点评 + - 工作汇报分析 + - ReportAnalysis +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 +negative: + - 解读结果按查看者独立保存,不会出现在其他查看者侧 + - 只支持工作汇报的提交人或接收人保存自己的解读,其他人无权 + - 解读是离线快照,不会随工作汇报内容修改而自动重算 +last_verified: v1.7.90 +--- + +# 工作汇报的 AI 解读 + +## 定义 +工作汇报的 AI 解读(ReportAnalysis)是某个查看者基于一份具体工作汇报生成的 AI 总结 / 点评 / 建议文本。每个查看者(提交人或接收人)有独立的解读记录,互相不共享。 + +## 关键属性 +- **绑定关系**:每条解读关联到 (`rid` 工作汇报, `userid` 查看者) 唯一一条 +- **存储位置**:`report_ai_analyses` 表 +- **解读内容**:Markdown 文本 `analysis_text`,保存时也记录使用的模型名 `model` +- **元信息 meta**:可选记录查看者角色 / 名称 / 关注点(focus),帮助 AI 后续个性化 + +## 触发流程 +1. 工作汇报详情页右侧「AI 解读」面板首次展开,触发 AI 在线生成 +2. AI 调用相应工具读取工作汇报原文 + 上下文,输出 Markdown 总结 +3. 用户点「保存」走 `api/report/analysave` 落库 +4. 下次打开同一工作汇报,详情接口直接带出 `ai_analysis.text`,无需重生 + +## 与「AI 生成草稿」的区别 +- AI 草稿 [[report.ai-generate.howto]]:写之前帮你生成 **正文** +- AI 解读:工作汇报 **已存在** 后,为某位查看者总结要点 / 风险 / 进度 + +## 权限 +- 提交人 / 接收人可保存属于自己的解读 +- 非提交人非接收人调用 `analysave` 会被 `userCanAccessReport` 拒绝(返回「无权访问该工作汇报」) + +## 与 [[report.concept]] 的关系 +解读是工作汇报的派生数据,不影响工作汇报本体;删除工作汇报时关联解读也会失效。 diff --git a/resources/ai-kb/zh/concept/report/link.md b/resources/ai-kb/zh/concept/report/link.md new file mode 100644 index 000000000..a1c62bd02 --- /dev/null +++ b/resources/ai-kb/zh/concept/report/link.md @@ -0,0 +1,59 @@ +--- +id: report.link.concept +title: 报告分享链接 +type: concept +feature: report +scope: end-user +locale: zh +aliases: + - 报告链接 + - 报告分享码 + - report code + - 单独详情页 + - 报告 URL +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 链接不是「公开 URL」,访问者仍需登录 DooTask 才能看到内容 + - 同一对 (报告, 用户) 默认复用同一个 code;除非显式刷新(`refresh=yes`) + - 失败逻辑:如果原报告被删除,链接打开报「报告不存在或已被删除」 +last_verified: v1.7.90 +--- + +# 报告分享链接 + +## 定义 +报告分享链接(ReportLink)是为某一份报告 + 某个分享发起人生成的访问短码。短码用于构造独立页 URL,让接收人通过链接(而非进入应用菜单)直达报告详情。 + +## URL 格式 +- 完整路径:`<站点根>/single/report/detail/` +- 前端路由:`name = single-report-detail`,参数 `reportDetailId = code` +- 服务端通过 `code` 反查 `report_links` 表得到原报告 ID + +## 数据结构 +`report_links` 表关键字段: + +| 字段 | 含义 | +|---|---| +| `rid` | 原报告 ID | +| `userid` | 发起分享的人 | +| `code` | 短码,base64(`rid,userid,随机串`) | +| `num` | 累计访问次数 | +| `created_at` / `updated_at` | 时间戳 | + +## 何时生成 +- 调 `api/report/share` 分享到对话时自动生成 +- 同一 (rid, userid) 已存在链接时直接复用 +- 传 `refresh=yes` 可强制重新生成 code(让旧链接失效) + +## 访问计数 +每次通过 code 打开详情页,`num` 字段自增 1。可用于粗略判断报告被点开多少次。 + +## 权限边界 +- 生成阶段:只有提交人或接收人能生成链接 +- 访问阶段:访问者必须已登录;登录后无额外白名单(即拿到 URL 就能看) + +## 关联功能 +- 分享到对话 → [[report.share.howto]] +- 报告本体定义 → [[report.concept]] diff --git a/resources/ai-kb/zh/concept/report/overview.md b/resources/ai-kb/zh/concept/report/overview.md new file mode 100644 index 000000000..4b9e18283 --- /dev/null +++ b/resources/ai-kb/zh/concept/report/overview.md @@ -0,0 +1,43 @@ +--- +id: report.concept +title: 工作报告是什么 +type: concept +feature: report +scope: end-user +locale: zh +aliases: + - 工作报告 + - 工作汇报 + - 什么是日报周报 + - 报告功能 + - DooTask 报告 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 只支持周报(weekly)和日报(daily)两种类型,没有月报 / 季报 / 年报 + - 同一个用户在同一周期(同一周 / 同一天)只能提交一份同类型报告,重复提交会被拒绝 + - 接收人列表在每次编辑保存时会被覆盖(不是追加) +last_verified: v1.7.90 +--- + +# 工作报告是什么 + +## 定义 +工作报告(也叫工作汇报)是 DooTask 内置的成员定期向他人发送工作总结的功能,分为周报和日报两种类型。撰写后可指定一组接收人发送,接收方可在「我收到的」中查看,并标记已读/未读。 + +## 关键属性 +- **类型**:`weekly`(周报)/ `daily`(日报);类型决定模板和唯一标识周期 [[report.type.concept]] +- **唯一标识 sign**:每位用户在每个周期内只允许提交一份同类型报告;底层用 `userid + 周期编号` 拼接 +- **接收人**:可指定多人,发送后他们在「我收到的」看到,且收到 WebSocket 推送 +- **已读状态**:每个接收人独立维护 read 字段,详情打开时自动置已读 +- **可分享**:可生成 ReportLink 短码 [[report.link.concept]],把单条报告分享到任意对话 +- **AI 解读**:每个查看者(提交人或接收人)可保存独立的 AI 分析 [[report.analysis.concept]] + +## 与其他概念的关系 +- 模板自动汇总自任务系统(已完成 + 未完成 + 下周拟定)→ [[report.template.howto]] +- 分享到对话走消息系统(生成 mention 链接) → [[report.share.howto]] +- 「我收到的」未读数会展示在头像菜单旁的红点上 + +## 入口 +头像菜单 / 应用中心「工作报告」→ [[report.entry.menu-map]] diff --git a/resources/ai-kb/zh/concept/report/type.md b/resources/ai-kb/zh/concept/report/type.md new file mode 100644 index 000000000..a21bd0561 --- /dev/null +++ b/resources/ai-kb/zh/concept/report/type.md @@ -0,0 +1,50 @@ +--- +id: report.type.concept +title: 周报和日报的区别 +type: concept +feature: report +scope: end-user +locale: zh +aliases: + - 周报和日报区别 + - 日报怎么算周期 + - 周报范围 + - 报告类型 + - weekly daily +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有月报 / 季报 / 年报,type 字段枚举只有 weekly 和 daily + - 不能跨类型转换(已提交的日报不能改成周报) + - 不允许提交未来周期,只能写当天/本周或更早(offset ≤ 0) +last_verified: v1.7.90 +--- + +# 周报和日报的区别 + +## 定义 +工作报告的 `type` 字段只有两个合法值:`weekly`(周报)和 `daily`(日报)。两者在周期粒度、自动模板内容、标题命名上有差异,但提交、分享、已读、AI 解读等流程完全一致。 + +## 对比表 + +| 维度 | weekly(周报) | daily(日报) | +|---|---|---| +| 周期 | 一周(按 ISO 周,周一到周日) | 一天(自然日 00:00–23:59) | +| 唯一 sign | `userid + 年份 + 周序号` | `userid + 年月日` | +| 自动标题 | `{用户}的周报[m/d-m/d][N 月第 K 周]` | `{用户}的日报[Y/m/d]` | +| 模板小节 | 已完成工作 + 本周未完成 + **下周拟定计划** | 已完成工作 + 今日未完成 | +| 任务时间窗 | 本周一 00:00 – 本周日 23:59 | 今日 00:00 – 今日 23:59 | + +## 适用场景 +- **周报**:周末向上级 / 团队汇总一周成果与下周计划,适合管理岗 / 项目角色 +- **日报**:每天下班前同步当日交付,适合排期紧、节奏快的团队 + +## 偏移量 offset +两种类型都支持负偏移: +- `offset = 0` → 本周期(默认) +- `offset = -1` → 上一个周期(上周 / 昨天) +- `offset > 0` 被拒绝(不能提交未来) + +## 重复提交 +同一用户同一周期内已提交一份同类型报告时,再次提交会报「请勿重复提交工作汇报」。要修改请走编辑流程 [[report.edit.howto]]。 diff --git a/resources/ai-kb/zh/concept/role-permission/admin.md b/resources/ai-kb/zh/concept/role-permission/admin.md new file mode 100644 index 000000000..128f79c30 --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/admin.md @@ -0,0 +1,48 @@ +--- +id: role-permission.admin.concept +title: 系统管理员(admin identity) +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 系统管理员 + - admin + - 管理员 + - 谁是管理员 + - 怎么算管理员 + - userIsAdmin +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 系统管理员不能修改超级管理员的资料和设置 + - 系统管理员不会自动成为项目负责人或任务负责人,仍按项目/任务级权限判断 + - identity 是数组,可能同时含 admin、temp、disable 等多个标记 +last_verified: v1.7.90 +--- + +# 系统管理员(admin identity) + +## 定义 +系统管理员是 `users.identity` 字段数组中包含字符串 `'admin'` 的用户。后端通过 `User::auth('admin')` 和 `$user->isAdmin()` 判断,前端通过 `store.state.userIsAdmin` 判断。允许同时存在多个系统管理员。 + +## 关键属性 +- **identity 字段是字符串数组**:可能值包括 `admin` / `temp`(临时账号) / `disable`(已离职) / `ldap`(LDAP 用户)等 +- **可多人持有**:任意系统管理员(含超管)都可授予或取消他人的 admin 身份 +- **由超管或现任 admin 授予**:通过 `POST api/users/operation` 的 `setadmin` / `clearadmin` 类型设置 +- **不与项目/任务权限挂钩**:管理员身份只对系统级功能生效;进项目/任务仍按项目级权限判断 + +## 主要权限 +- 团队管理:创建、编辑、删除、禁用、设为临时、设为离职会员 +- 系统设置、LDAP、邮件、推送、举报、合规设置 +- 数据导出(6 种)、应用市场管理、部门管理(增删改、任命部门负责人/管理员) +- 创建用户(`POST api/users/createuser`)、批量导入 + +## 不包括 +- 不能修改超级管理员的资料(被 `checkSystem(1)` 拦截) +- 不能直接看任意项目内的任务(仍需是项目成员或被任务可见用户名单包含) +- 不能解散别人是群主的群(除非是超管兜底) + +## 怎么变成管理员 +要别人授权,见 [[role-permission.grant-admin.howto]]。 diff --git a/resources/ai-kb/zh/concept/role-permission/department-role.md b/resources/ai-kb/zh/concept/role-permission/department-role.md new file mode 100644 index 000000000..395123f5e --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/department-role.md @@ -0,0 +1,54 @@ +--- +id: role-permission.department-role.concept +title: 部门角色(部门负责人 / 部门管理员) +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 部门负责人 + - 部门管理员 + - 负责人视角 + - 部门里谁能管 + - owner_userid + - 部门主管 + - 部门 deputy +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 一个部门只有一个部门负责人(owner_userid 字段,单值) + - 部门管理员可以多人(user_department_owners 表) + - 部门负责人不会自动获得部门成员名下任务的修改权限 + - 调任 / 离职部门,要由系统管理员通过部门操作完成,用户自己不能改 +last_verified: v1.7.90 +--- + +# 部门角色(部门负责人 / 部门管理员) + +## 定义 +部门成员关系记在 `user_departments`(部门本身) 和 `users.department`(用户所属部门列表)。部门角色分两种: + +- **部门负责人**:每个部门唯一,存在 `user_departments.owner_userid` 字段 +- **部门管理员**(deputy):可多人,存在独立表 `user_department_owners`,记录 `department_id + userid` + +## 关键属性 +- **每用户最多加入 10 个部门**(后端硬限制) +- **每用户最多任 10 个部门的部门负责人** +- **部门负责人会同时是该部门聊天群(`dialog`)的群主**,更换部门负责人会同步更换群主 +- **判定方法**(PHP): + - 是否部门负责人:`$dept->isPrimaryOwner($userid)` + - 是否部门管理员:`$dept->isDeputyOwner($userid)` + - 是否任一种角色:`$dept->isOwner($userid)` + +## 「负责人视角」能看到什么 +- 部门成员名单 +- 团队管理界面会高亮自己负责的部门 +- 部门 OKR:只有顶级部门第一级负责人才能添加部门 OKR(`department_owner` 字段) + +## 不会自动带来什么 +- **不自动看部门成员的任务**:部门负责人想看下属任务,仍需被加入对应项目或被加入任务可见用户 +- **不是系统管理员**:部门负责人没有团队管理、LDAP 等系统级权限 + +## 谁能改部门角色 +只有系统管理员(admin identity)能任命 / 罢免部门负责人和部门管理员。详见 [[role-permission.entry.menu-map]]。 diff --git a/resources/ai-kb/zh/concept/role-permission/overview.md b/resources/ai-kb/zh/concept/role-permission/overview.md new file mode 100644 index 000000000..21a885ec4 --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/overview.md @@ -0,0 +1,43 @@ +--- +id: role-permission.concept +title: DooTask 权限体系总览 +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 权限体系 + - 权限有几种 + - 角色都有什么 + - DooTask 权限怎么分 + - 权限级别 + - 谁能做什么 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有「全局解锁所有权限」的开关,权限按场景细分 + - 不支持自定义新角色(角色集合是内置的) + - 角色不直接绑权限列表,而是按场景判断 +last_verified: v1.7.90 +--- + +# DooTask 权限体系总览 + +## 定义 +DooTask 把权限拆成四个相对独立的层级,按操作场景分别判断。每次校验都看「当前用户在当前对象上的角色」,没有跨层级的全局通行证。 + +## 四个层级 +- **系统级**:超级管理员(id=1 的第一个注册用户)+ 系统管理员(identity 含 `admin`)。控制团队管理、LDAP、License、系统设置等。详见 [[role-permission.super-admin.concept]] 和 [[role-permission.admin.concept]] +- **项目级**:项目负责人(`owner=1`) / 项目管理员(`owner=2`) / 项目成员(`owner=0`)。控制项目内的列、工作流、成员邀请、任务权限策略。详见 [[role-permission.project-role.concept]] +- **任务级**:任务负责人(owner) / 任务协助人(assist) / 可见用户(visibility)。控制单个任务的修改权限与可见范围。详见 [[role-permission.task-role.concept]] +- **部门级**:部门负责人(`owner_userid`) / 部门管理员(`user_department_owners` 表)。看「负责人视角」、管理部门成员。详见 [[role-permission.department-role.concept]] + +## 关键性质 +- **不会自动继承**:系统管理员不自动成为某项目负责人;项目负责人不自动是任务负责人 +- **按场景判断**:同一个用户在 A 项目是负责人、在 B 项目可能只是成员 +- **可见性是独立维度**:任务可见用户(visibility)即使是项目成员也可能看不见某任务 +- **超级管理员有兜底特权**:少数功能(如修改超管设置、强制删群)专属 id=1 用户 + +## 遇到权限不足 +查 [[role-permission.permission-denied.faq]]。 diff --git a/resources/ai-kb/zh/concept/role-permission/project-role.md b/resources/ai-kb/zh/concept/role-permission/project-role.md new file mode 100644 index 000000000..e983373d4 --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/project-role.md @@ -0,0 +1,58 @@ +--- +id: role-permission.project-role.concept +title: 项目角色(负责人 / 管理员 / 成员) +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 项目角色 + - 项目负责人 + - 项目管理员 + - 项目成员 + - owner=1 + - owner=2 + - 项目里谁能改什么 +related_tools: [] +related_pages: [project_detail] +prerequisites: [] +negative: + - 一个项目只有一个项目负责人(owner=1) + - 项目管理员可以有多个,但不会替补项目负责人离职后的位置 + - 项目成员退出项目后,他名下的任务身份会被解除,但任务本身不会被删 + - 项目角色不跨项目,A 项目的负责人在 B 项目里可能只是成员 +last_verified: v1.7.90 +--- + +# 项目角色(负责人 / 管理员 / 成员) + +## 定义 +项目角色记在 `project_users` 表的 `owner` 字段,每个用户对每个项目有一个独立的角色。三种角色: + +- **项目负责人**(`owner=1`,`OWNER_PRIMARY`):项目最高权限,每个项目唯一 +- **项目管理员**(`owner=2`,`OWNER_DEPUTY`):协助负责人,可多人 +- **项目成员**(`owner=0`,`OWNER_MEMBER`):默认角色,能看能改自己负责的任务 + +## 默认权限(可由项目权限策略覆盖) +项目权限通过 `ProjectPermission` 模型按 11 种动作粒度配置(详见项目权限设置): + +| 动作 | 默认允许角色 | +|---|---| +| 添加 / 修改 / 排序列 | 项目负责人 + 项目成员 | +| 删除列 | 项目负责人 | +| 添加任务 | 项目负责人 + 项目成员 | +| 更新任务、改截止时间 | 项目负责人 + 任务负责人 + 任务协助人 | +| 改任务状态 / 删任务 / 归档 / 移动 | 项目负责人 + 任务负责人 | + +## 项目负责人独有 +- 转让项目(把负责人交给别人) +- 解散 / 删除项目 +- 配置项目权限策略 +- 一旦项目负责人离职并指定交接人,新交接人自动成为项目负责人 + +## 项目管理员特殊性 +- 协助管理项目,可改成员、改列等 +- **不参与负责人替补**:原负责人离职时,项目管理员不会自动升级为负责人;接收人是普通成员就保留普通成员身份 + +## 与系统管理员的关系 +系统管理员(admin identity)不会自动获得任意项目的权限,仍需要被加入项目并设置项目角色。 diff --git a/resources/ai-kb/zh/concept/role-permission/super-admin.md b/resources/ai-kb/zh/concept/role-permission/super-admin.md new file mode 100644 index 000000000..d36a90535 --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/super-admin.md @@ -0,0 +1,49 @@ +--- +id: role-permission.super-admin.concept +title: 超级管理员(id=1) +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 超管 + - 超级管理员 + - 谁是超管 + - 第一个用户 + - id 为 1 的用户 + - 主账号 + - owner 账号 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 系统中有且只有一个超级管理员(不能同时存在多个) + - 超管账号不能被删除,也不能被其他管理员设为离职 + - 超管不能取消自己的管理员身份 + - 普通用户和系统管理员都无法把自己升为超管 +last_verified: v1.7.90 +--- + +# 超级管理员(id=1) + +## 定义 +超级管理员是 DooTask 实例中**第一个注册的用户**,对应数据库 `users.userid = 1`。整个系统只允许存在一个超管。 + +## 关键属性 +- **判定方式**:`userid === 1`,与 identity 字段无关;超管同时自带 `admin` identity +- **唯一性**:系统中始终只有一个超管,新装实例由首次启动时创建 +- **不可降级**:自己无法取消超管身份;其他人也改不了 +- **环境保护**:当后端环境变量 `PASSWORD_ADMIN=disabled` 时,超管的部分敏感操作(如改密、改邮箱)会被禁止 + +## 专属能力(系统管理员也做不了) +- 修改超管自身设置(密码、邮箱、昵称等无人能代改) +- 不能被「设为离职」「删除会员」操作(后端 `checkSystem(1)` 拦截) +- 是系统级数据迁移、转让的兜底身份 + +## 转让超管 +超管可以把超管身份转让给另一个账号。转让会同步迁移部门、项目、任务、文件归属,参考 [[role-permission.transfer-owner.howto]]。 + +## 与系统管理员的区别 +- 超管 = 系统里第一个用户(id=1),唯一 +- 系统管理员 = identity 含 `admin` 的所有用户,可以有多个,由超管或其他管理员授予 +- 详见 [[role-permission.admin.concept]] diff --git a/resources/ai-kb/zh/concept/role-permission/task-role.md b/resources/ai-kb/zh/concept/role-permission/task-role.md new file mode 100644 index 000000000..09f2e9c0d --- /dev/null +++ b/resources/ai-kb/zh/concept/role-permission/task-role.md @@ -0,0 +1,59 @@ +--- +id: role-permission.task-role.concept +title: 任务角色(负责人 / 协助人 / 可见用户) +type: concept +feature: role-permission +scope: end-user +locale: zh +aliases: + - 任务角色 + - 任务负责人 + - 任务协助人 + - 任务可见用户 + - assist + - visibility + - 谁能改这条任务 + - 任务为什么看不到 +related_tools: [] +related_pages: [task_detail] +prerequisites: [] +negative: + - 任务负责人可以是多人(不是只能一个) + - 协助人没有改状态 / 删任务的权限,只能改内容和时间 + - 设置了可见用户的任务,非名单内的项目成员看不到,连项目负责人不在名单也看不到 + - 子任务的可见用户继承父任务,不能单独配置 +last_verified: v1.7.90 +--- + +# 任务角色(负责人 / 协助人 / 可见用户) + +## 定义 +单个任务上的角色记录在两张表: + +- **`project_task_users`**:记录任务负责人和协助人,`owner` 字段区分 + - `owner=1`:任务负责人(可多人) + - `owner=0`:任务协助人(assist,可多人) +- **`project_task_visibility_users`**:记录任务可见用户名单,控制谁能看到这条任务 + +## 默认权限(项目权限策略可覆盖) + +| 角色 | 改内容 / 改时间 | 改状态 / 完成 | 删除 / 归档 / 移动 | +|---|---|---|---| +| 项目负责人 | 可 | 可 | 可 | +| 任务负责人 | 可 | 可 | 可 | +| 任务协助人 | 可 | 不可 | 不可 | +| 其他项目成员 | 不可 | 不可 | 不可 | + +## 可见用户(visibility)规则 +- **未设置时**:所有项目成员都可见 +- **设置后**:只有名单内的用户可见,名单外(包括项目负责人)都看不到 +- 设了可见用户的任务才在搜索 / 列表 / 看板里对名单内用户出现 +- 子任务的可见性继承父任务(不能单独设置) + +## 与项目角色的关系 +任务角色不依赖项目角色: +- 项目成员可以被任命为任务负责人,从而具备改状态 / 删任务的权限 +- 项目负责人若不在任务可见用户名单内,也看不到这条任务 + +## 系统级身份的影响 +系统管理员(admin identity)不会自动获得任意任务的权限。详见 [[role-permission.admin.concept]] 和 [[role-permission.project-role.concept]]。 diff --git a/resources/ai-kb/zh/concept/search/engine.md b/resources/ai-kb/zh/concept/search/engine.md new file mode 100644 index 000000000..25a80c820 --- /dev/null +++ b/resources/ai-kb/zh/concept/search/engine.md @@ -0,0 +1,55 @@ +--- +id: search.engine.concept +title: 搜索引擎(Manticore 与 MySQL 回退) +type: concept +feature: search +scope: admin +locale: zh +aliases: + - 搜索引擎 + - Manticore + - 搜索插件 + - 搜索很慢 + - 为什么搜不到文件内容 + - 语义搜索 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 未安装 search 插件时无法搜索文件正文,只能按文件名模糊匹配 + - 未安装 search 插件时不支持语义 / 向量 / 混合搜索,只能精确关键词 + - 向量搜索还需要 ai 插件提供 Embedding,仅装 search 没装 ai 也走不了语义 +last_verified: v1.7.90 +--- + +# 搜索引擎(Manticore 与 MySQL 回退) + +## 定义 +DooTask 全局搜索底层有两套实现,按 `Apps::isInstalled('search')` 自动切换:装了应用市场的 search 插件就走 Manticore,没装就退回 MySQL `LIKE` 模糊查询。 + +## Manticore 搜索引擎 +Manticore Search 是独立的开源搜索引擎,作为可选插件部署在 DooTask 的 appstore 里。能力包括: +- **全文搜索**(text):倒排索引 + ICU 中文分词 +- **向量搜索**(vector):1536 维 KNN(HNSW 算法),需配合 AI 插件生成 Embedding +- **混合搜索**(hybrid,默认):同时打全文和向量分,取加权综合排名 +- **文件正文搜索**:可搜 Word / Excel / PPT / PDF / TXT / 代码文件等内部文本 + +接口参数 `search_type` 取值 `text` / `vector` / `hybrid`,默认 `hybrid`,**只在装了 Manticore 时生效**。 + +## MySQL 回退 +未装 search 插件时调 `searchByKeyword`,用 MySQL `LIKE %keyword%` 匹配。能力受限: +- 只匹配字面关键词,不理解同义词或语义 +- 不能搜文件正文(PDF / Office 内部文本搜不到) +- 大数据量下性能不如 Manticore +- 不支持 relevance 排序,按时间倒序 + +## 部署形态 +插件镜像独立维护(appstore 应用:search),技术规格: +- 向量维度:1536,兼容 OpenAI text-embedding-3-small +- 中文分词:ICU Chinese +- 推荐至少 2GB 可用内存 + +## 何时升级到 Manticore +- 需要搜索文件内容(不仅是文件名) +- 用自然语言查文件(如「财务分析文档」→「Q3 收入报表」) +- 团队消息 / 任务量大,MySQL `LIKE` 已经慢 diff --git a/resources/ai-kb/zh/concept/search/intelligent.md b/resources/ai-kb/zh/concept/search/intelligent.md new file mode 100644 index 000000000..3d4b00355 --- /dev/null +++ b/resources/ai-kb/zh/concept/search/intelligent.md @@ -0,0 +1,59 @@ +--- +id: search.intelligent.concept +title: 智能搜索(AI 语义搜索) +type: concept +feature: search +scope: end-user +locale: zh +aliases: + - 智能搜索 + - AI 搜索 + - 语义搜索 + - 自然语言搜索 + - intelligent_search + - 向量搜索 +related_tools: [intelligent_search] +related_pages: [] +prerequisites: + - 应用商店(应用市场)已安装 search 插件(Manticore Search) + - 应用商店已安装 ai 插件(语义 / 向量搜索需用其生成 Embedding) +negative: + - 未安装 search 插件(Manticore)时回退普通 MySQL 关键词搜索,无语义能力 + - 仅装 search 没装 ai 时,向量 / 语义 / 混合搜索无法生效,只能跑全文 text + - 索引建立有延迟,刚上传 / 新建的内容可能短时间内搜不到 + - 智能搜索按权限过滤,搜不到的对象通常是无权访问 +last_verified: v1.7.90 +--- + +# 智能搜索(AI 语义搜索) + +## 定义 +智能搜索是 DooTask 基于 **Manticore Search 插件**(search 插件)的统一检索能力,支持关键词(text)/ 语义向量(vector)/ 混合(hybrid)三种搜索类型,一次可跨任务 / 项目 / 文件内容 / 联系人 / 消息 5 类对象;AI 助手通过 MCP 工具 `intelligent_search` 调用同一套底座。 + +## 底层原理 +- 走 SearchController 统一接口,优先使用 Manticore Search(需安装 search 插件) +- **未安装 search 插件时回退到普通 MySQL 关键词搜索**,仍可按字面匹配搜索,但没有语义 / 向量能力 +- 默认 `search_type = hybrid`(混合搜索):同时打全文倒排分和 KNN 向量分 +- 向量分由 ai 插件提供 Embedding(1536 维,兼容 OpenAI text-embedding-3-small) +- 中文用 ICU 分词,能处理常见同义词与近义表达 + +## 与关键词搜索的区别 +- **关键词搜索**:只命中字面匹配,「Q3 收入报表」搜「财务分析」会落空 +- **智能搜索**:理解意图,「财务分析」能命中「Q3 收入报表」「年度成本表」等语义相关文件 +- 智能搜索仍保留关键词命中能力,相关度由混合算法加权 + +## 关键属性 +- **入口**:装齐 search + ai 后,全局搜索框会出现「AI 搜索」按钮,把搜索词转给 AI 助手;AI 助手自动调用 `intelligent_search` 工具 +- **结果排序**:按 `relevance` 综合分降序 +- **权限范围**:与基础 search 接口完全一致,只返回当前用户能看到的对象 +- **延迟**:依赖 Manticore 索引;新增内容入库到可搜的间隔通常为秒级 + +## 与全局搜索的关系 +- 全局搜索 = 用户在搜索框内主动输入关键词的检索能力,详见 [[search.concept]] +- 智能搜索 = AI 助手在对话中代用户调用的同一套底座,搜索类型默认 `hybrid` + +## 不支持 +- 没装 search 插件(Manticore)时回退 MySQL 关键词搜索,关键词 / 语义 / 混合类型参数失效 +- 装了 search 但没装 ai 插件时降级到全文,语义能力失效 +- 不能跨用户搜别人的私聊 / 私有文件 +- 单次每类对象不会返回超过 50 条(最多 50 条) diff --git a/resources/ai-kb/zh/concept/search/overview.md b/resources/ai-kb/zh/concept/search/overview.md new file mode 100644 index 000000000..9f26bfba4 --- /dev/null +++ b/resources/ai-kb/zh/concept/search/overview.md @@ -0,0 +1,48 @@ +--- +id: search.concept +title: 全局搜索是什么 +type: concept +feature: search +scope: end-user +locale: zh +aliases: + - 全局搜索 + - 搜索是什么 + - 总搜索 + - 怎么搜东西 + - 在哪里搜 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 全局搜索不会跨用户:只能搜到当前账号有权限看到的内容 + - 关键词为空时不会触发搜索,必须输入至少 1 个字符 + - 单次搜索每类对象最多返回 50 条(默认 20 条) +last_verified: v1.7.90 +--- + +# 全局搜索是什么 + +## 定义 +全局搜索是 DooTask 内的统一检索入口,能够一次性跨 5 类对象查找内容:联系人、项目、任务、文件、消息。对应后端 `api/search/*` 5 个接口,统一在 SearchController 实现。 + +## 5 类搜索对象 +- **联系人**(contact):按昵称 / 邮箱 / 个人简介 / 技能标签匹配用户 +- **项目**(project):按项目名 / 项目描述匹配当前用户可访问的项目 +- **任务**(task):按任务名 / 描述 / 子内容匹配用户所在项目内的任务 +- **文件**(file):按文件名匹配,安装 search 插件后还能搜文件正文 +- **消息**(message):按消息文本匹配用户能看到的会话消息 + +## 权限模型 +所有搜索都先做用户身份验证(`User::auth()`),结果只返回当前用户**已经有权限访问**的对象。搜不到不一定是关键词错,也可能是没有权限。 + +## 双引擎设计 +全局搜索有两套底层实现,按是否安装 search 插件自动切换: +- 装了 Manticore 搜索插件:走 Manticore,支持全文 / 向量 / 混合搜索 +- 未装:自动降级到 MySQL `LIKE` 模糊匹配 + +详见 [[search.engine.concept]]。 + +## 入口 +- 桌面端:快捷键 `Ctrl/Cmd + F` 或 `Ctrl/Cmd + /`,详见 [[search.entry.menu-map]] +- 移动端:在仪表盘等页面通过搜索按钮触发 diff --git a/resources/ai-kb/zh/concept/task/color.md b/resources/ai-kb/zh/concept/task/color.md new file mode 100644 index 000000000..fcf39785b --- /dev/null +++ b/resources/ai-kb/zh/concept/task/color.md @@ -0,0 +1,51 @@ +--- +id: task.field.color.concept +title: 任务颜色(自定义色块) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务颜色 + - 任务变色 + - 任务标黄 + - 怎么给任务标颜色 + - 任务卡颜色 +related_tools: [update_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 任务颜色不影响优先级、状态、可见性 + - 颜色不参与筛选 / 排序,仅做视觉强调 + - 子任务的颜色不会继承父任务,需要单独设 +last_verified: v1.7.90 +--- + +# 任务颜色(自定义色块) + +## 定义 +任务 `color` 字段允许用户给任务卡片打一个独立颜色,独立于优先级颜色、标签色块。常用于「重点跟进」「待回复」「等待审核」等用户自定义视觉标记。 + +## 数据形态 +- 字段:`color`(16 进制色值字符串,如 `#FFAA00`,或空表示无) +- 与优先级 `p_color` 同时存在时,**`color` 覆盖优先级色显示在卡片顶部色条** +- 与标签色块互不干扰,标签色显示在卡片底部 + +## 入口 +- 桌面端:任务详情页 → 「颜色」选择器(圆形色板) +- 桌面端:看板视图任务卡右键 → 「设置颜色」 +- 移动端:详情页字段区滑动到颜色 → 点选 + +## 取消颜色 +- 在颜色选择器顶部选「无颜色」或「默认」 +- 服务端写空字符串,看板卡顶恢复默认优先级色或灰色 + +## 与「优先级」「标签」的区别 +- 优先级([[task.field.priority.concept]])来自全局枚举,有语义 +- 标签([[task.field.tag.concept]])按项目分类,有语义 +- 颜色无语义,只是视觉强调,按个人 / 团队约定使用 + +## 不支持 +- 不能按颜色筛选 +- 颜色不可批量改 +- 子任务颜色不会自动继承父任务 diff --git a/resources/ai-kb/zh/concept/task/deadline.md b/resources/ai-kb/zh/concept/task/deadline.md new file mode 100644 index 000000000..48e02e30c --- /dev/null +++ b/resources/ai-kb/zh/concept/task/deadline.md @@ -0,0 +1,53 @@ +--- +id: task.field.deadline.concept +title: 任务计划时间(start_at / end_at) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 截止时间 + - deadline + - 任务到期时间 + - 开始时间 + - 任务计划时间 +related_tools: [update_task] +related_pages: [task_detail, calendar] +prerequisites: [] +negative: + - DooTask 任务没有 time_estimate / time_log 字段,不能记录工时 + - 不支持只设开始时间不设结束时间(end_at 是计算到期与循环周期的依赖) + - 跨时区显示按用户所在时区,但服务端统一存 UTC +last_verified: v1.7.90 +--- + +# 任务计划时间(start_at / end_at) + +## 定义 +DooTask 任务用两个字段描述时间: +- `start_at`:计划开始时间 +- `end_at`:计划截止时间(俗称 deadline) + +两者都可空。**填入 end_at 才能启用循环重复、到期提醒、日历展示。** + +## 在哪里能看到 +- 任务详情页 → 「计划时间」字段 +- 任务卡片右下角倒计时 / 日期标签 +- 日历视图:按 start_at→end_at 跨日条显示 +- 甘特图视图:按 start_at→end_at 长度条显示 + +## 时间格式 +- 桌面端可单选日期或日期+时分 +- 默认是「日期」级别(无时分),含时分时存秒级精度 +- 全天任务则 end_at 自动设为当天 23:59:59 + +## 与其他字段联动 +- **重复循环**([[task.recurring.howto]])依赖 end_at 计算下一次 loop_at +- **到期提醒**(ProjectTaskPushLog)按 end_at 触发推送(默认到期日推送、超期再推送) +- **日历视图** 只显示有 start_at 或 end_at 的任务 +- **完成时间**(complete_at)与计划时间无关,是否超期由 complete_at vs end_at 比较 + +## 不支持 +- 不能只设 start_at 不设 end_at 来启用循环 +- 不能录工时(time_estimate / time_log 字段不存在) +- 修改 end_at 不会回填已生成的循环任务实例 diff --git a/resources/ai-kb/zh/concept/task/description.md b/resources/ai-kb/zh/concept/task/description.md new file mode 100644 index 000000000..628c7a796 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/description.md @@ -0,0 +1,49 @@ +--- +id: task.field.description.concept +title: 任务描述(富文本) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务描述 + - 任务详情 + - 任务正文 + - 富文本任务 + - 任务备注 +related_tools: [update_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 描述富文本上限 50000 字符(含 HTML 标签) + - 描述不能直接附文件,需要单独走任务附件区 + - 描述无版本回滚 UI,仅服务端保留历史(ProjectTaskContent 表) +last_verified: v1.7.90 +--- + +# 任务描述(富文本) + +## 定义 +DooTask 任务描述(`desc` 字段 + `ProjectTaskContent` 表)支持富文本编辑,包括加粗、列表、链接、代码块、表格、图片、@ 提及成员等。短描述存 `desc`(500 字符快照),完整富文本存 `ProjectTaskContent` 表,每次保存生成新版本记录。 + +## 在哪里能看到 +- 任务详情页正中央富文本区 +- 卡片视图鼠标悬停显示描述前 500 字符 +- 搜索结果按 desc 做文本匹配 + +## 编辑器能力 +- 文本:粗体、斜体、下划线、删除线、代码、行内代码、引用 +- 块级:标题、有序 / 无序 / 任务列表、代码块、引用、分割线 +- 媒体:图片粘贴 / 拖入 → 自动上传 → 内嵌 +- 互动:@ 成员(输入 @ 唤起选人面板,会同时通知) +- 链接:URL、内部任务链接(点击直接跳转) + +## 自动保存 +- 失焦自动保存 +- 实时通过 WebSocket 同步给其他正在看这个任务的人 +- 保存生成 ProjectTaskContent 版本,但目前没有 UI 让用户回滚 + +## 不支持 +- 描述不能超过 50000 字符(HTML 含标签算),超长会被截断保存 +- 不能直接挂附件,附件走独立的「任务附件」区 +- 没有协同光标 / 实时同步光标位置(只是双方各自看到最新版本) diff --git a/resources/ai-kb/zh/concept/task/dialog.md b/resources/ai-kb/zh/concept/task/dialog.md new file mode 100644 index 000000000..c45677b36 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/dialog.md @@ -0,0 +1,50 @@ +--- +id: task.dialog.concept +title: 任务聊天室(dialog_id) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务对话 + - 任务聊天 + - 任务讨论区 + - 任务群聊 + - 任务的消息 +related_tools: [send_message, get_message_list] +related_pages: [task_detail, messenger] +prerequisites: [] +negative: + - 子任务不能独立开聊天室,强制使用父任务的 dialog_id + - 任务删除不会自动删除聊天室 + - 复制任务会重置 dialog_id,新任务有自己的全新聊天室 +last_verified: v1.7.90 +--- + +# 任务聊天室(dialog_id) + +## 定义 +DooTask 每个**主任务**可以拥有一个独立聊天室(`dialog_id` 字段,对应 `WebSocketDialog` 表),用于负责人、协作者、可见用户在任务上下文中讨论。第一次打开任务对话区时按需创建,未启用前 dialog_id 为 0。 + +## 入口 +- 桌面端:任务详情页 → 顶部「💬 任务对话」按钮 → 唤起侧边对话面板 +- 桌面端:左侧 [[messenger.group.howto.create]] 创建的群外,任务对话作为独立类型显示在「最近消息」列表 +- 移动端:任务详情页底部「💬」入口 + +## 谁能参与 +- 默认:负责人、协作者、可见用户均可读写 +- 不在 [[task.field.visibility.concept]] 命中的用户看不到聊天室 +- 项目管理员若不在任务可见范围内,也看不到对话 + +## 与「关联」的关系 +- 在任务聊天室里输入 `@#` 关联其他任务,会产生 [[task.related.concept]] 记录 +- 在群聊里 `@#` 关联到这个任务,产生反向关联(任务详情页能看到「相关消息」) + +## 删除联动 +- 任务被 [[task.delete-restore.howto]] 删除后,dialog_id 保留不清理 +- 恢复任务时,聊天室可继续使用,历史消息完整保留 + +## 不支持 +- 子任务(parent_id > 0)不能开独立聊天室 +- 任务对话不能与外部用户共享(必须是任务可见用户) +- 任务对话不能匿名 / 不能开私聊模式(始终多人) diff --git a/resources/ai-kb/zh/concept/task/flow.md b/resources/ai-kb/zh/concept/task/flow.md new file mode 100644 index 000000000..d49eaed59 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/flow.md @@ -0,0 +1,54 @@ +--- +id: task.flow.concept +title: 任务工作流(自定义流程状态) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务工作流 + - 自定义状态 + - 流程 + - 待办进行中完成 + - 工作流视图 +related_tools: [update_task, get_project] +related_pages: [task_detail, project_settings] +prerequisites: + - 项目开启了工作流(在项目设置启用) +negative: + - 工作流最多 10 个状态 / 流程 + - 工作流状态绑定 column_id 时,拖列联动改 flow_item_id;不绑定时各自独立 + - 工作流的 status=end 节点会自动标记 complete_at,无法关闭这一联动 +last_verified: v1.7.90 +--- + +# 任务工作流(自定义流程状态) + +## 定义 +DooTask 工作流由 `ProjectFlow`(一个项目可有多套)+ `ProjectFlowItem`(每个流程节点)实现。常见用法是把任务从「待办 → 设计 → 开发 → 测试 → 上线」自定义为多个流转节点,比"完成 / 未完成"二值粒度更细。 + +## 关键字段(ProjectFlowItem) +- `name`:节点名(如「待开发」) +- `status`:节点类型,`start` 起点 / `end` 终点 / 其他普通节点 +- `turns`:可流转到的节点 id 列表(流转规则) +- `userids`:节点负责人(限制只有这些人可以操作进入此节点) +- `usertype`:流转模式(如限制只能由当前负责人流转) +- `color`:节点色块(看板视图色条) +- `columnid`:可绑定到具体项目列,拖列时联动改 flow_item_id + +## 任务上的字段 +任务存 `flow_item_id` + `flow_item_name`,前端用此显示当前所处节点。 + +## 与「列」(column_id)的关系 +- 列只是看板的物理分栏,与状态不一定一一对应 +- 启用工作流后,看板视图按 `column_id` 分组,工作流视图按 `flow_item_id` 分组 +- 节点配 `columnid` 时,拖列与改状态联动;不配则独立 + +## status=end 的特殊行为 +- 拖任务到 status=end 的节点 → `complete_at` 自动写入 → 任务被标记完成 +- 拖回非 end 节点 → complete_at 不会自动清空(除非显式取消完成) + +## 不支持 +- 单流程不能超过 10 个节点(最多 10 节点) +- 不能跨项目共享工作流 +- 工作流配置改名 / 改色不会回填历史任务的 flow_item_name 快照 diff --git a/resources/ai-kb/zh/concept/task/notify.md b/resources/ai-kb/zh/concept/task/notify.md new file mode 100644 index 000000000..e916b2e43 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/notify.md @@ -0,0 +1,51 @@ +--- +id: task.notify.concept +title: 任务提醒推送(即将超时 / 已超时) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务提醒 + - 任务推送 + - 任务到期通知 + - 任务超期提醒 + - 任务快到截止时间会提醒吗 + - 任务收不到通知怎么办 +related_tools: [update_task] +related_pages: [task_detail, user_settings] +prerequisites: + - 管理员已在「APP 推送」设置中开启推送(appPushSetting) +negative: + - 没有 end_at(截止时间)的任务不会推送即将超时 / 已超时提醒 + - 管理员未开启「APP 推送」设置时,到期 / 超期定时提醒整体不发送 + - 不能为单条任务自定义提醒提前量,统一为到期前约 1 小时 +last_verified: v1.7.90 +--- + +# 任务提醒推送(即将超时 / 已超时) + +## 定义 +任务到期提醒由「任务提醒」机器人(task-alert)通过私聊发送模板消息。推送记录在 `ProjectTaskPushLog` 表,按 `type` 区分: + +- `0` — 新任务(被分配时) +- `1` — 任务**即将超时**(截止时间 end_at 前约 1 小时) +- `2` — 任务**已超时**(end_at 过后约 1 小时,且任务未完成) +- `3` — 任务时间被修改 + +即将超时 / 已超时两类按用户 + 任务去重,避免重复推送。 + +## 触发条件 +- 任务必须设置截止时间 `end_at` +- 管理员需在管理员应用「APP 推送」中开启推送(未开启则定时提醒不运行) +- 后端定时任务扫描命中后,向任务负责人 + 协助人发送,文案如「您负责的任务即将超时」「您协助的任务已经超时」 + +## 推送渠道 +- **站内消息**:「消息」列表中 task-alert「任务提醒」机器人的私聊会话 +- **桌面端**:经 Electron 系统通知弹出 +- **移动端**:离线 / 后台用户经 UMENG(友盟)推送触达,见 [[mobile-client.notify.concept]] + +## 不支持 +- 不能为单条任务自定义提醒时间偏移(如「提前 2 小时」),固定为到期前约 1 小时、超期后约 1 小时各提醒一次 +- 不能给非负责人 / 非协助人推送 +- 已完成或已归档的任务不再推送 diff --git a/resources/ai-kb/zh/concept/task/owner-assist.md b/resources/ai-kb/zh/concept/task/owner-assist.md new file mode 100644 index 000000000..460081663 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/owner-assist.md @@ -0,0 +1,58 @@ +--- +id: task.field.owner-assist.concept +title: 负责人与协作者 +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务负责人 + - 协作者 + - assist + - owner + - 任务参与人 +related_tools: [update_task, get_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 一个任务必须至少有一个负责人,不能"无主" + - 协作者不能完成任务,只有负责人能(或有 TASK_UPDATE 权限的项目角色) + - 负责人 / 协作者不会自动获得评论权限以外的项目权限 +last_verified: v1.7.90 +--- + +# 负责人与协作者 + +## 定义 +DooTask 通过 `ProjectTaskUser` 表维护任务参与人:每条记录 `userid + owner`: +- `owner=1` — **负责人** +- `owner=0` — **协作者**(assist) + +一个任务允许多个负责人(多 owner=1)和多个协作者,但每个任务必须至少 1 个负责人。 + +## 权限差异 + +| 行为 | 负责人 | 协作者 | +|---|---|---| +| 编辑字段 | ✓ | 仅评论 / 查看 | +| 标记完成 | ✓ | ✗ | +| 增删子任务 | ✓ | ✗ | +| 删除任务 | ✓ | ✗ | +| 接收提醒推送 | ✓ | ✓ | +| 出现在「我的任务」列表 | ✓ | ✓ | + +## 关系 +- 添加负责人 / 协作者只能从「项目成员」中选;不在项目的用户会被服务端自动加入项目 +- 即使用户离开了项目,已分配的任务关系保留(任务详情页仍显示) +- 删除用户时,名下任务的 owner 会被转给操作人或项目负责人 + +## 与可见性的关系 +- 不论 visibility 设几,负责人 / 协作者**总是可见**该任务 +- visibility=2「任务人员可见」就是只让 ProjectTaskUser 表内的人能看 +- visibility=3 时,可见人 = 负责人 + 协作者 + 额外 ProjectTaskVisibilityUser + +详细可见性见 [[task.field.visibility.concept]]。 + +## 不支持 +- 不能"匿名分配" +- 不能为协作者单独设权限粒度(如允许改截止时间但不允许改名称) diff --git a/resources/ai-kb/zh/concept/task/priority.md b/resources/ai-kb/zh/concept/task/priority.md new file mode 100644 index 000000000..66673c5ad --- /dev/null +++ b/resources/ai-kb/zh/concept/task/priority.md @@ -0,0 +1,51 @@ +--- +id: task.field.priority.concept +title: 任务优先级 +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务优先级 + - 紧急程度 + - 怎么设优先级 + - 高优先级标记 + - 重要任务怎么标 +related_tools: [update_task, create_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 优先级数据是全局共享的,不能按项目独立配置(除非用 [[task.field.color.concept]] 单独覆盖) + - 普通用户无法新增 / 修改优先级枚举,仅可选择 + - 优先级与排序无关,不会自动让高优先级冒泡到列首 +last_verified: v1.7.90 +--- + +# 任务优先级 + +## 定义 +DooTask 任务的优先级(priority)记录任务的紧急 / 重要程度。每个任务存三个字段 `p_level`(数值)、`p_name`(名称)、`p_color`(颜色),三者冗余存储,避免全局配置变更影响历史任务。 + +## 数据来源 +全局 `settings` 表的 `priority` JSON 数组定义可选项,每条含: +- `name`:显示名(如「紧急」「重要」「普通」「低」) +- `priority`:数值(用于 `p_level`) +- `color`:色块(用于 `p_color`) +- `is_default`:是否默认 + +新建任务(仅父任务)时,若未指定优先级,服务端会自动套用 `is_default=1` 的配置。 + +## 在哪里能看到 +- 任务卡片左侧色条 +- 任务详情页右上角徽标 +- 列表视图的「优先级」列 +- 看板视图卡片顶部色块 + +## 修改方式 +- 任务详情页 → 优先级下拉 → 选另一个枚举 +- 服务端写入 `p_level`、`p_name`、`p_color` 三字段一致 + +## 不支持 +- 项目级不能独立定义优先级枚举 +- 修改全局优先级配置后,已存在任务不会回填新名 / 新色,需手动重新选 +- 子任务优先级不随父任务联动:子任务也支持优先级,但默认与父任务无关联,需单独设置 diff --git a/resources/ai-kb/zh/concept/task/related.md b/resources/ai-kb/zh/concept/task/related.md new file mode 100644 index 000000000..6ea9cf77a --- /dev/null +++ b/resources/ai-kb/zh/concept/task/related.md @@ -0,0 +1,55 @@ +--- +id: task.related.concept +title: 任务关联(消息提及 / 任务 ↔ 任务) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务关联 + - 关联任务 + - 任务引用 + - 任务 mention + - 怎么把任务挂另一条任务 +related_tools: [get_task, send_message] +related_pages: [task_detail, messenger] +prerequisites: [] +negative: + - 关联是平级的,不会形成父子层级(要拆层级用 [[task.subtask.concept]]) + - 删除任意一方任务不会自动删除关联记录 + - 关联不带过去字段数据(不是软链接,只是关系记录) +last_verified: v1.7.90 +--- + +# 任务关联(消息提及 / 任务 ↔ 任务) + +## 定义 +DooTask 用 `ProjectTaskRelation` 表记录两类关联: +- **消息 ↔ 任务**:在对话里 `@#` 任务卡片,会产生 `direction = mention`(消息提及任务)或 `mentioned_by`(任务被消息提及)的双向记录,绑定 `dialog_id` + `msg_id` +- **任务 ↔ 任务**:任务详情页「关联任务」区也走同一张表,但 dialog_id / msg_id 为空 + +每条记录保存 `task_id`、`related_task_id`、`direction`、`userid`。 + +## 与「子任务」的区别 + +| 维度 | 子任务(parent_id) | 关联任务(ProjectTaskRelation) | +|---|---|---| +| 层级 | 父子 | 平级 | +| 跨项目 | ✗ | ✓ | +| 删除联动 | 父删则子级联软删 | 两边互不影响 | +| 完成度统计 | 父任务显示「X/Y」 | 不统计 | +| 数量限制 | 父最多 50 子 | 无硬上限 | + +## 入口 +- 桌面端:任务详情页 → 「关联任务」字段 → 「+」搜索其他任务 +- 在对话里输入 `@#` 选任务:详见 [[task.create.howto.via-mention]] + +## 在哪里能看到 +- 任务详情页底部「相关消息」区(来自 dialog mention) +- 任务详情页「关联任务」区(来自任务详情页直接关联) +- 关联任务双向显示:A 关联 B 后,B 那边也看到 A + +## 不支持 +- 关联不产生权限继承 +- 关联不会发通知给被关联任务的负责人 +- 不能给关联打标签 / 写说明(单纯的关系记录) diff --git a/resources/ai-kb/zh/concept/task/subtask-limits.md b/resources/ai-kb/zh/concept/task/subtask-limits.md new file mode 100644 index 000000000..b4fe7724b --- /dev/null +++ b/resources/ai-kb/zh/concept/task/subtask-limits.md @@ -0,0 +1,54 @@ +--- +id: task.subtask.limits.concept +title: 子任务的限制(嵌套 / 数量 / 跨项目) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 子任务限制 + - 子任务能嵌套吗 + - 子任务多少个 + - 子任务能跨项目吗 + - 子任务不支持什么 +related_tools: [create_sub_task, get_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 子任务最多 1 层(不能在子任务下再建子任务) + - 单个父任务最多 50 个子任务 + - 子任务不能跨项目(强制与父任务同 project_id) +last_verified: v1.7.90 +--- + +# 子任务的限制(嵌套 / 数量 / 跨项目) + +## 定义 +DooTask 子任务(subtask)通过 `parent_id` 字段实现,是任务的一种特殊形态。设计上为了保持父子模型简单,加了若干硬限制;这一篇专门解释这些限制及其原因,避免 AI 助手在用户问"为什么不行"时编造答案。 + +## 嵌套层级:最多 1 层 +- 子任务的 parent_id 必须指向**主任务**(parent_id=0) +- 子任务自身的 parent_id 不能再被作为另一个任务的 parent +- 想表达更深层级用 [[task.related.concept]](关联),或按业务拆多个独立任务 + +## 数量上限:50 / 父 +- 单个父任务最多挂 50 个子任务 +- 达到上限后服务端会拒绝继续新增 +- 想"分批管理"可以归档([[task.archive.howto]])已完成的子任务腾位置 + +## 跨项目:禁止 +- 子任务自动继承 `project_id`、`column_id`、可见性、对话归属 +- 不能把子任务移到别的项目 +- 跨项目协作请用关联任务而不是子任务 + +## 不支持的子任务功能 +- 子任务无独立 `dialog_id`(任务聊天室) +- 子任务无独立 `file_num`(不能直接上传附件,需挂在父任务) +- 子任务不支持 `loop` 重复 +- 子任务不能单独配置 visibility,强制继承父任务 + +## 父子联动 +- 父任务删除 → 子任务级联软删 +- 父任务归档 → 子任务自动归档(archived_follow=1) +- 父任务跨项目移动 → 子任务一起走 +- 父任务完成 → **不会**自动完成子任务,需要手动逐个完成 diff --git a/resources/ai-kb/zh/concept/task/subtask.md b/resources/ai-kb/zh/concept/task/subtask.md new file mode 100644 index 000000000..5759f251c --- /dev/null +++ b/resources/ai-kb/zh/concept/task/subtask.md @@ -0,0 +1,45 @@ +--- +id: task.subtask.concept +title: 子任务是什么 +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 子任务 + - 任务拆分 + - 父子任务 + - 怎么拆任务 + - 子任务有什么用 +related_tools: [create_sub_task, get_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 子任务仅支持 1 层(不能在子任务下再建子任务) + - 子任务不能跨项目(必须与父任务在同一个项目) + - 父任务完成不会自动完成所有子任务,需要单独操作 +last_verified: v1.7.90 +--- + +# 子任务是什么 + +## 定义 +子任务是挂在某个父任务下的下级任务,用于把一个较大的工作拆分成多个可独立分配、独立完成的小步骤。父子关系通过 `parent_id` 维护,每个子任务都是一个独立的任务实例,可以有自己的负责人、截止时间、状态。 + +## 关键属性 +- **从属关系**:每个子任务必须有一个父任务;删除父任务会同时删除所有子任务 +- **独立性**:子任务有自己的状态、负责人、协作者、截止时间,与父任务互不影响 +- **可见性**:子任务的可见用户继承父任务设置(不能单独配置) +- **完成度**:父任务详情页会显示「子任务 X/Y」,X = 已完成数,Y = 总数 + +## 使用场景 +- 拆分大功能为多个开发步骤(前端 / 后端 / 测试 / 上线) +- 将复杂请求分配给团队不同成员 +- 在一个任务卡片里管理多个相关动作 + +## 与「关联任务」的区别 +- **子任务**:父子层级,从属关系;父任务删除则子任务全删 +- **关联任务**:平级引用,互不从属;删除任一方另一方不变(只是关联消失) + +## 创建方式 +进入任务详情页 → 「子任务」区 → 「+ 新增子任务」→ 输入名称 → 回车。 diff --git a/resources/ai-kb/zh/concept/task/tag.md b/resources/ai-kb/zh/concept/task/tag.md new file mode 100644 index 000000000..3d8217da0 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/tag.md @@ -0,0 +1,56 @@ +--- +id: task.field.tag.concept +title: 任务标签(项目内独立) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务标签 + - 任务 tag + - 任务分类 + - 怎么给任务打标签 + - 项目标签管理 +related_tools: [update_task] +related_pages: [task_detail, project_settings] +prerequisites: [] +negative: + - 任务标签按项目隔离,不能跨项目共享 + - 单个任务最大标签数 10 个 + - 标签名最长 20 字符 +last_verified: v1.7.90 +--- + +# 任务标签(项目内独立) + +## 定义 +DooTask 任务标签分两类: +- **临时标签**(ProjectTaskTag 表):在任务详情页直接输入产生,记录 `name + color`,无独立 id,按 project_id 绑定 +- **项目级预定义标签**(ProjectTag 表):在项目设置里统一管理的标签,有 id、可排序、可重命名,所有任务共用同一份 + +两者都按 project_id 隔离,**不跨项目共享**。 + +## 在哪里能看到 +- 任务卡片底部彩色小圆点 / 标签条 +- 任务详情页「标签」字段 +- 看板视图任务卡上的标签色块 + +## 添加方式 +- 任务详情页 → 「标签」字段 → 输入名称: + - 命中项目级标签 → 复用 + - 未命中 → 作为临时标签新建 +- 项目设置 → 「标签管理」可统一新增 / 改色 / 排序 + +## 项目级 vs 临时 +| 维度 | 项目级标签 | 临时标签 | +|---|---|---| +| 有独立 id | 是 | 否 | +| 可排序、改色 | 是 | 否 | +| 删除影响 | 解除关联但任务标签不消失(会降级为临时标签) | 仅当前任务 | +| 跨项目复用 | 否 | 否 | + +## 不支持 +- 标签不跨项目共享(每个项目独立维护) +- 单个任务不能超过 10 个标签 +- 标签名不能超过 20 字符 +- 没有全局标签,没有用户私人标签 diff --git a/resources/ai-kb/zh/concept/task/visibility.md b/resources/ai-kb/zh/concept/task/visibility.md new file mode 100644 index 000000000..d00363280 --- /dev/null +++ b/resources/ai-kb/zh/concept/task/visibility.md @@ -0,0 +1,52 @@ +--- +id: task.field.visibility.concept +title: 任务可见性(3 级) +type: concept +feature: task +scope: end-user +locale: zh +aliases: + - 任务谁能看 + - 任务可见范围 + - 任务保密 + - 仅自己可见 + - 指定成员可见 +related_tools: [update_task, get_task] +related_pages: [task_detail] +prerequisites: [] +negative: + - 子任务不能单独设置可见性,强制继承父任务 + - 可见性只控制「能不能看到这个任务」,不控制评论、附件的二级权限 + - 项目管理员不会自动看到 visibility=2/3 的任务,除非被加入任务人员 +last_verified: v1.7.90 +--- + +# 任务可见性(3 级) + +## 定义 +DooTask 任务的可见性字段 `visibility` 取 3 个值: +- `1` — **项目人员可见**(默认):项目中所有成员都能看到 +- `2` — **任务人员可见**:仅负责人、协作者可见 +- `3` — **指定成员可见**:负责人、协作者 + 显式加入「可见用户」列表的人可见 + +## 数据来源 +- visibility=3 时,额外维护 `ProjectTaskVisibilityUser` 表,记录每个可见用户的 userid +- visibility 改回 1 / 2 时,可见用户记录会被清空 + +## 修改入口 +- 任务详情页 → 「可见性」下拉 +- 创建任务时也可在对话框里设置 + +## 子任务的继承 +- 子任务的可见性强制等于父任务,无法在详情页单独切换 +- 父任务改可见性时,子任务的可见判断也实时跟着变 + +## 与归档、删除的关系 +- visibility 只决定「能不能看到任务」 +- 看到任务后能否编辑还需要看 TASK_UPDATE 权限 +- 归档、删除是独立状态,不受 visibility 控制 + +## 不支持 +- 子任务不能独立设置可见性 +- visibility 不能限制评论 / 附件单独可见 +- 不能按部门 / 角色批量授可见,必须逐人 diff --git a/resources/ai-kb/zh/concept/user-account/info.md b/resources/ai-kb/zh/concept/user-account/info.md new file mode 100644 index 000000000..8c5b0deee --- /dev/null +++ b/resources/ai-kb/zh/concept/user-account/info.md @@ -0,0 +1,65 @@ +--- +id: user-account.info.concept +title: 用户信息字段 +type: concept +feature: user-account +scope: end-user +locale: zh +aliases: + - 用户信息 + - 个人信息字段 + - 我的资料 + - userid + - identity + - 部门字段 +related_tools: [get_users_basic] +related_pages: [] +prerequisites: [] +negative: + - 邮箱(email)不能自助修改;如需换邮箱只能注销后重新注册([[user-account.delete.howto]]) + - 昵称必须 2-20 字;< 2 提示「昵称不可以少于2个字」,> 20 提示「昵称最多只能设置20个字」 + - 联系电话长度 6-20,且全系统不可重复 + - 个人简介 ≤ 500 字,地址 ≤ 100 字,职位 2-20 字 +last_verified: v1.7.90 +--- + +# 用户信息字段 + +## 定义 +DooTask 用户对象由 `api/users/info` 返回,包含账号、身份、个人资料三类字段。`info__departments` 单独返回当前用户的部门列表。 + +## 关键字段 +| 字段 | 含义 | 是否可改 | +|---|---|---| +| `userid` | 用户 ID(自增主键) | 否,注册即定 | +| `email` | 登录邮箱 | 否,自助不可改 | +| `nickname` | 昵称(2-20 字) | 是,editdata | +| `userimg` | 头像 URL | 是,editdata | +| `tel` | 联系电话(6-20,全局唯一) | 是,editdata | +| `profession` | 职位/职称(2-20 字) | 是,editdata | +| `birthday` | 生日(YYYY-MM-DD) | 是,editdata | +| `address` | 地址(≤ 100 字) | 是,editdata | +| `introduction` | 个人简介(≤ 500 字) | 是,editdata | +| `lang` | 界面语言(zh/en/...) | 是,editdata | +| `identity` | 身份标记数组(admin/ldap/temp/...) | 否,系统设定 | +| `department` | 所属部门 ID 数组 | 否,由管理员调整 | +| `department_name` | 部门名(拼接) | 否,由 department 推导 | +| `department_owner` | 是否默认部门下第一级负责人 | 否 | +| `managed_departments` | 可切换负责人视角的部门 | 否 | +| `last_ip` / `last_at` | 最近一次登录的 IP / 时间 | 自动写 | +| `line_ip` / `line_at` | 最近一次活跃 IP / 时间 | 自动写 | +| `login_num` | 登录次数 | 自动累加 | +| `changepass` | 是否需在下次登录强制改密码 | editpass 后清零 | +| `email_verity` | 邮箱是否已验证(1/0) | 邮箱验证后置 1 | + +## identity 常见值 +- `admin`:系统管理员 +- `ldap`:LDAP 同步过来的账号 +- `temp`:临时账号 +- `bot`:机器人账号 +- `system`:系统/演示账号(受保护) + +## 与「部门」的关系 +- 一个用户可属多个部门 +- `info__departments` 返回最多 10 个部门,且把「当前用户作为负责人的部门」排在最前 +- 部门管理在系统管理员的「团队管理 → 部门管理」中维护 diff --git a/resources/ai-kb/zh/concept/user-account/reg-need-invite.md b/resources/ai-kb/zh/concept/user-account/reg-need-invite.md new file mode 100644 index 000000000..a82e1991d --- /dev/null +++ b/resources/ai-kb/zh/concept/user-account/reg-need-invite.md @@ -0,0 +1,53 @@ +--- +id: user-account.reg-need-invite.concept +title: 注册是否需要邀请码 +type: concept +feature: user-account +scope: end-user +locale: zh +aliases: + - 邀请码 + - 注册邀请码 + - 是否需要邀请 + - 没有邀请码能注册吗 + - reg needinvite + - 怎么开邀请注册 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 邀请码与「邀请同事加入项目」是两回事;这里指的是系统级开放注册的密钥 + - 邀请码只有一个全局值,不区分用户、不限次数、不过期 + - 验证不通过会直接拒绝,没有「邀请码错了几次锁定」的限制 +last_verified: v1.7.90 +--- + +# 注册是否需要邀请码 + +## 定义 +DooTask 的注册方式由系统设置 `system.reg` 控制,共三档: + +| 取值 | 行为 | +|---|---| +| `open` | 任何人填邮箱+密码即可注册 | +| `invite` | 必须填正确的邀请码才能注册 | +| `close` | 完全关闭注册,登录页不显示注册入口 | + +## 邀请码是什么 +- 管理员在「系统设置 → 注册设置」中配置一个字符串作为 `reg_invite` +- 该字符串只有一个;所有想注册的人共用 +- 注册时把这个字符串填到「邀请码」字段提交,后端比对 `Request.invite == setting.reg_invite` + +## 接口判定 +前端可调 `api/users/reg/needinvite` 拿到 `{ need: true/false }`,据此决定登录页注册 tab 是否展示「邀请码」输入框: +- `need=true` → reg=invite,显示邀请码输入框 +- `need=false` → reg=open(reg=close 时注册入口本身就该隐藏) + +## 与「项目邀请加入」的区别 +- **本概念**:决定能否成为 DooTask 用户(账号级别) +- **项目邀请**:已是用户后,被加入某个项目(项目级别) +两者完全独立。系统管理员是注册阶段的守门人,项目负责人是项目阶段的守门人。 + +## 怎么修改 +- 系统管理员(userIsAdmin)→「系统设置」→「注册设置」→ 切换 reg 模式 / 修改 reg_invite 字符串 +- 修改即时生效,无需重启 diff --git a/resources/ai-kb/zh/concept/user-settings/privacy.md b/resources/ai-kb/zh/concept/user-settings/privacy.md new file mode 100644 index 000000000..1408b7571 --- /dev/null +++ b/resources/ai-kb/zh/concept/user-settings/privacy.md @@ -0,0 +1,60 @@ +--- +id: user-settings.privacy.concept +title: 隐私设置 +type: concept +feature: user-settings +scope: end-user +locale: zh +aliases: + - 隐私设置 + - 隐私政策 + - 注销账号 + - 删除帐号 + - 自助注销 + - 个人数据如何处理 + - 隐私在哪 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - DooTask 没有「资料对谁可见」「在线状态隐身」这类细粒度隐私开关;同租户成员之间默认互可见 + - 隐私政策入口只在 EEUI 移动端显示,桌面端通过页脚链接查看 + - 注销账号是不可逆操作,主数据会删除,被引用的内容(聊天/任务/评论)保留匿名记录 +last_verified: v1.7.90 +--- + +# 隐私设置 + +DooTask 在「个人设置」中聚合了与个人隐私相关的入口,主要面向移动端用户提供「隐私政策」「自助注销」等合规能力。 + +## 关键入口 + +- 桌面端:右上角头像 →「设置」→ 页脚链接「隐私政策」 +- 移动端 EEUI(自托管校验下):「我的」→「设置」→「隐私政策」「删除帐号」 +- 后端接口: + - 注销:`POST api/users/delete/account`(`type=warning` 预检 + `type=confirm` 执行) + - 隐私政策:`api/privacy`(HTML 页面) + +## 注销账号(删除帐号) + +两步流程: + +1. 进入「删除帐号」,输入当前邮箱 + 注销理由 +2. 校验方式二选一: + - 系统开启邮箱验证时:发送验证码(`UserEmailVerification` 场景 3) + - 未开启时:输入当前登录密码 +3. 系统先以 `type=warning` 做预检(防误触) +4. 再以 `type=confirm` 真正执行,调用 `User::deleteUser($reason)` + +## 注销后的数据处理 + +- 账户主资料、token、登录会话立即清除 +- 你创建的任务 / 项目 / 评论 / 聊天消息保留,发送者显示为「已注销用户」 +- 邮箱进入 30 天保护期,不可立刻被新账号重用(防身份冒认) + +## 不支持 + +- 不支持隐身登录 / 隐藏在线状态 +- 不支持细粒度「资料可见性」配置(成员之间互可见) +- 不支持注销后自助恢复,需联系系统管理员从备份恢复(仅限 30 天窗口期) +- 不支持仅注销单个工作区数据(一注销全删) diff --git a/resources/ai-kb/zh/concept/user-settings/shortcut.md b/resources/ai-kb/zh/concept/user-settings/shortcut.md new file mode 100644 index 000000000..43dfc13f9 --- /dev/null +++ b/resources/ai-kb/zh/concept/user-settings/shortcut.md @@ -0,0 +1,66 @@ +--- +id: user-settings.shortcut.concept +title: 键盘 / 快捷键设置 +type: concept +feature: user-settings +scope: end-user +locale: zh +aliases: + - 快捷键 + - 键盘设置 + - 改快捷键 + - 截图快捷键 + - 发送消息回车 + - Enter 发送 + - Cmd+Enter +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 「键盘设置」子页只在 Electron 桌面端与 EEUI 移动端显示,Web 端没有 + - 大部分快捷键固定不可改(仅截图键、发送行为可调) + - Web 浏览器 Cmd+S / Cmd+P 等会被浏览器吞掉,DooTask 不接管 +last_verified: v1.7.90 +--- + +# 键盘 / 快捷键设置 + +「键盘设置」是个人设置里的子页,用来查看 / 调整桌面端与移动端的快捷键、消息发送按钮行为。 + +## 入口 + +- 桌面端 Electron:右上角头像 →「设置」→「键盘设置」 +- 移动端 EEUI:「我的」→「设置」→「键盘设置」 +- Web 浏览器:无此入口 + +## 可调项 + +| 项 | 说明 | +|---|---| +| 截图快捷键 | Electron 全局快捷键最后一位字母可改:`Cmd/Ctrl + Shift + ` | +| 桌面端发送按钮 | `Enter 发送` 或 `Cmd/Ctrl + Enter 发送`(影响消息输入框换行行为) | +| 移动端发送按钮 | `button` 开启时键盘上发送键变换行,按 APP 内浮动发送按钮发消息 | + +## 固定快捷键(不可改) + +桌面端 Electron 下: + +| 操作 | 快捷键 | +|---|---| +| 下载内容 | Cmd/Ctrl + Alt/Option + L | +| AI 助手 | Cmd/Ctrl + I(需安装 AI 插件) | +| 新建任务 | Cmd/Ctrl + N | +| 新建项目 | Cmd/Ctrl + B | +| 新会议 | Cmd/Ctrl + J | +| 打开设置 | Cmd/Ctrl + , | + +## 字段默认值 + +- 截图键默认 `A` → 实际触发 `Cmd/Ctrl + Shift + A` +- 桌面端发送:默认 Enter 发送 +- 移动端发送:默认按浮动按钮(`button`) + +## 与其他模块的关系 + +- 快捷键改动只影响当前用户当前终端,不上云 +- 修改后立刻生效,无需重启 Electron diff --git a/resources/ai-kb/zh/concept/view/entry.md b/resources/ai-kb/zh/concept/view/entry.md new file mode 100644 index 000000000..5a2f0f38f --- /dev/null +++ b/resources/ai-kb/zh/concept/view/entry.md @@ -0,0 +1,46 @@ +--- +id: view.entry.concept +title: 项目视图概览(4 种) +type: concept +feature: view +scope: end-user +locale: zh +aliases: + - 项目有几种视图 + - 看板和列表有什么区别 + - 任务怎么换种方式看 + - 视图类型 + - 任务列表换样式 +related_tools: [list_tasks, get_project] +related_pages: [project_detail] +prerequisites: [] +negative: + - 视图选择记在 cacheParameter.menuType,按项目维度持久化(每个项目可不同) + - 移动端 / 触屏端不支持拖拽(看板、甘特图的拖动改状态在 touch 设备被禁用) + - 没有「日历视图」「卡片墙视图」等,4 种为全集 + - 工作流视图(workflow)不是顶部切换的项目视图,是设置项目工作流时的可视化弹窗 +last_verified: v1.7.90 +--- + +# 项目视图概览(4 种) + +## 定义 +DooTask 的项目详情页提供 4 种任务视图,用同一份任务数据按不同维度展现。视图切换不影响数据,只影响展示。当前视图持久化在 `cacheParameter.menuType`,每个项目独立记录。 + +## 4 种视图 +1. **看板视图(column / kanban)**:默认。任务按「列」(column_id)水平分栏展示,每张任务卡纵向排列;最像 Trello +2. **列表视图(table)**:按「我的 / 协助 / 未完成 / 已完成」分段,每段是表格行,列含名称、列表、优先级、负责人、到期时间 +3. **甘特图视图(gantt)**:横向时间轴展示任务的 start_at → end_at;用于查看排期与重叠 +4. **工作流视图(flow)**:按 `flow_item_id` 分栏,列对应工作流步骤(如「待评审 / 评审中 / 已通过」),通过顶部「工作流」筛选切入 + +## 桌面端视图切换器 +项目详情页右上角有 3 个图标按钮的切换条:列(看板)/ 表格(列表)/ 时间轴(甘特图)。 + +## 与"工作流分栏"的区别 +- 看板视图分栏 = 项目列(column,永久存在的列) +- 工作流分栏 = 任务的工作流步骤(flow_item,可单独切换显示) + +## 与"筛选"的关系 +- 视图:决定数据怎么排版 +- 筛选(顶部 Cascader):决定显示哪些任务 +- 两者正交:任意视图都能叠加筛选 diff --git a/resources/ai-kb/zh/concept/view/kanban.md b/resources/ai-kb/zh/concept/view/kanban.md new file mode 100644 index 000000000..d4473ca28 --- /dev/null +++ b/resources/ai-kb/zh/concept/view/kanban.md @@ -0,0 +1,48 @@ +--- +id: view.kanban.concept +title: 看板视图 +type: concept +feature: view +scope: end-user +locale: zh +aliases: + - 看板是什么 + - 项目看板 + - kanban + - 任务列分栏 + - 看板视图怎么用 +related_tools: [list_tasks, get_project] +related_pages: [project_detail] +prerequisites: [] +negative: + - 触屏 / 移动端禁用列与任务的拖拽(避免误触),需用任务详情页改 column_id + - 部门只读模式(department_readonly)下看板所有编辑操作被禁用 + - 一个项目至少要有一个列,删完全部列后无法新建任务 +last_verified: v1.7.90 +--- + +# 看板视图 + +## 定义 +看板视图是 DooTask 项目详情页的默认视图(menuType='column')。任务按「列」(column)水平分栏,每张任务卡按时间或优先级在列内纵向排列。整体类似 Trello 的卡片式工作流。 + +## 关键属性 +- **列(column)**:项目级配置,由项目负责人 / 管理员维护;每条任务必属于一个列(task.column_id) +- **任务卡**:显示任务名 / 工作流状态 / 负责人头像 / 截止时间 / 标签 +- **新增任务入口**:每列标题旁的「+」可在该列顶部新建 +- **拖拽**:把任务卡拖到另一列即改 column_id(在桌面端非触屏时启用) + +## 看板列的管理 +- 新增列:详见 [[view.kanban.howto.add-column]] +- 改色:列标题「···」→ 选预设颜色,详见 [[view.kanban.howto.column-color]] +- 重命名 / 删除:列标题「···」菜单 +- 拖动列顺序:抓住列头横向拖(桌面端) + +## 与"工作流状态"的关系 +- 列(column)是项目层面的固定分栏 +- 工作流状态(flow_item)是任务自身的可流转字段 +- 看板视图的"列"始终是 column,不会按 flow_item 分栏;按 flow_item 分栏走「工作流」筛选 + +## 完成 / 隐藏 +- 顶部「显示已完成」开关控制是否在每列展示已完成任务(默认隐藏) +- 项目设置可配置自动归档:完成 N 天后自动从看板移出 diff --git a/resources/ai-kb/zh/concept/web-client/compatibility.md b/resources/ai-kb/zh/concept/web-client/compatibility.md new file mode 100644 index 000000000..a7271fbeb --- /dev/null +++ b/resources/ai-kb/zh/concept/web-client/compatibility.md @@ -0,0 +1,54 @@ +--- +id: web-client.compatibility.concept +title: 网页端浏览器兼容性 +type: concept +feature: web-client +scope: end-user +locale: zh +aliases: + - 支持什么浏览器 + - 浏览器版本要求 + - IE 能用吗 + - Safari 能用吗 + - 兼容性 + - 用什么浏览器最好 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不支持 IE 全系列(IE 11 及以下) + - 不支持 Edge Legacy(基于 EdgeHTML 内核的旧 Edge) + - 不支持 QQ 浏览器 X5 内核的兼容模式(部分 ES2017+ 语法不识别) +last_verified: v1.7.90 +--- + +# 网页端浏览器兼容性 + +## 推荐浏览器 +DooTask 网页端基于 Vue 2 + Vite 构建,使用现代 ES 语法,**必须用支持 ES2017+ 的浏览器**。下表为推荐最低版本: + +| 浏览器 | 最低版本 | 备注 | +|---|---|---| +| Chrome | 90+ | 推荐,体验最完整 | +| Edge(Chromium) | 90+ | 推荐 | +| Firefox | 88+ | 支持 | +| Safari | 14+ | macOS 11+ / iOS 14+ 自带 | +| Opera | 76+ | 支持 | +| 国产双核浏览器 | 切换到「极速 / 高速」模式 | 使用 Chromium 内核 | + +## 不支持的浏览器 +- **IE 11 及以下**:不支持 ES Modules,所有 ES6+ 语法都不识别 +- **Edge Legacy**(2020 年前的旧 Edge,EdgeHTML 内核) +- **微信 / QQ / UC 内置浏览器**:部分功能可能异常(WebSocket、文件上传、富文本),建议改用桌面端 / App +- **QQ 浏览器 / 360 浏览器的「兼容模式」**:会强制使用 IE 内核 + +## 如何确认浏览器版本 +- Chrome:地址栏输入 `chrome://version` +- Edge:地址栏输入 `edge://version` +- Firefox:菜单 → 「帮助」→「关于 Firefox」 +- Safari:菜单栏 → 「Safari」→「关于 Safari」 + +## 浏览器太旧怎么办 +1. 升级到最新版本(大多数浏览器自动更新) +2. 换用 Chrome / Edge +3. 使用 [[electron-client.concept]] 桌面端(自带兼容的 Chromium 内核) diff --git a/resources/ai-kb/zh/concept/web-client/overview.md b/resources/ai-kb/zh/concept/web-client/overview.md new file mode 100644 index 000000000..8ba650347 --- /dev/null +++ b/resources/ai-kb/zh/concept/web-client/overview.md @@ -0,0 +1,50 @@ +--- +id: web-client.concept +title: 网页端是什么 +type: concept +feature: web-client +scope: end-user +locale: zh +aliases: + - 网页端 + - 网页版 + - web 版 + - 浏览器打开 + - 在网页上用 + - 不装客户端怎么用 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 网页端不能弹原生桌面通知,需要浏览器自身的「通知权限」授权 + - 网页端不支持系统托盘、开机自启、全局快捷键(这些是桌面端能力) + - 浏览器关闭标签页后会断开 WebSocket,需要重新打开 +last_verified: v1.7.90 +--- + +# 网页端是什么 + +## 定义 +网页端是 DooTask 的浏览器版本,直接通过浏览器访问部署的服务地址(如 `https://你的域名/`)即可使用,无需安装任何客户端。它和桌面端、移动端共用同一套后端 API 和数据。 + +## 关键属性 +- **无需安装**:打开浏览器访问域名即可登录 +- **跨平台**:Windows / macOS / Linux / Chromebook 任意系统的现代浏览器都能用 +- **实时同步**:通过 WebSocket 推送消息、任务变更 +- **功能最全**:所有产品功能(消息、任务、项目、视图、应用、AI 等)网页端都有 + +## 与其他终端的关系 +- **桌面端**:基于 Electron 套壳网页端,额外提供托盘、原生通知、全局快捷键,详见 [[electron-client.concept]] +- **移动端**:独立的 iOS / Android App(基于 EEUI),交互重做以适配触屏,详见 [[mobile-client.concept]] +- 三端数据完全互通,登录哪一端都看到一样的内容 + +## 何时选网页端 +- 临时机器上用 / 不方便装客户端 +- 内嵌到其他系统的 iframe 里 +- 仅做轻量查看,不需要后台常驻 + +## 不支持 +- 不支持原生桌面通知(必须用浏览器自带的通知 API,且需用户授权) +- 不支持系统托盘 / 最小化到托盘 +- 不支持全局快捷键(Cmd+I、Cmd+N 等仅在桌面端生效) +- 截图(桌面端有内置截图工具,网页端没有) diff --git a/resources/ai-kb/zh/concept/web-client/shortcut.md b/resources/ai-kb/zh/concept/web-client/shortcut.md new file mode 100644 index 000000000..16cffb488 --- /dev/null +++ b/resources/ai-kb/zh/concept/web-client/shortcut.md @@ -0,0 +1,54 @@ +--- +id: web-client.shortcut.concept +title: 网页端快捷键 +type: concept +feature: web-client +scope: end-user +locale: zh +aliases: + - 网页快捷键 + - 浏览器快捷键 + - 网页版热键 + - 怎么用键盘操作 + - 网页里的快捷键 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 网页端不能注册全局快捷键,只在 DooTask 网页处于前台时生效 + - 截图、全局唤起等系统级快捷键仅桌面端有,见 [[electron-client.shortcut.concept]] + - 浏览器自身快捷键(Cmd+T 新建标签、Cmd+W 关闭标签)优先生效,DooTask 不能拦截 +last_verified: v1.7.90 +--- + +# 网页端快捷键 + +## 应用内键盘操作 +网页端的快捷键只在 DooTask 标签页处于焦点状态时生效。下表的 `Mod` 代表 macOS 的 `Command` 或 Windows / Linux 的 `Ctrl`。 + +| 操作 | macOS | Windows / Linux | +|---|---|---| +| 富文本:加粗 | Cmd + B | Ctrl + B | +| 富文本:斜体 | Cmd + I | Ctrl + I | +| 富文本:撤销 | Cmd + Z | Ctrl + Z | +| 富文本:重做 | Cmd + Shift + Z | Ctrl + Y | +| 表单 / 弹窗:提交 | Enter(聊天框可在设置中切换) | Enter | +| 弹窗:取消 | Esc | Esc | +| 消息发送 | Enter(默认) | Enter(默认) | +| 消息换行 | Shift + Enter | Shift + Enter | + +## 发送按钮模式 +聊天框可在「个人设置 → 键盘」切换发送方式: +- `Enter` 模式:Enter 发送、Shift+Enter 换行(默认) +- `Mod+Enter` 模式:Cmd/Ctrl+Enter 发送、Enter 换行 + +## 不在网页端的快捷键 +以下为桌面端独占(需要操作系统级注册): +- `Cmd/Ctrl + I` 唤起 AI 助手 +- `Cmd/Ctrl + N` 新建任务 +- `Cmd/Ctrl + B` 新建项目 +- `Cmd/Ctrl + J` 新建会议 +- `Cmd/Ctrl + ,` 打开设置 +- 截图快捷键(用户自定义) + +要使用上述快捷键请安装 [[electron-client.concept]] 桌面端。 diff --git a/resources/ai-kb/zh/faq/.gitkeep b/resources/ai-kb/zh/faq/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/faq/ai-assistant/disabled.md b/resources/ai-kb/zh/faq/ai-assistant/disabled.md new file mode 100644 index 000000000..09e878b0c --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/disabled.md @@ -0,0 +1,68 @@ +--- +id: ai-assistant.disabled.faq +title: 我看不到 AI 助手入口 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 找不到 AI + - AI 浮按钮没有 + - 没有 AI 助手 + - 我的 DooTask 没 AI + - AI 入口消失 + - 别人有 AI 我没有 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 普通用户无法自助开通 AI,必须由系统管理员开 + - 浮按钮 / 快捷键 / 全局「+」菜单都依赖同一个 ai 插件标识 + - 不同部署的 DooTask 是否带 AI 取决于管理员决定 +last_verified: v1.7.90 +--- + +# 我看不到 AI 助手入口 + +## 问题 +- 屏幕右下角没有 AI 浮按钮 +- 按 Cmd+I / Ctrl+I 没反应 +- 右上角全局「+」菜单里没有「AI 助手」项 +- 同事的 DooTask 有 AI,自己的没有 + +## 常见原因 + +### 1. AI 插件未安装(最常见) +- AI 助手是**微应用 / 系统插件**,需在「应用市场」安装 `ai` 插件 +- 前端通过 `microAppsIds.includes('ai')` 决定是否显示入口;没装则所有 AI 入口都不渲染 + +### 2. 管理员关闭了 AI 模型 +- 即使 ai 插件已装,系统设置 →「AI 模型」未启用任何服务商 +- 浮按钮可能仍显示,但模型下拉为空、无法发送,详见 [[ai-assistant.model-empty.faq]] + +### 3. License 限制 +- 部分 DooTask 部署的 License 不含 AI 模块 +- ai 插件不出现在应用市场可装列表 + +### 4. 老缓存 +- 前端 `microAppsIds` 陈旧;刚装好但旧 tab 没刷新 +- 解决:强制刷新(Ctrl+F5) + +### 5. 路由是登录页 +- 浮按钮明确排除登录页(`routeName !== 'login'`) +- 登录后再看 + +## 解决 +1. **联系系统管理员**:到「应用市场」安装并启用 `ai` 插件 +2. **管理员配 AI 模型**:在系统设置 →「AI 模型」开启至少一个服务商 +3. **强制刷新**:Ctrl+F5 / Cmd+Shift+R 重新拉 `microAppsIds` +4. **重启容器(管理员)**:刚装完插件可能需重启 ai 容器 + +## 如何区分原因 +- 入口**完全不显示**(连浮按钮都没)→ ai 插件未装 +- 入口能看到但下拉空 → 模型未配,详见 [[ai-assistant.model-empty.faq]] + +## 相关 +- [[ai-assistant.entry.howto]] +- [[ai-assistant.model-empty.faq]] +- [[ai-assistant.auth.concept]] diff --git a/resources/ai-kb/zh/faq/ai-assistant/mcp-down.md b/resources/ai-kb/zh/faq/ai-assistant/mcp-down.md new file mode 100644 index 000000000..660246ad5 --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/mcp-down.md @@ -0,0 +1,57 @@ +--- +id: ai-assistant.mcp-down.faq +title: AI 的 MCP 工具不可用 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - mcp 挂了 + - mcp_server 不可用 + - AI 全部工具不能用 + - AI 都不能操作 + - MCP 连接失败 + - AI 助手只能聊天不能动手 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 普通用户不能自助重启插件,需管理员 + - mcp_server 容器异常时所有 33 个 MCP 工具都不可用(包含页面操作) + - 不影响纯文本对话和知识库检索(search_help_docs 是 AI 容器内置) +last_verified: v1.7.90 +--- + +# AI 的 MCP 工具不可用 + +## 问题 +AI 浮窗能聊天但任何"做事"指令都失败: +- 浮窗顶部不显示工具图标 +- 让 AI 建任务 / 发消息 / 跳页面都没反应 +- 工具气泡显示「连接失败」「mcp_server unavailable」 + +## 原因 +- **mcp_server 插件未安装**:应用市场没装这个系统插件 +- **mcp_server 容器挂了**:宿主资源不足 / 配置错误导致容器退出 +- **WebSocket 不通**:反向代理 / 防火墙拦截了 `wss://.../apps/mcp_server/mcp/operation` 路径 +- **AI 模型配置缺工具能力**:管理员配模型时关了 tool 调用集成 + +## 解决(普通用户) +1. 先确认是不是只你一个人的问题:和同事对比 +2. 报给系统管理员,告知"mcp_server 不可用" +3. 等待恢复期间可改用: + - 手动用前端操作功能 + - 用 AI 做纯文本辅助(写文案 / 总结 / 翻译) + - 知识库检索(`search_help_docs` 不依赖 mcp_server,仍可用) + +## 解决(管理员) +1. 应用市场 → 找到 `mcp_server` → 看运行状态 +2. 没安装 → 安装 +3. 已安装但状态异常 → 重启该插件 +4. 长期失败 → 看插件日志(容器 docker logs)排查 +5. 反向代理:确保 wss 路径未被拦 + +## 相关 +- 工具失败:[[ai-assistant.tool-failed.faq]] +- 没调工具:[[ai-assistant.no-tool-call.faq]] +- 工具机制:[[ai-assistant.tools.concept]] diff --git a/resources/ai-kb/zh/faq/ai-assistant/model-empty.md b/resources/ai-kb/zh/faq/ai-assistant/model-empty.md new file mode 100644 index 000000000..68d0f8377 --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/model-empty.md @@ -0,0 +1,55 @@ +--- +id: ai-assistant.model-empty.faq +title: AI 助手模型下拉是空的 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 选不了模型 + - 模型下拉为空 + - 暂无可用模型 + - 没有可选 AI + - AI 不能发送 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 普通用户无法自助开通 / 配置模型,必须由系统管理员处理 + - 下拉空多数是后端配置层面的事,不是网络问题 + - DooTask 不自带任何免费内置模型 +last_verified: v1.7.90 +--- + +# AI 助手模型下拉是空的 + +## 问题 +打开 AI 助手浮窗后,**底部「选择模型」下拉框**为空,显示「暂无可用模型」或灰色禁用,按发送也无反应。 + +## 常见原因 + +1. **管理员没启用任何模型** + - 系统设置 → 「AI 模型」中所有服务商开关都关着,或未填 API Key +2. **AI 插件未安装** + - 应用市场没装 ai 插件;如果连入口都没有则属于 [[ai-assistant.disabled.faq]] +3. **API Key 失效** + - 管理员填了 Key 但已过期 / 余额耗尽,后端返回模型列表为空 +4. **接口请求失败** + - `GET api/assistant/models` 出错(鉴权失败、网络抖动),前端弹「获取模型列表失败」并自动关浮窗 +5. **管理员开了模型但没设默认** + - 极少数情况:模型列表为空数组 + +## 解决 + +1. **联系系统管理员**:到「系统设置 → AI 模型」开启至少一个服务商并填可用 API Key +2. **检查 ai 插件**:管理员到「应用市场」确认 ai 插件已装且未禁用 +3. **刷新页面**:关闭 AI 助手浮窗后重新打开,触发新一次 `api/assistant/models` +4. **看后台 ai-bot 日志**:管理员排查 dootask-ai 容器日志,确认上游 API 可达 + +## 与其他「AI 看不到」的区别 +- 下拉**空** = 管理员配置层面问题 +- AI 入口**完全看不到**(浮按钮 / 快捷键无效)= ai 插件未装,详见 [[ai-assistant.disabled.faq]] + +## 相关 +- [[ai-assistant.model.concept]] +- [[ai-assistant.disabled.faq]] diff --git a/resources/ai-kb/zh/faq/ai-assistant/no-tool-call.md b/resources/ai-kb/zh/faq/ai-assistant/no-tool-call.md new file mode 100644 index 000000000..2ef568d37 --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/no-tool-call.md @@ -0,0 +1,51 @@ +--- +id: ai-assistant.no-tool-call.faq +title: AI 应该调工具但没调 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 不调工具 + - AI 只说不做 + - AI 没操作 + - AI 没建任务 + - AI 干说 + - 让 AI 做事它只回答 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 选了纯文本模型时无论怎么提问都不会调工具 + - 即使支持 tool call 的模型也可能误判为"无需工具",需重提问引导 + - AI 不会暴露完整工具清单,让你逐个点选 +last_verified: v1.7.90 +--- + +# AI 应该调工具但没调 + +## 问题 +明明让 AI 帮忙建任务 / 发消息 / 跳页面,但 AI 只口头回答"好的,我会…"或"建议你…",并没有调用工具实际操作。 + +## 常见原因 +- **模型不支持 function calling**:选了纯文本模型 +- **mcp_server 插件未安装/挂掉**:工具列表为空 +- **意图不明确**:模型判断为闲聊,没决策需要工具 +- **管理员关闭了工具集成** +- **上下文超长**:会话累积过多,模型"忘了"工具能力 + +## 解决 +1. **换模型**:浮窗顶部切到「支持工具」的模型 +2. **明确指令**:换成动词命令"建任务"、"发消息"、"打开" +3. **加资源 ID**:给具体的项目名 / 任务 ID +4. **新开会话**:超长会话可能异常,重开试 +5. **检查 mcp_server**:让管理员看插件运行状态 + +## 例子 +- 不好:"小王任务这事跟一下" → AI 回复"建议您…" +- 好:"给小王在项目 X 新建任务:周五前回归测试" → AI 调 `create_task` + +## 相关 +- 工具机制:[[ai-assistant.tools.concept]] +- 工具列表:[[ai-assistant.tools-list.concept]] +- MCP 不可用:[[ai-assistant.mcp-down.faq]] diff --git a/resources/ai-kb/zh/faq/ai-assistant/tool-failed.md b/resources/ai-kb/zh/faq/ai-assistant/tool-failed.md new file mode 100644 index 000000000..941e7f20b --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/tool-failed.md @@ -0,0 +1,49 @@ +--- +id: ai-assistant.tool-failed.faq +title: AI 工具调用失败怎么办 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 调工具报错 + - tool_call failed + - AI 操作失败 + - AI 工具不响应 + - AI 卡在执行中 + - AI 调用超时 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 工具失败不会自动二次重试,需用户重新触发 + - 失败不会回滚已成功的工具(如已建任务再发消息失败,任务保留) + - 隐藏错误细节属正常,敏感字段不会暴露给用户 +last_verified: v1.7.90 +--- + +# AI 工具调用失败怎么办 + +## 问题 +浮窗里 AI 调工具的气泡显示「失败」「执行超时」「无权限」「找不到资源」等,回复也提示"没能完成"。 + +## 常见原因 +- **后端短时不可用**:`mcp_server` 容器重启 / 网络抖动 +- **权限不足**:操作了你没权限访问的资源(如别人的任务、非成员的项目) +- **参数错误**:AI 推断的 ID 不存在(如任务已被删) +- **超时**:单次工具调用默认 30 秒超时,长操作(大列表/复杂搜索)会断 +- **页面不在线**:页面工具(execute_action)需要前端 socket 在线,关浏览器后立刻调用会失败 +- **模型不支持 tool call**:选了纯文本模型,根本不会调 + +## 解决 +1. **重试**:浮窗里点工具气泡上的「重试」按钮,或回复"再试一次" +2. **换措辞**:原句太模糊就给更具体的 ID / 关键词 +3. **检查权限**:项目级问负责人加成员;任务级问任务负责人加可见用户 +4. **换模型**:选标注「支持工具」的模型,浮窗顶部切换 +5. **刷新页面**:页面动作失败时刷新一次后再让 AI 重试 +6. **联系管理员**:连续失败请通知管理员看 `mcp_server` 插件日志 + +## 相关 +- 工具机制:[[ai-assistant.tools.concept]] +- 权限不足:[[ai-assistant.tool-permission.faq]] +- MCP 不可用:[[ai-assistant.mcp-down.faq]] diff --git a/resources/ai-kb/zh/faq/ai-assistant/tool-permission.md b/resources/ai-kb/zh/faq/ai-assistant/tool-permission.md new file mode 100644 index 000000000..2b088aecc --- /dev/null +++ b/resources/ai-kb/zh/faq/ai-assistant/tool-permission.md @@ -0,0 +1,54 @@ +--- +id: ai-assistant.tool-permission.faq +title: AI 提示没权限操作怎么办 +type: faq +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 没权限 + - AI 提示权限不足 + - AI 不能改这个 + - AI 操作被拒 + - AI 看不到这个任务 + - AI 不能访问 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - AI 不能绕过 DooTask 权限体系,调工具同样走后端鉴权 + - 没有「AI 超级模式」开关,AI 的权限始终等同当前登录用户 + - 普通用户无法自助提权,必须由管理员或负责人调整 +last_verified: v1.7.90 +--- + +# AI 提示没权限操作怎么办 + +## 问题 +AI 工具调用气泡显示「无权限」「您不在可见用户列表」「不是项目成员」等错误,AI 回复说"无法帮您完成"。 + +## 原因 +AI 以你当前登录身份调用所有工具,后端的所有权限校验都生效: + +- **项目级**:非项目成员看不到/不能改项目内任务 +- **任务级**:任务设了可见用户白名单,名单外用户即使是项目成员也看不到 +- **角色级**:改项目设置 / 删列 / 改成员需要项目负责人或管理员 +- **系统级**:装插件 / 改系统设置 / 看导出 / 管理用户需要系统管理员(userIsAdmin) +- **超级管理员**:超管专属功能仅 id=1 的用户可用 + +## 解决 +1. 确认操作类型对应哪一级权限 +2. 联系对应角色补加权限: + - 项目级 → 联系项目负责人加你为成员或改角色 + - 任务级 → 联系任务负责人把你加入可见用户 + - 系统级 → 联系系统管理员 +3. 部分功能依赖插件已安装(如审批要 approve 插件) +4. 让 AI 换种方式(如不能 update_task 可改成 send_message 通知负责人改) + +## 怎么看自己的权限 +- 头像 → 「个人设置」可看部门 / 角色 +- 系统管理员 / 部门负责人身份会显示在右上角下拉菜单顶部 + +## 相关 +- 通用权限不足:[[role-permission.permission-denied.faq]] +- 工具调用失败:[[ai-assistant.tool-failed.faq]] diff --git a/resources/ai-kb/zh/faq/apps/.gitkeep b/resources/ai-kb/zh/faq/apps/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/faq/appstore/cannot-install.md b/resources/ai-kb/zh/faq/appstore/cannot-install.md new file mode 100644 index 000000000..1b71d1afb --- /dev/null +++ b/resources/ai-kb/zh/faq/appstore/cannot-install.md @@ -0,0 +1,62 @@ +--- +id: appstore.cannot-install.faq +title: 插件装不上怎么办 +type: faq +feature: appstore +scope: admin +locale: zh +aliases: + - 插件装不上 + - 应用安装失败 + - 装插件超时 + - 拉镜像失败 + - 应用商店打不开 + - 应用商店空白 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限和服务器 SSH 权限 +negative: + - 不是所有错误都能在 UI 里看到,多数要 SSH 上服务器看 docker 日志 + - 没有「自动重试」按钮,要手动卸载重装或修问题 +last_verified: v1.7.90 +--- + +# 插件装不上怎么办 + +## 问题 +点击「安装」后长时间停在「安装中」,或直接报错「安装失败」「拉取镜像失败」「容器启动失败」。 + +## 常见原因 +1. 网络问题:服务器拉不到 Docker 镜像(Docker Hub 限速 / 网络不通) +2. 镜像源问题:境内服务器没配镜像加速器 +3. 磁盘不足:宿主机 `df -h` 看是否 100% +4. 端口冲突:插件想用的端口被占 +5. 权限问题:`docker/appstore/` 目录不可写 +6. AppStore 微服务异常:appstore 容器本身挂了 +7. 已有同名 / 旧版本容器残留没清干净 + +## 解决 +按顺序排查: + +1. **看 AppStore 容器日志**:服务器 `docker logs appstore` 看具体错误 +2. **测试外网**:服务器 `docker pull hello-world` 验证 Docker 能拉镜像 +3. **配镜像加速器**:境内服务器在 `/etc/docker/daemon.json` 加 `registry-mirrors`,重启 docker +4. **看磁盘**:`df -h` 和 `docker system df`,必要时 `docker system prune -af` 清旧镜像 +5. **看端口**:插件 `docker-compose.yml` 中端口和 `netstat -tlnp` 对照 +6. **看权限**:`docker/appstore/` 目录应能被 docker 容器写入;按项目里 `dootask-fix-permission` 流程修 +7. **手动清理**:`docker ps -a | grep ` 找残留容器 → `docker rm -f` 删 → 再装 +8. **重启 AppStore**:`docker restart appstore`,再试 + +## 仍然不行 +- 看插件官方 README 是否有特殊要求(如最低主版本、特定环境变量) +- 联系插件作者 / 社区 +- 提 issue 时带上 `docker logs appstore` 和插件 `docker-compose.yml` + +## 不支持 +- 不支持纯 UI 操作排查(必须 SSH) +- 不支持安装与主程序版本不兼容的旧插件 + +## 相关 +- 安装流程:[[appstore.install.howto]] +- 入口:[[appstore.entry.menu-map]] diff --git a/resources/ai-kb/zh/faq/bot/permission.md b/resources/ai-kb/zh/faq/bot/permission.md new file mode 100644 index 000000000..f4b4713b2 --- /dev/null +++ b/resources/ai-kb/zh/faq/bot/permission.md @@ -0,0 +1,48 @@ +--- +id: bot.permission.faq +title: 机器人相关的权限问题 +type: faq +feature: bot +scope: end-user +locale: zh +aliases: + - 为什么删不了机器人 + - 系统机器人不能删 + - 机器人改不了 + - 不是你的机器人 + - 创建机器人提示超过最大数量 + - 修改别人的机器人 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 机器人权限由后端硬性判断,前端隐藏按钮不等于绕过校验 + - 没有「全局机器人管理员」角色,只有「系统机器人 → 管理员」「自建机器人 → 主人」两层 +last_verified: v1.7.90 +--- + +# 机器人相关的权限问题 + +## 问题 +操作机器人时弹出「不是你的机器人」「权限不足」「系统机器人不能删除」「超过最大创建数量」等。 + +## 原因 +机器人后端按所有权 + 类型校验(见 `bot__info` / `bot__edit` / `bot__delete`): + +- **自建机器人**:只有创建者(`user_bots.userid` 与当前用户一致)才能查看 / 改 / 删 +- **系统机器人**(`@bot.system` 邮箱):仅 `userIsAdmin` 可改昵称/头像;**任何人都不能删** +- **他人的自建机器人**:你不是主人则报「不是你的机器人」 +- **数量上限**:每个用户最多 50 个自建机器人,超出报「超过最大创建数量」 +- **名称长度**:机器人名 < 2 字符或 > 20 字符报「机器人名称由2-20个字符组成」 + +## 解决 +1. 想删自建机器人 → 必须用创建者本人账号,在「我的机器人」列表点「删除」并填写删除备注(≤ 255 字符) +2. 想改系统机器人 → 联系系统管理员;普通成员看得到但所有写操作都会被拦 +3. 想接管他人机器人 → 不支持,请让原主人 `/token` 取走凭证后给你,但 DooTask 自身没有「过户」功能 +4. 创建满 50 个 → 先删一些不用的;机器人删除会同时清掉关联会话 +5. 通过「机器人管理」(`bot-manager@bot.system`)单聊用 `/list` 看自己拥有哪些机器人 + +## 相关 +- 机器人三类的权限差异:[[bot.concept]] +- 内置机器人清单和它们的依赖插件:[[bot.system-list.concept]] +- 删除流程对应后端接口 `api/users/bot/delete` diff --git a/resources/ai-kb/zh/faq/calendar/ical-export.md b/resources/ai-kb/zh/faq/calendar/ical-export.md new file mode 100644 index 000000000..6e7e045af --- /dev/null +++ b/resources/ai-kb/zh/faq/calendar/ical-export.md @@ -0,0 +1,49 @@ +--- +id: calendar.ical.faq +title: 不支持 iCal 导出 / 外部日历订阅 +type: faq +feature: calendar +scope: end-user +locale: zh +aliases: + - iCal 订阅 + - 苹果日历同步 + - Google Calendar 同步 + - 日历导出 ics + - webcal 订阅 +related_tools: [] +related_pages: [calendar] +prerequisites: [] +negative: + - DooTask 当前版本不支持 iCal / webcal / Google Calendar 同步 + - 不能把 DooTask 日历嵌入 Outlook / Apple 日历 + - 没有 .ics 文件导出按钮 +last_verified: v1.7.90 +--- + +# 不支持 iCal 导出 / 外部日历订阅 + +## 问题 +想把 DooTask 日历的任务同步到 Apple Calendar / Google Calendar / Outlook / Thunderbird 等外部日历应用。 + +## 原因 +DooTask v1.7.90 还没有实现 iCal / webcal / .ics 文件相关接口: +- 无 `Calendar` HTTP endpoint 输出 .ics +- 无 webcal:// 订阅链接 +- 无 Google Calendar / Outlook OAuth 同步 +- 任务数据库结构也没有 `uid` 字段对应 iCal 标准 + +## 替代方案 +1. **看任务列表**:用 [[task.field.deadline.concept]] 字段在 DooTask 内的视图里看 +2. **任务导出 Excel**:项目级 [[project.export.howto]],得到 .xlsx 表,再自行转格式 +3. **桌面端通知**:用 DooTask 自己的桌面提醒([[task.notify.concept]])替代外部日历提醒 +4. **移动端 APP 推送**:UMENG 推送同样替代日历提醒 + +## 未来支持? +这块在 P1 / P2 路线图(issues 可能跟踪),但 v1.7.90 主线版本无计划。 + +## 不支持 +- 不支持 iCal 导出 / 订阅 +- 不支持 webcal:// 链接 +- 不支持与 Google / Outlook / Apple Calendar 双向同步 +- 不支持 Office 365 / Exchange 集成 diff --git a/resources/ai-kb/zh/faq/calendar/meeting-not-shown.md b/resources/ai-kb/zh/faq/calendar/meeting-not-shown.md new file mode 100644 index 000000000..f2be27325 --- /dev/null +++ b/resources/ai-kb/zh/faq/calendar/meeting-not-shown.md @@ -0,0 +1,53 @@ +--- +id: calendar.meeting-not-shown.faq +title: 为什么日历不显示会议 / 签到 / 报告 +type: faq +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历没会议 + - 会议不在日历 + - 日历看不到签到 + - 日历没工作报告 + - 日历事件不全 +related_tools: [list_tasks] +related_pages: [calendar, meeting] +prerequisites: [] +negative: + - 日历**仅显示任务**(ProjectTask),不显示会议、签到、报告 + - 这是设计行为,不是 BUG + - 没有"统一日历"功能合并所有时间线类内容 +last_verified: v1.7.90 +--- + +# 为什么日历不显示会议 / 签到 / 报告 + +## 问题 +打开 DooTask 日历,只看到自己负责的任务,没看到会议、签到打卡、工作报告。 + +## 原因 +DooTask 日历的数据源**只有 ProjectTask 一张表**: +- 会议保存在 `Meeting` 表(独立模块) +- 签到保存在 `Checkin` 表(独立模块) +- 工作报告保存在 `Report` 表(独立模块) + +这些表都不参与日历视图。日历视图聚焦"我自己时间安排"语义,会议 / 签到 / 报告各有自己的入口。 + +## 怎么看会议时间 +- 桌面端:左侧栏 → 「会议」 → 会议列表 +- 会议详情页能看到 start_at / end_at +- 未来想关注「我有什么会议」用 [[dashboard.concept]] 是不够的(仪表盘也不显示会议) + +## 怎么看签到打卡时间 +- 桌面端:左侧栏 → 「签到」(如启用了 checkin 应用) +- 签到记录按日列,与日历独立 + +## 怎么看工作报告 +- 桌面端:左侧栏 → 「工作报告」 +- 报告按发送 / 接收时间显示,与日历独立 + +## 不支持 +- 日历无法合并显示多个模块(任务 + 会议 + 签到 + 报告) +- 没有"统一时间线"视图 +- 不能在日历里直接建会议 / 签到 / 报告(详见 [[calendar.create.howto]] 只能建任务) diff --git a/resources/ai-kb/zh/faq/calendar/mobile-readonly.md b/resources/ai-kb/zh/faq/calendar/mobile-readonly.md new file mode 100644 index 000000000..bc5042cd2 --- /dev/null +++ b/resources/ai-kb/zh/faq/calendar/mobile-readonly.md @@ -0,0 +1,50 @@ +--- +id: calendar.mobile.faq +title: 移动端日历不能拖动 / 编辑 +type: faq +feature: calendar +scope: end-user +locale: zh +aliases: + - 手机日历改不了 + - 移动端拖不了任务 + - 日历手机版只读 + - 手机改任务时间 + - 移动端日历限制 +related_tools: [update_task] +related_pages: [calendar] +prerequisites: [] +negative: + - 移动端日历是设计成只读,不是 BUG + - 想在手机上改时间,必须进任务详情页 + - 移动端日历仅月视图,无周 / 日视图 +last_verified: v1.7.90 +--- + +# 移动端日历不能拖动 / 编辑 + +## 问题 +在手机版 DooTask 打开日历,看不到拖动手柄,也无法长按事件改时间。 + +## 原因 +DooTask 在移动端(`windowTouch=true`)把日历组件设置为 `is-read-only=true`,禁用所有拖动 / 编辑操作。原因: +- 手机屏幕小,拖动精度低,容易误操作 +- 触摸滑动手势与日历滚动冲突 +- 移动端任务详情页编辑更可靠 + +## 解决 +1. **改 end_at 的解决方案**:点开任务事件 → 进任务详情 → 编辑 [[task.field.deadline.concept]] 字段 → 保存 +2. **新建任务的解决方案**:移动端在「项目」Tab 进项目 → 「+ 新建任务」 → 填时间字段 +3. **想用拖动**:换桌面端([[calendar.drag.howto]]) + +## 移动端日历能做什么 +- 看月视图(无周 / 日切换) +- 点事件查看详情 +- 跳转到任务详情页 +- 上下滑动切换月份 + +## 不支持 +- 不能拖动改时间 +- 不能选区建任务([[calendar.create.howto]]) +- 不能切换周 / 日视图 +- 不支持时区切换 diff --git a/resources/ai-kb/zh/faq/checkin/face-fail.md b/resources/ai-kb/zh/faq/checkin/face-fail.md new file mode 100644 index 000000000..3e47e7ae4 --- /dev/null +++ b/resources/ai-kb/zh/faq/checkin/face-fail.md @@ -0,0 +1,41 @@ +--- +id: checkin.face-fail.faq +title: 人脸识别失败怎么办 +type: faq +feature: checkin +scope: end-user +locale: zh +aliases: + - 人脸识别失败 + - 刷脸不成功 + - 人脸录入失败 + - 上传人脸报错 + - 识别不到我的脸 +related_tools: [] +related_pages: [] +prerequisites: [] +last_verified: v1.7.90 +--- + +# 人脸识别失败怎么办 + +## 问题 +上传人脸图片或现场扫脸时报错,比如「设置失败」「上传出错」「未识别到人脸」「该应用未安装」等。 + +## 原因 +- **face 插件没装**:主程序调 face 容器 `http://face:7788/user` 调不通,会先抛 `请先安装 face` 异常 +- **face 容器没起来**:容器异常或镜像没拉成功(约 15MB+,首次安装慢) +- **签到方式没开人脸**:管理员未在「签到设置 → 签到方式」勾选「人脸签到」 +- **未开放上传**:管理员未在「签到设置 → 允许修改」开启「允许成员上传人脸图片」,提交会返回「未开放修改权限」 +- **图片质量差**:模糊 / 侧脸 / 多人 / 太暗 → 后端识别引擎拒绝入库 +- **现场设备问题**:人脸识别一体机离线、网络断、未对接到 face 容器 + +## 解决 +1. 联系管理员确认 face 插件已在应用市场安装 +2. 让管理员去「签到设置」开启「人脸签到」+「允许成员上传人脸图片」 +3. 重新上传一张**正面、光线均匀、单人、500x500 左右**的清晰照片 +4. 现场扫脸失败时换个角度 / 摘掉口罩 / 重启设备 +5. 若一直失败,临时改用 [[checkin.regular.howto]] 手动签到或 [[checkin.wifi.howto]] WiFi 签到 + +## 不支持 +- 主程序自己不做人脸比对,所有错误都从 face 插件返回;卸载 face 后人脸签到能力完全消失 diff --git a/resources/ai-kb/zh/faq/checkin/late.md b/resources/ai-kb/zh/faq/checkin/late.md new file mode 100644 index 000000000..41f6e9c6e --- /dev/null +++ b/resources/ai-kb/zh/faq/checkin/late.md @@ -0,0 +1,47 @@ +--- +id: checkin.late.faq +title: 漏签 / 迟到怎么补签 +type: faq +feature: checkin +scope: end-user +locale: zh +aliases: + - 漏签 + - 补签 + - 忘记打卡 + - 迟到了怎么办 + - 昨天没签到 + - 能不能补打卡 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 签到没有「申请补签」工单功能 + - 已生成的签到记录无法修改时间 + - 普通成员不能编辑 / 删除自己或他人的签到记录 +last_verified: v1.7.90 +--- + +# 漏签 / 迟到怎么补签 + +## 问题 +DooTask 签到没打上(漏签 / 迟到),日历上显示当天为空或时间不全,想知道怎么补救。 + +## 原因 +- **签到时间窗口外**:管理员配置了「最早可提前」「最晚可延后」分钟数,超出窗口的打卡会被拒 +- **MAC / 人脸未匹配**:WiFi 签到时 MAC 没绑或不在办公网 → [[checkin.mac-not-match.faq]];人脸识别失败 → [[checkin.face-fail.faq]] +- **忘记打卡**:完全没操作 +- **非工作日**:节假日不会发提醒,但只要打卡了一样会记录 + +## 解决 +DooTask 自身**没有补签 / 改时间**的功能。可行的做法: + +1. **当下立刻补打一次**:哪怕过了上班时间,只要还在「最晚可延后」窗口内,仍能签上 +2. **请假 / 外出审批**:通过 approve 插件提交请假或外出审批,审批通过后当天不会被算作缺卡,也不会再触发缺卡提醒 +3. **联系管理员说明**:管理员只能在导出 Excel 后线下记录,无法改 DooTask 内的签到记录 +4. **以后改用 WiFi / 人脸自动签到**:减少漏签概率 + +## 不支持 +- 不支持申请补签流程 +- 不支持管理员代签 / 改时间 +- 不支持回溯历史记录修复 diff --git a/resources/ai-kb/zh/faq/checkin/mac-not-match.md b/resources/ai-kb/zh/faq/checkin/mac-not-match.md new file mode 100644 index 000000000..35c931b50 --- /dev/null +++ b/resources/ai-kb/zh/faq/checkin/mac-not-match.md @@ -0,0 +1,45 @@ +--- +id: checkin.mac-not-match.faq +title: 不在公司网络 / MAC 不匹配 +type: faq +feature: checkin +scope: end-user +locale: zh +aliases: + - MAC 不匹配 + - 不在公司网络 + - WiFi 签到没生效 + - 连了 WiFi 没打卡 + - 公司外面能签到吗 + - 在家能 WiFi 签到吗 +related_tools: [] +related_pages: [] +prerequisites: [] +last_verified: v1.7.90 +--- + +# 不在公司网络 / MAC 不匹配 + +## 问题 +WiFi 签到没自动生成记录,或日历显示当天未签到。设备明明开着,怀疑是 MAC 没匹配或网络问题。 + +## 原因 +WiFi 签到依赖**办公网路由器**(OpenWrt)扫描局域网内设备 MAC 并上报。任何一环不通就不会打卡: + +- **不在办公网**:在家 / 出差时设备未连办公网路由器,路由器扫不到 MAC +- **MAC 未登记**:成员没在「签到设置 → WiFi 签到」绑定当前设备 MAC +- **MAC 被别人占用**:同一 MAC 全系统唯一,被其他成员绑了,自己再绑会报「已被其他成员设置」 +- **路由器脚本没装 / 失效**:管理员没在 OpenWrt 路由器执行安装命令,或重启功能后没重新安装 +- **不是 OpenWrt 路由器**:脚本仅支持 OpenWrt,其他系统装不上 +- **设备休眠 / 关 WiFi**:手机锁屏或休眠后 MAC 上报间隔会变长甚至消失 + +## 解决 +1. 确认现在确实连着办公 WiFi,而不是 4G / 其他网络 +2. 打开「签到打卡 → 签到设置 → WiFi 签到」核对 MAC 是否填正确 +3. iOS 14+ / 部分 Android 默认开启「随机 MAC」,关闭它使用真实 MAC +4. 联系管理员确认 OpenWrt 路由器脚本已安装且正常上报 +5. 临时切到 [[checkin.regular.howto]] 手动签到或人脸签到顶一下 + +## 不支持 +- 在家办公或出差时不能用 WiFi 签到,请用手动 / 定位签到 +- WiFi 签到默认延迟约 1 分钟,不要期望「秒打卡」 diff --git a/resources/ai-kb/zh/faq/common-faq/account-cant-login.md b/resources/ai-kb/zh/faq/common-faq/account-cant-login.md new file mode 100644 index 000000000..7eea64c57 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/account-cant-login.md @@ -0,0 +1,67 @@ +--- +id: common-faq.account-cant-login.faq +title: 登不进去 / 登录页报错 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 登不上 + - 登录失败 + - 账号密码错误 + - 登录页报错 + - 进不去 + - 提示账号不存在 + - 输入正确密码也登不上 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有「跳过登录」入口,所有功能必须登录后使用 + - 重置密码必须能收到邮件,否则只能找管理员 + - 普通用户没有账号注册自助开关,注册策略由管理员控制 +last_verified: v1.7.90 +--- + +# 登不进去 / 登录页报错 + +## 问题 +输入账号密码后报错,常见提示:「账号或密码错误」「账号不存在」「账号已被禁用」「登录失败次数过多」「请输入验证码」。 + +## 原因 + 解决 + +**账号 / 密码错(最常见)** +- 确认大小写、空格、Caps Lock +- 试用密码重置:[[common-faq.account-forget-password.faq]] + +**账号不存在** +- 邮箱拼错(多数情况) +- 还没注册:检查管理员是否需要邀请才能注册 +- 被注销:联系管理员看 `user_deletes` 表 + +**账号被禁用 / 锁定** +- 多次密码错误触发风控 → [[common-faq.account-locked.faq]] +- 管理员主动禁用 → 联系系统管理员解锁 + +**提示需要验证码** +- 后端启用了登录验证码图片 +- 没刷出来:F5 强刷;验证失败换个浏览器重试 + +**提示需要邮箱验证** +- 注册后未点击验证邮件 → [[common-faq.account-email-not-verified.faq]] + +**LDAP 用户登录失败** +- 普通账号能登 LDAP 不行 → [[ldap.troubleshoot.faq]] + +**网络 / 服务端问题** +- 浏览器开发者工具看请求是否 200 +- 4xx 是参数 / 权限问题,5xx 是服务端故障 + +## 没法自助时找谁 +- 普通账号:系统管理员(公司 IT / 首位注册用户) +- 域账号:公司 IT 重置域密码 +- 超级管理员忘密码:登服务器跑 `./cmd artisan` 重置 + +## 相关 +- 忘记密码:[[common-faq.account-forget-password.faq]] +- 账号锁定:[[common-faq.account-locked.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/account-email-not-verified.md b/resources/ai-kb/zh/faq/common-faq/account-email-not-verified.md new file mode 100644 index 000000000..70418d11f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/account-email-not-verified.md @@ -0,0 +1,66 @@ +--- +id: common-faq.account-email-not-verified.faq +title: 邮箱验证邮件 / 找回密码邮件收不到 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 收不到邮件 + - 邮箱验证邮件没收到 + - 找回密码邮件 + - SMTP 没配 + - 注册邮件 + - 邮件不到 + - 等不到验证码 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 若管理员未配置 SMTP,所有用户都不会收到任何系统邮件 + - 验证码 / 找回链接有时效,超过 10-30 分钟过期需重发 + - 邮箱地址错了 DooTask 不会有任何提示,邮件直接投递不到 +last_verified: v1.7.90 +--- + +# 邮箱验证邮件 / 找回密码邮件收不到 + +## 问题 +- 注册后没收到验证邮件 +- 「忘记密码」后没收到重置邮件 +- 任何系统通知邮件都没有 + +## 排查(按顺序) + +**等 5-10 分钟**:SMTP 转发会延迟,跨境邮件更慢。 + +**检查垃圾邮件 / 广告分类** +Gmail 搜索栏输入 `from:noreply` 或发件人域名;把发件人加白名单。 + +**确认邮箱地址正确** +个人头像 → 「个人设置」看登记邮箱。拼错则永远收不到,要管理员改。 + +**看邮件服务是否启用** +管理员查「应用 → 邮件通知 → 配置」:SMTP 服务器、端口、账号、密码是否填;「发送测试邮件」能否成功。详见 [[email-notice.config.howto]]。 + +**邮件配过但仍发不出** +- SMTP 凭证过期 / 密码改了没同步 +- SMTP 服务商限 IP(腾讯企业邮要绑外发 IP) +- 防火墙挡了 25 / 465 / 587 端口(云服务器默认封 25) + +**重新触发** +- 「忘记密码」可重新点,会重发 +- 注册后登录页有「重新发送验证邮件」入口 + +## 兜底 +- 管理员到「成员管理」强制标记邮箱已验证 +- 管理员直接重置密码并私下告知 + +## 不要做 +- 不要短时间反复点「重发」,会触发频率限制 +- 不要让管理员把 SMTP 密码贴到公开聊天 / 截图 + +## 相关 +- 找回密码:[[common-faq.account-forget-password.faq]] +- 邮件配置:[[email-notice.config.howto]] +- 邮件排错:[[email-notice.troubleshoot.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/account-forget-password.md b/resources/ai-kb/zh/faq/common-faq/account-forget-password.md new file mode 100644 index 000000000..742bd9568 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/account-forget-password.md @@ -0,0 +1,66 @@ +--- +id: common-faq.account-forget-password.faq +title: 忘记密码怎么办 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 忘记密码 + - 重置密码 + - 找回密码 + - 密码忘了 + - 没法登录怎么改密码 + - 密码找回邮件 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 找回密码必须能收到邮件,邮箱未验证或邮件服务未配则只能找管理员 + - LDAP / 域账号的密码在域控修改,DooTask 自助找回无效 + - 超级管理员(id=1)忘密码不能用前端找回,必须走服务器命令重置 +last_verified: v1.7.90 +--- + +# 忘记密码怎么办 + +## 问题 +忘了 DooTask 登录密码,要如何找回 / 重置。 + +## 普通用户找回 +前提:注册时已验证邮箱、管理员已配 SMTP([[email-notice.config.howto]])。 + +流程: +1. 登录页点「忘记密码」 +2. 输入账号邮箱 +3. 系统发带验证码 / 链接的邮件 +4. 填验证码、设新密码、用新密码登录 + +收不到邮件:检查垃圾邮件、等几分钟、确认邮箱拼写。详见 [[common-faq.account-email-not-verified.faq]]。 + +## LDAP / 域账号 +DooTask 不存域账号密码,找回入口对域账号无效。找公司 IT 重置域密码,回 DooTask 用新密码登录即可。 + +## 管理员侧重置(兜底) +1. 进「成员管理」找到该用户 +2. 点「重置密码」→ 设新密码或自动生成 +3. 私下告知,登录后让用户立即改 + +## 超级管理员忘密码 +不能用前端「忘记密码」,走服务器: + +```bash +sudo ./cmd artisan tinker +# 在 tinker 内 +\App\Models\User::whereUserid(1)->first()->update(['userpass' => \App\Models\User::md5s('新密码')]); +``` + +参考 `app/Models/User.php` 的 md5s 加密方式。 + +## 不要做 +- 不要直接改库 `users.userpass`,必须用 `md5s()` 加密 +- 不要给所有用户用同一个临时密码 + +## 相关 +- 登不进去:[[common-faq.account-cant-login.faq]] +- 邮件收不到:[[common-faq.account-email-not-verified.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/account-locked.md b/resources/ai-kb/zh/faq/common-faq/account-locked.md new file mode 100644 index 000000000..7beb07cd0 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/account-locked.md @@ -0,0 +1,69 @@ +--- +id: common-faq.account-locked.faq +title: 账号被锁定 / 频繁报「登录次数过多」 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 账号锁定 + - 登录次数过多 + - 账号被冻结 + - 被禁用 + - 输错密码被锁 + - 解锁账号 + - 登录受限 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 普通用户没有「解锁」自助按钮,要等冷却或联系管理员 + - 锁定不区分 IP,是按账号锁 + - LDAP 账号锁定可能源自 LDAP 服务器侧,不是 DooTask 锁的 +last_verified: v1.7.90 +--- + +# 账号被锁定 / 频繁报「登录次数过多」 + +## 问题 +登录时报:「登录失败次数过多,请稍后再试」「账号已被锁定」「账号已被禁用」。 + +## 锁定的两种类型 + +**频次限制(自动锁定)** +后端对登录接口有频次保护:短时间多次密码错误触发临时锁定。 +- 一般冷却 5-15 分钟后自动解除 +- 输入正确密码也暂时拒登 +- 全平台生效(换浏览器没用) + +**管理员主动禁用** +管理员在「成员管理」把账号标记为禁用。 +- 永久生效,直到管理员手动启用 +- 提示通常是「账号已被禁用」或「无权登录」 + +## 解决 + +**频次锁定** +1. 等待 5-15 分钟 +2. 建议先用「忘记密码」重置确认密码正确 → [[common-faq.account-forget-password.faq]] +3. 用正确密码登录 + +**管理员禁用** +- 联系系统管理员,说明账号 / 提示语 / 是否触发风控 +- 管理员在「成员管理」点「启用」即可恢复 + +**LDAP 用户** +- 域账号可能是 LDAP 服务器侧锁了,找公司 IT 解锁 + +**联系不到管理员** +- 超级管理员(首位注册用户)可登服务器走 artisan 改库 +- 普通用户没有兜底,只能等管理员 + +## 不支持 +- 没有「立刻解锁」自助入口 +- 没有按 IP 分桶(不能换 IP 绕开) +- 锁定时长不可配 + +## 相关 +- 登不进去:[[common-faq.account-cant-login.faq]] +- 多端冲突:[[common-faq.account-multi-device-conflict.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/account-multi-device-conflict.md b/resources/ai-kb/zh/faq/common-faq/account-multi-device-conflict.md new file mode 100644 index 000000000..90235f072 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/account-multi-device-conflict.md @@ -0,0 +1,72 @@ +--- +id: common-faq.account-multi-device-conflict.faq +title: 多设备登录冲突 / 一边登另一边掉线 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 多设备冲突 + - 一登就掉 + - 另一边掉线 + - 多端互踢 + - 手机登了电脑掉了 + - 同账号多设备 + - 顶号 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 默认不互踢,但同类终端会限制单设备 + - 没有「禁止同时多端」开关,端类型隔离是默认行为 + - 强制下线某设备的入口在「个人设置 → 已登录设备」 +last_verified: v1.7.90 +--- + +# 多设备登录冲突 / 一边登另一边掉线 + +## 问题 +- 桌面端登录后浏览器就掉线了 +- 手机一登录,平板就被踢 +- 两台电脑同时登同一账号会互踢 + +## DooTask 多端策略 +登录设备按类型分桶: + +| 端类型 | 同时在线 | +|---|---| +| Web 浏览器 | 多浏览器 / 多 Tab 互不踢 | +| 桌面端 Mac | 同类只能一台 | +| 桌面端 Win | 同类只能一台 | +| iOS App | 同类只能一台 | +| Android App | 同类只能一台 | + +跨类型不互踢:Mac 桌面端 + 手机 App + 网页可同时在线。同类互踢:第二台 Win 电脑登录会踢掉第一台。 + +## 解决 + +**保留某台设备不被踢** +- 不要在另一台同类型设备上登录 +- 登录前先在「已登录设备」检查现有会话 + +**看哪些端在线** +1. 个人头像 → 「个人设置」 +2. 「已登录设备」标签 +3. 列表展示设备类型、最近活跃时间、IP + +**强制下线某设备** +- 「已登录设备」点对应设备的「下线」 +- token 立即失效,强制重新登录 + +**误在公共设备登录** +- 在常用设备进「已登录设备」找到它 → 「下线」 +- 顺便改密码 → [[common-faq.account-forget-password.faq]] + +## 不支持 +- 不支持同账号同终端类型双开 +- 不支持下线时弹通知给被踢端 +- 不支持「这台机器永不被踢」白名单 + +## 相关 +- 设备管理:[[user-account.device.howto]] +- 多端不同步:[[common-faq.sync-multi-device.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/ai-no-models.md b/resources/ai-kb/zh/faq/common-faq/ai-no-models.md new file mode 100644 index 000000000..9cb8c7e66 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/ai-no-models.md @@ -0,0 +1,51 @@ +--- +id: common-faq.ai-no-models.faq +title: AI 助手没有可用模型 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 没有模型 + - 模型为空 + - AI 用不了 + - 找不到 AI + - AI 不响应 + - 模型下拉空 +related_tools: [] +related_pages: [ai_assistant_panel] +prerequisites: [] +negative: + - DooTask 主程序不内置任何 AI 模型,必须靠 ai 插件接外部供应商 + - 配好模型不代表立即能用——还需在「AI 机器人」选定默认模型 + - 普通用户看不到模型管理页面,只能等管理员配置 +last_verified: v1.7.90 +--- + +# AI 助手没有可用模型 + +## 问题 +点开 AI 助手浮窗或在任务详情用「智能拆解」「AI 报告」时,模型选择下拉为空、或者直接提示「未配置 AI 模型」「AI 服务不可用」。 + +## 原因 +DooTask 的 AI 能力由独立的 **ai 插件**(`dootask-ai`)提供。下面任一未到位都会无可用模型: + +1. **应用市场没装 ai 插件**:主程序没自带 AI 容器,必须从插件市场安装 +2. **插件装了但没配模型**:插件需要在「系统设置 → AI 设置」里加供应商(OpenAI / Anthropic / 通义 / 豆包 / 智谱 / DeepSeek 等)+ API Key +3. **配了供应商但没勾默认模型**:系统设置 → AI 机器人 → 默认模型为空时全员无法用 +4. **API Key 过期 / 余额不足**:供应商侧失效会让请求 401/402,前端表现为「模型不可用」 +5. **dootask-ai 容器异常**:插件容器 crash 或网络问题,`/ai/*` 路由 502 + +## 解决 +1. 让管理员到 [[appstore.install.howto]] 装 ai 插件 +2. 让管理员到 [[system-setting.ai-model.howto]] 配供应商和模型 +3. 让管理员到 [[system-setting.ai-bot.howto]] 勾选默认模型 +4. 自己试一下不行 → 管理员到对应供应商后台看 API Key 是否有效、余额够 +5. 管理员排查容器:`docker ps | grep dootask-ai`;`docker logs dootask-ai` + +## 不支持 +- 普通用户不能自己加 API Key(只能管理员) +- 主程序不能跳过 ai 插件直连模型 +- 一次只能选一个默认模型作为系统主模型 + +更多 AI 助手能力见 [[ai-assistant.entry.howto]] / [[ai-assistant.tools-list.concept]] diff --git a/resources/ai-kb/zh/faq/common-faq/ai-slow.md b/resources/ai-kb/zh/faq/common-faq/ai-slow.md new file mode 100644 index 000000000..3d56481e8 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/ai-slow.md @@ -0,0 +1,53 @@ +--- +id: common-faq.ai-slow.faq +title: AI 回复很慢 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - AI 慢 + - AI 卡 + - AI 反应慢 + - 模型很慢 + - AI 半天不出 + - 思考很久 +related_tools: [] +related_pages: [ai_assistant_panel] +prerequisites: [] +negative: + - DooTask 不缓存 AI 回复,每次问都是真请求 + - 流式延迟主要在模型供应商侧,主程序无能为力 + - 没有「换更快模型」按钮——需管理员在 AI 机器人换默认模型 +last_verified: v1.7.90 +--- + +# AI 回复很慢 + +## 问题 +AI 助手发问后等很久才出第一个字,或一句话流式吐字过慢,整体感受卡顿。 + +## 原因 +AI 回复时延受多重因素影响: + +1. **模型本身**:GPT-4 / Claude Opus / Gemini Ultra 等大模型首 token 延迟天然较长(2-10 秒),思考模型可达 30 秒以上 +2. **供应商网络**:国内访问海外 API 走代理 / 国外节点,加上 5-20 秒 +3. **上下文太长**:会话越长 token 越多,处理时间线性增加 +4. **工具调用串行**:一次回复触发多次工具调用会逐次执行,叠加时延 +5. **dootask-ai 容器负载**:插件容器 CPU 满 / 内存吃紧 +6. **流式断开重连**:网络抖动让 SSE 中断,前端自动重连看着像卡 + +## 解决 +1. 等待,部分模型「思考」阶段就是慢 +2. 简化问题,避免长上下文 +3. 让管理员换更快模型(如 GPT-4 mini、Claude Haiku、deepseek-chat):[[system-setting.ai-bot.howto]] +4. 让管理员排查 ai 插件容器:`docker stats dootask-ai`、`docker logs dootask-ai` +5. 改供应商代理 / Base URL,使用更近的中转节点 +6. 网络抖动 → 切到稳定网络重试 + +## 不支持 +- 用户端无法在请求中途强制切模型 +- 无内置「响应慢自动降级」机制 +- 中断回复只能整体停止本轮,不能保留已生成的文本继续 + +[[ai-assistant.entry.howto]] / [[ai-assistant.tool-call.concept]] diff --git a/resources/ai-kb/zh/faq/common-faq/ai-token-cost.md b/resources/ai-kb/zh/faq/common-faq/ai-token-cost.md new file mode 100644 index 000000000..6f7027df1 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/ai-token-cost.md @@ -0,0 +1,60 @@ +--- +id: common-faq.ai-token-cost.faq +title: AI 用量与 token 成本 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - AI 收费 + - token 成本 + - AI 用了多少钱 + - AI 配额 + - AI 限流 + - 用量统计 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 +negative: + - DooTask 本身不收费——但你接入的 OpenAI / Claude / 通义等供应商按 token 计费 + - 没有内置的精确按用户成本分摊功能 + - 不能限制单用户每天调用次数(除非自研代理层) +last_verified: v1.7.90 +--- + +# AI 用量与 token 成本 + +## 问题 +管理员想知道 DooTask 接入 AI 后到底花了多少钱、谁在用、能不能给用户限额。 + +## 计费逻辑 +- DooTask 主程序和 ai 插件本身**不向用户收费** +- 调用费用直接产生在所配供应商侧——OpenAI / Anthropic / 通义 / 豆包 / 智谱 / DeepSeek 等账户余额 +- 每次回复消耗 token = 输入 prompt(系统提示 + 上下文 + 用户问题 + 知识库检索)+ 输出文本 +- **工具调用结果回灌**也算 token:模型读工具结果后再生成回复,结果文本会算在输入里 +- 多轮会话越长 token 越多(输入 = 整段历史) + +## 查询用量 +1. 登录对应供应商的开发者后台(如 OpenAI Platform → Usage)看月度账单 +2. ai 插件容器日志 `docker logs dootask-ai` 包含调用记录,可统计调用次数 +3. 暂无 web 界面按 DooTask 用户分摊成本 + +## 控制成本 +1. **选轻量模型**:在 [[system-setting.ai-bot.howto]] 默认模型选 GPT-4 mini / Claude Haiku / Qwen-turbo / deepseek-chat 等,比顶级模型便宜 10-100 倍 +2. **限制上下文长度**:让插件层裁剪最大轮数(需修改插件配置) +3. **关闭高频自动调用**:如「自动总结报告」「自动智能拆解」等按需触发 +4. **供应商侧设硬上限**:在 OpenAI 控制台设 monthly budget cap,超额自动断 +5. **多供应商负载分流**:成本不同的模型分给不同场景 + +## 不支持 +- 没有内置「单用户每天 N 次」配额 +- 没有「按部门分摊账单」表 +- 不能在 DooTask 内冻结单个用户的 AI 使用 + +## 推荐做法 +- 试用阶段:用便宜模型 + 小额预算 +- 重度场景:在供应商账户设硬性月度上限 +- 长期:监控发票 → 不合理涨幅时让团队复盘高耗用户 + +供应商配置入口:[[system-setting.ai-model.howto]] diff --git a/resources/ai-kb/zh/faq/common-faq/ai-tool-permission.md b/resources/ai-kb/zh/faq/common-faq/ai-tool-permission.md new file mode 100644 index 000000000..32279b7d0 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/ai-tool-permission.md @@ -0,0 +1,51 @@ +--- +id: common-faq.ai-tool-permission.faq +title: AI 没权限操作 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - AI 没权限 + - AI 不能改任务 + - AI 不能建任务 + - AI 调工具失败 + - AI 提示无权限 + - 工具调用 403 +related_tools: [create_task, list_tasks, update_task] +related_pages: [ai_assistant_panel] +prerequisites: [] +negative: + - AI 助手不能突破用户本身的权限边界——它做不了用户本人也做不了的事 + - 即使是系统管理员让 AI 操作,AI 仍然以「调用者身份」执行 + - 用户不能临时给 AI 提权 +last_verified: v1.7.90 +--- + +# AI 没权限操作 + +## 问题 +让 AI 助手「帮我建任务」「把这条改成已完成」「把张三加到项目」时,AI 气泡显示工具调用失败,状态是「无权限」「permission denied」「403」。 + +## 原因 +AI 助手的工具调用本质是后端 API 调用,**全部以你的身份发起**。所以: + +- 你本人没权限做的事,AI 也做不了 +- AI 调 `create_task` 时实际就是用你的会话去走 [[ai-assistant.create-task.howto]] 的 API;你不在项目里就会被拒绝 +- `update_task` 改任务必须满足任务负责人 / 项目负责人 / 系统管理员条件之一 +- 「加成员」必须你本身能加(项目负责人 / 系统管理员) + +权限校验由后端拦截,AI 端无法绕过。 + +## 解决 +1. 看 AI 气泡里失败的工具名(如 `create_task`、`add_project_member`) +2. 对应自己「亲手操作」一次同样的功能 → 大概率也会失败 → 这就是权限问题 +3. 先让对应角色(项目负责人、系统管理员)把你的权限补上,再让 AI 重试 +4. 跨项目操作时确保你是源项目 + 目标项目的成员 + +## 不支持 +- 没有「以管理员身份让 AI 执行」的模式 +- AI 不读不到的会话不会偷偷读取(隐私边界 = 用户的可见范围) +- AI 工具失败不会自动二次重试,需要用户重新发问 + +[[ai-assistant.tool-call.concept]] 解释了工具调用的事件结构;[[role-permission.permission-denied.faq]] 解释通用权限规则。 diff --git a/resources/ai-kb/zh/faq/common-faq/ai-wrong-answer.md b/resources/ai-kb/zh/faq/common-faq/ai-wrong-answer.md new file mode 100644 index 000000000..6a631f526 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/ai-wrong-answer.md @@ -0,0 +1,50 @@ +--- +id: common-faq.ai-wrong-answer.faq +title: AI 答错怎么办 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - AI 答错 + - AI 胡说 + - AI 编造 + - 回答不对 + - AI 幻觉 + - 信息不准确 +related_tools: [] +related_pages: [ai_assistant_panel] +prerequisites: [] +negative: + - AI 助手不保证 100% 正确,关键决策需用户自己核对 + - DooTask 不会自动检测 AI 输出是否合规 + - 已发送的 AI 回复不会自动更正——需要用户重新提问或纠正 +last_verified: v1.7.90 +--- + +# AI 答错怎么办 + +## 问题 +AI 助手回答与事实不符,编了不存在的功能 / 菜单 / 快捷键;或工具调用结果被 AI 总结错;或回答风格 / 语言不对。 + +## 原因 +- **训练截止**:模型训练数据有截止日期,可能不知道最新版本变化 +- **知识库未命中**:DooTask 内 RAG 知识库(ai-kb)没收录该问题,AI 退回基础模型猜 +- **工具调用结果误读**:AI 拿到结构化结果后做了错误归纳 +- **歧义提问**:模糊的问题(如「这个怎么用」无上下文)容易引导错方向 +- **被旧上下文带偏**:长会话中早期错误信息持续影响后续回答 + +## 解决 +1. **明确再问一次**:补充具体场景、版本、所在页面(如「v1.7.90 任务详情页里 X 字段在哪」) +2. **重启会话**:上下文污染时点「新对话」清空再问 +3. **直接告诉 AI 它错了**:「上一条不对,正确情况是 X」,AI 会在后续回复矫正 +4. **核对 ai-kb**:知识库里有官方答案的 AI 应该引用——没引就是没命中 +5. **换模型**:让管理员试不同模型对比效果 [[system-setting.ai-bot.howto]] +6. **反馈给团队**:DooTask 团队会定期更新 ai-kb,错误高频问题会被收录修正 + +## 不支持 +- 用户端不能直接编辑 AI 知识库(仅维护者可改 `resources/ai-kb/`) +- AI 不会拒绝回答它不熟的问题(可能编造),需用户保持警惕 +- AI 不会自动跨会话学习——「你上次错过的」对新会话无影响 + +[[ai-assistant.search-help-docs.howto]] 触发知识库检索;[[ai-assistant.tool-call.concept]] 看真实工具调用判断 AI 是否真做了。 diff --git a/resources/ai-kb/zh/faq/common-faq/data-import.md b/resources/ai-kb/zh/faq/common-faq/data-import.md new file mode 100644 index 000000000..22c497001 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/data-import.md @@ -0,0 +1,65 @@ +--- +id: common-faq.data-import.faq +title: 从其他系统迁移数据到 DooTask +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 数据迁移 + - 从禅道迁移 + - 从 Jira 迁 + - 从 Trello 迁 + - 从 Tower 迁 + - 数据导入 + - 任务批量导入 + - Excel 导入任务 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 没有「Jira / Trello / 禅道」官方一键迁移工具 + - Excel 批量导入任务功能依赖项目内的「导入」入口,字段映射有限 + - 历史聊天记录、附件无法从其他系统直接迁过来 +last_verified: v1.7.90 +--- + +# 从其他系统迁移数据到 DooTask + +## 问题 +公司之前用 Jira / Tower / 禅道 / Trello / Asana,要搬到 DooTask 怎么迁? + +## 现状 +没有一键迁移工具。可迁移性: + +| 数据 | 可行性 | 方式 | +|---|---|---| +| 用户 / 部门 | 高 | 「成员管理 → 批量导入」CSV / LDAP | +| 项目 / 任务 | 中 | Excel 批量导入(字段映射有限) | +| 附件 | 低 | 手动补传 | +| 聊天记录 | 极低 | 无入口,建议放弃 | +| 评论 / 时间线 | 低 | 无公开接口 | +| 文档 / Wiki | 低 | 复制文本到 office / memos | + +## 推荐步骤 + +**用户和部门** +- 「成员管理 → 批量导入」用 CSV 模板([[user-account.import.howto]]) +- 大公司:配 LDAP 后用户登录自动同步([[ldap.config.howto]]) + +**项目和任务** +1. 源系统导出任务 Excel +2. 整理列:任务名、负责人邮箱、截止日期、状态、描述 +3. DooTask 新建项目 → 右上角「导入」 +4. 上传 Excel 按提示映射。Jira/禅道导出 CSV 后整理;Trello 用 JSON 导出 + 脚本转 Excel + +**附件**:批量上传到文件目录([[file.upload.howto]])。 + +**文档**:复制文本到 office([[office.create.howto]])或 memos([[memos.create.howto]])。 + +## 不支持 +- 不支持保留源任务 ID / URL 映射 +- 不支持迁移历史变更(创建时间变为导入时间) +- 不支持迁移审批流 / 工作流 + +量大可联系 DooTask 商业支持定制脚本(数据库直插 + 校验)。 diff --git a/resources/ai-kb/zh/faq/common-faq/deploy-backup.md b/resources/ai-kb/zh/faq/common-faq/deploy-backup.md new file mode 100644 index 000000000..c2fa2469f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/deploy-backup.md @@ -0,0 +1,67 @@ +--- +id: common-faq.deploy-backup.faq +title: 怎么备份 DooTask 数据 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 数据备份 + - 怎么备份 + - 备份数据库 + - 备份附件 + - 定期备份 + - 怎么导出全部数据 + - 怎么迁移到新服务器 +related_tools: [] +related_pages: [] +prerequisites: + - 部署机能 root 执行 sudo ./cmd +negative: + - 没有「一键全量备份」按钮,要分别备份数据库、附件、配置三部分 + - cmd update 自带数据库备份,但不备份 public/uploads + - 备份文件不会自动归档到外部存储,要自行同步 +last_verified: v1.7.90 +--- + +# 怎么备份 DooTask 数据 + +## 完整备份包含三部分 +1. **数据库**:所有任务、项目、消息、用户元数据 +2. **附件目录**:`public/uploads/`(附件、头像) +3. **配置**:`.env`、`docker/appstore/config/`、SSL 证书 + +## 数据库 +```bash +sudo ./cmd mysql backup # 备份到 docker/mysql/backup/_<时间戳>.sql.gz +sudo ./cmd mysql restore # 列出备份让你选编号还原 +``` +`./cmd update` 会自动备份一次,升级前不用手动操作。 + +## 附件目录 +没有内置命令,自己打包: +```bash +tar czf uploads-$(date +%F).tar.gz --exclude='public/uploads/tmp' public/uploads +``` + +## 配置 +```bash +tar czf config-$(date +%F).tar.gz .env docker/appstore/config +``` + +## 定期自动备份 +crontab 每日凌晨: +```cron +0 2 * * * cd /path/to/dootask && ./cmd mysql backup && tar czf /backups/uploads-$(date +\%F).tar.gz --exclude='public/uploads/tmp' public/uploads +``` +再用 rsync / rclone 同步到 S3 / OSS / NAS 外部存储。 + +## 迁移到新服务器 +1. 旧机:备份数据库 + 打包 uploads + 复制 `.env` +2. 新机:`./cmd install` 部署 +3. 还原数据库 → 替换 `public/uploads/` → 抄 `.env` 关键项(APP_KEY、JWT_KEY 等) +4. `./cmd php restart` + +## 不要做 +- 不要只备份数据库不备份 uploads,附件丢了不可恢复 +- 不要拷贝 `docker/mysql/data/` 替代 SQL 备份,跨版本可能不兼容 diff --git a/resources/ai-kb/zh/faq/common-faq/deploy-perf.md b/resources/ai-kb/zh/faq/common-faq/deploy-perf.md new file mode 100644 index 000000000..70cfa4e9f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/deploy-perf.md @@ -0,0 +1,73 @@ +--- +id: common-faq.deploy-perf.faq +title: DooTask 系统性能慢 / 卡 / 加载时间长 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 系统卡 + - 加载慢 + - 响应慢 + - 性能差 + - 任务列表打开慢 + - 消息发送延迟 + - 服务器压力大 + - CPU 100% +related_tools: [] +related_pages: [] +prerequisites: + - 部署机能 root 操作主机 +negative: + - DooTask 后端走 Swoole 协程,PHP-FPM 优化经验不适用 + - 单机用户数超过 200 后建议给 mysql / redis 单独分配资源 + - 慢查询多数源于 messages / tasks 这类大表缺索引或全文搜索未启用 +last_verified: v1.7.90 +--- + +# DooTask 系统性能慢 / 卡 / 加载时间长 + +## 问题 +打开任务列表 / 消息会话 / 仪表盘明显变慢,CPU / 内存占用高,多人操作时卡顿。 + +## 常见原因 + +**数据量大但缺优化** +- 消息、任务百万级时必须装 Manticore 全文搜索(AppStore → search) +- 否则降级为 MySQL LIKE,慢且功能弱 + +**资源不足** +- 推荐最低 2 核 4G,正常 4 核 8G+ +- 用户 > 100 时给 mysql 分独立机器 +- 用 `docker stats` 看实时占用 + +**mysql 慢** +- 开 slow_query_log 找出慢 SQL,按报告加索引 +- `innodb_buffer_pool_size` 默认偏小,调到内存的 50% + +**Swoole 配置** +- `worker_num` 默认 = 核数,确认多核机器充分用到 +- `task_worker_num` 偏小会导致后台任务积压 +- 改完必须 `./cmd php restart` + +**Redis 容量** +- 默认无 maxmemory 限制,大用户量会撑爆 +- 设 `maxmemory 2gb` + `maxmemory-policy allkeys-lru` + +**nginx 反代瓶颈** +- worker 数 / 连接数太小、静态资源没开 gzip / cache + +## 解决步骤 +1. 先量化:`docker stats` 看哪个容器吃满 +2. 装 Manticore 搜索插件 +3. mysql 开慢查询找出问题 SQL +4. 加 CPU / 内存(最简单) +5. mysql 拆到独立机器,DooTask 走外部 DB + +## 不要做 +- 不要简单加 worker 不加 CPU,反而更慢 +- 生产环境不要留 `APP_DEBUG=true`,日志会爆 + +## 相关 +- 全局搜索:[[common-faq.search-no-result.faq]] +- 磁盘满:[[common-faq.deploy-storage.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/deploy-ssl.md b/resources/ai-kb/zh/faq/common-faq/deploy-ssl.md new file mode 100644 index 000000000..9821e986b --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/deploy-ssl.md @@ -0,0 +1,69 @@ +--- +id: common-faq.deploy-ssl.faq +title: HTTPS / SSL 证书怎么配 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 配 SSL + - 装 HTTPS + - 证书过期 + - 证书续期 + - acme.sh + - 自签证书 + - https 配置失败 + - 浏览器不安全提示 +related_tools: [] +related_pages: [] +prerequisites: + - 域名已解析到部署机 + - 80 / 443 端口对外开放 +negative: + - bin/https 脚本只支持 acme.sh 申请 Let's Encrypt 免费证书 + - 不支持上传自定义商业证书(要自己改 nginx 配置) + - 自签证书浏览器会报「不安全」,仅适合内网测试 +last_verified: v1.7.90 +--- + +# HTTPS / SSL 证书怎么配 + +## 问题 +- 默认 http://,想升级 https:// +- 证书过期要续期 +- 配完 https 浏览器还提示不安全 + +## 自带 HTTPS 工具 +`bin/https` 用 acme.sh + Let's Encrypt 免费签: + +```bash +sudo ./cmd https install <域名> +``` + +会自动:拉临时 nginx 走 acme.sh 验证 → 证书放 `docker/nginx/site/ssl/` → 生成 `ssl.conf` → 改 `.env` 的 `APP_URL` 为 https → 重启 nginx。 + +## 续期 +acme.sh 自动续期,也可手动 `sudo ./cmd https renew <域名>`。证书 90 天有效。 + +## 配置失败常见原因 +- **80 端口被占**:acme.sh 要 80 端口验证 → 停占用进程 +- **域名未解析**:先 `dig <域名>` 确认指向当前机器 +- **防火墙没开 443**:云服务器开安全组 +- **APP_URL 没改**:检查 `.env` + +## 上传商业证书 +脚本不支持直接导入,手动: +1. 把 crt + key 放 `docker/nginx/site/ssl/<域名>.{crt,key}` +2. 复制 `bin/https` 中 ssl.conf 模板到 `docker/nginx/site/ssl.conf` +3. 改 `.env` 的 `APP_URL=https://<域名>` +4. `./cmd restart nginx` + +## 仍提示不安全 +- 证书 / 私钥配错(检查中间证书完整性) +- `APP_URL` 与浏览器访问域名不一致 +- 清浏览器缓存 / 无痕模式 +- WebSocket 没升级到 wss → [[common-faq.sync-websocket-disconnect.faq]] + +## 不支持 +- 不支持一个实例跑多域名 +- 不支持泛域名证书自动签(要手 acme.sh 走 DNS-01) diff --git a/resources/ai-kb/zh/faq/common-faq/deploy-storage.md b/resources/ai-kb/zh/faq/common-faq/deploy-storage.md new file mode 100644 index 000000000..30d004441 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/deploy-storage.md @@ -0,0 +1,69 @@ +--- +id: common-faq.deploy-storage.faq +title: 磁盘占满 / DooTask 数据目录变大怎么办 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 磁盘满了 + - 数据目录太大 + - public/uploads 太大 + - mysql 备份占空间 + - 日志文件过大 + - DooTask 越用越大 + - 清理空间 +related_tools: [] +related_pages: [] +prerequisites: + - 部署机能 root 操作主机文件系统 +negative: + - 不要手动 rm public/uploads/ 下的文件,会导致已上传附件 404 + - 不要清空数据库表,应通过任务回收站、消息删除等业务操作清理 + - mysql 日志(binlog)不在自动备份里,需另行处理 +last_verified: v1.7.90 +--- + +# 磁盘占满 / DooTask 数据目录变大怎么办 + +## 问题 +服务器磁盘越来越满,DooTask 部署目录占了大头,想清理释放空间。 + +## 主要占用点 +按通常大小排序: + +| 目录 | 内容 | 能否清理 | +|---|---|---| +| `public/uploads/` | 附件、头像 | 不能直接删,走业务回收站 | +| `docker/mysql/data/` | 数据库 | 不能直接删 | +| `docker/mysql/backup/` | 数据库自动备份 | 可以,保留近几份 | +| `storage/logs/`、`docker/log/` | Laravel/nginx/php 日志 | 可以,按日轮转 | +| `public/uploads/tmp/` | 上传临时文件 | 可以,定时清理 | + +## 解决 + +**清理 mysql 自动备份(保留 7 天)** +```bash +find ./docker/mysql/backup -name "*.sql.gz" -mtime +7 -delete +``` + +**清理临时上传、日志** +```bash +find ./public/uploads/tmp -mtime +1 -delete +find ./storage/logs ./docker/log -name "*.log" -mtime +30 -delete +``` + +**业务侧清理** +- 任务 / 文件回收站:超 30 天自动清理(不可恢复) +- 大附件:找到大文件先归档外存 + +**数据库瘦身(慎用)** +- 老旧消息归档(先备份) +- 删除离职用户的设备记录、session + +## 不要做 +- 不要 `rm -rf public/uploads/*`,所有附件会 404 +- 不要直接清空 `users` 等核心表,依赖关系会断 + +## 相关 +- 备份:[[common-faq.deploy-backup.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/deploy-update.md b/resources/ai-kb/zh/faq/common-faq/deploy-update.md new file mode 100644 index 000000000..7e6b1428a --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/deploy-update.md @@ -0,0 +1,59 @@ +--- +id: common-faq.deploy-update.faq +title: 升级 DooTask 失败 / cmd update 报错 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 升级失败 + - cmd update 报错 + - 更新不上去 + - 拉代码冲突 + - 数据库迁移失败 + - 升级后启动不了 + - composer 安装失败 +related_tools: [] +related_pages: [] +prerequisites: + - 部署机能 root 执行 sudo ./cmd +negative: + - ./cmd update 会自动备份数据库到 docker/mysql/backup/,失败可还原 + - 本地有未提交改动时 update 会停下来,不强制覆盖 + - 不要直接 git pull + composer install,绕过 cmd 会漏掉迁移和重启 +last_verified: v1.7.90 +--- + +# 升级 DooTask 失败 / cmd update 报错 + +## 问题 +跑 `sudo ./cmd update` 中途失败:拉代码冲突、composer 装不上、migrate 报错、升级完容器起不来。 + +## 升级做了什么 +`./cmd update` 串行执行:git pull → 备份数据库到 `docker/mysql/backup/` → `composer install` → `artisan migrate` → 重启 Swoole。本地有改动会停下。 + +## 解决 + +**拉代码冲突** +- 推荐:`git stash` 暂存改动 → `sudo ./cmd update` → `git stash pop` +- 强制覆盖(慎用,会丢改动):`sudo ./cmd update --force` + +**composer 装不上** +- 多半网络问题,配国内镜像后重试: + `./cmd composer config repo.packagist composer https://mirrors.aliyun.com/composer/` + +**migrate 失败** +- 看 `storage/logs/laravel.log` 找具体 SQL 错误 +- 用 `./cmd mysql restore` 选最新备份还原,修复后再 `./cmd artisan migrate` + +**起不来** +- `./cmd logs` 看容器日志 +- 端口被占 / 内存不足 / Swoole 报错都会导致起不来 + +## 不要做 +- 不要跳过 cmd 直接 git pull + composer install,会漏掉迁移和重启 +- 改了 .env / docker-compose.yml 关键配置后必须 `./cmd php restart` + +## 相关 +- 备份:[[common-faq.deploy-backup.faq]] +- 性能:[[common-faq.deploy-perf.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/language-cant-change.md b/resources/ai-kb/zh/faq/common-faq/language-cant-change.md new file mode 100644 index 000000000..7b6552cef --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/language-cant-change.md @@ -0,0 +1,66 @@ +--- +id: common-faq.language-cant-change.faq +title: 切换语言不生效 / 切完还是中文 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 语言切换失败 + - 切换语言不生效 + - 改成英文还是中文 + - 多语言不生效 + - 翻译不全 + - 语言设置丢失 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 后端某些通知 / 邮件模板只有简体中文,切语言后这部分文案不变 + - 切换语言不需要刷新浏览器,是即时生效(如果没生效是 bug) + - 部分微应用 / 插件自带翻译,未对接主程序的语言系统 +last_verified: v1.7.90 +--- + +# 切换语言不生效 / 切完还是中文 + +## 问题 +- 「个人设置 → 语言」切到英文后界面还是中文 +- 部分文案变了部分没变 +- 刷新后又恢复原来语言 + +## 原因 + 解决 + +**真的没生效(前端 bug)** +DooTask 前端用 `$L()` 翻译函数,切换后应立即重新渲染。如果没:F5 强刷、清浏览器缓存、退出重登。 + +**部分文案没翻译(正常)** +- 后端响应消息按当前语言返回,但只覆盖核心提示 +- 系统邮件模板默认中文,国际化覆盖有限 +- 微应用 / 插件(office、kpi)自带独立 i18n,没接主程序语言系统 + +这是覆盖范围问题,不是 bug。 + +**切换后又改回去** +- 语言写到后端 `user.language` 字段 +- 同账号其他端登录会拉后端配置 +- 隐私模式 / 清缓存时本地被清,后端应保留 + +**移动端 / 桌面端不跟随** +- 移动端 App:「我的 → 设置 → 语言」单独设 +- 桌面端 Electron:跟随网页登录语言 + +## 操作 +1. 个人头像 → 「个人设置」 +2. 找「语言」字段 +3. 下拉选:简体中文 / 繁体中文 / English / 韩语等 +4. 自动保存立即生效 + +## 不支持 +- 不支持页面内一键切换(必须进个人设置) +- 不支持按部门 / 项目设语言 +- 不支持自定义翻译(要改源码 `language/` 语言包) + +## 相关 +- 个人语言设置:[[user-settings.language.howto]] +- 主题切换问题:[[common-faq.theme-cant-change.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/notify-desktop-fail.md b/resources/ai-kb/zh/faq/common-faq/notify-desktop-fail.md new file mode 100644 index 000000000..dd90d6d52 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/notify-desktop-fail.md @@ -0,0 +1,63 @@ +--- +id: common-faq.notify-desktop-fail.faq +title: 桌面通知不弹 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 桌面不弹 + - Mac 不弹通知 + - Windows 不响 + - 浏览器没通知 + - 没弹横幅 + - Web 通知没权限 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 不会反复请求系统通知权限;拒绝过一次后只能去系统设置改 + - 浏览器在「专注模式」「勿扰」「全屏播放」时会自动抑制通知 + - 标签页被浏览器丢进后台冻结后通知也会暂停 +last_verified: v1.7.90 +--- + +# 桌面通知不弹 + +## 问题 +有新消息时桌面端 / Web 端的应用内红点正常更新,但操作系统通知栏 / 通知中心一片空白,听不到声音也没横幅。 + +## 原因 +桌面通知依赖三层: + +- **操作系统通知权限**:macOS / Windows / Linux 各自的通知中心需把 DooTask 设为允许 +- **浏览器层权限**(Web 版):站点通知需「允许」 +- **系统未处于勿扰 / 专注模式**:开启时无论谁都不弹 +- **DooTask 个人通知设置**:「桌面通知」需开启,且没设「仅 @ 时」误关 + +## 解决(macOS) +1. 系统设置 → 通知 → DooTask → 允许通知 + 风格选「横幅 / 提醒」 +2. 关掉右上角「专注 / 勿扰」 +3. DooTask 内:个人头像 → 个人设置 → 通知 → 桌面通知打开 + +## 解决(Windows) +1. 设置 → 系统 → 通知 → 总开关「开」 +2. 应用列表里 DooTask → 通知开 +3. 关掉「专注助手」 + +## 解决(Linux) +- GNOME:设置 → 通知 → DooTask → 通知横幅开 +- KDE:系统设置 → 通知 → 应用程序通知 → DooTask +- 部分发行版需 `libnotify` + +## 解决(Web 浏览器) +1. 地址栏锁图标 → 站点设置 → 通知 → 允许 +2. 刷新页面让 DooTask 重新申请权限 +3. 浏览器没静音 / 没全屏 + +## 不支持 +- 关浏览器或锁屏后浏览器进程被挂起 → 通知暂停(不算 DooTask 故障) +- Electron 客户端最小化到托盘时若系统勿扰,仍不弹 +- 多桌面 / 多屏环境下通知只在主屏弹 + +详细排查参考 [[desktop-notify.permission.faq]] 各 OS 步骤。 diff --git a/resources/ai-kb/zh/faq/common-faq/notify-email-fail.md b/resources/ai-kb/zh/faq/common-faq/notify-email-fail.md new file mode 100644 index 000000000..e546743c4 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/notify-email-fail.md @@ -0,0 +1,56 @@ +--- +id: common-faq.notify-email-fail.faq +title: 邮件通知收不到 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 邮件没收到 + - 收不到邮件 + - 验证码邮件 + - 未读邮件汇总 + - 重置密码邮件 + - 邮件丢了 +related_tools: [] +related_pages: [user_settings_email] +prerequisites: [] +negative: + - DooTask 邮件发送失败不会自动重试 + - 邮件被忽略邮箱拦下时不发任何通知 + - 部分公邮 ISP 会延迟数小时甚至直接归入广告,DooTask 无控制权 +last_verified: v1.7.90 +--- + +# 邮件通知收不到 + +## 问题 +DooTask 没发来注册验证邮件、改邮箱验证码邮件、未读消息汇总邮件、密码重置邮件,等了很久收件箱空空。 + +## 原因 +邮件链路要走通需要四个条件: + +1. **管理员配了 SMTP**:`系统设置 → 邮箱` 填了服务器/端口/账号/密码 +2. **SMTP 凭证有效**:账号没改密、IP 没被反垃圾封 +3. **收件人不在忽略列表**:管理后台「忽略邮箱地址」列表里的地址所有 DooTask 邮件都不发 +4. **收件方不拦截**:垃圾邮箱、企业网关、域名信誉过滤都可能丢 + +未读消息邮件还要额外满足: +- 个人开了 `notice_msg` +- 当前时间在 `msg_unread_time_ranges` 配置时段内 +- 未读分钟数超过 `msg_unread_user_minute` / `msg_unread_group_minute` + +## 解决 +1. 个人设置 → 邮箱 → 「绑定 / 修改邮箱」时点「发送验证码」抓到第一手错误 +2. 检查垃圾邮件 / 广告 / 订阅文件夹 +3. 改用主流邮箱测试(Gmail / QQ / Outlook),排除企业邮箱反垃圾 +4. 让管理员进 [[email-notice.troubleshoot.faq]] 列出的「邮件发送测试」抓详细错误 +5. 让管理员从「忽略邮箱地址」移除你的邮箱 +6. 管理员级问题:SMTP 端口 25 被云厂商封 → 换 465(SSL)或 587(STARTTLS)+ 授权码 + +## 不支持 +- DooTask 无「邮件发送队列查询」界面,发不出去就是发不出去 +- 不支持配置多个 SMTP 做主备切换 +- 不支持自定义邮件模板(仅可改发件人显示名) + +[[email-notice.config.howto]] 是管理员配置入口;[[email-notice.troubleshoot.faq]] 给管理员更详细的排查。 diff --git a/resources/ai-kb/zh/faq/common-faq/notify-mobile-fail.md b/resources/ai-kb/zh/faq/common-faq/notify-mobile-fail.md new file mode 100644 index 000000000..cd1924e1d --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/notify-mobile-fail.md @@ -0,0 +1,55 @@ +--- +id: common-faq.notify-mobile-fail.faq +title: 手机收不到通知 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 手机不响 + - 手机收不到 + - APP 没推送 + - 锁屏没消息 + - 手机不弹 + - 安卓收不到 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - PC 在线时 APP 推送会延迟 10 秒;这期间被读则跳过推送,不是故障 + - 静默消息(silence=1)和自己发的消息本来不推 + - 友盟别名 30 天不启动 APP 会过期,需重新登录刷新 +last_verified: v1.7.90 +--- + +# 手机收不到通知 + +## 问题 +桌面 / Web 端可以正常收到 DooTask 消息,但移动 APP 后台 / 退出登录状态下没推送提醒、没振动、锁屏空白。 + +## 排查顺序 + +1. **当前会话是不是免打扰**:APP 内打开聊天右上角看免打扰开关 +2. **系统通知权限**:iOS / Android 是否给 DooTask 通知权限,详见 [[mobile-notify.permission.faq]] +3. **国产 ROM 后台杀进程**:华为 / 小米 / OPPO / VIVO 需手动允许 DooTask「自启动 + 后台运行」 +4. **PC 端 60 秒内活跃过**:DooTask 推送规则会延迟手机 10 秒,期间消息被 PC 读完会跳过 APP 推送(设计行为) +5. **管理员有没配友盟**:管理后台 → APP 推送 → 检查 iOS/Android Appkey + Master Secret 是否填好 +6. **友盟别名失效**:卸载 APP / 30 天没启动 → 重新登录 APP 触发 UmengAlias 注册 +7. **会话级 / 项目级免打扰**:在 APP 内对应会话 / 项目设置里检查 + +## 解决 +1. 退出 APP 重新登录刷新 token + 友盟别名 +2. 关掉 PC 端临时测试(断网或退出账号)→ 验证 APP 是否能即时收 +3. 找系统管理员看 `umeng_logs` 表的最新返回;详见 [[push-notice.troubleshoot.faq]] +4. 国产 ROM 详细步骤见 [[mobile-notify.permission.faq]] + +## 不支持 +- APP 无「重发上次推送」按钮,需对方重新触发消息 +- 已读消息不再推送,跨设备打开 PC 读完不会再响 APP +- 没有手机震动 / 声音的精细自定义,跟系统通知设置走 + +## 检查清单(用户自助) +- [ ] iOS 设置 → DooTask → 通知 → 允许通知 + 锁屏 + 横幅 +- [ ] Android 设置 → DooTask → 通知 + 自启动 + 电池不受限 +- [ ] APP 内退出账号 → 重新登录 +- [ ] 群聊免打扰开关确认关闭 diff --git a/resources/ai-kb/zh/faq/common-faq/notify-no-receive.md b/resources/ai-kb/zh/faq/common-faq/notify-no-receive.md new file mode 100644 index 000000000..d35e59ef1 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/notify-no-receive.md @@ -0,0 +1,49 @@ +--- +id: common-faq.notify-no-receive.faq +title: 收不到任何通知 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 收不到通知 + - 一条通知都没有 + - 所有通知都没了 + - 通知全静音了 + - 不响也不弹 + - 通知不工作 +related_tools: [] +related_pages: [user_settings_notification] +prerequisites: [] +negative: + - DooTask 不会主动短信通知,不必去等短信 + - 系统不会自动告知用户「你被免打扰了」;得自己检查设置 + - 「已读」消息不会再次推送,被另一端读完不算故障 +last_verified: v1.7.90 +--- + +# 收不到任何通知 + +## 问题 +DooTask 用户表示完全没收到任何通知——桌面不弹、APP 不响、邮件没来。 + +## 排查顺序 +DooTask 有四条独立的通知通道,依次自检: + +1. **应用内红点**:左侧聊天列表、任务列表是否有红点。没有 → 后端根本没产生通知,从源头排查(消息真的发给你了?被设了可见用户排除?) +2. **桌面 / Web 通知**:桌面端 / Web 是否拿到系统通知权限,详见 [[desktop-notify.permission.faq]] +3. **移动端 APP 推送**:手机是否给 DooTask 通知权限 + 后台运行;管理员是否配了友盟 [[mobile-notify.permission.faq]] / [[push-notice.troubleshoot.faq]] +4. **邮件通知**:管理员是否配 SMTP;该用户是否在「忽略邮箱」列表里,详见 [[email-notice.troubleshoot.faq]] + +## 解决 +1. 个人设置 → 通知设置 → 把所有要的通道勾上(参考 [[user-settings.notification.howto]]) +2. 检查个人是否开了「全局免打扰」「勿扰时间段」 +3. 检查目标会话 / 项目是否被你单独设了免打扰 +4. 重新登录刷新 socket 连接 +5. 全公司都没通知 → 让管理员检查 swoole 进程、Redis、SMTP、友盟配置 + +## 不支持 +- 没有「通知历史」可回放所有过去通知的全局界面(仅站内红点 + 邮件) +- 静默消息(如他人「已读不回」)本来就不响,不算故障 + +详细各通道独立排查见各 feature 的 troubleshoot 文档。 diff --git a/resources/ai-kb/zh/faq/common-faq/notify-too-many.md b/resources/ai-kb/zh/faq/common-faq/notify-too-many.md new file mode 100644 index 000000000..1b714c9f9 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/notify-too-many.md @@ -0,0 +1,54 @@ +--- +id: common-faq.notify-too-many.faq +title: 通知太多怎么减少 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 通知太多 + - 消息太烦 + - 减少通知 + - 怎么静音 + - 不想接收 + - 关闭某些通知 +related_tools: [] +related_pages: [user_settings_notification, dialog_settings] +prerequisites: [] +negative: + - 没有「一键全静音」开关;通道分项目 / 群 / 邮件 / 推送独立控制 + - 关掉通知不影响别人,但你可能漏看 @ 你的消息 + - 已设的免打扰不自动到期,需手动恢复或设结束时间 +last_verified: v1.7.90 +--- + +# 通知太多怎么减少 + +## 问题 +DooTask 一天弹几百条通知、桌面通知刷屏、APP 总响、邮件每小时一封——想关一部分。 + +## 解决(按粒度从精到粗) + +1. **单会话免打扰**:聊天列表里右键群聊或个人 → 「免打扰」开关,仅静音该会话 +2. **单项目静默**:项目设置 → 通知偏好 → 关闭「任务变更通知」等 +3. **个人通知偏好**:个人设置 → 通知,分项关:[[user-settings.notification.howto]] + - 桌面通知:开 / 关 / 仅 @ 时 + - 邮件通知:未读汇总开关 + - APP 推送:场景开关(@ 时 / 任务变更 / 系统通知) + - 声音:静音 / 不静音 +4. **勿扰时段**:设置「工作时间外不弹」「夜间不响」 +5. **关停整条通道**: + - 桌面:托盘菜单「关闭通知」 + - APP:系统设置里关 DooTask 通知权限 + - 邮件:让管理员把你加进「忽略邮箱」(粗暴方案) + +## 不支持 +- 没有按关键字过滤通知的功能(如「只通知含 BUG 的消息」) +- 不能为单条任务设免打扰,只能整个项目维度 +- 无法屏蔽群里被 @ 的推送:被 @ 一定会推送,即使设了项目通知关闭 + +## 想完全屏蔽某人 +- 个人聊天:右键 → 删除聊天 + 不再接收(仅本端隐藏,对方仍能发) +- 群聊:找群主把对方移出群 + +关掉通知后建议每天主动看一次「未读」红点,避免漏 @。 diff --git a/resources/ai-kb/zh/faq/common-faq/permission-admin-area.md b/resources/ai-kb/zh/faq/common-faq/permission-admin-area.md new file mode 100644 index 000000000..1134ece6f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/permission-admin-area.md @@ -0,0 +1,48 @@ +--- +id: common-faq.permission-admin-area.faq +title: 进不了管理员区 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 进不了管理员 + - 看不到系统设置 + - 没有管理后台 + - 我是管理员怎么进不去 + - 没有左上角设置入口 + - admin 入口不见 +related_tools: [] +related_pages: [user_dropdown] +prerequisites: [] +negative: + - 普通用户即使是部门负责人也不是系统管理员,看不到管理后台 + - 仅靠改前端路由地址访问 /manage 不能绕过权限,后端 API 全部拦截 + - 超级管理员(id=1)专属菜单连普通系统管理员也看不到 +last_verified: v1.7.90 +--- + +# 进不了管理员区 + +## 问题 +个人头像下拉里没有「管理后台」「系统设置」入口,或菜单里少了「团队管理」「数据导出」「LDAP」「License」等管理员项。 + +## 原因 +DooTask 后台访问分两级: + +- **系统管理员(admin)**:`userIsAdmin = true`,看得到「系统设置」「团队管理」「APP 推送」「数据导出」「LDAP」「举报管理」「License Key」等 +- **超级管理员(super-admin)**:仅注册的第一个账号(id=1),额外可改超管设置、看许可证激活等 + +部门负责人、项目负责人都不属于系统管理员,与管理员菜单无关。 + +## 解决 +1. 让现任系统管理员进「团队管理 → 成员」找到你,给你勾上「管理员」标识 +2. 你刷新页面或重新登录后,头像下拉会出现「系统设置」「管理后台」 +3. 若该功能只对超级管理员开放(如重置 license),只能由 id=1 的账号操作 +4. 全公司没人记得管理员账号 → 用根账号到容器内执行 `./cmd artisan dootask:reset-admin` 重置(需服务器权限) + +参考 [[role-permission.grant-admin.howto]],权限规则见 [[role-permission.admin.concept]] / [[role-permission.super-admin.concept]]。 + +## 不支持 +- 没有「临时管理员」「申请代管」流程 +- 系统管理员权限是开关式(true/false),不细分子模块(不能只让某人看 LDAP 不让看用户) diff --git a/resources/ai-kb/zh/faq/common-faq/permission-cannot-add-member.md b/resources/ai-kb/zh/faq/common-faq/permission-cannot-add-member.md new file mode 100644 index 000000000..fb2336f73 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/permission-cannot-add-member.md @@ -0,0 +1,49 @@ +--- +id: common-faq.permission-cannot-add-member.faq +title: 不能加成员 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 不能加成员 + - 加不进项目 + - 邀请不了 + - 不能拉人进群 + - 没法加同事 + - 邀请按钮灰 +related_tools: [] +related_pages: [project_members, dialog_members] +prerequisites: [] +negative: + - 邀请只能选「已注册用户」,不能直接邀请陌生邮箱进项目 + - 普通成员无法主动把外人拉进项目;只能由负责人 / 管理员操作 + - 自己邀请自己 / 重复邀请同一用户都会被静默忽略 +last_verified: v1.7.90 +--- + +# 不能加成员 + +## 问题 +想把同事加进项目、群聊或会议时,搜不到人、邀请按钮灰、或弹出「无权操作」「人员不在可邀请范围」。 + +## 原因 +分三类场景: + +- **项目**:只有项目负责人 / 系统管理员能邀请;普通成员的「成员」面板只能查看,不能加 +- **群聊**:默认所有群成员都可邀请;群创建者可在群设置里勾「仅群主邀请」,开启后非群主邀请按钮变灰 +- **会议**:会议创建者可邀;普通参与者只能转发会议链接 +- **跨部门可见限制**:管理后台启用了「部门隔离」时,搜不到不在你可见部门的用户 + +## 解决 +1. 项目层:让项目负责人或系统管理员代加(参考 [[app-system.create-project.howto]] 中的「邀请协作者」) +2. 群聊层:让群主在群设置关闭「仅群主邀请」开关,或让群主代加 +3. 会议层:让会议创建人邀请,或把链接通过群聊转发 +4. 部门隔离层:找系统管理员调「可见部门」配置(管理后台 → 团队管理 → 部门权限) +5. 用户不存在 → 让系统管理员先在「团队管理 → 成员」里建账号或导入 + +## 不支持 +- 没有「申请加入」流程;用户只能被动接受邀请 +- 不能跨系统直接邀请外部邮箱临时进群,必须先在 DooTask 注册或被批量导入 + +[[role-permission.project-role.concept]] / [[messenger.group.howto.create]] 之类相关章节按需检索 diff --git a/resources/ai-kb/zh/faq/common-faq/permission-cannot-edit-project.md b/resources/ai-kb/zh/faq/common-faq/permission-cannot-edit-project.md new file mode 100644 index 000000000..78779d725 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/permission-cannot-edit-project.md @@ -0,0 +1,49 @@ +--- +id: common-faq.permission-cannot-edit-project.faq +title: 不能编辑项目设置 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 不能编辑项目 + - 改不了项目名 + - 项目设置灰的 + - 项目设置打不开 + - 为什么改不了工作流 + - 项目设置无权限 +related_tools: [] +related_pages: [project_detail, project_settings] +prerequisites: [] +negative: + - 普通成员(非负责人)无法改项目名、流程、列、权限等结构性设置 + - 项目负责人也不能改超出本项目范围的设置(如系统级模板) + - 没有「临时编辑权限」概念,必须先调角色再操作 +last_verified: v1.7.90 +--- + +# 不能编辑项目设置 + +## 问题 +打开项目设置发现按钮变灰,或保存时弹「权限不足」「您不是项目负责人」「无权操作」。改项目名、改工作流、删列、改成员都不能用。 + +## 原因 +DooTask 项目角色分三级,编辑权限按角色细分: + +- **成员(member)**:能看任务、改自己负责的任务,不能改项目结构 +- **负责人(owner)**:可改项目名 / 描述 / 流程 / 列模板 / 成员 / 删除项目;一个项目可有多个负责人 +- **系统管理员**:能强制改任意项目(包括接管负责人为空的孤儿项目) + +普通成员看到「编辑项目」按钮也能点开表单,但提交时后端拦截。 + +## 解决 +1. 在项目详情页点右上角「成员」查看自己的角色徽章 +2. 若显示「成员」,找现任负责人在「成员管理」把你升级为「负责人」:参考 [[role-permission.transfer-owner.howto]] +3. 若现任负责人已离职 / 找不到人,让系统管理员介入接管 +4. 若只是想改个别任务,无需升级——直接成为任务负责人即可改任务自身 + +## 不支持 +- 不能临时申请项目编辑权限,必须先调角色 +- 角色变更后无需刷新,前端 socket 推送会立即生效 + +[[role-permission.permission-denied.faq]] / [[role-permission.project-role.concept]] diff --git a/resources/ai-kb/zh/faq/common-faq/permission-cannot-see-task.md b/resources/ai-kb/zh/faq/common-faq/permission-cannot-see-task.md new file mode 100644 index 000000000..4f7bdd1c2 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/permission-cannot-see-task.md @@ -0,0 +1,50 @@ +--- +id: common-faq.permission-cannot-see-task.faq +title: 看不到某条任务 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 看不到任务 + - 任务消失 + - 任务不显示 + - 同事说有任务但我看不见 + - 任务隐藏 + - 找不到任务 +related_tools: [] +related_pages: [task_list, project_detail] +prerequisites: [] +negative: + - 不存在「显示所有任务」开关,任务可见性按项目 + 任务双层控制 + - 不能强制让自己看到他人的私密任务,除非被显式加入可见用户 + - 任务被归档 / 删除后默认列表不显示,但未真正消失 +last_verified: v1.7.90 +--- + +# 看不到某条任务 + +## 问题 +同事提到「给你建了任务」「在 X 项目里」,但自己在任务列表、看板、仪表盘里搜不到。 + +## 原因 +按下面顺序判断哪一层把任务屏蔽了: + +1. **不是项目成员**:项目按邀请制,没被加入就完全看不见项目里的任何任务 +2. **任务设了「可见用户」**:任务详情可勾选可见名单,没勾你时即使你是项目成员也看不见 +3. **任务被归档**:任务列表默认隐藏「已归档」,要手动切到「归档」分组 +4. **任务在已删除列表**:删除任务进回收站,30 天内可恢复,30 天后清除 +5. **筛选条件挡住**:列表顶部可能开了「只看我的」「只看本周」筛选 + +## 解决 +1. 先问对方:项目 ID、任务 ID、是不是设了可见用户 +2. 项目级看不到 → 让项目负责人邀请你进项目 +3. 任务级看不到 → 让任务负责人把你加进可见用户名单 +4. 归档看不到 → 列表筛选切「归档」或在项目设置「归档列表」找 +5. 筛选挡住 → 列表顶部「重置筛选」或「显示全部」 + +## 不支持 +- 管理员后台没有「列出某用户能看的所有任务」工具 +- 即使是系统管理员,也不能直接看自己未加入的项目里的可见用户限制任务(需先以管理员身份加入项目) + +[[role-permission.task-role.concept]] / [[role-permission.permission-denied.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/permission-readonly.md b/resources/ai-kb/zh/faq/common-faq/permission-readonly.md new file mode 100644 index 000000000..7b55d92d3 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/permission-readonly.md @@ -0,0 +1,52 @@ +--- +id: common-faq.permission-readonly.faq +title: 显示只读模式 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 只读模式 + - 只能看不能改 + - 文档只读 + - 任务只读 + - 不能编辑了 + - 只读怎么回事 +related_tools: [] +related_pages: [file_detail, task_detail] +prerequisites: [] +negative: + - 只读不是一个全局开关,是按场景动态计算的权限结果 + - 自己创建的内容也可能进只读:被锁定 / 被归档 / 被分享出去的副本 + - 只读不可手动关闭;要恢复编辑必须解除触发条件 +last_verified: v1.7.90 +--- + +# 显示只读模式 + +## 问题 +文档、任务、看板、白板、思维导图、Office 文件等打开后顶部提示「只读模式」「Read Only」「不可编辑」,键盘输入无效。 + +## 原因 +DooTask 把以下情形统一标为「只读」: + +- **不是负责人 / 协作者**:仅在可见用户名单里能看不能改 +- **文件被设为只读分享**:分享链接的「权限」设为「仅查看」,访问者只读 +- **任务已完成 / 已归档**:状态进入 done / archived 后字段锁定 +- **协同冲突自动降级**:多端同时编辑时若网络异常,部分客户端会被服务器降级为只读防覆盖 +- **演示模式**:会议中的「同步演示」让被同步方进入只读跟随状态 +- **客户端版本旧**:服务端文件格式新于客户端时为防破坏只允许预览 + +## 解决 +1. 文档 / 任务 → 让负责人把你升级为「可编辑协作者」 +2. 分享链接只读 → 找分享发起人在分享设置改「可编辑」 +3. 已完成任务 → 重新打开(把状态从「已完成」改回「进行中」) +4. 协同冲突 → 关闭多余的端,刷新当前页重连 +5. 演示模式 → 退出演示同步即可恢复 +6. 客户端旧 → 升级到最新版 + +## 不支持 +- 「只读」状态不持久——条件解除后自动恢复,不需要任何手动「关闭只读」操作 +- 没有强制「我就要写」的覆盖按钮(防数据互踩) + +相关:[[role-permission.task-role.concept]]、[[file.share.howto]]、[[role-permission.permission-denied.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/plugin-not-loaded.md b/resources/ai-kb/zh/faq/common-faq/plugin-not-loaded.md new file mode 100644 index 000000000..cde085ac0 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/plugin-not-loaded.md @@ -0,0 +1,59 @@ +--- +id: common-faq.plugin-not-loaded.faq +title: 插件 / 微应用装了但用不了 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 插件装了用不了 + - 微应用打不开 + - 插件菜单不显示 + - 应用安装了找不到 + - 插件白屏 + - 装完没反应 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 部分插件需要管理员授权可见范围,普通用户才能看到入口 + - 插件依赖独立 Docker 容器,容器没起来即使「已安装」也用不了 + - 插件可能与主程序版本不兼容,需升级主程序或换插件版本 +last_verified: v1.7.90 +--- + +# 插件 / 微应用装了但用不了 + +## 问题 +- AppStore 显示已安装,但应用菜单看不到入口 +- 点开是白屏 / 404 / 「服务不可用」 + +## 排查(按概率排) + +**可见范围未开(最常见)** +管理员装插件后默认仅自己 / 全员可见。普通用户看不到时联系管理员到「应用 → 管理菜单」配置。详见 [[app-system.visibility.concept]] 或 [[micro-app.permission.concept]]。 + +**插件容器没起** +插件靠独立 Docker 容器,crash 时白屏。`docker ps | grep <插件名>` 没看到就 AppStore 点「重启」,或 `docker logs <容器名>` 看报错。 + +**前端缓存旧菜单**:F5 强刷、桌面端 / 移动端杀进程重开。 + +**版本不兼容** +AppStore 提示「需要主程序 vX.Y.Z+」时升级主程序([[common-faq.deploy-update.faq]])或回退插件版本。 + +**浏览器拦截 iframe** +微应用多用 iframe,广告拦截扩展可能阻止:试无痕。HTTPS 部署时插件必须用 https。 + +**端口冲突**:容器端口被占,`docker logs` 看报错,改插件 docker-compose 端口映射。 + +## 重装 +1. AppStore 该插件 → 「卸载」等容器停 +2. 重新「安装」→ 看进度条到 100% + +## 不要做 +- 不要 `rm -rf` 插件目录,AppStore 状态会错乱 +- 不要直接改 `docker/appstore/apps//` 下的 docker-compose(升级会被覆盖) + +## 相关 +- AppStore 装不上:[[appstore.cannot-install.faq]] +- 插件升级:[[appstore.update.howto]] diff --git a/resources/ai-kb/zh/faq/common-faq/search-no-result.md b/resources/ai-kb/zh/faq/common-faq/search-no-result.md new file mode 100644 index 000000000..9a9d27ae1 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/search-no-result.md @@ -0,0 +1,71 @@ +--- +id: common-faq.search-no-result.faq +title: 全局搜索没结果 / 搜索功能不可用 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 搜不到东西 + - 全局搜索没结果 + - 搜索为空 + - manticore 没装 + - 搜索功能用不了 + - 搜索失效 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 默认不带全文搜索引擎,需在应用市场装 search 插件(Manticore) + - 没装搜索插件时降级为 MySQL LIKE,只能搜简单关键字且速度慢 + - Manticore 装上后历史数据需要回填一次才能搜到 +last_verified: v1.7.90 +--- + +# 全局搜索没结果 / 搜索功能不可用 + +## 问题 +- 顶部搜索框输关键字转圈或显示「无结果」 +- 历史消息 / 任务 / 文件搜不到 +- 同义词模糊搜索完全无效 + +## 原因 +全局搜索依赖 Manticore Search 引擎,由 search 插件提供: + +| 状态 | 表现 | +|---|---| +| 未装 search 插件 | 降级到 MySQL `LIKE`,慢且弱 | +| 已装但未回填 | 新数据能搜,老数据搜不到 | +| 装了但容器没起 | 全局搜索完全失败 | + +`app/Module/Manticore/` 判断可用性,不可用就降级。 + +## 解决 + +**装搜索插件(管理员)** +进 AppStore([[appstore.entry.menu-map]])找「search」插件(Manticore 15.x)→ 安装 → 等容器启动。 + +**回填历史数据** +插件首启自动同步增量,老数据要管理员触发: +- 「应用 → 系统设置 → 搜索」找「重建索引」 +- 或 `./cmd artisan manticore:rebuild`(视版本) + +**检查容器** +```bash +docker ps | grep manticore +``` +没起就 `./cmd up`。 + +**看后端日志** +搜索失败日志会写 `Manticore search error: <错误>`,查 `storage/logs/laravel.log` 过滤 `Manticore`。 + +**关键字过短**:默认最小 2-3 字符。 + +## 不支持 +- 不支持自定义同义词词典 +- 不支持搜索权限到字段级(只到「可见用户」) +- 部分插件数据(如审批表单)不进索引 + +## 相关 +- 性能慢:[[common-faq.deploy-perf.faq]] +- 插件不工作:[[common-faq.plugin-not-loaded.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/sync-ldap.md b/resources/ai-kb/zh/faq/common-faq/sync-ldap.md new file mode 100644 index 000000000..52e945168 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/sync-ldap.md @@ -0,0 +1,63 @@ +--- +id: common-faq.sync-ldap.faq +title: LDAP 用户 / 部门同步不到位 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - LDAP 同步不全 + - 域账号没拉过来 + - 部门同步缺失 + - AD 用户少了 + - LDAP 改了 DooTask 没更新 + - LDAP 单向同步 +related_tools: [] +related_pages: [] +prerequisites: + - 已配置 LDAP 接入(系统设置 → 第三方接入) +negative: + - LDAP 默认是「登录时同步该用户」,不是定时全量同步 + - LDAP 删除用户不会自动联动注销 DooTask 账号 + - 没有「立即全量同步」按钮,只能靠用户登录触发 +last_verified: v1.7.90 +--- + +# LDAP 用户 / 部门同步不到位 + +## 问题 +- LDAP / AD 里加了新部门 / 新员工,DooTask 看不到 +- LDAP 改了员工部门,DooTask 还是旧值 +- LDAP 禁用 / 删除了用户,DooTask 这边账号还能登录 + +## 原因 +DooTask 的 LDAP 集成是**按需拉取**模式,不是定时全量: + +- 用户登录时,按账号去 LDAP 验证 → 验证通过则同步该用户基础信息 +- 部门结构按用户的 DN 推断,没人登录就不会创建新部门 +- LDAP 删用户后,DooTask 仍保留账号(避免误删历史数据) + +这套设计目的是**避免大批量同步阻塞**和保留**离职员工的历史关联**。 + +## 解决 + +**新用户不出现** +让该用户**至少登录一次** → 自动同步进 DooTask;或管理员手动「邀请」走预占。 + +**部门 / 邮箱信息过期** +让用户**重新登录一次** → 后端会更新 `users` 表的 email / nickname / department。 + +**LDAP 删除的用户仍能登录** +- 用户下次登录时 LDAP 会拒绝,DooTask 同步失败该用户登录失败 +- 想立刻封号:管理员后台「成员管理」手动禁用 / 注销 +- 想批量清理:管理员通过数据库或 API 批量禁用 + +**想立即全量同步** +没有自带按钮。可选: +- 等用户自然登录 +- 写脚本调用 LDAP + DooTask API 批量预创建 +- 重启 Swoole 容器并不会触发同步,重启没用 + +## 相关 +- LDAP 排错:[[ldap.troubleshoot.faq]] +- LDAP 配置:[[ldap.config.howto]] diff --git a/resources/ai-kb/zh/faq/common-faq/sync-multi-device.md b/resources/ai-kb/zh/faq/common-faq/sync-multi-device.md new file mode 100644 index 000000000..7432b3555 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/sync-multi-device.md @@ -0,0 +1,52 @@ +--- +id: common-faq.sync-multi-device.faq +title: 多端不同步(桌面端、Web、手机) +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 多端不同步 + - 手机和电脑数据不一样 + - 桌面端没刷新 + - 多设备数据不一致 + - 多端登录数据不同 + - 手机看到的和网页不一样 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 多端不存在「本地副本同步」概念,所有数据实时从服务器拉 + - 数据本身不会因为多端登录冲突而被复制或合并 + - 某些缓存(如未读数、消息列表)需要重新进入页面才会刷新 +last_verified: v1.7.90 +--- + +# 多端不同步(桌面端、Web、手机) + +## 问题 +同一个账号在桌面端 / 浏览器 / 手机上同时登录时,三端看到的数据不一致:消息已读未读、任务变化、未读数等不同步。 + +## 原因 +DooTask 所有数据都从同一个后端服务器读,不存在本地副本同步问题。但每端的实时性独立: + +- 每端各自维持一条 WebSocket 长连接 +- 每端各自管理本地 store 缓存 +- 后端推送变更时,离线 / 断网的端会丢失推送 +- 已读状态不会在端之间联动同步(消息在 A 端读了,B 端可能仍显示未读,直到 B 端进入该会话) + +桌面端(Electron)和移动端 App 在后台时 WebSocket 也可能被系统冻结。 + +## 解决 +1. **强制刷新**:浏览器 F5;桌面端右键托盘「重启」;移动端 App 杀进程重开 +2. **确认 WebSocket 在线**:右下角连接状态显示绿色 +3. **检查多端实际登录**:「个人设置 → 已登录设备」看哪些端在线 +4. **未读数差异**:进入对应会话 / 任务详情即可重算 + +## 不支持 +- 不支持设备间「同步本地草稿 / 输入中的内容」 +- 不支持端到端 P2P,所有数据都走服务器中转 + +## 相关 +- 设备管理:[[user-account.device.howto]] +- 多设备冲突:[[common-faq.account-multi-device-conflict.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/sync-offline-data.md b/resources/ai-kb/zh/faq/common-faq/sync-offline-data.md new file mode 100644 index 000000000..ff0bf9cf3 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/sync-offline-data.md @@ -0,0 +1,61 @@ +--- +id: common-faq.sync-offline-data.faq +title: 离线后再上线,期间的数据怎么办 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 离线数据 + - 断网后的消息 + - 没在线时的更新 + - 重新上线后补不全 + - 历史消息丢了 + - 离线期间错过了什么 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 不是离线优先架构,不支持本地写入 → 上线后合并 + - 离线期间不能发消息、不能改任务,所有操作必须联网完成 + - WebSocket 断线期间的实时推送不会被服务器缓存补发 +last_verified: v1.7.90 +--- + +# 离线后再上线,期间的数据怎么办 + +## 问题 +- 我刚才断网了 5 分钟,重新上线后聊天历史 / 任务变更能补回来吗? +- 桌面端 / 手机端从后台切回前台,期间的更新怎么获取? + +## DooTask 的同步模型 +DooTask 是「在线优先」架构: + +- 所有读写都直接请求服务器,不存本地副本 +- 在线时通过 WebSocket 接收实时推送 +- 离线 / WS 断开期间的推送**不会被服务器缓存** + +但「数据本身」是按需拉取的: + +- 进入会话页 → 拉取最新消息列表(含离线期间的) +- 进入任务详情 → 拉取最新任务状态 +- 切换页面会触发重新拉取 + +## 离线期间会发生什么 + +| 数据类型 | 重新上线后是否能看到 | +|---|---| +| 聊天消息 | 是,进入会话即拉最新 | +| 任务变更 | 是,进入任务 / 项目即拉最新 | +| 实时通知(弹窗) | 否,已错过不会重发 | +| 未读数 | 是,重新计算 | +| 推送通知(手机) | 是,由 UMENG/APNs 离线推送 | + +## 解决 +1. 重新上线后**手动进各页面**走一遍 → 自动拉新 +2. 移动端开启系统通知,离线时也能收到推送([[mobile-notify.toggle.howto]]) +3. 邮件通知作为兜底([[email-notice.scenarios.concept]]) + +## 不支持 +- 不支持「离线编辑、上线合并」 +- 不支持离线消息草稿 diff --git a/resources/ai-kb/zh/faq/common-faq/sync-task-not-update.md b/resources/ai-kb/zh/faq/common-faq/sync-task-not-update.md new file mode 100644 index 000000000..f6ec4897f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/sync-task-not-update.md @@ -0,0 +1,50 @@ +--- +id: common-faq.sync-task-not-update.faq +title: 任务更新没同步 / 看不到别人改的字段 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 任务没刷新 + - 别人改了我看不到 + - 任务字段不同步 + - 实时刷新失败 + - 任务变化收不到 + - 改完没反应 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 没有"轮询拉新"机制,所有实时性都依赖 WebSocket + - WebSocket 断线期间发生的变更不会自动补拉 + - 关闭浏览器标签后再打开不会自动重连之前的 WS 会话 +last_verified: v1.7.90 +--- + +# 任务更新没同步 / 看不到别人改的字段 + +## 问题 +同事在任务上改了截止时间 / 负责人 / 状态,但我这边页面上还是旧值,要刷新才看得到。 + +## 原因 +DooTask 任务字段的实时同步走两条路径: + +- **WebSocket 推送**:后端在 `Task` 模型保存后通过 `Doo::userIdPush` 推 `task` 事件,前端 store 收到后更新本地缓存 +- **进入页面拉一次**:进任务详情 / 项目页时主动拉一次最新数据 + +如果出现「同事改了我看不到」,多数是 WebSocket 推送没到达: + +- 浏览器后台休眠 / 切到别的标签页时 WS 可能被节流 +- 网络抖动后 WS 断开但前端还没察觉 +- 同事改的字段不在你的可见范围(如可见用户限制) + +## 解决 +1. 进任意其他页(项目列表)再回当前页 → 强制重新拉一次 +2. 看右下角连接状态:显示「已断开」就等待自动重连或刷浏览器 +3. F5 刷新,彻底重拉所有 store +4. 确认对方真的有修改:进任务详情看修改时间字段 + +## 相关 +- 仪表盘类似问题:[[dashboard.refresh.faq]] +- WebSocket 断开排查:[[common-faq.sync-websocket-disconnect.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/sync-websocket-disconnect.md b/resources/ai-kb/zh/faq/common-faq/sync-websocket-disconnect.md new file mode 100644 index 000000000..6744fabe7 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/sync-websocket-disconnect.md @@ -0,0 +1,58 @@ +--- +id: common-faq.sync-websocket-disconnect.faq +title: WebSocket 频繁断开 / 一直显示「连接中」 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - WebSocket 断了 + - 连接中 + - 已断开 + - 一直在重连 + - ws 掉线 + - 长连接断开 + - 实时连接失败 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - WebSocket 断开时新消息和任务推送会丢失,重连后不会自动补拉历史推送 + - 没有手动「重连」按钮,前端按指数退避自动重连 + - 反向代理(nginx / 云防火墙)超时短于 60s 时会强制断开 WS +last_verified: v1.7.90 +--- + +# WebSocket 频繁断开 / 一直显示「连接中」 + +## 问题 +页面右下角的连接状态频繁在「已连接」「已断开」「连接中」之间切换;或者持续显示「连接中」始终连不上。 + +## 常见原因 + 排查 + +**1. 反向代理超时太短** +nginx / Apache / 云 LB 默认 60s 后空闲断开 WebSocket。需要: +- nginx:`proxy_read_timeout 3600s;` 和 `proxy_send_timeout 3600s;` +- 必须支持 `Upgrade` + `Connection` 头透传 + +**2. HTTPS 部署没开 WSS** +如果站点是 https 但 WebSocket 走 ws://(不带 s),浏览器会拒绝。后端要同时支持 wss(自动跟随 https)。 + +**3. 客户端网络不稳定** +- 公司代理 / 防火墙拦截长连接 +- 移动设备切 WiFi / 4G 触发重连 +- 浏览器后台休眠超过几分钟会被系统挂起 + +**4. 后端 Swoole 进程异常** +后端日志看 `storage/logs/laravel.log`,搜 `WebSocket` 关键字。 + +## 解决 +1. **刷新浏览器** → 重新建立连接 +2. 看右下角连接状态:等几秒看是否自动重连 +3. **管理员**:检查 nginx 反代配置(timeout、Upgrade 头) +4. **管理员**:`./cmd php restart` 重启后端 Swoole 进程 +5. 桌面端 / 移动端 App 杀进程重开 + +## 相关 +- 任务不同步:[[common-faq.sync-task-not-update.faq]] +- 部署性能:[[common-faq.deploy-perf.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/theme-cant-change.md b/resources/ai-kb/zh/faq/common-faq/theme-cant-change.md new file mode 100644 index 000000000..2fff65650 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/theme-cant-change.md @@ -0,0 +1,67 @@ +--- +id: common-faq.theme-cant-change.faq +title: 切换主题 / 深色模式失败 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 切换主题失败 + - 深色模式不生效 + - 黑夜模式 + - 主题颜色 + - 主题没保存 + - 暗色模式 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不支持自定义主题色,只在预设主题里选 + - 部分微应用 / 插件没适配深色模式,会出现明暗夹杂 + - 跟随系统主题受浏览器对 prefers-color-scheme 的支持 +last_verified: v1.7.90 +--- + +# 切换主题 / 深色模式失败 + +## 问题 +- 「个人设置 → 主题」切了但界面没变 +- 切完一半元素是深色、一半浅色 +- 跟随系统切不动 +- 刷新后又变回去 + +## 操作 +1. 个人头像 → 「个人设置」找「主题」 +2. 选浅色 / 深色 / 跟随系统 +3. 选完立即生效,无需刷新 + +## 不生效常见原因 + +**浏览器缓存**:F5 强刷、无痕模式、清站点缓存。 + +**部分插件 / 微应用没适配** +- OnlyOffice、流程图、思维导图用独立 iframe,主程序的深色模式传不进去 +- 表现:聊天深色但 office 文档白底 +- 是已知限制 + +**跟随系统不切** +- 浏览器 / 操作系统的 `prefers-color-scheme` 设置不正确 +- Linux 桌面 / 部分国产浏览器可能不支持 +- 改用「深色」/「浅色」固定选项 + +**多端不一致** +- 主题存到后端 `user.theme`,其他端登录会拉 +- 桌面端 / 移动端 App 可能有独立开关,需各端单独设 + +**浏览器扩展冲突** +- Dark Reader 等扩展会覆盖站点 CSS +- 把 DooTask 域名加扩展白名单 + +## 不支持 +- 不支持自定义主色 / 渐变 +- 不支持按时间自动切换(如日落变暗) +- 不支持单页面单主题(必须全局) + +## 相关 +- 个人主题设置:[[user-settings.theme.howto]] +- 语言切换问题:[[common-faq.language-cant-change.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/upload-disk-full.md b/resources/ai-kb/zh/faq/common-faq/upload-disk-full.md new file mode 100644 index 000000000..a0088dcc8 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/upload-disk-full.md @@ -0,0 +1,58 @@ +--- +id: common-faq.upload-disk-full.faq +title: 服务器存储满 +type: faq +feature: common-faq +scope: admin +locale: zh +aliases: + - 磁盘满 + - 存储空间不足 + - 服务器满了 + - No space left + - 文件写不进 + - 上传失败磁盘 +related_tools: [] +related_pages: [] +prerequisites: + - 需要服务器 shell 权限 +negative: + - DooTask 主程序无「按用户配额」机制,任何用户都可用满全部存储 + - 系统不会自动清理已删除文件——回收站 30 天后真删才释放空间 + - 没有 web 界面查询「谁占用最多」,需要在服务器命令行统计 +last_verified: v1.7.90 +--- + +# 服务器存储满 + +## 问题 +所有用户都报上传失败,错误日志包含 `No space left on device`、`disk full`、`ENOSPC`。聊天图片发不出,文件中心打不开新文件。 + +## 原因 +DooTask 把所有上传写到容器内的 `public/uploads/`(默认通过宿主机 bind mount 挂出),同时 MySQL data、Redis dump、容器层日志、AI 插件缓存也占空间。当任一卷写满,PHP/Swoole 立即写失败。 + +常见膨胀源: +- 文件中心累积多年的大附件 +- 聊天图片 + 视频未清理 +- Office / 白板的历史版本(每改一次留一份) +- 容器日志:`docker logs` 长期不轮转 +- MySQL 慢日志 / binlog 未限制 + +## 解决 +1. `df -h` 看是宿主机根盘满还是 DooTask 数据盘满 +2. `du -sh /path/to/dootask/public/uploads/* | sort -h` 找最大目录 +3. 临时清理: + - `public/uploads/tmp/` 可放心清空(缓存) + - `docker system prune -af --volumes`(注意:会清未挂的镜像/卷) + - 截断容器日志:`truncate -s 0 $(docker inspect --format '{{.LogPath}}' )` +4. 长期: + - 进管理后台「数据导出 / 文件中心」清理超大老文件 + - 系统设置「文件设置」限制打包下载([[system-setting.file.howto]]) + - 给 docker 配 `log-opts max-size`,给 MySQL 配 binlog 轮转 + +## 不支持 +- DooTask 没有按用户配额功能 +- 无内置「自动清理 N 天前」策略;要做需写定时脚本 +- 写满时已收到的消息和任务不会丢,只是新上传暂时失败;恢复空间后立即可写 + +清理后无需重启容器,PHP 进程会在下一次请求自动恢复。 diff --git a/resources/ai-kb/zh/faq/common-faq/upload-image-error.md b/resources/ai-kb/zh/faq/common-faq/upload-image-error.md new file mode 100644 index 000000000..df811188f --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/upload-image-error.md @@ -0,0 +1,50 @@ +--- +id: common-faq.upload-image-error.faq +title: 图片预览失败 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 图片传上去打不开 + - 图片裂了 + - 缩略图加载不出 + - 显示损坏图标 + - 图片 404 + - 图片预览失败 +related_tools: [] +related_pages: [file_detail, dialog_image_viewer] +prerequisites: [] +negative: + - 图片上传成功不代表预览一定成功——缩略图是异步生成的,可能慢几秒 + - HEIC / HEIF / TIFF / RAW / PSD 等格式默认不生成缩略图 + - 浏览器层缓存被污染后即使服务端图片正常也可能裂;得清缓存 +last_verified: v1.7.90 +--- + +# 图片预览失败 + +## 问题 +图片成功上传,但消息气泡 / 文件详情显示破图、灰底叹号、加载圈一直转,或点开提示「图片加载失败」。 + +## 原因 +- **缩略图未生成**:服务端 GD/Imagick 在后台异步生成缩略图,前 1-3 秒内显示原图占位 +- **格式不被识别**:HEIC、TIFF、PSD、RAW 等格式 GD 默认无法解码 +- **GIF 自动转静图**:GIF 上传时若 `autoThumb` 关闭,则保留原文件不做缩略图 +- **图片实际损坏**:截图工具偶尔输出未关闭的字节流;上传成功但服务端解码失败 +- **Token 过期**:图片 URL 带签名 / cookie,长时间停留页面后凭证失效返回 401/403 +- **CDN / 反代缓存了坏图**:之前传过损坏图,CDN 把坏字节缓存下来 + +## 解决 +1. 先等 3 秒刷新页面看是否是缩略图未及时生成 +2. 改 PNG/JPG/WEBP 重新上传(不要传 HEIC) +3. 刷新页面(Ctrl/Cmd + Shift + R 强刷绕过缓存)后重试 +4. 重新登录或重新打开标签让 token 续期 +5. 链接拷出来直接在浏览器打开,能下载但不能渲染 → 图片本身坏;能下能渲染 → 前端缓存问题 +6. 服务端管理员:检查 `public/uploads/` 目录权限、磁盘剩余空间、`docker logs dootask-php` 看是否报 GD 错误 + +## 不支持 +- 用户端没有「重建缩略图」按钮,重传一次即可触发 +- 富文本 / 聊天里的过期签名链接不会自动续签,需重新打开整个消息 + +通用上传卡顿见 [[common-faq.upload-stuck.faq]] diff --git a/resources/ai-kb/zh/faq/common-faq/upload-size-limit.md b/resources/ai-kb/zh/faq/common-faq/upload-size-limit.md new file mode 100644 index 000000000..a34ca893c --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/upload-size-limit.md @@ -0,0 +1,50 @@ +--- +id: common-faq.upload-size-limit.faq +title: 文件超大上传失败 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 文件太大 + - 文件超过限制 + - 上传失败 413 + - 文件大小超限 + - 大文件传不上 + - 超出文件大小限制 +related_tools: [] +related_pages: [file_upload, dialog_send_file] +prerequisites: [] +negative: + - 单个上传请求受 PHP / Nginx 双层限制,前端的「最大尺寸」提示只是友好封装 + - 没有「拆包重传」按钮,超大文件需要事先分块或直接上传到外部存储 + - 同一文件多次重传不会绕过大小限制 +last_verified: v1.7.90 +--- + +# 文件超大上传失败 + +## 问题 +拖文件或选文件后立即报「超出文件大小限制」「文件过大」「413 Request Entity Too Large」,或上传到 99% 突然失败。 + +## 原因 +DooTask 文件上传受三层限制: + +- **PHP**:`upload_max_filesize` 默认 1024M(容器内 `docker/php/php.ini`) +- **Nginx**:`client_max_body_size`(一般和 PHP 对齐) +- **场景层**:聊天图片、头像、富文本图片各自有更小的尺寸上限(如头像通常 2M,富文本图片 10M) + +任何一层超出都会拒收。出错信息以最先拒绝的那层为准——浏览器层先校验则提示「超出文件大小限制」;后端先校验则提示 413。 + +## 解决 +1. 直接拖文件到「文件中心」走文件上传流程,限制最大(默认 1024M) +2. 大于上限时拆分:用 zip 分卷、或上传到云盘后分享外链 +3. 聊天里发大文件不要走「图片」入口(小限),用「发送文件」按钮(大限) +4. 管理员可调高限制:改 `docker/php/php.ini` 的 `upload_max_filesize` 和 `post_max_size`,同时改 nginx 的 `client_max_body_size`,重启容器生效 + +## 不支持 +- 客户端不会自动分片重传超过 `post_max_size` 的文件 +- 主程序未内置 chunked upload / 断点续传 API(除部分插件场景) +- 修改 php.ini 后必须容器重启,热加载不生效 + +[[file.upload.howto]] / [[system-setting.file.howto]] 给管理员看 diff --git a/resources/ai-kb/zh/faq/common-faq/upload-stuck.md b/resources/ai-kb/zh/faq/common-faq/upload-stuck.md new file mode 100644 index 000000000..f7aa56251 --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/upload-stuck.md @@ -0,0 +1,50 @@ +--- +id: common-faq.upload-stuck.faq +title: 上传卡住进度不动 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 上传卡住 + - 进度条不动 + - 一直转圈 + - 上传超时 + - 上传中断 + - 99% 卡死 +related_tools: [] +related_pages: [file_upload] +prerequisites: [] +negative: + - 没有「断点续传」按钮,卡住后只能重新上传整个文件 + - 服务端任务排队不可视化(同一用户同目录并发会排队,看着像卡住但其实在等) + - 关浏览器标签会立刻中断当前上传 +last_verified: v1.7.90 +--- + +# 上传卡住进度不动 + +## 问题 +拖了文件后进度条停在某个百分比不动,或者一直「上传中…」、转圈,最终超时或自动失败。 + +## 原因 +DooTask 上传卡顿常见于: + +1. **网络抖动 / VPN**:上行带宽不稳,TCP 重传拖累整个请求 +2. **同一用户同目录并发**:后端用 atomic lock 排队避免数据库死锁,前一个文件没传完后一个等着 +3. **反向代理超时**:Nginx 的 `proxy_read_timeout`、`client_body_timeout` 默认值偏小,超大文件传到尾段断开 +4. **磁盘满 / inode 用尽**:服务端写不进文件 +5. **PHP 进程超 max_execution_time**:CLI / FPM 限制了脚本执行时间 + +## 解决 +1. 先刷新页面、关掉 VPN,换稳定网络重试小文件验证链路 +2. 多文件同目录上传 → 改为分目录或串行(一次传一个),避免锁排队 +3. 上传到 99% 失败大多是反向代理超时 → 让管理员调大 nginx 的 `proxy_read_timeout 600s`、`client_body_timeout 600s` +4. 服务端 `df -h` 查容量;`df -i` 查 inode;满了清 `public/uploads/tmp` 缓存 +5. 改 `docker/php/php.ini` 的 `max_execution_time` 和 `max_input_time` 后重启 PHP 容器 + +## 不支持 +- 客户端不做断点续传,卡断后必须重头传 +- 浏览器关闭即上传中断,不会保留到后台继续 + +如果是聊天发文件卡住:先关掉所有 dootask 标签再重开,会清空前端待发队列。 diff --git a/resources/ai-kb/zh/faq/common-faq/upload-type-block.md b/resources/ai-kb/zh/faq/common-faq/upload-type-block.md new file mode 100644 index 000000000..9dc216eaf --- /dev/null +++ b/resources/ai-kb/zh/faq/common-faq/upload-type-block.md @@ -0,0 +1,51 @@ +--- +id: common-faq.upload-type-block.faq +title: 文件类型不允许 +type: faq +feature: common-faq +scope: end-user +locale: zh +aliases: + - 文件类型不允许 + - 不支持的格式 + - 文件后缀 + - 不能上传 exe + - 文件格式错误 + - 后缀名被禁 +related_tools: [] +related_pages: [file_upload, avatar_upload] +prerequisites: [] +negative: + - 类型白名单由场景控制,不能在用户端临时关闭 + - 改文件扩展名并不会真正改文件 MIME,仍可能被服务端检测拦截 + - 头像、聊天图片、文件中心三处各自有不同白名单 +last_verified: v1.7.90 +--- + +# 文件类型不允许 + +## 问题 +上传图片 / 文件后弹出「不支持的格式」「文件类型不允许」「Invalid extension」,文件根本进不来。 + +## 原因 +DooTask 按场景做扩展名白名单: + +- **头像 / 聊天图片 / 富文本贴图**:仅允许 `png`、`jpg`、`jpeg`、`webp`、`gif` +- **录音粘贴**:仅允许 `mp3`、`wav` +- **文件中心 / 项目附件**:默认开放(不在白名单的也可上传,但预览能力可能受限) +- **管理员后台特定接口**(如 LDAP 证书):通常限定 `pem`、`crt`、`key` + +实际白名单写死在 `app/Module/Base.php` 的 `image64`、`record64`、`getUploadFile` 等方法里。 + +## 解决 +1. 把图片转 PNG / JPG / WEBP 再传(用任意图片软件「另存为」即可) +2. 想发 SVG / TIFF / HEIC 等非常规图片 → 改走「文件」入口而不是「图片」入口 +3. 改扩展名(如把 `xxx.heic` 改成 `xxx.jpg`)大概率被服务端 MIME 真值检查拦截,不推荐 +4. 真有特殊需求的扩展 → 让管理员评估是否要把扩展加进白名单(需改后端代码并重启) + +## 不支持 +- 没有用户级「允许我上传 X 类型」开关 +- 不接受同名 zip 套娃上传可执行文件(杀软策略) +- 不保证 HEIC / HEIF(iOS 原生格式)全平台支持,推荐转 JPG + +[[file.upload.howto]] 介绍正常的文件上传入口 diff --git a/resources/ai-kb/zh/faq/dashboard/refresh.md b/resources/ai-kb/zh/faq/dashboard/refresh.md new file mode 100644 index 000000000..ac173eaa4 --- /dev/null +++ b/resources/ai-kb/zh/faq/dashboard/refresh.md @@ -0,0 +1,51 @@ +--- +id: dashboard.refresh.faq +title: 仪表盘不刷新 / 任务变化后看不到 +type: faq +feature: dashboard +scope: end-user +locale: zh +aliases: + - 仪表盘不更新 + - 任务完成了仪表盘还有 + - 仪表盘要手动刷新吗 + - 仪表盘有缓存 + - 仪表盘没数据 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 仪表盘没有手动刷新按钮,靠 600ms 防抖定时器自动刷 + - 任务字段改动是通过 WebSocket 推送进来的,掉线时可能不同步 + - 仪表盘进入页面时会立即拉一次最新数据 +last_verified: v1.7.90 +--- + +# 仪表盘不刷新 / 任务变化后看不到 + +## 问题 +任务完成 / 改了截止时间 / 加了新任务,但仪表盘的列表 / 数字没立刻变化。 + +## 原因 +仪表盘的数据流是「前端 store + WebSocket 推送 + 600ms 防抖定时器」的混合: +- 进入仪表盘页时立即拉一次任务列表 +- 后续靠 WebSocket 推送实时变化 +- 任何任务字段变更触发 `getTaskForDashboard(600)`:600 毫秒后重算分组 + +但如果: +- WebSocket 断开重连 → 期间的事件丢失 +- 浏览器后台休眠 → 定时器暂停 +- 跨标签页的修改 → 仍依赖 WebSocket 推送 + +可能出现仪表盘看到的与真实状态有几秒差异。 + +## 解决 +1. **手动触发重算**:进任意其他页(如左侧栏点项目)再回仪表盘 → 强制拉新数据 +2. **刷新浏览器**(F5):彻底重拉所有 store +3. 看右下角连接状态:若显示"已断开"等几秒待重连 +4. 确认任务确实生效:进任务详情看 complete_at / end_at 字段 + +## 不支持 +- 没有"手动刷新仪表盘"按钮 +- 没有刷新间隔配置(固定 600ms 防抖) +- 不支持 polling 周期性拉数据,只走 WebSocket 推送 diff --git a/resources/ai-kb/zh/faq/desktop-notify/permission.md b/resources/ai-kb/zh/faq/desktop-notify/permission.md new file mode 100644 index 000000000..c6c4c0b07 --- /dev/null +++ b/resources/ai-kb/zh/faq/desktop-notify/permission.md @@ -0,0 +1,67 @@ +--- +id: desktop-notify.permission.faq +title: 桌面通知没权限或没弹窗 +type: faq +feature: desktop-notify +scope: end-user +locale: zh +aliases: + - 桌面通知不弹 + - 没有桌面通知 + - 通知没权限 + - macOS 不弹 + - Windows 不弹 + - DooTask 通知不显示 + - 通知权限授权 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 不会主动重新请求系统通知权限;用户拒绝过一次后只能去系统设置改 + - 系统专注模式 / 勿扰开启时即使 DooTask 有权限也不会弹通知 + - 通知未弹不一定是权限问题,也可能是会话被免打扰或消息被静默发送 +last_verified: v1.7.90 +--- + +# 桌面通知没权限或没弹窗 + +## 问题 +新消息已到达 DooTask 桌面端 / Web 版,但系统通知栏完全没弹出提示。 + +## 原因 +桌面通知依赖操作系统的通知中心,需要授予 DooTask 通知权限,且系统当前未处于勿扰状态。 + +## 解决(macOS) +1. 打开「系统设置 → 通知」 +2. 在应用列表找「DooTask」 +3. 打开「允许通知」 +4. 通知风格选「横幅」或「提醒」 +5. 检查右上角是否处于「专注模式」「勿扰」;如果是,先关掉 +6. 在 DooTask 内随便发送一条消息测试 + +## 解决(Windows 10/11) +1. 「设置 → 系统 → 通知」 +2. 顶部「通知」总开关需为「开」 +3. 下面应用列表找到 DooTask,开关打开 +4. 关闭「专注助手」(设置 → 系统 → 专注助手 → 关) +5. 重启 DooTask 客户端测试 + +## 解决(Linux) +1. GNOME:「设置 → 通知 → DooTask」→ 开启「通知横幅」 +2. KDE:「系统设置 → 通知 → 应用程序通知」→ DooTask +3. 部分发行版需安装 libnotify + +## 解决(Web 版 / 浏览器) +1. 地址栏左侧锁图标 → 站点设置 +2. 「通知」改为「允许」 +3. 刷新页面让 DooTask 重新申请权限 + +## 仍然不弹? +按下面顺序排查: +- 会话是否开了免打扰?详见 [[push-notice.silent.howto]] +- 消息是否被静默发送(silence=true)?正常聊天不会触发,常见于机器人/系统消息 +- 关闭 DooTask 进程后用其他应用测试系统通知是否正常工作(排除系统通知中心被禁) +- 桌面端可在「关于」面板看版本号,旧版本可能有 bug,请升级 + +## 与 Dock / 托盘的区别 +通知不弹但 Dock 角标 / 任务栏闪烁正常,说明消息已到达:详见 [[desktop-notify.tray.concept]]。 diff --git a/resources/ai-kb/zh/faq/electron-client/logs.md b/resources/ai-kb/zh/faq/electron-client/logs.md new file mode 100644 index 000000000..0af5d0496 --- /dev/null +++ b/resources/ai-kb/zh/faq/electron-client/logs.md @@ -0,0 +1,74 @@ +--- +id: electron-client.logs.faq +title: 桌面端日志在哪 / 闪退排查 +type: faq +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面端日志 + - 客户端崩溃 + - 桌面端闪退 + - 客户端打不开 + - 客户端报错 + - 日志路径 + - log 在哪 + - 客户端卡死 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 日志文件存在用户目录的应用日志路径下,客户端不内嵌日志查看器 + - 没有「一键导出诊断包」功能,需要用户手动取日志 + - 业务侧错误(发消息失败、接口超时)写在主进程日志,而非渲染进程 +last_verified: v1.7.90 +--- + +# 桌面端日志在哪 / 闪退排查 + +## 问题 +DooTask 桌面端启动后白屏、闪退、卡死,需要查看日志判断原因。 + +## 日志路径 +桌面端使用 `electron-log` 写日志,默认路径(`app-name` 为 `DooTask`): + +- **macOS**:`~/Library/Logs/DooTask/main.log` +- **Windows**:`%USERPROFILE%\AppData\Roaming\DooTask\logs\main.log` +- **Linux**:`~/.config/DooTask/logs/main.log` + +主要日志文件: +- `main.log`:主进程 + 业务事件(网络、更新、托盘、IPC) +- `renderer.log`:渲染进程(网页内)异常(部分版本) +- 历史日志会按大小滚动归档为 `main.old.log` 等 + +## 常见原因与排查 + +### 1. 启动直接闪退 +- 检查日志末尾是否有 `JavaScript exception` 或 `Uncaught` +- 升级 / 降级到对应系统兼容的版本([[electron-client.platforms.concept]]) +- macOS 13 之前的旧系统可能不兼容 Electron 38 + +### 2. 白屏 / 卡在 loading +- 多半是无法连接服务器 +- 临时退出 → 启动前先确认浏览器能打开服务器域名 +- 检查 [[electron-client.proxy.concept]] 代理设置 + +### 3. 收不到通知 / 没有红点 +- 见 [[electron-client.notify.concept]] 的授权排查 +- 日志搜 `notification` 关键字 + +### 4. 更新失败 +- 日志搜 `update` 关键字看 `electron-updater` 报错 +- 通常是更新源不可达,改用 [[electron-client.update.howto]] 手动升级 + +## 提交反馈 +向开发 / 运维提反馈时附上: +1. `main.log` 最后 200 行 +2. 系统版本、客户端版本(关于页查看) +3. 复现步骤 +4. 截图(若是 UI 问题) + +## 不支持 +- 客户端 UI 不内嵌日志查看 / 上传(需用户手动取文件) +- 日志不会自动上传到服务器(隐私考虑) +- 不支持远程实时日志(只能事后分析) diff --git a/resources/ai-kb/zh/faq/email-notice/troubleshoot.md b/resources/ai-kb/zh/faq/email-notice/troubleshoot.md new file mode 100644 index 000000000..3ece87f94 --- /dev/null +++ b/resources/ai-kb/zh/faq/email-notice/troubleshoot.md @@ -0,0 +1,59 @@ +--- +id: email-notice.troubleshoot.faq +title: 邮件收不到怎么办 +type: faq +feature: email-notice +scope: admin +locale: zh +aliases: + - 邮件收不到 + - 邮件没收到 + - 发不出邮件 + - 邮件失败 + - SMTP 超时 + - 邮件被拒 + - 邮箱验证邮件没来 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 邮件发送失败不会自动重试 + - 系统日志只记录发送结果,不抓取 SMTP 原始报文 + - 没有 web 界面查询「这封邮件发到哪了」 +last_verified: v1.7.90 +--- + +# 邮件收不到怎么办 + +## 问题 +DooTask 用户没收到注册验证 / 改邮箱验证码 / 未读消息汇总等系统邮件。 + +## 排查顺序 +1. **管理员有没有配 SMTP?** + - 进「系统设置 → 邮箱」检查 SMTP 服务器/端口/账号/密码非空 + - 未配置时所有邮件链路根本不发出 +2. **SMTP 配置对不对?** + - 点「邮件发送测试」给自己的可用邮箱发一封测试,详见 [[email-notice.send-test.howto]] + - 失败按弹窗的提示定位(超时 = 服务器/网络;550 = 收件方拒收) +3. **收件人在不在忽略列表?** + - 检查「系统设置 → 邮箱 → 忽略邮箱地址」 + - 列表中的邮箱**所有**系统邮件都不发,包括验证码 +4. **是不是未读消息邮件?** + - 是的话,确认 `notice_msg` 已开启 + - 当前时间在 `msg_unread_time_ranges` 配置的时间段内 + - 未读分钟数已超过 `msg_unread_user_minute` / `msg_unread_group_minute` +5. **收件方有没有拦截?** + - 检查收件邮箱的「垃圾邮件」「广告」「订阅」文件夹 + - 用企业邮箱时联系邮箱管理员看反垃圾日志 +6. **SMTP 端口被云厂商封了?** + - 部分云服务商默认封 25 端口出方向;换 465/587 + 对应授权码 + +## 必看 SMTP 服务商配置 +- QQ / 微信邮箱:需在邮箱设置中开启 SMTP 并生成授权码作为密码 +- Gmail:需开启「应用专用密码」,不能用账号密码 +- 阿里云 / 腾讯企业邮:通常使用 465(SSL)或 587(STARTTLS) + +## 如果仍然收不到 +- 在表单点「邮件发送测试」抓取最后一次错误 +- 查看 Docker 容器日志:`docker logs dootask-php` 搜邮件相关报错 +- 收件方可能屏蔽了 DooTask 的发件域名 / IP diff --git a/resources/ai-kb/zh/faq/ldap/troubleshoot.md b/resources/ai-kb/zh/faq/ldap/troubleshoot.md new file mode 100644 index 000000000..bc8eede0d --- /dev/null +++ b/resources/ai-kb/zh/faq/ldap/troubleshoot.md @@ -0,0 +1,76 @@ +--- +id: ldap.troubleshoot.faq +title: LDAP 连接 / 同步失败排查 +type: faq +feature: ldap +scope: admin +locale: zh +aliases: + - LDAP 连接失败 + - LDAP 同步失败 + - LDAP 登录不上 + - LDAP 验证失败 + - 测试 LDAP 报错 + - LDAP 用户登录不了 + - LDAP 用户没邮箱 + - LDAP 端口连不上 + - sAMAccountName 找不到 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 错误日志写到 PHP error_log(info 级别),不会直接弹给前端 + - 没有专门的 LDAP 测试用户接口,只能用「测试连接」验通管理员绑定 + - 部分 LDAPS 自签证书需要在容器内信任 CA,DooTask 主程序不自带证书管理 +last_verified: v1.7.90 +--- + +# LDAP 连接 / 同步失败排查 + +## 问题 +出现以下任一现象: + +- LDAP 设置页(左侧栏「应用」→ 管理员应用「LDAP」卡片)点「测试链接」提示「验证失败」 +- 域账号登录报「账号或密码错误」,或提示「LDAP 用户缺少邮箱属性,请联系管理员配置」 +- 后端日志出现 `[LDAP] auth fail` / `[LDAP] sync fail` / `[LDAP] update fail` + +## 先检查配置(最常见) +打开 LDAP 设置页逐项核对:「LDAP 地址」(Host)、「LDAP 端口」(默认 389)、「Base DN」、「User DN」(绑定 DN)、「密码」、「登录属性」,改完点「测试链接」验证;并确认网络 / 防火墙放通 DooTask 到 LDAP 的端口。 + +注意:LDAP 用户在**首次登录 DooTask 时**才同步创建本地账号,没有批量预同步,成员列表暂时看不到 LDAP 用户属正常,见 [[ldap.sync.howto]]。 + +### 1. 管理员绑定失败(验证失败) +触发:「测试链接」报「验证失败」。 +排查: +- LDAP 地址是否带了 `ldap://` 前缀?后端只接受纯域名/IP +- 端口对不对(明文 389 / TLS 636) +- User DN(管理员 DN)写完整 `cn=admin,dc=example,dc=com`(不是 `admin`) +- 防火墙是否放行 DooTask 容器到 LDAP 服务器 +- LDAPS 自签证书要在容器内信任 CA + +### 2. 用户搜不到(登录账号密码错误) +触发:测试连接通过但用户登录失败。 +排查: +- 「登录属性」选错?AD 一般要选 `sAMAccountName`,OpenLDAP 一般 `uid` 或 `cn` +- Base DN 太窄,没覆盖到用户所在 OU +- 用户在 LDAP 实际禁用 / 锁定 + +### 3. 用户没邮箱(缺少邮箱属性) +触发:LDAP 认证通过但报「LDAP 用户缺少邮箱属性」。 +原因:后端按顺序找 `mail / cn / uid / userPrincipalName`,至少一个须是合法邮箱格式。 +解决:给用户补全 `mail` 属性,或把 `userPrincipalName` 设成 `user@domain.com` 形式。 + +### 4. 反向同步失败 +触发:日志出现 `[LDAP] sync fail`。 +排查: +- 管理员账号是否有写权限到 Base DN +- Schema 是否允许 `top + person` 这两个 objectClass(默认结构) +- 密码字段(`userPassword`)的 Hash 策略是否兼容 + +### 5. Swoole 协程导致连接被污染 +后端用 `LdapRecord` 的全局 `Container`,认证完会主动恢复成管理员绑定。如果出现「时而成功时而失败」,执行 `./cmd php restart` 重启容器。 + +## 怎么看 LDAP 详细错误 +后端把异常写入日志(`storage/logs/laravel.log` 或容器内 PHP error_log),过滤 `[LDAP]` 前缀即可看到 `auth fail / sync fail / update fail / delete fail` 等详细 message。 + +详细配置参考 [[ldap.config.howto]],同步机制见 [[ldap.sync.howto]]。 diff --git a/resources/ai-kb/zh/faq/license/expire.md b/resources/ai-kb/zh/faq/license/expire.md new file mode 100644 index 000000000..8a75effb7 --- /dev/null +++ b/resources/ai-kb/zh/faq/license/expire.md @@ -0,0 +1,73 @@ +--- +id: license.expire.faq +title: License 过期或失效怎么办 +type: faq +feature: license +scope: super-admin +locale: zh +aliases: + - License 过期 + - License 失效 + - 授权过期了 + - 提示终端 License 已过期 + - 用户数超出限制 + - SN 不匹配 + - MAC 不匹配 + - 换服务器了授权失效 + - 续费 License +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - License 失效不会立即锁死系统,但会持续在管理端报错 + - 修改 License 接口(save)仅超级管理员能调用,普通管理员只能看 + - 不支持自行重置 SN(重新部署会生成新 SN,需要重新签发 License) +last_verified: v1.7.90 +--- + +# License 过期或失效怎么办 + +## 问题 +管理后台「License」页提示以下任一错误: + +- 终端 License 已过期 +- 终端用户数超过 License 限制 +- 终端 SN 与 License 不匹配 +- 终端 MAC 与 License 不匹配 + +或者:用户登录、AI 助手等功能突然出现授权相关的提示。 + +## 原因 +后端 `api/system/license` 接口在每次拉取时实时校验: + +1. 取本地 License 文件解出 `info`(含 SN/MAC/people/expired_at) +2. 与当前终端的 `doo_sn`、网卡 `macs`、`user_count`、当前时间逐项比对 +3. 任一规则不满足 → 写入返回值的 `error` 数组 + +特殊情况:`info.people <= 3` 时跳过 SN / MAC 校验(小团队豁免)。 + +## 解决 + +### 情况 1:过期 +1. 联系 DooTask 销售/渠道续费 +2. 拿到新的 License 原文 +3. 进入「系统设置」→「License」→ 粘贴新原文 → 保存 +4. 重新加载页面,确认 `error` 数组已清空 + +### 情况 2:用户数超限 +两种处理方式任选其一: + +- 申请扩容版 License → 按情况 1 流程录入 +- 临时禁用部分账号,让 `user_count` 降到 `people` 以下 + - 禁用方式:管理后台「成员管理」选中用户 → 禁用 + - 机器人账号不计入用户数,无需处理 + +### 情况 3:SN / MAC 不匹配 +- **换了服务器**:新部署会生成新 doo_sn,必须重新申请 License +- **换了网卡或加了网卡**:联系签发方更新 MAC 白名单 +- **不绑定模式**:申请 License 时声明「不绑 MAC」,签发方下发的 License 无 MAC 字段 + +录入方式同上,全部走「系统设置」→「License」→ 保存。 + +## 怎么自检 +拉接口 `POST api/system/license?type=error` 仅返回 `error` 数组,便于脚本巡检。空数组表示完全通过。 diff --git a/resources/ai-kb/zh/faq/meeting/cannot-join.md b/resources/ai-kb/zh/faq/meeting/cannot-join.md new file mode 100644 index 000000000..f0c6f0867 --- /dev/null +++ b/resources/ai-kb/zh/faq/meeting/cannot-join.md @@ -0,0 +1,62 @@ +--- +id: meeting.cannot-join.faq +title: 加入会议失败怎么办 +type: faq +feature: meeting +scope: end-user +locale: zh +aliases: + - 加入会议失败 + - 进不了会议 + - 会议号无效 + - 分享链接打不开 + - 会议加载失败 + - 进入会议提示错误 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 系统没有「重新激活会议」操作,已结束的会议无法恢复 + - 同一时刻不能加入两个会议 +last_verified: v1.7.90 +--- + +# 加入会议失败怎么办 + +## 问题 +点击「加入会议」或打开分享链接后弹出错误提示,无法进入会议室。 + +## 常见原因与解决 + +### 提示「频道ID不存在」 +- 会议号抄错(区分大小写,11 位) +- 会议已被系统清理(创建后从未有人加入也可能被定时任务回收) +- 解决:让发起人确认会议号或重新发起 + +### 提示「会议已结束」 +- 会议房间清空后约 10 分钟由 `CloseMeetingRoomTask` 关闭 +- 解决:联系发起人新建一个会议 + +### 提示「分享链接已过期」 +- sharekey 默认 6 小时有效,过期失效 +- 解决:让发起人重新点「复制链接」生成新链接([[meeting.share.howto]]) + +### 提示「会议功能未开启 / 配置错误」 +- 系统管理员未在「系统设置 → 会议」配置 Agora 的 appid、app_key、app_secret、app_certificate +- 解决:联系管理员到「系统管理 → 会议设置」检查并填写完整 + +### 提示「正在会议中,无法进入其他会议室」 +- 你已在另一个会议中(含浮窗最小化状态) +- 解决:先点击浮窗回到会议并离开,再加入新会议 + +### 提示「会议组件加载失败」 +- 浏览器无法加载 `AgoraRTC_N-4.17.0.js` 脚本(网络异常 / 内网部署未放行 Agora 域名) +- 解决:检查 DooTask 服务的网络出站、清理浏览器缓存 + +### 弹出但麦克风 / 摄像头报错 +- 浏览器没拿到设备权限 +- 解决:在浏览器地址栏左侧权限面板放行麦克风 / 摄像头,再点「加入会议」 + +## 还是不行 +- 收集出错时间、会议号、错误提示截图反馈给系统管理员 +- 管理员可在容器日志中搜索 `meeting/open` 接口的具体错误 diff --git a/resources/ai-kb/zh/faq/mobile-client/cannot-login.md b/resources/ai-kb/zh/faq/mobile-client/cannot-login.md new file mode 100644 index 000000000..24a5a7c1e --- /dev/null +++ b/resources/ai-kb/zh/faq/mobile-client/cannot-login.md @@ -0,0 +1,79 @@ +--- +id: mobile-client.cannot-login.faq +title: 移动端登不上去怎么办 +type: faq +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端登不上 + - App 登不上去 + - 手机登不上 + - 移动端登录失败 + - 输入账号没反应 + - 提示服务器无法访问 + - 手机端密码错误 + - 一直转圈 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - App 不能自助重置密码,需要服务端 / 管理员配合 + - 服务器地址错误 App 不会智能纠正,需用户手动修正 + - 长时间不登可能被管理员禁用账号,App 显示的报错可能不够明确 +last_verified: v1.7.90 +--- + +# 移动端登不上去怎么办 + +## 问题 +打开 DooTask App 后无法登录:输入账号密码点登录后报错、卡住转圈、或提示「服务器无法访问」「请求超时」等。 + +## 排查顺序 + +### 1. 检查服务器地址 +- 登录页顶部 / 设置里检查服务器地址拼写 +- 试试用手机浏览器打开同一地址(如 `https://dootask.公司域名/`)能否访问 DooTask 网页端 +- 浏览器都打不开 → 服务器问题 / 网络问题,找运维确认 +- 浏览器能打开但 App 不行 → 看下一步 + +### 2. 检查网络 +- 切换 WiFi / 4G / 5G 试试 +- 公司内网部署的 DooTask,出公司后必须连 VPN 才能访问 +- 移动数据下检查是否被运营商拦截 + +### 3. 检查账号密码 +- 用同一账号在桌面端 / 网页端登录验证密码是否对 +- 桌面端 / 网页端也登不上 → 密码错或账号被禁,联系管理员重置 +- 桌面端能登 App 不能 → 看下一步 + +### 4. 检查 App 版本 +- 旧版本可能与最新服务端不兼容 +- 按 [[mobile-client.update.howto]] 升级到最新版 +- 服务端可能强制要求最低版本 + +### 5. 清缓存 / 重装 +- 退出 App 进程,重新打开 +- 仍不行:卸载 App 再重装,会清掉本地 token 和服务器地址 +- 重装后重新录入服务器地址 + 账号密码 + +### 6. 第三方登录失败 +- 微信 / 钉钉等第三方登录失败:可能是服务端未配置或临时不可用 +- 改用「账号 + 密码」方式试 + +## 报错对照 + +| 提示 | 含义 | 解决 | +|---|---|---| +| 服务器无法访问 | 网络 / 地址错 | 检查地址 + 网络 | +| 账号或密码错误 | 凭证不对 | 改密码 / 联系管理员 | +| 账号已禁用 | 管理员后台禁用 | 联系管理员 | +| 请求超时 | 服务端慢 / 网络弱 | 换网络重试 | +| 版本过低 | App 太旧 | 升级 App | + +## 仍登不上 +联系部署管理员或公司 IT,提供: +- App 版本号 +- 手机型号、系统版本 +- 错误截图 +- 是否能用其他终端登录 diff --git a/resources/ai-kb/zh/faq/mobile-client/push-fail.md b/resources/ai-kb/zh/faq/mobile-client/push-fail.md new file mode 100644 index 000000000..78b3c689f --- /dev/null +++ b/resources/ai-kb/zh/faq/mobile-client/push-fail.md @@ -0,0 +1,78 @@ +--- +id: mobile-client.push-fail.faq +title: 移动端推送收不到怎么办 +type: faq +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 收不到推送 + - 收不到消息 + - 手机端没声音 + - 锁屏没通知 + - 后台收不到消息 + - 推送失败 + - 通知不响 + - 收不到通知 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 自部署的 DooTask 默认未必配置 UMENG,这种情况下移动端只能靠 WebSocket 在线时收消息 + - 厂商通道(华为 / 小米 / OPPO)的到达率受系统电池策略影响很大,无法 100% 保证 + - 推送收不到不影响数据,所有消息打开 App 后都会同步出现 +last_verified: v1.7.90 +--- + +# 移动端推送收不到怎么办 + +## 问题 +DooTask 移动端 App 关闭 / 锁屏 / 后台时,新消息没有弹通知或没声音。 + +## 原因 +移动端推送依赖一条链路:**DooTask 服务端 → UMENG(友盟)→ APNs(iOS)或厂商通道(Android)→ 你的设备**。任一环节失败都收不到。详细架构见 [[mobile-client.notify.concept]]。 + +## 排查清单(从易到难) + +### 1. 服务端是否配置了 UMENG +最常见原因。自部署版本默认未填 UMENG 的 AppKey / Master Secret,导致**整个推送通道不可用**。表现:任何用户在后台都收不到推送。 +- 联系部署管理员,确认服务端是否配置 UMENG 推送 +- 未配置则推送整体不可用,只有 App 前台在线时通过 WebSocket 收消息 + +### 2. 系统通知权限 +- iOS:设置 → 「通知」→「DooTask」→ 打开「允许通知」+「锁定屏幕」+「通知中心」+「横幅」 +- Android:设置 → 「应用」→「DooTask」→「通知」→ 打开 + +### 3. App 内免打扰 +- DooTask 「我的」→「设置」→「通知」→ 检查总开关是否关 +- 单个会话的免打扰开关也要检查(头像右上角铃铛图标) + +### 4. Android 后台被系统杀 +Android 厂商对后台 App 限制非常严格: +- **华为**:「电池」→ DooTask 设为「不限制」+「应用启动管理」全开 +- **小米**:「省电与电池」→ DooTask 设「无限制」+「自启动管理」开 +- **OPPO / vivo / Realme**:类似设置,核心是「省电策略不限制」+「允许后台」+「自启动」 +- 所有 Android:把 DooTask 锁到「最近任务」防止滑掉(各品牌实现不同) + +### 5. iOS 后台问题 +- iOS 设置 → 「通用」→「后台 App 刷新」→「DooTask」打开 +- 「设置 → 通知 → DooTask → 即时推送」打开(部分版本叫法) + +### 6. 网络问题 +- 锁屏时手机省电关闭数据连接,推送通道不可达 +- 设置 → WLAN → 高级 → 「在休眠状态下保持 WLAN 连接」 + +### 7. 设备别名注册失败 +登录时 App 调 `/api/users/umeng/alias` 注册设备到友盟,若网络异常此次注册可能失败。解决: +- 重新登录 App(退出再登) +- 重启 App + +## 检验是否解决 +- 让同事发条消息,观察是否在锁屏弹出 +- 看应用内通知历史是否到达 + +## 仍收不到 +联系运维 / 部署管理员: +1. 服务端 UMENG 配置是否生效 +2. 服务端日志中是否有该用户的推送投递记录 +3. 设备友盟 token 是否正确绑定 diff --git a/resources/ai-kb/zh/faq/mobile-notify/permission.md b/resources/ai-kb/zh/faq/mobile-notify/permission.md new file mode 100644 index 000000000..a202cfe1c --- /dev/null +++ b/resources/ai-kb/zh/faq/mobile-notify/permission.md @@ -0,0 +1,73 @@ +--- +id: mobile-notify.permission.faq +title: 移动端没有通知权限 +type: faq +feature: mobile-notify +scope: end-user +locale: zh +aliases: + - 手机不弹通知 + - APP 没声音 + - 通知权限 + - iOS 不弹通知 + - Android 收不到 + - 后台杀进程 + - 通知没振动 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 通知权限拒绝过一次后 DooTask 不会主动再次弹窗请求;只能去系统设置改 + - 即便授予通知权限,国产 ROM 的电池优化 / 自启动限制仍可能屏蔽后台通知 + - 通知权限和「APP 后台运行」是两件事,二者都允许才稳定收推送 +last_verified: v1.7.90 +--- + +# 移动端没有通知权限 + +## 问题 +DooTask 移动端 APP 收不到通知 / 没振动 / 锁屏后没推送。 + +## 原因 +- 系统通知权限未授予 +- 国产 ROM 后台杀进程严格,APP 被关闭 +- DooTask 时段免打扰打开 +- 网络异常导致推送未达(友盟服务器无法触达设备) + +## 解决(iOS) +1. 「设置 → DooTask」 +2. 点「通知」 +3. 开启「允许通知」 +4. 勾选「锁定屏幕」「通知中心」「横幅」全部样式 +5. 「声音」「角标」也建议开启 +6. 「设置 → 通用 → 后台 APP 刷新」中允许 DooTask +7. 「设置 → 蜂窝网络」允许 DooTask 使用流量 + +## 解决(Android 原生) +1. 「设置 → 应用 → DooTask → 通知」 +2. 「允许通知」开启 +3. 「通知类别」中所有渠道都开启 +4. 「设置 → 应用 → DooTask → 电池」选择「不受限制」 +5. 「设置 → 应用 → 特殊应用访问 → 设备管理员」或「自启动管理」中允许 DooTask + +## 解决(华为 / 荣耀) +1. 「设置 → 应用 → 应用启动管理」→ DooTask → 手动管理 → 允许「自启动」「关联启动」「后台活动」 +2. 「设置 → 通知 → DooTask」→ 允许通知 + 锁屏显示 + +## 解决(小米 / Redmi) +1. 「设置 → 应用设置 → 应用管理 → DooTask」 +2. 「自启动」打开 +3. 「省电策略」选「无限制」 +4. 「通知管理」全开 + +## 解决(OPPO / VIVO / 一加) +1. 通用做法:应用详情中开启「自启动」「关联启动」「后台高耗电」 +2. 通知中允许「锁屏通知」「横幅」 +3. VIVO 的「i 管家 → 应用管理 → 后台高耗电」中允许 DooTask + +## 仍然不收? +1. 检查 DooTask 内时段免打扰是否打开([[mobile-notify.silent.howto]]) +2. 检查会话是否被免打扰([[push-notice.silent.howto]]) +3. 检查 APP 内是否已登录(退出登录后 UmengAlias 失效) +4. 联系管理员查 `umeng_logs` 看友盟侧是否收到了推送请求 +5. 详见 [[push-notice.troubleshoot.faq]] diff --git a/resources/ai-kb/zh/faq/okr/cannot-install.md b/resources/ai-kb/zh/faq/okr/cannot-install.md new file mode 100644 index 000000000..3c56afab6 --- /dev/null +++ b/resources/ai-kb/zh/faq/okr/cannot-install.md @@ -0,0 +1,48 @@ +--- +id: okr.cannot-install.faq +title: 看不到 OKR / 安装失败怎么办 +type: faq +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 看不到 + - OKR 入口没有 + - OKR 装不上 + - OKR 安装失败 + - OKR 怎么开通 + - OKR 安装很慢 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 主程序不内置 OKR,未装插件时入口绝对不会出现 + - 普通用户无法自助安装应用市场插件,需要系统管理员操作 +last_verified: v1.7.90 +--- + +# 看不到 OKR / 安装失败怎么办 + +## 问题 +打开 DooTask 后在应用中心看不到「OKR 管理」入口,或在「应用商店」(应用市场)点了「安装」后长时间没有反应、提示失败。 + +## 常见原因 +- OKR 是独立插件(应用商店 app id:`okr`),主程序不内置;未装时入口不出现 +- 普通用户没有应用商店的安装权限,必须系统管理员(`userIsAdmin`)安装 +- 插件镜像约 15MB,首次拉取较慢,看起来像「卡住」实际仍在下载 +- 服务器无法访问应用商店镜像源(网络 / 防火墙 / DNS 问题) +- 主程序版本低于 1.1.66,不满足插件要求 + +## 解决 +1. 确认自己角色:非管理员就联系管理员安装 +2. 管理员打开「应用」→ 管理员分区「应用商店」,搜索「OKR」或「目标管理」 +3. 点击安装后,通过应用商店的安装日志查看实时进度(不要立即重试) +4. 日志卡在拉取镜像:检查服务器到镜像源的网络连通性,确认能拉取 Docker 镜像 +5. 提示版本不兼容:先升级主程序到 > 1.1.66 再安装 +6. 安装完成但入口不出现:刷新浏览器 / 重新登录一次 +7. 安装失败可在应用商店重试,仍失败请保留日志反馈给运维 + +## 相关 +- 插件元信息:[[okr.plugin.concept]] +- OKR 入口:[[okr.entry.menu-map]] +- 通用权限问题:[[role-permission.permission-denied.faq]] diff --git a/resources/ai-kb/zh/faq/project/permission-denied-task.md b/resources/ai-kb/zh/faq/project/permission-denied-task.md new file mode 100644 index 000000000..ac13a2d11 --- /dev/null +++ b/resources/ai-kb/zh/faq/project/permission-denied-task.md @@ -0,0 +1,52 @@ +--- +id: project.permission-denied-task.faq +title: 为什么不能改任务(项目权限不足) +type: faq +feature: project +scope: end-user +locale: zh +aliases: + - 改不了任务 + - 任务权限不足 + - 没有权限改任务 + - 任务字段灰色 + - 不能拖任务 +related_tools: [get_project] +related_pages: [task_detail, project_settings] +prerequisites: [] +negative: + - 项目拥有者 / 管理员不会被项目权限规则拦截,只可能被任务删除 / 归档状态拦 + - 站点管理员(userIsAdmin)也不会自动绕过项目权限 + - 任务可见但改不动,通常是 ProjectPermission 配置问题,不是 BUG +last_verified: v1.7.90 +--- + +# 为什么不能改任务(项目权限不足) + +## 问题 +打开任务详情页能看到任务,但字段全是灰色不可编辑;或拖动卡片报「无权限」错误。 + +## 原因 +DooTask 检查 5 层权限: +1. **任务可见性**([[task.field.visibility.concept]]):visibility=2/3 命中你才看到任务 +2. **项目角色**([[project.role.concept]]):你是 owner 0 / 1 / 2 哪一档 +3. **项目权限规则**([[project.permission.concept]] ProjectPermission):你这个角色 + 这个权限点是否勾选 +4. **任务身份**(task_leader / task_assist):你是否任务负责人 / 协作者 +5. **任务状态**:deleted_at / archived_at / complete_at 可能让某些操作不可逆 + +灰色 / 报错通常卡在第 3 层。 + +## 自查步骤 +1. 看右上角项目顶栏自己的角色:拥有者「★」、管理员「⚙」、普通成员无标 +2. 若是普通成员,问拥有者 / 管理员: + - 「项目权限规则」中我所在主体是否有对应权限点 + - 比如改不动截止时间,对应 `TASK_TIME` +3. 若你是任务负责人 / 协作者,但 task_leader / task_assist 主体被关,也会失败 + +## 解决 +- 拥有者 / 管理员到项目设置 → 权限规则 → 勾选对应权限点 +- 临时绕过:让对方把你设为任务负责人([[task.field.owner-assist.concept]]),多数权限点对 task_leader 默认全开 + +## 不支持 +- 没有"申请权限"按钮,必须人工沟通 +- 普通成员不能查看 ProjectPermission 详细矩阵,只看得到结果 diff --git a/resources/ai-kb/zh/faq/project/permission-to-create.md b/resources/ai-kb/zh/faq/project/permission-to-create.md new file mode 100644 index 000000000..5a90fd50c --- /dev/null +++ b/resources/ai-kb/zh/faq/project/permission-to-create.md @@ -0,0 +1,51 @@ +--- +id: project.permission-to-create.faq +title: 为什么不能创建项目(创建权限受限) +type: faq +feature: project +scope: end-user +locale: zh +aliases: + - 不能建项目 + - 创建项目按钮没了 + - 创建项目权限 + - 谁能创建项目 + - 项目创建权限受限 +related_tools: [create_project] +related_pages: [project_list] +prerequisites: [] +negative: + - 创建权限是站点级开关,不能按部门 / 角色细粒度配 + - 管理员(userIsAdmin)始终可创建团队项目 + - 个人项目(personal=1)不受创建权限限制,所有人都能建 +last_verified: v1.7.90 +--- + +# 为什么不能创建项目(创建权限受限) + +## 问题 +点击「+ 新建项目」时按钮置灰,或者按下后报「无权限」错误。 + +## 原因 +系统设置中 `project_add_permission` 控制谁能创建**团队项目**,可能值: +- `all` — 所有人都能创建(默认) +- `departmentOwner` — 仅部门负责人能创建 +- `appoint` — 仅站点指定的白名单用户能创建 + +当前用户不在允许范围内就拦掉。 + +## 谁始终可以创建 +- 站点管理员(`userIsAdmin`) +- 任何用户创建**个人项目**([[project.personal.concept]]),不受限制 + +## 解决 +1. **临时**:先建一个个人项目,把任务先放进来 +2. **找管理员调整**:让管理员把 `project_add_permission` 改成 `all`,或把你加入 appoint 白名单 / 设为部门负责人 +3. **走部门负责人路径**:如果设置是 `departmentOwner`,让管理员把你设为部门负责人 + +## 在哪改设置 +- 桌面端:管理后台 → 系统设置 → 项目设置 → 「项目创建权限」 + +## 不支持 +- 不能为某个具体用户绕过设置直接放行(除非加 appoint) +- 不能按项目分组单独配创建权限 diff --git a/resources/ai-kb/zh/faq/push-notice/troubleshoot.md b/resources/ai-kb/zh/faq/push-notice/troubleshoot.md new file mode 100644 index 000000000..356dff1ac --- /dev/null +++ b/resources/ai-kb/zh/faq/push-notice/troubleshoot.md @@ -0,0 +1,62 @@ +--- +id: push-notice.troubleshoot.faq +title: APP 收不到推送怎么办 +type: faq +feature: push-notice +scope: end-user +locale: zh +aliases: + - 收不到推送 + - APP 没声音 + - 通知不响 + - 手机没消息 + - 推送失败 + - 后台推送不到 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - DooTask 内部没有「重发推送」按钮 + - 推送日志只有管理员通过查库 umeng_logs 才能看 + - 静默消息和自己发的消息本来就不推,不算故障 +last_verified: v1.7.90 +--- + +# APP 收不到推送怎么办 + +## 问题 +DooTask 移动端 APP 后台 / 退出登录状态下没收到新消息通知。 + +## 排查顺序 +1. **管理员有没有配友盟?** + - 进「管理后台 → 系统设置 → APP 推送」检查「开启推送」= 开启 + - 检查 iOS / Android 的 Appkey 和 Master Secret 非空 +2. **当前会话是不是免打扰?** + - 打开对应聊天 → 右上角设置 → 检查「免打扰」是否打开 + - 免打扰时该会话不推 +3. **APP 是不是开了通知权限?** + - iOS:「设置 → DooTask → 通知 → 允许通知」 + - Android:「设置 → 应用 → DooTask → 通知 → 允许全部」 + - 详见 [[mobile-notify.permission.faq]] +4. **是不是 PC 在线被延迟了?** + - PC 端 60 秒内活跃过,APP 推送会被延迟 10 秒 + - 这期间消息被读则**跳过**推送;这是设计行为 +5. **是不是别名失效了?** + - 卸载 APP / 30 天没启动会让 UmengAlias 过期 + - 重新打开 APP 登录会触发别名注册(自动刷新 updated_at) +6. **是不是国产 ROM 的厂商通道问题?** + - 华为/小米/OPPO/VIVO 后台杀进程严格,需在系统中允许「自启动 + 后台运行」 + - 友盟厂商通道(mipush 等)需在友盟控制台配证书,并使用正式签名的 APP + +## 系统级排查(管理员) +- 用「邮件发送测试」类比的思路验证一条消息能不能推(无界面,需查 `umeng_logs` 表) +- `umeng_logs.response` 字段记录友盟接口返回,按错误码定位 +- 临时关闭 PC 端登录测试 APP 端是否能直接收到(排除延迟优化) + +## 不算故障的情形 +- 静默消息(silence=1):刻意不推 +- 自己发的消息:不推自己 +- 已读消息:延迟推送时再次检查已读则跳过 + +## 仍然不行 +联系系统管理员把对应时段的 `umeng_logs` 反给运维分析。 diff --git a/resources/ai-kb/zh/faq/report/permission.md b/resources/ai-kb/zh/faq/report/permission.md new file mode 100644 index 000000000..dec24882a --- /dev/null +++ b/resources/ai-kb/zh/faq/report/permission.md @@ -0,0 +1,53 @@ +--- +id: report.permission.faq +title: 我的报告谁能看到 +type: faq +feature: report +scope: end-user +locale: zh +aliases: + - 报告权限 + - 谁能看我的报告 + - 报告对外可见吗 + - 报告隐私 + - 报告会泄漏吗 + - 部门负责人能看我报告吗 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有「系统管理员看全员报告」的开关,管理员无内置全员查看入口 + - 没有「报告自动抄送上级」的机制,接收人必须手动指定 + - 部门负责人视角不会自动看到下属报告,下属未发给你就看不到 +last_verified: v1.7.90 +--- + +# 我的报告谁能看到 + +## 问题 +担心自己写的工作报告(周报 / 日报)会被预期之外的人看到。 + +## 可见范围(按身份) +| 身份 | 是否能看 | 入口 | +|---|---|---| +| 提交人本人 | 是 | 「我发送的」列表 | +| 提交时勾选的接收人 | 是 | 「我收到的」列表,会有未读红点 | +| 任何拿到分享链接 (code) 的登录用户 | 是 | `single/report/detail/`,登录后即可看 [[report.link.concept]] | +| 其他用户 | 否 | API 层拒绝(`userCanAccessReport` 校验) | +| 系统管理员 | 否(无专属入口) | 没有「看全员报告」开关 | + +## 注意事项 +1. **接收人是手动指定的**:忘记加上级或同事,他们就看不到。检查时去「我发送的」点开详情,最上方接收人列表是真实可见范围 +2. **分享链接是关键风险点**:一旦把 `single/report/detail/` 链接发到别处,任何登录用户拿到链接都能查看 +3. **链接刷新可让旧链接失效**:调 `share` 接口传 `refresh=yes` 强制换 code [[report.share.howto]] +4. **删除报告 = 彻底回收**:物理删除后链接也失效,接收人列表也清空 + +## 解决:限制可见范围 +- 提交前再确认接收人列表 +- 慎重通过链接分享到外部群 +- 误发了:编辑报告把接收人改为预期范围(**注意**:已经看到过的人不会被强行收回视图,但下次未读统计不再算他们)→ 编辑规则见 [[report.edit.howto]] +- 想彻底回收:删除整份报告 + +## 与团队管理 / 部门的关系 +- 部门负责人不会自动看到下属报告 +- 想让上级长期看到,建议把上级加为固定接收人;接口 `last_submitter` 可记住上次发送对象,再发时自动回填 diff --git a/resources/ai-kb/zh/faq/role-permission/permission-denied.md b/resources/ai-kb/zh/faq/role-permission/permission-denied.md new file mode 100644 index 000000000..9615bf2f5 --- /dev/null +++ b/resources/ai-kb/zh/faq/role-permission/permission-denied.md @@ -0,0 +1,48 @@ +--- +id: role-permission.permission-denied.faq +title: 提示「权限不足」怎么办 +type: faq +feature: role-permission +scope: end-user +locale: zh +aliases: + - 权限不足 + - 没权限 + - 不能操作 + - 提示无权限 + - 我看不到这个功能 + - 为什么我点不开 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有「全局解锁所有权限」的开关,权限按场景细分 + - 普通用户无法自助提升权限,必须由管理员或项目负责人调整 +last_verified: v1.7.90 +--- + +# 提示「权限不足」怎么办 + +## 问题 +DooTask 操作时弹出「权限不足」「无访问权限」「您不在可见用户列表」等提示。 + +## 常见原因 +DooTask 权限分多个层级,按场景判断: + +- **项目级**:只有项目成员(成员 / 负责人 / 管理员)才能看到项目内任务;非成员无法访问 +- **任务级**:任务设置了「可见用户」时,未在名单的用户即使是项目成员也看不见 +- **角色级**:改项目设置 / 工作流 / 删除列 / 改成员 → 通常要求负责人或项目管理员;普通成员只能改自己负责的任务 +- **系统级**:进入系统设置、团队管理、LDAP、License Key、数据导出、举报管理 → 需要系统管理员(userIsAdmin) +- **超级管理员**:超管专属功能(如改超管设置)→ 只有第一个注册用户(id=1)才能用 + +## 解决 +1. 先确认操作类型对应哪一级权限 +2. 联系对应的角色补加权限: + - 项目级:联系项目负责人邀请加入或调角色 + - 任务级:联系任务负责人把你加入可见用户 + - 系统级:联系系统管理员 +3. 部分功能依赖插件已安装(如审批中心要 approve 插件、人脸签到要 face 插件) + +## 怎么看自己有什么权限 +- 个人头像 → 「个人设置」可看到自己的部门 / 角色 +- 系统管理员 / 部门负责人身份会显示在右上角下拉菜单顶部 diff --git a/resources/ai-kb/zh/faq/search/no-result.md b/resources/ai-kb/zh/faq/search/no-result.md new file mode 100644 index 000000000..b024dab60 --- /dev/null +++ b/resources/ai-kb/zh/faq/search/no-result.md @@ -0,0 +1,48 @@ +--- +id: search.no-result.faq +title: 搜不到或结果不全 +type: faq +feature: search +scope: end-user +locale: zh +aliases: + - 搜不到 + - 搜索没结果 + - 搜索结果不全 + - 为什么搜不到 + - 搜不到文件内容 + - 搜不到群消息 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 全局搜索不会显示「不属于你」的对象,即使关键词完全匹配 + - 不会自动跨用户搜索别人的私聊或文件 +last_verified: v1.7.90 +--- + +# 搜不到或结果不全 + +## 问题 +全局搜索输入关键词后没有结果,或者结果数量明显少于实际存在的对象。 + +## 原因 +按出现频率从高到低: +1. **权限范围限制**:所有搜索只返回当前用户能访问的对象(详见各子接口),无权对象不会出现 +2. **对象处于不可见状态**:已归档项目、已归档 / 已删除任务、已禁用用户、机器人账号都会被过滤 +3. **未装 Manticore 插件**:MySQL 回退只匹配字面关键词,且文件正文 / 任务描述里的关键词搜不到(见 [[search.engine.concept]]) +4. **正文未被索引**:装了 Manticore,但文件超过大小阈值(Office > 50MB / 文本 > 5MB / 其他 > 20MB)或类型不支持 +5. **达到单次返回上限**:默认返回 20 条,最多 50 条,匹配项更多时会被截断 +6. **关键词大小写 / 全半角差异**:MySQL 回退对全 / 半角和大小写敏感度有限 + +## 解决 +1. 确认当前账号是否在对应项目 / 对话的成员列表 +2. 在搜索框切换分类标签(任务 / 项目 / 消息 / 联系人 / 文件),看是否被聚合截断了 +3. 如果是搜不到文件正文:联系管理员安装 search 插件([[search.engine.concept]]) +4. 如果是搜归档对象:先到对应模块解归档,再搜 +5. 增加 `take` 参数到 50(接口调用方) +6. 用更准确的关键词或换一种说法 + +## 相关 +- 引擎差异:[[search.engine.concept]] +- 入口与快捷键:[[search.entry.menu-map]] diff --git a/resources/ai-kb/zh/faq/user-account/delete-restore.md b/resources/ai-kb/zh/faq/user-account/delete-restore.md new file mode 100644 index 000000000..007c11575 --- /dev/null +++ b/resources/ai-kb/zh/faq/user-account/delete-restore.md @@ -0,0 +1,54 @@ +--- +id: user-account.delete-restore.faq +title: 注销账号后还能恢复吗 +type: faq +feature: user-account +scope: end-user +locale: zh +aliases: + - 注销后能恢复吗 + - 账号能找回吗 + - 误注销了 + - 删除账号后悔了 + - user_deletes + - 数据还在吗 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 注销没有保留期 / 冷静期,确认删除后立即生效,无法恢复 + - 产品内没有任何「恢复账号」按钮或接口,管理员也无法在界面恢复 + - 同邮箱可重新注册,但属于全新账号,旧数据不会自动关联 +last_verified: v1.7.90 +--- + +# 注销账号后还能恢复吗 + +## 问题 +在「个人设置 → 删除帐号」确认注销后,账号还能找回吗?数据保留多久? + +## 结论:不能恢复 +- 注销**没有保留期 / 冷静期**:确认删除后立即生效,账号记录被直接从数据库删除(非软删除,`users` 表没有 `deleted_at` 字段) +- DooTask **没有任何恢复入口**:普通用户和管理员都没有「恢复账号」的按钮或接口 +- 系统只在 `user_deletes` 表保留一份资料快照(昵称、头像、邮箱、部门、注销原因等),仅用于在历史消息和任务中继续显示该用户的昵称头像,**不能用来恢复登录** +- 运维直接操作数据库理论上可用快照重建账号,但这不是产品功能,风险自负、具体以部署环境为准 + +## 注销时系统做了什么 +1. 把用户资料快照(含注销原因、操作人)写入 `user_deletes` 表 +2. 删除该用户的消息未读记录、待办标记、邮箱验证记录 +3. 删除 `users` 表中的账号记录,所有登录态随之失效 + +## 与「离职」恢复的区别(不要混淆) +- 「注销 / 删除帐号」:用户自己操作,账号记录被删除,**任何人都无法恢复** +- 「操作离职」:管理员在「团队管理」对成员操作,账号只是被禁用;管理员可在团队管理用「恢复帐号(已离职)」恢复,但此操作仅恢复帐号状态,**操作离职时移交出去的数据无法恢复** + +## 想继续使用怎么办 +- 同邮箱可以重新注册,但那是一个全新账号(新 userid),旧项目、任务、聊天记录不会关联回来 +- 历史数据中的旧发言仍然存在,对他人显示为注销前的昵称 + +## 预防 +- 注销前先导出重要数据、交接好项目和任务 +- 注销本身有二次确认:系统开启邮箱验证(reg_verify=open)时需要邮箱验证码,未开启时需要登录密码 + +## 相关 +- 注销流程详情:[[user-account.delete.howto]] diff --git a/resources/ai-kb/zh/faq/view/mobile.md b/resources/ai-kb/zh/faq/view/mobile.md new file mode 100644 index 000000000..f860a5b07 --- /dev/null +++ b/resources/ai-kb/zh/faq/view/mobile.md @@ -0,0 +1,51 @@ +--- +id: view.mobile.faq +title: 移动端能用哪些视图 +type: faq +feature: view +scope: end-user +locale: zh +aliases: + - 手机能看甘特图吗 + - 移动端有看板吗 + - APP 能用哪些视图 + - 手机上能切视图吗 + - 触屏能拖任务吗 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 移动端 / 触屏端拖拽全部禁用(列、任务、甘特图都不能拖) + - 工作流的「待办 → 完成」必须从任务详情页改字段 + - 移动端甘特图体验受限(屏宽不够),适合临时查看而非编辑 +last_verified: v1.7.90 +--- + +# 移动端能用哪些视图 + +## 问题 +在手机 APP 或 H5 上打开 DooTask 项目详情页,能否用看板 / 列表 / 甘特图视图?拖动操作和桌面一样吗? + +## 原因 +DooTask 的项目视图组件在前端检测 `$isEEUIApp`(移动端壳)和 `windowTouch`(触屏环境)后会主动禁用拖拽,避免与系统滑动手势冲突。其他展示能力(数据加载、视图切换、字段查看)保留。 + +## 解决 +- **看板视图**:可正常查看每列任务;点击卡片进入详情;不能拖任务也不能拖列 +- **列表视图**:完整可用;点击表头排序、点击行进入详情都可用 +- **甘特图**:可查看时间轴和悬停信息;不能拖动改时间,需进任务详情页改字段 +- **工作流筛选**:顶部 Cascader 可用,与桌面一致 + +## 状态变更怎么办 +1. 点开任务详情 +2. 改 column_id 字段(任务所在列)或 flow_item_id 字段(工作流状态) +3. 改时间走「截止时间」字段 +4. 保存后视图自动刷新 + +## 移动端额外能做的 +- 任务详情页底部 Tabbar 集成了状态切换、消息、附件 +- 列表视图分段折叠在小屏上更高效 + +## 不支持 +- 移动端没有「列表 / 看板 / 甘特图」专用入口(共用桌面切换条) +- iPad 上也不支持拖拽(屏幕虽大,Touch 设备一律禁用拖拽) +- 移动端不能新建项目列、改列名(受写权限和触屏禁用影响) diff --git a/resources/ai-kb/zh/glossary/.gitkeep b/resources/ai-kb/zh/glossary/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/glossary/main.md b/resources/ai-kb/zh/glossary/main.md new file mode 100644 index 000000000..30187a60f --- /dev/null +++ b/resources/ai-kb/zh/glossary/main.md @@ -0,0 +1,87 @@ +--- +id: glossary.main +title: DooTask 核心术语表 +type: glossary +feature: glossary +scope: end-user +locale: zh +aliases: + - 术语 + - 术语表 + - DooTask 术语表 + - 名词解释 + - DooTask 名词 + - 这个词什么意思 + - 别名对照 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 只覆盖产品术语,不含技术名词 + - 别名只列常见口语化叫法 +last_verified: v1.7.90 +--- + +# DooTask 核心术语表 + +把口语化叫法对齐到正式术语。格式:术语 / 别名 / 定义。 + +## task(任务) +todo, 待办, 卡片, 工作项 — 归属某项目某一列的工作项,核心实体。 + +## subtask(子任务) +子卡片, 拆分任务 — 父任务下的下级任务,仅 1 层不可再嵌套。 + +## project(项目) +看板 — 任务的容器,含若干列与若干任务,按成员授权。 + +## column(列) +工作流列, 状态列, status, 阶段 — 项目内按状态分组的纵列。 + +## flow(工作流) +流程, 任务流, 状态流转 — 列与列之间的流转规则,可配自动动作。 + +## dialog(对话 / 群聊) +会话, 群, 群聊, IM, 聊天 — 消息会话总称,含单聊、群聊、项目讨论、机器人对话。 + +## meeting(会议) +在线会议, 视频会议, 通话, 开会 — 基于 WebRTC 的多人音视频会议。 + +## approve(审批) +审批中心, 走流程, 报销, 请假 — 表单 + 多级节点的审批系统应用。 + +## checkin(签到) +打卡, 考勤 — 员工每日打卡,支持地点 / Wi-Fi / 人脸校验。 + +## report(工作报告) +日报, 周报, 月报, 汇报 — 定期工作总结,支持模板与自动汇总。 + +## okr / kpi +目标、KR(OKR);绩效、考核(KPI)— OKR=周期目标管理;KPI=规则化绩效。 + +## bot(机器人) +bot, AI 机器人, webhook 机器人 — 聊天中可被 @ 触发的自动化账号。 + +## memos / minder +备忘录, 笔记 / 脑图, mindmap — 个人轻量笔记 / 思维导图编辑器。 + +## drawio / office / fileview +流程图 / Office / 在线预览 — 三个文件类插件。 + +## calendar / dashboard / favorite +日历 / 首页, 工作台 / 收藏, 标星 — 日程聚合视图 / 登录后默认页 / 跨实体收藏。 + +## micro-app / appstore +插件, 应用 / 插件市场 — micro-app=扩展模块;appstore=安装升级入口,仅管理员可访问。 + +## ai-assistant +AI, 智能助手, ChatGPT — 基于 RAG 的产品内 AI 助手,由 AI 微应用提供。 + +## ProjectUser.owner +项目管理员, 项目负责人 — `owner` 字段;`0`=成员,`1`=负责人,`2`=管理员。 + +## userid -1 +AI 账号, AI bot, 系统 AI — 系统保留账号,AI 消息以此 ID 标识,不占席位。 + +## EEUI / Electron +App, 客户端, 桌面端, 手机端 — EEUI=移动端原生壳;Electron=桌面端原生壳;浏览器版共用前端。 diff --git a/resources/ai-kb/zh/howto/.gitkeep b/resources/ai-kb/zh/howto/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/howto/abuse-report/handle.md b/resources/ai-kb/zh/howto/abuse-report/handle.md new file mode 100644 index 000000000..68a82fcbb --- /dev/null +++ b/resources/ai-kb/zh/howto/abuse-report/handle.md @@ -0,0 +1,58 @@ +--- +id: abuse-report.handle.howto +title: 处理一条举报 +type: howto +feature: abuse-report +scope: admin +locale: zh +aliases: + - 处理举报 + - 怎么审核举报 + - 标记已处理 + - 删除投诉 + - 处理用户举报 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 「已处理」状态不可逆,无法重置为「待处理」 + - 「删除」是数据库硬删除(`delete()`),不可恢复 + - 处理动作不会自动通知举报人或被举报对话成员 +last_verified: v1.7.90 +--- + +# 处理一条举报 + +## 入口 +桌面端:左侧栏「应用」→「举报管理」(仅管理员可见)→ 列表查看。 +API: +- 列表 `GET api/complaint/lists` +- 操作 `POST api/complaint/action` + +## 操作步骤 +1. 进入「举报管理」,列表按 id 倒序显示 +2. 可按「类型」和「状态」筛选 +3. 点开一条举报,查看:原因、举报人、对话 ID、附图、提交时间 +4. 视情况选择: + - 「已处理」:把 `status` 改为 1(已处理),保留记录备查 + - 「删除」:从 `complaints` 表硬删除,记录消失 + +## 处理后做什么 +后台动作只改记录状态,**不会**: +- 不会自动封禁被举报的成员 +- 不会自动删除被举报的对话或消息 +- 不会自动通知任何人 + +如果确认违规需要进一步行动,要手动到: +- 「团队管理」→ 禁用 / 删除被举报成员账号 +- 进入对应群聊把消息撤回 / 群解散 +- 必要时上报合规负责人,参考 [[compliance.concept]] + +## 类型说明 +7 种举报类型说明见 [[abuse-report.concept]]。 + +## 不支持 +- 不支持批量处理多条 +- 不支持自动判断是否违规 +- 不支持举报转交其他管理员 diff --git a/resources/ai-kb/zh/howto/ai-assistant/close.md b/resources/ai-kb/zh/howto/ai-assistant/close.md new file mode 100644 index 000000000..dbf68280e --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/close.md @@ -0,0 +1,69 @@ +--- +id: ai-assistant.close.howto +title: 关闭 AI 助手浮窗 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 关闭 AI + - 退出 AI 助手 + - AI 浮窗关掉 + - 关 AI 弹窗 + - 取消 AI 对话 +related_tools: [] +related_pages: [] +prerequisites: + - AI 助手浮窗已打开 +negative: + - 关闭只是隐藏弹窗 + 终止活跃 SSE 流,不会删除当前会话 + - 桌面端关闭后短时间内浮窗不会自动弹回,需再点浮按钮 / 快捷键 + - 移动端没有 Esc 键关闭 +last_verified: v1.7.90 +--- + +# 关闭 AI 助手浮窗 + +## 入口 + +### 桌面端 chat 浮窗 +- 浮窗**右上角「×」**关闭按钮 +- 键盘 `Esc`(仅 chat displayMode 生效) +- chat 浮窗无遮罩,点击外侧不会关闭 + +### 桌面端 modal 模态(业务嵌入入口) +- 弹窗**右上角「×」**或顶部关闭图标 +- 遮罩点击:默认**不**关闭(`mask-closable: false`) +- 键盘 `Esc`:modal 模式当前实现下不响应 + +### 移动端 +- 浮窗**右上角「×」**(`Icon type="ios-close"`) +- 浮窗顶部下拉「关闭」 +- 无键盘快捷键 + +## 关闭时发生了什么 +1. `showModal = false` +2. 触发 `aiAssistantClosed` 事件 +3. **不会**自动清理当前会话(保留在内存 + 已持久化的留在数据库) +4. 活跃的 SSE 流被同会话切换 / 新提问触发的清理逻辑回收 +5. 浮按钮重新显示(关闭时浮按钮被 `!this.$parent?.showModal` 条件隐藏) + +## 关闭后下次打开 +- 当前会话和模型选择都保留 +- 输入框内容**不**保留(关闭即清空) +- 待发送的图片也会清空(`clearPendingImages`) + +## 完全隐藏 AI 助手 +- 关闭浮窗只是临时隐藏,**浮按钮**仍在屏幕边缘 +- 完全去掉浮按钮需管理员卸载 ai 插件或关闭 AI 模型 +- 详见 [[ai-assistant.disabled.faq]] + +## 不支持 +- 不支持「最小化为小球」(关掉就是关掉,再开是新一次打开) +- 不支持「关闭并清空当前会话」一键操作(手动删除:[[ai-assistant.session-delete.howto]]) +- 不支持点击浮窗外区域自动关闭 + +## 相关 +- [[ai-assistant.entry.howto]] +- [[ai-assistant.stop.howto]] +- [[ai-assistant.float-button.concept]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/create-task.md b/resources/ai-kb/zh/howto/ai-assistant/create-task.md new file mode 100644 index 000000000..3261ddb0b --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/create-task.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.create-task.howto +title: 让 AI 帮我创建任务 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 建任务 + - AI 加 todo + - AI 新建待办 + - 让 AI 创建一个任务 + - AI 帮我下任务 + - 给小王分个任务 +related_tools: [create_task] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 当前用户在目标项目中是成员或负责人 +negative: + - 不能在不是自己项目的位置建任务(会提示无权限) + - AI 不会未经确认直接建复杂任务,长字段一般会先复述再创建 + - 创建后任务的 ID/URL 会返回,可让 AI 继续打开它 +last_verified: v1.7.90 +--- + +# 让 AI 帮我创建任务 + +## 这是什么 +在 AI 浮窗自然语言描述要建的任务,AI 会调 `create_task` 工具在目标项目下新建一条任务,自动解析负责人、截止时间、优先级、所属列。 + +## 怎么问 +一次性把关键信息说全,AI 解析准确率最高: + +- "在『官网改版』项目建一个任务:周五前完成首页banner切图,分给小王" +- "建个明天 18 点截止的紧急任务:上线前回归测试,我负责" +- "项目X里加一条任务『写 PRD』,无负责人无截止时间" + +## AI 通常会确认 +- 模糊的项目名 → 先调 `list_projects` 让你选 +- 模糊的"小王" → 调 `search_users` 列同名用户让你确认 +- 没说截止时间 → 直接不设置(不会乱猜) +- 没说负责人 → 默认建未分配,可后续追加 + +## 创建后能继续做什么 +- "打开它" → 调页面工具跳详情 +- "再加 3 个子任务:前端、后端、测试" → 调 `create_sub_task` +- "把这条同步到 X 群" → 调 `send_message` + +## 不支持 +- 不能建跨项目任务(任务必须归属一个项目) +- 不能在 AI 这步同时设置自定义字段(需打开任务详情手动改) +- AI 不会主动给任务套已有模板,需明示「按 X 模板创建」 + +## 相关 +- 列任务:[[ai-assistant.list-tasks.howto]] +- 创建项目结构:[[ai-assistant.project-init.howto]] +- 子任务建议:[[ai-assistant.subtask-suggest.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/element-action.md b/resources/ai-kb/zh/howto/ai-assistant/element-action.md new file mode 100644 index 000000000..5a48de76f --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/element-action.md @@ -0,0 +1,69 @@ +--- +id: ai-assistant.element-action.howto +title: 让 AI 操作页面元素 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 点按钮 + - AI 帮我输入 + - AI 选下拉 + - AI 滚动页面 + - AI 自动填表 + - AI 点击 X +related_tools: [execute_element_action] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 当前页面已加载完成 +negative: + - 元素必须可见且未被遮挡才能点击,被滚出视野时需先 scroll + - 不能模拟键盘组合键(如 Cmd+S)、不能拖拽 + - AI 找不到匹配元素时会道歉并要求换种描述,不会盲点 +last_verified: v1.7.90 +--- + +# 让 AI 操作页面元素 + +## 这是什么 +让 AI 调 `execute_element_action` 工具直接操作当前页面的具体元素,包括点击按钮、输入文本、选下拉项、聚焦、滚动、悬停。常用于完成详细表单或触发某个隐藏在多级菜单里的功能。 + +## 怎么问 +- "点击『保存』按钮" +- "在标题框输入『官网首页改版』" +- "把优先级下拉选成『高』" +- "滚动到页面底部" +- "悬停在第一个项目卡片上" + +## AI 的执行链路 +1. 先调 `get_page_context` 取当前页面元素清单 +2. 用 `match_elements` 接口按描述("保存按钮"、"标题输入框")找到目标 ref +3. 调 `execute_element_action` 触发 click / type / select / focus / scroll / hover + +## 支持的动作 +| 动作 | 说明 | +|---|---| +| click | 触发原生 click 事件 | +| type | 设置 input / textarea / contentEditable 的值并触发 input/change 事件 | +| select | 原生 select 或 iView 下拉,按选项文本匹配 | +| focus | 聚焦元素 | +| scroll | 平滑滚动到屏幕中央 | +| hover | 模拟 mouseenter/mouseover | + +## 不支持的动作 +- 不能模拟键盘按键、不能模拟组合键 +- 不能拖拽元素(drag/drop) +- 不能操作 iframe 内的元素 +- 不能等到某个异步加载完成再点(无 wait 机制,需用户重新触发) + +## 找不到元素怎么办 +- 改用更具体的描述("右上角保存按钮"代替"保存") +- 先让 AI 跳到元素所在页(`open_task` 等) +- 元素在折叠面板里,先让 AI 展开 + +## 相关 +- 跳页面 / 打开任务:[[ai-assistant.page-action.howto]] +- match_elements 接口:[[ai-assistant.match-elements.concept]] +- 页面上下文:[[ai-assistant.page-context-tool.concept]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/entry.md b/resources/ai-kb/zh/howto/ai-assistant/entry.md new file mode 100644 index 000000000..f3738c39f --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/entry.md @@ -0,0 +1,52 @@ +--- +id: ai-assistant.entry.howto +title: AI 助手怎么打开 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 助手在哪 + - 怎么开 AI + - 打开 AI + - AI 入口 + - AI 浮窗 + - 怎么用 AI +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已在系统设置「AI 模型」中配置至少一个模型的 API key +negative: + - AI 助手本身不是「应用中心」里的卡片(区别于审批 / 签到等),是系统级特性 + - 未安装 ai 插件时所有 AI 入口都不会显示 + - 桌面端关闭浮窗后短时间内不会自动弹回,可手动唤起 +last_verified: v1.7.90 +--- + +# AI 助手怎么打开 + +## 全局入口(桌面端) + +- **浮窗按钮**:屏幕右下角的圆形 AI 图标,点击展开聊天浮窗(位置可拖动,会贴边收起成竖条) +- **快捷键**:Cmd + I(macOS)/ Ctrl + I(Win/Linux)任意页面都能呼出 +- **顶部「+」菜单**:右上角全局「+」下拉里有「AI 助手」项(需 ai 插件已安装) + +## 移动端入口 + +- **悬浮按钮**:右下角小球,长按拖动到任意位置 +- 第一次打开会自动收起到屏幕边缘,点开后可全屏对话 + +## 业务场景嵌入入口 + +- **项目创建**:新建项目时项目名输入框旁边有 AI 按钮,点击让 AI 帮你生成项目结构 +- **任务详情**:任务讨论区可 @AI 让它分析任务、生成子任务建议 +- **工作报告**:报告编辑器内可让 AI 基于近期任务自动生成报告草稿 +- **消息会话**:群里 @AI 让它回答问题、总结对话、翻译消息 + +## 切换模型 +浮窗顶部下拉框选择模型;可用模型由管理员在系统设置「AI 模型」中开启。如下拉框为空,联系管理员配置。 + +## 关闭/隐藏 +- 桌面端:浮窗右上角「×」关闭,下次点浮按钮重新打开 +- 移动端:浮窗右上角下拉「关闭」 diff --git a/resources/ai-kb/zh/howto/ai-assistant/float-button.md b/resources/ai-kb/zh/howto/ai-assistant/float-button.md new file mode 100644 index 000000000..13346fb42 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/float-button.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.float-button.howto +title: 移动 / 收起 AI 助手浮按钮 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 怎么移动 AI 按钮 + - AI 球怎么挪 + - AI 浮窗按钮位置 + - AI 按钮挡住了 + - 浮按钮跑哪去了 + - 怎么收起 AI 按钮 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 +negative: + - 浮按钮无法完全关闭按钮本身(除非卸载 ai 插件或管理员关闭模型) + - 收起后不会自己消失,仍是屏幕边缘一根 48px 高的竖条 + - 多端位置不同步:桌面 / 移动 / 桌面 Electron 各自独立存储 +last_verified: v1.7.90 +--- + +# 移动 / 收起 AI 助手浮按钮 + +## 移动位置 + +### 桌面端 +1. 鼠标按住 AI 浮按钮 +2. 拖动到任意位置(距屏幕四边至少 12px) +3. 松开鼠标完成移动;松手后位置自动写入 IndexedDB + +### 移动端 +1. 单指按住 AI 浮按钮 +2. 拖动到目标位置 +3. 抬起手指完成 + +## 收起 / 展开 + +- **自动收起**:拖到距屏幕左 / 右边缘 ≤ 12px 时,桌面端 1 秒后自动收起为竖条;移动端首次加载即自动收起到边缘 +- **展开**:点一下收起的竖条,按钮重新弹出并打开 AI 助手浮窗 + +## 怎么判断点击 vs 拖动 +- 移动距离 < 5px **且** 按下时间 < 200ms → 算「点击」,呼出 AI 助手 +- 否则 → 算「拖动」,只移动位置不打开对话窗 + +## 不同分辨率 +位置只存「距某边距离」+ 「靠哪边」,换屏 / 转屏不会跑到屏外。若发现按钮丢失,刷新页面后会回到默认位置(桌面右下、移动右侧中下)。 + +## 不支持 +- 桌面端没有「关闭浮按钮」的用户开关:要彻底关闭需管理员侧关闭 ai 插件 +- 不支持把浮按钮拖到屏幕外(会被边距 12px 强制约束) +- 位置不跨端同步(手机和电脑各自存) + +## 相关 +- 浮按钮的整体行为:[[ai-assistant.float-button.concept]] +- 进 AI 助手的其他方法:[[ai-assistant.entry.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/image-upload.md b/resources/ai-kb/zh/howto/ai-assistant/image-upload.md new file mode 100644 index 000000000..a99aa19e2 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/image-upload.md @@ -0,0 +1,69 @@ +--- +id: ai-assistant.image-upload.howto +title: 给 AI 助手发图片 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 上传图片 + - 给 AI 发截图 + - AI 拍照分析 + - 粘贴图片给 AI + - 拖图片给 AI + - AI 看图 +related_tools: [] +related_pages: [] +prerequisites: + - 已选中支持视觉的模型(如 gpt-4o / claude-3.5-sonnet / gemini-1.5-pro) +negative: + - 单次最多 5 张,超出会拒绝 + - 仅支持图片格式(image/*),不支持 PDF / 视频 + - 图片会被前端压缩到长边 1568px JPEG,原图不保留 + - 非视觉模型即使选了也会被上游报错或忽略图片 +last_verified: v1.7.90 +--- + +# 给 AI 助手发图片 + +## 三种上传方式 + +### 1. 点击图片按钮 +1. 打开 AI 助手浮窗 +2. 浮窗底部输入区**左侧**有图片图标 +3. 点击 → 弹系统文件选择器 +4. 选 1-5 张图片 → 确定 + +### 2. 拖放 +1. 把图片从桌面或文件管理器拖到 AI 浮窗 +2. 浮窗内部出现「松开以上传图片」遮罩 +3. 在遮罩内松开鼠标完成上传 + +### 3. 粘贴(Ctrl/Cmd + V) +1. 截图(Mac Cmd+Shift+4、Win Snipping Tool 等) +2. 焦点放在 AI 输入框 +3. 按 Ctrl/Cmd + V,剪贴板的图片直接进入预览区 + +## 数量与压缩规则 +- 最多 5 张并存;超出 toast「最多上传 5 张图片」 +- 自动压缩:长边 ≤ 1568px、统一转 JPEG +- 节省 token:上游按图片像素 / 大小计费 + +## 预览与移除 +- 上传后缩略图出现在输入框上方 +- 点缩略图右上角「×」单张移除 +- 发送后图片自动从「待发送」区清空 + +## 发送行为 +- 文本 + 图片**同时**作为多模态 content 发送 +- 历史会话里图片用占位符 `[image:imageId]` 存到 `data`,实际 base64 入 `images` +- 再次打开历史会话通过 `serverImageMap` 拿 URL 渲染 + +## 不支持 +- 不支持视频 / PDF / 音频 +- 不支持把图片拖到收起的浮按钮上(先展开浮窗) +- 不支持「不压缩直发」开关 + +## 相关 +- [[ai-assistant.multimodal.concept]] +- [[ai-assistant.model-switch.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/intelligent-search.md b/resources/ai-kb/zh/howto/ai-assistant/intelligent-search.md new file mode 100644 index 000000000..f582c2087 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/intelligent-search.md @@ -0,0 +1,62 @@ +--- +id: ai-assistant.intelligent-search.howto +title: 让 AI 做智能搜索 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 智能搜索 + - AI 搜一下 + - 全站搜索 + - 找一下 X + - 不知道在哪 + - 跨模块搜索 +related_tools: [intelligent_search] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 只搜当前用户有权访问的内容 + - 默认结果上限 20 条,按相关度排序 + - 不返回系统设置 / 插件配置等管理项 +last_verified: v1.7.90 +--- + +# 让 AI 做智能搜索 + +## 这是什么 +当你不确定要找的东西是任务、项目、文件还是人时,让 AI 调 `intelligent_search` 工具做跨类型语义搜索,结果合并任务 / 项目 / 文件 / 联系人 / 消息五大类,按相关度统一排序。 + +## 怎么问 +- "搜一下『官网改版』有关的所有东西" +- "找下『年终报告』,不管是什么类型" +- "凡是提到上线日期的内容" +- "我想找昨天讨论的接口设计,记不清是文件还是消息" + +## 与按类型搜的区别 +- **按类型搜**(如 `search_files` / `list_tasks`):你已经知道是文件 / 任务,能给出精确筛选 +- **智能搜索**:你只有一个关键词,让 AI 跨类型匹配,相关度排序 + +## 结果通常长什么样 +分组返回: + +- 任务(前 N 条) +- 项目(前 N 条) +- 文件(前 N 条) +- 联系人(前 N 条) +- 消息(前 N 条) + +每项含标题、摘要、跳转链接,便于继续操作(打开 / 重新讨论 / 转发)。 + +## 不支持 +- 不能跨工作空间 / 跨租户搜索 +- 不返回敏感字段(密码、邮箱手机号正文不会出现在摘要) +- 不能精确按数值范围筛(如"金额 > 1000"),需用具体业务工具 + +## 相关 +- 知识库检索:[[ai-assistant.search-help-docs.howto]] +- 找文件:[[ai-assistant.search-files.howto]] +- 找任务:[[ai-assistant.list-tasks.howto]] +- 找人:[[ai-assistant.search-users.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/list-tasks.md b/resources/ai-kb/zh/howto/ai-assistant/list-tasks.md new file mode 100644 index 000000000..55191b010 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/list-tasks.md @@ -0,0 +1,66 @@ +--- +id: ai-assistant.list-tasks.howto +title: 让 AI 列我的任务 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 我今天有什么任务 + - 帮我看下任务 + - 今天的待办 + - 这周要交什么 + - 列一下任务 + - 给我看待办 + - 我有哪些任务 +related_tools: [list_tasks] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 只能列出当前登录用户有权访问的任务(项目成员或负责人/协作者/可见用户) + - 一次最多返回 100 条,超出请追加筛选条件 + - 不能列别人的私有任务(即便是同部门) +last_verified: v1.7.90 +--- + +# 让 AI 列我的任务 + +## 这是什么 +在 AI 浮窗用自然语言问任务列表,AI 会调 `list_tasks` 工具检索后端,按你说的条件筛选并返回结果摘要。结果通常含任务名、负责人、截止时间、所属项目。 + +## 怎么问 +按你想筛的条件直接说: + +- "我今天到期的任务" +- "本周要交的任务" +- "项目 X 里我负责的进行中任务" +- "已逾期未完成的任务" +- "上个月完成的任务" +- "标记了高优先级且没人负责的任务" + +## AI 通常会问回的信息 +模糊提问时,AI 可能反问以缩小范围: + +- 时间范围(今天/本周/本月/自定义) +- 状态(未开始/进行中/已完成/已逾期) +- 项目限定 +- 负责人是不是你 + +## 后续动作 +列出任务后可以接续操作,无需重复说"在 X 项目": + +- "把第 2 条标完成" → 调 `complete_task` +- "打开第一条" → 调 `execute_action` 跳到任务详情 +- "给小王再加一条子任务" → 调 `create_sub_task` + +## 不支持 +- 不支持跨用户查询别人的任务列表 +- 模糊筛选「重要的」「紧急的」不保证命中:依赖任务已设置对应优先级/标签字段 +- 不返回已删除任务(除非显式说"被删的任务") + +## 相关 +- 创建任务:[[ai-assistant.create-task.howto]] +- 子任务建议:[[ai-assistant.subtask-suggest.howto]] +- 打开任务详情:[[ai-assistant.page-action.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/model-switch.md b/resources/ai-kb/zh/howto/ai-assistant/model-switch.md new file mode 100644 index 000000000..0c27b93ae --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/model-switch.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.model-switch.howto +title: 切换 AI 助手使用的模型 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 怎么换 AI 模型 + - 切换模型 + - 用 GPT 还是 Claude + - 改用别的 AI + - 模型下拉 +related_tools: [] +related_pages: [] +prerequisites: + - AI 助手浮窗已打开 + - 管理员配置了 ≥ 1 个模型 +negative: + - 切换模型不会重置当前会话历史,会带着已有 context 直接换模型续聊 + - 切模型不会回放之前的回答(不重生成已有的 message) + - 不支持把同一个问题同时发到两个模型做对比 +last_verified: v1.7.90 +--- + +# 切换 AI 助手使用的模型 + +## 入口 +- 打开 AI 助手浮窗(点浮按钮 / Cmd+I / Ctrl+I) +- 浮窗**底部输入区**有一个「模型下拉框」,左侧位置 +- 下拉按服务商分组,如 ChatGPT / Claude / DeepSeek 等 + +## 操作步骤 +1. 在浮窗底部点击模型选择下拉框 +2. 在分组列表中选目标模型(如 `Claude → claude-3.5-sonnet`) +3. 选中后立即生效,下一次发送就用新模型 + +## 选项排序逻辑 +- 服务商按 `openai` → `claude` → `deepseek` → `gemini` → `grok` → `ollama` → `zhipu` → `qianwen` → `wenxin` 固定顺序 +- 每个服务商分组最多显示 5 个候选 + 1 个管理员设置的默认模型(如不在前 5 内会追加) +- 不在 `AIBotMap` 的自定义服务商按字母序排在最后 + +## 自动记忆 +- 切换后的选择会写入 IndexedDB key `aiAssistant.model` +- 下次打开 AI 助手时自动恢复到上次用过的模型 + +## 切换后的会话影响 +- 历史消息(用户问 + AI 回)保留,会作为 context 发给新模型 +- AI 不会重新回答历史问题;只对**下一次新提问**生效 +- 多模态:如果切到不支持图片的模型,未来发图会失败(但已有图片预览仍可看) + +## 不支持 +- 不支持切换后清空历史(要清空需手动新建会话:[[ai-assistant.new-chat.howto]]) +- 不支持「这条回答用模型 A,下一条用模型 B」的单轮指定 +- 不支持下拉为空时自动 fallback(下拉空时直接禁用发送,详见 [[ai-assistant.model-empty.faq]]) + +## 相关 +- 模型概念与服务商列表:[[ai-assistant.model.concept]] +- 下拉为空:[[ai-assistant.model-empty.faq]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/new-chat.md b/resources/ai-kb/zh/howto/ai-assistant/new-chat.md new file mode 100644 index 000000000..ffd59e24f --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/new-chat.md @@ -0,0 +1,64 @@ +--- +id: ai-assistant.new-chat.howto +title: 新建一个 AI 助手会话 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 新建 AI 会话 + - 重新开始 AI + - 开一段新对话 + - 清空当前对话 + - 不要带上下文 + - AI 重新聊 +related_tools: [] +related_pages: [] +prerequisites: + - AI 助手浮窗已打开 +negative: + - 新建会话不会删除旧会话,只是把旧会话归档到历史列表 + - 新建会话只清空输出区与上下文,不影响模型选择 / 浮按钮位置 + - 嵌入入口的「新建」按钮不出现在浮窗,由各业务入口控制 +last_verified: v1.7.90 +--- + +# 新建一个 AI 助手会话 + +## 何时需要新建 +- 想换话题,又不希望 AI 受当前会话历史影响 +- 当前会话上下文太长,回答变慢或质量下降 +- 不想让接下来的提问污染历史 + +## 入口 +1. 打开 AI 助手浮窗 +2. 浮窗**右上角操作区**有一个「新建会话」图标 +3. 仅当 `sessionEnabled = true` **且**(当前会话有消息 **或** 历史列表非空)时显示 + +## 行为 +点击「新建会话」按钮: +1. 当前会话**自动保存**到历史列表(标题取首条提问前 20 字) +2. 生成新 `session_id`(格式 `session-{时间戳}-{随机串}`) +3. 清空 `responses`,页面输出区清空 +4. 上下文 context 归零,下一次提问只发当前消息 + 默认 system prompt +5. 当前模型选择保留 + +## 不会影响什么 +- 模型下拉的当前选择 +- 浮按钮位置 / 收起状态 +- 历史会话列表(仅多一条) +- 图片缓存(已发送过的图片仍可被历史引用) + +## 其他「新建」的等价路径 +- **删除当前会话**:不想留底就直接删除当前会话,会自动建一个空会话进入(见 [[ai-assistant.session-delete.howto]]) +- **切到其他历史会话**:会切走当前会话,但当前会话仍保留在历史里 + +## 不支持 +- 不支持「新建会话同时换模型」(先切模型再新建) +- 不支持「新建空会话但保留前一轮上下文」 +- 不支持指定新会话标题(永远自动生成) + +## 相关 +- [[ai-assistant.session.concept]] +- [[ai-assistant.session-list.howto]] +- [[ai-assistant.session-save.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/page-action.md b/resources/ai-kb/zh/howto/ai-assistant/page-action.md new file mode 100644 index 000000000..567cecd1f --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/page-action.md @@ -0,0 +1,67 @@ +--- +id: ai-assistant.page-action.howto +title: 让 AI 帮我跳页面/打开任务 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 打开任务 + - AI 切换项目 + - AI 跳到仪表盘 + - 让 AI 帮我开 X + - AI 跳转 + - AI 帮我打开 +related_tools: [execute_action] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 浏览器/桌面端会话所在页面已加载 +negative: + - 只在当前浏览器标签内导航,不会新开标签 + - AI 不能打开你没权限访问的资源(会被后端拒绝) + - 若任务被删,AI 跳转后会落到 404 / 提示「任务不存在」 +last_verified: v1.7.90 +--- + +# 让 AI 帮我跳页面/打开任务 + +## 这是什么 +在 AI 浮窗用自然语言让 AI 把当前页跳转到任务详情、对话、项目、文件预览或功能页。AI 调 `execute_action` 工具,通过 WebSocket 让前端执行真实路由跳转。 + +## 怎么问 +- "打开任务 1234" +- "切到项目『官网改版』" +- "打开和小王的对话" +- "帮我打开仪表盘" +- "跳到日历" +- "打开文件 ID 5678" + +## 支持的跳转目标 +- 任务详情(open_task / goto_task / navigate_to_task) +- 对话(open_dialog,可附带 msg_id 跳到指定消息) +- 项目主页(open_project) +- 文件预览(open_file)/ 文件夹(open_folder) +- 功能页:仪表盘 / 消息 / 日历 / 文件管理 + +## AI 怎么找到目标 +- 你给 ID 时直接跳 +- 你给名字时 AI 会先调 `list_tasks` / `search_dialogs` / `list_projects` / `search_files` 找候选 +- 同名多选时列候选让你确认 + +## 跳转后还能继续 +跳到目标页后,浮窗保持打开,可继续: + +- "把它标完成" → 调 `complete_task` +- "看下讨论" → 调 `get_message_list` +- "拉到底部" → 调 `execute_element_action` 滚动 + +## 不支持 +- 不能跳到外部网址(如 google.com) +- 不能在新标签打开 +- 不能切换到其他用户的视图 + +## 相关 +- 操作页面元素:[[ai-assistant.element-action.howto]] +- 页面操作机制:[[ai-assistant.page-action.concept]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/project-init.md b/resources/ai-kb/zh/howto/ai-assistant/project-init.md new file mode 100644 index 000000000..5efc870a1 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/project-init.md @@ -0,0 +1,62 @@ +--- +id: ai-assistant.project-init.howto +title: 让 AI 生成项目结构 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 建项目 + - AI 生成项目模板 + - 项目结构 AI + - AI 帮我搭项目 + - 新项目让 AI 写 + - 创建项目时的 AI 按钮 +related_tools: [create_project, create_task] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已开启至少一个支持 tool call 的模型 +negative: + - 仅生成项目骨架(列 + 初始任务),不生成成员/权限设置 + - 一次最多生成 5 个列 + 每列 6 条任务,超出请二次追加 + - 不会自动创建已存在同名项目(会提示重命名) +last_verified: v1.7.90 +--- + +# 让 AI 生成项目结构 + +## 这是什么 +在「创建项目」弹窗里,项目名输入框右侧有 AI 按钮(仅 ai 插件已装且模型已配置时显示)。点击后描述项目目标,AI 会调 `create_project` 创建项目,再用 `create_task` 批量写入推荐的列和初始任务。 + +## 入口 +- 桌面端:右上角全局「+」→「创建项目」→ 项目名输入框右侧 AI 图标 +- 桌面端:左侧栏「项目」→「+」→「创建项目」→ 同上 +- 移动端:「+」→「创建项目」→ AI 按钮 + +## 操作步骤 +1. 打开创建项目弹窗,点项目名旁 AI 按钮 +2. 输入项目描述(如"3 个月官网改版,含 UI/前端/后端") +3. AI 生成项目名 + 列结构 + 每列初始任务预览 +4. 点「采用并创建」批量建 + +## AI 输出示例 +- **项目名**:官网改版 2026Q1 +- **列**:待办 / 设计中 / 开发中 / 测试中 / 已完成 +- **任务**:每列 3-6 条按角色分组 + +## 后续动作 +项目创建完成后可继续: + +- "把这些任务都分给小王" → 调 `update_task` 批量改负责人 +- "再加一个『设计评审』列" → 调列管理工具 +- "把项目讨论组拉一下" → AI 暂不能自动建群 + +## 不支持 +- 不能基于其他项目复制(要复制项目请用模板功能) +- AI 不会自动设置任务截止时间,需后续追加 +- 创建后想撤销只能手动删项目(无 undo) + +## 相关 +- 浮窗里建单个任务:[[ai-assistant.create-task.howto]] +- 入口总览:[[ai-assistant.entry.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/report-draft.md b/resources/ai-kb/zh/howto/ai-assistant/report-draft.md new file mode 100644 index 000000000..d44fb8ed9 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/report-draft.md @@ -0,0 +1,56 @@ +--- +id: ai-assistant.report-draft.howto +title: 用 AI 助手整理工作报告 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 写周报 + - AI 生成日报 + - 周报模板 AI + - AI 帮我写报告 + - 工作总结 AI + - AI 整理汇报怎么用 +related_tools: [generate_report_template] +related_pages: [] +prerequisites: + - 应用商店(应用市场)已安装 ai 插件 + - 管理员已配置至少一个可用 AI 模型 +negative: + - AI 做的是「整理润色」,不是从零代写:汇报内容为空时按钮会提示「请先填写汇报内容」 + - 整理结果是草稿,需用户人工审阅、修改、手动提交(不自动发送) + - 数据来源是周期内的任务记录,不读群聊 +last_verified: v1.7.90 +--- + +# 用 AI 助手整理工作报告 + +## 这是什么 +写工作报告(日报 / 周报)时,可以让 AI 助手基于已填写的汇报内容做整理和润色。新建报告时系统已按你周期内的任务(已完成 / 未完成)自动生成内容初稿,AI 在此基础上加工,不会替你从零编造。 + +## 入口 +桌面端:工作报告编辑页(「应用」→「工作报告」→ 写报告)底部,「提交」按钮旁的「**AI 整理汇报**」按钮。 + +## 操作步骤 +1. 进入报告编辑页,选择类型(日报 / 周报),系统自动按任务生成汇报内容初稿 +2. 先补充 / 修改汇报内容(内容为空时点按钮会提示「请先填写汇报内容」) +3. 点「AI 整理汇报」,弹出 AI 助手浮窗,可输入想强调的重点或特殊说明 +4. AI 在已填内容基础上整理、润色、生成总结 +5. 把整理结果应用回编辑器,人工检查后点「提交」 + +## 让结果更贴合需求 +在浮窗里补充说明,例如: + +- "重点写官网改版项目,其他一笔带过" +- "口语化一点 / 更正式一点" +- "用英文写" + +## 不支持 +- 不会自动提交(始终需要人工点提交) +- 不会跨用户整理(只能处理自己的报告) +- 汇报内容为空时不能直接生成,必须先填写内容 + +## 相关 +- 报告编辑页按钮详情:[[report.ai-generate.howto]] +- 总结任务:[[ai-assistant.task-summary.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/search-files.md b/resources/ai-kb/zh/howto/ai-assistant/search-files.md new file mode 100644 index 000000000..b9532ec4e --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/search-files.md @@ -0,0 +1,56 @@ +--- +id: ai-assistant.search-files.howto +title: 让 AI 帮我找文件 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 找文件 + - 帮我找文档 + - AI 查文件 + - 我上传过的 X 文件 + - 找上次那个表 + - 谁分享过 X +related_tools: [search_files] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 仅搜当前用户可见的文件(自己上传的 + 项目共享的 + 群里共享的) + - 不能搜本地未上传到 DooTask 的文件 + - 文件内容搜索仅对支持解析的格式有效(txt/md/docx/pdf/xlsx 等) +last_verified: v1.7.90 +--- + +# 让 AI 帮我找文件 + +## 这是什么 +在 AI 浮窗描述要找的文件,AI 调 `search_files` 工具按文件名 / 内容关键词 / 创建人 / 时间检索,返回文件名、路径、所有者、修改时间,常带跳转链接。 + +## 怎么问 +- "找一下我上周上传的 PRD 文档" +- "搜叫『2026 年规划』的 Excel" +- "项目 X 里所有 .pdf" +- "小王最近共享给我的文件" +- "包含『接口文档』关键字的文件" + +## 内容搜索 vs 文件名搜索 +- 提问含"文件名"、"叫…"时按文件名匹配 +- 提问含"包含…"、"提到…"、"关于…"时按内容关键词匹配(需后端文件内容索引可用) + +## 找到文件能继续做什么 +- "打开第一个" → 调 `execute_action` 跳文件预览 +- "下载它" → AI 会给下载链接(无法直接触发浏览器下载) +- "把摘要发我" → 调 `fetch_file_content` 取文本,再让模型总结 + +## 不支持 +- 不支持搜历史版本/已删除文件(默认过滤) +- 加密文件(如带密码 PDF)的内容索引可能为空,只能文件名匹配 +- 不能跨用户搜别人不共享给你的文件 + +## 相关 +- 取文件文字内容:`fetch_file_content`(暂未单独 chunk) +- 图片 OCR:`extract_image_text`(暂未单独 chunk) +- 跨类型语义搜索:[[ai-assistant.intelligent-search.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/search-help-docs.md b/resources/ai-kb/zh/howto/ai-assistant/search-help-docs.md new file mode 100644 index 000000000..61042fc12 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/search-help-docs.md @@ -0,0 +1,56 @@ +--- +id: ai-assistant.search-help-docs.howto +title: AI 帮我查 DooTask 怎么用 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 怎么用 DooTask + - X 在哪 + - X 怎么操作 + - 帮我查文档 + - DooTask 怎么做 X + - 找帮助 +related_tools: [search_help_docs] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 +negative: + - 知识库只覆盖 DooTask 自身功能,不回答行业知识或通用 IT 问题 + - 中英文知识库分别检索,所选会话语种决定查哪边 + - 没找到资料时 AI 会明示「未在知识库找到」而不是编造 +last_verified: v1.7.90 +--- + +# AI 帮我查 DooTask 怎么用 + +## 这是什么 +当你在 AI 浮窗里问 DooTask 功能怎么用,例如"任务怎么设置可见用户"、"报告模板在哪改",AI 会自动触发 `search_help_docs` 工具,从内置知识库(本仓库)检索相关 chunk,再综合给出步骤。 + +## 怎么触发 +直接用自然语言提问,无需特殊指令: + +- "如何创建项目?" +- "权限不足提示怎么解决?" +- "看板列怎么加?" +- "微应用是什么?" +- "签到怎么补打?" + +## 看 AI 调用了哪些资料 +- 浮窗中会出现 `search_help_docs` 工具气泡,展开可看检索关键词 +- 回答末尾通常会标注"参考自帮助文档"或附上相关功能名 +- 若回答错了,可继续追问"你查到的是哪一篇?",AI 会列出 chunk id + +## 让 AI 查得更准的小技巧 +- 一次只问一个具体功能,别堆三个问题 +- 出错时把错误提示原文贴上,AI 会同时去查 FAQ 类 chunk +- 含产品名加上"DooTask"前缀(如"DooTask 的看板")能避开开放知识 + +## 不支持 +- 不支持「教我怎么编程」「我项目用 React 怎么写」等编程问题 +- 英文知识库覆盖不全:知识库以中文为主,英文环境检索 en 库时覆盖度可能偏低 + +## 相关 +- 入口:[[ai-assistant.entry.howto]] +- 跨任务/项目/文件的语义搜索:[[ai-assistant.intelligent-search.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/search-users.md b/resources/ai-kb/zh/howto/ai-assistant/search-users.md new file mode 100644 index 000000000..1b5d4d48c --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/search-users.md @@ -0,0 +1,61 @@ +--- +id: ai-assistant.search-users.howto +title: 让 AI 帮我找人 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 找人 + - AI 查同事 + - 帮我找小王 + - 找联系人 + - 找用户 + - 谁是 X 部门负责人 +related_tools: [search_users] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 +negative: + - 搜索范围受当前用户可见性限制,不能搜到组织外的人 + - 同名用户会一并列出,需用工号/部门/邮箱再筛 + - 不返回登录密码、手机号等敏感字段 +last_verified: v1.7.90 +--- + +# 让 AI 帮我找人 + +## 这是什么 +在 AI 浮窗问人,AI 调 `search_users` 工具按关键词、项目成员或对话成员筛选,返回昵称、邮箱、部门、头像等基础信息。常用于"加任务负责人 / 拉群"前的确认。 + +## 怎么问 +- "找一下叫小王的同事" +- "运维部有哪些人" +- "项目『官网改版』里都有谁" +- "群『前端组』里的成员" +- "邮箱含 zhang 的同事" + +## 同名怎么办 +AI 会列出全部同名候选,附部门/邮箱 hint,让你回复"第 2 个"或"运维部那个",再继续后续操作。 + +## 找到人之后能做什么 +- "给他发消息:明天 10 点开会" → 调 `send_message` +- "把他加进这个项目任务的负责人" → 调 `update_task` +- "拉个群把他们都加进去" → 仍需人工操作建群(AI 不能自动建群) + +## 限制范围 +默认搜全组织可见用户。可以加范围词收窄: + +- "项目 X 里的" +- "对话 Y 里的" +- "部门 Z 里的" + +## 不支持 +- 不能搜外部联系人(DooTask 没有公网通讯录) +- 不能搜已离职/已禁用账号(默认过滤) +- 不能按"今天在线的人"筛(无该字段) + +## 相关 +- 发消息:[[ai-assistant.send-message.howto]] +- 创建任务时指派人:[[ai-assistant.create-task.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/send-message.md b/resources/ai-kb/zh/howto/ai-assistant/send-message.md new file mode 100644 index 000000000..70f6da959 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/send-message.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.send-message.howto +title: 让 AI 帮我发消息 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 发消息 + - AI 发群 + - 帮我发给小王 + - AI 自动发通知 + - 让 AI 发到群里 + - AI 代发 +related_tools: [send_message] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 当前用户与目标对话/用户已存在会话或有权发起 +negative: + - 发送动作以当前登录用户名义执行,对方看到的是你发的(不是「AI 代发」标签) + - AI 不会未经确认直接发,敏感/长内容会先弹消息预览让你确认 + - 不能发送已撤回/未上传完成的图片 +last_verified: v1.7.90 +--- + +# 让 AI 帮我发消息 + +## 这是什么 +在 AI 浮窗描述要发的内容和对象,AI 会先调 `search_dialogs` 或 `search_users` 找到目标对话,再调 `send_message` 把消息发出去。消息以当前登录用户身份发送。 + +## 怎么问 +- "给小王发:会议改到下午 3 点" +- "在『前端组』群里发:今晚 8 点上线,请大家配合" +- "把刚才那个总结发到项目讨论组" + +## AI 会先确认 +- **接收人/群歧义**:同名时列候选让你挑 +- **长消息**:超过 200 字会先在浮窗里贴出预览,等你说「确认发」 +- **跨群广播**:一次发多群通常会拆成多次确认 + +## 发送结果 +发送成功后浮窗会显示消息 ID + 时间戳;如果对方禁言/不在好友列表/对话不存在,会回失败原因。 + +## 后续动作 +- "撤回刚才那条" → 调 `update_message` 或 `delete_message`(依实现) +- "看下回复" → 调 `get_message_list` +- "发完顺便建个任务跟进" → 调 `create_task` + +## 不支持 +- 不能发语音/视频通话邀请 +- 不能定时发送(无 schedule 工具) +- 不能伪装其他用户发送 +- AI 不会自动把"@小王"翻成用户 mention,需要明确说"@用户 ID" + +## 相关 +- 找人:[[ai-assistant.search-users.howto]] +- 任务讨论区 @AI:[[ai-assistant.task-mention.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/session-delete.md b/resources/ai-kb/zh/howto/ai-assistant/session-delete.md new file mode 100644 index 000000000..f1be7c09f --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/session-delete.md @@ -0,0 +1,63 @@ +--- +id: ai-assistant.session-delete.howto +title: 删除 AI 助手历史会话 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 删除 AI 历史 + - 清空 AI 对话 + - 删除 AI 会话 + - AI 历史不要了 + - 删除 AI 聊天记录 +related_tools: [] +related_pages: [] +prerequisites: + - 当前桶有 ≥ 1 条会话 +negative: + - 删除不可恢复,相关图片也会从 public/uploads 物理删除 + - 删除单条无二次确认;清空全部有确认弹窗 + - 删除当前桶不会影响其他桶 +last_verified: v1.7.90 +--- + +# 删除 AI 助手历史会话 + +## 入口 +1. 打开 AI 助手浮窗 +2. 浮窗右上角点「历史」图标展开下拉 + +## 删除单条 +1. 鼠标移到目标会话条目上 +2. 点条目右侧小垃圾桶图标 +3. **立即删除**(无确认): + - 后端调 `POST api/assistant/session/delete`,参数 `{session_key, session_id}` + - 服务端删除会话记录及对应 `public/uploads/assistant/YYYYMM/{userid}/` 图片 + - 如果删的是当前打开的会话,自动新建一个空会话替代 + +## 清空整个桶(全部历史) +1. 历史下拉最底部「清空历史记录」 +2. 弹出确认弹窗 → 「确定」 +3. 执行: + - 调 `POST api/assistant/session/delete`,参数 `{session_key, clear_all: true}` + - 后端清空当前桶所有会话 + 物理删除所有图片 + - 前端清空内存 `imageCache` 和 `serverImageMap` + - 自动新建一个空会话进入 + +## 不影响其他桶 +- 浮窗用 `session_key = global`,清空只删 `global` 桶 +- 嵌入入口(`project-create`、`task-add` 等)的会话**不受影响** + +## 误删可恢复吗? +**不能。** 删除即写库 `DELETE`,物理删除关联图片,**无回收站、无 30 天保留**。要保留的对话请提前复制到笔记。 + +## 不支持 +- 不支持选择多条批量删除(只能单删或清空全部) +- 不支持「软删除 / 30 天回收」 +- 不支持按时间范围筛选删除 + +## 相关 +- [[ai-assistant.session-list.howto]] +- [[ai-assistant.session.concept]] +- [[ai-assistant.new-chat.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/session-list.md b/resources/ai-kb/zh/howto/ai-assistant/session-list.md new file mode 100644 index 000000000..36719b325 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/session-list.md @@ -0,0 +1,70 @@ +--- +id: ai-assistant.session-list.howto +title: 查看 AI 助手历史会话 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 历史会话 + - 我之前问过 AI 什么 + - 找回 AI 对话 + - AI 聊天记录 + - 看 AI 历史 +related_tools: [] +related_pages: [] +prerequisites: + - 当前桶至少有 1 条已保存的会话 +negative: + - 历史只显示当前用户、当前桶的会话 + - 嵌入入口的会话不出现在浮窗历史里 + - 历史按更新时间倒序,最近的在上面 +last_verified: v1.7.90 +--- + +# 查看 AI 助手历史会话 + +## 入口 +1. 打开 AI 助手浮窗 +2. 浮窗**右上角操作区**有「历史」图标 +3. 点击展开下拉,列出当前桶内所有已保存会话 + +仅当桶内有 ≥ 1 条会话时该图标才出现。 + +## 显示内容 +每条会话显示三行: +- 标题:取首条用户消息前 20 字 +- 删除按钮(右上角小垃圾桶) +- 更新时间:今天 / 昨天 / MM-DD HH:mm / YYYY-MM-DD HH:mm + +排序:按更新时间倒序,最近聊的在最上面。 + +## 操作步骤 + +### 切换到某条历史会话 +1. 在历史下拉里点要打开的会话标题 +2. 当前对话内容自动保存 +3. 浮窗输出区切换为该会话的消息流 + +### 删除单条会话 +1. 鼠标移到会话条目上 +2. 点条目右侧小垃圾桶图标 +3. 立即删除(无二次确认);同时清掉服务端会话图片 + +### 清空全部历史 +1. 历史下拉最底部「清空历史记录」 +2. 弹出确认弹窗 → 「确定」 +3. 当前桶所有会话被删,图片缓存一并清空 + +## 数据来源 +通过 `POST api/assistant/session/list` 拉取,按当前用户 + 当前 `session_key` 过滤。返回会话最多 20 条(受 `maxSessionsPerKey` 限制)。 + +## 不支持 +- 不支持按关键词搜索历史 +- 不支持给会话改名(标题永远是首条提问截取) +- 不支持把历史导出 CSV / 文本 + +## 相关 +- [[ai-assistant.session.concept]] +- [[ai-assistant.session-delete.howto]] +- [[ai-assistant.new-chat.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/session-save.md b/resources/ai-kb/zh/howto/ai-assistant/session-save.md new file mode 100644 index 000000000..fad5295e8 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/session-save.md @@ -0,0 +1,67 @@ +--- +id: ai-assistant.session-save.howto +title: AI 助手会话自动保存 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 会话保存 + - AI 对话留底 + - AI 会话不保留 + - AI 没保存 + - 手动保存 AI +related_tools: [] +related_pages: [] +prerequisites: + - 会话管理已启用(`sessionEnabled = true`,浮窗自动开启) +negative: + - 没有「立即保存」按钮,全部自动;不会丢失最新一条 + - 嵌入入口未传 sessionKey 时不会启用保存(一次性对话) + - streaming / waiting 状态会被归一为 error 再写库,避免重启卡 loading +last_verified: v1.7.90 +--- + +# AI 助手会话自动保存 + +## 是否需要手动保存 +**不需要。** AI 助手浮窗的会话保存全自动。以下时机触发保存: + +1. **流式回答完成**:AI 最后一个 chunk 到达,标记 `completed` 后立即保存 +2. **流式失败 / 用户中断**:归一未完成态为 `error` 后保存 +3. **手动新建会话 / 切换会话 / 切桶**:先保存当前会话再切换 +4. **常规编辑(删消息、编辑提问)**:2 秒防抖批量写入 + +## 保存到哪 +- 数据库表:`ai_assistant_sessions`,按 `userid` 隔离 +- 接口:`POST api/assistant/session/save` +- 字段:`session_key`、`session_id`、`title`、`data`(JSON 消息流)、`new_images`(新增图片 base64 列表) + +## 标题如何生成 +- 取首条 `role !== 'system'` 的 `prompt` 前 20 字 +- 无任何用户提问时显示「新会话」 +- 标题不可手动改 + +## 图片同步上传 +- 保存时仅传**本次新增**的图片 base64 +- 后端写入 `public/uploads/assistant/YYYYMM/{userid}/xxx.jpg` +- 返回 `image_urls` 映射,前端缓存到 `serverImageMap`,下次打开会话用 URL 显示 + +## 防抖与容错 +- 普通编辑 2 秒防抖 +- 流式结束 / 失败立即写入 +- 写入失败仅 console.warn,下次保存补上 + +## 什么时候不保存 +- 嵌入入口未传 sessionKey → 该入口走「一次性对话」,关闭后不留底 +- 当前会话内一条消息都没有 → 不创建空会话记录 + +## 不支持 +- 不支持云端跨用户 / 跨工作区同步 +- 不支持「保存到本地文件」选项 +- 不支持暂停自动保存 + +## 相关 +- [[ai-assistant.session.concept]] +- [[ai-assistant.session-list.howto]] +- [[ai-assistant.stop.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/shortcut.md b/resources/ai-kb/zh/howto/ai-assistant/shortcut.md new file mode 100644 index 000000000..401d2b131 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/shortcut.md @@ -0,0 +1,59 @@ +--- +id: ai-assistant.shortcut.howto +title: 用快捷键呼出 AI 助手 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 助手快捷键 + - 怎么用键盘打开 AI + - Cmd I + - Ctrl I + - AI 键盘打开 +related_tools: [] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已配置至少一个 AI 模型 +negative: + - 移动端没有键盘快捷键(用浮按钮 / Tabbar 入口替代) + - 不支持自定义快捷键,固定为 Cmd+I / Ctrl+I + - 在输入法候选状态下按 I 不会触发(不和 IME 抢键位) +last_verified: v1.7.90 +--- + +# 用快捷键呼出 AI 助手 + +## 快捷键 + +| 终端 | 快捷键 | 说明 | +|---|---|---| +| macOS(桌面 / Web) | `Cmd + I` | 全局生效,无需点输入框 | +| Windows / Linux(桌面 / Web) | `Ctrl + I` | 全局生效 | +| 移动端 | — | 无键盘快捷键 | + +## 触发条件 +- ai 插件已安装(`microAppsIds.includes('ai')` 为 true) +- 当前在已登录页面(路由非 `login`) +- 按键时**未同时按 Shift 或 Alt**,否则会落入其他组合(如 Cmd+Shift+I 是浏览器开发者工具) + +## 行为 +按下快捷键时,等价于点击右上角全局「+」菜单里的「AI 助手」项,会: +1. 阻止浏览器 / Electron 默认行为(如 Safari 的「显示书签栏」) +2. 触发 `openAIAssistantGlobal` 事件 +3. 弹出 AI 助手弹窗(默认 modal 形态),自动聚焦到输入框 + +## 不响应的场景 +- 当前页面是登录页 → 不触发 +- ai 插件未安装 → 不触发(按键被释放给浏览器) +- 中文 / 日文输入法处于候选字状态 → 不触发 + +## 不支持 +- 无法在「个人设置」改快捷键,键位固定 +- 不支持单独的「关闭 AI 助手」快捷键;按 Esc 仅在浮窗模式下关闭 +- 移动端长按虚拟键盘 I 不能触发(依赖物理键盘事件) + +## 相关 +- 完整入口清单:[[ai-assistant.entry.howto]] +- 弹窗形态:[[ai-assistant.modal.concept]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/stop.md b/resources/ai-kb/zh/howto/ai-assistant/stop.md new file mode 100644 index 000000000..520e99c36 --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/stop.md @@ -0,0 +1,63 @@ +--- +id: ai-assistant.stop.howto +title: 中断 AI 助手回答 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 停止 AI 回答 + - 让 AI 停下来 + - 取消 AI 输出 + - AI 一直在打字 + - 终止流式 + - 重发问题 +related_tools: [] +related_pages: [] +prerequisites: + - AI 助手当前有一条流式回答正在输出 +negative: + - 中断后的部分回答保留,但状态变为 error,不会再续传 + - 中断不向上游模型扣费返还(看服务商) + - 不支持「暂停后再继续」,只能停 + 重新提问 +last_verified: v1.7.90 +--- + +# 中断 AI 助手回答 + +## 何时需要中断 +- AI 跑偏,回答方向不对,想立即停下重提问 +- 模型陷入冗长输出 +- 想换个模型重发同一问题 + +## 入口 +当 AI 正在流式输出时,主动中断方式: +1. **新建会话**:右上角「新建会话」会先清掉当前流再开空会话(见 [[ai-assistant.new-chat.howto]]) +2. **关闭浮窗**:关闭浮窗会清理所有活跃 SSE 连接(见 [[ai-assistant.close.howto]]) +3. **发新问题**:发起新提问会自动清掉同会话的残留 SSE 流 + +## 中断时发生了什么 +1. 前端调 SSE 客户端的 `unsunscribe()` 切断连接 +2. 已收到的部分回答(rawOutput)保留在 message +3. 该 message 的 `status` 立即变为 `error`,附「会话中断」错误文案 +4. message 持久化到 session(带 error 状态),刷新不会再卡 loading + +## 流式中断恢复保护 +- 即使页面崩溃 / 刷新,加载会话时如果发现某条 message 仍是 `streaming` 或 `waiting`,会自动归一为 `error` +- 避免「永远转圈」(见 `sanitizeResponsesForPersist`) + +## 重新提问 +中断后想重发同一问题: +1. 鼠标移到刚才被中断的提问气泡 +2. 点编辑图标 → 修改后再发 +3. 或直接在输入框输入新的问题(按 ↑ 可调出最近 50 条历史输入) + +## 不支持 +- 不支持「暂停 → 继续」,只能停 + 重发 +- 不支持只中断单条;同会话所有进行中的流会一起停 +- 不支持中断后撤销(再次发送会生成新一条 message) + +## 相关 +- [[ai-assistant.streaming.concept]] +- [[ai-assistant.close.howto]] +- [[ai-assistant.new-chat.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/subtask-suggest.md b/resources/ai-kb/zh/howto/ai-assistant/subtask-suggest.md new file mode 100644 index 000000000..94800c34c --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/subtask-suggest.md @@ -0,0 +1,58 @@ +--- +id: ai-assistant.subtask-suggest.howto +title: 让 AI 帮我拆子任务 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 拆任务 + - AI 建议子任务 + - 拆解任务 + - AI 帮我分解 + - 任务太大怎么拆 + - 子任务建议 +related_tools: [create_sub_task] +related_pages: [task_detail] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 当前用户能修改该任务(负责人/协作者/项目管理员) +negative: + - AI 建议不会自动落地,需用户在回复里点「全部创建」或逐条确认 + - 一次最多建议 10 条子任务,复杂任务可分多次 + - AI 拆分依赖任务标题 + 描述,描述过短时建议会很泛 +last_verified: v1.7.90 +--- + +# 让 AI 帮我拆子任务 + +## 这是什么 +在任务讨论区 @AI 让它根据当前任务的标题、描述自动建议一组子任务清单,确认后通过 `create_sub_task` 工具一次性建到当前任务下。 + +## 怎么触发 +- **任务讨论区**:@AI 说"帮我拆 5 个子任务" / "把这个任务分解成执行步骤" +- **浮窗**:先 `open_task` 或带上任务 ID,然后说"按这个任务拆子任务" + +## AI 通常会返回 +1. 一组建议条目(如「需求评审 / 设计稿 / 前端开发 / 后端开发 / 联调测试 / 上线」) +2. 每条带预估负责人角色提示 +3. 末尾问"是否一键创建" + +## 操作步骤 +1. 打开任务详情 → 讨论区 @AI +2. 提示词如"按当前任务拆 5 个子任务,包括负责人建议" +3. AI 列出建议 +4. 回复"全部创建",AI 调 `create_sub_task` 逐条建 +5. 若想改某条 → 回复"第 2 条改成 X",AI 重发建议 +6. 创建完成后讨论区会出现"已新建 N 条子任务"提示 + +## 不支持 +- 子任务仅支持 1 层(AI 不会再为子任务建孙任务,建会被后端拒绝) +- 拆分不会自动设置截止时间,需后续追加"第 1 条截止 X 日" +- AI 不会自动分配人选,需追加"分给前端组成员" + +## 相关 +- 子任务概念:[[task.subtask.concept]] +- 任务讨论区 @AI:[[ai-assistant.task-mention.howto]] +- 创建任务:[[ai-assistant.create-task.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/task-mention.md b/resources/ai-kb/zh/howto/ai-assistant/task-mention.md new file mode 100644 index 000000000..013cb333a --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/task-mention.md @@ -0,0 +1,62 @@ +--- +id: ai-assistant.task-mention.howto +title: 任务讨论区里 @AI +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - 任务里 @AI + - 在任务下 at AI + - AI 分析任务 + - 让 AI 看下这个任务 + - 任务讨论 @ 机器人 + - AI 接进任务 +related_tools: [send_task_ai_message] +related_pages: [task_detail] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已开启至少一个支持 tool call 的模型 + - 当前用户可访问该任务 +negative: + - "@AI 后的提问会被全部讨论区成员看到(公开提问)" + - "AI 仅读取本任务的标题、描述、子任务、评论作为上下文,不会跨任务查" + - "群里 @AI 与任务讨论区 @AI 是两条不同链路,结果格式略有差异" +last_verified: v1.7.90 +--- + +# 任务讨论区里 @AI + +## 这是什么 +在任务详情页的「讨论」区输入框 @AI(出现在 @ 下拉列表里)然后提问,AI 会以任务上下文(标题/描述/子任务/讨论历史)为基础回答,结果同步发到讨论区,所有成员可见。 + +## 入口 +- 桌面端:任务详情页 → 右侧/底部「讨论」标签 → @ → 选「AI」 +- 移动端:任务详情页 → 「讨论」→ @ → 选「AI」 + +## 操作步骤 +1. 打开任务详情,切到「讨论」 +2. 在评论输入框输入 `@` 弹出候选 +3. 选「AI 助手」 +4. 输入提问(如"帮我看下这个任务还差什么") +5. 发送,AI 会以消息形式回答到同一条讨论 + +## 适合问的 +- "总结一下这个任务的进展" +- "根据描述帮我拆 5 个子任务" +- "讨论里大家在争什么?给我个概要" +- "下一步建议怎么做" + +## 与浮窗 AI 的区别 +- 浮窗:单人会话,结果只你能看到,可调全部工具 +- 任务 @AI:公开讨论,回答全员可见,主要做总结/分析,少调改写类工具 + +## 不支持 +- 不能 @AI 后让它跨任务汇总(要总结多个任务请用浮窗) +- 不能私聊它(@AI 的所有回复都对讨论区可见) +- 任务设有可见用户白名单时,名单外的人看不到 AI 回复 + +## 相关 +- 子任务建议:[[ai-assistant.subtask-suggest.howto]] +- 任务总结:[[ai-assistant.task-summary.howto]] +- 浮窗入口:[[ai-assistant.entry.howto]] diff --git a/resources/ai-kb/zh/howto/ai-assistant/task-summary.md b/resources/ai-kb/zh/howto/ai-assistant/task-summary.md new file mode 100644 index 000000000..303dc7ced --- /dev/null +++ b/resources/ai-kb/zh/howto/ai-assistant/task-summary.md @@ -0,0 +1,58 @@ +--- +id: ai-assistant.task-summary.howto +title: 让 AI 总结任务进展 +type: howto +feature: ai-assistant +scope: end-user +locale: zh +aliases: + - AI 总结任务 + - 任务进展总结 + - AI 看下进度 + - 帮我汇总任务 + - 任务状态怎么样 + - AI 复盘任务 +related_tools: [get_task, get_message_list] +related_pages: [task_detail] +prerequisites: + - 应用市场已安装 ai 插件 + - 应用市场已安装 mcp_server 插件 + - 当前用户可访问该任务 +negative: + - 总结仅基于任务详情 + 讨论历史 + 子任务状态,不读外部资料 + - 不会改任务状态,只读后输出文本 + - 历史评论超 100 条时只取最近 100 条 +last_verified: v1.7.90 +--- + +# 让 AI 总结任务进展 + +## 这是什么 +让 AI 读取一个任务的标题、描述、子任务、讨论记录,输出当前进展概要,常用于会议汇报、周报、交接。AI 调 `get_task` + `get_message_list` 两个工具取数据,再综合生成。 + +## 怎么触发 +- **任务讨论区** @AI:"总结一下这个任务到现在的进展" +- **浮窗**:"帮我总结任务 ID 1234 的进展" 或先调 `open_task` 再说"总结这个" +- **批量**:浮窗里说"帮我总结项目 X 下所有进行中的任务" → AI 会先 `list_tasks` 再逐个总结 + +## 总结内容通常包含 +- 任务当前状态(未开始 / 进行中 / 已完成 / 已逾期) +- 子任务完成度(如 3/5) +- 关键讨论结论(最近的决策点) +- 待解决/阻塞项(从评论中提取"需要"/"阻塞"/"等"等关键词) +- 下一步建议(可选) + +## 让总结更准 +- 模糊任务请加 ID 或唯一标题词 +- 想突出某一面("只说阻塞"、"只说进度数字")就在提问中明示 +- 想发到群/写进报告 → 让 AI 直接 `send_message` 或追加"作为周报素材" + +## 不支持 +- 不会自动汇总跨项目(除非显式列出任务 ID) +- 不读取任务附件正文(如 PDF 内容),需先 `fetch_file_content` +- 不能生成图表/甘特图,只输出文字 + +## 相关 +- 任务讨论 @AI:[[ai-assistant.task-mention.howto]] +- 列任务:[[ai-assistant.list-tasks.howto]] +- 生成工作报告:[[ai-assistant.report-draft.howto]] diff --git a/resources/ai-kb/zh/howto/application/menu-admin.md b/resources/ai-kb/zh/howto/application/menu-admin.md new file mode 100644 index 000000000..0fcd89450 --- /dev/null +++ b/resources/ai-kb/zh/howto/application/menu-admin.md @@ -0,0 +1,53 @@ +--- +id: application.menu-admin.howto +title: 管理员自定义全员应用菜单 +type: howto +feature: application +scope: admin +locale: zh +aliases: + - 自定义应用菜单 + - 给所有人加应用入口 + - 加自定义微应用 + - 全员可见的应用怎么配 + - microapp menu +related_tools: [] +related_pages: [application] +prerequisites: + - 当前用户为系统管理员(userIsAdmin) +negative: + - 仅管理员可见入口和保存接口 + - 自定义菜单只是注册一个 URL/iframe 入口,DooTask 不托管业务页面 + - 配置项里没有"权限继承项目角色"的开关 +last_verified: v1.7.90 +--- + +# 管理员自定义全员应用菜单 + +## 是什么 +管理员可以在应用中心追加自定义菜单项(iframe / 外链等),对应一个或多个全员/管理员可见的入口。底层调用 `api/system/microapp_menu`,保存到系统设置的 `microapp_menu` 项。 + +## 入口 +- 桌面端 / 移动端:应用中心右上角「⋯」→「自定义应用菜单」(普通成员看不到此项) + +## 操作步骤 +1. 应用中心右上角「⋯」→「自定义应用菜单」 +2. 点「新增菜单」生成一张空白配置卡 +3. 填写必填字段: + - 应用 ID(如 `custom-okr`) + - 菜单标题 + - 菜单 URL(支持 `{user_token}` 等占位符) +4. 调整可选项:菜单位置 / 可见范围 / 图标 / 类型(iframe / iframe_blank / inline / inline_blank / external)/ 背景色 / 保活 / 暗黑等 +5. 点「保存」提交,应用中心立即出现新菜单 + +## 关键字段 +| 字段 | 取值 | 说明 | +|---|---|---| +| 菜单位置 | `application` / `application/admin` / `main/menu` | 决定卡片放在常用区、管理员区或顶部主导航 | +| 可见范围 | `admin` / `all` | 仅管理员或全员可见 | +| 类型 | iframe / iframe_blank / inline / inline_blank / external | 决定打开方式 | + +## 不支持 +- 普通成员无入口,必须以管理员身份进 +- 不能精细到「按部门可见」,可见范围仅 admin / all 两档 +- 配置不会影响微应用插件本身,只是追加一层菜单 diff --git a/resources/ai-kb/zh/howto/application/sort.md b/resources/ai-kb/zh/howto/application/sort.md new file mode 100644 index 000000000..9c6e4d067 --- /dev/null +++ b/resources/ai-kb/zh/howto/application/sort.md @@ -0,0 +1,47 @@ +--- +id: application.sort.howto +title: 拖拽排序应用卡片 +type: howto +feature: application +scope: end-user +locale: zh +aliases: + - 应用排序 + - 调整应用顺序 + - 拖动应用 + - 怎么把常用应用放前面 + - 恢复默认应用顺序 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 排序仅对自己生效,不会影响其他成员 + - 不能跨「常用」「管理员」两个分区拖动卡片 + - 不能隐藏卡片,只能改顺序 +last_verified: v1.7.90 +--- + +# 拖拽排序应用卡片 + +## 入口 +- 桌面端 / 移动端:应用中心右上角「⋯」→「调整排序」 +- 进入排序模式后,顶部出现提示条与「取消 / 恢复默认 / 保存」按钮 + +## 操作步骤 +1. 应用中心右上角「⋯」→「调整排序」 +2. 按住任一卡片拖动到目标位置(仅在同分区内移动:常用区或管理员区) +3. 点「保存」提交,或「恢复默认」回到主程序内置顺序 +4. 不想保存就点「取消」或「⋯」→「退出排序」 + +## 数据存储 +- 排序结果保存在 `user_app_sorts` 表的 `sorts` 字段,按用户隔离 +- 数据结构:`{base: [sortKey...], admin: [sortKey...]}`,每个 `sortKey` 形如 `system:approve` 或 `micro:okr` +- 与默认顺序一致时后端会清空记录,避免冗余 + +## 不支持 +- 排序仅本人可见,无法推送给他人 +- 不能在「常用」和「管理员」分区之间拖动 +- 不能隐藏 / 删除卡片,只能改顺序 + +## 想改全员可见的菜单 +管理员可用「自定义应用菜单」追加菜单项,见:[[application.menu-admin.howto]] diff --git a/resources/ai-kb/zh/howto/approve/cc.md b/resources/ai-kb/zh/howto/approve/cc.md new file mode 100644 index 000000000..e03fc05b4 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/cc.md @@ -0,0 +1,46 @@ +--- +id: approve.cc.howto +title: 抄送审批(抄送我 / 抄送他人) +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 抄送我的审批 + - cc 给我的审批 + - 看别人发的审批 + - 怎么抄送给别人 + - 抄送在哪 + - 知会 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 普通用户不能在发起时手动指定抄送人,由所选模板的 notifier 节点决定 + - 抄送人不能审批(同意/拒绝按钮不可见),只能查看和评论 + - 抄送只在流程「到达 notifier 节点」或「整条流程已通过」时实际发送,被拒绝的流程不抄送 +last_verified: v1.7.90 +--- + +# 抄送审批(抄送我 / 抄送他人) + +## 抄送我(接收方) +**入口**:审批中心 → Tab「抄送我」 + +**列表内容**:流程模板里 notifier 节点候选人包含我的审批,无论审批中还是已结束。卡片含模板名、状态 Tag、发起人头像与昵称、提交时间、关键字段摘要。 + +**筛选**:流程分类(全部审批 / 各模板名)、用户名(按发起人模糊搜)、点「搜索」触发。 + +**详情**:点行进入右侧详情;可见所有节点和审批意见,但底部「同意/拒绝」按钮不显示(不是我的任务)。可点「+ 添加评论」补充意见([[approve.comment.howto]])。 + +**接口**:审批中 `approve/process/findProcNotify`;已结束 `approve/procHistory/findProcNotify`。 + +## 抄送他人(怎么让别人收到抄送) +普通用户**无法**在发起表单里指定抄送人。抄送由所选模板的 `notifier` 节点固化,管理员在「流程设置」配模板时挂同事/部门/角色。普通用户只能选用**已包含 notifier 节点**的模板,抄送人会在两个时机收到机器人卡片: +- **启动即抄送**:notifier 放在 starter 之后 +- **通过才抄送**:notifier 放在末节点;被拒绝则不抄送 + +## 不支持 +- 普通用户在发起时无「添加抄送人」字段 +- 抄送卡片仅知会,不会主动催办 diff --git a/resources/ai-kb/zh/howto/approve/comment.md b/resources/ai-kb/zh/howto/approve/comment.md new file mode 100644 index 000000000..d418de5c2 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/comment.md @@ -0,0 +1,58 @@ +--- +id: approve.comment.howto +title: 给审批添加全文评论 +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 审批评论 + - 怎么评论审批 + - 审批留言 + - 添加评论 + - 给审批单加图片 + - 全文评论 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 是该流程的发起人 / 审批人 / 抄送人之一 +negative: + - 评论一经提交不可编辑也不可删除 + - 不支持 @ 提及他人到评论里 + - 不支持回复某条评论形成楼中楼 + - 评论与节点审批意见是两类数据:节点意见跟审批动作绑死,全文评论独立追加 +last_verified: v1.7.90 +--- + +# 给审批添加全文评论 + +## 入口 +- 任意 Tab 进入审批详情 → 底部「+ 添加评论」按钮(任何角色和状态都可见) +- 评论按钮与「同意/拒绝/撤销/删除」并排,处理类按钮按 [[approve.doto.howto]] 条件控制可见 + +## 操作步骤 +1. 点「+ 添加评论」弹出评论窗 +2. **内容**:必填,多行文本 +3. **图片**:可选,最多 3 张(≤ 2048×2048) +4. 点「确认」提交 → 调 `approve/process/addGlobalComment`,列表实时刷新并自动滚到底部新评论 + +## 评论的显示位置 +详情页底部「全文评论」区,按时间顺序展示每条: +- 发表人头像 + 昵称 +- 绝对时间 + 相对时间(如「3 小时前」) +- 文字内容 +- 图片缩略图(点击放大查看) + +## 谁会收到提醒 +- 评论被推送到所有与该流程有关的用户的「审批助手」聊天 +- 推送类型 `approve_comment_notifier`,标题「{评论人} 评论了 {发起人} 的「{模板名}」审批」 +- 不会推给评论者本人 + +## 与节点审批意见的区别 +- **节点审批意见**:审批人点同意/拒绝时填的那行文字,只能写一次,绑定到节点 +- **全文评论**:任何时候、任何相关方都可追加,是独立的对话流,详情页单独一段展示 + +## 不支持 +- 评论不可改、不可删 +- 不支持 @ 别人、不支持回复楼中楼 diff --git a/resources/ai-kb/zh/howto/approve/delete.md b/resources/ai-kb/zh/howto/approve/delete.md new file mode 100644 index 000000000..46c316f51 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/delete.md @@ -0,0 +1,57 @@ +--- +id: approve.delete.howto +title: 删除审批单 +type: howto +feature: approve +scope: admin +locale: zh +aliases: + - 删除审批 + - 删审批单 + - 怎么删一条审批 + - 审批记录怎么清 + - 历史审批能删吗 + - 误发起怎么撤掉 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 当前用户是该审批的**发起人**或系统管理员 + - 该审批已结束(通过 / 拒绝 / 撤回),未结束不可删 +negative: + - 审批中(state=1)的单据不能删除,需要发起人先「撤回」结束再删 + - 普通处理人 / 抄送对象不能删除,即使是分配给自己的单据 + - 删除是物理删除,无回收站,删了找不回 + - 删除单条审批不会触发主程序通知撤回;机器人已推送的「待办」消息仍保留在群聊 +last_verified: v1.7.90 +--- + +# 删除审批单 + +## 入口 +- 桌面端:审批中心 →「已发起」或「已办」Tab → 点开某条审批进详情 → 详情页底部「删除」按钮 +- 仅当满足"已结束 + 发起人或管理员"两个条件时按钮才出现,否则隐藏 + +## 接口 +前端调 `api/approve/process/delById` → 控制器方法 `process__delById`: +- 必传 `proc_inst_id`(流程实例 ID) +- 自动透传 `is_admin` 标记给插件,决定能否绕过"仅发起人可删"的限制 +- 插件侧再校验"已结束"状态,未结束直接拒绝 + +## 操作步骤 +1. 进入要删除的审批详情页 +2. 确认顶部状态显示 `已通过` / `已拒绝` / `已撤回` 任一终态 +3. 点击底部「删除」按钮 +4. 二次确认弹窗 → 确定 +5. 接口返回成功后该单从所有列表(已发起 / 已办 / 抄送)消失 + +## 想删但删不掉的常见原因 +- **审批中**:先点「撤回」让状态变 `已撤回` 再删(发起人专属) +- **不是我发起**:除非你是系统管理员(`userIsAdmin`),否则不能删别人发起的 +- **接口报错"无权限"**:说明插件认为当前 `userid` 不是发起人且 `is_admin=false` + +## 批量删除 +当前版本无批量删除入口,需要逐条删。如需大批量清理某个流程模板下的全部审批数据,可改用 [[approve.template.howto]] 中"删除模板"操作(会同时清空数据)。 + +## 相关 +- 数据导出(删除前留底):[[approve.export.howto]] diff --git a/resources/ai-kb/zh/howto/approve/detail.md b/resources/ai-kb/zh/howto/approve/detail.md new file mode 100644 index 000000000..f87d8ab5d --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/detail.md @@ -0,0 +1,53 @@ +--- +id: approve.detail.howto +title: 审批详情页与流程图 +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 审批详情 + - 看审批流程 + - 审批走到哪了 + - 流程图 + - 审批节点 + - 审批进度 + - 谁审过了 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 自己是发起人 / 审批人 / 抄送人 之一才能进入对应审批的详情 +negative: + - 详情页里不能修改任何表单字段,全部只读 + - 详情不显示其他人的私聊评论,仅显示全局评论 + - 流程图按节点定义渲染,不支持手动调整节点顺序 +last_verified: v1.7.90 +--- + +# 审批详情页与流程图 + +## 入口 +- 任一 Tab(待办/已办/抄送我/已发起)→ 点列表行:宽屏(≥1010 px)右侧分栏;中屏(426-1010)右侧抽屉;窄屏(<426)跳独立路由 `manage-approve-details?id={id}` +- 机器人卡片:在「审批助手」聊天点卡片「查看详情」 + +## 顶部信息 +模板名 + 状态 Tag(青-审批中 / 绿-已通过 / 红-已拒绝/已撤回)、发起人头像和昵称、提交时间。 + +## 表单字段区 +按模板渲染。请假类模板显示:假期类型、开始/结束时间(含周几)、时长(自动算秒/分/小时/天)、事由、图片(≤ 3 张可放大)。 + +## 审批记录(流程图) +Timeline 时间线渲染 `node_infos`,每节点显示类型、操作人头像与昵称、状态、相对/绝对时间。节点类型: +- **提交** starter:绿色,发起人 +- **审批** approver:蓝-审批中 / 绿-已通过 / 红-拒绝或撤回 / 灰-待审批;有意见时显示在引号里 +- **抄送** notifier:完成绿、未到灰,显示「自动抄送 张三、李四 共 2 人」 +- **结束** end:到达后变绿 + +被拒绝/撤回后下游节点自动隐藏。 + +## 全文评论区 +有 `global_comments` 时显示,按时间倒序,每条含头像/昵称/内容/图片/相对时间。详见 [[approve.comment.howto]]。 + +## 操作区 +底部按钮见 [[approve.doto.howto]]。接口:详情 `approve/process/detail`;历史 [[approve.history.concept]]。 diff --git a/resources/ai-kb/zh/howto/approve/doto.md b/resources/ai-kb/zh/howto/approve/doto.md new file mode 100644 index 000000000..521d403ef --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/doto.md @@ -0,0 +1,51 @@ +--- +id: approve.doto.howto +title: 处理审批(同意/拒绝/撤销/删除) +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 怎么同意审批 + - 怎么拒绝审批 + - 审批驳回 + - 撤回自己的审批 + - 撤销申请 + - 删除审批单 + - 怎么处理一条审批 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 不支持「转交他人」:当前版本无转交按钮和接口 + - 不支持「加签」:不能临时增加额外审批人 + - 不支持批量审批;要逐条进详情处理 + - 拒绝必须填审批意见(同意可不填) + - 一旦后续节点审批人已处理,发起人就不能再撤销 + - 删除仅对已结束(通过/拒绝/撤回)的审批可用,审批中不能删 +last_verified: v1.7.90 +--- + +# 处理审批(同意/拒绝/撤销/删除) + +## 入口 +从「待办」「已办」「抄送我」「已发起」任一 Tab 点列表项 → 右侧详情面板底部「审批操作」区。 + +## 四个动作的按钮可见条件 +- **同意 / 拒绝**:当前流程未结束,且我的用户 ID 在 `candidate` 字段里(即轮到我处理) +- **撤销**:我是发起人,且整条流程未结束,且没有任何审批人已点过同意/拒绝 +- **删除**:状态是已通过/已拒绝/已撤回,且我是发起人或管理员 +- **+ 添加评论**:任意状态、任意角色可见,详见 [[approve.comment.howto]] + +## 同意 +点「同意」→ 弹「请输入审批意见」(可不填)→ 确认。调 `approve/task/complete` `pass=true`。推下一节点审批人 + 抄送人;末节点则推「您发起的「X」已通过」给发起人。 + +## 拒绝 +点「拒绝」→ 弹意见框(**必填**,否则提示「请输入审批意见」)→ 确认。调 `approve/task/complete` `pass=false`。流程立即结束,发起人收到拒绝通知。 + +## 撤销(仅发起人) +点「撤销」→ 二次确认。调 `approve/task/withdraw`,state 置 4「已撤回」。撤回提醒推送给已收到卡片的审批人,原卡片改为「已撤回」。 + +## 删除(已结束 + 发起人/管理员) +点「删除」→ 二次确认「删除后不可恢复」。调 `approve/process/delById`,从所有列表移除,不可恢复。 diff --git a/resources/ai-kb/zh/howto/approve/export.md b/resources/ai-kb/zh/howto/approve/export.md new file mode 100644 index 000000000..e2bec9368 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/export.md @@ -0,0 +1,63 @@ +--- +id: approve.export.howto +title: 导出审批数据 +type: howto +feature: approve +scope: admin +locale: zh +aliases: + - 导出审批 + - 审批数据导出 + - 下载审批 Excel + - 审批报表 + - 请假记录导出 + - 审批怎么导出 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 当前用户是系统管理员(普通成员看不到「导出」按钮) +negative: + - 单次导出**最多 35 天**,超过会报「日期范围限制最大35天」需分段导出 + - 必须选择"流程分类"(即流程模板名),不支持一次导全部模板 + - 导出文件为 zip 包内含一个 xlsx,**不支持** CSV / JSON 直接下载 + - 没有数据时会推送「没有任何数据」提示,不会生成空文件 +last_verified: v1.7.90 +--- + +# 导出审批数据 + +## 入口 +- 桌面端:左侧栏「应用」→「审批中心」→ 右上角「导出审批数据」按钮(仅管理员可见) +- 移动端:审批中心右上角图标条同名按钮(同样仅管理员) + +## 接口 +前端调 `api/approve/export`(POST)→ 控制器方法 `export`: +- 必传 `proc_def_name`(流程模板名)+ `date`(`[start, end]` 两个日期) +- 可选 `state`(0 全部 / 1 审批中 / 2 通过 / 3 拒绝 / 4 撤回)+ `is_finished` +- 服务端用 Swoole 协程异步生成,不阻塞请求;接口立即返回 `success` + +## 操作步骤 +1. 弹窗中选择「流程分类」(下拉,来自已发布的流程模板列表) +2. 选「状态」(默认全部) +3. 选「日期范围」(开始 + 结束,≤ 35 天) +4. 点「确定」→ 立即关闭弹窗 +5. 主程序系统机器人在私聊推送「正在导出审批数据,请稍等...」 +6. 协程异步处理完成后,机器人推送一条带下载链接的 `file_download` 模板消息 + +## 导出列(24 列) +申请编号、标题、申请状态、发起时间、完成时间、发起人工号、发起人 User ID、发起人姓名、发起人部门、发起人部门 ID、部门负责人、历史审批人、历史办理人、审批记录、当前处理人、审批节点、审批人数、审批耗时、假期类型、开始时间、结束时间、时长、请假事由、请假单位。 + +## 文件命名与位置 +- 临时存放:`storage/app/temp/approve/export/<年月>/审批记录_<时间戳>.zip` +- 链接形式:`api/approve/down?key=<加密 key>`(带签名,过期失效) + +## 常见报错 +- `日期选择错误`:日期未选或格式错;用日期选择器选 +- `日期范围限制最大35天`:缩短范围分段导出 +- `没有任何数据`:所选模板 + 状态 + 日期范围内无审批单 +- `系统机器人不存在`:联系超级管理员检查机器人初始化(极少见) + +## 相关 +- 模板列表来源:[[approve.template.concept]] +- 单条记录删除:[[approve.delete.howto]] diff --git a/resources/ai-kb/zh/howto/approve/install.md b/resources/ai-kb/zh/howto/approve/install.md new file mode 100644 index 000000000..c2f945542 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/install.md @@ -0,0 +1,56 @@ +--- +id: approve.install.howto +title: 安装审批插件 +type: howto +feature: approve +scope: admin +locale: zh +aliases: + - 怎么装审批 + - 启用审批中心 + - 审批怎么开 + - 在哪开启审批 + - 安装 approve 插件 + - 审批中心没有怎么办 +related_tools: [] +related_pages: [application] +prerequisites: + - 当前用户是系统管理员(userIsAdmin) + - 服务器能拉取 `kuaifan/dooapprove` Docker 镜像 +negative: + - 普通成员看不到「应用市场」入口,无法自行安装 + - 安装包约 25MB,下载较慢,必须看「安装日志」判断进度,不能凭感觉重试 + - 卸载时勾选「删除数据」会清空全部审批历史,且不可恢复 +last_verified: v1.7.90 +--- + +# 安装审批插件 + +## 入口 +- 桌面端:左侧栏「应用」→ 右上角「应用市场」→ 顶部分类「插件」→ 找到「审批中心」 + +## 操作步骤 +1. 在应用市场卡片上点击「安装」 +2. 弹窗确认参数(默认 `DEMO_DATA: "true"` 会随安装写入一份演示流程模板,正式环境可改 `false`) +3. 点「确定」开始安装,主程序会创建一个 docker-compose 服务并拉起容器 +4. 安装过程中打开「安装日志」面板查看拉镜像进度(约 25MB) +5. 状态变为 `installed` 后,左侧栏「应用」会自动出现「审批中心」入口 + +## 启用后默认行为 +- 自动注册路由 `api/approve/*`,主程序 `ApproveController` 开始可用 +- 自动注册 nginx 反代 `/approve/`,把 iframe 内的流程模板编辑页透传给插件容器 +- 若 `DEMO_DATA: "true"`:随安装写入「请假申请」等演示流程模板,方便上线测试 +- 在主程序数据库里创建 `<前缀>approve_*` 表前缀的工作流表(不与主程序业务表混库) + +## 卸载/重装 +- 应用市场 → 已安装 →「卸载」 +- 弹窗有「同时删除数据」勾选:勾上则连同 `<前缀>approve_*` 表一并 drop;不勾则保留数据下次安装时自动接上 +- 仅升级版本走「更新」按钮,不会触发数据清理 + +## 不支持 +- 没有「试用」/「禁用」中间态:要么 `installed` 要么 `uninstalled` +- 不能同时存在新旧两个版本 + +## 相关 +- 插件架构与数据隔离原理:[[approve.plugin.concept]] +- 入口与四个 Tab 的常规用法:[[app-system.approve.howto]] diff --git a/resources/ai-kb/zh/howto/approve/my-start.md b/resources/ai-kb/zh/howto/approve/my-start.md new file mode 100644 index 000000000..88ed43f2d --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/my-start.md @@ -0,0 +1,49 @@ +--- +id: approve.my-start.howto +title: 查看我发起的审批 +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 我发起的审批 + - 我提交的审批 + - 已发起列表 + - 查我的审批 + - 我提的请假到哪了 + - 看我自己的申请 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 +negative: + - 不能在此列表里改字段,提交后表单只读 + - 只能撤回未结束的审批;已通过/拒绝/撤回的只能删除或追加评论 + - 列表只显示自己发起的;要看别人发起的需要去「待办」「已办」或「抄送我」 +last_verified: v1.7.90 +--- + +# 查看我发起的审批 + +## 入口 +- 桌面端 / 移动端:审批中心 → Tab「已发起」 + +## 筛选条件 +列表上方四个控件,任改其一即触发刷新: +- **流程分类**:全部审批 / 各模板名(如「请假申请」「报销申请」) +- **状态**:全部 / 审批中 / 已通过 / 已拒绝 / 已撤回 +- **用户名**:按发起人模糊搜索(自己发的也可以搜,多用于管理员视角,普通用户一般留空) +- 「搜索」按钮触发查询 + +## 列表项显示 +每行卡片显示:模板名、状态 Tag(颜色对应:青-审批中、绿-通过、红-拒绝/撤回)、提交时间、发起人头像与昵称、事由摘要。点击进入右侧详情。 + +## 详情与操作 +- 详情结构与处理面板见 [[approve.detail.howto]] +- 状态为「审批中」且自己是发起人:右下角有「撤销」按钮(前提是后续审批人均未行动) +- 状态为「已通过/已拒绝/已撤回」:可见「删除」按钮(仅发起人或管理员) +- 任何状态均可点「+ 添加评论」追加 [[approve.comment.howto]] + +## 接口 +- 入口列表:`approve/process/startByMyselfAll`(按筛选) +- 旧版仅审批中:`approve/process/startByMyself` diff --git a/resources/ai-kb/zh/howto/approve/my-todo.md b/resources/ai-kb/zh/howto/approve/my-todo.md new file mode 100644 index 000000000..f55df5b13 --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/my-todo.md @@ -0,0 +1,57 @@ +--- +id: approve.my-todo.howto +title: 待我审批列表 +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 待我审批 + - 待办审批 + - 需要我审批的 + - 我要审批什么 + - 找我审批的列表 + - 有多少待办 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 已被某流程模板的审批人节点包含到候选人列表 +negative: + - 待办只显示当前轮到自己处理的,未到节点的不会出现 + - 已处理的不会留在待办,会转到「已办」 + - 列表无法批量同意/拒绝,需要逐条进详情处理 +last_verified: v1.7.90 +--- + +# 待我审批列表 + +## 入口 +- 桌面端 / 移动端:审批中心 → Tab「待办」 +- Tab 名旁有未读数量徽标(如「待办(5)」),数字来自 `approve/process/doto`,由 WebSocket `approve/unread` 推送实时刷新 + +## 列表内容 +显示当前候选人字段(`candidate`)包含我,且流程未结束的审批: +- 模板名 + 状态 Tag「审批中」 +- 发起人头像与昵称 +- 提交时间 +- 关键字段摘要(如开始/结束时间、事由) + +## 筛选条件 +列表上方: +- **流程分类**:全部审批 / 各模板名 +- **用户名**:按发起人模糊搜 +- 点「搜索」或回车触发刷新 + +## 处理流程 +1. 点列表任一项 → 右侧打开详情面板(窄屏抽屉打开) +2. 详情底部出现「同意」「拒绝」「+ 添加评论」按钮(按钮可见性见 [[approve.doto.howto]]) +3. 处理完该条从列表消失,未读数 -1,下一审批人收到推送 + +## 移动端 +- 屏宽 < 426 px 时点列表会通过事件 `approveDetails` 跳到独立详情路由 +- 屏宽 < 1010 px 时详情以右侧抽屉打开,不分屏 + +## 接口 +- 列表:`approve/process/findTask` +- 数量:`approve/process/doto` diff --git a/resources/ai-kb/zh/howto/approve/start.md b/resources/ai-kb/zh/howto/approve/start.md new file mode 100644 index 000000000..2789b6a7e --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/start.md @@ -0,0 +1,55 @@ +--- +id: approve.start.howto +title: 发起审批 +type: howto +feature: approve +scope: end-user +locale: zh +aliases: + - 怎么发起审批 + - 提交审批 + - 申请请假 + - 报销怎么提 + - 新建审批单 + - 加申请 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 管理员已配置至少一个审批流程模板 + - 当前账号已分配到部门(无部门时无法选择申请发起部门) +negative: + - 用户不能自定义审批人,审批人由所选模板的节点配置决定 + - 不能新建模板,只能选用管理员已配置的模板 + - 提交后不能改字段;只能撤回或等审批结束([[approve.process-inst.concept]]) + - 不支持定时延后提交、不支持草稿保存 +last_verified: v1.7.90 +--- + +# 发起审批 + +## 入口 +- 桌面端:左侧栏「应用」→「审批」→ 页面右上角「+ 添加申请」按钮(窄屏显示为圆形「+」图标) +- 移动端:底部 Tabbar「应用」→「审批」→ 右上角「+」 + +## 操作步骤 +1. 点击「+ 添加申请」打开弹窗 +2. **选择部门**:当账号属于多个部门时显示,单部门自动选中 +3. **申请类型**:从模板下拉选(如「请假申请」「报销申请」),可选项由管理员预置 +4. **假期类型**(仅请假类模板显示):年假/事假/病假/调休/产假/陪产假/婚假/丧假/哺乳假/产检假/其他 +5. **开始时间 / 结束时间**:日期 + 小时(0-23)+ 分钟(00 或 30) +6. **事由**:必填,多行文本 +7. **图片**:可选,最多 3 张(最大 2048×2048) +8. 点「确认」提交 + +## 提交后的行为 +- 系统按模板自动派任务给第一节点的审批人 +- 「审批助手」机器人向每个审批人推 1 条卡片消息:「{发起人} 提交的「{模板名}」待你审批」 +- 抄送节点上的人也会同时收到知会卡片 +- 自动跳到「已发起」Tab,置顶你这条 +- 调用接口 `approve/process/start` + +## 不支持 +- 申请类型不能由用户临时新建,必须用管理员配好的模板 +- 不能在发起时手动指定审批人,节点由模板决定 +- 不能保存草稿,关弹窗即丢失填写内容 diff --git a/resources/ai-kb/zh/howto/approve/template.md b/resources/ai-kb/zh/howto/approve/template.md new file mode 100644 index 000000000..d54a3365c --- /dev/null +++ b/resources/ai-kb/zh/howto/approve/template.md @@ -0,0 +1,60 @@ +--- +id: approve.template.howto +title: 创建与管理流程模板 +type: howto +feature: approve +scope: admin +locale: zh +aliases: + - 怎么建审批流程 + - 新建审批模板 + - 配置请假流程 + - 添加流程 + - 修改审批流程 + - 流程设置在哪 + - 流程编辑器 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 当前用户是系统管理员(userIsAdmin) +negative: + - 只有管理员能进入流程设置,普通成员看不到「流程设置」按钮 + - 同名流程不允许重复创建,新建时会校验 + - 旧实例不随模板改动回滚:发布新版本只影响新发起的审批,已在跑的按旧版本走完 +last_verified: v1.7.90 +--- + +# 创建与管理流程模板 + +## 入口 +- 桌面端:左侧栏「应用」→「审批中心」→ 右上角「流程设置」按钮 +- 进入设置页后看到所有已建模板卡片 + 一个「+」加号卡片 + +## 新建模板 +1. 点击「+」卡片 → 弹窗输入流程名称(必填,作为「申请类型」给发起人选) +2. 点「确定」打开右侧抽屉式流程编辑器(iframe 内,宽度约 1200px) +3. 在编辑器中拖拽配置审批节点:发起 → 审批人 → 抄送 → 结束,参考 [[approve.node.concept]] +4. 在编辑器中设计表单字段(文本、日期、选择、附件、明细等),参考 [[approve.form.concept]] +5. 点编辑器内「保存并发布」按钮 → 弹窗关闭,提示「发布成功」 +6. 列表中出现新卡片,标记「已发布」,普通成员立即可在「添加申请」处选择 + +## 编辑已有模板 +1. 在卡片列表点击对应模板卡片 → 抽屉打开同一个编辑器,载入当前版本 +2. 修改节点 / 表单字段 +3. 点「保存并发布」→ 版本号 +1 +4. 进行中的旧实例不受影响,按各自当时的版本继续;新发起的走新版本 + +## 删除模板 +1. 卡片右下角小垃圾桶图标 +2. 二次确认「将会清空流程数据,此操作不可恢复」 +3. 确认后调 `approve/procdef/del` 删除模板及所有相关审批数据 + +## 不支持 +- 草稿暂存不可见:编辑器只在点击「保存并发布」时落库,关掉抽屉不点保存内容会丢失 +- 同名流程不允许重复创建 +- 流程编辑器内的能力(如条件分支)受插件版本限制;当前版本不支持表单条件路由,需要按条件分流时应拆成多个流程模板供发起人选择 + +## 相关 +- 模板概念详解:[[approve.template.concept]] +- 节点类型说明:[[approve.node.concept]] diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/.gitkeep b/resources/ai-kb/zh/howto/apps/admin-apps/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/checkin-setting.md b/resources/ai-kb/zh/howto/apps/admin-apps/checkin-setting.md new file mode 100644 index 000000000..aae4dc036 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/checkin-setting.md @@ -0,0 +1,47 @@ +--- +id: app-admin.checkin-setting.howto +title: 签到规则配置入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 签到设置在哪 + - 签到规则配置 + - 打卡规则 + - 配置考勤 + - 修改签到时间 + - 添加 wifi 签到 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 签到「记录查看」对所有用户开放,但「设置」入口仅管理员 + - 签到规则改完立即生效,不回填历史记录 +last_verified: v1.7.90 +--- + +# 签到规则配置入口 + +## 是什么 +签到规则配置(签到设置)让管理员设定考勤时段、wifi / 位置范围、人脸识别开关、打卡提醒等。属于管理员功能,但入口被嵌在面向全员的「签到打卡」抽屉里。 + +## 入口 +- 桌面端:左侧栏「应用」→「常用」分区 →「签到打卡」卡片 → 抽屉右上角「签到设置」链接 +- 移动端竖屏:底部 Tabbar「应用」→「签到打卡」→ 抽屉右上角「签到设置」 +- 「签到设置」链接仅 `userIsAdmin = true` 时显示 + +## 设置抽屉内能做什么 +- 设定上下班签到时段(多组班次) +- 配置 wifi 名 / Mac 地址 / GPS 范围 +- 启用人脸识别(依赖 face 插件) +- 配置提醒推送时间 +- 是否允许补卡、是否计算迟到 / 早退 + +## 详细规则 +签到具体规则字段、wifi/face 实现、补卡流程见 checkin feature 的 chunk(已有 [[checkin.setting.howto]] 等)。 + +## 不支持 +- 不支持按部门设置不同班次规则,全员同一套 +- 不支持自助修改打卡记录(仅管理员可补卡) diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/email.md b/resources/ai-kb/zh/howto/apps/admin-apps/email.md new file mode 100644 index 000000000..c69cf9be7 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/email.md @@ -0,0 +1,46 @@ +--- +id: app-admin.email.howto +title: 邮件通知入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 邮件通知怎么打开 + - SMTP 设置 + - 系统邮件 + - 通知邮件 + - 配置 SMTP +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 邮件通知关闭后任务 / 审批等业务邮件不发,但站内消息正常 + - 不支持每个用户单独换 SMTP 服务器,所有发件走同一组配置 +last_verified: v1.7.90 +--- + +# 邮件通知入口 + +## 是什么 +邮件通知应用让管理员配置 DooTask 的发件 SMTP 服务器(用于注册验证、任务通知、审批提醒等系统邮件),并控制哪些事件触发邮件。属于管理员应用。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「邮件通知」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「邮件通知」 +- 点击后右侧弹出 700 宽的「邮件通知」抽屉 + +## 抽屉内能做什么 +- 配置发件人邮箱、SMTP 地址、端口、加密方式(SSL / TLS / 无) +- 配置 SMTP 账号 / 授权码 +- 测试邮件发送(输入收件人 → 发送测试邮件) +- 选择哪些事件发邮件(注册验证、任务变更、审批提醒等) +- 开启 / 关闭整体邮件通知开关 + +## 详细配置 +SMTP 参数说明与各邮件模板由 email-notice feature 的 chunk 覆盖(后续起草)。 + +## 不支持 +- 不支持自定义邮件模板 HTML(模板内置) +- 不支持按部门 / 角色细粒度筛选收件人 diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/export.md b/resources/ai-kb/zh/howto/apps/admin-apps/export.md new file mode 100644 index 000000000..5fba1668c --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/export.md @@ -0,0 +1,50 @@ +--- +id: app-admin.export.howto +title: 数据导出入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 数据导出怎么打开 + - 导出任务数据 + - 导出审批数据 + - 导出签到数据 + - 导出超期任务 + - 后台导出 Excel +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 数据导出是异步任务,大数据集会在后台跑,需要在「导出记录」里下载结果 + - 当前导出范围限主程序四大类数据,插件数据不在内 +last_verified: v1.7.90 +--- + +# 数据导出入口 + +## 是什么 +数据导出让管理员把系统内的任务、审批、签到等运营数据打包成 Excel/CSV 下载,常用于汇报、归档、二次分析。属于管理员应用,普通成员看不到。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「数据导出」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「数据导出」 +- 点击卡片后弹出下拉菜单(不弹抽屉),先选导出类型 + +## 4 种导出类型 +- **导出任务统计**:选定项目 / 时间范围的任务汇总 +- **导出超期任务**:所有超期未完成的任务 +- **导出审批数据**:审批申请与处理记录(需 approve 插件) +- **导出签到数据**:考勤打卡明细(需 face 插件或常规签到已用) + +## 触发后 +- 进入导出参数对话框,选时间范围 / 筛选条件 +- 提交后在后台跑导出任务,可在导出管理列表查看进度并下载结果 + +## 详细参数 +各类型支持的筛选字段、列定义见 data-export feature 的 chunk(详细 chunk 后续起草)。 + +## 不支持 +- 不支持把多类型一次合并导出(须分别导出) +- 不支持自定义列(导出列固定) diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/ldap.md b/resources/ai-kb/zh/howto/apps/admin-apps/ldap.md new file mode 100644 index 000000000..677afdc3f --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/ldap.md @@ -0,0 +1,46 @@ +--- +id: app-admin.ldap.howto +title: LDAP 应用入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - LDAP 在哪 + - LDAP 设置怎么打开 + - 域账号同步 + - 接入 AD + - 第三方账号集成 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - LDAP 配置错误不会回滚,须在保存前自行核对 + - 单次同步用户上限以 LDAP 服务端策略为准,不在 DooTask 设置 +last_verified: v1.7.90 +--- + +# LDAP 应用入口 + +## 是什么 +LDAP 应用让管理员配置 AD / OpenLDAP / 通用 LDAP 目录服务,把域账号同步成 DooTask 用户,支持 LDAP 登录。属于管理员应用,普通成员看不到入口。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「LDAP」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「LDAP」 +- 点击后右侧弹出 700 宽的「LDAP 设置」抽屉 + +## 抽屉内能做什么 +- 配置 LDAP 服务器地址、端口、绑定 DN、密码 +- 设置用户搜索基准 DN 与过滤器 +- 设置属性映射(uid / mail / displayName 等 → DooTask 字段) +- 启用 / 关闭 LDAP 登录开关 +- 手动触发一次全量同步、查看同步日志 + +## 详细配置 +LDAP 各字段含义、测试连接步骤见 ldap feature 的 chunk(后续起草)。 + +## 不支持 +- 不支持多 LDAP 源并存(同一时间只能一组配置) +- 同步只新增 / 更新用户,不会删除已离职的域账号;需手动清理 diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/meeting-mgmt.md b/resources/ai-kb/zh/howto/apps/admin-apps/meeting-mgmt.md new file mode 100644 index 000000000..22909ba9c --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/meeting-mgmt.md @@ -0,0 +1,46 @@ +--- +id: app-admin.meeting-mgmt.howto +title: 会议管理入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 会议管理在哪 + - 会议设置 + - 全员会议记录 + - 视频会议配置 + - 修改会议参数 + - 后台会议入口 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 会议管理仅管理员可见;普通用户只能看自己加入的会议 + - 配置改动只对新会议生效,已开的会议沿用旧参数 +last_verified: v1.7.90 +--- + +# 会议管理入口 + +## 是什么 +会议管理让管理员配置在线会议参数(媒体服务器、录屏、入会权限)并查看全员会议汇总。普通用户在同一卡片只看自己相关的会议列表,管理动作隐藏。属于管理员功能,入口嵌在面向全员的「在线会议」抽屉里。 + +## 入口 +- 桌面端:左侧栏「应用」→「常用」分区 →「在线会议」卡片 → 抽屉右上角「会议设置」链接 +- 移动端竖屏:底部 Tabbar「应用」→「在线会议」→ 抽屉右上角「会议设置」 +- 「会议设置」链接仅 `userIsAdmin = true` 时显示 + +## 设置抽屉内能做什么 +- 选择媒体服务(自部署 / 第三方) +- 配置最大入会人数 / 默认录屏开关 +- 设置游客(tourist)入会策略:允许 / 仅成员 / 关闭 +- 配置会议保留期限(过期自动清理录像与聊天) + +## 详细参数 +会议字段、游客模式、邀请链接见 meeting feature 的 chunk(已有 [[meeting.tourist.concept]] 等)。 + +## 不支持 +- 不支持按部门 / 角色独立会议策略 +- 不支持手工把已结束会议「重新开启」(须新建) diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/push.md b/resources/ai-kb/zh/howto/apps/admin-apps/push.md new file mode 100644 index 000000000..e5788b748 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/push.md @@ -0,0 +1,47 @@ +--- +id: app-admin.push.howto +title: APP 推送入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - APP 推送怎么打开 + - 手机推送配置 + - UMENG 设置 + - 移动端推送 + - 友盟推送 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 需要已申请的友盟(UMENG)账号与 App Key/Secret +negative: + - 推送仅作用于 DooTask 官方移动 App(iOS / Android),不支持 Web 端 + - 推送依赖友盟服务可达,私有化网络隔离环境下需自行评估可用性 + - 不支持改用其他推送服务商(如极光 / 个推) +last_verified: v1.7.90 +--- + +# APP 推送入口 + +## 是什么 +APP 推送应用让管理员配置移动端的推送服务(基于友盟 UMENG),用于消息、任务、审批等场景在 App 关闭时弹通知。属于管理员应用。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「APP 推送」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「APP 推送」 +- 点击后右侧弹出 700 宽的「APP 推送」抽屉 + +## 抽屉内能做什么 +- 填入 iOS 与 Android 各自的 UMENG App Key / App Master Secret +- 启用 / 关闭整体推送开关 +- 选择哪些事件触发推送(新消息、任务分配、审批待办等) +- 测试推送(向当前管理员的 App 发送一条) + +## 详细配置 +UMENG 字段含义、各事件推送格式由 push-notice feature 的 chunk 覆盖(后续起草)。 + +## 不支持 +- 关闭推送后用户端会立即停止收到通知,无延迟回调 +- 不支持自定义推送声音 / 图标,全部走 App 默认 diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/report.md b/resources/ai-kb/zh/howto/apps/admin-apps/report.md new file mode 100644 index 000000000..74b489e3c --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/report.md @@ -0,0 +1,44 @@ +--- +id: app-admin.report.howto +title: 举报管理入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 举报管理在哪 + - 怎么看举报 + - 谁被举报了 + - 用户举报 + - 内容举报记录 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 举报记录无法物理删除,只能标记处理状态 + - 不支持举报匿名化设置(举报人始终对管理员可见) +last_verified: v1.7.90 +--- + +# 举报管理入口 + +## 是什么 +举报管理用于查看与处理用户对消息、用户、内容的举报记录。普通用户通过消息长按 →「举报」生成记录,管理员在此审查并标记处理状态。属于管理员应用。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「举报管理」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「举报管理」 +- 点击后右侧弹出抽屉,列出所有举报记录 + +## 抽屉内能做什么 +- 按时间倒序查看全部举报:举报人、被举报对象、举报理由、附带消息上下文 +- 标记「已处理」/「驳回」并填写处理说明 +- 查看举报详情中的引用消息原文 + +## 详细配置 +举报字段、处理规则与隐藏策略由 abuse-report feature 的 chunk 覆盖(后续起草)。 + +## 不支持 +- 不支持批量处理举报记录(须逐条标记) +- 不支持自动审核规则(无 AI 预筛选) diff --git a/resources/ai-kb/zh/howto/apps/admin-apps/team.md b/resources/ai-kb/zh/howto/apps/admin-apps/team.md new file mode 100644 index 000000000..4a5e6ff7a --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/admin-apps/team.md @@ -0,0 +1,46 @@ +--- +id: app-admin.team.howto +title: 团队管理入口 +type: howto +feature: app-admin +scope: admin +locale: zh +aliases: + - 团队管理在哪 + - 成员管理入口 + - 部门管理入口 + - 邀请新成员 + - 怎么加用户 + - 加同事 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 团队管理是页面跳转,不是抽屉 + - 普通成员看不到「团队管理」卡片,只能在「联系人」/「部门」浏览不带管理动作的视图 +last_verified: v1.7.90 +--- + +# 团队管理入口 + +## 是什么 +团队管理是 DooTask 唯一集中处理「成员 + 部门 + 邀请」的管理员页面,包含全员列表、部门树编辑、邀请链接 / 邀请码生成。属于管理员应用。 + +## 入口 +- 桌面端:左侧栏「应用」→ 下方「管理员」分区 →「团队管理」卡片 +- 移动端竖屏:底部 Tabbar「应用」→「管理员」分区 →「团队管理」 +- 点击后跳转独立页面(非抽屉) + +## 页面内三大块 +- **成员列表**:搜索 / 筛选 / 增删用户、改身份(管理员 / 部门负责人 / 临时帐号)、改部门、重置密码、禁用 / 启用 +- **部门管理**:创建 / 重命名 / 删除部门,拖拽调整树结构、设置部门负责人 +- **邀请加入**:生成邀请链接或邀请码(受系统设置「允许注册」开关影响) + +## 详细操作 +成员字段、部门规则、邀请策略由 org-department feature 的 chunk 覆盖(后续起草)。 + +## 不支持 +- 不支持批量改成员部门(只能逐个改或用导入) +- 不能直接删除还有成员的部门:必须先把部门下成员转移走,否则报错 +- 不支持把成员同时挂在 2 个部门下(每人最多 1 个主部门) diff --git a/resources/ai-kb/zh/howto/apps/micro-apps/.gitkeep b/resources/ai-kb/zh/howto/apps/micro-apps/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/howto/apps/system-apps/.gitkeep b/resources/ai-kb/zh/howto/apps/system-apps/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/howto/apps/system-apps/add-task.md b/resources/ai-kb/zh/howto/apps/system-apps/add-task.md new file mode 100644 index 000000000..76624fbe0 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/add-task.md @@ -0,0 +1,45 @@ +--- +id: app-system.add-task.howto +title: 添加任务入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 添加任务入口 + - 应用中心建任务 + - 跨项目建任务 + - addTask 入口 + - 快速新建任务 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 必须在创建时选择目标项目,不能"无归属"建任务 + - 此入口走完整创建对话框,不是单字段快速建 +last_verified: v1.7.90 +--- + +# 添加任务入口 + +## 是什么 +应用中心「添加任务」卡片对应 `addTask` 系统应用,是跨项目快速建任务的统一入口。点击后弹出「添加任务」对话框,先选目标项目 / 列表再填字段。 + +## 入口 +- 桌面端:左侧导航「应用」→「添加任务」卡片 +- 移动端:底部 Tabbar「应用」→「添加任务」 +- 等效入口:全局右上角「+」→「添加任务」 + +## 操作步骤 +1. 应用中心 → 点「添加任务」 +2. 弹出对话框,先选目标项目 → 再选列(看板列) +3. 填任务标题、负责人、截止时间、优先级等 +4. 提交后任务进入所选项目的所选列 + +## 与"项目内快速建"的区别 +- 应用中心入口:必须先选项目,适合不在某个项目页面时使用 +- 项目内入口:默认归属当前项目,更适合一连串地加任务 + +## 不支持 +- 不能批量一次建多条任务(每次只建一条) +- 不能创建"暂不归属任何项目"的临时任务 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/approve.md b/resources/ai-kb/zh/howto/apps/system-apps/approve.md new file mode 100644 index 000000000..8edb768e2 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/approve.md @@ -0,0 +1,56 @@ +--- +id: app-system.approve.howto +title: 审批中心怎么用 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 审批 + - 走流程 + - 请假怎么办 + - 报销怎么提 + - 审批在哪 + - 怎么发起审批 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 管理员已配置至少一个审批流程模板 +negative: + - 当前版本审批流不支持条件分支(按条件路由到不同审批人),只能串行/并行 + - 不支持嵌套子审批 + - 审批表单暂不支持公式计算字段 +last_verified: v1.7.90 +--- + +# 审批中心怎么用 + +## 是什么 +审批中心是 DooTask 用于发起、处理、查看公司内部流程审批的内置应用。常见场景:请假、出差、报销、合同审批、用印申请、采购等。由 approve 插件提供。 + +## 入口 +- 桌面端:左侧栏「应用」→「审批」卡片 +- 移动端:底部 Tabbar「应用」→「审批」 + +## 发起审批 +1. 进入审批中心 → 右上角「+ 新建」 +2. 选择流程类型(如「请假申请」) +3. 填写表单字段 +4. 指定审批人(多人时按管理员配置的顺序串行 / 并行) +5. 提交 + +## 处理审批 +- 左侧标签栏「待我审批」可看到分配给我的审批 +- 点开一条 → 同意 / 驳回 / 转交他人 / 加签 +- 处理后该条进入「我已处理」列表 + +## 查看进度 +- 「我的发起」列表 → 点击任一审批单 → 流程图视图显示已通过 / 待处理 / 已驳回节点 + +## 抄送 +- 「抄送我的」标签栏汇总所有抄送给当前用户的审批,不需要操作但可见详情 + +## 相关 +- 流程模板配置(仅管理员):见管理员应用「审批配置」(详细 chunk 后续起草) +- 数据导出:见管理员应用「数据导出 - 审批」(详细 chunk 后续起草) diff --git a/resources/ai-kb/zh/howto/apps/system-apps/bot.md b/resources/ai-kb/zh/howto/apps/system-apps/bot.md new file mode 100644 index 000000000..384c4684d --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/bot.md @@ -0,0 +1,51 @@ +--- +id: app-system.bot.howto +title: 我的机器人入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 机器人在哪 + - 我的机器人 + - 自定义机器人 + - webhook 机器人 + - 创建机器人入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 系统内置机器人(如签到机器人)不能在此处删除,只能修改部分字段 + - Webhook 事件订阅仅限主程序内置的几类,不可自定义事件名 +last_verified: v1.7.90 +--- + +# 我的机器人入口 + +## 是什么 +应用中心「我的机器人」卡片对应 `mybot` 系统应用,用于查看、新建、修改、删除自建的消息机器人,可配置头像 / 名称 / 消息保留天数 / Webhook URL / Webhook 事件订阅。 + +## 入口 +- 桌面端:左侧导航「应用」→「我的机器人」卡片 +- 移动端:底部 Tabbar「应用」→「我的机器人」 +- 抽屉右上角「添加机器人」可新建 + +## 操作步骤 +1. 应用中心 → 点「我的机器人」 +2. 抽屉显示当前用户创建的机器人列表(无则提示「您没有创建机器人」) +3. 操作每条机器人: + - 「开始聊天」打开与机器人的私聊 + - 「修改」编辑基本信息和 Webhook 配置 + - 「删除」需输入备注原因(系统内置机器人不可删) + +## 字段说明 +| 字段 | 说明 | +|---|---| +| 名称 | ≤ 20 字符 | +| 消息保留 | 单位天,默认 90 天 | +| Webhook URL | 收到机器人对话消息时回调的地址(最长 255 字符) | +| Webhook 事件 | 勾选要订阅的事件类型 | + +## 不支持 +- 系统机器人显示「正在修改系统机器人」红色提示,只能改有限字段 +- 一个机器人只能绑定一个 Webhook URL diff --git a/resources/ai-kb/zh/howto/apps/system-apps/checkin.md b/resources/ai-kb/zh/howto/apps/system-apps/checkin.md new file mode 100644 index 000000000..509586d03 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/checkin.md @@ -0,0 +1,46 @@ +--- +id: app-system.checkin.howto +title: 签到打卡入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 签到入口 + - 怎么打卡 + - 上下班打卡在哪 + - 签到应用 + - 打卡卡片 +related_tools: [] +related_pages: [application] +prerequisites: + - 管理员已开启签到设置(否则点开是空白) +negative: + - 不在应用中心配置打卡规则,规则在「签到设置」由管理员维护 + - 人脸打卡能力依赖 face 插件已安装 +last_verified: v1.7.90 +--- + +# 签到打卡入口 + +## 是什么 +应用中心「签到打卡」卡片对应 `signin` 系统应用,是日常上下班签到的常规入口。点击后弹出右侧抽屉显示当日签到状态、历史记录、补卡按钮等。 + +## 入口 +- 桌面端:左侧导航「应用」→「签到打卡」卡片 +- 移动端:底部 Tabbar「应用」→「签到打卡」 +- 管理员可在签到抽屉右上角看到「签到设置」入口(普通成员看不到) + +## 操作步骤 +1. 进应用中心 → 点「签到打卡」 +2. 抽屉弹出后看当日签到状态与按钮(如「上班打卡」「下班打卡」) +3. 按提示完成打卡(常规 / WiFi / 人脸视规则) +4. 历史 / 补卡入口在同一抽屉内 + +## 不支持 +- 普通成员看不到「签到设置」入口 +- 没有插件支撑的人脸场景会降级为常规打卡 +- 应用中心卡片不会显示当日是否打卡的角标 + +## 详细规则 / 失败处理 +签到打卡的功能细节(规则、补卡、迟到判定等)由独立 feature 维护,本卡片只承担入口指引职责。 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/create-group.md b/resources/ai-kb/zh/howto/apps/system-apps/create-group.md new file mode 100644 index 000000000..439f752b8 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/create-group.md @@ -0,0 +1,42 @@ +--- +id: app-system.create-group.howto +title: 创建群组应用入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 创建群组卡片 + - 应用中心建群 + - 怎么从应用中心建群 + - createGroup 入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 此入口只是触发建群对话框,不是另一个独立的建群流程 + - 不支持「按部门一键拉群」的预设 +last_verified: v1.7.90 +--- + +# 创建群组应用入口 + +## 是什么 +应用中心「创建群组」卡片对应 `createGroup` 系统应用,点击后等价于在消息模块按「+」→「创建群组」,是常用的快速建群入口之一。 + +## 入口 +- 桌面端:左侧导航「应用」→「创建群组」卡片 +- 移动端:底部 Tabbar「应用」→「创建群组」 +- 等效入口:消息模块顶部「+」、全局右上角「+」均能触发同一对话框 + +## 操作步骤 +1. 应用中心 → 点「创建群组」 +2. 弹出「创建群组」对话框 +3. 输入群名 → 勾选成员 → 提交,自动进入新群 + +## 不支持 +- 此卡片不带"项目讨论组"等预设模板,只是普通建群 +- 单群人数不能超过系统设置上限(默认 200,可由管理员调整) + +## 想了解完整建群流程 +建群完整步骤、字段、群机器人见:[[messenger.group.howto.create]] diff --git a/resources/ai-kb/zh/howto/apps/system-apps/create-project.md b/resources/ai-kb/zh/howto/apps/system-apps/create-project.md new file mode 100644 index 000000000..130d18c98 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/create-project.md @@ -0,0 +1,42 @@ +--- +id: app-system.create-project.howto +title: 创建项目入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 创建项目入口 + - 新建项目卡片 + - 应用中心建项目 + - addProject 入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 仅打开创建项目对话框,不是单独的项目创建流程 + - 不会按当前部门 / 团队预填项目成员 +last_verified: v1.7.90 +--- + +# 创建项目入口 + +## 是什么 +应用中心「创建项目」卡片对应 `addProject` 系统应用,点击后等价于在项目列表里点「+」新建项目,是最常用的"快速从应用中心起一个项目"入口。 + +## 入口 +- 桌面端:左侧导航「应用」→「创建项目」卡片 +- 移动端:底部 Tabbar「应用」→「创建项目」 +- 等效入口:项目列表顶部「+」、全局右上角「+」 + +## 操作步骤 +1. 应用中心 → 点「创建项目」 +2. 弹出「创建项目」对话框 +3. 输入项目名 → 选模板 / 工作流 / 成员 → 提交,自动进入项目主页 + +## 不支持 +- 没有"从已有项目复制"的快捷选项,需进项目内"复制项目" +- 创建面板里不能直接改成员 / 工作流,创建后要进项目设置调整 + +## 详细创建流程 +项目创建的字段、工作流、模板等细节由独立 feature 维护,本 chunk 只承担入口指引职责。 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/export.md b/resources/ai-kb/zh/howto/apps/system-apps/export.md new file mode 100644 index 000000000..009fdef33 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/export.md @@ -0,0 +1,56 @@ +--- +id: app-system.export.howto +title: 导出管理入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 导出在哪 + - 导出管理 + - 导出任务 + - 导出审批 + - 导出签到 + - exportManage 入口 +related_tools: [] +related_pages: [application] +prerequisites: + - 涉及全局数据的导出(如审批数据)会再校验管理员权限 +negative: + - 卡片只是导出动作的快捷入口,不是导出历史查看页 + - 没有按项目精细筛选的二级菜单,按"类型"分类 +last_verified: v1.7.90 +--- + +# 导出管理入口 + +## 是什么 +应用中心「导出管理」卡片对应 `exportManage` 系统应用,点击后弹出二级菜单提供四种常用导出动作。每种动作内部再走对应的导出流程(生成文件 / 触发下载 / 进异步队列)。 + +## 入口 +- 桌面端:左侧导航「应用」→「导出管理」卡片 +- 移动端:底部 Tabbar「应用」→「导出管理」 + +## 二级菜单 +点击卡片后弹出菜单: + +| 选项 | 触发动作 | +|---|---| +| 导出任务统计 | `openManageExport / task` | +| 导出超期任务 | `openManageExport / overdue` | +| 导出审批数据 | `openManageExport / approve` | +| 导出签到数据 | `openManageExport / checkin` | + +## 操作步骤 +1. 应用中心 → 点「导出管理」 +2. 在二级菜单选导出类型 +3. 弹出导出配置对话框(选时间范围 / 项目 / 用户等条件) +4. 提交后按数据量同步下载或异步生成 + +## 不支持 +- 不能一次同时导出多种类型,每次只能选一种 +- 卡片不显示历史导出记录或下载列表 + +## 与管理员区「数据导出」的区别 +- 应用中心常用区「导出管理」:所有用户可见,按动作分类的一键导出 +- 管理员区「数据导出」:仅管理员,覆盖更多类型与导出参数的高级配置 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/favorite.md b/resources/ai-kb/zh/howto/apps/system-apps/favorite.md new file mode 100644 index 000000000..2f2aac7c1 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/favorite.md @@ -0,0 +1,42 @@ +--- +id: app-system.favorite.howto +title: 我的收藏入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 收藏在哪 + - 我的收藏 + - 收藏的任务 + - 收藏列表入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 应用中心入口只显示总列表,不能在此处新建收藏 + - 收藏来源是任务 / 文件 / 消息等地方的「收藏」按钮 +last_verified: v1.7.90 +--- + +# 我的收藏入口 + +## 是什么 +应用中心「我的收藏」卡片对应 `favorite` 系统应用,用于集中查看自己收藏的**任务、项目、文件、消息**四类条目。点击会触发全局事件 `openFavorite`,在当前页面弹出收藏面板。 + +## 入口 +- 桌面端:左侧导航「应用」→「我的收藏」卡片 +- 桌面端:左上角头像 / 昵称下拉菜单 →「我的收藏」(在「最近打开的任务」下方) +- 移动端:底部 Tabbar「应用」→「我的收藏」 +- 任何带有「⭐」收藏按钮的对象(任务 / 项目 / 文件 / 消息)都会进入这里 + +## 操作步骤 +1. 打开「我的收藏」面板 +2. 面板按类型(任务 / 项目 / 文件 / 消息)筛选显示已收藏条目 +3. 点条目跳转到原对象 +4. 取消收藏:在原对象上再次点「⭐」按钮 + +## 不支持 +- 不能在收藏入口直接新增条目,必须从原对象操作 +- 收藏不会按时间外的维度排序,无标签 / 分组 +- 不支持把收藏分享给其他成员 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/meeting.md b/resources/ai-kb/zh/howto/apps/system-apps/meeting.md new file mode 100644 index 000000000..8b9aa9f8c --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/meeting.md @@ -0,0 +1,46 @@ +--- +id: app-system.meeting.howto +title: 在线会议入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 会议在哪 + - 在线会议入口 + - 创建会议 + - 加入会议 + - 会议应用 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 此入口仅打开会议导航抽屉,不直接发起或加入 + - 「会议设置」入口仅管理员可见,普通成员看不到 +last_verified: v1.7.90 +--- + +# 在线会议入口 + +## 是什么 +应用中心「在线会议」卡片对应 `meeting` 系统应用,点击后打开会议导航抽屉,提供创建会议、加入会议(输入会议号)、查看历史会议等子入口。 + +## 入口 +- 桌面端:左侧导航「应用」→「在线会议」卡片 +- 移动端:底部 Tabbar「应用」→「在线会议」 +- 抽屉右上角「会议设置」入口仅管理员可见 + +## 操作步骤 +1. 应用中心 → 点「在线会议」 +2. 抽屉内可选: + - 「创建会议」:发起一场新会议(触发事件 `addMeeting / type=create`) + - 「加入会议」:输入会议号加入(触发事件 `addMeeting / type=join`) + - 查看历史 / 进行中的会议列表 +3. 点条目可查看详情 + +## 不支持 +- 没有快捷键直接创建会议 +- 此入口不展示日历集成视图,会议日程在日历模块查看 + +## 详细会议功能 +会议本身(音视频、共享、邀请等)由独立 feature 维护,本 chunk 只承担入口指引职责。 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/recent.md b/resources/ai-kb/zh/howto/apps/system-apps/recent.md new file mode 100644 index 000000000..8b761cc2c --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/recent.md @@ -0,0 +1,44 @@ +--- +id: app-system.recent.howto +title: 最近打开入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 最近打开 + - 最近访问 + - 历史记录在哪 + - 最近用过的应用 + - 最近打开的任务 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 仅记录本人在当前账号下的访问,不跨账号 + - 不能手动添加 / 删除条目(按访问行为自动维护) +last_verified: v1.7.90 +--- + +# 最近打开入口 + +## 是什么 +应用中心「最近打开」卡片对应 `recent` 系统应用,用于快速回到最近访问过的任务、项目、文件、对话等对象。点击会触发全局事件 `openRecent`,弹出最近访问的侧滑列表。 + +## 入口 +- 桌面端:左侧导航「应用」→「最近打开」卡片 +- 移动端:底部 Tabbar「应用」→「最近打开」 + +## 操作步骤 +1. 应用中心 → 点「最近打开」 +2. 侧滑面板按时间倒序显示最近访问的对象 +3. 点条目直接跳回原页面 + +## 数据来源 +- 当前账号的访问行为(自动记录) +- 与「我的收藏」不同:收藏要手动标记,最近打开按访问自动入列 + +## 不支持 +- 不能手动新增 / 删除某条记录 +- 跨设备同步范围与系统设置相关,不保证实时 +- 不区分团队空间,所有可访问对象都会进入列表 diff --git a/resources/ai-kb/zh/howto/apps/system-apps/report.md b/resources/ai-kb/zh/howto/apps/system-apps/report.md new file mode 100644 index 000000000..0eef2af08 --- /dev/null +++ b/resources/ai-kb/zh/howto/apps/system-apps/report.md @@ -0,0 +1,45 @@ +--- +id: app-system.report.howto +title: 工作报告入口 +type: howto +feature: app-system +scope: end-user +locale: zh +aliases: + - 工作报告入口 + - 日报怎么写 + - 周报在哪 + - 报告应用 + - 提交工作报告 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 应用中心卡片只是入口,不直接显示报告内容 + - 模板配置不在此入口,由管理员在系统设置中维护 +last_verified: v1.7.90 +--- + +# 工作报告入口 + +## 是什么 +应用中心「工作报告」卡片对应 `report` 系统应用,是写日报 / 周报 / 月报、查看下属报告、回复评论的常用入口。点击后打开报告侧滑抽屉,默认显示「我的报告」。 + +## 入口 +- 桌面端:左侧导航「应用」→「工作报告」卡片 +- 移动端:底部 Tabbar「应用」→「工作报告」 +- 卡片右上角有未读数角标(`reportUnreadNumber`);点角标会直接跳到「接收的报告」 + +## 操作步骤 +1. 应用中心 → 点「工作报告」 +2. 顶部切换「我的报告」「接收的报告」 +3. 我的报告:右上角「新建」→ 选模板(日报 / 周报 / 月报)→ 填写 → 提交 +4. 接收的报告:点条目查看 → 可标已读 / 回复评论 + +## 不支持 +- 已提交的报告无法删除,只能编辑 +- 普通成员看不到他人未发送给自己的工作记录 +- 卡片不会预览今日是否已写报告 + +## 详细字段 / AI 生成 / 分析 +工作报告的功能细节由独立 feature 维护,本 chunk 只承担入口指引职责。 diff --git a/resources/ai-kb/zh/howto/appstore/install.md b/resources/ai-kb/zh/howto/appstore/install.md new file mode 100644 index 000000000..b3f82c7eb --- /dev/null +++ b/resources/ai-kb/zh/howto/appstore/install.md @@ -0,0 +1,58 @@ +--- +id: appstore.install.howto +title: 安装一个插件 +type: howto +feature: appstore +scope: admin +locale: zh +aliases: + - 装插件 + - 安装应用 + - 启用功能 + - 怎么开通审批 + - 怎么开 AI + - install plugin +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 服务器能连接外网(拉取 Docker 镜像)或已预置离线镜像 +negative: + - 安装过程要拉 Docker 镜像,依赖网络速度 + - 不支持仅给单个用户安装(影响全员) + - 安装失败一般是网络 / 镜像源问题,看 [[appstore.cannot-install.faq]] +last_verified: v1.7.90 +--- + +# 安装一个插件 + +## 入口 +桌面端:左侧栏「应用」→ 顶部分组「管理员」→「应用商店」→ 在列表里选要装的插件。 +对应实现:微应用 `appstore`,注册位置 `application/admin`,URL `appstore/internal`。 + +## 操作步骤 +1. 进入应用商店,浏览插件列表(左侧分类:官方 / 社区) +2. 点击想装的插件,看说明、版本号、作者、依赖资源 +3. 点「安装」按钮,AppStore 微服务后台拉镜像并启动容器 +4. 等待状态从「安装中」变成「已安装」(时间从十秒到数分钟,取决于镜像大小) +5. 安装完成后到「应用」页刷新,对应入口出现 + +## 安装做了什么 +- 在 `docker/appstore/config/{appId}/` 写入 `config.yml`,包含 `status: installed`、`install_at`、`install_version`、`params` +- 把对应 `docker-compose.yml` 起动;新容器与 DooTask 共享网络 +- 部分插件会通过 menu_items 注册微应用入口到普通成员的「应用」页 + +## 安装成功验证 +- 应用商店里该插件标记为「已安装」 +- 普通成员的「应用」菜单看到对应入口 +- 后端 `App\Module\Apps::isInstalled('xxx')` 返回 true + +## 常见可装插件 +ai、approve、checkin、face、office、drawio、minder、okr、search、fileview、community_kuaifan_memos、community_kuaifan_kpi 等。 + +## 不支持 +- 不支持手动改 `config.yml` 后立即生效(要走 AppStore 流程,否则缓存与状态不一致) +- 不支持选择历史版本安装(除非通过升级) + +## 装不上时 +见 [[appstore.cannot-install.faq]]。 diff --git a/resources/ai-kb/zh/howto/appstore/uninstall.md b/resources/ai-kb/zh/howto/appstore/uninstall.md new file mode 100644 index 000000000..9379794a4 --- /dev/null +++ b/resources/ai-kb/zh/howto/appstore/uninstall.md @@ -0,0 +1,58 @@ +--- +id: appstore.uninstall.howto +title: 卸载一个插件 +type: howto +feature: appstore +scope: admin +locale: zh +aliases: + - 卸载插件 + - 删除应用 + - 关闭功能插件 + - 怎么停掉 AI + - 删掉审批 + - uninstall plugin +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 卸载会停容器并标记 status,但不一定立刻删数据卷 + - 不支持卸载 `appstore` 本身(强制保留) + - 卸载后用户在「应用」页对应入口立即消失,正在使用的会话可能报错 +last_verified: v1.7.90 +--- + +# 卸载一个插件 + +## 入口 +桌面端:左侧栏「应用」→「应用商店」(仅管理员)→ 找到目标插件 →「卸载」按钮。 + +## 操作步骤 +1. 进入应用商店,定位到已安装的插件 +2. 点击「卸载」按钮 +3. 确认弹窗:通常会提示「卸载后相关数据如何处理」 +4. 等待 AppStore 微服务停容器、改 `config.yml` 状态为非 `installed` +5. 刷新「应用」页,对应菜单消失 + +## 卸载做了什么 +- 在 `docker/appstore/config/{appId}/config.yml` 更新 `status` 字段(非 `installed`) +- 调 `docker compose down` 停掉对应容器 +- 触发主程序缓存失效:`RequestContext::save('app_installed_xxx', false)` +- 之后所有对该插件的后端调用会被 `Apps::isInstalledThrow()` 拦截,抛 ApiException + +## 卸载会影响的数据 +取决于插件实现: +- 多数官方插件停容器但保留 `docker/appstore/apps/{appId}/data/` 数据目录 +- 重新安装通常能恢复数据 +- 若要彻底删数据,需要手动到服务器删 `data/` 目录(不可逆,做之前先备份) + +## 卸载前建议 +1. 先把该插件相关业务数据导出(如审批数据 [[data-export.approve.howto]]、签到 [[data-export.checkin.howto]]) +2. 通知使用该插件的成员 +3. 重要数据先做服务器侧备份 + +## 不支持 +- 不支持仅对部分用户隐藏(卸载即全员失效) +- 不支持「停用但保留菜单」中间态 +- 不支持卸载 appstore 自身 diff --git a/resources/ai-kb/zh/howto/appstore/update.md b/resources/ai-kb/zh/howto/appstore/update.md new file mode 100644 index 000000000..7183e3e81 --- /dev/null +++ b/resources/ai-kb/zh/howto/appstore/update.md @@ -0,0 +1,60 @@ +--- +id: appstore.update.howto +title: 更新一个插件 +type: howto +feature: appstore +scope: admin +locale: zh +aliases: + - 更新插件 + - 升级插件 + - 怎么升级 AI + - 插件有新版本 + - update plugin + - 升级应用 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 服务器能拉取新镜像 +negative: + - 更新会触发容器重建,期间该插件功能短暂不可用 + - 不支持回滚到旧版本(除非自行管理镜像) + - 不支持自动升级(每次需要管理员手动确认) +last_verified: v1.7.90 +--- + +# 更新一个插件 + +## 入口 +桌面端:左侧栏「应用」→「应用商店」(仅管理员)→ 已安装的插件如果有新版本,会显示「更新」按钮。 + +## 操作步骤 +1. 进入应用商店,看到有新版本提示(红点 / 数字) +2. 点击插件 → 「更新」 +3. 阅读更新日志,确认无破坏性变更 +4. 点「确认更新」 +5. AppStore 微服务拉新镜像 → 停旧容器 → 起新容器 +6. `config.yml` 的 `install_version` 更新 + +## 更新期间会发生什么 +- 该插件提供的接口短暂返回 502 / 不可用(几秒到一分钟) +- 微应用入口仍在「应用」页,但点开可能加载失败 +- 与该插件交互的 AI 工具、机器人会失败(前端通常会重试) + +## 更新失败怎么办 +- 多数因为新镜像拉取失败(网络、镜像源),先看 [[appstore.cannot-install.faq]] 的网络部分 +- 容器起不来:服务器 `docker logs` 看日志 +- 状态卡在「更新中」:到 `docker/appstore/config/{appId}/config.yml` 检查状态字段 +- 必要时卸载重装 + +## 更新前建议 +1. 浏览插件官方说明,确认有无破坏性变更(DB 迁移、参数改名等) +2. 业务高峰期之外操作 +3. 关键插件(AI / 审批 / 签到)先备份对应数据 +4. 提前通知使用方 + +## 不支持 +- 不支持选择目标版本号升级(只能升到最新) +- 不支持自动定时升级 +- 不支持回滚(除非自己留旧镜像 + 手动改 docker-compose) diff --git a/resources/ai-kb/zh/howto/bot/create.md b/resources/ai-kb/zh/howto/bot/create.md new file mode 100644 index 000000000..73b506b3d --- /dev/null +++ b/resources/ai-kb/zh/howto/bot/create.md @@ -0,0 +1,58 @@ +--- +id: bot.create.howto +title: 创建用户机器人 +type: howto +feature: bot +scope: end-user +locale: zh +aliases: + - 怎么建机器人 + - 创建机器人 + - 新建 bot + - 添加机器人 + - 我要做个机器人 + - 自建机器人 +related_tools: [] +related_pages: [application, messenger] +prerequisites: [] +negative: + - 单个用户最多 50 个自建机器人,超出报「超过最大创建数量」 + - 机器人名称必须 2-20 字符,太短/太长会被拒 + - 创建后不能改「是否支持会话」开关,需重建 + - 用户自建机器人不识别斜杠指令(`/help` 等只对系统机器人有效) +last_verified: v1.7.90 +--- + +# 创建用户机器人 + +## 入口 +- 桌面端:左侧栏「应用」→「我的机器人」卡片 → 右上角「添加机器人」 +- 也可在「机器人管理」(`bot-manager@bot.system`)单聊里发 `/newbot 名称` 创建 + +## 操作步骤 +1. 在「我的机器人」面板点「添加机器人」 +2. 填写「机器人名称」(2-20 字符,必填) +3. 可选:上传头像(512×512 推荐) +4. 可选:设置「保留消息天数」`clear_day`(1-999,默认 90) +5. 可选:填写 `webhook_url`,并勾选要订阅的事件(message / dialog_open / member_join / member_leave) +6. 点「保存」,对应后端接口 `api/users/bot/edit`(`bot__edit`) + +## 字段说明 +| 字段 | 必填 | 说明 | +|---|---|---| +| name | 是 | 机器人昵称,2-20 字符 | +| avatar | 否 | 头像 URL;留空用默认 | +| session | 否 | 0/1,是否开启「新会话/历史会话」菜单;仅新建时生效 | +| clear_day | 否 | 消息保留天数 1-999,超期自动清理 | +| webhook_url | 否 | `http(s)://` 开头,≤ 255 字符 | +| webhook_events | 否 | 事件列表,详见 [[bot.webhook.concept]] | + +## 创建之后 +- 在「我的机器人」列表点「开始聊天」进入和机器人的单聊 +- 把机器人邀请到群里:[[bot.invite.howto]] +- 拿 token:在「机器人管理」单聊发 `/token `,或 `/revoke` 重置 +- 删除:列表里点「删除」(要求填删除备注,≤ 255 字符) + +## 不支持 +- 不能跨账号转让机器人 +- 不能把已有的普通用户改成机器人,反之亦不能 diff --git a/resources/ai-kb/zh/howto/bot/invite.md b/resources/ai-kb/zh/howto/bot/invite.md new file mode 100644 index 000000000..8b5914f2e --- /dev/null +++ b/resources/ai-kb/zh/howto/bot/invite.md @@ -0,0 +1,53 @@ +--- +id: bot.invite.howto +title: 把机器人邀请进群 +type: howto +feature: bot +scope: end-user +locale: zh +aliases: + - 机器人入群 + - 拉机器人进群 + - 把 bot 加进群 + - 给群加机器人 + - 群里加机器人 + - 怎么让机器人进群 +related_tools: [] +related_pages: [messenger] +prerequisites: + - 已创建机器人([[bot.create.howto]])或使用内置系统机器人 + - 你在目标群里,且群允许添加成员 +negative: + - 全员群(all 群)/ 部门群 / 项目讨论组通常不允许手动加机器人,因为成员是系统自动维护 + - 临时账号(temp)不能创建群,但可以把机器人邀进自己的群 + - 机器人邀进群后仍需 @ 它才会触发回复 +last_verified: v1.7.90 +--- + +# 把机器人邀请进群 + +## 入口 +机器人在系统里等同于一个用户,可在群成员管理里像加普通成员一样添加: + +- 桌面端:群聊右上角「群信息」→ 成员列表「+」→ 在搜索框输入机器人昵称或 `@bot.system` 关键字 → 勾选 → 确定 +- 移动端:群聊右上角菜单 → 「群信息」→ 「+」添加成员 → 搜索机器人 → 确定 + +## 操作步骤 +1. 进入目标群聊 +2. 打开「群信息」面板 +3. 点成员列表的「+」(添加成员) +4. 搜索机器人: + - 系统机器人:搜「任务提醒」「审批」「Claude」等中文名 + - 自建机器人:搜你给它起的名字(在「我的机器人」列表里的 name) +5. 勾选 → 确定 + +## 邀请后的行为 +- 机器人加入即视为群成员,看得到群里所有消息但不会主动回复 +- 群里只有「@ 机器人」时才触发回复([[bot.mention.howto]]) +- AI 机器人额外会把最近 15 条群聊记录作为上下文带给模型 +- 自建机器人会通过 `webhook_url` 把消息推送出去(如订阅了 `message` 事件) + +## 不支持 +- 没有「禁止机器人进群」的全局开关;权限上等同普通成员 +- 一个群里加多个 AI 机器人时,谁先被 @ 谁回复,不会并发 +- 不能批量把一个机器人拉进多个群,需要逐个群操作 diff --git a/resources/ai-kb/zh/howto/bot/mention.md b/resources/ai-kb/zh/howto/bot/mention.md new file mode 100644 index 000000000..c1d1d4d03 --- /dev/null +++ b/resources/ai-kb/zh/howto/bot/mention.md @@ -0,0 +1,53 @@ +--- +id: bot.mention.howto +title: 怎么 @ 机器人触发 +type: howto +feature: bot +scope: end-user +locale: zh +aliases: + - "@机器人" + - at 机器人 + - 怎么让机器人回复 + - 群里机器人不回我 + - 触发机器人 + - 召唤机器人 +related_tools: [] +related_pages: [messenger] +prerequisites: + - 机器人已在群里([[bot.invite.howto]])或你在和它的单聊中 +negative: + - "群聊里不 @ 机器人则机器人不回复(避免噪音)" + - "@所有人 不算 @ 机器人,机器人不会响应「@所有人」" + - 机器人之间互相发的消息会被忽略,避免循环 + - 单聊里发 `/...` 斜杠开头的指令,只有系统机器人才识别;自建机器人会直接忽略 +last_verified: v1.7.90 +--- + +# 怎么 @ 机器人触发 + +## 单聊 vs 群聊 +- **单聊**:直接发任意消息即可触发;AI 机器人会回复内容,签到/隐私机器人按指令处理,自建机器人通过 webhook 转给外部 +- **群聊**:必须 @ 机器人才会触发,否则机器人当作背景消息只看不回 + +## 怎么 @ +- 桌面端:输入框输入 `@`,弹出成员候选,输入机器人名前几个字 → 回车选中 → 继续输入你的问题 → 发送 +- 移动端:同样在输入框打 `@` 弹出候选;或长按机器人头像选「@TA」 +- 引用回复机器人的某条消息也算交互(会作为 `reply_text` 上下文) + +## AI 机器人额外规则 +- 群聊里 AI 机器人会把当前对话最近 15 条记录作为上下文带给模型 +- 群聊会自动 `before_clear = 1` 清掉旧上下文,避免跨群污染 +- 模型名可在「选择模型」菜单里临时切换,或在消息里用 `模型名 - thinking` 触发思考模式 + +## 不响应的情况 +- 没 @ 机器人(群聊) +- 只 @ 了「所有人」 +- 客户端版本过低(AI 机器人要求 ≥ v0.41.11) +- AI 机器人未配置 API Key(报「机器人未启用」) +- AI 插件没装(报「应用『AI Assistant』未安装」) +- 用户自建机器人收到 `/...` 开头的指令 + +## 不支持 +- 不支持「@机器人 + 私聊式不可见」,群里 @ 一定全员可见 +- 不支持给机器人设「关键词触发」(需自建机器人 + webhook 自己判断) diff --git a/resources/ai-kb/zh/howto/calendar/create.md b/resources/ai-kb/zh/howto/calendar/create.md new file mode 100644 index 000000000..418ef4f62 --- /dev/null +++ b/resources/ai-kb/zh/howto/calendar/create.md @@ -0,0 +1,53 @@ +--- +id: calendar.create.howto +title: 在日历里创建任务 +type: howto +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历建任务 + - 日历加事件 + - 日历点空白处 + - 在日历上选时间段 + - 日历新建 +related_tools: [create_task] +related_pages: [calendar] +prerequisites: + - 至少加入一个项目(要选项目归属) + - 桌面端,移动端无创建入口(只读) +negative: + - 日历不能直接建"游离事件",必须落到某个项目下 + - 不能在日历创建会议 / 签到,只能建任务 + - 新建时所选项目必须有 TASK_ADD 权限 +last_verified: v1.7.90 +--- + +# 在日历里创建任务 + +## 是什么 +在桌面端日历的月 / 周 / 日视图,用户可在空白单元格或时间段上拖框选区,触发"创建任务"弹窗。新任务会按所选时段填 start_at / end_at,归属于用户选定的项目。 + +## 入口 +- 桌面端:日历任意视图空白处单击 / 拖动选区 +- 桌面端:日历右上角「+ 添加任务」按钮(不限时段) +- 移动端:不支持,仅看视图 + +## 操作步骤 +1. 在月视图:点单元格 → 选当天作为日期范围 +2. 在周 / 日视图:纵向拖框选区 → 选具体时段 +3. 弹出任务创建对话框: + - 必填:任务名(≤255 字符)、所属项目、所属列 + - 自动填:start_at / end_at(按选区)、负责人 = 当前用户 +4. 点保存,任务出现在日历事件中 + +## 与 [[task.create.howto.quick]] 的关系 +- 都调相同的 `create_task` 后端 API +- 差异:日历入口的时间默认按选区,普通快速建任务时间默认为空 +- 在项目详情页快建的任务也会同步出现在日历(如果你是负责人 + 有 end_at) + +## 不支持 +- 不能"建临时事件不绑定项目" +- 不能批量从日历建任务 +- 移动端不能建(只读) +- 不能"重复创建同时段连续多天的任务",循环用 [[task.recurring.howto]] diff --git a/resources/ai-kb/zh/howto/calendar/drag.md b/resources/ai-kb/zh/howto/calendar/drag.md new file mode 100644 index 000000000..086520f0c --- /dev/null +++ b/resources/ai-kb/zh/howto/calendar/drag.md @@ -0,0 +1,61 @@ +--- +id: calendar.drag.howto +title: 拖动日历事件改时间 +type: howto +feature: calendar +scope: end-user +locale: zh +aliases: + - 拖动任务改时间 + - 日历拖事件 + - 拖任务到别的日期 + - 改任务截止日 + - 日历改时间 +related_tools: [update_task] +related_pages: [calendar] +prerequisites: + - 你是任务负责人,有 TASK_TIME 或 TASK_UPDATE 权限 + - 桌面端,移动端只读 +negative: + - 移动端日历只读,不能拖动 + - 拖动只改 end_at / start_at,不改其他字段 + - 跨多天任务拖动会同步保持长度,不会自动延长 +last_verified: v1.7.90 +--- + +# 拖动日历事件改时间 + +## 是什么 +桌面端日历支持鼠标拖动事件块,改任务的 start_at / end_at。拖完会立即触发 `update_task` 接口,按视图精度(月 / 周 / 日)改时间。 + +## 入口 +- 桌面端:日历任意视图下,按住任务卡片拖动 +- 周 / 日视图:纵向拖改时段,横向拖改日期 +- 月视图:只能改日期(保留时段) +- 移动端:禁用拖动([[calendar.mobile.faq]]) + +## 拖动后的字段变化 +| 视图 | 拖动方向 | 修改字段 | +|---|---|---| +| 月 | 任意格 → 另一格 | end_at 的日期部分(保留时分) | +| 周 | 纵向 | end_at 的时分 + start_at(保留 duration) | +| 周 | 横向 | end_at + start_at 的日期 | +| 日 | 纵向 | end_at 的时分 | + +拖动**事件边缘**可单独改 start_at(延长 / 缩短)。 + +## 拖动后的副作用 +- WebSocket 推送给项目所有在线成员 +- 仪表盘 [[dashboard.today.howto]] / [[dashboard.overdue.howto]] 数字 / 列表跟着重算 +- 任务详情页 [[task.field.deadline.concept]] 字段同步更新 +- 项目动态 ProjectLog 记一条「X 改了任务 Y 的时间」 + +## 拖动失败的可能原因 +- 你不是该任务负责人 → 无权限改 +- 项目权限规则关掉了 TASK_TIME → 看 [[project.permission.concept]] +- 任务已归档 / 已删除 → 必须先恢复 + +## 不支持 +- 不能批量拖多个任务 +- 不支持「拖动同时改其他字段」 +- 移动端只读,无法拖 diff --git a/resources/ai-kb/zh/howto/calendar/view.md b/resources/ai-kb/zh/howto/calendar/view.md new file mode 100644 index 000000000..f54393535 --- /dev/null +++ b/resources/ai-kb/zh/howto/calendar/view.md @@ -0,0 +1,56 @@ +--- +id: calendar.view.howto +title: 切换日历月 / 周 / 日 视图 +type: howto +feature: calendar +scope: end-user +locale: zh +aliases: + - 月视图 + - 周视图 + - 日视图 + - 切日历视图 + - 日历显示方式 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 无议程视图(agenda),仅月 / 周 / 日 三种 + - 移动端只有月视图,桌面端三种都有 + - 切换视图会重新拉数据(按视图范围 `rangeTime`) +last_verified: v1.7.90 +--- + +# 切换日历月 / 周 / 日 视图 + +## 入口 +- **桌面端**:日历右上角视图切换按钮组「月 / 周 / 日」 +- **移动端**:固定月视图,无切换按钮 +- 选择记住:用户偏好持久化到本地 `cacheCalendarView` + +## 三种视图差异 + +| 视图 | 显示范围 | 全天事件位置 | 拖动改时间精度 | +|---|---|---|---| +| 月 | 当前月(含跨月头尾) | 单元格顶部条 | 仅改日期 | +| 周 | 当前周 7 天 | 顶部全天条带 | 改日期 + 时段 | +| 日 | 当前一天 | 顶部全天条 | 改具体时段 | + +## 操作步骤 +1. 点视图按钮 → 立即切换 +2. 浏览方向:左右箭头切换前 / 后一段(月→月、周→周、日→日) +3. 中间「今天」按钮回当天 + +## 拖动改时间 +- 月视图:拖任务卡到另一格 → 改 end_at 的日期(保留时间部分) +- 周 / 日视图:拖任务卡纵向 → 改时段,详见 [[calendar.drag.howto]] +- 移动端:只读,详见 [[calendar.mobile.faq]] + +## 切换后数据 +- 切到下个月 / 下周 / 下日 → 自动按新范围查询任务 +- 范围变化触发 `getTasks(rangeTime)` 拉数据 + +## 不支持 +- 无年视图(仅月) +- 无议程 / 时间线视图 +- 移动端无周 / 日视图 diff --git a/resources/ai-kb/zh/howto/checkin/export.md b/resources/ai-kb/zh/howto/checkin/export.md new file mode 100644 index 000000000..ddf6607e9 --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/export.md @@ -0,0 +1,52 @@ +--- +id: checkin.export.howto +title: 怎么导出签到数据 +type: howto +feature: checkin +scope: admin +locale: zh +aliases: + - 导出签到 + - 导出考勤 + - 导出打卡记录 + - 签到 Excel + - 月度签到导出 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员身份 +last_verified: v1.7.90 +--- + +# 怎么导出签到数据 + +## 入口 +有两个入口都能到导出弹窗: + +- 「应用」→「签到打卡」→ 抽屉右上角「签到设置」→ 顶部「导出签到数据」 +- 管理后台头部下拉菜单 →「导出签到数据」 + +## 操作步骤 +1. **导出成员**:从成员选择器勾选要导出的人,**单次最多 100 个** +2. **签到日期**:选日期区间;右侧快捷有「上个月」「这个月」 +3. **班次时间**:选上下班时间窗口,决定首签 / 末签结果的判定基准;快捷选项 `8:30-18:00 / 9:00-18:00 / 9:30-18:30` +4. 点「导出」→ 弹出「正在打包,请留意系统消息」 + +## 导出过程与结果 +- 后端接口:`GET api/system/checkin/export` +- 任务异步打包成 Excel,完成后由「文件助手」机器人发一条带下载链接的卡片 +- 文件名自动按 `{成员名}/{N 位成员}/{月份}的签到记录` 命名 +- 下载链接走 `api/system/checkin/down?key=...`,登录后访问 + +## Excel 字段 +导出 Excel 包含以下列: + +- 签到人 +- 签到日期 +- 首次签到时间 / 首次签到结果(按所选班次判定是否迟到) +- 最后签到时间 / 最后签到结果(按所选班次判定是否早退) + +## 不支持 +- 不支持单次导出超过 100 个成员,更多需要分批 +- 不支持按部门一键全选,需手动勾选 +- 不支持原始多次打卡明细,只导首签和末签两个时间 diff --git a/resources/ai-kb/zh/howto/checkin/face.md b/resources/ai-kb/zh/howto/checkin/face.md new file mode 100644 index 000000000..793b619c2 --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/face.md @@ -0,0 +1,45 @@ +--- +id: checkin.face.howto +title: 人脸签到怎么用 +type: howto +feature: checkin +scope: end-user +locale: zh +aliases: + - 人脸签到 + - 刷脸签到 + - 怎么录入人脸 + - 上传人脸图片 + - 人脸打卡 +related_tools: [] +related_pages: [user-settings] +prerequisites: + - 应用市场已安装 face 插件 + - 管理员已在「签到设置 → 签到方式」勾选「人脸签到」 + - 管理员已在「签到设置 → 允许修改」开启「允许成员自己上传人脸图片」 +last_verified: v1.7.90 +--- + +# 人脸签到怎么用 + +## 录入人脸(成员侧) +1. 打开「应用」→「签到打卡」抽屉 → 「签到设置」Tab → 切到「人脸签到」 +2. 点击「人脸图片」上传位 → 选择 / 拍摄一张正面照 +3. 建议尺寸 **500x500**,单张限制 1 张,会自动同步给 face 插件后端 +4. 点「提交」保存 + +成功后 face 容器会保存对应人脸特征,后续人脸识别设备扫脸时自动匹配到该成员。 + +## 现场打卡 +1. 走到办公场所的人脸识别一体机前 +2. 设备扫描成功 → 自动调用插件 API 写入一条签到记录 +3. 在「签到打卡」抽屉的时间线立即看到新记录 + +## 替换或删除人脸 +- 替换:重新上传新图片即可覆盖 +- 删除:把图片清空后提交,face 插件后端会同步删除该成员的人脸数据 + +## 不支持 +- 不支持纯软件刷脸(手机自拍打卡),必须有配套人脸识别硬件 +- 单成员只能录入 1 张人脸图(多张请通过设备后台管理) +- face 插件未安装时上传会报错(详见 [[checkin.face-fail.faq]]) diff --git a/resources/ai-kb/zh/howto/checkin/record.md b/resources/ai-kb/zh/howto/checkin/record.md new file mode 100644 index 000000000..ced5f6b2b --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/record.md @@ -0,0 +1,46 @@ +--- +id: checkin.record.howto +title: 怎么查看自己的签到记录 +type: howto +feature: checkin +scope: end-user +locale: zh +aliases: + - 查看签到记录 + - 我的签到 + - 打卡历史 + - 看自己有没有打卡 + - 上个月打卡记录 +related_tools: [] +related_pages: [] +prerequisites: [] +last_verified: v1.7.90 +--- + +# 怎么查看自己的签到记录 + +## 入口 +桌面端 / 移动端:左侧栏「应用」→「签到打卡」卡片 → 弹出右侧抽屉 + +## 抽屉里能看到什么 +- **近 5 天时间线**:顶部时间线展示最近 5 个工作日的打卡情况 + - 蓝色对勾:当天已签到,下方列出每段时间区间(如 `09:01 - 18:32`) + - 黄色叉号:当天未签到 +- **「查看更多签到数据」按钮**:弹出日历视图,按月查看签到详情 + +## 日历视图 +点击「查看更多签到数据」后: + +1. 默认显示当月,每个日期格内显示当天首签时间和末签时间 +2. 顶部可切换月份,最多可向前回看 **3 个月** +3. 工作日无签到的会标记为缺勤 + +## 数据来源 +- 后端接口:`GET api/users/checkin/list?ym=YYYY-MM&before=N` +- 时间段聚合:单次打卡间隔超过 1 小时会被切成新的时段,所以一天会看到「上班段 + 下班段」两组时间 +- 当天若多次打卡,每段时间只显示该段最早和最晚两个时间点 + +## 不支持 +- 只能看自己的签到记录;管理员看团队签到需走「签到设置」→「会员签到设置」→ 团队管理 +- 不能跨月份导出(个人导出无入口),管理员可批量导出,见 [[checkin.export.howto]] +- 不支持回看 3 个月以前的日历数据 diff --git a/resources/ai-kb/zh/howto/checkin/regular.md b/resources/ai-kb/zh/howto/checkin/regular.md new file mode 100644 index 000000000..34acf8619 --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/regular.md @@ -0,0 +1,41 @@ +--- +id: checkin.regular.howto +title: 普通签到(手动签到)怎么做 +type: howto +feature: checkin +scope: end-user +locale: zh +aliases: + - 手动签到 + - 怎么手动打卡 + - 在机器人里打卡 + - 普通签到 + - 不连 WiFi 怎么签 +related_tools: [] +related_pages: [messenger] +prerequisites: + - 管理员已在「签到设置 → 签到方式」勾选「手动签到」 +last_verified: v1.7.90 +--- + +# 普通签到(手动签到)怎么做 + +## 入口 +桌面端 / 移动端:左侧栏「应用」→「签到打卡」卡片 → 抽屉内「打开签到机器人」按钮 +也可直接在「消息」列表搜索 **签到打卡机器人**(系统机器人,账号 `check-in@bot.system`)打开对话。 + +## 操作步骤 +1. 打开签到机器人对话框 +2. 在输入框发送任意内容(默认指令即可,机器人会识别为打卡请求) +3. 机器人回复「签到成功 / 已记录」并附本次时间 +4. 一天内多次发送会被合并:早上一次记上班、晚上一次记下班;中间间隔过短的会去重 + +## 字段默认值 +- 签到日期:以服务器当前日期(北京时间)为准 +- 签到时间:以消息送达时刻为准,精确到分钟 +- 备注:管理员可在「签到设置 → 手动签到 → 签到备注」自定义提示文案 + +## 不支持 +- 手动签到不能补打过去的日期,只能打当下时间 +- 不能撤回 / 删除已生成的签到记录(只读) +- 一天不会识别出超过 2 段时间:只取首签 + 末签,中间多次发送都会归入这两段 diff --git a/resources/ai-kb/zh/howto/checkin/setting.md b/resources/ai-kb/zh/howto/checkin/setting.md new file mode 100644 index 000000000..470fc2bb9 --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/setting.md @@ -0,0 +1,49 @@ +--- +id: checkin.setting.howto +title: 个人签到设置怎么改 +type: howto +feature: checkin +scope: end-user +locale: zh +aliases: + - 个人签到设置 + - 改签到设置 + - 怎么改 MAC + - 怎么改人脸 + - 签到设置在哪 + - 我的签到设置 +related_tools: [] +related_pages: [application] +prerequisites: [] +last_verified: v1.7.90 +--- + +# 个人签到设置怎么改 + +## 入口 +桌面端 / 移动端:左侧栏「应用」→「签到打卡」卡片 → 抽屉里默认上半部是签到记录,**滚动到下半部「签到设置」**即可 + +## 能改什么 +个人侧的签到设置只有两块(受管理员权限开关控制): + +- **人脸签到** Tab:上传 / 替换 / 删除自己的人脸图片(一张) +- **WiFi 签到** Tab:增删自己的 MAC 地址列表(最多 3 个)+ 每条备注 + +切换 Tab 时点「提交」只会保存当前 Tab 的内容;另一 Tab 的修改会丢失,需要分别提交。 + +## 操作步骤(修改 MAC) +1. 切到「WiFi 签到」Tab +2. 在 MAC 输入框填入设备 MAC(`XX:XX:XX:XX:XX:XX`) +3. 备注列填入设备说明(≤ 100 字) +4. 点「添加设备」可加新条;点输入框右侧 × 删除条 +5. 点底部「提交」保存 + +## 操作步骤(修改人脸) +1. 切到「人脸签到」Tab +2. 在图片上传位上传新照片(建议 500x500) +3. 点底部「提交」,会同步推到 face 插件后端 + +## 不支持 +- 没有「签到提醒时间」「上下班时间」等个人级配置——这些是全局参数,仅管理员可改(详见 [[checkin.rule.concept]]) +- 当管理员关闭「允许修改」时,对应 Tab 提交会报错「未开放修改权限」 +- 不能在此页面查看团队其他成员的签到设置 diff --git a/resources/ai-kb/zh/howto/checkin/wifi.md b/resources/ai-kb/zh/howto/checkin/wifi.md new file mode 100644 index 000000000..de50dbdf3 --- /dev/null +++ b/resources/ai-kb/zh/howto/checkin/wifi.md @@ -0,0 +1,45 @@ +--- +id: checkin.wifi.howto +title: WiFi 自动签到怎么用 +type: howto +feature: checkin +scope: end-user +locale: zh +aliases: + - WiFi 签到 + - MAC 签到 + - 连 WiFi 自动打卡 + - 路由器签到 + - 自动签到怎么设置 + - 上班连 WiFi 就打卡 +related_tools: [] +related_pages: [user-settings] +prerequisites: + - 管理员已在「签到设置 → 签到方式」勾选「WiFi 签到」 + - 办公网路由器是 OpenWrt 系统并已执行管理员提供的安装命令 +last_verified: v1.7.90 +--- + +# WiFi 自动签到怎么用 + +## 原理 +WiFi 签到由办公网路由器(OpenWrt)安装一个定时脚本,每隔约 1 分钟扫描局域网内已连接设备的 MAC 地址,上报到 DooTask 服务端。服务端匹配到「该 MAC 已被某成员登记」即自动生成一条签到记录。所以并不是「员工手机连上 WiFi 就立刻打卡」,而是「连上后路由器下一次上报时打卡」,存在 ±1 分钟延迟。 + +## 操作步骤(成员侧) +1. 打开「应用」→「签到打卡」抽屉 → 「签到设置」Tab → 切到「WiFi 签到」 +2. 填入设备 MAC 地址(格式 `XX:XX:XX:XX:XX:XX`,大小写均可) +3. 可填「备注」(如「工作笔记本」「办公手机」) +4. 点「添加设备」可再加一条 +5. 点「提交」保存 + +每位成员最多绑定 **3 个** MAC 地址。同一 MAC 不能被多个成员绑定(提示「已被其他成员设置」)。 + +## 操作步骤(管理员侧) +1. 「签到设置 → WiFi 签到 → 安装说明」处复制 `curl ... | sh` 一行命令 +2. 在 OpenWrt 路由器 SSH 终端执行该命令完成安装 +3. 关闭再开启签到功能后需要重新安装 + +## 不支持 +- 不支持非 OpenWrt 路由器(如普通家用 TP-Link 原厂固件) +- 单成员不能登记超过 3 个 MAC(超过会被拒) +- 单 MAC 只能归属一名成员 diff --git a/resources/ai-kb/zh/howto/compliance/config.md b/resources/ai-kb/zh/howto/compliance/config.md new file mode 100644 index 000000000..21879440b --- /dev/null +++ b/resources/ai-kb/zh/howto/compliance/config.md @@ -0,0 +1,70 @@ +--- +id: compliance.howto +title: 合规配置项检查清单 +type: howto +feature: compliance +scope: admin +locale: zh +aliases: + - 合规配置 + - 怎么做合规 + - GDPR 配置 + - 合规检查 + - 数据合规清单 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员或超级管理员权限 + - 部分项需要服务器管理员配合(HTTPS / 备份脚本) +negative: + - DooTask 没有「一键合规检查」按钮 + - 多数合规项是人工 + 脚本组合,没有自动巡检 + - 合规问题的法律责任在私有部署方,DooTask 仅提供能力 +last_verified: v1.7.90 +--- + +# 合规配置项检查清单 + +## 操作步骤 +DooTask 没有集中页面,按以下分散位置逐项检查: + +1. 用户协议 / 隐私政策展示 + - 「系统设置 → 通用设置」中可配置注册时是否要求勾选《用户协议》《隐私政策》 + - 链接为外链,需自行托管 HTML 内容 + +2. 注册策略 + - 「系统设置 → 注册策略」选择「关闭注册 / 需邀请码 / 自由注册」 + - 涉及未成年人 / 实名制场景应至少开启邀请码 + +3. 密码强度与登录验证 + - 「系统设置 → 安全设置」启用密码强度校验、强制 2FA(如安装相关插件) + - LDAP 用户由 AD 侧管控 + +4. 内容审核 + - 培训管理员定期查 [[abuse-report.entry.menu-map]] + - 必要时联动「团队管理 → 禁用账号」 + +5. 数据导出审计 + - 管理员侧导出会经 `system-msg` 私聊推送,记录可在机器人对话中追溯 + - 详见 [[data-export.concept]] + +6. 数据保留与销毁 + - 写脚本定期清理 `web_socket_msgs`、`temp/` 临时文件 + - 离职员工走「团队管理 → 删除」自动触发 `user_offboard` hook + +7. 数据备份与本地化 + - 用项目提供的 `./cmd backup` 类脚本(如有)定期备份数据库 + uploads + - 备份文件应加密存放、限制访问 + +8. 传输加密 + - 部署侧用 Nginx 配 HTTPS 证书(Let's Encrypt 等) + - 内网部署也应启用,至少在出口 + +## 不支持 +- 不支持自动巡检上述项 +- 不支持生成合规报告 PDF +- 不内置 DSR(数据主体请求)工单 + +## 相关 +- 概览:[[compliance.concept]] +- 入口:[[compliance.entry.menu-map]] diff --git a/resources/ai-kb/zh/howto/dashboard/assist.md b/resources/ai-kb/zh/howto/dashboard/assist.md new file mode 100644 index 000000000..b2b3e3593 --- /dev/null +++ b/resources/ai-kb/zh/howto/dashboard/assist.md @@ -0,0 +1,54 @@ +--- +id: dashboard.assist.howto +title: 「协助的任务」卡片用法 +type: howto +feature: dashboard +scope: end-user +locale: zh +aliases: + - 协助的任务 + - 我帮忙的任务 + - 协作的任务 + - assist 任务 + - 别人让我协助的 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 协作任务我不能直接 [[task.complete.howto]] 标记完成(仅负责人能) + - 协作任务不计入「今日到期」「超期」「待完成」三张顶部数字卡 + - 项目转让 / 离职后该协作关系会保留,直到对方手动调整 +last_verified: v1.7.90 +--- + +# 「协助的任务」卡片用法 + +## 是什么 +仪表盘第 4 个分组列表,独立于顶部 3 张数字卡之外,展示当前用户作为**协作者**([[task.field.owner-assist.concept]] 中 `owner=0` 且 `assist=true`)参与的任务,但不是负责人。语义是「别人主任务上把我加进来一起做的活」。 + +## 数据规则 +- ProjectTaskUser 命中当前用户、owner=0(协作者标识) +- complete_at IS NULL(任务未完成) +- archived_at IS NULL(任务未归档) +- deleted_at IS NULL + +## 入口 +- 桌面端:仪表盘下方第 4 个分组(在「今日到期」「超期任务」「待完成」之下) +- 标题旁数字 = 协作任务数 +- 点标题折叠 / 展开 + +## 操作权限 +| 行为 | 协作者(assist) | 负责人(owner=1) | +|---|---|---| +| 查看任务详情 | ✓ | ✓ | +| 评论 / 发消息 | ✓ | ✓ | +| 改任务字段 | 视项目权限规则 | ✓ | +| 标记完成 | ✗ | ✓ | +| 删除任务 | ✗ | 视权限 | + +如果改不动字段,看 [[project.permission-denied-task.faq]] 排查。 + +## 不支持 +- 协作者不能完成任务 +- 协作者不能给任务再加协作者 +- 仪表盘不区分"我创建的"与"别人加我的"协作任务,全混在一起 diff --git a/resources/ai-kb/zh/howto/dashboard/collapse.md b/resources/ai-kb/zh/howto/dashboard/collapse.md new file mode 100644 index 000000000..a12e7b847 --- /dev/null +++ b/resources/ai-kb/zh/howto/dashboard/collapse.md @@ -0,0 +1,53 @@ +--- +id: dashboard.collapse.howto +title: 折叠 / 展开仪表盘分组 +type: howto +feature: dashboard +scope: end-user +locale: zh +aliases: + - 仪表盘折叠 + - 隐藏仪表盘分组 + - 隐藏协助任务 + - 仪表盘卡片折叠 + - 展开仪表盘 +related_tools: [] +related_pages: [dashboard] +prerequisites: [] +negative: + - 折叠状态按当前用户独立存储,不同步到其他设备 + - 不能完全隐藏顶部 3 张数字卡(始终显示) + - 不能调换分组顺序 +last_verified: v1.7.90 +--- + +# 折叠 / 展开仪表盘分组 + +## 是什么 +仪表盘下方的 4 个分组列表([[dashboard.today.howto]] / [[dashboard.overdue.howto]] / [[dashboard.todo.howto]] / [[dashboard.assist.howto]])每个都可独立折叠或展开。状态保存在浏览器 IndexedDB 的 `dashboardHiddenColumns` 键,按当前用户独立。 + +## 入口 +- 桌面端:分组标题栏左侧的折叠箭头(▶ / ▼) +- 桌面端:点分组标题文字 +- 移动端:同上 + +## 折叠后 +- 分组标题保留(仍能看到分类名 + 数量) +- 列表内容收起 +- 分组数量小标仍正常更新 +- 状态保存到 IndexedDB → 下次进仪表盘默认保持 + +## 展开 +- 再次点折叠箭头 / 标题 → 恢复展开 +- 状态同步更新到 IndexedDB + +## 同步规则 +- IndexedDB 存储在浏览器本地 +- 不同浏览器 / 不同设备的折叠状态各自独立 +- 清浏览器数据会丢失折叠状态(重置为全展开) + +## 不支持 +- 不能完全删除分组(只能折叠) +- 不能拖动调整 4 个分组的顺序 +- 不能给分组改名 +- 不支持云端同步折叠状态 diff --git a/resources/ai-kb/zh/howto/dashboard/overdue.md b/resources/ai-kb/zh/howto/dashboard/overdue.md new file mode 100644 index 000000000..df1c7f2fd --- /dev/null +++ b/resources/ai-kb/zh/howto/dashboard/overdue.md @@ -0,0 +1,54 @@ +--- +id: dashboard.overdue.howto +title: 「超期任务」卡片用法 +type: howto +feature: dashboard +scope: end-user +locale: zh +aliases: + - 超期任务 + - 过期任务 + - 任务超期了 + - 逾期未完成 + - 超时任务 +related_tools: [list_tasks, update_task, complete_task] +related_pages: [dashboard] +prerequisites: [] +negative: + - 超期判断按用户本地时间,不同时区用户看到的列表可能差几小时 + - 没有 end_at 的任务永远不会变超期,归到「待完成」分组 + - 超期不自动改任务字段,只是前端展示分类 +last_verified: v1.7.90 +--- + +# 「超期任务」卡片用法 + +## 是什么 +仪表盘第 2 张数字卡和同名分组列表,展示当前用户作为负责人(owner=1)的、`end_at < 今天 00:00:00` 但 `complete_at IS NULL` 的任务。即「应该已经做完但还没做」的清单。 + +## 数据规则 +- end_at 比今天 0 点早 +- complete_at 为空(未完成) +- archived_at 为空(未归档) +- 当前用户是任务负责人 +- 任务按 end_at 升序(最久没做的排最前) + +## 入口 +- 桌面端:仪表盘顶部第 2 张数字卡 +- 标题色一般用红 / 警告色 +- 点卡片 → 跳转 / 展开分组 + +## 处理超期任务的常见做法 +1. **延期**:进任务详情把 end_at 推到合理时间,详见 [[task.edit.howto.basic]] +2. **完成**:补做后 [[task.complete.howto]] 标记完成 +3. **取消**:归档 [[task.archive.howto]] 或删除 [[task.delete-restore.howto]] +4. **转交**:把负责人改为他人(owner 从 1 → 0),任务从你的超期列表消失 + +## 不支持 +- 仪表盘不会"自动延期超期任务" +- 没有"延期申请"流程,改 end_at 不需要审批 +- 不能批量改一组超期任务的 end_at + +## 与「[[project.export.howto]] 超期导出」的关系 +- 仪表盘超期仅当前用户、跨项目 +- 项目级超期导出按项目维度全员任务,含他人任务 diff --git a/resources/ai-kb/zh/howto/dashboard/today.md b/resources/ai-kb/zh/howto/dashboard/today.md new file mode 100644 index 000000000..70f9ef883 --- /dev/null +++ b/resources/ai-kb/zh/howto/dashboard/today.md @@ -0,0 +1,52 @@ +--- +id: dashboard.today.howto +title: 「今日到期」卡片用法 +type: howto +feature: dashboard +scope: end-user +locale: zh +aliases: + - 今日到期 + - 今天要做的任务 + - 今日待办 + - 今天截止的任务 + - 今日任务 +related_tools: [list_tasks, complete_task] +related_pages: [dashboard] +prerequisites: [] +negative: + - "「今日到期」只算今天 00:00-23:59 的 end_at,不含明天" + - 协作任务(assist)不会出现在这里,单独走「协助的任务」 + - 完成今日任务不会立即从列表消失,需要刷新(仪表盘 600ms 后定时刷新) +last_verified: v1.7.90 +--- + +# 「今日到期」卡片用法 + +## 是什么 +仪表盘顶部「今日到期」数字 + 下方同名分组列表,展示我作为 [[task.field.owner-assist.concept]] 中 owner=1 的任务里,end_at 落在今天的、未完成、未归档的全部任务。 + +## 数据规则 +- 时间范围:`今天 00:00:00 ≤ end_at ≤ 今天 23:59:59`(按用户本地时区) +- 状态:`complete_at IS NULL` 且 `archived_at IS NULL` +- 关系:`ProjectTaskUser.owner = 1` 命中当前用户 +- 不含子任务的统计累加(每个任务独立判断) + +## 入口 +- 桌面端:仪表盘顶部第 1 张数字卡 +- 点击卡片或分组标题 → 展开 / 折叠分组 + +## 卡片中能做什么 +- 点任务行 → 进入任务详情([[task.edit.howto.basic]]) +- 行尾复选框 → 直接标记完成([[task.complete.howto]]) +- 优先级色块 / 标签可视化 + +## 完成后行为 +- 标记完成后 `complete_at` 写入当前时间 +- 600ms 后仪表盘自动刷新(防抖定时器) +- 完成项从「今日到期」列表移除,分组数字 -1 + +## 不支持 +- 不能在仪表盘里直接改 end_at(必须进任务详情) +- 不能批量勾选完成多条任务 +- 不能筛选「只看某项目的今日到期」 diff --git a/resources/ai-kb/zh/howto/dashboard/todo.md b/resources/ai-kb/zh/howto/dashboard/todo.md new file mode 100644 index 000000000..3611daa83 --- /dev/null +++ b/resources/ai-kb/zh/howto/dashboard/todo.md @@ -0,0 +1,56 @@ +--- +id: dashboard.todo.howto +title: 「待完成」卡片用法 +type: howto +feature: dashboard +scope: end-user +locale: zh +aliases: + - 待完成任务 + - 我的待办 + - 没截止时间的任务 + - 后续要做的 + - 接下来要做什么 +related_tools: [list_tasks, update_task] +related_pages: [dashboard] +prerequisites: [] +negative: + - 「待完成」既包含没设 end_at 的任务,也包含 end_at 在未来的任务 + - 协作任务(owner=0 / assist=1)不在这里,去「协助的任务」分组 + - 「待完成」数字不含子任务的累积 +last_verified: v1.7.90 +--- + +# 「待完成」卡片用法 + +## 是什么 +仪表盘第 3 张数字卡和同名分组列表,展示当前用户作为负责人的、**未到期 / 没截止时间**且未完成的任务。语义是「不紧急但还没做完的」。 + +## 数据规则 +- 当前用户是任务负责人(owner=1) +- `complete_at IS NULL` 且 `archived_at IS NULL` +- end_at 不在今天范围(与 [[dashboard.today.howto]] 互斥) +- end_at 不早于今天(与 [[dashboard.overdue.howto]] 互斥) +- 所以条件是:`end_at IS NULL` 或 `end_at >= 明天 00:00:00` + +## 入口 +- 桌面端:仪表盘顶部第 3 张数字卡 +- 数字最大的分组(多数用户的"待完成"远多于"今日到期") +- 点击卡片或分组标题 → 展开列表 + +## 列表排序 +- end_at 升序(最近要做的排前面) +- end_at 为空的排在最末 + +## 常见操作 +- 进任务详情设 end_at([[task.field.deadline.concept]])让它流到「今日到期」/「超期任务」 +- 直接 [[task.complete.howto]] 标记完成 +- 不再做了就 [[task.archive.howto]] 归档 + +## 与全局「我的任务」的区别 +- 仪表盘「待完成」:仅当前用户负责人 + 未完成 + 未在今日 / 超期 +- 全局任务列表(左侧栏「任务」):可显示已完成 + 自己创建的全部历史 + +## 不支持 +- 不能在仪表盘里直接添加新任务 +- 不能筛选 / 排序「按项目」「按优先级」(要进项目页或全局任务页操作) diff --git a/resources/ai-kb/zh/howto/data-export/approve.md b/resources/ai-kb/zh/howto/data-export/approve.md new file mode 100644 index 000000000..f3cf96c9a --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/approve.md @@ -0,0 +1,51 @@ +--- +id: data-export.approve.howto +title: 管理员侧导出审批数据 +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 后台导出审批 + - 数据导出 审批 + - 怎么从管理员入口导出审批 + - 审批数据 Excel +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 已安装 approve 插件 +negative: + - 单次导出最多 35 天范围 + - 必填流程分类(procName),不能一次导全部分类 + - 导出失败时机器人会推送错误信息,不会自动重试 +last_verified: v1.7.90 +--- + +# 管理员侧导出审批数据 + +## 入口 +桌面端:左侧栏「应用」→「数据导出」(仅管理员)→「导出审批数据」。 +对应 API:`GET api/approve/export`(限管理员)。 + +## 与审批中心自带导出的区别 +审批中心内部也有导出能力,由审批模板的负责人触发。这里讲的是**管理员后台**统一入口,按全公司流程分类拉数据,不挑模板负责人身份。 + +## 操作步骤 +1. 进入「数据导出」→ 选「导出审批数据」 +2. 选择「流程分类」(`proc_def_name`):必填,单次只能选一类 +3. 选择状态(`state`):0 全部 / 1 审批中 / 2 通过 / 3 拒绝 / 4 撤回 +4. 选择「是否完成」(`is_finished`) +5. 选择日期范围(最多 35 天) +6. 点击「导出」,文件由系统机器人 `system-msg` 私聊推送 + +## 导出字段 +申请编号、标题、申请状态、发起 / 完成时间、发起人工号、User ID、姓名、部门、部门 ID、部门负责人、历史审批人、历史办理人,以及各模板自定义字段。 + +## 数据来源 +后端调审批微服务的 `findAllProcIns` 接口拉流程实例,再翻译成行列写 Excel。微服务不通时机器人会推送错误信息。 + +## 不支持 +- 不支持选「全部分类」一次性导 +- 不支持范围超过 35 天 +- 不支持只导草稿 / 未提交单 diff --git a/resources/ai-kb/zh/howto/data-export/checkin.md b/resources/ai-kb/zh/howto/data-export/checkin.md new file mode 100644 index 000000000..e574b4987 --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/checkin.md @@ -0,0 +1,54 @@ +--- +id: data-export.checkin.howto +title: 导出签到数据 +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 导出签到 + - 考勤导出 + - 签到 Excel + - 打卡数据导出 + - 月度考勤表 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 系统设置中签到功能已开启(`checkinSetting.open = open`) +negative: + - 必须先在系统设置打开签到,否则报「此功能未开启」 + - 单次最多 100 个成员 + - 日期范围最多 35 天 + - 必填成员 / 日期 / 时间三个参数,缺一不可 +last_verified: v1.7.90 +--- + +# 导出签到数据 + +## 入口 +桌面端:左侧栏「应用」→「数据导出」(仅管理员)→「导出签到数据」。 +对应 API:`GET api/system/checkin/export`。 + +## 前置条件 +系统设置 → 签到设置 → 「开启签到功能」必须为开启;未开启会直接返回「此功能未开启,请前往系统设置开启」。 + +## 操作步骤 +1. 进入「数据导出」→ 选「导出签到数据」 +2. 选择成员(最多 100 个,必填) +3. 选择日期范围(最多 35 天,必填) +4. 选择班次时间范围,例如 09:00-18:00(必填) +5. 点击「导出」,文件由系统机器人 `system-msg` 私聊推送 + +## 导出字段 +签到人、签到日期、班次时间、首次签到时间、首次签到结果、最后签到时间、最后签到结果、参数数据。每个成员一个 Sheet。 + +## 结果判定规则 +- **首次签到**:晚于班次开始时间标「迟到」(蓝色),无记录标「缺卡」(红色) +- **最后签到**:考虑「延后时间」(默认 120 分钟)支持跨天打卡 +- 当前时间还没到班次开始 / 结束时显示 `-` + +## 不支持 +- 不支持导出无班次成员 +- 不支持跨月超 35 天一次导 +- 不支持自定义结果判定规则(用系统全局设置) diff --git a/resources/ai-kb/zh/howto/data-export/project.md b/resources/ai-kb/zh/howto/data-export/project.md new file mode 100644 index 000000000..ac703ad0d --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/project.md @@ -0,0 +1,51 @@ +--- +id: data-export.project.howto +title: 导出任务统计(按成员) +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 导出任务统计 + - 项目数据导出 + - 怎么导出成员任务 + - 按成员导出任务 + - 任务工时导出 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 单次导出最多 100 个成员,超出请分批 + - 时间范围限制最大 90 天 + - 不支持导出整个项目的所有任务(必须按成员筛选) + - 不支持选择字段,导出列固定 +last_verified: v1.7.90 +--- + +# 导出任务统计(按成员) + +## 入口 +桌面端:左侧栏「应用」→「数据导出」(仅管理员可见)→「导出任务统计」。 +对应 API:`GET api/project/task/export`。 + +## 操作步骤 +1. 进入「数据导出」→ 选「导出任务统计」 +2. 选择成员(最多 100 个) +3. 选择时间范围(最多 90 天) +4. 选择导出时间类型: + - 「任务计划时间」(默认):按任务 start_at/end_at 筛选,对无计划时间但在该范围内完成的任务用 complete_at 兜底 + - 「任务创建时间」:仅按 created_at 筛选 +5. 点击「导出」,立即返回;文件由系统机器人 `system-msg` 私聊推送 + +## 导出字段 +固定 17 列:任务 ID、父任务 ID、所属项目、标题、标签、计划开始/结束、完成时间、归档时间、计划用时、实际用时、超时时间、开发用时、验收/测试用时、负责人、创建人、状态。 + +## 拿到下载链接后 +- 链接是限时的,缓存失效后需要重新触发导出 +- 直接点击或在浏览器打开下载 Excel 文件 + +## 不支持 +- 不支持单次导出超过 100 个成员或超过 90 天的范围 +- 不支持按项目维度直接导出(只能选成员) +- 不支持定时导出 / 自定义字段 diff --git a/resources/ai-kb/zh/howto/data-export/report.md b/resources/ai-kb/zh/howto/data-export/report.md new file mode 100644 index 000000000..18bbc47df --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/report.md @@ -0,0 +1,52 @@ +--- +id: data-export.report.howto +title: 工作报告能不能批量导出 +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 工作报告导出 + - 导出汇报 + - 批量导出报告 + - 周报月报导出 Excel + - 报告 Excel +related_tools: [list_received_reports, get_report_detail] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(仅在替代方案中) +negative: + - 主程序后台没有「批量导出工作报告」入口 + - 没有 `api/report/export` 这样的接口 + - 不支持把多人多份报告打包成一个 Excel +last_verified: v1.7.90 +--- + +# 工作报告能不能批量导出 + +## 结论 +DooTask 主程序没有批量导出工作报告的功能。管理员后台「数据导出」只支持任务统计、超期任务、审批、签到 4 类,不包含工作报告。 + +## 替代方案 +如果只是要拿到报告内容,可走以下路径: + +1. 单篇查看 / 分享 + - 在「应用 → 工作报告」收到报告后打开详情,复制富文本内容 + - 用「分享」按钮把报告以消息形式转发到群聊(API `api/report/share`) + +2. AI 工具批量读取 + - 通过 MCP 工具 `list_received_reports` 列出收到的报告 + - 用 `get_report_detail` 获取单份详情 + - 让 AI 助手按时段汇总写入文档 + +3. 数据库导出 + - 仅 DBA:从 `report` 表按 `created_at` 区间导出(需要 SSH + MySQL 权限) + - 不推荐普通管理员操作 + +## 不支持 +- 不支持在产品 UI 内批量导出工作报告为 Excel +- 不支持按部门 / 成员一键拉取所有报告 + +## 相关 +- 数据导出整体能力:[[data-export.concept]] +- 入口:[[data-export.entry.menu-map]] diff --git a/resources/ai-kb/zh/howto/data-export/task.md b/resources/ai-kb/zh/howto/data-export/task.md new file mode 100644 index 000000000..c3dd18843 --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/task.md @@ -0,0 +1,53 @@ +--- +id: data-export.task.howto +title: 导出超期任务 +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 导出超期任务 + - 全系统超期任务 + - 谁的任务超期了 + - 超期任务报表 + - overdue 导出 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 导出范围是全系统所有项目,不能按项目 / 成员筛选 + - 只导出"未完成"且 end_at 已过的任务;已完成的延期任务不在内 + - 没有计划截止时间(end_at 为空)的任务不会被纳入 +last_verified: v1.7.90 +--- + +# 导出超期任务 + +## 入口 +桌面端:左侧栏「应用」→「数据导出」(仅管理员)→「导出超期任务」。 +对应 API:`GET api/project/task/exportoverdue`。 + +## 操作步骤 +1. 进入「数据导出」→ 选「导出超期任务」 +2. 弹出确认框「你确定要导出所有超期任务吗?」→ 确定 +3. 立即返回,文件由系统机器人 `system-msg` 私聊推送 + +## 导出范围 +后端定义为:`complete_at IS NULL AND end_at IS NOT NULL AND end_at <= NOW()`。也就是: +- 还没完成 +- 设置了截止时间 +- 截止时间已经过去 + +按 `end_at` 升序(最早超期的在前),分批 100 条流式写出,避免内存爆。 + +## 导出字段 +固定 11 列:任务 ID、父任务 ID、所属项目、标题、标签、开始时间、结束时间、计划用时、超时时间、负责人、创建人。 + +## 与「任务统计」的区别 +- **任务统计**:要选成员 + 时间段,含已完成 / 已归档 / 未完成全部状态,看 [[data-export.project.howto]] +- **超期任务**:无参数,只看全系统当前已超期未完成 + +## 不支持 +- 不支持按项目 / 部门筛选超期任务 +- 不支持仅导出某个成员的超期任务 diff --git a/resources/ai-kb/zh/howto/data-export/user.md b/resources/ai-kb/zh/howto/data-export/user.md new file mode 100644 index 000000000..03f37c35a --- /dev/null +++ b/resources/ai-kb/zh/howto/data-export/user.md @@ -0,0 +1,55 @@ +--- +id: data-export.user.howto +title: 用户列表能不能批量导出 +type: howto +feature: data-export +scope: admin +locale: zh +aliases: + - 用户导出 + - 成员名单导出 + - 通讯录导出 + - 导出员工列表 + - 全员表 +related_tools: [get_users_basic, search_users] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(仅在替代方案中) +negative: + - 主程序后台没有「用户/成员批量导出 Excel」功能 + - 没有 `api/users/export` 这样的接口 + - 不支持自助导出含敏感字段(手机号、邮箱)的用户表 +last_verified: v1.7.90 +--- + +# 用户列表能不能批量导出 + +## 结论 +DooTask 主程序**没有**用户列表批量导出功能。管理员后台「数据导出」仅支持任务统计、超期任务、审批、签到 4 类,不包含用户/成员名单。 + +## 替代方案 + +1. **API 拉取** + - `api/users/searchinfo` 按昵称 / 邮箱搜索 + - MCP 工具 `search_users`、`get_users_basic`(受权限管控) + - 适合脚本或机器人批量获取 + +2. **LDAP 同步反向导出** + - 如果用户来自 LDAP,可直接从 AD/LDAP 服务器导出员工目录 + +3. **数据库导出** + - 仅 DBA:从 `users`、`user_departments` 表按需导出 + - 必须遵守内部合规规范 + +## 隐私和合规 +- 用户表含手机号 / 邮箱 / 部门等敏感字段 +- 即使是系统管理员,导出全员通讯录也应有内部审批 +- 建议参考 [[compliance.concept]] 的数据保留与最小化原则 + +## 不支持 +- 不支持产品 UI 批量导出全员 Excel +- 不支持普通成员获取全员表 + +## 相关 +- 数据导出概览:[[data-export.concept]] +- 入口:[[data-export.entry.menu-map]] diff --git a/resources/ai-kb/zh/howto/desktop-notify/toggle.md b/resources/ai-kb/zh/howto/desktop-notify/toggle.md new file mode 100644 index 000000000..697568a77 --- /dev/null +++ b/resources/ai-kb/zh/howto/desktop-notify/toggle.md @@ -0,0 +1,55 @@ +--- +id: desktop-notify.toggle.howto +title: 开启或关闭桌面通知 +type: howto +feature: desktop-notify +scope: end-user +locale: zh +aliases: + - 关闭桌面通知 + - 不要桌面通知 + - 桌面通知开关 + - 怎么关弹窗 + - 通知太多 + - 静音桌面通知 +related_tools: [] +related_pages: [] +prerequisites: + - 使用 DooTask 桌面端(Electron)或 Web 版 +negative: + - DooTask 内部没有「一键关闭全部桌面通知」开关;要靠系统级勿扰或会话级免打扰 + - Web 版关闭浏览器通知后无法在 APP 内重新开启,需到浏览器设置中改 + - 关闭后 Dock 角标和任务栏闪烁仍会更新(属未读状态展示,不是通知) +last_verified: v1.7.90 +--- + +# 开启或关闭桌面通知 + +## 整体策略 +DooTask 没有 APP 内的「桌面通知总开关」。要控制弹窗,从三个层级选合适的方式: + +## 方式 1:系统级勿扰模式(推荐临时关闭) +- **macOS**:点击右上角时钟 → 启用「专注模式」/「勿扰」 +- **Windows 10/11**:操作中心 → 「专注助手」/「勿扰」 +- 系统勿扰时所有应用通知都被抑制,包括 DooTask;解除后恢复 + +## 方式 2:操作系统应用级关闭 +彻底不再收到 DooTask 桌面端通知: +- **macOS**:「系统设置 → 通知 → DooTask」→ 关闭「允许通知」 +- **Windows**:「设置 → 系统 → 通知和操作」→ 找到 DooTask → 关闭 +- **Linux**:依发行版而定,一般在 GNOME / KDE 通知设置 +- 详见 [[desktop-notify.permission.faq]] + +## 方式 3:DooTask 会话级免打扰(推荐针对个别群) +只对某个会话不弹通知: +- 桌面端:消息列表 → 右键目标会话 →「免打扰」 +- 详见 [[push-notice.silent.howto]] +- 该方式同时影响移动端推送和未读邮件 + +## 重新开启 +- 系统勿扰:在系统通知设置中关闭勿扰开关 +- 系统应用通知:在系统设置中重新允许 DooTask 通知 +- 会话免打扰:消息列表右键再次取消免打扰 + +## Web 版补充 +浏览器需在 DooTask 首次询问通知权限时点「允许」。点过「禁止」后只能在浏览器地址栏左侧锁图标 → 站点设置 → 通知 改回「允许」。 diff --git a/resources/ai-kb/zh/howto/drawio/create.md b/resources/ai-kb/zh/howto/drawio/create.md new file mode 100644 index 000000000..0eb2aa30b --- /dev/null +++ b/resources/ai-kb/zh/howto/drawio/create.md @@ -0,0 +1,60 @@ +--- +id: drawio.create.howto +title: 创建流程图 +type: howto +feature: drawio +scope: end-user +locale: zh +aliases: + - 怎么建流程图 + - 新建 drawio + - 创建图表 + - 加一张流程图 + - drawio 怎么开 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 drawio 插件 + - 当前用户对目标文件夹/项目文件区有「编辑」权限 +negative: + - 不能在任务详情页直接「附件 → 新建流程图」,需先在文件页创建再链接 + - 同一张图同一时间不支持多人并发编辑(后保存方覆盖前保存方) + - 创建后无法把 `drawio` 文件转成 `mind` 或 `word` 文件 +last_verified: v1.7.90 +--- + +# 创建流程图 + +## 入口 +流程图作为「文件」存在,入口都在文件页: + +- 桌面端:左侧栏「文件」→ 选定目标文件夹 → 右上角「新建」按钮 →「图表」 +- 桌面端(右键):文件列表空白处右键 →「新建」→「图表」 +- 移动端:底部 Tabbar「文件」→ 进入目标文件夹 → 右下角「+」→「图表」 +- 项目文件:进入项目 →「文件」标签页 → 新建菜单 →「图表」 + +> 文件新建菜单里命名为「图表」,文件类型字段是 `drawio`,对应文件图标也是 drawio 风格。 + +## 操作步骤 +1. 点击「新建 → 图表」,文件列表多出一个待命名行 +2. 输入文件名(≤ 100 字符),回车保存 +3. 双击或单击文件名进入编辑器 +4. 在 drawio 编辑器中绘图:左侧拖拽图形库,画布上连接、编辑文本 +5. 编辑器内自动保存,关闭即可 + +## 字段默认值 +- 文件名:默认「未命名」 +- 模板:默认空白画布(可在 drawio 内通过菜单插入图形) +- 主题:跟随 DooTask 当前主题(深色/浅色)和语言 + +## 导出 +- 在 drawio 编辑器内:菜单 「File → Export As」选择 PNG/PDF/JPG 等 +- 导出依赖插件内置的 export-server,若安装不全会导出失败 + +## 不支持 +- 不支持直接从云端模板拷贝(每次新建都是空白画布) +- 不能在任务附件区直接「新建图表」,需先在文件页建好再附加 + +## 相关 +- 入口与权限:[[drawio.entry.menu-map]] +- 内置模板:[[drawio.template.concept]] diff --git a/resources/ai-kb/zh/howto/electron-client/auto-start.md b/resources/ai-kb/zh/howto/electron-client/auto-start.md new file mode 100644 index 000000000..fc41739ca --- /dev/null +++ b/resources/ai-kb/zh/howto/electron-client/auto-start.md @@ -0,0 +1,70 @@ +--- +id: electron-client.auto-start.howto +title: 桌面端开机自启 +type: howto +feature: electron-client +scope: end-user +locale: zh +aliases: + - 开机自启 + - 自动启动 + - 开机就打开 + - 开机自动运行 + - 登录时启动 + - 启动项 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 桌面端在客户端内**没有**「开机自启」开关,需在操作系统侧配置 + - Linux 不同发行版的自启配置方式差异较大,需自行写 desktop / systemd 配置 + - 开机自启不代表自动登录,首次启动仍需输入账号 +last_verified: v1.7.90 +--- + +# 桌面端开机自启 + +## 总览 +DooTask 桌面端**没有内置「开机自启」开关**,需要在操作系统的启动项里手动添加。以下分平台说明。 + +## macOS + +### 方式 1:通过 Dock +1. App 运行起来后,在 Dock 上右键 DooTask 图标 +2. 「选项」→「登录时打开」打钩 + +### 方式 2:系统设置 +1. 系统设置 → 「通用」→「登录项」 +2. 「在登录时打开」点 `+` +3. 选 Applications 里的 DooTask.app + +## Windows + +### 方式 1:启动文件夹 +1. `Win + R` 输入 `shell:startup` 回车 +2. 把桌面的 DooTask 快捷方式复制 / 拖入打开的文件夹 + +### 方式 2:任务管理器 +1. `Ctrl + Shift + Esc` 打开任务管理器 +2. 切到「启动应用」标签 +3. 找到 DooTask 设为「已启用」(适用于已被系统识别为启动项的情况) + +### 方式 3:注册表(进阶) +HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 下新增字符串值指向 DooTask.exe 路径。 + +## Linux + +### Ubuntu / GNOME +1. 打开「Startup Applications」(命令 `gnome-session-properties`) +2. 「Add」→ Name 填 DooTask,Command 填 `/opt/DooTask/dootask`(或安装路径) + +### 通用 systemd user service +在 `~/.config/systemd/user/dootask.service` 写 unit,然后 `systemctl --user enable dootask`。 + +## 关闭开机自启 +按上述路径反向操作(取消勾选 / 从启动文件夹删除 / 注册表删除)。 + +## 不支持 +- 客户端内无开机自启按钮(future 可能加 `app.setLoginItemSettings` 接口) +- 不支持「开机静默后台启动」(开机会弹出主窗口) +- Linux 各发行版无统一方案 diff --git a/resources/ai-kb/zh/howto/electron-client/download.md b/resources/ai-kb/zh/howto/electron-client/download.md new file mode 100644 index 000000000..0a3543ba3 --- /dev/null +++ b/resources/ai-kb/zh/howto/electron-client/download.md @@ -0,0 +1,73 @@ +--- +id: electron-client.download.howto +title: 下载安装桌面端 +type: howto +feature: electron-client +scope: end-user +locale: zh +aliases: + - 下载桌面端 + - 安装客户端 + - 桌面端去哪下 + - 怎么装客户端 + - 客户端下载 + - 桌面版安装包在哪 +related_tools: [] +related_pages: [] +prerequisites: + - 已知服务器地址(管理员告知或公司内网约定) +negative: + - 安装包并非内置在服务器,通常由 GitHub Releases 或运维提供下载链接 + - macOS 首次启动遇「无法打开,因为它来自身份不明的开发者」需在系统设置允许 + - Windows 装到非默认目录需勾选「允许更改安装目录」 +last_verified: v1.7.90 +--- + +# 下载安装桌面端 + +## 下载渠道 +桌面端安装包通常通过以下渠道获取: +- **GitHub Releases**:`https://github.com/kuaifan/dootask/releases` 找最新版的 `Assets` +- **公司内网**:有的部署方会自建下载页或挂在公司云盘 +- **服务器侧链接**:部分私有部署会在登录页底部加「下载客户端」链接 + +## 选择安装包 +按 [[electron-client.platforms.concept]] 确认对应架构,常见匹配: +- Mac(Apple Silicon)→ `DooTask-v*-mac-arm64.dmg` +- Mac(Intel)→ `DooTask-v*-mac-x64.dmg` +- Windows → `DooTask-v*-win-x64.exe` + +## 安装步骤 + +### macOS(.dmg) +1. 双击 dmg 文件挂载 +2. 将 DooTask 图标拖到 Applications 文件夹 +3. 首次启动若提示「无法打开」:系统设置 → 「隐私与安全性」→ 底部「仍要打开」 + +### macOS(.pkg) +1. 双击 pkg 一路点「继续」即可,适合需要部署到 `/Applications` 全局位置的场景 + +### Windows(.exe / NSIS) +1. 双击安装包 +2. 接受协议 +3. 选安装位置(默认 `C:\Program Files\DooTask`) +4. 完成后桌面会有 DooTask 快捷方式 + +### Linux(.deb) +```bash +sudo dpkg -i DooTask-v*-linux-amd64.deb +``` + +### Linux(.rpm) +```bash +sudo rpm -ivh DooTask-v*-linux-x86_64.rpm +``` + +## 首次启动配置 +1. 启动 DooTask 后输入**服务器地址**(如 `https://dootask.公司域名/`) +2. 输入账号密码登录 +3. 后续启动会自动登录到上次的服务器 + +## 不支持 +- 安装包内不带服务器,必须有可访问的 DooTask 后端 +- 不支持同一台机器同时安装多个版本(会冲突,需先卸载旧版) diff --git a/resources/ai-kb/zh/howto/electron-client/uninstall.md b/resources/ai-kb/zh/howto/electron-client/uninstall.md new file mode 100644 index 000000000..83d87d5fd --- /dev/null +++ b/resources/ai-kb/zh/howto/electron-client/uninstall.md @@ -0,0 +1,79 @@ +--- +id: electron-client.uninstall.howto +title: 卸载桌面端 +type: howto +feature: electron-client +scope: end-user +locale: zh +aliases: + - 卸载桌面端 + - 卸载客户端 + - 删除 DooTask + - 彻底删除 + - 清理桌面端 + - 重装前清理 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 标准卸载不会删除用户数据(配置、登录态);需手动清理 + - 卸载不会注销服务器侧登录,需要在网页端 / 移动端手动登出 + - 服务器上的项目、任务、聊天数据与本地无关,不会被卸载影响 +last_verified: v1.7.90 +--- + +# 卸载桌面端 + +## 入口与步骤 + +### macOS +1. 退出 DooTask(菜单 → 「DooTask」→「退出」或 Cmd + Q) +2. 打开 Finder → 「应用程序」 +3. 找到 DooTask 拖到「废纸篓」 +4. 清空废纸篓 + +### Windows +1. 退出 DooTask(托盘右键 → 退出) +2. 「设置」→「应用」→「应用和功能」(或控制面板 → 程序与功能) +3. 列表找到 DooTask → 「卸载」 +4. 跟随卸载向导完成 + +### Linux(deb) +```bash +sudo apt remove dootask +# 或同时清掉配置 +sudo apt purge dootask +``` + +### Linux(rpm) +```bash +sudo rpm -e dootask +``` + +## 清理残留数据 +默认卸载不会删除以下个人数据,如需彻底清理需手动删: + +- **macOS**: + - 配置:`~/Library/Application Support/DooTask/` + - 日志:`~/Library/Logs/DooTask/` + - 缓存:`~/Library/Caches/DooTask/` +- **Windows**: + - 配置 / 日志:`%USERPROFILE%\AppData\Roaming\DooTask\` + - 缓存:`%USERPROFILE%\AppData\Local\DooTask\` +- **Linux**: + - 配置:`~/.config/DooTask/` + - 缓存:`~/.cache/DooTask/` + +## 卸载前是否需要注销 +**建议先注销**:在客户端内手动点头像 → 退出登录,再卸载。否则: +- 服务器侧仍记录该设备的登录令牌(过期前可被攻击者复用) +- 推送服务可能继续向该设备投递,造成路由失败日志 + +## 重装提示 +- 卸载后保留数据再重装,会自动恢复登录态、设置 +- 完全干净重装请按上面「清理残留数据」清空目录 + +## 不支持 +- 不支持「一键卸载并清理所有数据」按钮 +- 不支持「卸载时自动注销服务器登录」(请提前手动) +- 不支持远程拉黑客户端(只能在管理员后台禁用账号) diff --git a/resources/ai-kb/zh/howto/electron-client/update.md b/resources/ai-kb/zh/howto/electron-client/update.md new file mode 100644 index 000000000..e3bb09bd9 --- /dev/null +++ b/resources/ai-kb/zh/howto/electron-client/update.md @@ -0,0 +1,62 @@ +--- +id: electron-client.update.howto +title: 升级桌面端 +type: howto +feature: electron-client +scope: end-user +locale: zh +aliases: + - 桌面端升级 + - 客户端更新 + - 怎么升级桌面端 + - 升级新版本 + - 自动更新 + - 手动更新 + - 桌面端有新版本 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 自动更新需要服务器侧配置了更新源(electron-updater feed URL),否则只能手动 + - 自动更新下载完成后必须重启 App 才生效,不会热替换 + - 客户端版本独立于服务器主程序版本,两者各有发布节奏 +last_verified: v1.7.90 +--- + +# 升级桌面端 + +## 升级方式概览 +桌面端基于 `electron-updater`,支持「自动检查 + 手动确认下载 + 退出时安装」三段流程,也允许完全手动重装。 + +## 自动更新(推荐) +默认情况下: +1. App 启动后向更新源查询是否有新版 +2. 有新版会在系统通知或客户端右上角提示「发现新版本」 +3. 用户点「立即下载」开始下载(默认不自动下载,避免占带宽) +4. 下载完成后弹窗提示「是否立即重启安装」 +5. 选「重启」立即装并重开;选「稍后」会在下次退出时自动装 + +## 手动检查更新 +- 客户端菜单 → 「检查更新」(macOS 通常在「DooTask」菜单,Windows 通常在右上角菜单) +- 客户端右上角头像 → 「关于 DooTask」→「检查更新」 + +## 完全手动升级 +当自动更新源不可达(企业内网封了 GitHub): +1. 从 [[electron-client.download.howto]] 中提到的渠道下载新版安装包 +2. macOS:直接覆盖拖到 Applications,会替换旧版本 +3. Windows:运行新版安装程序,会自动覆盖 +4. Linux:`sudo dpkg -i`(deb)或 `sudo rpm -Uvh`(rpm) + +## 看当前版本 +- macOS:菜单 → 「DooTask」→「关于 DooTask」 +- Windows / Linux:右上角头像下拉 → 「关于 DooTask」 +- 个人设置页底部也会显示 + +## 升级后数据 +- 配置 / 登录态保留(存放在 `electron-store` 用户目录) +- 不会覆盖个人聊天记录、文件(本地无业务数据,都在服务器) + +## 不支持 +- 不支持「跨大版本回退」(降级需手动重装旧包,不保证账号兼容) +- 不支持「不重启热更新」 +- 自动更新失败不会反复重试,需手动再点检查 diff --git a/resources/ai-kb/zh/howto/electron-client/window.md b/resources/ai-kb/zh/howto/electron-client/window.md new file mode 100644 index 000000000..02db79cb1 --- /dev/null +++ b/resources/ai-kb/zh/howto/electron-client/window.md @@ -0,0 +1,58 @@ +--- +id: electron-client.window.howto +title: 桌面端多窗口与分屏 +type: howto +feature: electron-client +scope: end-user +locale: zh +aliases: + - 多窗口 + - 分屏 + - 多开 + - 拖出窗口 + - 任务独立窗口 + - 同时开两个会话 + - 怎么开新窗口 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 同一账号不支持「同一台机器开两个 DooTask 实例」(electron-squirrel-startup 单例锁) + - 拖出的子窗口共享同一份登录态,不能各自登不同账号 + - 关闭主窗口后子窗口的行为取决于具体功能,部分会一并关闭 +last_verified: v1.7.90 +--- + +# 桌面端多窗口与分屏 + +## 多窗口能力概览 +DooTask 桌面端支持把部分功能从主窗口拖出成独立窗口,便于在多显示器或大屏上同时查看多份内容。窗口管理由内置的 `web-tab-manager` 负责。 + +## 入口 +不同功能的拖出方式略有差异,常见路径: +- **会话窗口**:聊天会话标签上右键 → 「在新窗口打开」 +- **任务详情**:任务详情面板右上角 → 弹出窗口图标 +- **文件预览**:文件双击直接在独立媒体窗口打开(图片 / 视频) +- **应用 / 微应用**:应用入口右键 → 「在新窗口打开」 + +## 操作步骤 +1. 在主窗口找到目标内容(会话、任务、文件) +2. 选中目标 → 右键菜单或顶部「弹出窗口」图标 +3. 子窗口独立打开,可自由拖到另一显示器 +4. 关闭子窗口不影响主窗口 + +## 分屏使用建议 +- 把主聊天窗口放主屏,把任务详情拖到副屏长开 +- 把会议窗口拖到副屏,主屏继续工作 +- 文件预览窗口可同时打开多个(不互相覆盖) + +## Tab 行为 +主窗口内部使用 Tab 管理消息会话: +- 顶部聊天 Tab 横向排列 +- Tab 右键 → 「关闭」/「关闭其他」/「在新窗口打开」 +- Tab 数量较多时会自动滚动 + +## 不支持 +- 不支持同账号多客户端实例(electron-squirrel-startup 防多开) +- 不支持子窗口独立登录(继承主窗口账号) +- 不支持把主窗口完全拆分成多个独立窗口(主窗口必须保留) diff --git a/resources/ai-kb/zh/howto/email-notice/config.md b/resources/ai-kb/zh/howto/email-notice/config.md new file mode 100644 index 000000000..12c697a48 --- /dev/null +++ b/resources/ai-kb/zh/howto/email-notice/config.md @@ -0,0 +1,55 @@ +--- +id: email-notice.config.howto +title: 配置邮件 SMTP 服务器 +type: howto +feature: email-notice +scope: admin +locale: zh +aliases: + - 配置 SMTP + - 设置邮箱服务器 + - 邮件配置 + - SMTP 怎么配 + - 系统怎么发邮件 + - 邮箱设置 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 已申请到 SMTP 账号(如 qq / 阿里云邮 / 自建邮件服务) +negative: + - 当环境变量 SYSTEM_SETTING=disabled 时禁止从界面修改邮箱设置 + - 不支持选择 SSL/TLS 加密方式,默认使用 STARTTLS(端口决定) + - 密码字段不能为空(即便部分 SMTP 服务允许匿名) +last_verified: v1.7.90 +--- + +# 配置邮件 SMTP 服务器 + +## 入口 +桌面端:左侧栏「管理后台」→「系统设置」→「邮箱」选项卡 + +## 操作步骤 +1. 「邮箱服务器设置」区填写: + - SMTP 服务器(如 `smtp.exmail.qq.com`) + - 端口(25 / 465 / 587 视服务商) + - 账号(完整邮箱地址,做发件人和登录名) + - 密码(一般是邮箱授权码,非登录密码) +2. 点「邮件发送测试」按钮验收(详见 [[email-notice.send-test.howto]]) +3. 在「邮件通知设置」区按需开启「注册验证」「消息提醒」 +4. 在「忽略邮箱地址」区可填入不发邮件的地址清单(换行分隔) +5. 底部「提交」保存 + +## 关键字段 +| 字段 | 说明 | 默认 | +|---|---|---| +| reg_verify | 开启后新账号需验证邮箱、改邮箱要验证码 | close | +| notice_msg | 开启后会按规则发未读消息汇总邮件 | close | +| msg_unread_user_minute | 单聊未读多少分钟后发邮件,-1=不发 | -1 | +| msg_unread_group_minute | 群聊未读多少分钟后发邮件,-1=不发 | -1 | +| msg_unread_time_ranges | 仅在这些时间段内允许发未读邮件 | 空 | +| ignore_addr | 忽略地址列表 | 空 | + +## 不支持 +- DooTask 不内置邮件服务器,必须接外部 SMTP +- 修改后立即生效,无需重启 diff --git a/resources/ai-kb/zh/howto/email-notice/send-test.md b/resources/ai-kb/zh/howto/email-notice/send-test.md new file mode 100644 index 000000000..25e783465 --- /dev/null +++ b/resources/ai-kb/zh/howto/email-notice/send-test.md @@ -0,0 +1,55 @@ +--- +id: email-notice.send-test.howto +title: 测试邮件发送 +type: howto +feature: email-notice +scope: admin +locale: zh +aliases: + - 邮件发送测试 + - 测试邮件 + - 检查 SMTP + - 验证邮箱设置 + - 邮件不通怎么测 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 已在表单内填好 SMTP 服务器/端口/账号/密码 +negative: + - 测试邮件用的是表单当前未保存的值,不强制要求先保存 + - 测试不会落库到任何日志表,失败信息只在前端弹窗显示 + - 收件人为忽略地址列表中的邮箱会立即报错「收件人地址错误或已被忽略」 +last_verified: v1.7.90 +--- + +# 测试邮件发送 + +## 入口 +桌面端:左侧栏「管理后台」→「系统设置」→「邮箱」选项卡 →「邮件发送测试」按钮 + +## 操作步骤 +1. 在「邮箱服务器设置」区填好 SMTP 服务器、端口、账号、密码 +2. 点「邮件发送测试」按钮 +3. 弹窗输入收件人地址(任意有效邮箱,建议用自己的能收信的邮箱) +4. 点确定,系统调 `api/system/email/check` 接口尝试发送一封测试邮件 +5. 成功:弹「成功发送」;失败:弹具体错误信息 + +## 测试邮件内容 +- 主题:Mail sending test +- 正文:「收到此电子邮件意味着您的邮箱配置正确。」(按系统语言翻译) +- 发件人:「系统别名 」 + +## 常见错误码与含义 +| 提示 | 含义 | +|---|---| +| 请输入正确的收件人地址 | 收件邮箱格式不合法 | +| 收件人地址错误或已被忽略 | 收件人在 `ignore_addr` 忽略列表里 | +| 邮件发送超时,请检查邮箱配置是否正确 | SMTP 连接超时,可能服务器/端口错误或网络阻断 | +| 邮件内容被拒绝(550)| 邮件被对方拒收,可能收件邮箱不接收外部邮件 | +| 其他错误信息 | 一般是 SMTP 服务返回的原始错误,按文案定位 | + +## 不支持 +- 不能批量发测试(每次输入一个收件人) +- 不能自定义测试邮件主题/正文 +- 收不到不一定是 SMTP 配置错,详见 [[email-notice.troubleshoot.faq]] diff --git a/resources/ai-kb/zh/howto/email-notice/user-opt.md b/resources/ai-kb/zh/howto/email-notice/user-opt.md new file mode 100644 index 000000000..2579d9a43 --- /dev/null +++ b/resources/ai-kb/zh/howto/email-notice/user-opt.md @@ -0,0 +1,48 @@ +--- +id: email-notice.user-opt.howto +title: 用户侧关闭邮件通知 +type: howto +feature: email-notice +scope: end-user +locale: zh +aliases: + - 不想收邮件 + - 关闭邮件通知 + - 退订邮件 + - 取消邮件提醒 + - 邮件太多 + - 怎么不收邮件 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 普通用户没有「一键退订」开关,只能联系管理员把邮箱加入「忽略地址」 + - 不能按场景细分订阅(如「只关 SMTP 未读邮件、保留验证邮件」) + - 把账号邮箱清空不可行——系统多处校验需要邮箱(注册验证、密码重置) +last_verified: v1.7.90 +--- + +# 用户侧关闭邮件通知 + +## 入口 +DooTask 没有给普通用户开放「邮件通知开关」。控制权在管理员手里,普通用户只能通过两种方式间接调整。 + +## 减少邮件量的办法 +1. **请管理员将你加入忽略地址** + - 联系系统管理员 + - 管理员在「系统设置 → 邮箱 → 忽略邮箱地址」追加你的邮箱(换行分隔) + - 之后所有系统邮件(含未读汇总)都不会发给你 +2. **请管理员调整未读时间阈值** + - 调高 `msg_unread_user_minute / msg_unread_group_minute`(如改为 120 分钟,意味只汇总两小时未读) + - 或把任一值改为 -1 完全关闭该类型邮件 +3. **请管理员收紧时间范围** + - 缩短 `msg_unread_time_ranges`(如只允许工作时间 09:00-18:00 发邮件) + +## 你自己能做的 +- 及时阅读消息:邮件汇总只发**未读**消息,及时读完后续就不再触达 +- 已被列入忽略地址的邮箱:注册验证、改邮箱、删账号等验证码邮件**也收不到**,慎用 + +## 不支持 +- 不支持用户级邮件订阅开关 +- 不支持按消息类型分别退订 +- 不提供邮件底部退订链接 diff --git a/resources/ai-kb/zh/howto/favorite/add.md b/resources/ai-kb/zh/howto/favorite/add.md new file mode 100644 index 000000000..6813c7654 --- /dev/null +++ b/resources/ai-kb/zh/howto/favorite/add.md @@ -0,0 +1,54 @@ +--- +id: favorite.add.howto +title: 收藏一个对象 +type: howto +feature: favorite +scope: end-user +locale: zh +aliases: + - 怎么收藏任务 + - 收藏项目 + - 收藏文件 + - 收藏消息 + - 加星 + - 怎么加收藏 +related_tools: [] +related_pages: [task_detail, project_detail, file, messenger] +prerequisites: + - 当前用户对被收藏对象有可见权限 +negative: + - 不能批量收藏多个对象,一次只能加一个 + - 不能替别人收藏(收藏仅对自己生效) + - 没有「收藏分组」「收藏夹」概念,全部进同一个列表 +last_verified: v1.7.90 +--- + +# 收藏一个对象 + +## 支持的对象类型 +- **任务(task)**:项目下的任意任务 +- **项目(project)**:自己加入或可见的项目 +- **文件(file)**:文件柜中的文件 +- **消息(message)**:群聊 / 私聊中的某条消息 + +## 操作步骤 +进入对应对象的详情页或操作菜单,点击「收藏 / 加星」按钮即可。同一按钮再次点击为取消收藏(toggle 语义,见 [[favorite.remove.howto]])。 + +- 任务:任务详情页 → 顶部「⋯」菜单 →「收藏」 +- 项目:项目详情页 → 顶部「⋯」菜单 →「收藏项目」 +- 文件:文件详情 / 文件柜右键 →「收藏」 +- 消息:长按 / 右键消息气泡 →「收藏」 + +## 添加备注(可选) +收藏成功后,进入「我的收藏」(见 [[favorite.list.howto]])列表,点击对应行的「备注」字段可编辑: + +- ≤ 255 字符 +- 备注仅本人可见,可随时修改清空 + +## 接口行为 +后端使用 toggle 接口(`POST api/users/favorite/toggle`),传 `type` 与 `id`;已收藏则取消,未收藏则添加。前端按钮态由 `users/favorite/check` 实时回查。 + +## 不支持 +- 不能批量收藏;每次操作一个对象 +- 收藏不通知他人;不会出现在动态中 +- 不能给收藏排序 / 分组 / 打标签 diff --git a/resources/ai-kb/zh/howto/favorite/list.md b/resources/ai-kb/zh/howto/favorite/list.md new file mode 100644 index 000000000..0f7d08dfd --- /dev/null +++ b/resources/ai-kb/zh/howto/favorite/list.md @@ -0,0 +1,65 @@ +--- +id: favorite.list.howto +title: 查看我的收藏 +type: howto +feature: favorite +scope: end-user +locale: zh +aliases: + - 我的收藏在哪 + - 怎么打开收藏夹 + - 查看收藏列表 + - 收藏的任务在哪看 + - 收藏的文件 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 收藏列表不能跨账号同步(每个账号独立) + - 不支持按收藏时间范围筛选(只能按类型过滤) + - 不支持导出收藏列表 +last_verified: v1.7.90 +--- + +# 查看我的收藏 + +## 入口 +- 桌面端:左侧栏「应用」→「我的收藏」卡片 +- 移动端:底部 Tabbar「应用」→「我的收藏」 + +打开后进入「我的收藏」管理弹窗。详细入口位置见 [[favorite.entry.menu-map]]。 + +## 列表内容 +弹窗顶部按收藏类型筛选,默认显示「全部类型」。可切换: + +- **全部类型**:四种类型混合按收藏时间倒序 +- **任务**:显示任务名、所属项目、当前流程列、收藏时间 +- **项目**:显示项目名、描述、是否归档 +- **文件**:显示文件名、大小、扩展名、所在目录 +- **消息**:显示消息预览、所属对话、消息类型 + +## 字段说明 +| 字段 | 含义 | +|---|---| +| 名称 | 对象主名(任务名 / 项目名 / 文件名 / 消息预览) | +| 来源 | 任务的项目、文件的目录、消息的对话 | +| 备注 | 个人备注,≤ 255 字符,可双击编辑 | +| 收藏时间 | favorited_at | +| 操作 | 跳转 / 编辑备注 / 取消收藏 | + +## 分页与搜索 +- 分页:默认每页 20 条,可选 10 / 20 / 30 / 50 / 100 +- 搜索:通过顶部「收藏类型」下拉做类型过滤,不支持按名称模糊搜索 + +## 跳转规则 +点击列表中的对象会跳到对应详情: + +- 任务 → 任务详情弹窗 +- 项目 → 项目详情页 +- 文件 → 文件预览或下载 +- 消息 → 对应对话定位到该消息 + +## 不支持 +- 不能搜索收藏名称 / 备注关键词 +- 不能调整收藏顺序(固定按时间倒序) +- 不能给收藏分组或加标签 diff --git a/resources/ai-kb/zh/howto/favorite/remove.md b/resources/ai-kb/zh/howto/favorite/remove.md new file mode 100644 index 000000000..47a914853 --- /dev/null +++ b/resources/ai-kb/zh/howto/favorite/remove.md @@ -0,0 +1,53 @@ +--- +id: favorite.remove.howto +title: 取消收藏 +type: howto +feature: favorite +scope: end-user +locale: zh +aliases: + - 取消收藏 + - 移除收藏 + - 取消加星 + - 删除收藏 + - 怎么取消我的收藏 +related_tools: [] +related_pages: [application, task_detail, project_detail] +prerequisites: [] +negative: + - 取消收藏不会删除原对象本身(任务 / 项目 / 文件 / 消息 都还在) + - 取消后无法撤销,再次收藏需重新点击 + - 不支持批量取消所有收藏(接口存在但前端未暴露入口) +last_verified: v1.7.90 +--- + +# 取消收藏 + +## 两种入口 +取消收藏与添加收藏共用一个 toggle 接口,已收藏的对象再次操作即为取消。 + +### 在对象本身上取消 +进入已收藏对象(任务 / 项目 / 文件 / 消息)的详情或右键菜单,点击「取消收藏」/「取消加星」按钮。按钮文字会根据当前收藏态变化。 + +### 在「我的收藏」列表中取消 +入口:左侧栏「应用」→「我的收藏」(见 [[favorite.entry.menu-map]]) + +操作步骤: +1. 顶部「收藏类型」筛选到对应类型(任务 / 项目 / 文件 / 消息) +2. 找到目标行 +3. 点击该行的「取消收藏」操作按钮 +4. 列表中该行立即消失 + +## 效果 +- 收藏关系从 `user_favorites` 表删除 +- 备注一同丢失,无法恢复 +- 原任务 / 项目 / 文件 / 消息本体不受影响 +- 不会通知任何人 + +## 与「最近打开」的区别 +取消收藏只移除「我的收藏」记录,**不影响「最近打开」**。最近打开是系统按浏览时间维护的独立列表,见 [[favorite.recent.concept]]。 + +## 不支持 +- 不支持「一键清空全部收藏」前端按钮(后端 cleanUserFavorites 存在但未暴露) +- 取消后无回收站,不可撤销 +- 不能恢复历史收藏(如对象已被删除) diff --git a/resources/ai-kb/zh/howto/file/create.md b/resources/ai-kb/zh/howto/file/create.md new file mode 100644 index 000000000..1c6faf6a0 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/create.md @@ -0,0 +1,56 @@ +--- +id: file.create.howto +title: 新建文件夹 / 在线文档 / 表格 / 思维导图 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 新建文件夹 + - 建文档 + - 在线表格 + - 怎么建思维导图 + - 新建空白文件 + - 加一个文档 +related_tools: [list_files] +related_pages: [file] +prerequisites: + - 当前文件夹有写权限 +negative: + - "文件名长度 2-100 字符;不能包含特殊字符(反斜杠、斜杠、冒号、星号、问号、双引号、尖括号、竖线)" + - 单个文件夹下最多 300 个直接子项 + - mind / drawio 需要管理员在应用市场安装 minder / drawio 插件,否则无法保存 + - word / excel / ppt 新建空白文件需要 office 插件(OnlyOffice) +last_verified: v1.7.90 +--- + +# 新建文件夹 / 在线文档 / 表格 / 思维导图 + +## 入口 +- 桌面端 Web:进入「文件」页 → 任意文件夹内 → 顶部「+」按钮 +- 移动端:「文件」页右上角「+」 + +## 可新建的类型 +点击「+」后弹出菜单,可选: + +- **folder**:文件夹 +- **document**:在线文档(Markdown 富文本,扩展名 md) +- **word / excel / ppt**:在线 Office 文档(需要 office 插件,扩展名 docx / xlsx / pptx) +- **mind**:思维导图(需要 minder 插件,扩展名 mind) +- **drawio**:流程图 / 架构图(需要 drawio 插件,扩展名 drawio) + +## 操作步骤 +1. 选择类型 +2. 输入文件名(必填,2-100 字符,不能含 `\ / : * ? " < > |`) +3. 回车或点确认;系统检测同名时会自动加上 `(2)`、`(3)` 等后缀 +4. 文档类型创建后自动打开编辑器,可立即编辑 + +## 字段默认值 +- 拥有者:所在文件夹的拥有者(共享文件夹内则归该文件夹的所有者) +- 创建人:当前用户 +- 父目录:当前所在文件夹 + +## 不支持 +- 不支持新建 PDF / 图片 / 压缩包等二进制类型(只能上传) +- 不支持批量新建(一次只能建一个) +- 不支持复制文件夹(只能复制单个文件,详见上传后用复制功能) diff --git a/resources/ai-kb/zh/howto/file/delete-restore.md b/resources/ai-kb/zh/howto/file/delete-restore.md new file mode 100644 index 000000000..fc92ee0a6 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/delete-restore.md @@ -0,0 +1,56 @@ +--- +id: file.delete-restore.howto +title: 删除文件或恢复文件 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 删文件 + - 怎么删文档 + - 删了能恢复吗 + - 文件回收站 + - 恢复删掉的文件 + - 文件还原 +related_tools: [list_files] +related_pages: [file] +prerequisites: + - 对要删除的文件有所有权或写权限 +negative: + - 文件删除采用软删除(数据库 soft delete),但前端无回收站 UI,普通用户无法自助恢复 + - 一次最多删除 100 个文件 / 文件夹 + - 删文件夹会级联删除其内所有文件与子文件夹 + - 删除会同时清理共享配置(FileUser)和分享链接(FileLink) +last_verified: v1.7.90 +--- + +# 删除文件或恢复文件 + +## 入口 +- 桌面端 Web:选中文件 / 文件夹 → 顶部「删除」按钮,或右键「删除」 +- 桌面端:Delete 键(选中后) +- 移动端:长按文件 → 菜单「删除」 + +## 删除操作步骤 +1. 选中目标(多选最多 100 个) +2. 点「删除」,弹出二次确认 +3. 确认后事务执行: + - 文件软删除(`deleted_at` 标记) + - 子文件、子文件夹递归软删除 + - FileUser(共享配置)与 FileLink(分享链接)随之失效 + +## 恢复机制 +- 数据层:删除采用 Laravel SoftDeletes,记录保留在数据库 +- 前端层:**没有回收站界面**,普通用户无法在产品内自助恢复 +- 紧急恢复:联系系统管理员,通过数据库恢复 `deleted_at`;超管也可直接在数据库改 + +## 删除文件夹的连锁影响 +- 文件夹下所有文件、子文件夹全部软删 +- 共享给他人的链接全部失效 +- 任务里引用了该文件的「关联文件」不会自动清理,会显示「文件不存在或已被删除」 + +## 不支持 +- 没有用户可见的回收站 / 已删除列表 +- 不支持取消删除(已点确认后无法在界面回滚) +- 删除后无法长期找回:约 30 天后定时任务会清理本地物理文件(具体周期由系统设置决定) +- 不支持批量删除超过 100 项 diff --git a/resources/ai-kb/zh/howto/file/move.md b/resources/ai-kb/zh/howto/file/move.md new file mode 100644 index 000000000..8b7c6a14a --- /dev/null +++ b/resources/ai-kb/zh/howto/file/move.md @@ -0,0 +1,49 @@ +--- +id: file.move.howto +title: 移动文件或文件夹 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 文件搬位置 + - 把文件挪到另一个文件夹 + - 怎么移动文件 + - 改文件位置 + - 文件归档到子目录 +related_tools: [list_files] +related_pages: [file] +prerequisites: + - 对源文件和目标文件夹都有写权限 +negative: + - 一次最多移动 100 个项目 + - 已共享的文件 / 文件夹不能移入另一个共享文件夹(避免共享嵌套) + - 含共享内容的文件夹不能移入共享文件夹(同上) + - 不能移到自己的子文件夹(会循环引用) + - 移到共享文件夹后,文件拥有者(userid)会改为共享根的拥有者 +last_verified: v1.7.90 +--- + +# 移动文件或文件夹 + +## 入口 +- 桌面端 Web:选中一个或多个文件 → 顶部「移动」按钮,或右键「移动到...」 +- 桌面端 Web:直接拖拽到左侧文件树某文件夹 +- 移动端:长按文件 → 菜单「移动」 + +## 操作步骤 +1. 选中要移动的文件 / 文件夹(多选支持 Ctrl/Cmd + 点击,最多 100 个) +2. 点「移动」按钮,弹出文件夹选择器 +3. 选择目标文件夹(可层层进入);选「根目录」放回自己的根 +4. 确认后系统校验权限与共享冲突,通过则原子事务移动 + +## 移动到共享文件夹时 +- 文件的拥有者会改为共享根的所有者 +- 子文件夹内所有文件的拥有者一并更新 +- 已经在共享状态的文件不能这么移(会被拒绝) + +## 不支持 +- 不支持跨用户私有空间移动(必须有目标方写权限) +- 含共享文件的文件夹移入另一个共享(会报「内含共享文件,无法移动」) +- 不能移到自己的子目录(会报「移动位置错误」) +- 不支持一次性 ≥ 100 个的批量移动 diff --git a/resources/ai-kb/zh/howto/file/public-link.md b/resources/ai-kb/zh/howto/file/public-link.md new file mode 100644 index 000000000..684751170 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/public-link.md @@ -0,0 +1,53 @@ +--- +id: file.public-link.howto +title: 文件公开访问链接 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 文件链接分享 + - 把文件发给别人看 + - 公开链接 + - 外链 + - 链接给客户 + - 给一个文件 URL + - 游客访问 +related_tools: [get_file_detail] +related_pages: [file] +prerequisites: + - 对该文件有访问权限(看自己的或共享给自己的) +negative: + - 链接默认仅登录用户可访问;游客访问需要在链接设置中显式打开 guest_access + - 链接不支持设置访问期限 / 密码 / 访问次数上限 + - 刷新链接后旧链接立即失效,没有过渡期 + - 链接路径中包含 file_id + userid + 随机串,base64 编码,不要泄露 +last_verified: v1.7.90 +--- + +# 文件公开访问链接 + +## 入口 +- 桌面端 Web:选中文件 → 右键 / 「···」→「分享链接」 / 「获取链接」 +- 桌面端 Web:文件预览页右上角「分享」按钮 + +## 操作步骤 +1. 触发「获取链接」,系统按当前用户为该文件生成 FileLink 记录(首次) +2. 链接形如 `https://your-domain.com/single/file/` +3. 复制链接发给目标方 +4. 如需失效旧链接:勾选「刷新链接」再次生成,旧 code 立即作废 +5. 如允许未登录访问:开启「允许游客访问」(guest_access = yes) + +## 访问行为 +- 登录用户点链接:进入文件预览页,受文件本身权限校验 +- 游客访问:仅当 `guest_access=1` 时直接预览,否则跳登录 +- 每次访问 num 计数 +1,可在分享设置看到累计访问数 + +## 关于"内容获取" +- 给 MCP / AI 用:可用工具按文件路径获取文本内容(fetch_file_content),支持分页 + +## 不支持 +- 链接没有过期时间设置(除非手动刷新或删文件) +- 不支持加访问密码 +- 不支持限制总访问次数 +- 同一用户对同一文件只有一个链接(再次获取返回同一个 code) diff --git a/resources/ai-kb/zh/howto/file/rename.md b/resources/ai-kb/zh/howto/file/rename.md new file mode 100644 index 000000000..6ae205222 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/rename.md @@ -0,0 +1,48 @@ +--- +id: file.rename.howto +title: 重命名文件或文件夹 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 改文件名 + - 文件改名 + - 怎么重命名 + - 改名字 + - 改文件夹名 +related_tools: [list_files, get_file_detail] +related_pages: [file] +prerequisites: + - 拥有该文件 / 文件夹的写权限(自己创建的或共享读写) +negative: + - 文件名长度仍受 2-100 字符限制 + - 同目录下若已存在同名同后缀文件,系统会自动加 (2) / (3) 后缀(不会覆盖也不会报错) + - 不支持批量重命名(一次只能改一个) + - 不能改扩展名(如 docx 改 pdf),扩展名由文件类型决定 +last_verified: v1.7.90 +--- + +# 重命名文件或文件夹 + +## 入口 +- 桌面端 Web:在「文件」列表中右键文件 / 文件夹 →「重命名」 +- 桌面端 Web:选中后点击列表项的「···」→「重命名」 +- 桌面端:F2 快捷键(选中后) +- 移动端:长按文件项 → 弹出菜单「重命名」 + +## 操作步骤 +1. 触发重命名,文件名进入可编辑状态(或弹出输入框) +2. 输入新名称(2-100 字符,不能含 `\ / : * ? " < > |`) +3. 回车保存,或点空白处取消 +4. 若同名冲突,系统自动追加 `(2)`、`(3)` 等后缀 + +## 同步范围 +- 改名会通过 WebSocket 实时推送给所有有权访问的人 +- 共享文件夹内重命名,所有共享成员都能立即看到新名 + +## 不支持 +- 改名不改扩展名(in-place rename 不影响 `ext` 字段) +- 不支持批量改名(如批量加前缀) +- 不支持回滚改名(没有历史记录) +- 非所有者不能修改共享文件夹的根文件夹名称(仅文件夹所有者可改) diff --git a/resources/ai-kb/zh/howto/file/search.md b/resources/ai-kb/zh/howto/file/search.md new file mode 100644 index 000000000..cafb6d847 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/search.md @@ -0,0 +1,53 @@ +--- +id: file.search.howto +title: 搜索文件 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 找文件 + - 搜文件 + - 按名字搜 + - 文档搜索 + - 文件内容搜 + - 找之前传的文件 +related_tools: [search_files, intelligent_search] +related_pages: [file] +prerequisites: [] +negative: + - 「文件」页内置搜索只匹配文件名 / 文件 ID,不搜文件内容 + - 文件内容搜索需走全局搜索(Manticore 索引),仅文档类与文本类文件被索引 + - 单次返回最多 100 条,默认 50 条 + - 搜索范围 = 自己的文件 + 共享给自己的文件,不跨他人私有空间 +last_verified: v1.7.90 +--- + +# 搜索文件 + +## 入口 +- 桌面端 Web:「文件」页顶部搜索框,输入即筛选 +- 全局搜索:顶部全局搜索框(放大镜)→ 切换「文件」标签 +- AI 助手:调用 search_files 工具按关键词检索 + +## 文件名搜索(文件页内置) +1. 在「文件」页顶部输入关键词 +2. 系统按 `name LIKE %关键词%` 匹配(包含匹配,不分词) +3. 如果关键词是纯数字,会同时尝试按文件 ID 精确匹配 +4. 同时搜索:自己的文件 + 他人共享给自己的文件 +5. 单次返回最多 100 条 + +## 通过分享链接反查 +搜索框可粘贴分享链接(如 `https://t.../single/file/xxxxxx`),系统会解析 code 反查到对应文件。 + +## 文件内容搜索(全局搜索) +- 入口:全局搜索框 → 选择「文件」标签 +- 索引由 Manticore 提供,仅文档类(document / txt / code / pdf 抽取出的文本)被索引 +- office 文件(doc/xls/ppt)已索引后可按内容关键词命中 +- 图片可走 OCR(extract_image_text 工具)后再搜索 + +## 不支持 +- 不支持模糊匹配 / 拼音搜索 +- 不支持跨用户隐私空间搜索 +- 不支持二进制文件(压缩包 / 视频)的内容搜索 +- 不支持自定义文件搜索结果排序(默认按权重) diff --git a/resources/ai-kb/zh/howto/file/share.md b/resources/ai-kb/zh/howto/file/share.md new file mode 100644 index 000000000..981c1dbc5 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/share.md @@ -0,0 +1,55 @@ +--- +id: file.share.howto +title: 文件协作权限(共享给他人) +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 文件共享 + - 共享文件夹 + - 给同事看我的文件 + - 文件权限设置 + - 让别人改我的文档 + - 协作编辑 +related_tools: [list_files, get_file_detail] +related_pages: [file] +prerequisites: + - 仅文件所有者可设置共享(不是创建者,是 userid 字段所示的拥有者) +negative: + - 不能在已有共享文件夹内的子文件 / 子文件夹单独再共享(嵌套共享被拒绝) + - 单个共享对象最多 100 个成员 + - 共享只能选「只读」或「读写」两档,没有「评论」「仅看链接」等中间档 + - 共享后文件夹内所有子文件的拥有者保持不变(不会迁移) +last_verified: v1.7.90 +--- + +# 文件协作权限(共享给他人) + +## 入口 +- 桌面端 Web:选中文件 / 文件夹 → 右键 / 「···」→「共享设置」 +- 桌面端 Web:在文件列表的「共享」段点开已共享项 → 设置图标 + +## 操作步骤 +1. 进入共享设置弹窗 +2. 添加协作成员:在搜索框选用户(可多选) +3. 选择权限: + - **只读**(permission=0):只能浏览 / 下载 + - **读写**(permission=1):可编辑 / 上传 / 在共享文件夹内新建 +4. 点「确定」保存;被共享方在自己的「文件」页「共享」段就能看到 + +## 共享数据结构 +- 共享记录存在 `file_users` 表,每条 = 一个文件 × 一个用户 × 一个权限 +- 文件的 `share` 字段标记本身是否为共享根;`pshare` 指向其所在的共享根 ID +- 共享根之下所有子文件、子文件夹自动继承共享 + +## 共享后能做什么 +- 共享文件夹内可以创建新文件 / 上传文件(权限为读写时) +- 共享成员看到的拥有者仍是原拥有者 +- 退出共享:被共享方在自己文件页对该文件 →「退出共享」 + +## 不支持 +- 嵌套共享(已在共享文件夹内的子项不能单独再共享) +- 共享给「所有人」(userid=0)的链接,被共享方不能退出 +- 不支持单个共享 ≥ 100 个成员 +- 共享权限没有「评论」/「仅查看链接」/「下载禁止」等中间档 diff --git a/resources/ai-kb/zh/howto/file/upload.md b/resources/ai-kb/zh/howto/file/upload.md new file mode 100644 index 000000000..d22575d73 --- /dev/null +++ b/resources/ai-kb/zh/howto/file/upload.md @@ -0,0 +1,53 @@ +--- +id: file.upload.howto +title: 上传文件 +type: howto +feature: file +scope: end-user +locale: zh +aliases: + - 怎么传文件 + - 上传文档 + - 把文件传上去 + - 拖进来 + - 上传到网盘 +related_tools: [list_files] +related_pages: [file] +prerequisites: + - 当前所在文件夹有写权限(自己的文件夹或共享读写权限) +negative: + - 同一用户在同一目录下并发上传会自动排队(避免数据库死锁),慢但不会丢 + - 单个文件夹直接子项上限 300,超出会报错 + - 不支持上传文件夹后保留文件夹下原有空目录(空目录会被忽略) + - 不支持断点续传,超大文件请先压缩 +last_verified: v1.7.90 +--- + +# 上传文件 + +## 入口 +- 桌面端 Web:进入「文件」页 → 任意文件夹内 → 顶部「+」→「上传文件」 / 「上传文件夹」 +- 桌面端 Web:直接把文件拖入页面任意位置 +- 桌面端 Electron:拖入应用窗口 +- 移动端:「文件」页右上角「+」→「上传文件」(受系统相册 / 文件选择器限制) + +## 操作步骤 +1. 进入目标文件夹(顶部面包屑确认位置) +2. 选择文件或直接拖入(支持多选) +3. 系统自动按扩展名识别类型(word / excel / picture / archive 等),保存到 `uploads/file//<年月>//` +4. 若同名同后缀文件已存在,可选「保留两个」(默认)或「覆盖」(cover 参数 1) + +## 上传文件夹 +- 拖入整个文件夹时,系统会自动按 `webkitRelativePath` 重建文件夹结构 +- 路径中每一级文件夹会自动创建(已存在则复用) +- 空目录会被忽略(只创建有文件的层级) + +## 字段默认值 +- 拥有者(userid):当前文件夹的拥有者(避免共享目录混乱) +- 父目录:当前所在文件夹 +- 版本:上传产生一条新的 FileContent 记录(详见 [[file.version.concept]]) + +## 不支持 +- 无法向直接子项 ≥ 300 的文件夹继续上传(会被拒绝) +- 不支持断点续传 / 分片上传(超大文件建议先压缩) +- 不支持移动端后台续传(应用切到后台可能中断) diff --git a/resources/ai-kb/zh/howto/kpi/create.md b/resources/ai-kb/zh/howto/kpi/create.md new file mode 100644 index 000000000..3e5adc867 --- /dev/null +++ b/resources/ai-kb/zh/howto/kpi/create.md @@ -0,0 +1,69 @@ +--- +id: kpi.create.howto +title: 创建绩效考核 +type: howto +feature: kpi +scope: end-user +locale: zh +aliases: + - 怎么发起考核 + - 新建考核 + - 创建 KPI + - 录入绩效指标 + - 给员工打分 + - 怎么做 KPI 评估 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 kpi 插件 + - 当前账号在 KPI 中是 HR 或 manager 角色 +negative: + - 普通员工(employee)不能发起考核,只能填写自己的考核 + - 每个考核只能提交一次异议(HR 处理后才能再次提交) + - 仅 HR 可配置绩效规则(权重比例) +last_verified: v1.7.90 +--- + +# 创建绩效考核 + +## 入口 +- 桌面端:左侧栏「应用」→「绩效考核」(对应 URL `apps/kpi`) +- 移动端:底部 Tabbar「应用」→「绩效考核」 +- 在 KPI 首页 / 考核管理页面有新建入口 + +## 角色与权限 +- **HR**:完整流程,可创建考核、选模板、被考核人、邀请评分人、处理异议 +- **manager(部门主管)**:可发起对下属的考核 +- **employee**:只能在收到考核后填写自评,不能发起新考核 + +## 操作步骤 +1. 打开「绩效考核」页面 +2. 在考核管理界面点击新建按钮 +3. 选择 KPI 模板(模板由 HR 在「KPI 模板」中维护) +4. 选择被考核人员(一个或多个) +5. 设置考核周期 / 截止时间 +6. 提交后系统自动通知被考核人进入「自评」环节 + +## 完整考核流程 +1. **创建考核**:HR 或主管发起 +2. **员工自评**:员工填写自我评价并打分 +3. **主管评估**:主管打分并写反馈 +4. **邀请评分**(可选):HR 邀请第三方多角度打分 +5. **HR 审核**:依据绩效规则计算最终分 +6. **员工确认**:员工查看并确认最终得分 +7. **异议处理**(可选):员工在「待确认」时提交异议,HR 处理后调分 + +## 邀请评分(可选) +- HR 在主管评估完成后可发起邀请评分 +- 被邀请人可选择接受 / 拒绝;接受后对各项指标客观打分 +- 评分结果仅 HR 可查看完整详情(保密性) + +## 不支持 +- 已在「待确认」之前的状态不能提交异议 +- 邀请评分的被评估员工本人不参与邀请评分过程 +- 普通员工无法看到他人评分明细 + +## 相关 +- KPI 是什么:[[kpi.concept]] +- 评分机制 / 权重:[[kpi.scoring.concept]] +- 入口在哪:[[kpi.entry.menu-map]] diff --git a/resources/ai-kb/zh/howto/ldap/config.md b/resources/ai-kb/zh/howto/ldap/config.md new file mode 100644 index 000000000..a09a7a2ea --- /dev/null +++ b/resources/ai-kb/zh/howto/ldap/config.md @@ -0,0 +1,79 @@ +--- +id: ldap.config.howto +title: 配置 LDAP +type: howto +feature: ldap +scope: admin +locale: zh +aliases: + - 配置 LDAP + - 接入 LDAP + - LDAP 怎么填 + - LDAP 参数 + - 接入 AD + - LDAP host + - LDAP 端口 + - 登录属性 + - 测试 LDAP 连接 + - LDAP 验证失败 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 已部署可达的 LDAP / AD + - 已准备好管理员 Bind DN + 密码 + Base DN +negative: + - SYSTEM_SETTING=disabled 时禁止保存配置 + - 端口未填或非法时会被强制设为 389 + - 登录属性枚举受限,不在白名单内的值会回退为 cn + - 测试连接接口只对当前请求生效,不会落库 +last_verified: v1.7.90 +--- + +# 配置 LDAP + +## 入口 +桌面端:左上角头像 →「系统设置」→「第三方接入」(LDAP 配置区在此)。 +对应后端:`POST api/system/setting/thirdaccess`,`type` 可取 `save` / `testldap`。 + +## 字段清单 + +| 字段 | 含义 | 备注 | +|---|---|---| +| ldap_open | 总开关 | open / close | +| ldap_host | 服务器域名/IP | 不带 schema | +| ldap_port | 端口 | 默认 389(LDAPS 一般 636)| +| ldap_user_dn | 管理员 Bind DN | 如 cn=admin,dc=example,dc=com | +| ldap_password | 管理员密码 | 不可明文展示在前端 | +| ldap_base_dn | 搜索基准 DN | 如 ou=users,dc=example,dc=com | +| ldap_login_attr | 登录用属性 | cn / uid / mail / sAMAccountName / userPrincipalName | +| ldap_sync_local | 本地→LDAP 反向同步 | open / close,默认 close | + +只接收上述字段,其他键会被服务端剔除。 + +## 操作步骤 + +1. 进入「第三方接入」 +2. 「LDAP 开关」选 `open` +3. 依次填写 host / port / 管理员 DN + 密码 / Base DN +4. 选择登录属性: + - 标准 OpenLDAP:通常 `cn` 或 `uid` + - Windows AD:通常 `sAMAccountName`(用户登录名)或 `userPrincipalName`(user@domain) +5. 是否同步本地:本地账号反向写入 LDAP 时打开(仅在登录/注册触发,不主动批量推送) +6. 点击「测试」按钮(前端调用 `type=testldap`): + - 不入库,只用当前表单字段尝试用管理员 DN + 密码做 Bind + - 成功 →「验证通过」 + - 失败 →「验证失败」(带 LDAP 异常) +7. 测试通过后点击「保存」(`type=save`) + +## 测试连接细节 +`type=testldap` 调用 `LdapRecord` 的 `Container::getDefaultConnection()` 临时设置参数 → `auth()->attempt(user_dn, password)`: +- 成功:返回成功消息 +- 失败:捕获 `LdapRecordException` 返回错误消息 + 默认连接配置(便于排查) + +具体排错见 [[ldap.troubleshoot.faq]]。 + +## 不支持 +- 不能配置多个 LDAP 域 +- 测试连接只能用管理员账号验通绑定,无法替用户名验通 +- 没有「指定 OU 同步过滤」更细的 LDAP filter 字段 diff --git a/resources/ai-kb/zh/howto/ldap/sync.md b/resources/ai-kb/zh/howto/ldap/sync.md new file mode 100644 index 000000000..9c2cc2f9f --- /dev/null +++ b/resources/ai-kb/zh/howto/ldap/sync.md @@ -0,0 +1,79 @@ +--- +id: ldap.sync.howto +title: 同步 LDAP 用户 +type: howto +feature: ldap +scope: admin +locale: zh +aliases: + - 同步 LDAP + - LDAP 同步用户 + - 同步本地到 LDAP + - 用户怎么进来 + - LDAP 怎么把人导进来 + - 双向同步 + - LDAP 同步部门 +related_tools: [] +related_pages: [] +prerequisites: + - 已完成 LDAP 配置并测试通过 + - 「LDAP 开关」为 open +negative: + - DooTask 不主动批量拉取 LDAP 用户,所有同步都是登录 / 注册时按需触发 + - 不支持把 LDAP 的组织架构(OU)一键导入到 DooTask 部门表 + - 反向同步只在「ldap_sync_local=open」时生效 + - 本地用户改密码后不会自动同步密码到 LDAP(密码字段写入仅在用户首次反向同步时) +last_verified: v1.7.90 +--- + +# 同步 LDAP 用户 + +## 同步模式 +DooTask 的 LDAP 同步是**被动 + 按需**两种: + +1. **LDAP → DooTask(默认)**:用户在 DooTask 登录页输入域账号 + 密码 → 后端经 LDAP 认证成功 → 自动建/合并本地账号 +2. **DooTask → LDAP(可选)**:开关 `ldap_sync_local=open` 时,本地用户首次登录会反向把账号写到 LDAP + +两种模式互不阻塞,可同时启用。 + +## LDAP → DooTask(自动) +触发:用户在 DooTask 登录页输入域账号 + 密码。 + +流程(`LdapUser::userLogin`): + +1. 用管理员 Bind 在 Base DN 下搜索 `loginAttr=用户输入用户名` +2. 找不到 → 登录失败 +3. 找到 → 用「entry 的 DN + 用户输入的密码」二次 Bind +4. 二次 Bind 成功 → 从 entry 抽取邮箱(按 `mail` → `cn` → `uid` → `userPrincipalName` 顺序) +5. 邮箱为空 → 抛 `ApiException('LDAP 用户缺少邮箱属性,请联系管理员配置')` +6. 邮箱存在 → 本地按 email 查 user: + - 不存在 → `User::reg(email, 随机密码)` 自动注册 + - 存在但不是 LDAP 用户 → 在本地账号上打 `ldap` identity,与 LDAP 合并 +7. 同步 LDAP entry 的 `displayName` 到 `user.nickname` +8. 同步 LDAP entry 的 `jpegPhoto` 到 `uploads/user/ldap/{userid}.jpeg` + +## DooTask → LDAP(反向) +触发:本地用户登录或注册时,且 `ldap_sync_local=open`。 + +流程(`LdapUser::userSync`): + +1. 跳过已是 LDAP 身份的用户 +2. 用本地 email 在 LDAP 找 entry,已存在则不重复写 +3. 不存在则在 LDAP 根据 Base DN 创建 entry,属性包含: + - `cn / sn / uid / mail = email` + - `userPassword = 用户当前密码(仅本次有效,下次改密码不会自动同步)` + - `displayName = nickname` + - `jpegPhoto = 当前头像二进制(若存在)` +4. 本地账号加上 `ldap` identity 表示已纳管 + +## 同步不到用户怎么办 +1. 核对 LDAP 设置(「应用」→ 管理员应用「LDAP」):地址、端口、Base DN、User DN 及密码,点「测试链接」验证 +2. 确认网络 / 防火墙放通 DooTask 到 LDAP 的端口 +3. LDAP 用户在**登录时**才同步创建,不是批量预同步;让用户用域账号登录一次即可出现 +4. 详细排查见 [[ldap.troubleshoot.faq]] + +## 不支持 +- 没有「同步所有 LDAP 用户到 DooTask」的批量按钮 +- 没有「同步部门 / OU」功能 +- 不同步成员关系、群组、角色 +- 不会自动执行删除 / 更新:`userDelete / userUpdate` 需要主程序业务流程主动调用 diff --git a/resources/ai-kb/zh/howto/license/apply.md b/resources/ai-kb/zh/howto/license/apply.md new file mode 100644 index 000000000..665d61e70 --- /dev/null +++ b/resources/ai-kb/zh/howto/license/apply.md @@ -0,0 +1,77 @@ +--- +id: license.howto +title: 申请与录入 License +type: howto +feature: license +scope: super-admin +locale: zh +aliases: + - 申请 License + - 录入 License + - 怎么填 License + - 提交 License + - 上传授权 + - License 填哪里 + - 终端绑定 + - 怎么扩容用户数 +related_tools: [] +related_pages: [] +prerequisites: + - 需要进入「系统设置」→「License」页面(仅管理员可见) + - 保存 License 仅超级管理员(第一个注册用户)可执行 +negative: + - 不能在终端外部直接编辑 License 文件,必须走管理端 API + - 一份 License 仅对当前终端的 SN + MAC 有效,换机或换网卡需重新申请 + - 不支持把 License 拆给多个独立部署共享 +last_verified: v1.7.90 +--- + +# 申请与录入 License + +## 入口 +桌面端:左上角头像 →「系统设置」→「License」(仅管理员可见)。 +对应后端:`POST api/system/license`,`type=save` 写入。 + +## 操作步骤 + +### 第 1 步 - 获取当前终端信息 +在「License」页面顶部,DooTask 会显示: + +- **doo_sn** — 终端 SN(机器指纹,每次部署生成) +- **macs** — 当前服务器网卡 MAC 列表(用于绑定校验) +- **doo_version** — 当前主程序版本号 +- **user_count** — 当前真实用户数(剔除机器人和禁用号) + +这些字段是申请 License 时必须提供给签发方的信息。 + +### 第 2 步 - 申请 License +访问 DooTask 官网(或销售渠道)提交: +- 终端 SN(必填) +- 终端 MAC(一张或多张) +- 期望的最大用户数 +- 期望的有效期 +- 是否需要按 SN 严格绑定 + +收到 License 原文(加密字符串)后进入下一步。 + +### 第 3 步 - 录入 License +1. 把官方返回的 License 原文整段复制 +2. 粘贴到「License」页的输入框 +3. 点击「保存」(接口字段 `license`,调用 `type=save`) +4. 后端用 `Doo::licenseSave()` 写入终端 License 文件 +5. 页面自动刷新校验结果:`info` 字段重新解析,`error` 数组为空表示通过 + +## 校验结果解读 +返回结构里 `error` 数组列出当前不满足的规则: + +- `终端SN与License不匹配` — License 对应的 SN ≠ 当前 doo_sn(多发生在换机迁移) +- `终端MAC与License不匹配` — License MAC 名单与本机网卡无交集 +- `终端用户数超过License限制` — `user_count > people`,需要扩容或停用账号 +- `终端License已过期` — `expired_at` 已经过去 + +详细处理见 [[license.expire.faq]]。 + +## 不支持 +- 普通管理员能看 License 信息但不能保存;只有超级管理员(id=1)能 save +- 不支持上传文件方式,仅接受文本字段 +- 3 人以下的部署不强制 License,但用户数严格限制为 3 diff --git a/resources/ai-kb/zh/howto/meeting/audio-video.md b/resources/ai-kb/zh/howto/meeting/audio-video.md new file mode 100644 index 000000000..7fd5cab61 --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/audio-video.md @@ -0,0 +1,56 @@ +--- +id: meeting.audio-video.howto +title: 入会前设置麦克风和摄像头 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 入会麦克风设置 + - 入会摄像头设置 + - 默认开麦 + - 默认开摄像头 + - 静音入会 + - 不开视频入会 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 系统不会记住上次入会的麦克风 / 摄像头偏好,每次进入都需重新勾选 + - 不支持选择具体设备(如多个麦克风 / 摄像头),由浏览器默认设备决定 + - 不支持入会前看到自己的预览画面 +last_verified: v1.7.90 +--- + +# 入会前设置麦克风和摄像头 + +## 入口 +在「新会议」或「加入会议」对话框底部的设备勾选区: + +- 「麦克风」复选框(默认勾选) +- 「摄像头」复选框(默认不勾选) + +## 操作步骤 +1. 触发新会议或加入会议入口(详见 [[meeting.create.howto]] / [[meeting.join.howto]]) +2. 在弹出的对话框底部,根据需要勾选或取消「麦克风」「摄像头」 +3. 点「开始会议 / 加入会议」按钮 + +## 进入会议后切换 +- 会议窗口底部第一个按钮(麦克风图标):点击切换静音 / 取消静音 +- 会议窗口底部第二个按钮(摄像头图标):点击切换关闭 / 打开摄像头 +- 图标会随状态变化(划线表示关闭) + +## 浏览器权限 +- 首次开启麦克风 / 摄像头时浏览器会弹权限请求,必须允许 +- 桌面客户端(Electron)首次也需放行系统级麦克风 / 摄像头权限 +- 系统级权限被拒后,相应按钮点击无效,需到系统设置 →「隐私 → 麦克风 / 摄像头」放行 + +## 通过分享链接加入时的默认值 +- 链接里可携带 `audio=1` / `video=1` 查询参数,预先勾选对应设备 +- 例如 `/meeting/XXX/YYY?audio=1&video=1` +- 访客打开时这两项会自动勾上,仍可手动取消 + +## 不支持 +- 不能在入会前预览自己的摄像头画面 +- 不能在 DooTask 内选择具体麦克风 / 摄像头设备(由操作系统/浏览器默认设备决定) +- 不支持虚拟背景、美颜、降噪等增强功能 diff --git a/resources/ai-kb/zh/howto/meeting/chat.md b/resources/ai-kb/zh/howto/meeting/chat.md new file mode 100644 index 000000000..c8facce74 --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/chat.md @@ -0,0 +1,50 @@ +--- +id: meeting.chat.howto +title: 会议中的文字消息 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 会议聊天 + - 会议里发文字 + - 会议群消息 + - 会议讨论 + - 会议消息卡片 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 当前版本会议窗口内没有独立的文字聊天面板 + - 会议结束后再发的消息不会再关联到这场会议 +last_verified: v1.7.90 +--- + +# 会议中的文字消息 + +## 是什么 +DooTask 会议使用 `MeetingMsg` 表把会议相关的消息卡片与具体的 `meetingid` 和对话 `dialog_id` 绑定。一场会议涉及以下三种典型消息卡片: + +- 「会议邀请」卡片:发起 / 邀请时由 `meeting-alert` 系统机器人推送给被邀请人 +- 「会议进行中」卡片:在被邀请人对话中保持「进行中」状态 +- 「会议已结束」卡片:会议结束后由系统异步更新为已结束态 + +## 在哪里看到这些消息 +- 与发起人或被邀请人的「私聊对话」里能看到上述卡片 +- 群聊默认不会出现会议卡片(除非从该群发起会议) + +## 想在会议中和参会人即时聊天 +- 离开会议窗口,到对应对话里发普通消息(最常见做法) +- 桌面端可使用「最小化」按钮把会议浮窗收到一边,回到对话发消息 + +## 字段说明 +| 字段 | 含义 | +|---|---| +| meetingid | 会议号 | +| dialog_id | 卡片所在对话 | +| msg_id | 对话消息 ID(关联到 WebSocketDialogMsg) | + +## 不支持 +- 会议窗口内部没有内嵌的群组聊天面板 +- 不支持会议内点对点私聊 +- 不支持向会议外的人广播会议中的消息 diff --git a/resources/ai-kb/zh/howto/meeting/close.md b/resources/ai-kb/zh/howto/meeting/close.md new file mode 100644 index 000000000..dfe8e701c --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/close.md @@ -0,0 +1,55 @@ +--- +id: meeting.close.howto +title: 结束会议 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 怎么结束会议 + - 退出会议 + - 离开会议 + - 关闭会议 + - 挂断会议 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 没有「主持人结束所有人」按钮,离开仅离开自己 + - 即使发起人离开,只要还有人在房间,会议仍继续 + - 房间清空后约 10 分钟会议才被系统标记为已结束(非即时) +last_verified: v1.7.90 +--- + +# 结束会议 + +## 自己离开 +- 桌面端:会议窗口底部「离开会议」按钮(红色) +- 移动端竖屏:底部红色挂断图标 +- 弹出确认框「确定要离开会议吗?」→ 选「退出」即可 + +## 会议房间何时真正关闭 +DooTask 没有「结束所有人」操作。房间自然关闭由后端定时任务 `CloseMeetingRoomTask` 接管: + +1. 每 10 分钟跑一次 +2. 扫描所有未结束(`end_at` 为空)且 10 分钟未活动的会议 +3. 调用 Agora API 检查频道是否还有人 +4. 若已空,将 `end_at` 写为当前时间 +5. 把所有相关会议消息卡片更新为「已结束」状态并推送到对话 + +## 离开后状态 +- 自己回到上一个页面 / 对话 +- 其他参会人仍在会议中 +- 你重新通过会议号或链接还能再次加入(前提会议未关闭) + +## 异常关闭 +- 网络断开:客户端会自动重连;超过重试上限后视为离开 +- 浏览器关页:等同主动离开 +- 服务端配置错误(缺 appid / secret):定时任务不会执行,房间不自动关 + +## 不支持 +- 不能手动「立即结束并踢掉所有人」 +- 不能在结束的会议上「续会」(需新建一个会议) + +## 相关 +- 关于访客离开:[[meeting.tourist.concept]] diff --git a/resources/ai-kb/zh/howto/meeting/create.md b/resources/ai-kb/zh/howto/meeting/create.md new file mode 100644 index 000000000..b0166b2e0 --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/create.md @@ -0,0 +1,64 @@ +--- +id: meeting.create.howto +title: 新建会议 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 怎么开会议 + - 发起会议 + - 创建会议 + - 新建视频会议 + - 开个会 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已开启会议功能并配置 appid / app_certificate +negative: + - 会议主题不填会自动用「<昵称> 发起的会议」 + - 单次会议邀请成员最多 20 人 + - 创建后不能修改会议主题,只能离开重开 +last_verified: v1.7.90 +--- + +# 新建会议 + +## 入口 +- 桌面端:左上角「新建任务」按钮旁的「+」下拉菜单 →「新会议」(快捷键 Cmd/Ctrl + J) +- 桌面端:左侧栏「应用」→「在线会议」卡片 +- 桌面端:对话窗口输入区「展开(+)」→「新会议」(会预填该会话成员) +- 移动端:底部 Tabbar「+」→「新会议」 + +## 操作步骤 +1. 弹出「新会议」对话框 +2. 填写「会议主题」(选填,≤50 字) +3. 在「邀请成员」选择联系人(可选;最多 20 人,自动包含自己) +4. 勾选入会前默认开启的设备:「麦克风」「摄像头」(麦克风默认勾选) +5. 点击「开始会议」按钮 + +## 创建后会发生什么 +- 系统生成 11 位 `meetingid` 作为会议频道 ID +- 自动给所有被邀请人发送一张「会议邀请」消息卡片 +- 立即进入会议室(全屏窗口) +- 桌面客户端会另开一个会议子窗口 + +## 他人怎么加入 +- 被邀请人点会议邀请卡片加入 +- 任何成员也可在「+」下拉菜单 →「加入会议」,输入「会议频道 ID」加入 + +## 字段默认值 +| 字段 | 默认 | +|---|---| +| 会议主题 | `<昵称> 发起的会议` | +| 邀请成员 | 仅自己 | +| 麦克风 | 开 | +| 摄像头 | 关 | + +## 不支持 +- 不能预定将来时间的会议(只能即时发起) +- 不能在创建后修改主题 + +## 相关 +- 邀请更多人:[[meeting.invite.howto]] +- 生成访客链接:[[meeting.share.howto]] diff --git a/resources/ai-kb/zh/howto/meeting/from-dialog.md b/resources/ai-kb/zh/howto/meeting/from-dialog.md new file mode 100644 index 000000000..0c980ab35 --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/from-dialog.md @@ -0,0 +1,56 @@ +--- +id: meeting.from-dialog.howto +title: 从对话窗口发起会议 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 在聊天里开会议 + - 对话里发起会议 + - 群里开会 + - 私聊开会议 + - 边聊天边开会 +related_tools: [] +related_pages: [] +prerequisites: + - 已经打开一个对话(私聊或群聊) +negative: + - 群聊中发起会议会自动预填群内所有非机器人成员(最多 20 人) + - 私聊中发起会议默认只邀请对方一人,加上自己 + - 群聊大于 20 人时只能选择部分成员加入 +last_verified: v1.7.90 +--- + +# 从对话窗口发起会议 + +## 入口 +在任一对话(私聊或群聊)窗口: + +- 桌面端:聊天输入框右侧「展开(+)」工具按钮 →「新会议」 +- 移动端:输入区「+」按钮 →「新会议」 +- 桌面端会话 / 联系人列表:右键某联系人 →「发起会议」(仅向该联系人发起) + +## 操作步骤 +1. 打开目标对话 +2. 点击输入框右侧的「展开(+)」按钮 +3. 在弹出菜单选择「新会议」 +4. 系统自动加载当前会话成员(**不含机器人**;私聊为对方 + 自己)填入邀请名单 +5. 弹出「新会议」对话框,可调整邀请成员 +6. 填写会议主题(可选),勾选麦克风 / 摄像头 +7. 点击「开始会议」按钮 + +## 与普通新建会议的区别 +| 项目 | 全局「+」新建 | 对话内发起 | +|---|---|---| +| 邀请名单 | 默认只有自己 | 自动预填会话成员 | +| 会议卡片去向 | 仅被邀请人 | 同时落到当前对话 | +| 适用场景 | 通用 | 紧接对话讨论 | + +## 不支持 +- 群成员超过 20 人时无法一次全部邀请,需分批或在会议中再用「邀请」按钮([[meeting.invite.howto]]) +- 不支持把会议固定到群顶部(会议消息卡片仍是普通消息) + +## 相关 +- 新建会议基础流程:[[meeting.create.howto]] +- 会议中邀请更多人:[[meeting.invite.howto]] diff --git a/resources/ai-kb/zh/howto/meeting/invite.md b/resources/ai-kb/zh/howto/meeting/invite.md new file mode 100644 index 000000000..ae408de6a --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/invite.md @@ -0,0 +1,50 @@ +--- +id: meeting.invite.howto +title: 邀请成员加入会议 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 邀请加入会议 + - 拉人开会 + - 会议怎么加人 + - 加更多人进会议 + - 把同事拉进会议 +related_tools: [] +related_pages: [] +prerequisites: + - 自己已在会议中 +negative: + - 一次邀请最多 20 人 + - 只能邀请系统内已注册的用户(外部访客请用分享链接) + - 邀请不会强制对方进入,对方收到消息卡片后自行点击加入 +last_verified: v1.7.90 +--- + +# 邀请成员加入会议 + +## 入口 +- 会议窗口底部「邀请」按钮(横屏)或电话图标(竖屏移动端) + +## 操作步骤 +1. 在会议窗口底部点击「邀请」按钮 +2. 弹出「邀请加入」对话框 +3. 在「邀请成员」搜索并选择联系人(最多 20 人) +4. 点击「发送邀请」按钮 + +## 被邀请人会收到什么 +- 系统机器人 `meeting-alert` 会向每个被邀请人推送一张「会议邀请」消息卡片 +- 卡片显示会议主题和「加入会议」按钮 +- 对方点击按钮即可加入同一会议频道 + +## 复制链接邀请 +如果对方不是系统用户,或想发到外部群里,使用「复制链接」按钮: + +1. 在「邀请加入」对话框点击「复制链接」按钮 +2. 链接已写入剪贴板,粘贴到任意渠道(短信/微信/邮件) +3. 链接 6 小时内有效,详见 [[meeting.share.howto]] + +## 不支持 +- 不能群发到一个群聊(仅按用户单发卡片) +- 邀请无法撤回,对方仍能在链接有效期内加入 diff --git a/resources/ai-kb/zh/howto/meeting/join.md b/resources/ai-kb/zh/howto/meeting/join.md new file mode 100644 index 000000000..72599db5c --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/join.md @@ -0,0 +1,52 @@ +--- +id: meeting.join.howto +title: 加入会议 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 怎么加入会议 + - 加会议 + - 进入会议 + - 输入会议号 + - 用链接加入会议 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 会议结束后无法再加入(提示「会议已结束」) + - 分享链接 6 小时后失效(提示「分享链接已过期」) + - 频道 ID 不存在时无法加入(提示「频道ID不存在」) +last_verified: v1.7.90 +--- + +# 加入会议 + +## 入口 +有三种加入方式: + +- 通过会议号:右上角「+」→「加入会议」→ 输入 `meetingid` +- 通过对话消息卡片:在收到的「会议邀请」消息卡片上点击「加入会议」 +- 通过分享链接:打开 `/meeting//` 链接,自动拉起加入对话框 + +## 操作步骤(通过会议号) +1. 桌面端右上角「+」→「加入会议」,或移动端底部 Tabbar「+」→「加入会议」 +2. 在「会议频道ID」输入框粘贴或输入会议号 +3. 勾选入会默认设备「麦克风」「摄像头」 +4. 点击「加入会议」按钮 + +## 操作步骤(通过分享链接) +1. 浏览器打开收到的分享链接 +2. 链接已携带 `meetingid` 和 `sharekey`,会议号会自动填好并锁定 +3. 未登录时需填写「你的姓名」作为访客身份(详见 [[meeting.tourist.concept]]) +4. 勾选默认设备后点击「加入会议」 + +## 失败常见原因 +- 会议已结束 → 联系发起人重开 +- 分享链接已过期 → 让发起人重新生成([[meeting.share.howto]]) +- 频道 ID 不存在 → 检查会议号是否抄错(区分大小写) +- 详见 [[meeting.cannot-join.faq]] + +## 不支持 +- 已经在另一个会议中时无法同时加入第二个(会提示「正在会议中」) diff --git a/resources/ai-kb/zh/howto/meeting/share.md b/resources/ai-kb/zh/howto/meeting/share.md new file mode 100644 index 000000000..2d81f5098 --- /dev/null +++ b/resources/ai-kb/zh/howto/meeting/share.md @@ -0,0 +1,52 @@ +--- +id: meeting.share.howto +title: 生成会议分享链接 +type: howto +feature: meeting +scope: end-user +locale: zh +aliases: + - 会议分享链接 + - 分享会议 + - 发会议链接 + - 邀请外部人员 + - 临时会议链接 +related_tools: [] +related_pages: [] +prerequisites: + - 自己已在会议中 +negative: + - 分享链接 6 小时后过期,过期需重新生成 + - 同一会议每次「复制链接」都会生成一个新 sharekey,旧的仍可用直到过期 + - 链接生成不通知发起人之外的人,需要手动发出去 +last_verified: v1.7.90 +--- + +# 生成会议分享链接 + +## 入口 +- 会议窗口底部「邀请」按钮 → 邀请加入对话框 →「复制链接」按钮 + +## 操作步骤 +1. 入会后点击会议窗口底部「邀请」按钮 +2. 在弹出的「邀请加入」对话框点击「复制链接」 +3. 链接自动写入系统剪贴板,并提示「复制成功」 +4. 把链接粘贴到任意渠道(微信、邮件、企业 IM)发给对方 + +## 链接结构 +- 形如 `https://<域名>/meeting//` +- `meetingid` 是会议号(11 位字母数字) +- `sharekey` 是 base64 编码的临时凭证,6 小时有效 + +## 链接打开会发生什么 +- 已登录用户:自动填好会议号并锁定,确认入会设置后即可加入 +- 未登录访客:需先输入「你的姓名」作为访客昵称,无需注册(详见 [[meeting.tourist.concept]]) + +## 过期与续期 +- 6 小时是固定 TTL(缓存在 Redis) +- 想延长有效期,重新点「复制链接」生成新链接,把新链接重新发出去 +- 已过期链接打开时提示「分享链接已过期」 + +## 不支持 +- 不能自定义链接有效期 +- 不能撤销已发出的链接 diff --git a/resources/ai-kb/zh/howto/memos/create.md b/resources/ai-kb/zh/howto/memos/create.md new file mode 100644 index 000000000..a103150ec --- /dev/null +++ b/resources/ai-kb/zh/howto/memos/create.md @@ -0,0 +1,56 @@ +--- +id: memos.create.howto +title: 写一条 Memo +type: howto +feature: memos +scope: end-user +locale: zh +aliases: + - 怎么写笔记 + - 新建 memo + - 记一条想法 + - 加一条笔记 + - 我要写个备忘 + - memos 怎么用 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 memos 插件 +negative: + - 不能用 Memos 原生账号登录(账号由 DooTask 自动建立) + - 单条 memo 大小受 Memos 服务自身限制 + - Memos 不与 DooTask 任务 / 项目数据互通,写在这里的内容不会变成任务 +last_verified: v1.7.90 +--- + +# 写一条 Memo + +## 入口 +- 桌面端:左侧栏「应用」→「Memos 笔记」(对应 URL `apps/memos/`) +- 移动端:底部 Tabbar「应用」→「Memos 笔记」 +- 首次打开会自动用当前 DooTask 账号登录 Memos,无需输入密码 + +## 操作步骤 +1. 打开「Memos 笔记」页面 +2. 在顶部输入框直接输入内容(支持 Markdown) +3. 可选:用 `#标签名` 语法添加标签分类(参见 [[memos.tag.concept]]) +4. 可选:调整可见性(私有 / 工作区 / 公开),默认是私有 +5. 点击「保存 / Save」提交,新 memo 立即出现在时间线顶部 + +## 编辑与删除 +- 在时间线上找到要操作的 memo,点击右上角的「···」菜单 +- 可执行编辑内容、修改可见性、置顶、归档、删除等操作 + +## Markdown 与附件 +- 支持标题、加粗、列表、代码块、链接等基础 Markdown +- 支持上传图片 / 文件附件,存储在 SQLite 数据库或本地卷里 +- 不支持任意大附件,建议大文件用 DooTask 主程序的文件模块 + +## 不支持 +- 不能跨 DooTask 用户共用同一个 memo 帐号(每个 DooTask 用户在 Memos 内是独立账号) +- 不能从 DooTask 主程序的任务 / 文档直接「转存到 Memos」 + +## 相关 +- Memos 是什么:[[memos.concept]] +- 入口在哪:[[memos.entry.menu-map]] +- 标签 / 分类:[[memos.tag.concept]] diff --git a/resources/ai-kb/zh/howto/messenger/chain.md b/resources/ai-kb/zh/howto/messenger/chain.md new file mode 100644 index 000000000..5914c570b --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/chain.md @@ -0,0 +1,59 @@ +--- +id: messenger.chain.howto +title: 群接龙 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么发起接龙 + - 群接龙 + - 创建接龙 + - 接龙消息 + - 群里接个龙 + - 怎么做接龙 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: + - 必须在群对话内 +negative: + - 接龙不支持选项预设,参与者直接填自己的接龙条目 + - 接龙没有最大人数限制;总文本 200000 字符截断 + - 接龙没有截止时间机制,由发起人手动停止(再发新接龙) +last_verified: v1.7.90 +--- + +# 群接龙 + +群接龙(word-chain)是一种可累加的群消息类型。发起后所有成员均可点击「我要接龙」追加一条自己的内容,接龙列表会持续追加显示。常用于报名、签到打卡、点名收集。 + +## 入口 + +- 桌面端:会话底部「+」附加菜单 → 「接龙」 +- 移动端:底部「+」→「接龙」 + +## 操作步骤 + +1. 输入接龙主题(text,必填) +2. 添加初始接龙项(list,至少 1 条;通常发起人先写自己的那条) +3. 提交 → 群消息出现接龙卡片 +4. 其他成员点「接龙」按钮 → 输入自己的内容 → 追加到 list +5. 每次新增触发 word-chain 消息更新,群里实时展示新接龙人和条目 + +## 关键字段 + +| 字段 | 含义 | +|---|---| +| uuid | 接龙唯一标识,同一个接龙更新都用这个 uuid | +| createid | 发起人 userid | +| list | 接龙条目数组(id / userid / text) | + +## 接龙编辑 + +仅自己发的那一条接龙可以再次编辑(前端会限制按钮);其他人的条目不可改。 + +## 不支持 + +- 不支持「单人多次接龙」业务限制(前端可点多次,重复条目会保留) +- 不支持给接龙加截止时间 +- 不支持把接龙转换成投票,反之亦然 diff --git a/resources/ai-kb/zh/howto/messenger/create-group.md b/resources/ai-kb/zh/howto/messenger/create-group.md new file mode 100644 index 000000000..977952784 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/create-group.md @@ -0,0 +1,52 @@ +--- +id: messenger.group.howto.create +title: 创建群聊 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 建群 + - 新建群 + - 创建群组 + - 怎么加群 + - 拉群 + - 怎么开个群 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - 创建群不需要管理员权限,所有用户都能建 + - 单个群最多支持的人数受系统设置限制,默认 200(管理员可调) + - 普通成员建的群可以解散;自己只是群成员的群不能解散 +last_verified: v1.7.90 +--- + +# 创建群聊 + +## 入口 +有多个入口都能开始创建: + +- 桌面端:左侧栏「消息」→ 顶部「+」→「创建群组」 +- 桌面端:右上角全局「+」→「创建群组」 +- 桌面端:左侧栏「应用」→「创建群组」卡片 +- 移动端:底部 Tabbar「消息」→ 顶部「+」→「创建群组」 + +## 操作步骤 +1. 输入群名称(必填) +2. 从联系人 / 部门列表中勾选成员(可搜索) +3. 可选:设置群头像、群公告、群描述 +4. 点击「确定」创建,自动进入新群 + +## 创建后能做什么 +- 邀请新成员:群信息页 → 「+」添加成员 +- 设置管理员:群信息页 → 成员列表 → 任命管理员 +- 群机器人:在群里 @机器人 触发任务/AI 等 +- 项目讨论关联:项目详情页可关联到已有群 + +## 与项目讨论的关系 +每个项目会自动生成一个「项目讨论组」群聊,群成员 = 项目成员。如果只是讨论项目工作不需要单独建群。 + +## 相关 +- 群投票/接龙/签到等增强功能(详细 chunk 后续起草) +- 群消息编辑/撤回/置顶/翻译(详细 chunk 后续起草) diff --git a/resources/ai-kb/zh/howto/messenger/dissolve.md b/resources/ai-kb/zh/howto/messenger/dissolve.md new file mode 100644 index 000000000..eec9133d0 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/dissolve.md @@ -0,0 +1,53 @@ +--- +id: messenger.group.howto.dissolve +title: 解散群组 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么解散群 + - 解散群组 + - 删除群 + - 删群 + - 群没了怎么办 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: + - 必须是群主 + - 仅支持普通群(group_type=user) +negative: + - 项目群 / 任务群 / 部门群 / 全员群不能解散;这些群会随项目 / 任务 / 部门删除而自动消失 + - 群管理员(deputy)不能解散群,仅群主能 + - 解散后群消息全部不可恢复,群成员列表立刻清空 +last_verified: v1.7.90 +--- + +# 解散群组 + +解散群组(disband)会软删除整个群(dialog 表 deleted_at),并清除所有成员的 dialog_user 记录。仅普通群(group_type=user)的群主可执行。 + +## 入口 + +- 桌面端:打开群聊 → 右上角群信息面板 → 底部「解散群组」红色按钮 +- 移动端:进群 → 右上角「⋯」→ 群组信息 → 底部「解散群组」 + +## 操作步骤 + +1. 点击「解散群组」 +2. 二次确认弹窗,输入「解散」/「确认」等校验文字 +3. 提交后: + - 群对话进入软删除(dialog.deleted_at) + - 所有成员从会话列表移除该群 + - 服务端推送 groupDelete + +## 与「退群」的区别 + +- 退群:自己离开,群继续存在(群主除外)→ 详见退出群组 +- 解散:群消失,所有成员都被踢出 + +## 不支持 + +- 解散后不可恢复,没有「30 天回收站」机制 +- 全员群(group_type=all)、部门群(department)、项目群(project)、任务群(task)、OKR 群(okr)不可手动解散 +- 群里有未完成的项目讨论关联时仍可解散(项目讨论会失去对应群) diff --git a/resources/ai-kb/zh/howto/messenger/exit.md b/resources/ai-kb/zh/howto/messenger/exit.md new file mode 100644 index 000000000..0eced9a1b --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/exit.md @@ -0,0 +1,53 @@ +--- +id: messenger.group.howto.exit +title: 退出群组 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 退群 + - 怎么退群 + - 离开群组 + - 退出群聊 + - 怎么不在群里 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 群主不能直接退群,需先转让群主,否则会报错 + - 项目群 / 任务群成员身份跟随源数据,退出需从项目 / 任务里移除自己 + - 部门群 / 全员群是自动维护,不能手动退出 +last_verified: v1.7.90 +--- + +# 退出群组 + +「退出群组」(exit)是成员主动离开,跟「被踢」(remove)不同。退群后该用户的会话列表里不再显示该群,再次入群需被重新邀请。 + +## 入口 + +- 桌面端:打开群聊 → 右上角群信息面板 → 底部「退出群组」 +- 移动端:进群 → 右上角「⋯」→ 群组信息 → 底部「退出群组」 + +## 操作步骤 + +1. 点击「退出群组」 +2. 弹窗二次确认 +3. 提交后: + - dialog_user 记录被删除(软删) + - 群里收到一条系统消息「XXX 退出群聊」 + - 自己会话列表移除该群 + +## 与其他操作的区别 + +- 退出(exit):自己主动,自己消失 +- 移出(remove):群主 / 群管理员把别人踢出,详见添加和移除群成员 +- 解散(disband):群主把整个群删掉,详见解散群组 +- 隐藏(hide):自己留在群里但不在会话列表显示,详见隐藏会话 + +## 不支持 + +- 群主退群必须先转让群主,否则会报「群主不可退出」 +- 任务参与人 / 项目成员对应的群成员不能直接退群,需在任务负责人或项目成员中调整自己 +- 退群后历史消息保留在服务端,但本人无法再访问 diff --git a/resources/ai-kb/zh/howto/messenger/history.md b/resources/ai-kb/zh/howto/messenger/history.md new file mode 100644 index 000000000..a6300bfd6 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/history.md @@ -0,0 +1,60 @@ +--- +id: messenger.history.howto +title: 查看历史消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 翻看历史消息 + - 看以前的聊天 + - 加载更早消息 + - 怎么往上翻 + - 历史聊天记录 + - 跳到某条消息 +related_tools: [get_message_list] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 翻历史只能一次拉一页(50 条),无法一次性导出全部聊天记录 + - 已撤回的消息显示为「XXX 撤回了一条消息」占位,原内容不可恢复 + - 已退群成员看不到退群之前 / 之后的群历史,加回群也不能看历史 +last_verified: v1.7.90 +--- + +# 查看历史消息 + +查看历史消息(msg list)通过滚动加载(infinite scroll)实现:会话默认显示最近 50 条,向上滚动触发加载更早 50 条,向下补齐增量。也可通过 position_id 跳到任意一条上下文。 + +## 入口 + +- 桌面端:会话内向上滚动鼠标 / 触控板 +- 桌面端:搜索结果 / 引用回复点击「跳转原消息」自动定位 +- 移动端:进会话向上滑动 + +## 操作步骤 + +1. 默认请求:`msg_id=0` 返回最近 50 条 +2. 向上翻:传 `prev_id=最早一条的 id`,倒序取该 id 之前 50 条 +3. 向下翻:传 `next_id=最晚一条的 id`,正序取该 id 之后 50 条 +4. 定位上下文:传 `position_id=消息 id`,返回前后各 25 条 +5. 也可按 msg_type 过滤(text / image / file / record / meeting / tag / todo / link) + +## 字段说明 + +| 字段 | 含义 | +|---|---| +| take | 单次取多少条,默认 50,最大 100 | +| msg_type | 过滤条件(按消息类型) | +| dialog | 顺带返回会话信息(仅首次加载) | +| todo / top | 顺带返回当前会话的待办、置顶消息 | + +## 跨设备一致性 + +历史消息存储在服务端,跨设备登录加载内容一致;不会因换设备丢失记录。 + +## 不支持 + +- 不支持「按日期跳到某天」的快捷入口,需要搜索后定位 +- 不支持下载整段聊天记录为本地文件 +- 不支持加载历史时同时改变排序方向(始终时间正序展示) diff --git a/resources/ai-kb/zh/howto/messenger/member.md b/resources/ai-kb/zh/howto/messenger/member.md new file mode 100644 index 000000000..0c34f1fbe --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/member.md @@ -0,0 +1,56 @@ +--- +id: messenger.group.howto.member +title: 添加和移除群成员 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么加人进群 + - 拉人进群 + - 踢人出群 + - 群成员管理 + - 群里怎么删人 + - 邀请进群 +related_tools: [search_users] +related_pages: [messenger, dialog_chat] +prerequisites: + - 普通群(group_type=user)需是群主或群管理员才能踢人;有群主时只有群主和群管理员可加人 + - 项目群 / 任务群 / 部门群成员跟随源数据变化,不能在群里直接加 / 踢 +negative: + - 群主不能被踢,只能先转让群主再退群 + - 任务参与人、项目成员对应的群成员不能在群里直接移除,需到任务 / 项目里调整 + - 一次最多批量传 userids 数组,但接口未硬限制条数,前端按 200 人内体验最佳 +last_verified: v1.7.90 +--- + +# 添加和移除群成员 + +群成员管理覆盖「拉人进群」和「踢人出群」两种操作。普通群(group_type=user)由群主 / 群管理员主导;项目群 / 任务群 / 部门群的成员由源数据自动同步。 + +## 入口 + +- 桌面端:打开群聊 → 右上角群信息面板 → 「成员」列表 +- 移动端:进群 → 右上角「⋯」→ 群成员 + +## 操作步骤 + +添加成员: +1. 成员面板顶部点「+」按钮 +2. 在搜索框输入昵称 / 邮箱,或从联系人 / 部门里勾选 +3. 提交后被加成员收到 groupJoin 推送,立刻能看到这个群 + +移除成员: +1. 成员面板找到要踢的人 → 长按 / 鼠标悬停 → 「移出」 +2. 二次确认后该用户收到 groupExit 推送,群消息列表移除该会话 + +## 权限规则 + +- 有群主时:仅群主 / 群管理员可加人或踢人 +- 没有群主(如旧群):任意成员可加人 +- 群主、任务参与人、项目成员对应的成员不可踢 + +## 不支持 + +- 不支持在群里把项目 / 任务的成员直接踢出,需到项目成员或任务负责人页调整 +- 不支持「批量改群管理员身份」(任命管理员需逐个) diff --git a/resources/ai-kb/zh/howto/messenger/mention.md b/resources/ai-kb/zh/howto/messenger/mention.md new file mode 100644 index 000000000..3cfb6400e --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/mention.md @@ -0,0 +1,59 @@ +--- +id: messenger.send.howto.mention +title: "@提及成员" +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么at人 + - "@某人" + - 群里at所有人 + - 提及成员 + - 怎么at所有人 + - at全体 +related_tools: [send_message, search_users] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 单聊里 @对方 不会产生额外提醒,因为单聊本身就是直达 + - "@所有人(all)只对群有效;项目讨论组限项目成员,部门群限部门成员" + - "@已退群成员不会触发提醒,仅作为文本展示" +last_verified: v1.7.90 +--- + +# @提及成员 + +@提及(mention)会在被提及成员的「消息列表 → 该会话」上显示红点和「@」标记,并触发桌面 / 移动端通知。即使设置了免打扰,被 @ 的消息仍会强制提醒。 + +## 入口 + +- 桌面端:输入框输入 `@` 触发下拉成员搜索 +- 移动端:长按输入框上方「@」快捷按钮 或 输入 `@` 字符 +- 也可在工具栏点击「@」图标弹出成员列表 + +## 操作步骤 + +1. 输入 `@` 后开始输入对方昵称 / 邮箱 +2. 在弹出的候选列表选中目标 +3. 输入框生成可点击的 `@张三` 蓝色标签 +4. 按回车发送 + +## 特殊提及类型 + +| 写法 | 含义 | +|---|---| +| @某成员 | 单点提醒该成员 | +| @所有人 | 群级广播;强制提醒所有成员(含免打扰) | +| 邮箱形式 @user@xxx | 系统自动转换为对应用户 mention | + +## 与 #任务 / ~文件 的区别 + +- `@` 后跟用户:人员提及 +- `#` 后跟任务:任务引用,参见任务对话内提及创建 [[task.create.howto.via-mention]] +- `~` 后跟文件:文件引用 + +## 不支持 + +- 不支持在 markdown 模式下用纯文本 `@xxx` 触发提醒,必须用富文本 mention 标签 +- 不支持对机器人 @提及(机器人不会被加入未读 mention 列表) diff --git a/resources/ai-kb/zh/howto/messenger/mute.md b/resources/ai-kb/zh/howto/messenger/mute.md new file mode 100644 index 000000000..4cb2fe1be --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/mute.md @@ -0,0 +1,57 @@ +--- +id: messenger.mute.howto +title: 会话免打扰 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 会话免打扰 + - 群免打扰 + - 怎么静音 + - 不要弹通知 + - 屏蔽群消息 + - 静默通知 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: + - 仅支持单聊(type=user)和普通群(group_type=user) +negative: + - 项目群 / 任务群 / 部门群 / 全员群 / OKR 群不支持设免打扰,会报「此会话不允许设置免打扰」 + - 设了免打扰后仍能收到 @ 提及强提醒 + - 免打扰对未读数没有影响,仍按真实新消息累加 +last_verified: v1.7.90 +--- + +# 会话免打扰 + +会话免打扰(silence)让该会话的新消息不再弹通知 / 振动 / 响铃,但仍正常接收。常用于不希望被频繁打扰但又要保留信息查看权的群。 + +## 入口 + +- 桌面端:会话列表右键 / 鼠标悬停 → 「免打扰」 +- 桌面端:进入会话 → 右上角操作菜单 → 「免打扰」 +- 移动端:会话列表左滑 → 「免打扰」/「取消免打扰」 + +## 操作步骤 + +1. 找到目标会话 +2. 切换免打扰开关: + - type=set:开启免打扰(dialog_user.silence=1) + - type=cancel:关闭免打扰 +3. 服务端同步把该会话已有未读全部标记为已读,避免一开免打扰还显示一堆未读 + +## 开免打扰后行为 + +| 场景 | 行为 | +|---|---| +| 普通文字消息 | 不弹通知,未读静默累加 | +| @ 我或 @所有人 | 仍强提醒 | +| 系统通知 | 不弹通知 | +| 桌面 / 移动端 badge | 仍受 mark_unread / 红点机制影响 | + +## 不支持 + +- 不支持限定时段的免打扰(按消息时间) +- 不支持单聊以外的「跟特定人免打扰」 +- 不支持把项目群 / 任务群级别设免打扰,仅可在系统级整体压制 diff --git a/resources/ai-kb/zh/howto/messenger/pin.md b/resources/ai-kb/zh/howto/messenger/pin.md new file mode 100644 index 000000000..6e457f300 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/pin.md @@ -0,0 +1,55 @@ +--- +id: messenger.pin.howto +title: 置顶会话 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么把消息置顶 + - 群置顶 + - 会话置顶 + - 把这个群放最上面 + - 置顶聊天 + - 取消置顶 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 置顶只对自己有效,不影响其他成员的会话列表顺序 + - 置顶的会话不能隐藏,会先报「置顶会话无法隐藏」 + - 多个置顶按 top_at 倒序排列,没有手动拖动排序 +last_verified: v1.7.90 +--- + +# 置顶会话 + +「置顶会话」(dialog top)把指定的会话顶到列表最上方。仅作用于当前用户,其他成员的会话顺序不变。可与单条消息置顶(top_msg_id)区分:前者是「这个会话排第一」,后者是「这个群里这条消息钉在顶部」。 + +## 入口 + +- 桌面端:会话列表右键 / 鼠标悬停 → 「置顶」 +- 桌面端:进入会话 → 右上角操作菜单 → 「置顶会话」 +- 移动端:会话列表左滑 → 「置顶」按钮 + +## 操作步骤 + +1. 在会话列表找到目标会话 +2. 触发「置顶」操作 +3. 接口写入 dialog_user.top_at = 当前时间 +4. 列表立刻按 top_at 倒序 + last_at 倒序刷新 + +## 取消置顶 + +再次点击「置顶」按钮即可,top_at 会被清空。 + +## 与「消息置顶」的区别 + +- 会话置顶(pin dialog):自己列表里把会话顶上去 +- 消息置顶(top_msg_id):群内单条消息钉在群顶部,所有人可见,详见 msg__top 接口 + +## 不支持 + +- 不支持设置置顶数量上限(实际由会话列表大小决定) +- 不支持把置顶顺序手动调整,按时间倒序 +- 不支持单聊和群聊分组置顶 diff --git a/resources/ai-kb/zh/howto/messenger/quote.md b/resources/ai-kb/zh/howto/messenger/quote.md new file mode 100644 index 000000000..1cea82706 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/quote.md @@ -0,0 +1,54 @@ +--- +id: messenger.send.howto.quote +title: 引用回复消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么引用消息 + - 引用回复 + - 回复某条消息 + - 怎么针对某条回复 + - 引用别人的话 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 引用的源消息被撤回后,引用消息仍保留,但展示为「该消息已撤回」 + - 不能跨会话引用,引用必须在同一对话内 + - 不支持「多条合并引用」,一次只能引一条;多条转发用合并转发 +last_verified: v1.7.90 +--- + +# 引用回复消息 + +引用回复(reply)让消息明确指向上下文里的某条历史消息。被引用消息会在新消息上方以折叠卡片形式显示发送者和摘要,点击可跳转到原消息位置。 + +## 入口 + +- 桌面端:鼠标悬停目标消息 → 右上角操作菜单 → 「引用」 +- 桌面端:长按消息(触屏) → 「引用」 +- 移动端:长按消息气泡 → 「引用」 +- 任意一种入口都会让输入框上方出现「引用预览条」,输入完成后回车发送即可 + +## 操作步骤 + +1. 在消息流找到要引用的历史消息 +2. 触发「引用」操作,输入框上方显示引用预览 +3. 输入回复内容(可继续 @、附图、附件) +4. 提交发送,新消息携带 reply_id + +## reply_check 校验 + +接口可选 `reply_check=yes`:若引用 ID 之后再无其他人发言(如自己最新一条就是被引用的),则降级为普通文本发送。常用于减少冗余引用。 + +## 与转发的区别 + +- 引用:在原对话上下文里追加,保留对话流 +- 转发:把消息搬到其他对话,详见消息转发功能 + +## 不支持 + +- 不支持引用已撤回 / 已删除的消息(引用预览会变成「该消息不存在」) +- 引用不能跨会话使用 diff --git a/resources/ai-kb/zh/howto/messenger/recall.md b/resources/ai-kb/zh/howto/messenger/recall.md new file mode 100644 index 000000000..478acd35e --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/recall.md @@ -0,0 +1,65 @@ +--- +id: messenger.recall.howto +title: 撤回消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么撤回消息 + - 撤回消息 + - 撤回一条 + - 收回消息 + - 误发了能撤回吗 + - 多久内可以撤回 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: + - 仅能撤回自己发送的消息 +negative: + - 撤回时限由系统管理员通过 msg_rev_limit(分钟数)配置,超出报「已超过 X 分钟,此消息不可撤回」 + - 默认 msg_rev_limit 为空表示不限制;若设置成 0 也表示不限制 + - 机器人发的消息可以无限期撤回(msg_rev_limit 校验对机器人放行) + - 个人自聊会话(isSelfDialog)可以无限期撤回 +last_verified: v1.7.90 +--- + +# 撤回消息 + +撤回消息(withdraw)会软删除自己发送的消息(deletes 字段),群里所有人看到「XXX 撤回了一条消息」占位。撤回时限受系统配置 `msg_rev_limit` 控制(分钟)。 + +## 入口 + +- 桌面端:鼠标悬停自己发出的消息 → 右上角操作菜单 → 「撤回」 +- 桌面端:长按 / 右键消息气泡 → 「撤回」 +- 移动端:长按自己的消息气泡 → 「撤回」 + +## 操作步骤 + +1. 在会话流定位自己发的消息 +2. 触发撤回操作 +3. 二次确认后服务端校验: + - 是否为消息发送者(必须) + - 是否在 msg_rev_limit 时限内(如设置) +4. 通过校验则删除消息并推送给群成员 + +## 时限规则 + +| 场景 | 时限 | +|---|---| +| msg_rev_limit 为空 / 0 | 无限制 | +| msg_rev_limit = N 分钟 | 创建后 N 分钟内可撤 | +| 机器人发的消息 | 无限制 | +| 自聊(私人云笔记会话) | 无限制 | + +## 与「编辑」的区别 + +- 撤回:消息消失,留占位 +- 编辑:消息保留,内容更新,标记「已编辑」;时限由 msg_edit_limit 控制 +- 编辑同样仅对自己消息有效 + +## 不支持 + +- 不支持撤回别人的消息(即使是群主、管理员也不行) +- 不支持撤回后再恢复(撤回不可逆) +- 不支持「仅对自己撤回」(撤回对群里所有人生效) diff --git a/resources/ai-kb/zh/howto/messenger/rename-group.md b/resources/ai-kb/zh/howto/messenger/rename-group.md new file mode 100644 index 000000000..17b05e54c --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/rename-group.md @@ -0,0 +1,58 @@ +--- +id: messenger.group.howto.rename +title: 修改群名称 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 改群名 + - 群名怎么改 + - 修改群名称 + - 群组改名 + - 设置群头像 + - 怎么改群头像 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: + - 普通群(group_type=user)需是群主或群管理员 + - 全员群(group_type=all)需是系统管理员 +negative: + - 项目群 / 任务群 / 部门群的群名跟随源数据,不能在群聊里直接改 + - 群名长度限制 2-100 字符,超出会报错 + - 普通成员(非群主、非管理员)改群名会报「仅群主或群管理员可操作」 +last_verified: v1.7.90 +--- + +# 修改群名称 + +修改群名称(chat_name)和群头像(avatar)在同一个面板,只有具备权限的角色可操作。 + +## 入口 + +- 桌面端:打开群聊 → 右上角「群信息」/「成员」图标 → 顶部群名右侧「编辑」按钮 +- 移动端:进群 → 右上角「⋯」→ 群组信息 → 点击群名 / 群头像 + +## 操作步骤 + +1. 修改群头像:点击当前头像 → 上传新图(jpg / png / gif / webp) +2. 修改群名:点击群名进入编辑态,输入新名称(2-100 字符) +3. 提交后立即生效,群内所有成员收到群信息更新推送 + +## 字段默认值 + +| 字段 | 默认值 | 限制 | +|---|---|---| +| chat_name | 创建时输入的名称 | 2-100 字符 | +| avatar | 系统生成的占位图 | jpg / png / gif / webp | + +## 权限矩阵 + +- 普通群(group_type=user):群主、群管理员可改名 / 改头像 +- 全员群(group_type=all):仅系统管理员可改名 / 改头像 +- 项目群 / 任务群 / 部门群:不可改名(跟随源数据),但可改头像 + +## 不支持 + +- 改群名后无法撤销操作,需手动改回 +- 群名不支持 emoji 之外的特殊控制字符 diff --git a/resources/ai-kb/zh/howto/messenger/search.md b/resources/ai-kb/zh/howto/messenger/search.md new file mode 100644 index 000000000..dbd13085e --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/search.md @@ -0,0 +1,56 @@ +--- +id: messenger.search.howto +title: 搜索消息和会话 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么搜消息 + - 群消息搜索 + - 找历史聊天记录 + - 搜聊天 + - 找一条消息 + - 搜索会话 +related_tools: [search_dialogs, intelligent_search, get_message_list] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 历史消息全文检索依赖 Manticore,未启用时仅能按会话名和联系人搜,不能命中消息内容 + - 文件消息按文件名 / 描述命中,不支持按文件正文(OCR 内容除外) + - 搜索结果一次最多返回 20 条,超过需要更具体关键词 +last_verified: v1.7.90 +--- + +# 搜索消息和会话 + +「搜索」(dialog search)覆盖三类目标:会话名(含群名和单聊对方昵称)、联系人(用户)和历史消息(全文检索)。命中后可直接跳转到对应会话或定位到消息。 + +## 入口 + +- 桌面端:左侧栏「消息」顶部搜索框 +- 桌面端:全局顶部搜索框(也含任务 / 项目 / 文件) +- 移动端:进入「消息」Tab → 顶部下拉搜索 + +## 操作步骤 + +1. 输入关键词(必填,可中英文混合) +2. 系统按以下顺序填充结果: + - WebSocketDialog 会话名匹配 + - 联系人(User)昵称 / 邮箱匹配 + - 历史消息全文检索(Manticore) +3. 命中后点击直接打开对应会话;消息命中会自动滚到该条 + +## 仅搜会话 + +接口可传 `dialog_only=1`,跳过消息全文检索,只返回会话 / 联系人。常用于「找张三的聊天窗」场景。 + +## 搜标注消息 + +`/api/dialog/search/tag` 单独列出最近 50 条被标注(tag>0)的消息,按时间倒序,便于复盘重点。 + +## 不支持 + +- 不支持按时间区间筛选消息搜索结果,需在客户端再过滤 +- 不支持搜索语音 / 视频内容(除非已 OCR 或转文字) +- 不支持搜索已撤回 / 已删除消息(这些已从索引剔除) diff --git a/resources/ai-kb/zh/howto/messenger/send-file.md b/resources/ai-kb/zh/howto/messenger/send-file.md new file mode 100644 index 000000000..c6dba12fb --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/send-file.md @@ -0,0 +1,66 @@ +--- +id: messenger.send.howto.file +title: 发送文件消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么发文件 + - 发个文件 + - 发附件 + - 上传文件 + - 群里发文件 + - 怎么发文档 +related_tools: [send_message, search_files] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 单个文件大小受系统设置 file_upload_limit 限制(默认无单独限制,按 PHP 上传配置 ) + - 不支持文件夹直接拖入,需要逐个或压缩后上传 + - 不支持已删除文件 ID 复用(通过 sendfileid 发送已删除文件会失败) +last_verified: v1.7.90 +--- + +# 发送文件消息 + +发送文件(sendfile)支持拖拽、点击附件按钮、粘贴 / 截图、从「我的文件」选择等多种方式。文件保存到 `uploads/chat/yyyymm/dialog_id/` 目录。 + +## 入口 + +- 桌面端:会话输入框 → 左下角「+」/ 回形针图标 → 「上传文件」 +- 桌面端:直接拖拽文件到会话窗口 +- 桌面端:粘贴板(Ctrl+V)粘贴图片 / 文件 +- 移动端:会话底部 → 「+」 → 「文件」/「相册」/「相机」 + +## 操作步骤 + +1. 触发上传入口或拖入文件 +2. 选择文件(可多选,支持 sendfiles 批量) +3. 客户端展示上传进度 +4. 上传成功后立即以文件消息形态发到会话 + +## 字段说明 + +| 字段 | 含义 | +|---|---| +| files | 上传的文件(multipart) | +| filename | 自定义文件名(可选) | +| reply_id | 引用的消息 ID | +| image_attachment | 图片是否也写入任务附件库(1=是) | + +## 文件类型识别 + +后端根据扩展名自动识别 mtype: +- jpg / jpeg / png / gif / webp → image(图片) +- 其他 → file(普通文件) +- mp4 / mov / mkv 等视频会单独处理 + +## 通过已有文件 ID 转发 + +走 sendfileid 可以把「我的文件」里现存文件以分享链接形式发到会话,不重复上传。 + +## 不支持 + +- 不支持发送大于系统文件上限的文件 +- 不支持「群发但只让部分人下载」的权限隔离,群内所有成员均可下载 diff --git a/resources/ai-kb/zh/howto/messenger/send-image.md b/resources/ai-kb/zh/howto/messenger/send-image.md new file mode 100644 index 000000000..c18d8e534 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/send-image.md @@ -0,0 +1,62 @@ +--- +id: messenger.send.howto.image +title: 发送图片消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么发图片 + - 发图 + - 发张图 + - 群里发照片 + - 截图发出去 + - 图片消息 +related_tools: [send_message, extract_image_text] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 不支持批量打包成相册一次性发出,多张图会逐条以独立消息发送 + - 表情包(emoticon)虽然以 image 形式存储,但不会被识别为附件 + - 图片仅按文件压缩开关执行压缩;不会自动 OCR 提取文字(OCR 需另行触发) +last_verified: v1.7.90 +--- + +# 发送图片消息 + +图片消息(mtype=image)是文件消息的特化类型。后端按扩展名识别为图片(jpg / jpeg / png / gif / webp),自动生成缩略图,并在消息流里以缩略图展示。 + +## 入口 + +- 桌面端:输入框左下角「+」→「上传图片」 +- 桌面端:直接拖拽 / 粘贴图片 +- 桌面端:截图工具直接 Ctrl+V 到输入框 +- 移动端:底部「+」→「相册」或「相机」 + +## 发送方式 + +1. 单张图片 / 批量图片:均走 sendfile / sendfiles 接口 +2. base64 图片(剪贴板截图):以 image64 参数提交 +3. 表情包 / 自定义贴图:以 emoticon 类型发出,单独标记不被当文件附件 + +## 字段默认值 + +| 字段 | 默认值 | +|---|---| +| image_attachment | 0(不把图片写入任务附件库)| +| 压缩 | 跟随系统设置 image_compress / image_quality | +| 缩略图 | 自动生成 thumb 字段 | + +## 与表情包的区别 + +- 普通图片:mtype=image,可在「文件」筛选 / 任务附件中复用 +- 表情包:mtype=emoticon,仅展示用,不在文件列表出现 + +## 图片 OCR + +收到图片后可在消息上长按 / 右键调用「图片转文字」,走 extract_image_text 工具完成 OCR 文本提取,需要 AI 插件支持。 + +## 不支持 + +- 不支持发送时直接打码 / 涂鸦,需在外部编辑后再发 +- 不支持「阅后即焚」模式 diff --git a/resources/ai-kb/zh/howto/messenger/send-text.md b/resources/ai-kb/zh/howto/messenger/send-text.md new file mode 100644 index 000000000..452ebaea0 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/send-text.md @@ -0,0 +1,57 @@ +--- +id: messenger.send.howto.text +title: 发送文字消息 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么发消息 + - 发文字消息 + - 怎么聊天 + - 发送文本 + - 发个字 + - 群里发消息 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 单条文字消息长度上限 5000 字(不含 HTML 标签),超出会自动转为长文本文件消息(.htm / .md) + - 消息内容最大 200000 字,超过这个上限直接报错 + - 内容为空(去标签后 0 字)不允许发送 +last_verified: v1.7.90 +--- + +# 发送文字消息 + +发送文字消息(sendtext)是 DooTask 即时通讯最常用的操作。支持纯文本、富文本 HTML、Markdown、@提及、#任务、~文件、引用回复、编辑、撤回等。 + +## 入口 + +- 桌面端:打开任意会话 → 底部输入框,回车 / Cmd+Enter / Ctrl+Enter 发送 +- 移动端:进会话 → 底部输入框 → 「发送」按钮 + +## 操作步骤 + +1. 在输入框输入文本 +2. 可选:通过 / 或 工具栏插入富文本(加粗、列表、代码块、图片、emoji) +3. 可选:输入 @ 触发提及面板(输入 # 触发任务选择、~ 触发文件选择) +4. 提交(默认 Enter 发送,Shift+Enter 换行;可在设置里互换) + +## 字段默认值 + +| 字段 | 默认值 | +|---|---| +| text_type | html(富文本);传 md 或 markdown 走 Markdown 渲染 | +| reply_id | 0(不引用);详见引用回复 | +| silence | no(正常推送,触发未读提醒)| + +## 长内容降级 + +文字内容超过 5000 字时,后端自动把消息保存为 .htm / .md 文件,作为长文本附件发送,并展示前 200 字作为预览。 + +## 不支持 + +- 不支持纯空白 / 只有图片占位符的文本(reallen=0 时报错) +- 不支持直接发送超长内容到会话流,单条内容上限 200000 字符 +- 不支持向已离职用户发起新单聊 diff --git a/resources/ai-kb/zh/howto/messenger/todo.md b/resources/ai-kb/zh/howto/messenger/todo.md new file mode 100644 index 000000000..de0070385 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/todo.md @@ -0,0 +1,59 @@ +--- +id: messenger.todo.howto +title: 消息设为待办 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 消息设待办 + - 标记消息待办 + - 让某人去做 + - 钉一条消息给某人 + - 群消息派活 + - 提醒某人这条 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: + - 客户端需 ≥ 0.37.18 + - 设别人为待办需具备「群主 / 项目/任务负责人 / 系统管理员」身份(系统设置 todo_set_permission=close 时收紧) +negative: + - 通知(notice)、标注(tag)、其他待办消息(todo)类型不可再被设为待办 + - 待办设置后可再次取消,但完成(done_at)后不能撤销完成 + - 待办提醒时间(remind_at)只能精确到分钟,不支持秒级 +last_verified: v1.7.90 +--- + +# 消息设为待办 + +「消息待办」(msg todo)让一条群消息变成派活:勾选谁需要处理后,被勾选成员在该会话顶部和全局待办里会看到它,处理完点「完成」即可销项。可设可选的提醒时间。 + +## 入口 + +- 桌面端:鼠标悬停消息 → 操作菜单 → 「设为待办」 +- 桌面端:长按消息气泡 → 「设为待办」 +- 移动端:长按消息气泡 → 「设为待办」 + +## 操作步骤 + +1. 触发「设为待办」 +2. 选择目标: + - all:会话全部成员(默认) + - user:指定 userids +3. 可选:设置提醒时间 remind_at +4. 提交 → 群里出现一条 todo 类系统消息「XXX 把 YYY 设为待办」 + +## 完成待办 + +被指派的成员可在「会话顶部待办列表」或「全局待办」里点击「完成」。每完成一人,群消息会更新 done_userids。 + +## 取消 / 改提醒 + +- type=user 且 userids=[] 用于清除所有人的待办 +- todoremind 接口可单独改提醒时间(remind_at 为空则取消提醒) + +## 不支持 + +- 不支持把 tag / todo / notice 类型消息设为待办 +- 不支持已撤回 / 已删除的消息恢复待办 +- 普通成员在 todo_set_permission=close 时不能给别人派待办 diff --git a/resources/ai-kb/zh/howto/messenger/transfer.md b/resources/ai-kb/zh/howto/messenger/transfer.md new file mode 100644 index 000000000..0554be003 --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/transfer.md @@ -0,0 +1,55 @@ +--- +id: messenger.group.howto.transfer +title: 转让群主 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么转让群主 + - 移交群主 + - 换群主 + - 群主转让给别人 + - 转让群组 +related_tools: [] +related_pages: [messenger, dialog_chat] +prerequisites: + - 必须是当前群主 + - 仅支持普通群(group_type=user) + - 新群主必须已是群成员且账号有效 +negative: + - 项目群 / 任务群 / 部门群 / 全员群不支持转让群主 + - 不能把群主转让给自己(会报「你已经是群主」) + - 不能转给不存在 / 已离职 / 已禁用的账号 +last_verified: v1.7.90 +--- + +# 转让群主 + +群主(owner_id)可以把群组转让给群内其他成员。转让后原群主自动降级为普通成员,新群主自动写入 role=1,群内所有成员收到 groupUpdate 推送。 + +## 入口 + +- 桌面端:打开群聊 → 右上角群信息面板 → 「群主」字段右侧「转让」 +- 移动端:进群 → 右上角「⋯」→ 群组信息 → 「群主」→ 「转让群主」 + +## 操作步骤 + +1. 从成员列表选要接管的成员 +2. 二次确认(默认 check_owner=yes,要求是当前群主操作) +3. 提交后: + - owner_id 改为新群主 userid + - 旧群主 role 改为 0(普通成员) + - 新群主 role 改为 1 + - 推送 groupUpdate 给所有群成员 + +## 与群管理员的区别 + +- 群主:唯一,全部群管理权限,可解散群 +- 群管理员(deputy):可多个,能加人、踢人、改群名,但不能解散群、不能转让群主 +- 详见任命群管理员相关说明(在「添加和移除群成员」流程中) + +## 不支持 + +- 不支持把群主转给已离职 / 已删除账号 +- 不支持把项目群、任务群、部门群、全员群的"群主"转出,因为它们没有用户层面的群主概念 diff --git a/resources/ai-kb/zh/howto/messenger/vote.md b/resources/ai-kb/zh/howto/messenger/vote.md new file mode 100644 index 000000000..b3204f5fe --- /dev/null +++ b/resources/ai-kb/zh/howto/messenger/vote.md @@ -0,0 +1,64 @@ +--- +id: messenger.vote.howto +title: 群投票 +type: howto +feature: messenger +scope: end-user +locale: zh +aliases: + - 怎么发起投票 + - 群投票 + - 创建投票 + - 投票消息 + - 群里投个票 + - 怎么做投票 +related_tools: [send_message] +related_pages: [messenger, dialog_chat] +prerequisites: + - 必须在群对话内(包括项目群 / 任务群) +negative: + - 投票不支持设定截止时间,仅支持发起人手动「结束」 + - 投票不支持修改选项;要改只能结束后再发起 + - 用户对同一投票不可重复投,第二次提交会报「不能重复投票」 +last_verified: v1.7.90 +--- + +# 群投票 + +群投票(vote)是 messenger 内置消息类型之一,发起后以特殊卡片样式显示在消息流中,所有人可点击参与。支持单选 / 多选 / 匿名 / 强制结束 / 重新发起。 + +## 入口 + +- 桌面端:会话底部「+」附加菜单 → 「投票」 +- 移动端:底部「+」→ 「投票」 + +## 操作步骤 + +1. 输入投票主题(text,最长 200000 字) +2. 添加选项(list,至少 2 项) +3. 切换开关: + - 多选(multiple=1) + - 匿名(anonymous=1) +4. 发起 → 群里出现投票卡片,所有人均可点击参与 + +## 投票动作 (type) + +| type | 含义 | +|---|---| +| create | 发起新投票(默认) | +| vote | 提交选项 | +| finish | 发起人结束投票(state=0)| +| again | 用相同选项再发起一次 | + +## 投票统计 + +- 实时显示各选项票数 +- 匿名(anonymous=1):不显示投票人,仅显示数量 +- 非匿名:可点选项查看投票人列表 +- 多选(multiple=1):用户一次可勾多个 + +## 不支持 + +- 不支持改投(投后不可改),仅可重发整个投票 +- 不支持限定可投人员(群成员均可) +- 不支持加权投票,每人每选项 1 票 diff --git a/resources/ai-kb/zh/howto/micro-app/install.md b/resources/ai-kb/zh/howto/micro-app/install.md new file mode 100644 index 000000000..d943903e7 --- /dev/null +++ b/resources/ai-kb/zh/howto/micro-app/install.md @@ -0,0 +1,53 @@ +--- +id: micro-app.install.howto +title: 安装微应用 +type: howto +feature: micro-app +scope: admin +locale: zh +aliases: + - 怎么安装微应用 + - 装插件 + - 安装应用 + - 应用市场怎么用 + - 装 OKR + - 装思维导图 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 + - 主程序能访问应用市场镜像源(默认走 kuaifan 官方仓库) +negative: + - 普通成员不能安装微应用,入口对其隐藏 + - 安装过程依赖 Docker 拉镜像,未联网或镜像源不通时安装会一直卡在「下载中」 + - 不能离线导入插件包(无 manual upload 入口) +last_verified: v1.7.90 +--- + +# 安装微应用 + +## 入口 +- 桌面端:左侧栏「应用」→ 管理员分区的「应用商店」卡片(也叫应用市场)→ 选择应用 →「安装」 +- 移动端:竖屏底部 Tabbar「应用」→「应用商店」卡片 +- 「应用商店」卡片仅系统管理员(`userIsAdmin = true`)可见,普通成员没有安装入口 + +## 操作步骤 +1. 进入应用商店,按分类或搜索找到想装的应用(插件) +2. 点击「安装」,等待镜像拉取与容器启动(包大小决定时长,10MB 以上插件可能需要数分钟) +3. 安装成功后插件状态变为 `installed`,应用卡片出现在**所有用户**的应用面板,无需重启主程序 +4. 部分插件首次进入需配置(如 office 的 Doc 服务器、ai 的模型 Key) + +## 验证安装成功 +- 应用商店该插件按钮变为「卸载」/「更新」 +- 应用中心「常用」分区出现新卡片 +- 普通成员需刷新页面或重新登录才能看到(缓存) + +## 失败排查 +- 镜像源不通:检查服务器到镜像源网络 +- 端口冲突:检查 `docker/appstore/apps//docker-compose.yml` +- 详细排查模板见 [[okr.cannot-install.faq]] + +## 不支持 +- 普通成员不能安装微应用,「应用商店」对其隐藏 +- 单次只能装一个插件,无批量安装 +- 不能选指定版本(始终装应用商店推荐的版本) diff --git a/resources/ai-kb/zh/howto/micro-app/sort.md b/resources/ai-kb/zh/howto/micro-app/sort.md new file mode 100644 index 000000000..6cbcbbc73 --- /dev/null +++ b/resources/ai-kb/zh/howto/micro-app/sort.md @@ -0,0 +1,51 @@ +--- +id: micro-app.sort.howto +title: 微应用排序 +type: howto +feature: micro-app +scope: end-user +locale: zh +aliases: + - 微应用怎么排序 + - 调整应用顺序 + - 应用卡片排序 + - 应用拖动 + - 应用排列 + - 应用顺序改不了 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 排序保存后仅自己可见,不影响其他成员 + - 不能跨「常用」和「管理员」两个分区拖动卡片 + - 没有上下「置顶」/「置底」按钮,只能拖 +last_verified: v1.7.90 +--- + +# 微应用排序 + +## 入口 +- 桌面端:左侧栏「应用」→ 页面右上角「⋯」→「调整排序」 +- 移动端竖屏:底部 Tabbar「应用」→ 页面右上角「⋯」→「调整排序」 +- 所有用户可用,不需要管理员 + +## 操作步骤 +1. 点「调整排序」进入排序模式,卡片出现拖动手柄态 +2. 在「常用」或「管理员」分区内长按卡片拖动到目标位置(两个分区互相隔离) +3. 顶部出现「取消」/「恢复默认」/「保存」三按钮 +4. 调好后点「保存」,立即生效;未变化则按钮 disabled +5. 「恢复默认」恢复到系统默认顺序但不立刻保存,仍需点「保存」生效 + +## 保存范围 +- 排序保存到当前用户 `users/appsort/save` 接口,仅影响自己视图 +- 其他成员看到的仍是各自的顺序或默认顺序 +- 管理员自定义菜单([[micro-app.menu.concept]])才是全员可见的变更 + +## 退出排序模式 +- 「取消」/「保存」/ 顶部「⋯」→「退出排序」均可 +- 切走当前页面也会自动退出 + +## 不支持 +- 不支持跨分区拖动(常用 ↔ 管理员) +- 不支持把卡片拖出隐藏(只能整体新装 / 卸载) +- 不支持移动端手势的多选拖动 diff --git a/resources/ai-kb/zh/howto/micro-app/uninstall.md b/resources/ai-kb/zh/howto/micro-app/uninstall.md new file mode 100644 index 000000000..feea4b9f5 --- /dev/null +++ b/resources/ai-kb/zh/howto/micro-app/uninstall.md @@ -0,0 +1,51 @@ +--- +id: micro-app.uninstall.howto +title: 卸载微应用 +type: howto +feature: micro-app +scope: admin +locale: zh +aliases: + - 怎么卸载微应用 + - 删插件 + - 卸载应用 + - 删 OKR + - 移除微应用 + - 停掉插件 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 卸载只停容器并隐藏菜单,业务数据保留在数据库中,下次重装可继续使用 + - 卸载部分插件会让依赖该插件的功能失效(如 face 卸载后人脸签到不可用) + - 普通成员看不到卸载入口 +last_verified: v1.7.90 +--- + +# 卸载微应用 + +## 入口 +- 桌面端:左侧栏「应用」→ 应用市场 → 已安装插件 →「卸载」 +- 桌面端备选:系统设置 →「插件 / 应用市场」→ 选中目标插件 →「卸载」 +- 卸载入口仅 `userIsAdmin = true` 时可见 + +## 操作步骤 +1. 进入应用市场,切到「已安装」标签 +2. 找到目标插件,点击「卸载」 +3. 确认弹窗后等待容器停止与清理 +4. 卸载成功后插件状态变为 `uninstalled`,应用中心对应卡片消失(普通成员需刷新) + +## 数据保留与彻底清理 +- 默认卸载:保留业务数据表,仅停容器、删菜单 +- 重装可继续用旧数据 +- 彻底清理:需手动到数据库删表 + 删 `docker/appstore/config//`、`docker/appstore/apps//` + +## 依赖关系提醒 +- 卸载 `approve` → 审批中心入口消失,但已发起的审批数据保留 +- 卸载 `face` → 人脸识别签到不可用,已采集数据保留 +- 卸载 `office` → OnlyOffice 在线编辑不可用,文件可下载但不可在线编辑 + +## 不支持 +- 卸载不能选「同时清空数据」,须手动清 +- 无回收站,菜单卸载后立即消失 diff --git a/resources/ai-kb/zh/howto/minder/create.md b/resources/ai-kb/zh/howto/minder/create.md new file mode 100644 index 000000000..3b3708009 --- /dev/null +++ b/resources/ai-kb/zh/howto/minder/create.md @@ -0,0 +1,54 @@ +--- +id: minder.create.howto +title: 创建思维导图 +type: howto +feature: minder +scope: end-user +locale: zh +aliases: + - 怎么建思维导图 + - 新建脑图 + - 创建 mind map + - 加一张思维导图 + - 思维导图怎么开 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 minder 插件 + - 当前用户对目标文件夹/项目文件区有「编辑」权限 +negative: + - 不能在任务详情页直接「附件 → 新建思维导图」,需先在文件页创建再链接 + - 同一张图同一时间不支持多人并发编辑(详见 [[minder.collaboration.concept]]) + - 创建后无法把 `mind` 文件转成 `drawio` 或 `word` 文件 +last_verified: v1.7.90 +--- + +# 创建思维导图 + +## 入口 +思维导图作为一种「文件」存在,入口都在文件页: + +- 桌面端:左侧栏「文件」→ 选定目标文件夹 → 右上角「新建」按钮 →「思维导图」 +- 桌面端(右键):文件列表空白处右键 →「新建」→「思维导图」 +- 移动端:底部 Tabbar「文件」→ 进入目标文件夹 → 右下角「+」→「思维导图」 +- 项目文件:进入项目 →「文件」标签页 → 同上步骤 + +## 操作步骤 +1. 在新建菜单点击「思维导图」,文件列表多出一个待命名行 +2. 输入文件名(≤ 100 字符),回车保存 +3. 双击或单击文件名进入编辑器 +4. 编辑:双击节点改名、Tab 加子节点、回车加同级、Del 删节点 +5. 编辑器内自动保存,关闭即可 + +## 字段默认值 +- 文件名:默认「未命名」 +- 模板:默认(中心 + 第一圈分支);可在编辑器内切换「组织结构 / 文件树 / 右展开 / 鱼骨图 / 天盘」 +- 主题:天空蓝;可换「线框 / 鱼骨图 / 脑图经典 / 紧凑经典 / 温柔冷光 / 经典天盘」等 + +## 不支持 +- 不支持直接从模板文件拷贝(每次新建都是空白根节点) +- 不能在任务附件区直接「新建思维导图」,需先在文件页建好再附加 + +## 相关 +- 入口与权限:[[minder.entry.menu-map]] +- 协作能力:[[minder.collaboration.concept]] diff --git a/resources/ai-kb/zh/howto/mobile-client/download.md b/resources/ai-kb/zh/howto/mobile-client/download.md new file mode 100644 index 000000000..c37c2411b --- /dev/null +++ b/resources/ai-kb/zh/howto/mobile-client/download.md @@ -0,0 +1,71 @@ +--- +id: mobile-client.download.howto +title: 下载移动端 App +type: howto +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 下载移动端 + - App 在哪下 + - 手机怎么装 + - 安装 App + - 苹果商店搜什么 + - 应用宝下载 + - 安卓 apk + - 移动端安装 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - App 不内嵌服务器,首次启动需手动录入企业服务器地址 + - 国内 Android 渠道(华为/小米/OPPO 等)不一定全有,具体以分发为准 + - 通过浏览器下载 apk 安装需要在 Android 设置中允许「未知来源」 +last_verified: v1.7.90 +--- + +# 下载移动端 App + +## 下载渠道 + +### iOS(iPhone / iPad) +- **App Store**:打开 App Store 搜索「DooTask」(可能因地区差异) +- **TestFlight**:有些团队提供 TestFlight 测试通道(需邀请链接) +- **企业分发**:通过 MDM 推送到企业设备(需 IT 配合) + +### Android +- **Google Play**:海外用户走 Google Play 搜「DooTask」 +- **官方 apk**:从 DooTask 官网或公司内网下载 apk +- **应用商店**:部分国内应用商店(华为 / 小米 / OPPO / vivo / 应用宝)可能上架,以实际为准 +- 公司私有部署常见做法:运维提供 apk 链接,扫码或在浏览器下载安装 + +## 安装步骤 + +### iOS +1. App Store 找到 → 点「获取」/「安装」(Touch ID/Face ID 验证) +2. 装完桌面出现 DooTask 图标 + +### Android(apk 直装) +1. 用浏览器下载 apk 文件 +2. 点击 apk 安装,系统会提示「允许此来源安装应用」→ 打开开关 +3. 完成安装 + +### Android(应用商店) +1. 商店搜索 DooTask → 点「安装」 +2. 商店自动完成下载和安装 + +## 首次启动配置 +1. 启动 App,首屏要求录入**服务器地址**(如 `https://dootask.公司域名/`) +2. 输入账号密码登录,见 [[mobile-client.login.howto]] +3. 同意推送通知请求,以便收到消息([[mobile-client.notify.concept]]) + +## 切换服务器 +首次设置后服务器地址会保存。要切换: +1. 在 App 内退出登录(我的 → 退出登录) +2. 重新到登录页修改服务器地址 +3. 再用新账号登录 + +## 不支持 +- App 不能在同一设备同时登多个账号 +- 不支持「应用内更新」自动下载 apk(走系统商店 / 手动下载,见 [[mobile-client.update.howto]]) +- 国内分发渠道分布不固定,以最新官方说明为准 diff --git a/resources/ai-kb/zh/howto/mobile-client/login.md b/resources/ai-kb/zh/howto/mobile-client/login.md new file mode 100644 index 000000000..bbcebce42 --- /dev/null +++ b/resources/ai-kb/zh/howto/mobile-client/login.md @@ -0,0 +1,67 @@ +--- +id: mobile-client.login.howto +title: 移动端登录 +type: howto +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端登录 + - App 登录 + - 手机怎么登 + - 怎么登录手机端 + - 移动端怎么登陆 + - 切换账号 + - 手机登录方式 +related_tools: [] +related_pages: [] +prerequisites: + - 已知服务器地址(管理员或运维提供) + - 已有 DooTask 账号 +negative: + - 移动端默认不支持「记住密码」,仅保留登录令牌(token) + - 同一台手机不支持多账号并行,需退出再登 + - 微信 / 钉钉等第三方登录是否可用取决于服务端是否配置,不是 App 强制能力 +last_verified: v1.7.90 +--- + +# 移动端登录 + +## 入口 +首次安装打开 App 自动进入登录页;之后退出登录(我的 → 退出登录)再次返回登录页。 + +## 服务器地址 +DooTask 是企业自部署系统,**没有官方公共服务器**。登录前必须录入企业服务器地址: +- 格式:`https://dootask.公司域名/` 或 `http://内网 IP:端口/` +- 由 IT / 运维 / 部署管理员告知 +- 录入后会保存,后续无需重填,直到退出并改地址 + +## 登录方式 +按服务端配置不同,可能支持以下几种(出现的入口由服务端开关决定): + +1. **账号密码**(必备) + - 邮箱 / 手机号 + 密码 + - 邮箱通常是注册邮箱 +2. **手机短信验证码**(若服务端开启短信服务) +3. **邮箱验证码**(若服务端开启邮件服务) +4. **第三方登录**(若管理员配置) + - 微信 / 钉钉 / 企业微信 / 飞书等(以服务端实际开通为准) +5. **LDAP / SSO**(若企业接入,通常显示在登录页底部入口) + +## 操作步骤 +1. 录入服务器地址(首次) +2. 输入账号 + 密码 +3. 点「登录」 +4. 首次登录可能弹窗请求**推送通知权限**,务必允许,否则收不到推送 +5. 登录成功跳到首页(消息 Tab) + +## 常见登录问题 +- **服务器无法访问**:确认地址拼写、网络可达、服务端在线 +- **账号 / 密码错误**:返回登录页,点「忘记密码」(若服务端开放) +- **登录后立刻被踢**:同一账号在另一终端也登录且管理员开启「单端登录」时会互踢 +- **登不上去**:见 [[mobile-client.cannot-login.faq]] + +## 不支持 +- 不支持「无服务器一键登录」(自部署系统的天然限制) +- 不支持手机和邮箱共存的随意切换(注册时绑哪个为主) +- 不保证第三方登录可用:是否可用以服务端配置为准,App 本身只是入口 diff --git a/resources/ai-kb/zh/howto/mobile-client/update.md b/resources/ai-kb/zh/howto/mobile-client/update.md new file mode 100644 index 000000000..5cf66fe0d --- /dev/null +++ b/resources/ai-kb/zh/howto/mobile-client/update.md @@ -0,0 +1,76 @@ +--- +id: mobile-client.update.howto +title: 升级移动端 App +type: howto +feature: mobile-client +scope: end-user +locale: zh +aliases: + - 移动端升级 + - App 升级 + - 手机端更新 + - 新版本 App + - 怎么升级 App + - 移动端有新版本 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - App 内通常不直接下载安装包,只引导用户去商店 + - 自部署版本可能强制要求最低 App 版本,过旧版本会被服务端拒绝 + - iOS 不支持侧载,只能走 App Store / TestFlight / 企业证书 +last_verified: v1.7.90 +--- + +# 升级移动端 App + +## 升级方式概览 +移动端不像桌面端有 `electron-updater` 自动下载,升级走「应用市场更新」或「重新下载安装包」。 + +## iOS + +### App Store 升级 +1. 打开 App Store → 头像 → 滚到「可用更新」 +2. 找到 DooTask → 点「更新」 +3. 也可以打开 DooTask 在 App Store 的页面手动点更新 + +### TestFlight(测试版) +1. 打开 TestFlight App +2. 列表里 DooTask 旁边显示「更新」时点击 +3. TestFlight 版有效期 90 天 + +### 自动更新 +设置 → 「App Store」→ 打开「App 更新」开关,系统会自动后台升级。 + +## Android + +### Google Play 升级 +1. Google Play → 头像 → 「管理应用和设备」→「可用更新」 +2. 找到 DooTask 点「更新」 + +### 应用商店升级(国内) +1. 各品牌应用商店(华为 / 小米 / OPPO 等)的「我的」→「更新管理」 +2. 找到 DooTask 点更新 + +### apk 直装升级 +若用 apk 安装(私有部署): +1. 从公司渠道下载新版 apk +2. 直接安装新版会自动覆盖旧版(版本号高于已装版本) +3. 安装权限不足请到系统设置允许该浏览器 / 文件管理器作为「未知来源」 + +## App 内提示 +登录后若服务端检测到客户端版本过低,可能弹出「检测到新版本,请升级」提示。点提示会引导到对应商店或下载链接。 + +## 看当前版本 +- 我的 → 「关于」/「设置」→「版本号」 +- iOS 也可在「设置 → 通用 → iPhone 储存空间 → DooTask」看版本 + +## 升级后数据 +- 个人配置 / 登录令牌保留 +- 不会丢失聊天记录(数据在服务器) +- 推送 token 通常会重新注册一次 + +## 不支持 +- 不支持「App 内一键下载新安装包」(走系统商店或浏览器) +- iOS 不支持任何形式的侧载 +- 没有统一的 Android 更新流程:各厂商商店流程不同,以各自商店为准 diff --git a/resources/ai-kb/zh/howto/mobile-notify/silent.md b/resources/ai-kb/zh/howto/mobile-notify/silent.md new file mode 100644 index 000000000..aa091c7db --- /dev/null +++ b/resources/ai-kb/zh/howto/mobile-notify/silent.md @@ -0,0 +1,59 @@ +--- +id: mobile-notify.silent.howto +title: 移动端按时段免打扰 +type: howto +feature: mobile-notify +scope: end-user +locale: zh +aliases: + - 免打扰时段 + - 晚上不推送 + - 静音时段 + - 勿扰模式 + - 上班时间静音 + - 不推送时段 +related_tools: [] +related_pages: [] +prerequisites: + - 已下载 DooTask 移动端 APP 并登录 +negative: + - 时段免打扰只屏蔽通知和振动,消息正常到达 APP 消息列表 + - 没有「按周日生效」「按节假日生效」的细分;时段是每天循环 + - 时段免打扰不影响桌面端通知;桌面端要单独关,详见 [[desktop-notify.toggle.howto]] +last_verified: v1.7.90 +--- + +# 移动端按时段免打扰 + +## 入口 +DooTask 移动端 APP:「个人中心 / 我的 → 设置 → 消息免打扰」(不同版本菜单名可能略有差异,关键词「免打扰」)。 + +## 操作步骤 +1. 打开「消息免打扰」总开关 +2. 设置开始时间(如 22:00) +3. 设置结束时间(如 08:00) +4. 保存 +5. 时段内 APP 不再触发振动、不弹通知;时段外恢复 + +## 跨天时段 +开始时间 > 结束时间会被识别为跨天(如 22:00 → 08:00 表示「晚上 10 点到次日早 8 点」)。 + +## 与其他静音的关系 +- **会话级免打扰**(单个会话):[[push-notice.silent.howto]] 只对一个聊天生效,永久持续 +- **时段免打扰**:影响**所有**会话,但只在指定时间窗口内 +- 两者**叠加**:在免打扰时段内 + 该会话本来就免打扰 = 双重静音 + +## 系统级勿扰的区别 +- iOS / Android 自带「专注模式」「勿扰」:拦截所有 APP 通知,包括 DooTask +- DooTask 内的时段免打扰:只屏蔽 DooTask 自己的通知,不影响其他 APP +- 同时启用时取最严格者 + +## 即便免打扰仍可能感知到 +- 角标数仍会更新(红点出现) +- 进入 APP 看消息列表仍能看到新消息和未读数 +- 紧急联系人 / 系统提示等若被特殊标记,是否例外取决于 APP 版本 + +## 不支持 +- 不支持按星期分别配置时段(如「工作日 22-8,周末 23-9」) +- 多个免打扰时段(只支持一段) +- 不支持按会话类型设置例外(如「免打扰时段内但允许单聊推送」) diff --git a/resources/ai-kb/zh/howto/mobile-notify/toggle.md b/resources/ai-kb/zh/howto/mobile-notify/toggle.md new file mode 100644 index 000000000..4c85c1540 --- /dev/null +++ b/resources/ai-kb/zh/howto/mobile-notify/toggle.md @@ -0,0 +1,55 @@ +--- +id: mobile-notify.toggle.howto +title: 移动端通知开关 +type: howto +feature: mobile-notify +scope: end-user +locale: zh +aliases: + - 关移动端通知 + - 不要手机通知 + - 关闭 APP 通知 + - 手机静音 + - 关掉提醒 + - 开通知 +related_tools: [] +related_pages: [] +prerequisites: + - 已下载并登录 DooTask 移动端 APP +negative: + - DooTask APP 内没有「全局通知总开关」按钮,要靠系统通知权限或会话级免打扰 + - 卸载重装会重新申请通知权限;以前的免打扰会话状态仍保留在云端 + - 关闭通知权限不会取消 UmengAlias 注册,重新打开权限即刻恢复 +last_verified: v1.7.90 +--- + +# 移动端通知开关 + +## 整体策略 +DooTask 不在 APP 内单独提供「通知开关」。要控制移动端是否提醒,按需要的范围选下面三种方式之一。 + +## 方式 1:系统级关闭整个 APP 通知(强) +彻底不收 DooTask 通知: +- **iOS**:「设置 → DooTask → 通知」→ 关闭「允许通知」 +- **Android(原生)**:「设置 → 应用 → DooTask → 通知」→ 关闭 +- **Android(国产 ROM)**:通常在「设置 → 应用管理 → DooTask → 通知管理」 +- 关闭后系统通知栏推送和前台浮层都不显示 + +## 方式 2:按时段免打扰(推荐用户日常) +DooTask 支持「指定时段不再振动 / 不再推送」: +- 详见 [[mobile-notify.silent.howto]] +- 适合工作休息时段(如 22:00-08:00)静默 + +## 方式 3:单个会话免打扰(推荐针对吵闹群) +仅对某个聊天关闭推送: +- 进入会话 → 顶部「···」→「消息免打扰」 +- 详见 [[push-notice.silent.howto]] +- 该方式同时影响桌面端和未读邮件 + +## 重新打开 +- 系统通知关闭后:回到系统设置中重新允许 +- 时段免打扰:在 DooTask 内修改时间段或关闭功能 +- 会话免打扰:进入会话 → 关闭「消息免打扰」 + +## 重启 APP 不需要 +所有开关都即时生效,无需手动重启 APP;如果改完仍未生效,下拉刷新或退出登录重进。 diff --git a/resources/ai-kb/zh/howto/office/create.md b/resources/ai-kb/zh/howto/office/create.md new file mode 100644 index 000000000..68568f32a --- /dev/null +++ b/resources/ai-kb/zh/howto/office/create.md @@ -0,0 +1,57 @@ +--- +id: office.create.howto +title: 创建在线文档(Word/Excel/PPT) +type: howto +feature: office +scope: end-user +locale: zh +aliases: + - 怎么建在线 Word + - 新建在线表格 + - 新建在线 PPT + - 创建 docx + - 怎么在 DooTask 写文档 + - 在线 office 怎么开 +related_tools: [] +related_pages: [file] +prerequisites: + - 应用市场已安装 office(OnlyOffice)插件 + - 当前用户对目标文件夹/项目文件区有「编辑」权限 +negative: + - 创建后无法把在线 Word 转成 DooTask 自带的 `document` 文件类型 + - 创建后文件扩展名固定(docx/xlsx/pptx),不能在 DooTask 内改后缀 + - 不能在任务详情页直接「附件 → 新建 Word」,需先在文件页创建再链接 +last_verified: v1.7.90 +--- + +# 创建在线文档(Word/Excel/PPT) + +## 入口 +在线文档作为「文件」存在,入口都在文件页: + +- 桌面端:左侧栏「文件」→ 选定目标文件夹 → 右上角「新建」按钮 →「Word 文档 / Excel 工作表 / PPT 演示文稿」 +- 桌面端(右键):文件列表空白处右键 →「新建」→ 同上三选一 +- 移动端:底部 Tabbar「文件」→ 进入目标文件夹 → 右下角「+」→ 同上三选一 +- 项目文件:进入项目 →「文件」标签页 → 新建菜单 → 同上三选一 + +## 操作步骤 +1. 点击「新建 → Word 文档(或 Excel / PPT)」,文件列表多出一个待命名行 +2. 输入文件名(≤ 100 字符),回车保存——文件扩展名按所选类型自动决定(docx/xlsx/pptx) +3. 双击或单击文件名进入编辑器(iframe 加载 OnlyOffice) +4. 直接在浏览器编辑:体验与桌面 Office 接近,支持公式、批注、修订、格式刷等 +5. 自动保存:OnlyOffice 在内容停止变更后约 10 秒触发保存,关闭也会触发 + +## 上传已有文档 +- 上传扩展名在 `doc/docx/xls/xlsx/ppt/pptx/odt/ods/odp/csv/rtf` 等列表内的文件,双击即可在线编辑(不需要先转格式) + +## 字段默认值 +- 文件名:默认「未命名」(扩展名自动加 .docx / .xlsx / .pptx) +- 模板:空白文档/工作表/演示文稿 + +## 不支持 +- 不能在任务附件区直接「新建 Word」,需先在文件页建好再附加 +- 不能跨类型转换(docx 改不成 xlsx) + +## 相关 +- 入口与权限:[[office.entry.menu-map]] +- 多人协作能力:[[office.collaboration.concept]] diff --git a/resources/ai-kb/zh/howto/okr/align.md b/resources/ai-kb/zh/howto/okr/align.md new file mode 100644 index 000000000..2d7c67203 --- /dev/null +++ b/resources/ai-kb/zh/howto/okr/align.md @@ -0,0 +1,58 @@ +--- +id: okr.align.howto +title: OKR 上下级对齐 +type: howto +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 对齐 + - 对齐上级 OKR + - OKR 拆解 + - 个人 OKR 怎么跟团队 + - OKR 关联 + - OKR 上下游 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 + - 上级 / 团队 OKR 已经创建并可见 +negative: + - 对齐不是抄袭,个人 KR 不应直接复制团队 KR + - 对齐关系不会自动同步进度,需各自单独更新 +last_verified: v1.7.90 +--- + +# OKR 上下级对齐 + +## 入口 +- 桌面端:左侧栏「应用」→「OKR 管理」→ 编辑自己的 OKR → 找到「对齐 / 关联上级」相关设置 +- 移动端:底部 Tabbar「应用」→「OKR 管理」→ 同上路径 + +## 为什么要对齐 +对齐让个人 / 团队 OKR 与公司战略产生明确的因果链:上级的 O 拆成下级的 KR(或下级的某个 O),形成一棵目标树。这样团队成员能看到自己工作对全局的贡献。 + +## 操作步骤 +1. 先了解上级 / 团队的 OKR 内容 +2. 创建或编辑自己的 OKR([[okr.create.howto]]) +3. 在 OKR 表单中关联到一条或多条上级 OKR +4. 在自己的 KR 中明确「支撑了上级哪一项 KR」 +5. 保存后,上下级 OKR 之间会建立可追溯的关联 + +## 对齐的几种方式 +- **垂直对齐**:个人 → 直属上级 → 团队 → 公司,自上而下的目标树 +- **横向对齐**:不同团队就同一战略协同时,互相关联 OKR +- **混合对齐**:一个个人 OKR 可同时关联多条上级 OKR + +## 对齐时的建议 +- 不要把上级 KR 原文照搬到自己的 KR +- 用「我做什么能帮上级达成 KR」的视角拆解 +- 与直属上级沟通后再正式对齐,确保理解一致 + +## 不支持 +- 对齐不会自动复制 KR 内容 +- 上级 OKR 进度更新不会自动推算到下级,需各自单独更新 + +## 相关 +- 团队 vs 个人 OKR:[[okr.team.concept]] +- KR 更新:[[okr.update-progress.howto]] diff --git a/resources/ai-kb/zh/howto/okr/create.md b/resources/ai-kb/zh/howto/okr/create.md new file mode 100644 index 000000000..8efe89a99 --- /dev/null +++ b/resources/ai-kb/zh/howto/okr/create.md @@ -0,0 +1,60 @@ +--- +id: okr.create.howto +title: 创建 OKR +type: howto +feature: okr +scope: end-user +locale: zh +aliases: + - 怎么定 OKR + - 写 OKR + - 新建 OKR + - 建一条 OKR + - 加 OKR + - 我要写 OKR +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 + - 已确定本周期的目标方向 +negative: + - O 本身不带数字,量化交给 KR + - 一个 O 建议配 2-5 个 KR,不要超过 5 个 +last_verified: v1.7.90 +--- + +# 创建 OKR + +## 入口 +- 桌面端:左侧栏「应用」→「OKR 管理」(`apps/okr/list`) +- 移动端:底部 Tabbar「应用」→「OKR 管理」 +- 在「我的 OKR」或类似列表页有「+ 新建」入口 + +## 操作步骤 +1. 打开「OKR 管理」页面 +2. 点击新建按钮,进入 OKR 编辑表单 +3. 填写 Objective(O):用一句话写清这个周期想达成什么(不写数字) +4. 添加 Key Result(KR):按「+」逐条添加 2-5 个可量化的关键结果 +5. 选择所属周期(如 Q1/Q2/Q3/Q4 或年度,按团队约定) +6. 可选:对齐到上级 / 团队 OKR(参见 [[okr.align.howto]]) +7. 保存提交 + +## 写作建议 +- O 短小有方向感,例:「让新用户更快上手」 +- KR 必须可量化,带起点和目标值,例:「新用户首日留存率从 35% 提升到 50%」 +- 一次最多 3-5 个 O,避免分散注意力 +- 写完邀请直属上级或团队过审,确保方向对齐 + +## 创建后能做什么 +- 周期内:定期更新 KR 进度([[okr.update-progress.howto]]) +- 周期内:在 OKR 详情接收同事反馈与点评 +- 周期末:参与评审复盘([[okr.review.howto]]) + +## 不支持 +- O 字段不应填数字指标——量化交给 KR +- 已创建的 OKR 不建议中途频繁改 O 内容,需要调整时建议留改动记录或新建版本 + +## 相关 +- O 是什么:[[okr.objective.concept]] +- KR 是什么:[[okr.kr.concept]] +- 周期:[[okr.cycle.concept]] diff --git a/resources/ai-kb/zh/howto/okr/review.md b/resources/ai-kb/zh/howto/okr/review.md new file mode 100644 index 000000000..4e59222c5 --- /dev/null +++ b/resources/ai-kb/zh/howto/okr/review.md @@ -0,0 +1,63 @@ +--- +id: okr.review.howto +title: OKR 周期评审与复盘 +type: howto +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 复盘 + - OKR 评分 + - OKR 总结 + - OKR 周期末做什么 + - OKR 怎么打分 + - OKR review +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 + - 已在进行中的 OKR 接近周期末 +negative: + - OKR 分数不直接等同于绩效,不应与薪酬强绑定 + - 60-70% 的完成度通常算合格,挑战性目标 100% 反而值得反思 +last_verified: v1.7.90 +--- + +# OKR 周期评审与复盘 + +## 入口 +- 桌面端:左侧栏「应用」→「OKR 管理」→ 选中要评审的 OKR +- 管理员视角:左侧栏「应用」→「OKR 结果」(`apps/okr/analysis`),可看全员汇总数据 + +## 评审时机 +- 周期末(季度末 / 年末)的最后 1-2 周 +- 重大里程碑节点(可做中期评审) + +## 操作步骤 +1. 把所有 KR 的最终进度更新到位(参见 [[okr.update-progress.howto]]) +2. 打开 OKR 详情,逐条 KR 给出最终得分(0-100%) +3. 写一段总结,回答: + - 哪些 KR 达成 / 未达成?原因? + - 过程中遇到什么阻碍?怎么解决的? + - 下一周期需要保留 / 调整什么? +4. 邀请直属上级 / 团队成员一起复盘(建议召开 OKR 回顾会议) +5. 沉淀经验后开新周期 OKR + +## 打分参考 +- **0.6-0.7**:挑战性目标的合格线(O 通常视为达成) +- **0.4-0.6**:部分达成,需复盘原因 +- **< 0.4**:未达成,需要分析战略 / 执行问题 +- **1.0**:满分;若所有 KR 都满分,可能目标定得不够挑战 + +## 团队层面 +- 管理员可在「OKR 结果」页面查看团队整体完成度分布与趋势 +- 用于发现共性阻碍、跨团队对齐缺口 + +## 不支持 +- 分数本身不是绩效结论,应结合背景与过程综合判断 +- 复盘不应只走过场打分,关键在于沉淀经验 + +## 相关 +- KR 概念:[[okr.kr.concept]] +- 周期:[[okr.cycle.concept]] +- 团队 OKR:[[okr.team.concept]] diff --git a/resources/ai-kb/zh/howto/okr/update-progress.md b/resources/ai-kb/zh/howto/okr/update-progress.md new file mode 100644 index 000000000..c90e44143 --- /dev/null +++ b/resources/ai-kb/zh/howto/okr/update-progress.md @@ -0,0 +1,57 @@ +--- +id: okr.update-progress.howto +title: 更新 KR 进度 +type: howto +feature: okr +scope: end-user +locale: zh +aliases: + - 更新 OKR 进度 + - 改 KR 进度 + - OKR 打分 + - KR 怎么填进度 + - 我的 OKR 怎么推进 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件 + - 已创建至少一条 OKR(参见 [[okr.create.howto]]) +negative: + - 只能由 KR 负责人(或团队管理员)更新进度,他人无法替改 + - 不建议每天频繁改动,业界推荐每周一次节奏 +last_verified: v1.7.90 +--- + +# 更新 KR 进度 + +## 入口 +- 桌面端:左侧栏「应用」→「OKR 管理」→ 进入「我的 OKR」→ 选中目标 O → 找到对应 KR +- 移动端:底部 Tabbar「应用」→「OKR 管理」→ 我的 OKR + +## 操作步骤 +1. 打开自己负责的某条 OKR +2. 找到要更新的 KR 行 +3. 编辑当前进度(百分比 0-100% 或更新实际数值,由插件按 KR 类型解析) +4. 可选:写一段进度说明(这周做了什么、遇到什么阻碍) +5. 保存 + +## 更新节奏 +- 推荐每周更新一次,月初 / 月末额外回顾 +- 重大进展 / 阻碍随时更新,让协作者及时看到 +- 周期末必须填最终值,作为评审打分依据(参见 [[okr.review.howto]]) + +## 进度的含义 +- 0%:完全未启动 +- 30-60%:稳步推进中 +- 60-70%:达到挑战性目标的合格线 +- 100%:完成全部目标值 +- > 100%:超额达成(部分团队允许,按团队约定) + +## 不支持 +- 不能由非负责人替改 KR 进度 +- 改动会留下记录,无法静默修改 + +## 相关 +- KR 是什么:[[okr.kr.concept]] +- 周期评审:[[okr.review.howto]] +- 创建 OKR:[[okr.create.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/add-deputy.md b/resources/ai-kb/zh/howto/org-department/add-deputy.md new file mode 100644 index 000000000..db3f23e8a --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/add-deputy.md @@ -0,0 +1,57 @@ +--- +id: org-department.add-deputy.howto +title: 任命部门管理员 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 任命部门管理员 + - 加部门管理员 + - 加 deputy + - 给部门加副管理员 + - 部门多个负责人 + - 怎么让多人管理部门 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) + - 目标部门已存在 + - 被任命用户存在且不是该部门的部门负责人(owner_userid) +negative: + - 不能把部门负责人(owner_userid)任命为部门管理员,会报「不能将部门负责人任命为部门管理员」 + - 任命部门管理员**会自动**把用户加入该部门(写入 `users.department`),并加入部门群(role=2、important=true) + - 操作幂等:重复任命已是 deputy 的用户不会报错 + - 仅系统管理员可调用,部门负责人本人无权任命 +last_verified: v1.7.90 +--- + +# 任命部门管理员 + +## 入口 +- 桌面端:管理后台 → 团队管理 → 选中目标部门 → 在右侧成员列表中找到目标用户 → 行操作菜单「任命为部门管理员」 +- 接口:`POST api/users/department/adddeputy`,参数 `id`(部门 id)+ `userid`(被任命用户) + +## 操作步骤 +1. 选择目标部门 +2. 选择被任命用户(必须存在的活跃用户) +3. 提交,成功提示「任命成功」 + +## 任命后系统会自动做的事 +| 动作 | 影响 | +|---|---| +| 写 user_department_owners 表 | 标记 deputy 身份(unique key 幂等) | +| 加入 users.department | 该用户成为部门成员(与负责人对齐) | +| 加入部门群 | 自动入群,important=true(防止被普通群操作打散) | +| 群内 role 设为 2 | 在部门群中显示为部门管理员 | + +## 部门管理员能做什么 +任命后该用户拥有的能力见 [[org-department.deputy.concept]]:开启「部门负责人视角」后可只读查看本部门及下级成员参与的项目和任务。 + +## 不支持 +- 不能批量任命,要逐个用户调接口 +- 不能任命已是 owner_userid 的本部门负责人 + +## 相关 +- 罢免:[[org-department.del-deputy.howto]] +- 负责人视角:[[org-department.deputy-view.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/add.md b/resources/ai-kb/zh/howto/org-department/add.md new file mode 100644 index 000000000..4bc3ee1c6 --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/add.md @@ -0,0 +1,62 @@ +--- +id: org-department.add.howto +title: 新建或修改部门 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 新建部门 + - 加部门 + - 添加部门 + - 创建部门 + - 修改部门 + - 改部门名字 + - 加子部门 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) +negative: + - 部门名称必须 2-20 字,不能含特殊符号(`~!@#$%^&*()+-_=.:?<>,`)或字符串 `(M)` + - 部门层级最多 3 级,第 4 级会被接口拒绝 + - 每个父部门最多 20 个直属子部门 + - 全系统最多 200 个部门 + - 不能选自己的子部门作为上级(防成环) + - owner_userid 必填且必须是有效用户;一个用户最多负责 10 个部门 +last_verified: v1.7.90 +--- + +# 新建或修改部门 + +## 入口 +- 桌面端:管理后台 → 团队管理 → 底部「+ 新建部门」按钮 +- 桌面端:管理后台 → 团队管理 → 某部门行尾「⋯」→「添加子部门」或「编辑」 +- 接口:`GET api/users/department/add`(限管理员) + +## 操作步骤 +1. 点击「新建部门」或某部门「⋯」→「编辑」 +2. 填写**部门名称**(2-20 字,禁特殊符号) +3. 选择**上级部门**(可空,空即顶级部门) +4. 选择**部门负责人**(必填,单选) +5. 创建时可选**部门群**模式: + - `new`(默认):自动创建同名部门群 + - `use`:选一个已有用户群转为部门群(dialog_useid 必填) +6. 提交,成功提示「新建成功」/「保存成功」 + +## 校验规则 +| 校验 | 说明 | +|---|---| +| 名称长度 | 2-20 字符(mb_strlen) | +| 名称符号 | 禁正则 `[\Q~!@#$%^&*()+-_=.:?<>,\E]` | +| 父部门层级 | 父部门的 parents 不能超过 2(实际最多 3 级) | +| 子部门数量 | 每个父部门 ≤ 20 个直属子 | +| 全局总数 | ≤ 200 个部门 | +| 同一用户负责数 | ≤ 10 个部门 | + +## 改部门负责人 +传入 id + 新 owner_userid 即可;底层会自动转让部门群群主(role=1),原负责人 role 降为 0。 + +## 相关 +- 任命部门管理员(多人):[[org-department.add-deputy.howto]] +- 删除部门:[[org-department.delete.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/del-deputy.md b/resources/ai-kb/zh/howto/org-department/del-deputy.md new file mode 100644 index 000000000..cf3813d59 --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/del-deputy.md @@ -0,0 +1,57 @@ +--- +id: org-department.del-deputy.howto +title: 罢免部门管理员 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 罢免部门管理员 + - 取消部门管理员 + - 移除 deputy + - 删除部门管理员 + - 撤销部门管理员 + - 部门管理员怎么去掉 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) + - 目标部门已存在 +negative: + - 罢免操作**会同时**:① 删除 `user_department_owners` 记录;② 从 `users.department` 移除该部门 ID;③ 让用户退出部门群 + - 不能罢免部门负责人(owner_userid);接口对 owner_userid 调用时仅做悬挂记录清理,不会把负责人踢出部门或群 + - 操作幂等:重复罢免非 deputy 用户不报错也不做任何事 + - 仅系统管理员可调用 +last_verified: v1.7.90 +--- + +# 罢免部门管理员 + +## 入口 +- 桌面端:管理后台 → 团队管理 → 选中部门 → 在成员列表中找到该部门管理员 → 操作菜单「取消部门管理员」 +- 接口:`POST api/users/department/deldeputy`,参数 `id`(部门 id)+ `userid`(被罢免用户) + +## 操作步骤 +1. 选择目标部门 +2. 选择要罢免的部门管理员(必须当前是该部门的 deputy) +3. 提交,成功提示「罢免成功」 + +## 罢免后系统的副作用 +| 副作用 | 说明 | +|---|---| +| 删除 deputy 记录 | `user_department_owners` 表对应行删除 | +| 移出部门 | 用户的 `users.department` 字段移除该部门 ID | +| 退出部门群 | exitGroup 调用,成员关系一致 | +| 推送 groupUpdate | 部门群内其他成员实时收到 deputy_ids 变更 | + +## 误操作恢复 +没有"撤销罢免",重新走 [[org-department.add-deputy.howto]] 即可(流程一致,自动重新加入部门 + 群)。 + +## 不支持 +- 不能罢免部门负责人(owner_userid);改负责人要用 [[org-department.add.howto]] 传 id + 新 owner_userid +- 不能批量罢免,逐个用户调接口 +- 不能"只删 deputy 标记保留部门成员关系",二者绑定 + +## 相关 +- 任命:[[org-department.add-deputy.howto]] +- 部门负责人/管理员的角色定义:[[org-department.deputy.concept]] diff --git a/resources/ai-kb/zh/howto/org-department/delete.md b/resources/ai-kb/zh/howto/org-department/delete.md new file mode 100644 index 000000000..7a972eb21 --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/delete.md @@ -0,0 +1,60 @@ +--- +id: org-department.delete.howto +title: 删除部门 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 删除部门 + - 删部门 + - 销毁部门 + - 移除部门 + - 部门怎么删 + - 删除部门会怎么样 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) + - 目标部门下没有子部门(否则需先删除子部门) +negative: + - 含子部门的部门**不能直接删**,会报「含有子部门无法删除」,必须先删所有子部门 + - 删除会**自动**把所有成员从该部门移出(`users.department` 字段中移除该部门 ID) + - 删除会**自动解散**该部门绑定的部门群(dialog_id 对应群) + - 删除后无法恢复 + - 仅系统管理员可调用 +last_verified: v1.7.90 +--- + +# 删除部门 + +## 入口 +- 桌面端:管理后台 → 团队管理 → 某部门行尾「⋯」→ 「删除」(红色文字) +- 接口:`GET api/users/department/del`,参数 `id`(部门 id) + +## 前置条件 +该部门下**不能**有子部门。如有子部门,先删子部门: +1. 选中最深层叶子部门 → 删除 +2. 逐层向上,最后删父部门 + +## 操作步骤 +1. 在部门树找到目标部门 +2. 点击行尾「⋯」→「删除」 +3. 二次确认后提交,成功提示「删除成功」 + +## 删除时系统的副作用 +| 副作用 | 说明 | +|---|---| +| 移出全体成员 | 所有 `users.department` 包含该部门 ID 的用户被批量移除 | +| 解散部门群 | dialog_id 对应的部门群被删除 | +| 清理部门管理员 | `user_department_owners` 表对应记录全部删除(防悬挂) | +| 删除部门记录 | UserDepartment 行删除 | + +## 不支持 +- 不支持级联删(含子部门必须先删子) +- 不支持"软删除",删除即彻底删 +- 不支持"保留群解散部门"或反向操作 + +## 相关 +- 新建/修改:[[org-department.add.howto]] +- 同步成员(避免误删):[[org-department.sync.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/deputy-view.md b/resources/ai-kb/zh/howto/org-department/deputy-view.md new file mode 100644 index 000000000..cf895effc --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/deputy-view.md @@ -0,0 +1,60 @@ +--- +id: org-department.deputy-view.howto +title: 切换到部门负责人视角 +type: howto +feature: org-department +scope: end-user +locale: zh +aliases: + - 负责人视角 + - 部门负责人视角 + - 看下属项目 + - 看部门成员项目 + - 切换部门视角 + - 怎么查看下属任务 + - 主管视角 +related_tools: [] +related_pages: [] +prerequisites: + - 当前用户是某部门的部门负责人(owner_userid)或部门管理员(deputy) + - 系统管理员已在系统设置中开启「部门负责人视角」(`department_owner_project_view = open`) +negative: + - 没开启系统开关时,`info/managed_departments` 接口固定返回空数组,前端不显示入口 + - 仅"只读"视角;不能修改项目、添加成员、改任务 + - 项目可单独关闭"部门负责人视角可见"(`projects.department_owner_view = close`),关闭后对负责人隐藏 + - 用户在多个部门同时管理时,弹窗会列出所有可切换部门,可多选或全选 + - 视角不持久跨多设备,是当前会话的偏好(保存在 `cacheDepartmentOwnerIds`) +last_verified: v1.7.90 +--- + +# 切换到部门负责人视角 + +## 入口 +- 桌面端:右上角头像菜单 → 顶部「负责人视角」入口(仅当 `managed_departments` 非空时出现) +- 接口(拉可管理部门):`GET api/users/info/managed_departments` +- 接口(应用偏好):`store.dispatch("setDepartmentOwnerIds", ids)` + +## 操作步骤 +1. 点击右上角头像 → 「负责人视角」 +2. 弹窗显示我可管理的部门清单 +3. 勾选要"切入"的部门(可多选 / 全选 / 反选 / 清空) +4. 点击「确定」生效 + +## 切换后效果 +- 项目列表:除自己参与的项目外,新增可见所选部门成员参与的项目(标记 `department_readonly=true`) +- 任务列表:可只读浏览这些项目的全员可见任务 +- 仪表盘 / 报表:相关聚合数据会把这些部门成员纳入统计范围 +- 退出视角:再次打开弹窗 → 「清空」→「确定」 + +## 接口数据来源 +- 我可管理的部门 = 我是 `owner_userid` 的部门 ∪ 我在 `user_department_owners` 表的部门 +- 实际看到的项目 = 上述部门**递归全部下级**的成员所在项目(不含已关闭"部门负责人视角可见"的项目) + +## 不支持 +- 视角无法修改下属数据,所有操作按钮在 readonly 项目内会被隐藏或禁用 +- 不能查看下属"全员不可见"的私密任务 +- 系统未开启开关时本功能完全不可用 + +## 相关 +- 角色定义:[[org-department.deputy.concept]] +- 任命部门管理员:[[org-department.add-deputy.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/list.md b/resources/ai-kb/zh/howto/org-department/list.md new file mode 100644 index 000000000..933c78d4b --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/list.md @@ -0,0 +1,54 @@ +--- +id: org-department.list.howto +title: 查看与管理部门列表 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 部门列表 + - 看部门 + - 部门有哪些 + - 查看所有部门 + - 部门管理 + - 怎么看公司部门 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) +negative: + - 普通成员看不到全量部门列表,只能看自己所在部门(info__departments,最多 10 条) + - 列表按 id 升序,不支持自定义排序 + - 列表不分页,全量返回(受全系统 200 个上限保护) +last_verified: v1.7.90 +--- + +# 查看与管理部门列表 + +## 入口 +- 桌面端:右上角头像菜单 → 「管理后台」→ 左侧 → 「团队管理」→ 顶部部门栏 +- 接口:`GET api/users/department/list`(仅管理员) + +## 操作步骤 +1. 进入团队管理页,左侧是部门树 +2. 顶层「默认部门」表示未分配部门的成员(系统内置,不能删/改) +3. 点击任一部门可在右侧看到该部门的成员列表 + +## 部门项展示的信息 +- 部门名称(最多 20 字) +- 部门负责人头像(owner_userid) +- 部门管理员头像(deputy_userids,多个时显示 `+N`) +- 行尾「⋯」菜单:添加子部门、部门交流群、同步部门成员、编辑、删除 + +## 普通成员视角 +普通成员通过 `GET api/users/info/departments` 拿到的"我的部门列表"最多 10 条,按是否本人为负责人优先排序;不是这里讲的管理后台。 + +## 不支持 +- 列表无搜索(部门数最多 200,肉眼可找) +- 列表无分页 + +## 相关 +- 新建:[[org-department.add.howto]] +- 任命部门管理员:[[org-department.add-deputy.howto]] +- 删除:[[org-department.delete.howto]] +- 同步成员:[[org-department.sync.howto]] diff --git a/resources/ai-kb/zh/howto/org-department/sync.md b/resources/ai-kb/zh/howto/org-department/sync.md new file mode 100644 index 000000000..1d20c7c5a --- /dev/null +++ b/resources/ai-kb/zh/howto/org-department/sync.md @@ -0,0 +1,63 @@ +--- +id: org-department.sync.howto +title: 同步部门成员 +type: howto +feature: org-department +scope: admin +locale: zh +aliases: + - 同步部门 + - 同步部门成员 + - 部门成员同步 + - 把子部门成员同步到上级 + - 父部门看到子部门成员 + - 部门成员归集 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin) + - 目标部门下有子部门 +negative: + - 同步是"子部门成员合并到当前部门",**不是**反向(不会把当前部门成员推到子部门) + - 同步是单向、追加:只新增 `users.department` 里没有该部门 ID 的用户,已在的不重复加 + - 已 disable_at 的用户被跳过,不会同步进部门或部门群 + - 没有子部门时返回成功但不做事,提示「同步完成,子部门中没有成员需要同步」 + - 同步与 LDAP 拉取无关:DooTask 内部不直接通过此接口对接 LDAP +last_verified: v1.7.90 +--- + +# 同步部门成员 + +## 是什么 +"同步部门成员"是把所有**子部门**(递归)的成员合并到**当前部门**的一键操作。常用于:父部门负责人希望看到/管理下属部门的全部成员,但不想手动逐个调整 `users.department`。 + +## 入口 +- 桌面端:管理后台 → 团队管理 → 某部门行尾「⋯」→ 「同步部门成员」 +- 接口:`GET api/users/department/sync`,参数 `id`(要同步的目标部门 id) + +## 操作步骤 +1. 选中目标父部门 +2. 点击「⋯」→「同步部门成员」 +3. 提交,弹出结果提示: + - `同步完成,共同步 N 个成员` + - 若部分人员已在当前部门:`其中 M 个成员已在当前部门` + +## 返回字段 +| 字段 | 含义 | +|---|---| +| `synced_count` | 本次新加入该部门的人数 | +| `already_in_dept_count` | 已在该部门、跳过的人数 | +| `sub_department_ids` | 所有递归子部门 ID 列表 | + +## 副作用 +- 子部门成员的 `users.department` 追加目标部门 ID +- 部门群(dialog_id)会自动 joinGroup 把"在部门但不在群"的人补齐 +- 全程事务:失败回滚 + +## 不支持 +- 不支持"反向同步"(把父部门成员推下去) +- 不支持"仅预览不写入" + +## 相关 +- 部门概念:[[org-department.concept]] +- 删除部门会自动移出成员:[[org-department.delete.howto]] diff --git a/resources/ai-kb/zh/howto/project/archive-delete.md b/resources/ai-kb/zh/howto/project/archive-delete.md new file mode 100644 index 000000000..105a09c69 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/archive-delete.md @@ -0,0 +1,63 @@ +--- +id: project.archive-delete.howto +title: 项目归档 / 删除 / 恢复 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 归档项目 + - 删除项目 + - 项目恢复 + - 项目隐藏 + - 项目结束了怎么收起 +related_tools: [update_project] +related_pages: [project_settings, project_list] +prerequisites: + - 是项目拥有者(owner=1) +negative: + - 项目管理员(owner=2)不能归档 / 删除项目 + - 删除项目会软删所有任务、列、标签、工作流,但不立即清理磁盘 + - 归档项目仍在搜索、可访问;只是从默认列表收起 +last_verified: v1.7.90 +--- + +# 项目归档 / 删除 / 恢复 + +## 三种状态 + +| 状态 | 字段 | 列表展示 | 可恢复 | +|---|---|---|---| +| 正常 | 无 | ✓ | n/a | +| 归档 | archived_at 非空 | 「已归档」筛选下 | 取消归档即可 | +| 删除 | deleted_at 非空 | 不显示 | 回收站恢复 | + +## 入口 +- 桌面端:项目顶部「⋯」 → 「归档项目」/「删除项目」 +- 桌面端:项目列表「已归档」筛选 → 单项「取消归档」 +- 回收站:管理后台 → 系统设置 → 数据回收 + +## 归档操作 +1. 拥有者点「归档项目」 +2. 写入 `archived_at` + `archived_userid` +3. 项目从默认列表收起,群聊(dialog_id)不被清理 +4. 成员能在「已归档」筛选下找到,仍可读,但不能修改 + +## 删除操作 +1. 拥有者点「删除项目」并二次确认 +2. 写入 `deleted_at`,级联软删所有任务、列、工作流、标签 +3. 群聊同步软删(成员从群里看不到这个对话) +4. ProjectLog 留一条删除记录 + +## 恢复 +- 归档:在已归档列表点「取消归档」,立即恢复 +- 删除:进回收站找到项目 → 「恢复」,任务 / 列 / 标签一并恢复 +- 普通成员只能恢复自己删除的项目,看不到他人删除的 + +## 自动归档 +- 在 [[project.update.howto]] 设置 `archive_method=custom + archive_days=N` +- 任务完成 N 天后自动归档对应任务(不归档整个项目) + +## 不支持 +- 个人项目([[project.personal.concept]])不能转给他人后再删 +- 项目删除不会自动通知成员,需要手动告知 diff --git a/resources/ai-kb/zh/howto/project/column-add.md b/resources/ai-kb/zh/howto/project/column-add.md new file mode 100644 index 000000000..94c3d0d2e --- /dev/null +++ b/resources/ai-kb/zh/howto/project/column-add.md @@ -0,0 +1,58 @@ +--- +id: project.column.howto.add +title: 给项目添加列(看板分栏) +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 加一列 + - 添加看板列 + - 项目加列 + - 加一个分栏 + - 看板新增列 +related_tools: [get_project] +related_pages: [project_detail, project_kanban] +prerequisites: + - 有 TASK_LIST_ADD 权限(默认拥有者 / 管理员) +negative: + - 单项目最多 50 列 + - 初次创建项目时模板默认 ≤ 30 列 + - 列名重复不被自动拦截(允许同名) +last_verified: v1.7.90 +--- + +# 给项目添加列(看板分栏) + +## 是什么 +DooTask 的「列」(ProjectColumn)是看板视图的物理分栏,按 `column_id` 把任务分组展示。每项目最多 50 列。常见列名:待办、进行中、已完成、待审核、待发布。 + +## 入口 +- 桌面端:项目看板视图最右侧 「+ 添加列」按钮 +- 桌面端:项目设置 → 「列管理」 → 「+ 新列」 + +## 操作步骤 +1. 点 + 按钮 +2. 输入列名(≤30 字符) +3. 选颜色(可选) +4. 保存,新列追加在最右侧(sort 排到末尾) +5. 服务端写入 ProjectColumn 并 WebSocket 推送给项目成员 + +## 字段 +- `name`:列名 +- `color`:色块(可选,显示在列头标题前) +- `sort`:排序值(拖动调整) + +## 与「工作流节点」的关系 +- 列只是物理分栏;状态语义靠工作流([[project.flow.howto.create]])表达 +- 不绑定工作流时:每列独立,拖任务只改 column_id +- 绑定 columnid 到工作流节点时:拖列联动改 flow_item_id + +## 操作权限 +- 默认仅项目拥有者 / 管理员可加列 +- 普通成员可通过 ProjectPermission([[project.permission.concept]])的 `TASK_LIST_ADD` 权限点放开 + +## 不支持 +- 单项目不能超过 50 列(最多 50 列) +- 不能跨项目共享列模板 +- 列没有"折叠"功能(视觉收起需要前端临时操作) diff --git a/resources/ai-kb/zh/howto/project/column-edit.md b/resources/ai-kb/zh/howto/project/column-edit.md new file mode 100644 index 000000000..4c62d0982 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/column-edit.md @@ -0,0 +1,55 @@ +--- +id: project.column.howto.edit +title: 编辑项目列(改名 / 颜色 / 排序) +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 改列名 + - 改列颜色 + - 列重命名 + - 调整列顺序 + - 看板列改名 +related_tools: [get_project] +related_pages: [project_kanban, project_settings] +prerequisites: + - 有 TASK_LIST_UPDATE / TASK_LIST_SORT 权限 +negative: + - 改列名 / 颜色不影响列内任务的 column_name 快照(仅看板色条变化) + - 拖动改顺序只调 sort,不会迁移任务 + - 列绑定工作流节点时,改列名不同步改节点名 +last_verified: v1.7.90 +--- + +# 编辑项目列(改名 / 颜色 / 排序) + +## 入口 +- 桌面端:项目看板视图 → 列标题右侧「···」菜单,里面有「修改」「归档」「删除」和预设色板 + +## 改列名 +1. 点列标题右侧「···」→「修改」 +2. 弹出「修改列表」弹窗,输入新列表名称(不能为空) +3. 点确定保存,服务端写入后 WebSocket 推送给所有项目成员 + +## 改颜色 +1. 「···」菜单下半部分是预设色板(色块在左、色名在右) +2. 点击某色即设为列头底色;再次点击当前已选色取消颜色 +3. 颜色只能从预设色板选,不支持自定义十六进制 + +## 归档 / 删除列 +- 「归档」:归档该列所有已完成任务(二次确认) +- 「删除」:删除列及列内任务(二次确认) + +## 调整排序 +- 直接左右拖动列头 +- 服务端按位置重写整组列的 `sort` 字段,不改任何任务字段 + +## 与工作流的联动 +- 列绑定工作流节点([[project.flow.howto.edit]] 的 columnid)时:改列名、改列顺序都**不同步**到工作流节点 + +## 不支持 +- 不支持双击列名直接改名,必须走「···」→「修改」弹窗 +- 列名不强制唯一(允许同名) +- 不能批量改多列颜色 +- 不能给列单独配权限(仅整项目 TASK_LIST_UPDATE 一档) diff --git a/resources/ai-kb/zh/howto/project/column-remove.md b/resources/ai-kb/zh/howto/project/column-remove.md new file mode 100644 index 000000000..0a227f2c0 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/column-remove.md @@ -0,0 +1,54 @@ +--- +id: project.column.howto.remove +title: 删除项目列(级联删除任务) +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 删除列 + - 删一列 + - 删看板列 + - 列里任务怎么办 + - 删除列任务会丢吗 +related_tools: [get_project] +related_pages: [project_kanban, project_settings] +prerequisites: + - 有 TASK_LIST_REMOVE 权限 +negative: + - 删列**会级联软删该列下所有任务**(含子任务) + - 删列前不会自动迁移任务到其他列,需手动 [[task.move.howto.column]] + - 删除后任务可在回收站恢复,列本身也可恢复 +last_verified: v1.7.90 +--- + +# 删除项目列(级联删除任务) + +## 重要提醒 +**删列会同时软删该列下所有任务。** 这是 DooTask 的设计行为(不是 BUG),原因:列是任务的物理归属,孤儿任务没有合理去处。 + +## 入口 +- 桌面端:看板视图列头右键 → 「删除列」 +- 桌面端:项目设置 → 「列管理」 → 单列「删除」 + +## 操作步骤 +1. 确认弹窗会显示「将一并删除 X 个任务」 +2. 二次确认 +3. 服务端: + - 软删 ProjectColumn(deleted_at) + - 级联软删所有 column_id 命中此列的 ProjectTask + - 级联软删所有这些任务的子任务、附件、聊天室 +4. ProjectLog 记一条「X 删了列 Y 和 N 个任务」 + +## 避免误删的建议 +- **删列前先迁任务**:拖任务到别的列([[task.move.howto.column]])或归档([[task.archive.howto]]) +- 想把列彻底废弃但保留任务记录:建一个「已归档」列,把任务全拖过去 + +## 恢复 +- 回收站找到项目 → 「恢复任务」可单独恢复任务,但 column_id 仍指向已删的列 +- 整列恢复:管理后台数据恢复,会一并恢复列 + 任务 + +## 不支持 +- 不能"软删列保留任务"(只有迁任务 + 删列两步法) +- 列内任务过多时(>100)没有分批删除:服务端依然会一次性级联软删,操作可能慢几秒 +- 删列后绑定的工作流节点不会自动解绑 columnid,需手动改 diff --git a/resources/ai-kb/zh/howto/project/create.md b/resources/ai-kb/zh/howto/project/create.md new file mode 100644 index 000000000..e5fbe5889 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/create.md @@ -0,0 +1,51 @@ +--- +id: project.create.howto +title: 创建项目 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 怎么建项目 + - 新建项目 + - 开个项目 + - 创建团队项目 + - 新建工作空间 +related_tools: [create_project] +related_pages: [project_list, dashboard] +prerequisites: + - 站点设置 project_add_permission 命中你的角色(详见 [[project.permission-to-create.faq]]) +negative: + - 个人项目(personal=1)每个用户只能有 1 个 + - 项目名称必填,≤100 字符 + - 创建时启用工作流后无法再回退到「无工作流」模式 +last_verified: v1.7.90 +--- + +# 创建项目 + +## 入口 +- 桌面端:左侧栏「项目」分组顶部「+」按钮 → 弹窗 +- 桌面端:仪表盘空状态 → 「+ 新建项目」 +- 移动端:项目 Tab → 右上角「+」 + +## 操作步骤 +1. 输入项目名称(必填,≤100 字符),可加 emoji 当图标 +2. 可选填项目描述 +3. 选「项目模板」(系统预置的默认列模板,如开发 / 简单看板) +4. 选是否启用工作流([[project.flow.concept.default]]) +5. 点「创建」,服务端生成 Project + ProjectColumn + WebSocketDialog 群聊 + +## 默认结构 +- 默认创建你为「项目负责人」(owner=1) +- 默认 3-5 列(按选中的模板,可后续 [[project.column.howto.add]] 增删) +- 自动建项目群聊([[project.dialog.concept]]),把你拉进群 +- ProjectLog 记一条「X 创建了项目 Y」 + +## 团队项目 vs 个人项目 +- 默认创建团队项目(personal=0),可邀请他人 +- 想建只给自己用的项目,选「个人项目」(personal=1),详见 [[project.personal.concept]] + +## 不支持 +- 创建时不能直接指定第一批成员,需创建后再 [[project.member.howto]] 邀请 +- 不支持把已有任务在创建时批量导入,需要走 [[task.move.howto.cross-project]] diff --git a/resources/ai-kb/zh/howto/project/exit.md b/resources/ai-kb/zh/howto/project/exit.md new file mode 100644 index 000000000..702d571b8 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/exit.md @@ -0,0 +1,54 @@ +--- +id: project.exit.howto +title: 主动退出项目 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 退出项目 + - 离开项目 + - 不想参与项目了 + - 主动退群 + - 取消参与项目 +related_tools: [get_project] +related_pages: [project_settings, project_member] +prerequisites: + - 当前用户是项目成员(非拥有者) +negative: + - 项目拥有者不能直接退出,必须先 [[project.transfer.howto]] 转让 + - 退出后名下未完成任务的负责人会被自动转给拥有者 + - 退出后仍能看到自己历史发布的消息 / 任务,但失去新通知 +last_verified: v1.7.90 +--- + +# 主动退出项目 + +## 入口 +- 桌面端:项目顶部「⋯」 → 「退出项目」 +- 桌面端:项目设置 → 「成员管理」 → 自己行 → 「退出项目」 +- 移动端:项目详情右上角菜单 → 「退出」 + +## 操作步骤 +1. 选「退出项目」 +2. 弹窗显示:「退出后名下 N 个未完成任务将转给项目拥有者」 +3. 确认后服务端: + - 删 ProjectUser 自己一行 + - 把名下 ProjectTaskUser 命中的 owner=1 任务转给项目拥有者(assist 不变) + - 同步移出 [[project.dialog.concept]] 群聊 + - ProjectLog 记一条「X 退出了项目」 + +## 拥有者想退出怎么办 +1. 先转让拥有者:[[project.transfer.howto]] 把 owner=1 给别人 +2. 转后自己变 owner=0,再走退出流程 +3. 没有合适接班人 → 不能退出,只能删项目([[project.archive-delete.howto]]) + +## 退出后能看到什么 +- 历史项目动态、消息、自己发的内容仍在数据库 +- 但你的左侧栏 / 项目列表中看不到该项目 +- 站点搜索仍可能命中你发的内容(按权限筛) + +## 不支持 +- 不能"暂时离开"(一退就是永久,再加回来要 [[project.member.howto]]) +- 不能保留消息通知(退出后该项目所有推送停止) +- 个人项目([[project.personal.concept]])不能退出,只能删 diff --git a/resources/ai-kb/zh/howto/project/export.md b/resources/ai-kb/zh/howto/project/export.md new file mode 100644 index 000000000..12ec694f0 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/export.md @@ -0,0 +1,53 @@ +--- +id: project.export.howto +title: 导出任务到 Excel(任务统计 / 超期任务) +type: howto +feature: project +scope: admin +locale: zh +aliases: + - 导出任务 + - 导出 Excel + - 项目任务导出 + - 超期任务导出 + - 任务统计表 +related_tools: [list_tasks] +related_pages: [project_settings, project_detail] +prerequisites: + - 需要系统管理员权限(普通成员没有导出入口) +negative: + - 导出任务限管理员,普通成员和项目负责人没有此功能 + - 单次最多选择 100 个成员,时间范围最长 90 天 + - 导出为异步生成,完成后由系统消息机器人发下载链接,不在浏览器直接下载 +last_verified: v1.7.90 +--- + +# 导出任务到 Excel(任务统计 / 超期任务) + +## 是什么 +DooTask 的任务导出是**管理员功能**,按成员 + 时间范围把任务数据导出为 Excel: + +- 「导出任务统计」(接口 `project/task/export`) +- 「导出超期任务」(接口 `project/task/exportoverdue`) + +## 入口 +- 桌面端:左上角头像 / 昵称下拉菜单 → 「团队管理」子菜单 → 「导出任务统计」或「导出超期任务」 +- 桌面端:左侧栏「应用」→ 管理员应用「数据导出」卡片 → 选「导出任务统计」或「导出超期任务」 +- 以上入口仅系统管理员可见 + +## 操作步骤(导出任务统计) +1. 弹出「导出任务统计」对话框 +2. 选「导出成员」(每次最多 100 个成员) +3. 选「时间范围」(最长 90 天,支持快捷选择上个月 / 这个月) +4. 选「导出时间类型」:任务时间(默认)或创建时间 +5. 点「导出」,服务端异步生成 Excel +6. 完成后系统消息机器人发「导出任务统计已完成」消息,点击其中链接下载 .xlsx + +## 文件包含字段 +任务 ID、父级任务 ID、所属项目、任务标题、标签、开始 / 结束时间、完成时间、归档时间、计划用时、实际用时、超时时间、负责人、创建人、状态等。 + +## 不支持 +- 普通成员不能导出任务(没有入口,接口也校验管理员身份) +- 单次导出成员不能超过 100 个,时间范围不能超过 90 天 +- 不能导出附件(仅任务数据) +- 不支持 CSV / JSON 格式(仅 Excel) diff --git a/resources/ai-kb/zh/howto/project/flow-create.md b/resources/ai-kb/zh/howto/project/flow-create.md new file mode 100644 index 000000000..4fa97a722 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/flow-create.md @@ -0,0 +1,56 @@ +--- +id: project.flow.howto.create +title: 在项目设置中启用 / 创建工作流 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 项目工作流 + - 启用工作流 + - 自定义任务流程 + - 给项目加流程 + - 配置流程节点 +related_tools: [update_project] +related_pages: [project_settings, project_flow] +prerequisites: + - 是项目拥有者或管理员 + - 项目不是个人项目([[project.personal.concept]] 不支持工作流) +negative: + - 单个工作流最多 10 个节点 + - 工作流启用后无法回退到"无流程"模式 + - 个人项目(personal=1)不支持工作流 +last_verified: v1.7.90 +--- + +# 在项目设置中启用 / 创建工作流 + +## 是什么 +DooTask 工作流(ProjectFlow + ProjectFlowItem)让任务在「待办 / 开发 / 测试 / 完成」等自定义状态间流转。比裸用「列」([[project.column.howto.add]])更适合"按工序推进"的场景。任务详情见 [[task.flow.concept]]。 + +## 入口 +- 桌面端:项目设置 → 「工作流」标签 → 「启用工作流」 +- 创建项目时也可勾选「启用工作流」直接套默认 5 节点(见 [[project.flow.concept.default]]) + +## 创建步骤 +1. 点「启用工作流」(如未启用)或「+ 新增节点」 +2. 填节点: + - 名称(≤20 字符) + - 状态类型:`start` 起点 / `end` 终点 / 普通节点 + - 颜色(看板色条用) + - 可流转到的节点(turns,多选) + - 节点负责人(userids,限制只有这些人能让任务进此节点) + - 流转模式(usertype:add 追加 / replace 替换 / merge 合并负责人) + - 绑定列(columnid,可选) +3. 排序(拖动调整 sort) +4. 保存 + +## 启用后的行为 +- 项目自动切到「工作流」视图 +- 拖动任务到 `status=end` 节点 → 任务 `complete_at` 自动写入(完成) +- 拖到非 end 节点 → 仅改 flow_item_id + +## 不支持 +- 单流程不能超过 10 个节点(最多 10 节点) +- 工作流不能跨项目共享 +- 启用后无法关闭工作流,但可改节点 diff --git a/resources/ai-kb/zh/howto/project/flow-edit.md b/resources/ai-kb/zh/howto/project/flow-edit.md new file mode 100644 index 000000000..6ada1e602 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/flow-edit.md @@ -0,0 +1,69 @@ +--- +id: project.flow.howto.edit +title: 编辑工作流节点 / 流转规则 / 负责人 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 改工作流节点 + - 改流转规则 + - 工作流负责人 + - 工作流绑定列 + - 编辑流程节点 +related_tools: [update_project] +related_pages: [project_settings, project_flow] +prerequisites: + - 是项目拥有者或管理员 + - 项目已启用工作流([[project.flow.howto.create]]) +negative: + - 节点的 columnid 一旦绑定,拖列与改流转状态联动 + - 删除节点不会回填已存在任务的 flow_item_id(任务可能"卡"在不存在的节点上) + - 改节点名只改新任务的 flow_item_name,已存在任务保留旧名 +last_verified: v1.7.90 +--- + +# 编辑工作流节点 / 流转规则 / 负责人 + +## 入口 +- 桌面端:项目设置 → 「工作流」 → 节点列表 +- 拥有者 / 管理员才可改 + +## 节点字段 +| 字段 | 含义 | +|---|---| +| `name` | 节点名(≤20 字符) | +| `status` | start / progress / test / end | +| `color` | 节点色块(看板色条用) | +| `turns` | 可流转到的节点 id 数组 | +| `userids` | 节点负责人(限定只有这些人可让任务进入此节点) | +| `usertype` | add 追加 / replace 替换 / merge 合并任务负责人 | +| `userlimit` | 是否锁定 userids(不允许其他人接手) | +| `columnid` | 可选绑定到具体列 | +| `sort` | 在列表中的展示顺序 | + +## 改节点 +1. 在节点行点编辑 +2. 改字段后「保存」 +3. 服务端 update + WebSocket 推送 + +## 改 turns(流转规则) +- 多选「这个节点可以流转到哪些节点」 +- 不在 turns 列表的节点禁止直接流转 +- 想让任意流转 → 把所有节点都加入 turns + +## userids + usertype 联动 +- usertype=add:拖任务到此节点,userids 中的人自动加入任务协作者 +- usertype=replace:拖任务到此节点,任务负责人改为 userids 中的人 +- usertype=merge:合并任务负责人 + userids 去重 +- userlimit=1:非 userids 的人不能让任务流转到此节点 + +## 绑定 columnid 的副作用 +- 看板视图拖任务跨列 → flow_item_id 自动同步 +- 工作流视图拖任务跨节点 → column_id 自动同步 +- 不绑定时两个视图各自独立 + +## 不支持 +- 不能批量编辑多个节点 +- 不能给节点单独配「跳过完成时间字段」之类的副作用 +- 删除节点不会清理"卡在该节点的任务",需要手动改任务的 flow_item_id diff --git a/resources/ai-kb/zh/howto/project/invite.md b/resources/ai-kb/zh/howto/project/invite.md new file mode 100644 index 000000000..706fc3252 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/invite.md @@ -0,0 +1,58 @@ +--- +id: project.invite.howto +title: 项目邀请链接 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 邀请链接 + - 项目邀请 + - 加入项目 + - 邀请别人加项目 + - 邀请码 +related_tools: [get_project] +related_pages: [project_settings, project_member] +prerequisites: + - 是项目拥有者(owner=1)或管理员(owner=2) + - 站点设置开启 project_invite +negative: + - 邀请链接通过 code 唯一识别项目,不绑定具体邀请人 + - 链接刷新后旧链接立即失效 + - 接收邀请的用户会自动加入项目,不走审批 +last_verified: v1.7.90 +--- + +# 项目邀请链接 + +## 是什么 +DooTask 通过 `ProjectInvite` 表生成项目邀请:每条记录 `project_id + code + num`,其中 `code` 是加密的邀请码,凭它可直接加入项目,无需审批。常用于"把链接发到群里让大家自己加"。 + +## 入口 +- 桌面端:项目设置 → 「成员管理」 → 顶部「邀请链接」 +- 桌面端:项目顶部「⋯」 → 「邀请成员」 → 「复制链接」 + +## 操作步骤 +1. 拥有者 / 管理员点击「生成邀请链接」(首次)或「刷新」(已有时换新) +2. 复制链接(或扫描二维码) +3. 把链接发给目标用户 +4. 目标用户打开链接登录 → 自动加入项目(owner=0)+ 进 [[project.dialog.concept]] 群聊 + +## 链接管理 +- 一个项目只有一条邀请链接(一对一),刷新后旧链接立即失效 +- `num` 字段累计经此链接加入的人数 +- 暂时禁用:在系统设置关闭 `project_invite` 开关 + +## 与「[[project.member.howto]] 直接加成员」的区别 + +| 维度 | 邀请链接 | 直接加成员 | +|---|---|---| +| 是否要被邀请人配合 | 是(点链接) | 否(直接加) | +| 是否走审批 | 否(直加) | 否(直加) | +| 适合人数 | 多人 / 不确定 | 已知列表 | +| 链接可销毁 | 是(刷新) | 不适用 | + +## 不支持 +- 邀请链接不能限制有效次数 / 有效期(要禁用必须刷新换新) +- 邀请不能指定加入后的角色,默认 owner=0 +- 不支持邮件 / 短信自动发送邀请,需手动复制链接 diff --git a/resources/ai-kb/zh/howto/project/member.md b/resources/ai-kb/zh/howto/project/member.md new file mode 100644 index 000000000..466b49198 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/member.md @@ -0,0 +1,56 @@ +--- +id: project.member.howto +title: 添加 / 移除项目成员,任命管理员 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 加项目成员 + - 删项目成员 + - 任命项目管理员 + - 罢免管理员 + - 项目里加人 +related_tools: [search_users, get_project] +related_pages: [project_settings, project_member] +prerequisites: + - 是项目拥有者(owner=1)或管理员(owner=2) + - 任命 / 罢免管理员只能是拥有者 +negative: + - 不能移除项目拥有者本人(必须先转让拥有者再退) + - 管理员不能移除其他管理员、不能罢免管理员 + - 加成员不需要对方同意(直接加入,[[project.dialog.concept]] 群也自动加) +last_verified: v1.7.90 +--- + +# 添加 / 移除项目成员,任命管理员 + +## 入口 +- 桌面端:项目顶部「⋯」 → 「成员管理」面板 +- 也可:项目设置 → 「成员」 + +## 添加成员 +1. 「+ 添加成员」搜框输入昵称 / 邮箱 +2. 勾选目标用户(可多选) +3. 确认后服务端写 ProjectUser(owner=0),同步加进 [[project.dialog.concept]] 群聊 +4. 成员立即看到项目,无需对方同意 + +## 移除成员 +1. 在成员列表选成员 → 「移除」 +2. 服务端删 ProjectUser、同步移出群聊 +3. 该成员名下未完成任务的 owner 会被自动转给操作人 / 项目拥有者 +4. 移除后该成员仍可在历史动态里被看到 + +## 任命管理员 +- 只有拥有者可操作 +- 成员行 → 「任命为管理员」 → owner 改为 2 +- 管理员获得改项目设置 / 加删成员的权限 + +## 罢免管理员 +- 只有拥有者可操作 +- 成员行 → 「罢免管理员」 → owner 改回 0 + +## 不支持 +- 管理员不能罢免其他管理员 +- 不能直接移除拥有者:必须先 [[project.transfer.howto]] 转让 +- 加成员后该成员立即可见所有 visibility=1(项目人员可见)的任务,无法分批授权 diff --git a/resources/ai-kb/zh/howto/project/search.md b/resources/ai-kb/zh/howto/project/search.md new file mode 100644 index 000000000..79f0ada7f --- /dev/null +++ b/resources/ai-kb/zh/howto/project/search.md @@ -0,0 +1,57 @@ +--- +id: project.search.howto +title: 搜索 / 筛选项目 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 找项目 + - 搜项目 + - 项目筛选 + - 找不到项目 + - 项目快搜 +related_tools: [list_projects] +related_pages: [project_list] +prerequisites: [] +negative: + - 默认不显示已归档项目,要切到「已归档」筛选 + - 普通成员搜不到自己未加入的项目(即便项目名公开) + - 不支持按项目内任务名 / 描述全文搜(要走 [[search 全局搜索]]) +last_verified: v1.7.90 +--- + +# 搜索 / 筛选项目 + +## 入口 +- **桌面端**:项目列表顶部搜索框 +- **桌面端快捷键**:Cmd/Ctrl + P 唤起项目快搜 +- **左侧栏**:项目分组顶部「🔍」按钮 +- **移动端**:项目 Tab → 顶部搜索框 + +## 支持的筛选维度 +| 维度 | 取值 | 说明 | +|---|---|---| +| 名称 | 关键字 | 模糊匹配 Project.name | +| 类型 | all / team / personal | 团队 / 个人 | +| 归档状态 | all / yes / no | 按 archived_at | +| 时间范围 | 起止日期 | 按 created_at | + +## 操作步骤 +1. 输入项目名关键字(中英文均可) +2. 可选切「类型 / 归档 / 时间」筛选 +3. 列表实时过滤 + +## 普通成员 vs 管理员的差异 +- 普通成员:只能搜到自己已加入的项目(ProjectUser 命中) +- 站点管理员(userIsAdmin):能搜全站项目,包括没参与的 + +## 项目内全文搜 +- 想搜项目内任务、消息、文件:走顶部全局搜(Cmd/Ctrl + K)唤起的全局搜索 +- 搜索结果按权限过滤,看不到无权限的内容 +- 全局搜底层用 Manticore,详细能力会在 search feature 的 chunk 起草后补充 + +## 不支持 +- 不支持按"项目内任务标题"反向搜项目 +- 不支持按拥有者筛选项目 +- 不支持自定义"我喜欢的项目"标签筛选(仅置顶 / 排序,见 [[project.sort.howto]]) diff --git a/resources/ai-kb/zh/howto/project/sort.md b/resources/ai-kb/zh/howto/project/sort.md new file mode 100644 index 000000000..3c4a4f794 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/sort.md @@ -0,0 +1,57 @@ +--- +id: project.sort.howto +title: 项目列表排序与置顶 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 项目置顶 + - 项目排序 + - 项目放最上面 + - 调整项目顺序 + - 取消置顶 +related_tools: [list_projects] +related_pages: [project_list] +prerequisites: [] +negative: + - 置顶 / 排序是每用户独立的(ProjectUser.top_at / sort) + - 不能给整团队设默认排序 + - 项目内任务不能用此机制置顶(任务排序见 [[task.sort.howto]]) +last_verified: v1.7.90 +--- + +# 项目列表排序与置顶 + +## 是什么 +DooTask 项目列表的顺序由两个字段决定,都按用户级别独立存储在 `ProjectUser` 表: +- `top_at`:置顶时间戳,非空则项目固定在顶部 +- `sort`:手动排序值,决定置顶以下的相对顺序 + +列表查询排序规则:**top_at DESC、sort ASC、id DESC**。 + +## 置顶项目 +- 桌面端:项目左侧栏右键项目 → 「置顶」 +- 桌面端:项目列表悬停项目 → 「📌」按钮 +- 移动端:长按项目行 → 「置顶」 + +服务端写入当前时间到 ProjectUser.top_at,项目立即排到顶部。后置顶的项目排得更靠前。 + +## 取消置顶 +- 同入口,点「取消置顶」 +- 服务端把 top_at 置空 +- 项目回到非置顶区,按 sort 重新排 + +## 调整非置顶项目顺序 +- 桌面端:在左侧栏拖动项目 +- 服务端 `user__sort` 接口按拖动后的位置批量重写 sort 值 +- 不会影响置顶区的相对顺序 + +## 与「项目内任务排序」的区别 +- 项目排序是用户的私人视图(每用户独立) +- 任务排序([[task.sort.howto]])是项目内全局视图,所有成员看到的顺序一致 + +## 不支持 +- 不能按字段自动排序(如按修改时间) +- 不能给团队 / 部门设统一默认排序 +- 置顶项目数无限制,但前端展示区有限,置顶太多会出现滚动 diff --git a/resources/ai-kb/zh/howto/project/transfer.md b/resources/ai-kb/zh/howto/project/transfer.md new file mode 100644 index 000000000..4aaac1b20 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/transfer.md @@ -0,0 +1,46 @@ +--- +id: project.transfer.howto +title: 移交项目(转让项目负责人) +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 转让项目 + - 项目交接 + - 改项目负责人 + - 离职交接项目 + - 移交项目 +related_tools: [update_project] +related_pages: [project_settings] +prerequisites: + - 当前用户是项目主负责人(owner=1) +negative: + - 移交后原主负责人变回普通成员(owner=0),不会自动变成项目管理员 + - 移交动作没有回滚按钮,需要新负责人再移交回来 + - 项目管理员(owner=2)无法发起移交,仅主负责人可操作 +last_verified: v1.7.90 +--- + +# 移交项目(转让项目负责人) + +## 是什么 +DooTask 项目主负责人(owner=1)每项目唯一,是项目内最高权限角色。「移交项目」把这个角色让给另一名用户,原主负责人降为普通成员(owner=0)。常见于团队负责人变更、离职交接、内部组织调整。 + +## 入口 +- 桌面端:打开项目页 → 右上角项目「···」下拉菜单 → 「移交项目」(仅项目主负责人可见此菜单项) + +## 操作步骤 +1. 弹出「移交项目」弹窗,在「新项目负责人」选择一名用户(单选;可以不是当前项目成员,移交后自动加入项目) +2. 点「移交」确认提交 +3. 服务端: + - 改 ProjectUser:原主负责人 owner=1→0,新负责人设为 owner=1(原是项目管理员则从 2 升为 1) + - 其他项目管理员(owner=2)身份保留 + - 同步 [[project.dialog.concept]] 项目群聊的 owner_id(群归属一并变更) + - Project 表的 `userid`(创建人)不变(保留历史) +4. ProjectLog 记一条「移交项目给 X」 + +## 不支持 +- 移交不会顺带把任务负责人一起转,需要单独改任务字段 +- 移交后没有回滚按钮,需新负责人再移交一次 +- 项目管理员(owner=2)和普通成员看不到「移交项目」菜单 diff --git a/resources/ai-kb/zh/howto/project/update.md b/resources/ai-kb/zh/howto/project/update.md new file mode 100644 index 000000000..d2786eed9 --- /dev/null +++ b/resources/ai-kb/zh/howto/project/update.md @@ -0,0 +1,55 @@ +--- +id: project.update.howto +title: 编辑项目基本信息与设置 +type: howto +feature: project +scope: end-user +locale: zh +aliases: + - 改项目名 + - 改项目描述 + - 项目设置 + - 自动归档项目 + - AI 自动分析项目 +related_tools: [update_project] +related_pages: [project_settings] +prerequisites: + - 是项目拥有者(owner=1)或项目管理员(owner=2) +negative: + - 普通成员(owner=0)无法编辑项目设置 + - 改名不影响 dialog_id 群聊的标题(需单独改群名) + - 关闭 AI 自动分析后已生成的分析结果不会清除 +last_verified: v1.7.90 +--- + +# 编辑项目基本信息与设置 + +## 入口 +- 桌面端:项目顶部「⋯」菜单 → 「项目设置」 +- 移动端:项目详情页右上角齿轮图标 + +## 可编辑字段 +| 字段 | 含义 | 谁能改 | +|---|---|---| +| name | 项目名称 | 拥有者 / 管理员 | +| desc | 项目描述 | 拥有者 / 管理员 | +| archive_method | 自动归档方式(disable / custom) | 拥有者 / 管理员 | +| archive_days | 自动归档天数(complete_at 多久后) | 拥有者 / 管理员 | +| ai_auto_analyze | AI 自动分析任务 | 拥有者 / 管理员 | +| task_template_share | 任务模板共享([[task.template.howto]]) | 拥有者 / 管理员 | +| department_owner_view | 部门负责人视角(只读) | 拥有者 / 管理员 | + +## 操作步骤 +1. 进入项目设置面板 +2. 改对应字段 +3. 点「保存」,服务端 update + WebSocket 推送 + +## 自动归档 +- `archive_method=disable`:从不自动归档 +- `archive_method=custom`:任务完成 `archive_days` 天后自动归档([[task.archive.howto]]) +- 归档后任务从默认视图收起,但保留全部数据 + +## 不支持 +- 不能改 personal 字段(个人 ↔ 团队项目不可互转,详见 [[project.personal.concept]]) +- 不能改 userid(创建人),只能 [[project.transfer.howto]] 转拥有者 +- 不能给项目改 dialog_id(群聊重建需要管理员介入) diff --git a/resources/ai-kb/zh/howto/push-notice/config.md b/resources/ai-kb/zh/howto/push-notice/config.md new file mode 100644 index 000000000..7001a06be --- /dev/null +++ b/resources/ai-kb/zh/howto/push-notice/config.md @@ -0,0 +1,60 @@ +--- +id: push-notice.config.howto +title: 配置友盟 APP 推送 +type: howto +feature: push-notice +scope: admin +locale: zh +aliases: + - 配置友盟 + - UMENG 配置 + - APP 推送配置 + - 配置 appkey + - 怎么开推送 + - 友盟密钥 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 已在 https://www.umeng.com 注册友盟账号并创建对应的 iOS / Android 应用 + - 已拿到 App Key 和 App Master Secret +negative: + - 当环境变量 SYSTEM_SETTING=disabled 时禁止从界面修改推送设置(密钥会脱敏显示) + - 必须同时填 iOS 和 Android 的 key/secret 才能两端都收到;只填一端则只推一端 + - 默认 production_mode=true,意味必须用正式签名的 APP 包,开发版 APP 收不到 +last_verified: v1.7.90 +--- + +# 配置友盟 APP 推送 + +## 入口 +桌面端:左侧栏「管理后台」→「系统设置」→「APP 推送」选项卡 + +## 操作步骤 +1. 在「开启推送」选择「开启」 +2. 「iOS 参数配置」区填写: + - Appkey + - App Master Secret +3. 「Android 参数配置」区填写: + - Appkey + - App Master Secret +4. 底部「提交」保存 +5. 保存后即时生效,无需重启服务 + +## 字段说明 +| 字段 | 默认 | 说明 | +|---|---|---| +| push | close | 总开关;close 时所有 APP 推送任务不入队 | +| ios_key | 空 | 友盟 iOS App Key | +| ios_secret | 空 | 友盟 iOS App Master Secret,前端 password 显示 | +| android_key | 空 | 友盟 Android App Key | +| android_secret | 空 | 友盟 Android App Master Secret | + +## 推送配置生效后做什么 +- 接 alias 注册:APP 启动登录后自动调 `api/users/umeng/alias` 注册别名(详见 [[push-notice.alias.concept]]) +- 推送触发:新消息到达 `WebSocketDialogMsgTask` 会调用 `PushUmengMsg` 入队推送,参考 [[push-notice.scenarios.concept]] +- 推送结果落 `umeng_logs` 表:可用于排查(详见 [[push-notice.troubleshoot.faq]]) + +## 不支持 +- 国内厂商通道(OPPO/华为/小米/VIVO)不开箱即用:需走友盟厂商通道下发,并在友盟控制台单独配置厂商证书 +- 不能用替代推送服务,DooTask 推送层与友盟 SDK 强绑定 diff --git a/resources/ai-kb/zh/howto/push-notice/silent.md b/resources/ai-kb/zh/howto/push-notice/silent.md new file mode 100644 index 000000000..c37ca1bad --- /dev/null +++ b/resources/ai-kb/zh/howto/push-notice/silent.md @@ -0,0 +1,56 @@ +--- +id: push-notice.silent.howto +title: 单个会话免打扰 +type: howto +feature: push-notice +scope: end-user +locale: zh +aliases: + - 会话免打扰 + - 群消息免打扰 + - 关闭某个群推送 + - 静音群聊 + - 不推送某个群 + - mute + - silence +related_tools: [] +related_pages: [messenger] +prerequisites: + - 已加入想免打扰的会话 +negative: + - 免打扰只对该单个会话生效,不影响其他会话 + - 免打扰只屏蔽 APP 推送和未读邮件,不屏蔽 WebSocket 站内消息(消息列表仍能看到) + - 没有「按时段免打扰单个会话」,只有总开关 +last_verified: v1.7.90 +--- + +# 单个会话免打扰 + +## 入口 +对任意会话(单聊 / 群聊)开启免打扰: + +- 桌面端:消息列表 → 右键目标会话 → 「免打扰」开关 +- 桌面端:进入会话 → 顶部会话名 → 设置面板 → 「免打扰」开关 +- 移动端:进入会话 → 顶部「···」→ 「消息免打扰」 + +## 工作原理 +- 后端记录 `web_socket_dialog_users.silence` = 1 +- 该用户对该会话的所有新消息: + - 不触发友盟 APP 推送(`silence=1` 会被 [[push-notice.scenarios.concept]] 过滤) + - 不汇总进未读邮件(EmailNoticeTask 跳过 silence=1 的记录) + - 角标计数也不算它(badge 未读统计排除 silence) +- 但消息**仍会**到达 WebSocket,仍出现在消息列表和会话内 + +## 不影响的功能 +- @提及:被@到仍会通知(独立通道) +- 任务相关:任务详情页通知不受会话级免打扰影响 +- 消息搜索:仍能搜到这些消息 + +## 全局静音 +DooTask 没有「全局所有会话静音」开关。要短期不被打扰: +- 移动端:关闭手机系统的 DooTask 通知权限 +- 桌面端:见 [[desktop-notify.toggle.howto]] + +## 不支持 +- 不支持按时间段(如 22:00-08:00)的单会话免打扰,需用 [[mobile-notify.silent.howto]] 系统级时段 +- 部分会话类型免打扰(如「只静音群聊不静音单聊」) diff --git a/resources/ai-kb/zh/howto/report/ai-generate.md b/resources/ai-kb/zh/howto/report/ai-generate.md new file mode 100644 index 000000000..c1ece8965 --- /dev/null +++ b/resources/ai-kb/zh/howto/report/ai-generate.md @@ -0,0 +1,49 @@ +--- +id: report.ai-generate.howto +title: AI 整理汇报(AI 帮我写周报 / 日报) +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - AI 写报告 + - AI 生成日报 + - AI 写周报 + - 让 AI 帮我写周报 + - AI 整理汇报 +related_tools: [generate_report_template] +related_pages: [] +prerequisites: + - 应用商店(应用市场)已安装 ai 插件 + - 管理员已配置至少一个可用 AI 模型 +negative: + - 按钮是「AI 整理汇报」,不是从零生成:汇报内容为空时会提示「请先填写汇报内容」 + - AI 整理结果不会自动提交,必须用户应用回编辑器、确认后手动点提交 + - 多模态报告(图片识别)不在整理范围内 +last_verified: v1.7.90 +--- + +# AI 整理汇报(AI 帮我写周报 / 日报) + +## 入口 +工作报告编辑页(写日报 / 周报的页面)底部,「提交 / 修改」按钮旁边的「**AI 整理汇报**」按钮(已安装 ai 插件时可见)。 + +## 工作原理 +1. 新建报告时,系统先调 `report/template` 接口,按你周期内的任务(已完成 / 未完成)自动生成汇报内容初稿填入编辑器 +2. 点「AI 整理汇报」前必须已有汇报内容,内容为空会提示「请先填写汇报内容」 +3. 点击后打开 AI 助手浮窗(标题「AI 整理汇报」),可补充你想强调的重点或特殊说明,AI 将在已填内容基础上整理、润色、生成总结 +4. 整理结果可一键应用回报告编辑器,继续手动修改、加接收人,最后点「提交」 + +## 与「自动模板」的区别 +- 自动模板([[report.template.howto]]):纯任务数据汇总,新建报告时自动填入,不做语言加工 +- AI 整理汇报:在已填内容基础上做自然语言整理、润色与总结,不替你从零编造 + +## 不支持 +- 不支持在汇报内容为空时直接让 AI 从零生成(必须先有内容) +- 不支持 AI 自动提交,整理后仍需人工确认提交 +- 不支持让 AI 整理别人的报告 + +## 没有 AI 入口怎么办 +- 确认应用商店已安装 ai 插件 +- 确认管理员已在 AI 助手设置中配置可用模型([[system-setting.ai-model.howto]]) +- 详细排查见 [[report.permission.faq]] diff --git a/resources/ai-kb/zh/howto/report/create.md b/resources/ai-kb/zh/howto/report/create.md new file mode 100644 index 000000000..94680891e --- /dev/null +++ b/resources/ai-kb/zh/howto/report/create.md @@ -0,0 +1,57 @@ +--- +id: report.create.howto +title: 撰写工作报告 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 怎么写报告 + - 新建汇报 + - 写日报 + - 写周报 + - 提交工作总结 + - 新建工作报告 +related_tools: [create_report] +related_pages: [] +prerequisites: [] +negative: + - 同一周期同类型只能提交一份,重复提交报「请勿重复提交工作汇报」 + - 不能提交未来周期的报告(offset 必须 ≤ 0) + - 标题和内容均必填,留空会报「请填写标题/汇报内容」 +last_verified: v1.7.90 +--- + +# 撰写工作报告 + +## 入口 +- 桌面端:右上角头像 →「工作报告」→ 右上角「+」→ 选「周报」或「日报」 +- 桌面端:应用中心 →「工作报告」→「+」 +- 移动端:「我的」→「工作报告」→「+」 + +## 操作步骤 +1. 选择类型:周报 / 日报 [[report.type.concept]] +2. 系统自动用模板填充内容(基于本周期内自己负责的任务)[[report.template.howto]] +3. 编辑标题(默认带用户名 + 日期,可手动改) +4. 在富文本编辑器中补充内容(支持表格、图片粘贴、链接) +5. 在「接收人」字段选择要发送给谁(可空,留空就是只保存自己看) +6. 点「提交」保存并发送 → [[report.submit.howto]] + +## 必填字段 +| 字段 | 校验规则 | +|---|---| +| title | 必填,单行文本 | +| type | 必填,weekly 或 daily | +| content | 必填,HTML 富文本 | +| offset | ≤ 0(不能未来) | +| receive | 可空,数组形式的接收人 userid | + +## 内容富文本能力 +- 表格 / 编号列表 / 引用 +- 粘贴 base64 图片:保存时自动落盘到 `uploads/report/{年月}/{rid}/attached/` +- 链接、加粗、标题 + +## 不支持 +- 不支持单周期重复提交:会报错,要改请走编辑 [[report.edit.howto]] +- 提交未来周期:offset 必须 ≤ 0 +- 不支持月报 / 季报:type 只接受 weekly / daily diff --git a/resources/ai-kb/zh/howto/report/edit.md b/resources/ai-kb/zh/howto/report/edit.md new file mode 100644 index 000000000..00d4a11c1 --- /dev/null +++ b/resources/ai-kb/zh/howto/report/edit.md @@ -0,0 +1,58 @@ +--- +id: report.edit.howto +title: 编辑已提交的报告 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 修改报告 + - 编辑日报 + - 报告写错了怎么改 + - 改周报 + - 重新发送 +related_tools: [] +related_pages: [] +prerequisites: + - 只有报告的提交人本人可以编辑 +negative: + - 接收人不能改单条;保存时会按新填的接收人列表整体覆盖原有接收人 + - 不能改 sign(周期标识),换周期等于另一份新报告 + - 不会回退接收人的已读状态:编辑后接收人那边仍维持当前已读 / 未读 +last_verified: v1.7.90 +--- + +# 编辑已提交的报告 + +## 入口 +- 桌面端:「工作报告」→「我发送的」→ 列表中点击行右侧编辑图标 +- 详情独立页:`single/report/edit/` + +## 操作步骤 +1. 进入编辑页(自动加载原标题、类型、内容、接收人) +2. 修改标题 / 正文 / 类型 / 接收人 +3. 点「提交」保存 + +## 哪些字段可以改 +| 字段 | 可改 | 说明 | +|---|---|---| +| title | 是 | 单行文本 | +| type | 是 | 但 sign 不会重新生成 | +| content | 是 | 富文本,支持图片 | +| 接收人 | 是 | **整体替换**,不是追加 | +| sign | 否 | 创建时确定,编辑保留原值 | +| 提交人 userid | 否 | 不可转让 | + +## 接收人变更规则 +保存时执行 `Receives()->delete()` 清空原接收人,再按新列表重建。结果: +- 新加的人会出现在他们的「我收到的」列表 +- 被移除的人原来已经在自己列表里看到的那份报告,**仍能看到**(旧记录不会强行回收),但下次未读统计不再算这份 +- 已读状态不会重置 + +## 不支持 +- 改 sign:编辑时不会重算周期 +- 编辑后让接收人重新变为未读 +- 不能把别人的报告改成自己的(提交人 userid 锁死) + +## 接收人想自己改怎么办 +接收人无法编辑别人的报告,只能在自己侧标已读/未读 [[report.read-unread.howto]]。 diff --git a/resources/ai-kb/zh/howto/report/my.md b/resources/ai-kb/zh/howto/report/my.md new file mode 100644 index 000000000..2e4e6cf76 --- /dev/null +++ b/resources/ai-kb/zh/howto/report/my.md @@ -0,0 +1,58 @@ +--- +id: report.my.howto +title: 查看我发送的报告 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 我发的报告 + - 我提交过的汇报 + - 查历史报告 + - 我的周报记录 + - 看自己发过的日报 +related_tools: [list_my_reports] +related_pages: [] +prerequisites: [] +negative: + - 列表只显示自己作为提交人的报告,不显示别人发我的(那是「我收到的」[[report.receive.howto]]) + - 列表分页固定上限:每页最大 50 条,默认 20 条 + - 不能按接收人筛选,只能按关键词 / 类型 / 提交日期筛 +last_verified: v1.7.90 +--- + +# 查看我发送的报告 + +## 入口 +- 桌面端:右上角头像 →「工作报告」→ 顶部 Tab「我发送的」 +- 应用中心:「工作报告」→ 同上 +- 移动端:「我的」→「工作报告」→「我发送的」 + +## 列表显示字段 +- 标题(点击查看详情) +- 类型(周报 / 日报) +- 接收人列表(头像组) +- 提交时间 +- 操作:查看 / 编辑 / 分享 / 删除(编辑见 [[report.edit.howto]]) + +## 筛选条件 +列表顶部支持组合筛选: + +| 筛选 | 字段 | 说明 | +|---|---|---| +| 关键词 | `keys.key` | 模糊匹配标题;带 `@` 时按邮箱搜索;纯数字时按 ID 或标题搜 | +| 类型 | `keys.type` | weekly / daily | +| 时间区间 | `keys.created_at` | `[起始时间戳, 结束时间戳]` | + +## 排序 +按 `created_at` 倒序,最新提交在最上。 + +## 分页 +- 默认每页 20 条 +- 最大可调到 50 条 +- 通过 `page` 参数翻页 + +## 不支持 +- 不支持按接收人筛选 +- 按已读 / 未读筛选(已读未读是接收方维度,「我发送的」无此概念) +- 不支持多列自定义排序 diff --git a/resources/ai-kb/zh/howto/report/read-unread.md b/resources/ai-kb/zh/howto/report/read-unread.md new file mode 100644 index 000000000..1d67d956d --- /dev/null +++ b/resources/ai-kb/zh/howto/report/read-unread.md @@ -0,0 +1,62 @@ +--- +id: report.read-unread.howto +title: 标记报告已读或未读 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 报告已读 + - 标记已读 + - 报告标未读 + - 重新标未读 + - 清掉报告小红点 + - 批量已读 +related_tools: [mark_reports_read] +related_pages: [] +prerequisites: [] +negative: + - 只有接收人能改自己侧的已读状态,提交人不能代替接收人改 + - 单次批量操作上限 100 条,超过会报「最多只能操作100条数据」 + - 已读状态是按接收人独立维护的,A 标已读不影响 B 的未读 +last_verified: v1.7.90 +--- + +# 标记报告已读或未读 + +## 三种触发方式 + +### 1. 自动标已读(最常用) +打开「我收到的」→ 点开任一报告详情,系统检测到当前用户是未读接收人时自动置已读。无需手动操作。 + +### 2. 手动批量标已读 +- 「我收到的」列表多选 → 顶部「标记已读」按钮 +- 一次最多 100 条 + +### 3. 手动标回未读 +- 详情页右上角操作菜单「标为未读」 +- 对应接口 `api/report/mark` 传 `action=unread` + +## 接口对照 +| 操作 | 接口 | 限制 | +|---|---|---| +| 获取未读总数 | `api/report/unread` | 仅查询自己侧 | +| 批量标已读 | `api/report/read` 或 `api/report/mark?action=read` | 单次 ≤ 100 | +| 标回未读 | `api/report/mark?action=unread` | 单次 ≤ 100 | + +## 已读如何存储 +每条 `report_receives` 行(每个接收人一条)有独立的 `read` 字段: +- `0` = 未读 +- `1` = 已读 + +不是报告本身的属性,而是「接收人 × 报告」的关联属性。 + +## 未读数显示在哪 +- 桌面端:头像下拉菜单「工作报告」右侧红点 +- 桌面端:「我收到的」Tab 标题旁数字 +- 移动端:Tabbar「我的」红点 + +## 不支持 +- 把别人侧的报告改成已读 / 未读(只能操作自己的) +- 不支持批量操作超过 100 条 +- 已读时间戳(系统只记 read=0/1,不存时间) diff --git a/resources/ai-kb/zh/howto/report/receive.md b/resources/ai-kb/zh/howto/report/receive.md new file mode 100644 index 000000000..dbea27d58 --- /dev/null +++ b/resources/ai-kb/zh/howto/report/receive.md @@ -0,0 +1,59 @@ +--- +id: report.receive.howto +title: 查看我收到的报告 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 我收到的报告 + - 别人发给我的汇报 + - 查收报告 + - 下属周报在哪 + - 收到的日报 +related_tools: [list_received_reports] +related_pages: [] +prerequisites: [] +negative: + - 列表只显示别人发给我的报告,自己写的在「我发送的」[[report.my.howto]] + - 没有「批量删除」操作;接收人不能删除别人写的报告 + - 部门筛选按提交人当前部门匹配,不带历史部门 +last_verified: v1.7.90 +--- + +# 查看我收到的报告 + +## 入口 +- 桌面端:右上角头像 →「工作报告」→ 顶部 Tab「我收到的」 +- 应用中心:「工作报告」→ 同上 +- 移动端:「我的」→「工作报告」→「我收到的」 + +## 列表显示字段 +- 标题(点击进入详情,详情打开会自动标已读) +- 提交人(头像 + 昵称) +- 类型(周报 / 日报) +- 接收时间(`receive_at`) +- 已读 / 未读状态徽标 + +## 筛选条件 +顶部组合筛选: + +| 筛选 | 字段 | 说明 | +|---|---|---| +| 关键词 | `keys.key` | 标题 / 提交人邮箱 / 提交人 userid | +| 部门 | `keys.department_id` | 按提交人所在部门 | +| 类型 | `keys.type` | weekly / daily | +| 状态 | `keys.status` | unread / read | +| 时间区间 | `keys.created_at` | 提交时间区间 | + +## 未读提示 +- 头像菜单「工作报告」右上角红点显示未读数 +- 数值来自 `api/report/unread`(接收人侧 read=0 的总数) + +## 自动标已读 +打开详情页时,如果当前用户是接收人且记录是未读,会自动置已读。手动标记见 [[report.read-unread.howto]]。 + +## 不支持 +- 不支持接收人删除别人写的报告 +- 不支持转发并改写后再发 +- 不支持跨企业接收他人报告 diff --git a/resources/ai-kb/zh/howto/report/share.md b/resources/ai-kb/zh/howto/report/share.md new file mode 100644 index 000000000..8ee65b7ad --- /dev/null +++ b/resources/ai-kb/zh/howto/report/share.md @@ -0,0 +1,58 @@ +--- +id: report.share.howto +title: 把报告分享到对话 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 报告转发 + - 分享报告到群 + - 发到聊天里 + - 报告链接发给同事 + - 群里发周报 +related_tools: [] +related_pages: [] +prerequisites: + - 必须是报告的提交人或接收人才能分享(其他人无权生成链接) +negative: + - 单次批量分享上限 20 条,超过会报「最多只能操作20条数据」 + - 分享消息一旦发出无法撤回链接本身(消息可撤回,但其他人若已点开过链接,仍可后续凭 code 访问) + - 没有「私密 / 加密分享」选项,链接只要在手只要访问就能看到内容 +last_verified: v1.7.90 +--- + +# 把报告分享到对话 + +## 入口 +- 桌面端:报告详情页右上角操作菜单「分享到对话」 +- 桌面端:「我发送的」/「我收到的」列表行右侧「分享」按钮 +- 移动端:详情页底部操作栏「分享」 + +## 操作步骤 +1. 选中一条或多条报告(多选最多 20 条) +2. 弹窗中选择目标对话 / 成员(可同时选多个对话 + 多个成员) +3. 可填「转发留言」附在分享消息后 +4. 点「发送」 + +## 分享后效果 +- 在目标对话生成一条消息,内容是带 `mention report` 类样式的链接,文本为 `%{报告标题}` +- 单条报告:消息为段落格式 +- 多条报告:消息为有序列表格式 +- 接收方点击链接 → 跳转 `single/report/detail/` 独立页 + +## 链接如何生成 +后端调 `ReportLink::generateLink(rid, userid)`: +- 已有对应 (rid, userid) 链接则复用 +- 否则生成 `code = base64(rid,userid,随机串)` +- 链接以 `single/report/detail/` 的形式访问 + +详细的链接概念见 [[report.link.concept]]。 + +## 权限校验 +分享接口本身没有「能否分享」的额外校验,但底层 `generateLink` 会拒绝既非提交人也非接收人的请求。 + +## 不支持 +- 不支持一次分享超过 20 条 +- 不支持分享给企业外用户(链接虽是 URL 但需登录访问) +- 不支持撤回已发链接的访问权(除非删除整份报告) diff --git a/resources/ai-kb/zh/howto/report/submit.md b/resources/ai-kb/zh/howto/report/submit.md new file mode 100644 index 000000000..d702cb80a --- /dev/null +++ b/resources/ai-kb/zh/howto/report/submit.md @@ -0,0 +1,53 @@ +--- +id: report.submit.howto +title: 提交报告并指定接收人 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 提交报告 + - 发送日报 + - 报告发给谁 + - 指定接收人 + - 报告抄送 + - 选择汇报对象 +related_tools: [create_report] +related_pages: [] +prerequisites: [] +negative: + - 接收人不能包含自己(提交时会自动剔除当前用户) + - 接收人列表不是追加,每次编辑保存都会覆盖之前的接收人 + - 接收人必须是存在的有效用户,否则报「用户不存在」 +last_verified: v1.7.90 +--- + +# 提交报告并指定接收人 + +## 入口 +报告编辑页面底部「接收人」字段(写完正文后选)。 + +## 操作步骤 +1. 编辑完报告内容 +2. 在「接收人」字段点击选人,弹出联系人/部门选择器 +3. 勾选要发送给的成员(可多选,可搜索) +4. 点「提交」按钮 +5. 提交成功后会自动跳回报告列表 + +## 接收人来源 +- **手动选择**:从联系人列表勾 +- **上次接收人**:系统提供 `last_submitter` 接口快速回填上次的发送对象,省去重复选人 + +## 提交后会发生什么 +1. 报告记录入库(`reports` 表 + `report_receives` 表) +2. 系统通过 WebSocket 推送 `type=report, action=unreadUpdate` 给所有接收人 +3. 接收人头像菜单旁的「工作报告」未读红点 +1 +4. 报告中粘贴的 base64 图片落盘到服务器 + +## 留空接收人会怎样 +仍可保存为草稿性质的报告,只有自己能在「我发送的」看到。后续可编辑加上接收人重新发。 + +## 不支持 +- 不支持自己抄送自己(会被自动剔除) +- 不支持跨企业 / 跨实例发送 +- 不支持撤回已发送报告:可编辑修改但接收人始终能看到原历史 diff --git a/resources/ai-kb/zh/howto/report/template.md b/resources/ai-kb/zh/howto/report/template.md new file mode 100644 index 000000000..d25b80300 --- /dev/null +++ b/resources/ai-kb/zh/howto/report/template.md @@ -0,0 +1,53 @@ +--- +id: report.template.howto +title: 自动生成报告模板 +type: howto +feature: report +scope: end-user +locale: zh +aliases: + - 报告模板 + - 自动填充任务 + - 一键生成日报 + - 周报模板 + - 报告怎么自动带任务 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 模板只汇总当前用户负责(owner)的任务,协作任务不入表 + - 已取消(cancel 状态)的任务即使在周期内完成,也不计入「已完成工作」 + - 模板是一次性生成的快照,提交后任务状态再变化不会反映到已保存的报告里 +last_verified: v1.7.90 +--- + +# 自动生成报告模板 + +## 是什么 +新建报告时系统调用 `api/report/template` 自动拉取当前用户在选定周期内的任务数据,渲染成三段表格作为草稿。无需手动填表。 + +## 触发时机 +- 选择「周报」或「日报」时自动触发一次 +- 切换 `offset`(如选「上周 / 昨天」)时重新生成 + +## 模板小节 +周报模板包含 3 个小节,日报包含 2 个小节: + +| 小节 | 周报 | 日报 | 数据来源 | +|---|---|---|---| +| 已完成工作 | 有 | 有 | 周期内 `complete_at` 落在范围内 + 当前用户为 owner,排除 cancel 状态 | +| 本周/今日未完成工作 | 有 | 有 | 周期内有截止时间且未完成的任务;超期红色标注 | +| 下周拟定计划 | 有 | **无** | 下周时间范围内未完成的任务,含计划起止时间 | + +## 表格字段 +- 项目 / 任务 / 负责人 / 备注 +- 周报「已完成」备注列显示完成是「周X」 +- 「未完成」备注列:已超期标红「[超期]」 + +## 不支持 +- 协作任务不出现在表中(只汇总你为负责人的) +- 取消态任务不计入已完成 +- 模板内容生成后是静态 HTML,事后不会随任务状态自动更新 + +## 想让 AI 进一步润色 +可让 AI 助手生成更高质量的草稿 → [[report.ai-generate.howto]] diff --git a/resources/ai-kb/zh/howto/role-permission/grant-admin.md b/resources/ai-kb/zh/howto/role-permission/grant-admin.md new file mode 100644 index 000000000..64446391f --- /dev/null +++ b/resources/ai-kb/zh/howto/role-permission/grant-admin.md @@ -0,0 +1,56 @@ +--- +id: role-permission.grant-admin.howto +title: 授予 / 取消系统管理员身份 +type: howto +feature: role-permission +scope: super-admin +locale: zh +aliases: + - 设为管理员 + - 给管理员权限 + - 添加管理员 + - setadmin + - clearadmin + - 取消管理员 + - 怎么让别人当管理员 +related_tools: [] +related_pages: [] +prerequisites: + - 操作账号必须已经是系统管理员(admin identity) + - 目标账号必须存在且未被禁用 +negative: + - 不能给临时账号(temp identity)授予管理员身份前,请先取消其 temp 标记 + - 不能取消超级管理员(id=1)的管理员身份,超管始终自带 admin + - 普通用户无法自助申请,必须由现任管理员授予 +last_verified: v1.7.90 +--- + +# 授予 / 取消系统管理员身份 + +## 入口 +- 桌面端:右上角头像 → 「团队管理」 → 选中用户 → 「设为管理员」/「取消管理员」 +- 移动端:移动端无团队管理入口,需在桌面端操作 + +## 操作步骤 +1. 用系统管理员账号登录 +2. 进入团队管理(左侧搜索 / 筛选用户) +3. 点击目标用户行的更多操作 +4. 选择「设为管理员」或「取消管理员」 +5. 后端调用 `POST api/users/operation`: + - `setadmin`:把 `'admin'` 字符串添加到目标用户 `identity` 数组 + - `clearadmin`:从 `identity` 数组移除 `'admin'` + +## 生效时间 +- 后端立即生效(数据库直接更新 `users.identity`) +- 前端要等目标用户下次刷新或重新登录,`store.state.userIsAdmin` 才会更新 +- WebSocket 在线用户会收到资料更新通知 + +## 谁能操作 +- **超级管理员**:可操作任意用户(除自己) +- **系统管理员**:可操作其他用户,但不能操作超管(被 `checkSystem(1)` 拦截) +- **普通用户**:不可操作 + +## 与其它身份的关系 +- `identity` 是字符串数组,可同时含 `admin`、`temp`、`disable` 等。授予 admin 不会清除其它标记 +- 改 admin 身份不影响项目 / 任务级权限。详见 [[role-permission.admin.concept]] +- 想知道遇到「权限不足」该联系谁,见 [[role-permission.permission-denied.faq]] diff --git a/resources/ai-kb/zh/howto/role-permission/transfer-owner.md b/resources/ai-kb/zh/howto/role-permission/transfer-owner.md new file mode 100644 index 000000000..88a6d834e --- /dev/null +++ b/resources/ai-kb/zh/howto/role-permission/transfer-owner.md @@ -0,0 +1,61 @@ +--- +id: role-permission.transfer-owner.howto +title: 移交管理员权限 / 离职交接(无「转让超管」功能) +type: howto +feature: role-permission +scope: admin +locale: zh +aliases: + - 转让超管 + - 移交超级管理员 + - 把超级管理员转给别人 + - 离职交接 + - 换主账号 + - 老板要离开公司怎么办 + - UserTransfer +related_tools: [] +related_pages: [] +prerequisites: + - 操作账号必须是系统管理员(admin identity) +negative: + - DooTask 没有「转让超级管理员」功能,没有任何转让超管的按钮或接口 + - 不能用普通用户身份设置管理员或发起离职交接 + - 不能对自己操作离职,交接必须由另一个系统管理员发起 + - 离职交接只迁移业务归属,不会自动转移管理员(admin)身份,需另行「设为管理员」 +last_verified: v1.7.90 +--- + +# 移交管理员权限 / 离职交接(无「转让超管」功能) + +## 没有「转让超级管理员」功能 +DooTask **没有**单独的「转让超级管理员」按钮或接口。它采用**多管理员模型**:可以同时存在多个系统管理员(admin 身份),管理权限通过「设为管理员 / 取消管理员」增减,不存在需要"转让"的唯一超管角色。 + +## 移交管理权限(推荐做法) +1. 用系统管理员账号打开:左上角「头像 / 昵称」下拉菜单 →「团队管理」 +2. 在成员列表找到接手人 → 行尾操作下拉 →「设为管理员」(后端 `api/users/operation`,type=setadmin) +3. 原管理员如需退出管理,再由其他管理员对其「取消管理员」(type=clearadmin) + +## 离职交接(迁移业务资产) +人要离开公司时,用「操作离职」把业务归属交给接手人: + +1. 团队管理成员列表 → 目标成员行尾操作下拉 →「操作离职」 +2. 弹窗填写**离职时间** + **交接人**(单选;留空则只离职、不迁移归属) +3. 确认「注意:离职操作不可逆!」后,后端(type=setdisable)创建 `UserTransfer` 记录并异步迁移 +4. 不能对自己操作离职——须由另一个系统管理员发起(必要时先把接手人「设为管理员」) +5. 交接人不能是被离职者本人、不能是已离职账号 + +## 自动迁移的内容 +`UserTransfer::start()` 会把以下归属转给交接人: + +- **部门**:部门归属及部门负责人身份 +- **项目身份**:项目负责人(owner=1)身份传给交接人;项目管理员(owner=2)身份不传 +- **任务身份**:负责人 / 协助人 / 工作流状态负责人 +- **文件**:文件归属 +- **群组**:离职账号退出所有群组;若是群主则交接人接任群主 + +## 不会自动迁移的 +- **管理员(admin)身份不迁移**:接手人要管理权限需单独「设为管理员」 +- 个人聊天记录、私人文件不在迁移范围 + +## 取消离职 +执行 `type=cleardisable`(团队管理中的「恢复帐号(已离职)」)可取消离职状态,但已迁移的归属**不会自动回滚**。 diff --git a/resources/ai-kb/zh/howto/search/contact.md b/resources/ai-kb/zh/howto/search/contact.md new file mode 100644 index 000000000..ef32c86c0 --- /dev/null +++ b/resources/ai-kb/zh/howto/search/contact.md @@ -0,0 +1,55 @@ +--- +id: search.contact.howto +title: 搜索联系人 +type: howto +feature: search +scope: end-user +locale: zh +aliases: + - 找人 + - 搜人 + - 搜同事 + - 怎么找联系人 + - 按技能找人 + - 搜邮箱 +related_tools: [search_users] +related_pages: [] +prerequisites: [] +negative: + - 不会返回已禁用账号(`disable_at` 不为空) + - 不会返回机器人账号(`bot=1`) + - 单次最多返回 50 条(默认 20) +last_verified: v1.7.90 +--- + +# 搜索联系人 + +## 入口 +- 全局搜索框([[search.entry.menu-map]])输入关键词,切换到「联系人」分类,或不切分类查看跨类结果 +- 在新建群、邀请项目成员等成员选择器里也会复用联系人搜索 + +## 接口 +- 端点:`GET api/search/contact` +- 参数: + - `key`(必填):搜索关键词,空串直接返回空数组 + - `search_type`(可选):`text` / `vector` / `hybrid`,默认 `hybrid`,仅 Manticore 生效 + - `take`(可选):返回数量,默认 20,上限 50 + +## 匹配字段 +装了 Manticore 时可命中:昵称、邮箱、个人简介、技能标签。MySQL 回退仅按昵称 / 邮箱 / 部门做 `LIKE` 模糊匹配。 + +## 返回字段(每条) +- 用户基础信息:`userid` / `nickname` / `email` / `avatar` / `profession` +- `relevance`:相关度分(Manticore 才有,MySQL 回退恒为 0) +- `introduction_preview`:命中简介片段 +- `search_tags`:命中的技能标签数组(最多 10 个,按认可数排序) + +## 不支持 +- 不会返回已禁用 / 已离职的账号 +- 不会返回机器人账号 +- 不会单次返回超过 50 条结果(最多 50 条) +- 无权访问的用户也搜不到 + +## 相关 +- 引擎差异:[[search.engine.concept]] +- 入口与快捷键:[[search.entry.menu-map]] diff --git a/resources/ai-kb/zh/howto/search/file.md b/resources/ai-kb/zh/howto/search/file.md new file mode 100644 index 000000000..54bd0a489 --- /dev/null +++ b/resources/ai-kb/zh/howto/search/file.md @@ -0,0 +1,55 @@ +--- +id: search.file.howto +title: 搜索文件 +type: howto +feature: search +scope: end-user +locale: zh +aliases: + - 找文件 + - 搜文件 + - 搜文档内容 + - 怎么搜文件内容 + - PDF 搜索 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 未装 search 插件时只能搜文件名,搜不到正文 + - Office 文件超过 50MB / 文本超过 5MB / 其他类型超过 20MB 不索引正文 + - 提取后正文超过 10 万字符会被截断 + - 单次最多返回 50 条(默认 20) +last_verified: v1.7.90 +--- + +# 搜索文件 + +## 入口 +- 全局搜索框([[search.entry.menu-map]])输入关键词,切到「文件」分类 +- 文件管理器(左侧栏「文件」)内的局部搜索复用同一接口 + +## 接口 +- 端点:`GET api/search/file` +- 参数: + - `key`(必填):搜索关键词,空则返回空数组 + - `search_type`(可选):`text` / `vector` / `hybrid`,默认 `hybrid`,仅 Manticore 生效 + - `take`(可选):返回数量,默认 20,上限 50 + +## 匹配字段 +- 装 Manticore:文件名 + 正文(支持 Word / Excel / PPT / PDF / TXT / Markdown / 代码文件等) +- 未装 Manticore:仅文件名 `LIKE` 模糊匹配,先查用户自己的文件,再补充共享给当前用户的文件 + +可索引正文的类型:`document` / `word` / `excel` / `ppt` / `txt` / `md` / `text` / `code`。 + +## 权限范围 +只返回当前用户**自己上传**或**被共享给当前用户**的文件,且按 Manticore 索引的 `allowed_users` 二次过滤。 + +## 返回字段(每条) +- 文件基础信息:`id` / `name` / `type` / `ext` / `size` / `userid` / `pid` 等 +- `relevance`:相关度分(仅 Manticore,MySQL 回退恒为 0) +- `content_preview`:命中正文片段(仅 Manticore) + +## 不支持 +- 未装 search 插件搜不到文件内部文本,搜不到内容 → [[search.engine.concept]] +- 大文件不索引正文(限额见 frontmatter `negative`) +- 不会单次返回超过 50 条结果(最多 50 条) diff --git a/resources/ai-kb/zh/howto/search/message.md b/resources/ai-kb/zh/howto/search/message.md new file mode 100644 index 000000000..ef20d41cf --- /dev/null +++ b/resources/ai-kb/zh/howto/search/message.md @@ -0,0 +1,56 @@ +--- +id: search.message.howto +title: 搜索消息 +type: howto +feature: search +scope: end-user +locale: zh +aliases: + - 搜聊天记录 + - 找消息 + - 搜消息 + - 在群里搜消息 + - 怎么找以前的聊天 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 只能搜到当前用户能访问的会话内消息(私聊 / 自己加入的群) + - 机器人消息不会被搜出(`bot=1` 过滤) + - 指定 `dialog_id` 时会校验当前用户是否在该对话内,无权访问会报错 + - 单次最多返回 50 条(默认 20) +last_verified: v1.7.90 +--- + +# 搜索消息 + +## 入口 +- 全局搜索框([[search.entry.menu-map]])输入关键词,切到「消息」分类 +- 在某个聊天窗口内的「搜索本对话」框,会自动带上 `dialog_id` 只搜该对话 + +## 接口 +- 端点:`GET api/search/message` +- 参数: + - `key`(必填):搜索关键词,空则返回空数组 + - `search_type`(可选):`text` / `vector` / `hybrid`,默认 `hybrid`,仅 Manticore 生效 + - `take`(可选):返回数量,默认 20,上限 50 + - `mode`(可选):`message` / `position` / `dialog`,默认 `message` + - `dialog_id`(可选):筛选指定对话内的消息,非 0 时需有权访问 + +## mode 三种返回格式 +- `message`(默认):返回完整消息,含发送者、消息体、时间、相关度 +- `position`:只返回消息 ID 数组,用于跳转定位 +- `dialog`:按会话聚合,每个会话只返回 1 条命中(带 `search_msg_id` 用于跳定位) + +## 权限范围 +通过 `accessibleByUser($userid)` 限制:只能搜到「当前用户在对话成员列表里的会话」中的消息。指定 `dialog_id` 时额外做 `WebSocketDialog::checkDialog` 校验。 + +## 不支持 +- 搜不到机器人消息 +- 搜不到非成员会话的消息 +- 不会单次返回超过 50 条结果(最多 50 条) +- 文件 / 图片消息只能按文件名命中,无法按图片内容搜索 + +## 相关 +- 引擎差异:[[search.engine.concept]] +- 搜不到怎么办:[[search.no-result.faq]] diff --git a/resources/ai-kb/zh/howto/search/project.md b/resources/ai-kb/zh/howto/search/project.md new file mode 100644 index 000000000..6efd1faaf --- /dev/null +++ b/resources/ai-kb/zh/howto/search/project.md @@ -0,0 +1,54 @@ +--- +id: search.project.howto +title: 搜索项目 +type: howto +feature: search +scope: end-user +locale: zh +aliases: + - 找项目 + - 搜项目 + - 怎么找项目 + - 项目搜不到 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 不会返回已归档项目(`archived_at` 不为空) + - 不会返回当前用户没有加入的项目 + - 单次最多返回 50 条(默认 20) +last_verified: v1.7.90 +--- + +# 搜索项目 + +## 入口 +- 全局搜索框([[search.entry.menu-map]])输入关键词,切到「项目」分类 +- 项目列表 / 项目选择器内的局部搜索复用同一接口 + +## 接口 +- 端点:`GET api/search/project` +- 参数: + - `key`(必填):搜索关键词,空则返回空数组 + - `search_type`(可选):`text` / `vector` / `hybrid`,默认 `hybrid`,仅 Manticore 生效 + - `take`(可选):返回数量,默认 20,上限 50 + +## 匹配字段 +装了 Manticore 时可命中:项目名、项目描述、文本类附加信息。MySQL 回退仅按项目名做 `LIKE` 模糊匹配。 + +## 权限范围 +仅在「当前用户已加入的项目」范围内搜,使用 `Project::authData()` 限定。未加入的项目即使关键词匹配也不会返回。 + +## 返回字段(每条) +- 项目基础信息:`id` / `name` / `desc` / `owner_userid` / `created_at` 等 +- `relevance`:相关度分(仅 Manticore,MySQL 回退恒为 0) +- `desc_preview`:命中描述片段(仅 Manticore) + +## 不支持 +- 已归档项目不返回(解归档后才能搜到,[[search.no-result.faq]]) +- 不在当前用户成员列表的项目不返回 +- 不会单次返回超过 50 条结果(最多 50 条) + +## 相关 +- 引擎差异:[[search.engine.concept]] +- 搜不到怎么办:[[search.no-result.faq]] diff --git a/resources/ai-kb/zh/howto/search/task.md b/resources/ai-kb/zh/howto/search/task.md new file mode 100644 index 000000000..5cf957285 --- /dev/null +++ b/resources/ai-kb/zh/howto/search/task.md @@ -0,0 +1,58 @@ +--- +id: search.task.howto +title: 搜索任务 +type: howto +feature: search +scope: end-user +locale: zh +aliases: + - 找任务 + - 搜任务 + - 找待办 + - 怎么搜到子任务 + - task 搜索 +related_tools: [list_tasks] +related_pages: [] +prerequisites: [] +negative: + - 不会返回已归档任务(`archived_at` 不为空) + - 不会返回已删除任务(`deleted_at` 不为空) + - 不会返回当前用户所在项目以外的任务 + - 单次最多返回 50 条(默认 20) +last_verified: v1.7.90 +--- + +# 搜索任务 + +## 入口 +- 全局搜索框([[search.entry.menu-map]])输入关键词,切到「任务」分类 +- 项目内 / 看板内的局部搜索也复用同一接口 + +## 接口 +- 端点:`GET api/search/task` +- 参数: + - `key`(必填):搜索关键词,空则返回空数组 + - `search_type`(可选):`text` / `vector` / `hybrid`,默认 `hybrid`,仅 Manticore 生效 + - `take`(可选):返回数量,默认 20,上限 50 + +## 匹配字段 +装了 Manticore 时可命中:任务名、任务描述、子任务内容、备注等正文。MySQL 回退仅按任务名做 `LIKE` 模糊匹配,描述里的关键词搜不到。 + +## 权限范围 +仅在「当前用户已加入的项目」内的任务范围搜索,且排除已归档、已删除任务。子任务也会被命中并返回。 + +## 返回字段(每条) +- 任务基础信息:`id` / `name` / `desc` / `start_at` / `end_at` / `complete_at` 等 +- 关联信息:`task_user`(负责人 / 协作者)、`task_tag`(任务标签) +- `relevance`:相关度分(仅 Manticore) +- `desc_preview`:命中描述片段 +- `content_preview`:命中子任务 / 内容片段 + +## 不支持 +- 已归档 / 已删除任务不返回(先恢复才能搜到) +- 跨项目时只能搜当前用户参与的项目 +- 不会单次返回超过 50 条结果(最多 50 条) + +## 相关 +- 引擎差异:[[search.engine.concept]] +- 搜不到怎么办:[[search.no-result.faq]] diff --git a/resources/ai-kb/zh/howto/system-setting/ai-bot.md b/resources/ai-kb/zh/howto/system-setting/ai-bot.md new file mode 100644 index 000000000..081f77a32 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/ai-bot.md @@ -0,0 +1,61 @@ +--- +id: system-setting.ai-bot.howto +title: AI 机器人与默认模型 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - AI 机器人 + - 默认 AI 模型 + - 绑定机器人 + - AI 机器人怎么配 + - 全局默认模型 + - aibot + - defmodels +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 应用市场已安装并启用 ai 插件 + - 已在「AI 设置」配置过至少一个模型供应商 +negative: + - 未安装 ai 插件时菜单不出现,调用接口会直接抛错 + - aibot 设置不影响群机器人 @ 时使用的模型,群机器人有独立绑定 + - 该接口在 SYSTEM_SETTING=disabled 环境会拒绝写入 +last_verified: v1.7.90 +--- + +# AI 机器人与默认模型 + +## 入口 +桌面端:左上角头像 →「系统设置」→「AI 机器人」。 +对应后端:`POST api/system/setting/aibot`,参数 `type=save`。 + +## 是什么 +「AI 机器人」(aibotSetting)是把 AI 能力对外露出的人格层: + +- 选定某个**模型供应商 + 具体模型**作为系统默认 +- 选定一个或多个**机器人账号**承载 AI 身份(在群聊里显示头像/昵称) +- 控制哪些场景默认走哪个模型(任务分析、报告、对话等) + +具体字段由 ai 插件动态注入,服务端只接受 `setting` 已存在的键,未知键直接丢弃。 + +## 操作步骤 +1. 先在 [[system-setting.ai-model.howto]] 配好模型 +2. 进入「AI 机器人」页 +3. 「默认模型」下拉选择一个已配置的模型 +4. 「绑定机器人」选择系统机器人(如「智能助手」) +5. 保存 → 提示「保存成功」即生效 + +## 相关接口 +- `setting__aibot` — 主配置读写(仍生效) +- `setting__aibot_models` — 已废弃(v1.4.35+,列表改由 ai 插件提供) +- `setting__aibot_defmodels` — 已废弃(同上) + +调用 `setting__aibot` 时可传 `filter=`,仅返回以 prefix 开头的字段(便于客户端按场景拉取)。SYSTEM_SETTING=disabled 时 `_key`、`_secret` 结尾的字段会被打码。 + +## 不支持 +- 不能在此处新增模型供应商(在 [[system-setting.ai-model.howto]] 操作) +- 不支持按用户级别绑定模型,仅支持系统级默认 +- SYSTEM_SETTING=disabled 时无法查看完整密钥:所有 `_key/_secret` 字段会以 4+****+4 形式脱敏 diff --git a/resources/ai-kb/zh/howto/system-setting/ai-model.md b/resources/ai-kb/zh/howto/system-setting/ai-model.md new file mode 100644 index 000000000..ab6490d08 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/ai-model.md @@ -0,0 +1,55 @@ +--- +id: system-setting.ai-model.howto +title: AI 模型配置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 配置 AI + - 配置模型 + - 接入 OpenAI + - 接入 Claude + - 接入豆包 + - AI 接入 + - 添加 AI 供应商 + - AI 模型设置 + - 接入大模型 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 应用商店(应用市场)已安装并启用 ai 插件 +negative: + - 配置入口不在「系统设置」菜单,而在「AI 助手」应用内的设置面板(仅管理员可见) + - v1.4.35 起旧接口 setting__ai 已废弃,AI 模型配置全部迁移到 AI 助手应用的设置面板 + - 不安装 ai 插件,「AI 助手」应用不出现 +last_verified: v1.7.90 +--- + +# AI 模型配置 + +## 现状 +DooTask 的 AI 能力由独立的 **ai 插件**(`dootask-ai`)提供。系统设置里历史上有过「AI 设置」接口(`setting__ai`),从 v1.4.35 起已废弃,仅保留路由占位。 + +实际的模型供应商、API Key、Base URL 等配置在 **「AI 助手」应用内的设置面板**(仅管理员可见),保存走 `api/system/setting/aibot` 接口。 + +## 入口 +桌面端:左侧栏「应用」→「AI 助手」应用 → 点某个 AI 机器人(供应商)卡片上的设置按钮,打开该供应商的设置面板。需安装 ai 插件且当前用户是系统管理员。 + +## 操作步骤 +1. 管理员在应用商店安装并启用 ai 插件(生成 `dootask-ai` 容器) +2. 打开「AI 助手」应用,选择要配置的供应商(ChatGPT/OpenAI、Claude、DeepSeek、Gemini、Grok、Ollama、智谱、通义千问、文心一言等) +3. 在设置面板填写:API Key、模型列表(一行一个模型名,可点「使用默认模型列表」一键填入)、默认模型、Base URL(可选)、代理(可选)、Temperature、默认提示词 +4. 保存后该供应商的模型立即可在 AI 对话中选用,并可被 [[system-setting.ai-bot.howto]] 的「AI 机器人」使用 + +## 与其他模块的关系 +- 提供模型给 [[system-setting.ai-bot.howto]] 的默认模型选择 +- 「AI 整理汇报」、AI 助手浮窗等都依赖此处配置 +- 客户端调用走 `/ai/*` 路由,由插件容器处理 + +## 不支持 +- DooTask 主程序不内置任何模型,必须依赖 ai 插件 +- 配置入口不在「系统设置」菜单(v1.4.35 起旧入口废弃),在「AI 助手」应用内 +- 普通成员打开设置面板会提示仅管理员可操作 +- 不支持自动测试模型是否可用,需要保存后到对话窗口实际试用 diff --git a/resources/ai-kb/zh/howto/system-setting/auto-archive.md b/resources/ai-kb/zh/howto/system-setting/auto-archive.md new file mode 100644 index 000000000..0573c566d --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/auto-archive.md @@ -0,0 +1,65 @@ +--- +id: system-setting.auto-archive.howto +title: 任务自动归档设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 任务自动归档怎么开 + - 完成后自动归档 + - 归档天数怎么改 + - auto_archived + - archived_day + - 归档了能恢复吗 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 归档天数限制 1-100 天,超出范围保存时报错 + - 子任务不会被独立归档,只看顶层任务(parent_id = 0) + - 项目自身若设了"自定义归档"(archive_method=custom),系统级开关对该项目不生效 +last_verified: v1.7.90 +--- + +# 任务自动归档设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「任务相关」→「自动归档」。 + +涉及字段: +- `auto_archived` — 开关:`open` / `close`,默认 `close` +- `archived_day` — 任务完成多少天后归档,默认 7,允许 1-100 + +## 触发条件 +后台 `AutoArchivedTask` 定时跑,每次抓最多 100 条满足条件的任务进行归档。条件如下: + +1. `auto_archived = 'open'`(系统开关打开) +2. 任务有 `complete_at`(已完成) +3. 完成时间距今 ≥ `archived_day` 天 +4. 任务尚未归档(`archived_at` 为空、`archived_userid = 0`) +5. 任务是顶层任务(`parent_id = 0`,子任务不单独归档) +6. 所属项目的 `archive_method` 不是 `custom`(自定义归档的项目走自己的规则) + +## 字段默认值 + +| 字段 | 默认 | 范围 | +|---|---|---| +| `auto_archived` | `close` | open / close | +| `archived_day` | 7 | 1-100,超出报错"自动归档时间不可大于100天" | + +## 能不能恢复 +能。归档不是删除:归档任务在项目「已归档」列表里仍可查看、撤销归档(恢复到原列)、或彻底删除。归档动作只是设置 `archived_at` 时间戳与 `archived_userid`。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「任务相关」 +2. 「自动归档」选「开启」 +3. 在出现的输入框填天数(默认 7,1-100 之间) +4. 「提交」保存,下次定时任务执行时按新规则归档 + +## 不支持 +- 不支持按项目 / 任务类型差异化归档天数(除非项目自己开 custom) +- 不支持"归档后 N 天自动删除"二级规则 +- 关闭开关不会自动撤销已归档任务 diff --git a/resources/ai-kb/zh/howto/system-setting/chat-mute.md b/resources/ai-kb/zh/howto/system-setting/chat-mute.md new file mode 100644 index 000000000..2aea27ed3 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/chat-mute.md @@ -0,0 +1,63 @@ +--- +id: system-setting.chat-mute.howto +title: 群组与私聊禁言设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 全员群禁言 + - 群聊禁言 + - 私聊禁言 + - 怎么禁止发消息 + - all_group_mute + - user_private_chat_mute + - user_group_chat_mute + - 关闭私聊 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 三个开关相互独立,不会联动;要全静音得分别关 + - 部门群、项目群等系统群不受 user_group_chat_mute 控制,永远可发言(除非加入全员群禁言) + - 系统管理员永远可发言,不受任何开关限制 +last_verified: v1.7.90 +--- + +# 群组与私聊禁言设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「消息相关」。 + +涉及三个独立字段: + +| 字段 | UI 标签 | 默认 | 控制范围 | +|---|---|---|---| +| `all_group_mute` | 全员群组禁言 | `open` | 系统「全员群」(`group_type=all`) | +| `user_private_chat_mute` | 私聊禁言 | `open` | 个人对个人的私聊(`type=user`) | +| `user_group_chat_mute` | 群聊禁言 | `open` | 个人自建群(`group_type=user`) | + +每个字段值都是 `open`(开放发言)/ `close`(禁言)。 + +## 禁言粒度与谁能发 + +- `all_group_mute=close`:除系统管理员外,所有人都不能在全员群发言;管理员仍可发 +- `user_private_chat_mute=close`:禁止任何成员发起 / 继续个人私聊;只有管理员可发 +- `user_group_chat_mute=close`:个人自建群禁言;管理员仍可发;**部门群、项目群、会议群等系统群不受影响** + +后端 `WebSocketDialog::checkMute` 会按会话类型路由到对应开关。被禁言时尝试发消息会收到「个人会话禁言 / 当前会话全员禁言 / 个人群组禁言」错误。 + +## 能不能解禁 +能。任何字段从 `close` 改回 `open` 后立即恢复发言能力,不需要重启或重新登录。对历史已发 / 未发消息没有任何回溯影响。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「消息相关」 +2. 分别在「全员群组禁言」「私聊禁言」「群聊禁言」选「开放」或「禁言」 +3. 「提交」保存,立即生效 + +## 不支持 +- 不能临时禁言某个具体用户(用群管理员的踢人 / 群规则代替) +- 不能定时禁言(如"晚上 22 点后禁言") +- 不影响机器人推送:机器人消息走系统接口,不走聊天禁言判定 diff --git a/resources/ai-kb/zh/howto/system-setting/checkin.md b/resources/ai-kb/zh/howto/system-setting/checkin.md new file mode 100644 index 000000000..5c9788cef --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/checkin.md @@ -0,0 +1,68 @@ +--- +id: system-setting.checkin.howto +title: 签到规则设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 签到设置 + - 打卡规则 + - 配置签到 + - 签到时间 + - 上下班时间 + - 地理围栏 + - 人脸打卡 + - 配置打卡 + - 跨天打卡 + - 签到地图 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 启用人脸模式必须先安装 face 插件 + - 启用定位模式必须有对应地图服务商的 Key +negative: + - 提前 + 延后时间之和必须 < 24h-工时,否则报「提前和延后时间设置存在重叠」 + - 关闭签到(open=close)时 key 会自动轮换(再开启需要重新分发设备) + - 不支持给不同部门设置不同打卡规则,全公司共享一套 + - 不支持自动按公历节假日跳过打卡 +last_verified: v1.7.90 +--- + +# 签到规则设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「签到」。 +对应后端:`POST api/system/setting/checkin`,参数 `type=save`。 + +## 字段说明 + +- **open** — 签到总开关(`open` / `close`) +- **time** — 上下班时间数组,如 `["09:00","18:00"]`(支持跨天班次) +- **advance** — 允许提前打卡分钟数(默认 120) +- **delay** — 允许延后打卡分钟数(默认 120) +- **remindin** — 上班前 X 分钟提醒(默认 5) +- **remindexceed** — 下班后超 X 分钟未打卡提醒(默认 10) +- **edit** — 是否允许员工自行补卡(`open` / `close`) +- **modes** — 支持的打卡方式数组,取值 `auto` / `manual` / `locat` / `face` +- **manual_remark** — 手动签到的展示文案 +- **face_upload / face_remark / face_retip** — 人脸打卡配置 +- **locat_map_type** — 地图服务商(`baidu` / `amap` / `tencent`) +- **locat_bd_lbs_key / locat_amap_key / locat_tencent_key** — 对应地图 Key +- **locat_*_point** — `{lng, lat, radius}` 单点电子围栏 +- **key** — 签到机器自动生成的访问密钥(关闭再开启会重置) + +## 操作步骤 +1. 选择支持的打卡方式(多选) +2. 填写上下班时间、提前/延后窗口 +3. 启用「定位」时选地图服务商并填 Key + 中心点+半径 +4. 启用「人脸」时确认 face 插件已装 +5. 保存后系统会自动创建/复用 `check-in` 机器人账号 +6. 服务端返回 `cmd` 字段(base64),是签到机/考勤机的接入命令 + +## 不支持 +- 不支持单日多班次(如午休拆成 4 个时间点),只取 `time[0]` 和 `time[1]` +- 不支持给部门 / 项目单独配置规则 +- 不允许提前 + 延后窗口之和超过「24 小时 - 工时长度」(会校验失败) +- 人脸模式必须依赖 face 插件,不能用浏览器 WebRTC 直采 diff --git a/resources/ai-kb/zh/howto/system-setting/column-template.md b/resources/ai-kb/zh/howto/system-setting/column-template.md new file mode 100644 index 000000000..8af59b87b --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/column-template.md @@ -0,0 +1,76 @@ +--- +id: system-setting.column-template.howto +title: 列模板(创建项目预置列) +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 列模板 + - 项目模板 + - 默认看板列 + - 预置列 + - 新建项目选模板 + - 项目预设 + - 看板模板 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(普通用户只能 get 读取) +negative: + - 模板只控制「初始列」,不能预置任务卡、流程、负责人等其他内容 + - 不支持按部门 / 项目分类区分模板 + - 修改模板不会影响已创建项目,仅影响后续新建 + - 保存时空 list 或 list 中没有合法条目会报「参数错误」/「参数为空」 +last_verified: v1.7.90 +--- + +# 列模板(创建项目预置列) + +## 入口 +桌面端:左上角头像 →「系统设置」→「列模板」。 +对应后端:`POST api/system/column/template`,`type=get` 读取,`type=save` 写入(限 admin)。 + +## 是什么 +创建新项目时,用户可以从一组预置「列模板」里挑一个直接套用,省去手动建列。模板就是「模板名 + 列名清单」。 + +例如内置一个「研发任务」模板: +- 列:待办、进行中、待测试、已完成 + +新建项目时勾选这个模板,项目就自动有这 4 列。 + +## 字段结构 +保存时上传 `list` 数组: + +```json +[ + { + "name": "研发任务", + "columns": "待办,进行中,待测试,已完成" + }, + { + "name": "市场活动", + "columns": "策划,执行中,复盘" + } +] +``` + +- **name** — 模板名(必填) +- **columns** — 逗号分隔的列名字符串,服务端会按 `,` 切分 → 去重 → 去空,落库为数组 + +任何缺 `name` 或 `columns` 的条目会被服务端跳过;最终为空数组直接报「参数为空」。 + +## 操作步骤 +1. 进入「列模板」页 +2. 「新增模板」→ 填写模板名 +3. 在列输入框输入列名(多个用逗号分隔) +4. 重复添加多个模板 +5. 点击「保存」立即生效 + +## 与项目创建的关系 +用户「新建项目」对话框 →「选择模板」下拉就是这里维护的列表。选某个模板后,项目创建时按列名顺序生成空列,无任务卡。 + +## 不支持 +- 不能模板化「任务流程」、「负责人」、「成员」、「自定义字段」 +- 不能跨终端导出/导入模板 +- 修改模板不会回溯到已创建的项目(仅对新项目生效) diff --git a/resources/ai-kb/zh/howto/system-setting/e2e-encryption.md b/resources/ai-kb/zh/howto/system-setting/e2e-encryption.md new file mode 100644 index 000000000..718831cd2 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/e2e-encryption.md @@ -0,0 +1,56 @@ +--- +id: system-setting.e2e-encryption.howto +title: 端到端加密设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 端到端加密怎么开 + - E2EE 怎么设 + - 消息加密在哪开 + - 怎么开 e2e + - 聊天加密怎么打开 + - 关闭端到端加密 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +negative: + - 端到端加密只对一组固定的敏感接口生效,不会对历史消息追溯加密 + - 关键词搜索不能搜到加密传输中的密文内容(已落库的文本可被搜索) + - 不区分私聊 / 群聊:是否走 e2e 取决于接口,而非会话类型 + - 撤回 / 编辑消息的时长限制由 msg_rev_limit / msg_edit_limit 决定,与 e2e 无关 +last_verified: v1.7.90 +--- + +# 端到端加密设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「消息相关」→「端到端加密」。 + +字段名:`e2e_message`,开关枚举 `open` / `close`,默认 `close`。 + +## 开启后影响哪些通道 +开启后,下列接口的请求体在客户端用密钥加密后再发给服务端: + +- `users/login` — 登录请求 +- `users/editpass` — 修改密码 +- `users/operation` / `users/delete/account` — 账号敏感操作 +- `users/bot/*` — 机器人接口 +- `dialog/msg/*` — 所有消息收发(包括私聊、群聊、文件消息等) +- `system/license` — 授权信息 + +WebSocket 通道则会在握手后用 PGP 公钥协商一次会话密钥再传输。 +未在白名单内的 HTTP 接口(任务、项目、文件元数据等)仍走明文 + HTTPS。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「消息相关」 +2. 「端到端加密」选「开启」或「关闭」 +3. 页面底部「提交」保存,立即生效(无需重启) + +## 不支持 +- 不能按用户 / 会话粒度单独开关,只能全局开 / 关 +- 关键词搜索不会解密传输中的密文;已入库的明文文本仍可搜 +- 调试环境(`window.systemInfo.debug === "yes"`)下不执行 WebSocket 的 PGP 协商(会被跳过) diff --git a/resources/ai-kb/zh/howto/system-setting/file-upload-limit.md b/resources/ai-kb/zh/howto/system-setting/file-upload-limit.md new file mode 100644 index 000000000..371665e1f --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/file-upload-limit.md @@ -0,0 +1,58 @@ +--- +id: system-setting.file-upload-limit.howto +title: 单文件上传大小限制 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 上传文件大小限制 + - 文件上传限制怎么改 + - file_upload_limit + - 文件最大多大 + - 改上传上限 + - 默认不限制 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 该限制只控制单个文件大小,不是磁盘配额或总量上限 + - 留空 = 不限制;后端仍受 PHP / Nginx 层 client_max_body_size 等服务级限制 + - 不能按用户 / 部门设差异化阈值,全局生效 +last_verified: v1.7.90 +--- + +# 单文件上传大小限制 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「其他设置」→「文件上传限制」。 + +字段名:`file_upload_limit`,整数,单位 **MB**,默认留空(= 不限制)。 + +## 生效范围 +后端 `Base::uploadFile` 在每次接收上传时都会读取该值,作用于: + +- **聊天消息中发送的文件 / 图片附件** +- **任务详情里的附件上传** +- **「文件」应用中的文档上传** +- 各种自定义上传入口(凡是走 `Base::uploadFile` 的接口) + +逻辑:调用方未显式传 `size` 参数时,取 `file_upload_limit * 1024 KB` 作为单文件上限。超过则报错 `文件大小超限,最大限制:N KB`。 + +## 字段默认值 + +| 字段 | 默认 | 单位 | +|---|---|---| +| `file_upload_limit` | 空(不限制) | MB | + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「其他设置」 +2. 在「文件上传限制」输入框填正整数(如 `100` = 100MB)或留空 +3. 「提交」保存,立即生效 + +## 不支持 +- 不区分图片 / 视频 / 文档:所有类型走同一阈值 +- 不能按文件后缀黑白名单(黑白名单走「文件设置」标签,不在这里) +- 留空只是"应用层不限制",仍受 Nginx / PHP 等 web 服务器层面的上传上限制约 diff --git a/resources/ai-kb/zh/howto/system-setting/file.md b/resources/ai-kb/zh/howto/system-setting/file.md new file mode 100644 index 000000000..d027ca911 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/file.md @@ -0,0 +1,62 @@ +--- +id: system-setting.file.howto +title: 文件设置(打包下载权限) +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 文件设置 + - 打包下载 + - 文件夹打包 + - 打包权限 + - 谁能下载文件夹 + - 文件批量下载 + - 限制打包下载 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 +negative: + - 这页只控制「文件夹打包下载」的访问名单,不控制单文件下载 + - 单文件下载没有黑白名单,权限全部由文件本身的可见范围决定 + - SYSTEM_SETTING=disabled 时不能修改 +last_verified: v1.7.90 +--- + +# 文件设置(打包下载权限) + +## 入口 +桌面端:左上角头像 →「系统设置」→「文件」。 +对应后端:`POST api/system/setting/file`,参数 `type=save`。 + +## 是什么 +仅控制「文件夹批量打包下载」入口的可见范围。原因是大文件夹打包会占大量磁盘和带宽,需要按需限制。 + +普通的单文件预览、下载、分享逻辑由文件本身的可见用户/权限决定,不在本页设置。 + +## 字段说明 + +- **permission_pack_type** — 打包下载授权策略: + - `all` — 所有用户都能用打包下载(默认) + - `admin` — 仅系统管理员 + - `user` — 仅 `permission_pack_userids` 名单内的用户 + - `close` — 全员禁用打包下载 +- **permission_pack_userids** — 数组,`type=user` 时生效的白名单(用户 ID 列表) + +服务端只接受这 2 个字段,其他键被自动剔除。 + +## 操作步骤 +1. 进入「文件」设置页 +2. 选择策略:默认开放 / 仅管理员 / 指定人员 / 关闭 +3. 「指定人员」模式下从用户选择器勾选成员 +4. 点击「保存」即生效 + +## 影响范围 +- 文件中心 / 项目附件 / 群聊文件等所有「文件夹批量下载」入口都遵守此设置 +- 即使有打包权限,被打包的文件仍需用户对单个文件有可见权限,无权部分会自动跳过 + +## 不支持 +- 不区分按项目 / 部门设置(全局一刀切) +- 不支持按文件大小阈值决定是否允许打包 +- 不影响单文件下载(单文件下载由文件可见性独立决定) diff --git a/resources/ai-kb/zh/howto/system-setting/general.md b/resources/ai-kb/zh/howto/system-setting/general.md new file mode 100644 index 000000000..759547bae --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/general.md @@ -0,0 +1,79 @@ +--- +id: system-setting.general.howto +title: 通用设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 通用设置 + - 注册开关 + - 是否允许注册 + - 邀请码 + - 密码策略 + - 消息撤回时长 + - 消息编辑时长 + - 自动归档 + - 系统名称 + - 欢迎语 + - 上传大小限制 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 部署的环境变量 SYSTEM_SETTING 不能是 disabled,否则禁止修改 +negative: + - SYSTEM_SETTING=disabled 时所有系统设置都不能改(演示环境常用) + - 自动归档天数限制为 1-100 天,超出会报错 + - 邀请码留空会自动生成随机码,不能完全关闭"凭码注册"模式 +last_verified: v1.7.90 +--- + +# 通用设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「通用」。 +对应后端:`POST api/system/setting`,参数 `type=save` 提交。 + +## 关键字段(按主题分组) + +**注册与登录** +- `reg` — 注册策略:`open` / `close` / `invite` +- `reg_identity` — 新注册用户默认身份(`normal` / `temp`) +- `reg_invite` — 邀请码(留空自动生成) +- `login_code` — 登录验证码策略 +- `password_policy` — 密码强度(`simple` / `complex`) + +**项目与任务** +- `project_invite` / `project_add_permission` / `project_add_userids` — 项目创建与邀请权限 +- `auto_archived` / `archived_day` — 任务自动归档与天数(1-100) +- `task_visible` / `task_default_time` / `task_user_limit` — 任务默认值 +- `unclaimed_task_reminder*` — 未认领任务提醒 +- `task_ai_auto_analyze` — 任务 AI 自动分析(需 ai 插件) +- `department_owner_project_view` — 部门负责人是否能看下属项目 +- `todo_set_permission` — 设置 todo 权限 + +**消息与群组** +- `chat_information` — 群成员入群提示 +- `anon_message` / `e2e_message` — 匿名 / 端到端加密 +- `msg_rev_limit` / `msg_edit_limit` — 撤回/编辑时长上限(分钟) +- `all_group_mute` / `all_group_autoin` — 全员群免打扰 / 自动入群 +- `user_private_chat_mute` / `user_group_chat_mute` — 默认免打扰 + +**媒体与上传** +- `convert_video` / `compress_video` — 视频转码与压缩 +- `image_compress` / `image_quality` / `image_save_local` — 图片处理 +- `file_upload_limit` — 单文件上传大小(MB) + +**外观** +- `system_alias` / `system_welcome` — 系统名称别名与欢迎语 + +## 操作步骤 +1. 进入「系统设置」→「通用」 +2. 按表单逐项填写(不在白名单内的字段会被服务端自动剔除) +3. 点击「保存」,服务端落库到 `setting` 表(`system` 分组) +4. 提示「保存成功」即生效,无需重启 + +## 不支持 +- 无法在 `SYSTEM_SETTING=disabled` 环境保存(一律拒绝) +- 注册开关只有 3 个枚举值,不支持「按邮箱白名单」直接配置 diff --git a/resources/ai-kb/zh/howto/system-setting/meeting.md b/resources/ai-kb/zh/howto/system-setting/meeting.md new file mode 100644 index 000000000..c9a051554 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/meeting.md @@ -0,0 +1,60 @@ +--- +id: system-setting.meeting.howto +title: 会议设置(Agora) +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 会议设置 + - 配置会议 + - 声网 + - Agora + - appid + - 会议参数 + - 怎么开启视频会议 + - 视频会议配置 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - 已申请声网 Agora 项目并拿到 AppID / 证书 +negative: + - 必须填 appid 和 app_certificate 才能保存为「open」,否则报「请填写基本配置」 + - 不支持 Jitsi、Zoom、WebRTC 自建等其他后端,目前仅适配声网 + - SYSTEM_SETTING=disabled 时配置不可修改且会被部分打码显示 +last_verified: v1.7.90 +--- + +# 会议设置(Agora) + +## 入口 +桌面端:左上角头像 →「系统设置」→「会议」。 +对应后端:`POST api/system/setting/meeting`,参数 `type=save`。 + +## 字段说明 + +- **open** — 会议总开关(`open` / `close`)。关闭时全员无法发起会议 +- **appid** — 声网项目 App ID(必填,开启时校验) +- **app_certificate** — 声网项目 App 证书(必填) +- **api_key** — 声网 RESTful API Key(用于云录制等高级功能,可选) +- **api_secret** — 声网 RESTful API Secret(与 api_key 配对,可选) + +服务端只接收上述 5 个字段,其他键会被忽略。 + +## 操作步骤 +1. 登录 [Agora 控制台](https://console.agora.io/) 创建项目 +2. 项目证书选「App ID + App Certificate」(鉴权) +3. 把 App ID、App Certificate 复制到 DooTask 表单 +4. 「open」选项设为 `open` +5. 点击「保存」,提示「保存成功」即生效 +6. 测试:随便在群里点「视频会议」按钮,能拉到画面即配置正确 + +## 字段保护 +- 当部署环境变量 `SYSTEM_SETTING=disabled`,本页所有字段会以「前 4 位 + 星号 + 后 4 位」打码返回,且禁止修改 +- 这是给演示环境用的保护机制,避免敏感凭证泄露 + +## 不支持 +- 不支持自建 SFU / MCU,只对接声网 SaaS +- 会议时长 / 人数限制由声网套餐决定,DooTask 这边不限制 +- 关闭会议(`open=close`)后无法使用「视频会议」入口和「会议」应用(会被同时禁用) diff --git a/resources/ai-kb/zh/howto/system-setting/msg-time-limit.md b/resources/ai-kb/zh/howto/system-setting/msg-time-limit.md new file mode 100644 index 000000000..51d553ca2 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/msg-time-limit.md @@ -0,0 +1,60 @@ +--- +id: system-setting.msg-time-limit.howto +title: 消息撤回与编辑时长上限 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 消息撤回多久 + - 撤回时长怎么设 + - 编辑消息时间 + - msg_rev_limit + - msg_edit_limit + - 超时不能撤回 + - 怎么改撤回时间 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 超过设定时长后所有人都不能撤回 / 编辑该消息,系统管理员也不例外 + - 留空(视作 0)= 不限制,不是「禁止撤回」 + - 时长以分钟为单位整数,不支持小时 / 秒级粒度 +last_verified: v1.7.90 +--- + +# 消息撤回与编辑时长上限 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「消息相关」→「撤回消息限制」/「修改消息限制」。 + +涉及字段: +- `msg_rev_limit` — 撤回时长上限(分钟) +- `msg_edit_limit` — 编辑时长上限(分钟) + +## 单位与默认值 + +- 单位:**分钟**,整数 +- 默认:留空(保存为空字符串),等价于「不限制」 +- 提示文案:占位符显示「默认不限制」 + +## 0 / 留空的含义 +后端 `validateMsgLimit` 用 `intval(...)` 取值,当 `limitNum <= 0` 时直接 `return` 不做限制。所以: + +- 留空、写 `0`、写负数 → 都按"不限制"处理(任何时候都能撤回 / 编辑) +- 写正整数 `N` → 消息发出 N 分钟后不可撤回 / 编辑 + +## 超时后能不能改 +不能。超出时长后服务端会抛 `已超过 X 分钟,此消息不可撤回 / 修改` 错误,前端按钮也会变灰或弹错。系统管理员同样受限,没有"管理员强撤"的旁路。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「消息相关」 +2. 在「撤回消息限制」「修改消息限制」输入框填分钟数(如 `5`)或留空 +3. 「提交」保存,立即生效 + +## 不支持 +- 不能按会话类型(私聊 / 群聊)分别设阈值 +- 不能给特定角色(如管理员)开"无限制"特权 +- 不支持小时 / 秒级单位,最小粒度是 1 分钟 diff --git a/resources/ai-kb/zh/howto/system-setting/password-policy.md b/resources/ai-kb/zh/howto/system-setting/password-policy.md new file mode 100644 index 000000000..8755838ae --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/password-policy.md @@ -0,0 +1,58 @@ +--- +id: system-setting.password-policy.howto +title: 密码策略设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 密码策略怎么设 + - 密码复杂度怎么改 + - 强密码怎么开 + - 简单密码 复杂密码 + - password policy + - 改密码规则 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 修改策略不会触发存量用户重置密码,存量密码继续可用 + - 不支持自定义正则、最小特殊字符数等细粒度规则,只有 simple / complex 两档 + - 密码长度上限固定 32 位,无管理后台开关 +last_verified: v1.7.90 +--- + +# 密码策略设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「帐号相关」→「密码策略」。 + +字段名:`password_policy`,枚举 `simple` / `complex`,默认 `simple`。 + +## 两档区别 + +| 档位 | 长度 | 复杂度要求 | +|---|---|---| +| simple(简单) | ≥ 6 位 | 无 | +| complex(复杂) | ≥ 6 位 | 必须混合:不能全是数字、不能全是字母、不能仅数字+大写、不能仅数字+小写 | + +通用约束:所有档位下密码长度上限 32 位。 + +## 对存量密码的影响 +策略只在「设置密码」「修改密码」「注册」时校验。改成 `complex` 后: +- 已有用户登录不受影响(旧弱密码仍能用) +- 用户下次主动改密码必须满足新规则 +- 管理员代设密码同样要满足新规则 + +如果要强制全员升级密码,需要管理员手动通知用户修改,没有内置「强制重置」按钮。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「帐号相关」 +2. 「密码策略」选 `simple` 或 `complex` +3. 页面底部「提交」保存 + +## 不支持 +- 没有「禁用最近 N 次旧密码」「定期强制改密」等高级规则 +- 没有按账号 / 部门差异化策略,全局生效 diff --git a/resources/ai-kb/zh/howto/system-setting/priority.md b/resources/ai-kb/zh/howto/system-setting/priority.md new file mode 100644 index 000000000..b7179301c --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/priority.md @@ -0,0 +1,68 @@ +--- +id: system-setting.priority.howto +title: 任务优先级配置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 任务优先级 + - 优先级颜色 + - 自定义优先级 + - 改优先级 + - 设置优先级 + - 加一个优先级 + - 优先级天数 + - 紧急程度 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(普通用户只能 get 读取) +negative: + - 不能给单个项目自定义独立优先级,全局共享一套 + - 不支持按优先级自动指派负责人 / 自动通知 + - 普通用户调用保存接口会被拒绝(仅 admin) +last_verified: v1.7.90 +--- + +# 任务优先级配置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「任务优先级」。 +对应后端:`POST api/system/priority`,`type=get` 读取,`type=save` 写入(限 admin)。 + +## 是什么 +全系统共享的优先级清单。每条优先级有名称、颜色、自动截止天数、排序权重。任务创建时下拉里出现的就是这套清单。 + +## 字段结构 +保存时上传 `list` 数组,每条形如: + +```json +{ + "name": "紧急", + "color": "#FF4D4F", + "days": 1, + "priority": 100 +} +``` + +- **name** — 显示名(必填) +- **color** — Hex 颜色码(用于卡片左边色条 / 标签) +- **days** — 自动建议截止天数(创建任务时按"今天 + days"预填截止) +- **priority** — 排序权重,数字越大越靠前 + +服务端使用 `Setting::normalizeTaskPriorityList()` 校验并归一化(去重 / 截断 / 字段裁剪),空数组会拒绝。 + +## 操作步骤 +1. 进入「任务优先级」页 +2. 「新增」追加一行 → 填写名称 / 颜色 / 天数 / 权重 +3. 拖拽或修改 `priority` 字段调整顺序 +4. 点击「保存」即时生效,所有项目共享 + +## 默认数据 +首次访问会返回系统默认的优先级(紧急 / 高 / 普通 / 低)。修改后保存即覆盖默认。 + +## 不支持 +- 不能按项目维度独立配置 +- 不支持「按优先级触发自动化规则」 +- 删除某个优先级时已经使用它的旧任务仍保留旧名称(不会自动迁移) diff --git a/resources/ai-kb/zh/howto/system-setting/registration.md b/resources/ai-kb/zh/howto/system-setting/registration.md new file mode 100644 index 000000000..7121e5ffa --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/registration.md @@ -0,0 +1,68 @@ +--- +id: system-setting.registration.howto +title: 注册策略设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 注册开关怎么开 + - 允许注册 + - 禁止注册 + - 邀请码注册 + - 邀请码在哪改 + - 临时帐号 + - 新用户身份 + - reg_invite +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 注册策略只有 open / close / invite 三档,不支持按邮箱域名白名单 + - 邀请码留空保存后系统会自动生成一个随机码,不能完全关闭"凭码可注册"模式 + - 临时帐号一旦创建无法在线一键转为正常帐号 +last_verified: v1.7.90 +--- + +# 注册策略设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「帐号相关」→「允许注册」。 + +涉及字段: +- `reg` — 注册策略 +- `reg_identity` — 新注册用户身份 +- `reg_invite` — 邀请码 +- `temp_account_alias` — 临时帐号别名 + +## reg:注册策略 + +| 取值 | 含义 | +|---|---| +| `open` | 允许任何人在登录页注册 | +| `invite` | 仍可注册,但注册时必须填邀请码 | +| `close` | 禁止注册,登录页不显示注册入口 | + +`reg=invite` 时下方显示「邀请码」输入框,对应 `reg_invite`。留空保存后系统会自动生成一个随机邀请码(用 `Base::generatePassword()`),不会真的"无码可用"。 + +## reg_identity:新注册用户身份 +仅在 `reg` 为 `open` 或 `invite` 时显示。 + +| 取值 | 含义 | +|---|---| +| `normal` | 正常帐号,权限与已有成员一致 | +| `temp` | 临时帐号,受 5 项限制:禁止查看共享文件、禁止发起会话、禁止建群、禁止打电话、禁止打包下载文件 | + +选 `temp` 时下方可填 `temp_account_alias`(临时帐号别名),用于在用户列表展示区别。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「帐号相关」 +2. 选「允许注册」的三选一(同时配套填邀请码或注册身份) +3. 「提交」保存,立即生效 + +## 不支持 +- 不能按邮箱后缀白名单 / 黑名单 +- 不能给同一系统配多套邀请码,邀请码全局唯一 +- 不能区分电脑端 / 移动端的注册开关 diff --git a/resources/ai-kb/zh/howto/system-setting/task-ai-analyze.md b/resources/ai-kb/zh/howto/system-setting/task-ai-analyze.md new file mode 100644 index 000000000..5f40428ff --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/task-ai-analyze.md @@ -0,0 +1,64 @@ +--- +id: system-setting.task-ai-analyze.howto +title: AI 任务自动分析设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - AI 任务分析怎么开 + - 自动分析任务 + - task_ai_auto_analyze + - 关闭 AI 自动分析 + - AI 自动建议 + - 新建任务自动分析 +prerequisites: + - 需要系统管理员权限 + - 应用市场已安装 ai 插件 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 未安装 ai 插件时,分析逻辑直接跳过,不会有任何产出 + - 系统开关 = open 但项目级开关 = close 时,该项目的任务也不会被分析 + - 不会回溯分析历史任务,只对新建后进入待分析队列的任务生效 +last_verified: v1.7.90 +--- + +# AI 任务自动分析设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「任务相关」→「AI任务分析」。 + +字段名:`task_ai_auto_analyze`,开关枚举 `open` / `close`,默认 `open`。 + +## 触发时机 +后台 `AiTaskLoopTask` 循环任务执行时: + +1. 先检查 `ai` 插件是否安装;未装直接返回 +2. 检查系统级开关 `task_ai_auto_analyze`;为 `close` 直接返回 +3. 拉取待处理新任务 +4. 对每个任务再检查项目级开关 `ai_auto_analyze`;为 `close` 则跳过 +5. 投递异步任务 `AiTaskAnalyzeTask` 进行分析 + +也就是说有 **三道闸**:插件已装 → 系统开关 open → 项目开关 open,三者全满足才会真正调用 AI。 + +## 产出 +分析完成后,AI 会在任务详情面板给出建议(如优先级、负责人、子任务拆分建议等),不会自动改任务字段,只是"建议"形式的辅助信息。 + +## 字段默认值 + +| 字段 | 默认 | +|---|---| +| `task_ai_auto_analyze` | `open` | + +## 操作步骤 +1. 确认应用市场已安装 ai 插件 +2. 进入「系统设置」→「系统设置」→「任务相关」 +3. 「AI任务分析」选「开启」或「关闭」 +4. 「提交」保存,立即生效 + +## 不支持 +- 不能选用哪个模型做分析(用 AI 插件配置的默认模型) +- 不支持对特定项目"豁免"或单独配额 +- 系统开关关闭后历史已分析结果保留,但不会刷新 diff --git a/resources/ai-kb/zh/howto/system-setting/task-visibility.md b/resources/ai-kb/zh/howto/system-setting/task-visibility.md new file mode 100644 index 000000000..c540a1ada --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/task-visibility.md @@ -0,0 +1,58 @@ +--- +id: system-setting.task-visibility.howto +title: 任务可见性选项显示策略 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 任务可见性怎么设 + - task_visible + - 任务可见性选项 + - 可见性 保持 自动 + - 任务详情看不到可见性 +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 该字段只控制任务详情 UI 上"可见性"控件是否常驻显示,不直接改任务的可见范围 + - 不是「公开 / 项目内 / 仅负责人」三选一,只有 open / close 两档 + - 已有任务的实际可见性数据不受本开关影响 +last_verified: v1.7.90 +--- + +# 任务可见性选项显示策略 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「任务相关」→「可见性选项」。 + +字段名:`task_visible`,枚举 `open` / `close`,默认 `close`。 + +## 两档含义 + +| 取值 | UI 文案 | 含义 | +|---|---|---| +| `open` | 保持 | 任务详情页**始终**显示「可见性」字段;用户每次进任务都能看到当前可见范围与切换入口 | +| `close` | 自动 | 仅当任务的可见性为**非默认值**或处于「合并项目」上下文时才显示;默认值情况下"可见性"控件隐藏,减少干扰 | + +前端 `TaskDetail.vue` 通过 `systemConfig.task_visible === 'open'` 计算 `visibleKeep`,控制控件是否常驻。 + +## 任务真实可见性来自哪里 +任务的实际可见范围由任务自身的 `visibility_*` 字段决定,新建任务时按所在项目继承默认值。本开关 **不改变默认可见性**,只影响 UI 是否把这个字段始终亮出来。 + +## 改了对存量任务的影响 +- 不重写任何任务的可见性数据 +- 已打开的任务详情页需刷新后才按新策略渲染控件 +- 历史任务的可见性范围维持不变 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「任务相关」 +2. 「可见性选项」选「保持」(open) 或「自动」(close) +3. 「提交」保存,下次打开任务详情即按新策略显示 + +## 不支持 +- 不是 ACL 配置,不能限制谁能看任务 +- 不支持按项目差异化(全局生效) +- 没有"完全隐藏可见性入口"的第三档 diff --git a/resources/ai-kb/zh/howto/system-setting/third-access.md b/resources/ai-kb/zh/howto/system-setting/third-access.md new file mode 100644 index 000000000..bf8e478f0 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/third-access.md @@ -0,0 +1,66 @@ +--- +id: system-setting.third-access.howto +title: 第三方接入(LDAP 入口) +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 第三方接入 + - LDAP 设置 + - AD 接入 + - SSO + - 单点登录 + - 配置 LDAP + - 同步本地用户 + - 测试 LDAP +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 + - LDAP / AD 服务可达 +negative: + - 当前「第三方接入」仅集成 LDAP,没有 OAuth / SAML / 钉钉 / 飞书的同义入口 + - SYSTEM_SETTING=disabled 时禁止保存 + - 测试连接(testldap)若管理员 DN 或密码错误,前端只会显示「验证失败」,不会带具体 LDAP 错误码 +last_verified: v1.7.90 +--- + +# 第三方接入(LDAP 入口) + +## 入口 +桌面端:左上角头像 →「系统设置」→「第三方接入」。 +对应后端:`POST api/system/setting/thirdaccess`,参数 `type` 可取 `save` / `testldap`。 + +## 字段说明 + +- **ldap_open** — LDAP 总开关(`open` / `close`) +- **ldap_host** — LDAP 主机地址(无 schema,如 `ldap.example.com`) +- **ldap_port** — 端口(默认 389,LDAPS 一般 636) +- **ldap_user_dn** — 管理员绑定 DN(如 `cn=admin,dc=example,dc=com`) +- **ldap_password** — 管理员密码 +- **ldap_base_dn** — 搜索基准 DN(如 `ou=users,dc=example,dc=com`) +- **ldap_login_attr** — 登录用的属性名,枚举 `cn` / `uid` / `mail` / `sAMAccountName` / `userPrincipalName`,默认 `cn` +- **ldap_sync_local** — 本地用户反向同步到 LDAP(`open` / `close`,默认关) + +服务端把这些字段存到 `setting` 表 `thirdAccessSetting` 分组。其他键自动剔除。 + +## 操作步骤(保存配置) +1. 进入「第三方接入」页 +2. 「LDAP 开关」选 `open` +3. 依次填写 host / port / 管理员 DN / 密码 / Base DN +4. 选择登录属性(与 AD 对接通常用 `sAMAccountName`) +5. 点「测试」按钮触发 `testldap` 类型请求(不入库,仅试探绑定) +6. 测试通过后点「保存」 + +## 测试连接(testldap) +后端用提交的字段动态构造连接 → 尝试 `bind(user_dn, password)`: +- 成功返回「验证通过」 +- 失败返回「验证失败」+ LDAP 异常信息(如有) + +详细配置语义见 [[ldap.config.howto]],使用细节见 [[ldap.concept]]。 + +## 不支持 +- 没有 OAuth / SAML / OIDC 入口 +- 不支持多 LDAP 域(只有一个 Default Connection) +- 「同步本地用户到 LDAP」仅在本地用户登录后触发,不主动批量推送 diff --git a/resources/ai-kb/zh/howto/system-setting/todo-permission.md b/resources/ai-kb/zh/howto/system-setting/todo-permission.md new file mode 100644 index 000000000..1195d9050 --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/todo-permission.md @@ -0,0 +1,58 @@ +--- +id: system-setting.todo-permission.howto +title: 待办设置权限 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 谁能设置待办 + - todo 权限 + - todoSetPermission + - 待办权限 + - 关闭他人设待办 + - 别人能不能给我设 todo +prerequisites: + - 需要系统管理员权限 + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 这是消息→待办(聊天里把某条消息变成 todo)权限,与项目任务无关 + - 自己给自己设 / 取消 todo 不受开关限制 + - 关闭后任何人都不能"批量给一群人设 todo",包括非自己的成员 +last_verified: v1.7.90 +--- + +# 待办设置权限 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「消息相关」→「待办设置权限」。 + +字段名:`todo_set_permission`,枚举 `open` / `close`,默认 `open`。 + +## 谁能操作 + +| 取值 | UI 文案 | 含义 | +|---|---|---| +| `open` | 允许 | 群里**所有成员**都能把某条消息设 / 取消为他人待办 | +| `close` | 禁止 | 只有以下角色能给**他人**设 / 取消待办:本人、系统管理员、群主或群管理员、项目负责人或项目管理员、任务负责人 | + +无论开关如何,"给自己"设 / 取消 todo 永远允许。 + +## 影响范围 +本开关只影响 **聊天里的消息待办**(即把一条聊天消息标记为某些用户的 todo 项),路径包括: +- 群聊 / 私聊里长按消息 →「设为待办」 +- 群聊菜单 →「指派待办」 + +后端校验点:`WebSocketDialogMsg::setTodoRemind` 与 `DialogController::msg__todo_indicate` 两处都会读 `todo_set_permission`,关闭时校验 `checkTodoOwnerPermission`。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「消息相关」 +2. 「待办设置权限」选「允许」或「禁止」 +3. 「提交」保存,立即生效 + +## 不支持 +- 不能按群 / 项目差异化(全局生效) +- 不能限制"自己给自己设 todo" +- 与「项目任务的负责人 / 协助人」权限是两套体系,本开关不影响项目任务的指派 diff --git a/resources/ai-kb/zh/howto/system-setting/video-process.md b/resources/ai-kb/zh/howto/system-setting/video-process.md new file mode 100644 index 000000000..c24d40a4b --- /dev/null +++ b/resources/ai-kb/zh/howto/system-setting/video-process.md @@ -0,0 +1,65 @@ +--- +id: system-setting.video-process.howto +title: 视频转码与压缩设置 +type: howto +feature: system-setting +scope: admin +locale: zh +aliases: + - 视频转换怎么开 + - 视频压缩开关 + - convert_video + - compress_video + - MOV 转 MP4 + - 视频自动压缩 +prerequisites: + - 需要系统管理员权限 + - 服务器已具备 ffmpeg 等转码工具(容器化部署默认包含) + - 部署环境变量 SYSTEM_SETTING 不为 disabled +related_tools: [] +related_pages: [] +negative: + - 不会回溯处理历史上传的视频,只对新上传文件生效 + - 转码 / 压缩失败时回退保留原文件,不会丢消息 + - 不能选目标分辨率 / 码率,参数固定 +last_verified: v1.7.90 +--- + +# 视频转码与压缩设置 + +## 入口 +桌面端:左上角头像 →「系统设置」→「系统设置」标签 →「消息相关」→「视频转换」/「视频压缩」。 + +涉及字段: +- `convert_video` — 视频转码开关,默认 `close` +- `compress_video` — 视频压缩开关,默认 `close` + +## 各自作用 + +| 字段 | 作用 | 触发条件 | +|---|---|---| +| `convert_video` | 把 **MOV、WEBM** 格式视频转成 **MP4**,提升跨端兼容性 | 上传的视频后缀为 mov 或 webm | +| `compress_video` | 对 **MP4** 视频做压缩,减小体积 | 上传 / 转码后产物为 MP4 | + +两者可独立开关,组合关系: +- 只开 `convert_video`:MOV/WEBM → MP4(原始码率,体积不变) +- 只开 `compress_video`:MP4 直接压缩;MOV/WEBM 不动 +- 都开:MOV/WEBM 先转 MP4 再压缩 +- 都关:原文件直接保存,不做任何处理 + +## 开启代价 +- 服务端需要 ffmpeg;转码会占 CPU 与临时磁盘 +- 用户上传后会有一段"处理中"的等待时间,处理完才能预览或发送 + +## 对原视频影响 +原文件被处理后产物(转码后 MP4 / 压缩后 MP4)替代原文件入库,**原始 MOV / WEBM 不保留**。开关推送给前端后会在聊天预览处显示「视频处理中」气泡。 + +## 操作步骤 +1. 进入「系统设置」→「系统设置」→「消息相关」 +2. 「视频转换」「视频压缩」分别选「开启」或「关闭」 +3. 「提交」保存,立即对后续上传生效 + +## 不支持 +- 不能按文件大小阈值触发(小视频也会被压) +- 不支持自定义分辨率 / 码率 / 编码器 +- 不能针对单个会话或单条消息关闭 diff --git a/resources/ai-kb/zh/howto/task/archive.md b/resources/ai-kb/zh/howto/task/archive.md new file mode 100644 index 000000000..b09bfd3a8 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/archive.md @@ -0,0 +1,55 @@ +--- +id: task.archive.howto +title: 归档任务 / 取消归档 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 归档任务 + - 任务收起 + - 隐藏任务但不删除 + - 取消归档 + - 把任务藏起来 +related_tools: [update_task] +related_pages: [task_detail, project_detail] +prerequisites: + - 任务可见 + - 是负责人或有 TASK_UPDATE 权限 +negative: + - 归档不等于完成,归档任务可以是未完成状态 + - 归档不等于删除,归档任务保留全部字段、关联、附件 + - 归档任务不会出现在默认列表,但仍能搜索到 +last_verified: v1.7.90 +--- + +# 归档任务 / 取消归档 + +## 是什么 +归档(archived_at)是把任务从默认视图中"折叠收起",但保留所有数据的状态。归档任务不会污染看板与列表,但能在「已归档」筛选下查回。常见于"做完很久但暂时不想删"、"过期但要留作记录"的任务。 + +## 字段 +- `archived_at`:归档时间(非空表示已归档) +- `archived_userid`:归档操作人 +- `archived_follow`:跟随父任务归档的子任务标记 + +## 入口 +- 桌面端:任务详情页 → 右上角「⋯」 → 「归档」 +- 桌面端:项目设置 → 「批量归档已完成任务」(一次性把所有完成任务归档) +- 列表视图右键任务行 → 「归档」 + +## 操作步骤 +1. 单任务归档:详情页选「归档」,确认后 `archived_at` 写入当前时间 +2. 子任务跟随:归档父任务时,所有子任务自动跟着归档(archived_follow=1) +3. 取消归档:进入「已归档」筛选 → 选目标任务 → 「⋯」 → 「取消归档」 + +## 与「完成」「删除」的区别 +| 状态 | 字段 | 默认视图是否显示 | 可恢复 | +|---|---|---|---| +| 完成 | complete_at | 显示(划线) | 取消完成 | +| 归档 | archived_at | 不显示 | 取消归档 | +| 删除 | deleted_at | 不显示 | 30 天内 [[task.delete-restore.howto]] | + +## 不支持 +- 归档不会发任务变更通知 +- 归档任务不能被拖动 / 直接编辑(须先取消归档) diff --git a/resources/ai-kb/zh/howto/task/attachment.md b/resources/ai-kb/zh/howto/task/attachment.md new file mode 100644 index 000000000..a2077654f --- /dev/null +++ b/resources/ai-kb/zh/howto/task/attachment.md @@ -0,0 +1,54 @@ +--- +id: task.attachment.howto +title: 任务附件上传与下载 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 任务附件 + - 上传文件到任务 + - 任务怎么发文件 + - 给任务加附件 + - 任务里下载文件 +related_tools: [get_task_files] +related_pages: [task_detail] +prerequisites: + - 任务已保存(创建中不能直接传) + - 是任务可见用户,传文件还需 TASK_UPDATE 权限 +negative: + - 子任务(parent_id > 0)不能独立上传附件 + - 任务复制不会带走附件 + - 单文件大小受站点设置限制 +last_verified: v1.7.90 +--- + +# 任务附件上传与下载 + +## 是什么 +DooTask 任务附件保存在 `ProjectTaskFile` 表,每个附件记录文件名、大小、扩展名、宿主路径、缩略图、上传人。所有任务可见用户可下载,TASK_UPDATE 权限的人可上传 / 删除。 + +## 入口 +- 桌面端:任务详情页 → 「附件」区 → 「+ 上传」或直接把文件拖入页面 +- 桌面端:在描述富文本里粘贴图片自动上传,会同时进描述内联图与附件区 +- 移动端:详情页底部「附件」按钮 → 选相册 / 文件 / 拍照 + +## 上传方式 +1. 点 + 号或拖入文件 +2. 进度条显示,结束后自动生成缩略图(仅图片) +3. 文件名同名时会自动加 (1) (2) 后缀,不会覆盖 + +## 下载方式 +- 点附件项右侧下载图标,浏览器直接下载 +- 图片附件可点缩略图先预览,再下载 +- 部分插件(office、fileview)能在线预览,详见 [[application.center.concept]] + +## 删除 +- 上传人或 TASK_UPDATE 权限的人可删除 +- 删除是硬删(不进回收站) +- 删除会触发项目动态记录 + +## 不支持 +- 子任务不能直接传附件,需挂到父任务 +- 复制任务([[task.copy.howto]])不带走附件 +- 任务删除后附件不会自动清理,物理文件仍在磁盘 diff --git a/resources/ai-kb/zh/howto/task/complete.md b/resources/ai-kb/zh/howto/task/complete.md new file mode 100644 index 000000000..2cdaaaf32 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/complete.md @@ -0,0 +1,50 @@ +--- +id: task.complete.howto +title: 标记任务完成 / 取消完成 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 完成任务 + - 打勾任务 + - 任务标记完成 + - 取消完成 + - 重新打开任务 +related_tools: [complete_task, update_task] +related_pages: [task_detail, project_detail] +prerequisites: + - 任务可见 + - 是负责人或有 TASK_UPDATE 权限 +negative: + - 父任务完成不会自动完成所有子任务,需要手动或 [[task.subtask.howto.create]] 后逐个处理 + - 完成不等于归档,归档要走 [[task.archive.howto]] + - 重复任务在完成的瞬间生成下一份,详见 [[task.recurring.howto]] +last_verified: v1.7.90 +--- + +# 标记任务完成 / 取消完成 + +## 是什么 +任务完成在 DooTask 中通过 `complete_at` 字段记录,非空表示已完成。完成与归档(archived_at)、删除(deleted_at)是三个互相独立的状态字段。 + +## 入口 +- 桌面端:任务卡片左侧圆形复选框、详情页顶部「✓ 完成」按钮 +- 桌面端列表视图:每行左侧勾选框 +- 移动端:任务详情顶部按钮,或卡片长按菜单 + +## 操作步骤 +1. 点击复选框 / 完成按钮 +2. 任务 `complete_at` 写入当前时间,整个卡片显示删除线 / 灰化 +3. 项目动态记一条「X 完成了任务 Y」日志 +4. 若该任务带 `loop`(循环),同时生成下一份新任务 + +## 取消完成 +1. 在已完成任务上再次点击复选框 +2. `complete_at` 置空 +3. 任务回到未完成状态,工作流状态保持原样不重置 + +## 不支持 +- 完成不能批量勾选多任务(除非用 MCP `complete_task` 编程调用) +- 任务有未完成的子任务时仍可完成父任务,不会被阻止 +- 完成后不能直接修改 `complete_at` 的具体时间,必须取消再重新完成 diff --git a/resources/ai-kb/zh/howto/task/copy.md b/resources/ai-kb/zh/howto/task/copy.md new file mode 100644 index 000000000..1d51020b0 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/copy.md @@ -0,0 +1,48 @@ +--- +id: task.copy.howto +title: 复制任务(含子任务、附件、内容) +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 复制任务 + - 克隆任务 + - 拷贝任务到别的项目 + - 任务原样新建一份 + - 复制带子任务 +related_tools: [create_task, get_task] +related_pages: [task_detail, project_detail] +prerequisites: + - 对源任务有可见权限,对目标项目有 TASK_ADD 权限 +negative: + - 复制不会带走 dialog_id(任务聊天室)和完成时间,目标任务是全新一份 + - 复制不会保留归档状态、删除时间 + - 公开访问链接、订阅记录不复制 +last_verified: v1.7.90 +--- + +# 复制任务(含子任务、附件、内容) + +## 是什么 +DooTask 提供「复制任务」功能(API `task__copy`),可在同项目或跨项目快速创建相同结构的任务。复制会带走任务名、描述、子任务、附件、负责人、协作者、可见性、优先级、计划时间、标签等核心字段。 + +## 入口 +- 桌面端:任务详情页 → 右上角「⋯」菜单 → 「复制任务」 +- 桌面端:项目看板视图,任务卡片右键 → 「复制」 +- 列表视图同样支持任务行的「⋯」操作 + +## 操作步骤 +1. 选择「复制任务」,弹出对话框 +2. 选目标项目、目标列、目标流程状态(可选) +3. 可选调整负责人、协作者、计划时间 +4. 确认后服务端通过 `copyTask()` + `copySubTasks()` 递归生成 + +## 不带过去的字段 +- `dialog_id`(新任务会重新建聊天室,详见 [[task.related.concept]]) +- `complete_at`、`archived_at`、`deleted_at` +- 评论历史、动态日志 + +## 不支持 +- 不能批量复制多任务 +- 跨项目复制时不保留「项目级标签」归属:标签会变成新项目下的临时标签,颜色保留 diff --git a/resources/ai-kb/zh/howto/task/create-full.md b/resources/ai-kb/zh/howto/task/create-full.md new file mode 100644 index 000000000..0f7afc4c6 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/create-full.md @@ -0,0 +1,51 @@ +--- +id: task.create.howto.full +title: 完整创建任务(详情页所有字段) +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 完整建任务 + - 怎么填所有字段 + - 创建任务时设置负责人 + - 创建任务怎么加截止时间 + - 完整模式建任务 +related_tools: [create_task, update_task] +related_pages: [project_detail, task_detail] +prerequisites: + - 已加入目标项目,且对该项目有 TASK_ADD 权限 +negative: + - 任务名称必填且最长 255 字符 + - 描述富文本最长 50000 字符 + - 一个任务最多 50 个子任务 +last_verified: v1.7.90 +--- + +# 完整创建任务(详情页所有字段) + +## 入口 +- 桌面端:项目详情页右上角「+ 添加任务」按钮 → 弹出完整任务对话框 +- 也可以先用 [[task.create.howto.quick]] 快速建一条空壳,再进入任务详情页补字段 + +## 可设置字段 +1. **名称**(必填,≤255 字符) +2. **描述**(富文本,≤50000 字符) +3. **所属列**(默认项目第一列;可下拉选) +4. **优先级**(取项目级或全局优先级配置,详见 [[task.field.priority.concept]]) +5. **负责人 / 协作者**(详见 [[task.field.owner-assist.concept]]) +6. **可见性**(项目人员可见 / 任务人员可见 / 指定成员,详见 [[task.field.visibility.concept]]) +7. **计划时间**(start_at / end_at,详见 [[task.field.deadline.concept]]) +8. **标签**(项目内独立,详见 [[task.field.tag.concept]]) +9. **颜色**(color 字段,覆盖优先级颜色) +10. **子任务**(最多 50 条) +11. **附件**(创建后才能上传) + +## 操作步骤 +1. 填上述字段,必填项是名称 +2. 点「保存」,任务出现在所选列底部 +3. 创建后可继续打开详情页改字段,所有改动即时写入并广播给项目成员 + +## 不支持 +- 创建时不能直接上传附件,必须保存后再传 +- 不允许任务名称为空(会被服务端拒绝) diff --git a/resources/ai-kb/zh/howto/task/create-quick.md b/resources/ai-kb/zh/howto/task/create-quick.md new file mode 100644 index 000000000..ff8439a7f --- /dev/null +++ b/resources/ai-kb/zh/howto/task/create-quick.md @@ -0,0 +1,45 @@ +--- +id: task.create.howto.quick +title: 快速创建任务 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 怎么建任务 + - 新建任务 + - 添加待办 + - 加一条 todo + - 怎么加任务 +related_tools: [create_task] +related_pages: [project_detail, task_list] +prerequisites: + - 已加入至少一个项目 +negative: + - 快速创建不支持设置截止时间、负责人、协作者等高级字段(可选优先级),如需用完整创建 + - 创建后任务默认进入所在列底部(列头「+」则加到列顶) +last_verified: v1.7.90 +--- + +# 快速创建任务 + +## 入口 +- 桌面端:项目看板视图,任意列底部的添加区域,输入任务描述按回车创建 +- 桌面端:列标题右侧「+」图标,在该列顶部快速添加 +- 桌面端:左侧栏左上角「新建任务」按钮(快捷键 Ctrl/Cmd + K 或 Ctrl/Cmd + N),弹出新建任务对话框 +- 移动端:底部 Tabbar 中央「+」按钮 → 「添加任务」 + +## 操作步骤 +1. 在添加区域输入任务名称(必填,不超过 255 字符) +2. 按回车提交,任务立刻出现在该列 +3. 输入框右侧可顺手点选优先级图标 +4. 想继续填字段:点击任务卡进入详情页编辑 + +## 默认值 +- 负责人:当前用户 +- 状态/列:添加时所在的列(「新建任务」对话框创建时默认第一列) +- 优先级:普通 +- 截止时间:无 + +## 想设置更多字段 +切换到完整创建模式(任务详情页),可设置负责人、协作者、可见用户、标签、子任务、关联任务、附件等。 diff --git a/resources/ai-kb/zh/howto/task/create-via-mention.md b/resources/ai-kb/zh/howto/task/create-via-mention.md new file mode 100644 index 000000000..42e4adfdf --- /dev/null +++ b/resources/ai-kb/zh/howto/task/create-via-mention.md @@ -0,0 +1,49 @@ +--- +id: task.create.howto.via-mention +title: 在对话中用 @# 创建或关联任务 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 聊天里建任务 + - 群聊里建任务 + - 群里 @# 建任务 + - 在群消息里新建任务 + - 群消息怎么转成任务 + - 把消息变成待办 + - 群聊里直接派任务 + - dialog mention 任务 +related_tools: [create_task, send_message] +related_pages: [messenger, dialog_chat] +prerequisites: + - 通过消息菜单「新任务」建任务时,需在所选项目有添加任务的权限 +negative: + - "`#` 任务面板只能关联已有任务,没有「新建任务」入口,也没有负责人 / 截止时间字段" + - 消息菜单「新任务」仅对文本消息可用,图片 / 文件 / 语音消息没有该选项 + - 关联建立后不会自动同步任务字段到消息 + - 删除消息不会删除已建任务 +last_verified: v1.7.90 +--- + +# 在群聊 / 对话中用 @# 创建或关联任务 + +## 是什么 +在 DooTask 群聊或任务对话的输入框输入 `#`(常被口语化写成 `@#`),会唤起**任务选择面板**,把已有任务以卡片形式插入消息,消息与任务间建立 mention 关联(ProjectTaskRelation),任务侧能反向看到引用它的消息。注意:这个面板**只能选已有任务,不能新建**;群聊里新建任务要用消息菜单的「新任务」。 + +## 关联已有任务(# 面板) +1. 输入框中输入 `#`,弹出任务面板:「项目任务」(当前对话所属项目的未归档任务)、「我的待完成任务」、「我协助的任务」 +2. 继续输入关键词可搜索,命中我参与的其他项目任务时会出现「其他任务」分组(受任务可见性限制) +3. 选中后消息里出现任务卡片,发送即建立关联 +4. 私聊没有项目上下文,默认只列「我的待完成 / 我协助的任务」,同样可搜索 + +## 群聊里直接派任务(消息菜单「新任务」) +1. 右键(移动端长按)群里某条**文本消息** → 选「新任务」 +2. 打开完整的新建任务面板,消息内容自动填入任务详细描述 +3. 面板字段:项目、任务列表、任务描述(标题)、详细描述;展开「高级选项」还有**计划时间(含截止)、负责人、协助人员**、可见性、子任务 +4. 负责人默认是自己,派给别人时在「负责人」字段改选对方,再点「添加任务」 + +## 不支持 +- `#` 面板不支持新建任务,面板里也没有负责人 / 截止时间字段(这些在「新任务」完整面板里设置) +- 图片、文件、语音消息不支持「新任务」(仅文本消息) +- 「关联任务」字段与消息关联不是一回事:前者是任务↔任务关系,详见 [[task.related.concept]] diff --git a/resources/ai-kb/zh/howto/task/delete-restore.md b/resources/ai-kb/zh/howto/task/delete-restore.md new file mode 100644 index 000000000..5ee636b9f --- /dev/null +++ b/resources/ai-kb/zh/howto/task/delete-restore.md @@ -0,0 +1,49 @@ +--- +id: task.delete-restore.howto +title: 删除任务与回收站恢复 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 删除任务 + - 恢复任务 + - 回收站 + - 任务删错了怎么办 + - 找回任务 +related_tools: [delete_task] +related_pages: [task_detail, recycle_bin] +prerequisites: + - 是任务负责人,或有项目 TASK_REMOVE 权限 +negative: + - 删除后默认仅在回收站近期记录中保留,超过保留窗口会被定时清理 + - 父任务删除会级联软删所有子任务 + - 已删除任务不能编辑、不能完成、不能加子任务,必须先恢复 +last_verified: v1.7.90 +--- + +# 删除任务与回收站恢复 + +## 是什么 +DooTask 任务使用软删除(`deleted_at` + `deleted_userid`),删除并非立即清理数据。回收站(Deleted 表)记录删除历史,可在一定时间内恢复。 + +## 入口 +- 桌面端:任务详情页 → 「⋯」 → 「删除」 +- 桌面端列表视图:右键任务行 → 「删除」 +- 恢复入口:项目设置 → 「回收站」或全局「我删除的任务」 + +## 删除操作步骤 +1. 选「删除」并在弹窗确认 +2. 服务端 `deleteTask()` 写入 `deleted_at`,子任务被级联软删 +3. 任务从所有视图消失,已归档的也一并隐藏 + +## 恢复操作步骤 +1. 进入回收站,按任务名或项目搜索 +2. 点击「恢复」,调用 `restoreTask()` 把 `deleted_at` 置空 +3. 任务回到原项目原列,子任务一并恢复 +4. 回收站默认展示最近 50 条;带筛选时最多 500 条 + +## 不支持 +- 任务关联的对话(dialog_id)不在删除时清理 +- 已超出回收站保留窗口的任务无法恢复 +- 普通用户只能恢复自己删除的任务,看不到他人删除的记录 diff --git a/resources/ai-kb/zh/howto/task/edit-basic.md b/resources/ai-kb/zh/howto/task/edit-basic.md new file mode 100644 index 000000000..b7807ad1c --- /dev/null +++ b/resources/ai-kb/zh/howto/task/edit-basic.md @@ -0,0 +1,51 @@ +--- +id: task.edit.howto.basic +title: 编辑任务基本信息(标题 / 描述 / 负责人) +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 改任务名 + - 改任务描述 + - 改任务负责人 + - 怎么编辑任务 + - 修改任务内容 +related_tools: [update_task] +related_pages: [task_detail] +prerequisites: + - 任务可见(你是负责人 / 协作者 / 项目成员且 visibility 命中) + - 改负责人需要项目 TASK_UPDATE 权限或是当前负责人 +negative: + - 改字段会即时写入并广播到所有项目成员,不需要点保存 + - 任务名为空无法保存 + - 改完成时间(complete_at) 和归档时间(archived_at) 不能直接编辑,必须用 [[task.complete.howto]] / [[task.archive.howto]] +last_verified: v1.7.90 +--- + +# 编辑任务基本信息(标题 / 描述 / 负责人) + +## 入口 +- 桌面端:项目详情页 → 任意视图点击任务卡 → 详情页弹出 +- 移动端:任务列表点击任务 → 详情页 + +## 可即时编辑的字段 +- 标题(≤255 字符) +- 描述(富文本,≤50000 字符) +- 负责人(owner=1 的用户,可多人) +- 协作者(owner=0 的用户) +- 优先级(详见 [[task.field.priority.concept]]) +- 标签(详见 [[task.field.tag.concept]]) +- 计划时间(详见 [[task.field.deadline.concept]]) +- 可见性(详见 [[task.field.visibility.concept]]) +- 颜色(详见 [[task.field.color.concept]]) + +## 编辑方式 +1. 点击对应字段 +2. 直接修改,失焦或回车即时保存 +3. 服务端 `update_task` 写入并通过 WebSocket 推送到项目所有在线成员 + +## 不支持 +- 字段无版本回滚,只有描述区会保留历史(ProjectTaskContent 表) +- 编辑不弹「确认」对话框,所有改动立即生效 +- 已删除任务无法编辑,需要先 [[task.delete-restore.howto]] 恢复 diff --git a/resources/ai-kb/zh/howto/task/move-column.md b/resources/ai-kb/zh/howto/task/move-column.md new file mode 100644 index 000000000..3a852dddd --- /dev/null +++ b/resources/ai-kb/zh/howto/task/move-column.md @@ -0,0 +1,49 @@ +--- +id: task.move.howto.column +title: 拖拽任务换列 / 修改工作流状态 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 拖动任务 + - 换列 + - 拖到已完成 + - 看板拖任务 + - 把任务改状态 +related_tools: [update_task] +related_pages: [project_detail, task_kanban] +prerequisites: + - 看板视图或工作流视图下 + - 有 TASK_UPDATE 权限 +negative: + - 拖动只改 column_id(所属列),不直接改 complete_at(完成时间) + - 跨项目拖动不支持,跨项目要用 [[task.move.howto.cross-project]] + - 移动端不支持拖动,需进详情改字段 +last_verified: v1.7.90 +--- + +# 拖拽任务换列 / 修改工作流状态 + +## 是什么 +DooTask 看板(Kanban)视图按 `column_id`(项目列)分栏;工作流视图按 `flow_item_id`(自定义状态)分栏。拖动任务卡片会触发 `task__update` 改对应字段并同时更新 `sort` 排序值。 + +## 入口 +- 桌面端:项目详情页右上角视图切换 → 「看板」或「工作流」 +- 进入后所有任务按列显示 + +## 操作步骤 +1. 鼠标按住任意任务卡片 +2. 拖到目标列,松开 +3. 服务端写入新的 `column_id`(或 `flow_item_id`)与 `sort` +4. WebSocket 推送给项目所有在线成员,他们的看板同步刷新 + +## 自动联动 +- 项目工作流配置中,每个 `ProjectFlowItem` 可绑定一个 `columnid` 与 `status=end` 标记 +- 拖到 `status=end` 的工作流状态会自动把 `complete_at` 写入当前时间(标记完成) +- 拖到其他状态则只改 `flow_item_id`,不改 `complete_at` + +## 不支持 +- 拖动不能批量 +- 跨项目不能直接拖 +- 工作流视图下,拖到无权限的负责人状态会被服务端拒绝 diff --git a/resources/ai-kb/zh/howto/task/move-cross-project.md b/resources/ai-kb/zh/howto/task/move-cross-project.md new file mode 100644 index 000000000..08fcd87bc --- /dev/null +++ b/resources/ai-kb/zh/howto/task/move-cross-project.md @@ -0,0 +1,52 @@ +--- +id: task.move.howto.cross-project +title: 任务跨项目移动 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 任务转项目 + - 把任务移到别的项目 + - 任务换项目 + - 跨项目移动 + - 项目之间挪任务 +related_tools: [update_task, get_project] +related_pages: [task_detail] +prerequisites: + - 源任务可见,且你有 TASK_UPDATE 权限 + - 目标项目你已加入,且有 TASK_ADD 权限 +negative: + - 跨项目移动会清空项目级标签([[task.field.tag.concept]]),按目标项目重新打 + - 跨项目移动不会迁移任务聊天室(dialog_id 保留但不再属于目标项目对话列表) + - 子任务跟随父任务一起移动,不能单独移动子任务 +last_verified: v1.7.90 +--- + +# 任务跨项目移动 + +## 是什么 +DooTask 任务可通过 `task__move` 接口在不同项目间移动,主要用于「任务被错放在了错的项目」或「把临时任务划归正式项目」的场景。移动会同时更新 `project_id`、`column_id`、`sort`、`flow_item_id` 字段。 + +## 入口 +- 桌面端:任务操作菜单(任务卡右键 / 任务详情「⋯」)→「移动」,弹出「移动任务」弹窗 + +## 操作步骤 +1. 在「移动任务」弹窗顶部的级联选择器选目标项目和目标列表 +2. 弹窗左侧显示移动前的状态 / 负责人 / 协助人,右侧可同时重新设置: + - 「状态」:按目标项目的工作流状态选择 + - 「负责人」:可改选(最多 10 人) + - 「协助人」:可改选 +3. 点确定提交,服务端验证权限并写入 + +## 字段变化 +- `project_id`:改为目标项目 +- `column_id`、`sort`:按目标列重新计算 +- `flow_item_id`、`flow_item_name`:按目标项目工作流匹配,找不到匹配则清空 +- `p_level`、`p_name`、`p_color`(优先级):保留 +- 任务名、描述、附件等主要字段:保留 + +## 不支持 +- 不能批量跨项目移动 +- 项目级标签 [[task.field.tag.concept]] 不迁移 +- 移动时不能改任务名 / 描述 diff --git a/resources/ai-kb/zh/howto/task/recurring.md b/resources/ai-kb/zh/howto/task/recurring.md new file mode 100644 index 000000000..7a9519c0f --- /dev/null +++ b/resources/ai-kb/zh/howto/task/recurring.md @@ -0,0 +1,53 @@ +--- +id: task.recurring.howto +title: 重复 / 循环任务 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 重复任务 + - 循环任务 + - 每天的任务 + - 周报任务自动生成 + - 怎么让任务自动重复 +related_tools: [create_task, update_task, complete_task] +related_pages: [task_detail] +prerequisites: + - 任务已设置 end_at(截止时间),否则无法计算下一周期 +negative: + - 重复任务不能在子任务上独立设置(subtask 不支持 loop) + - 重复任务的下一份在「上一份被标记完成时」生成,不是按日历预生成 + - 修改循环周期不会回填已生成的实例 +last_verified: v1.7.90 +--- + +# 重复 / 循环任务 + +## 是什么 +DooTask 任务支持循环重复(字段 `loop` + `loop_at`),常用于「每日站会」「每周周报」类型任务。每次任务被标记完成时,系统按 `loop` 自动生成下一份新任务,复制原任务字段并按 `loop_at` 推下一次计划时间。 + +## 支持的周期 +- `day` 每天 +- `weekdays` 工作日(周一至周五) +- `week` 每周 +- `twoweeks` 双周 +- `month` 每月 +- `year` 每年 +- 自定义天数(输入数字,如 3 表示每 3 天) +- `never` 不重复(默认) + +## 入口 +- 桌面端:任务详情页 → 计划时间区 → 「循环」下拉 +- 必须先填 end_at(截止时间)才能启用循环 + +## 工作原理 +1. 标记 [[task.complete.howto]] 完成当前任务 +2. 服务端基于 `loop` 与当前 `end_at` 计算下一个 `loop_at` +3. 自动创建新任务并复制:标题、描述、负责人、协作者、标签、优先级、可见性、子任务 +4. 新任务的状态为未完成,按新计划时间出现在日历视图 + +## 不支持 +- 不能为同一任务并行启用多个周期 +- 循环不复制附件 +- 子任务不能独立设置循环 diff --git a/resources/ai-kb/zh/howto/task/sort.md b/resources/ai-kb/zh/howto/task/sort.md new file mode 100644 index 000000000..7c88fe6b9 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/sort.md @@ -0,0 +1,48 @@ +--- +id: task.sort.howto +title: 任务列内排序 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 任务排序 + - 重排任务顺序 + - 任务置顶 + - 调整任务顺序 + - 排序任务 +related_tools: [update_task] +related_pages: [project_detail, task_list] +prerequisites: + - 在看板或列表视图 + - 有 TASK_UPDATE 权限 +negative: + - 任务没有「整项目置顶」字段,只能调列内顺序 + - 排序变更不会进项目动态日志 + - 多人同时拖动时,最后一次写入覆盖前面(无冲突合并) +last_verified: v1.7.90 +--- + +# 任务列内排序 + +## 是什么 +DooTask 任务在每个 `column_id`(项目列)内有一个 `sort` 字段(整数),决定该列内的展示顺序。看板视图、列表视图均按 `sort` 升序展示。拖动任务卡上下移动会触发后端 `sort` API 重写整列的 `sort` 值。 + +## 入口 +- 桌面端:看板 / 列表视图任意一列内 +- 移动端:不支持拖动重排(按服务端默认 sort 显示) + +## 操作步骤(看板视图) +1. 鼠标按住任务卡片 +2. 上下拖动到列内目标位置 +3. 松开后,服务端按列重排 `sort` 值(同时可能改 `column_id` 见 [[task.move.howto.column]]) + +## 与「置顶」的关系 +- DooTask 中**任务无单独置顶字段** +- 想让一条任务长期排首位,只能把它拖到当前列最上方 +- 项目层面的「置顶」(`ProjectUser.top_at`)是把整个项目固定在侧边栏顶部,与任务排序无关 + +## 不支持 +- 任务无项目级置顶 +- 不能按字段(截止时间、优先级)自动排序,所有视图默认就是 sort 升序 +- 移动端只读,不支持拖动 diff --git a/resources/ai-kb/zh/howto/task/subtask-create.md b/resources/ai-kb/zh/howto/task/subtask-create.md new file mode 100644 index 000000000..c2c68870b --- /dev/null +++ b/resources/ai-kb/zh/howto/task/subtask-create.md @@ -0,0 +1,53 @@ +--- +id: task.subtask.howto.create +title: 创建子任务 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 加子任务 + - 拆任务 + - 新增子任务 + - 父任务下加待办 + - 怎么建 subtask +related_tools: [create_sub_task] +related_pages: [task_detail] +prerequisites: + - 父任务可见,有 TASK_UPDATE 权限 + - 父任务自身不是子任务(不允许嵌套) +negative: + - 单个父任务最多 50 个子任务 + - 子任务不能再嵌套子任务(一级深) + - 子任务必须与父任务在同一项目,不能跨项目 +last_verified: v1.7.90 +--- + +# 创建子任务 + +## 是什么 +子任务是挂在某个父任务下的下级任务,用 `parent_id` 维护父子关系。子任务有独立的负责人、截止时间、状态,但**继承父任务的可见性**与项目归属。详细定义见 [[task.subtask.concept]]。 + +## 入口 +- 桌面端:父任务详情页 → 「子任务」区 → 「+ 新增子任务」 +- 桌面端:在任务详情页底部展开子任务列表 +- 移动端:任务详情页向下滑动到子任务区,点底部「+」 + +## 操作步骤 +1. 在子任务区点 + 号 +2. 输入子任务名称(必填,≤255 字符) +3. 回车保存,子任务出现在列表底部 +4. 点子任务行可继续设置负责人、截止时间、描述 + +## 字段默认值 +- 负责人:当前用户 +- `parent_id`:父任务 id +- `project_id`、`column_id`:继承父任务 +- 可见性:继承父任务(不可单独配置) + +## 不支持 +- 子任务**不能**自己再有子任务(最多 1 层) +- 子任务**不能**单独配置可见性、对话、附件 +- 不能把已有任务转成另一个任务的子任务(只能新建) + +具体限制详见 [[task.subtask.limits.concept]]。 diff --git a/resources/ai-kb/zh/howto/task/template.md b/resources/ai-kb/zh/howto/task/template.md new file mode 100644 index 000000000..56c584db3 --- /dev/null +++ b/resources/ai-kb/zh/howto/task/template.md @@ -0,0 +1,46 @@ +--- +id: task.template.howto +title: 任务模板的创建与使用 +type: howto +feature: task +scope: end-user +locale: zh +aliases: + - 任务模板 + - 怎么存任务模板 + - 重复用的任务模板 + - 模板创建任务 + - 怎么把任务存成模板 +related_tools: [create_task] +related_pages: [project_detail, task_template] +prerequisites: + - 已加入目标项目,有 TASK_ADD 权限 +negative: + - 任务模板不能跨项目共享,除非站点设置 task_template_share 开启 + - 模板不保存附件,只保存标题、内容、字段 + - 子任务模板不支持嵌套子任务 +last_verified: v1.7.90 +--- + +# 任务模板的创建与使用 + +## 是什么 +任务模板(ProjectTaskTemplate)把常用的任务标题 + 描述 + 字段保存下来,下次新建任务时一键套用。每个模板属于一个项目,全局共享需要管理员在系统设置打开 `task_template_share`。 + +## 入口 +- 桌面端:项目详情页「+ 添加任务」对话框 → 顶部「模板」下拉 +- 桌面端:项目设置 → 「任务模板」可统一管理(增删改默认模板) + +## 创建模板 +1. 进入项目设置 → 任务模板 → 「+ 新增模板」 +2. 填模板名(用于下拉显示)、任务标题、富文本内容 +3. 可选标记 `is_default` 让它作为新建任务的默认套用项 + +## 使用模板 +1. 在新建任务对话框顶部下拉里选模板 +2. 标题与描述会自动填入,可继续编辑后保存 +3. 每次使用会自增模板的 `use_count` 与 `last_used_at` + +## 不支持 +- 模板不携带附件、子任务列表 +- 模板默认按项目隔离,开启 `task_template_share` 后所有项目可见,但不可分项目权限 diff --git a/resources/ai-kb/zh/howto/user-account/delete.md b/resources/ai-kb/zh/howto/user-account/delete.md new file mode 100644 index 000000000..f3099b828 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/delete.md @@ -0,0 +1,59 @@ +--- +id: user-account.delete.howto +title: 注销账号 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 注销账号 + - 删除账号 + - 销户 + - 不想用了 + - 彻底删除账号 + - 账号怎么注销 +related_tools: [] +related_pages: [] +prerequisites: + - 必须知道当前登录邮箱 + - 开启邮箱验证时需收到验证码;未开启时需输入登录密码 +negative: + - 注销后无法自助恢复,只能由系统管理员从 `user_deletes` 表里手动还原(详见 [[user-account.delete-restore.faq]]) + - 系统账号(system)禁止注销 + - 注销不会立即物理删除所有数据;用户基础信息缓存在 user_deletes 表保留以维持历史记录可读 + - 注销后该邮箱可以被重新注册(但与原账号无关联) +last_verified: v1.7.90 +--- + +# 注销账号 + +## 入口 +- 桌面端:右上角头像 →「个人设置」→「账号安全」→ 底部「注销账号」 +- 移动端:「我的」→「个人设置」→ 底部「注销账号」 + +## 操作步骤 +1. 点「注销账号」打开确认页 +2. 输入「当前邮箱」(必须与已登录账号完全一致) +3. 二次验证: + - 系统开启邮箱验证(emailSetting.reg_verify=open):点「发送验证码」→ 填邮件里的验证码 + - 否则:填登录密码 +4. 可选:填注销原因(保留到 `user_deletes.reason`,供管理员参考) +5. 点「确认注销」(type=confirm) + +## 注销后的数据处理 +- 用户标记为已删除,`user_deletes` 表保留快照:邮箱、昵称、头像、部门 +- 该用户在任务/项目/聊天中的历史记录仍存在,但显示为「已注销用户」 +- 该用户在「团队管理」普通列表中不再出现 +- token 立即失效,所有设备登出 + +## 注销前建议 +- 先把负责的项目、任务转交他人;否则注销后这些工作项会保留旧的负责人指向 +- 导出/备份你需要保留的文件、报告 +- 退出所有项目与群组 + +## 不支持 +- 不支持「暂时关闭账号」(停用账号是管理员才能做的操作) +- 不支持注销后保留消息历史的副本下载 + +## 相关 +- 注销能不能恢复:[[user-account.delete-restore.faq]] diff --git a/resources/ai-kb/zh/howto/user-account/device.md b/resources/ai-kb/zh/howto/user-account/device.md new file mode 100644 index 000000000..80bdde6a2 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/device.md @@ -0,0 +1,58 @@ +--- +id: user-account.device.howto +title: 设备管理 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 设备管理 + - 登录设备 + - 在线设备 + - 踢下线 + - 远程登出 + - 改设备名 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 设备列表上限由 UserDevice::$deviceLimit 控制,超过会按时间淘汰最旧设备 + - 同一浏览器清缓存/换浏览器/换无痕模式都算新设备 + - 在「设备」里把别的设备登出不会改你当前的登录状态;登出自己当前设备需用 [[user-account.logout.howto]] + - 不支持「永久禁止某设备再登录」;登出后用账密重新登又会创建新设备记录 +last_verified: v1.7.90 +--- + +# 设备管理 + +## 入口 +- 桌面端:右上角头像 →「个人设置」→「账号安全」→「登录设备」 +- 移动端:「我的」→「个人设置」→「登录设备」 + +## 能做什么 +对应 `api/users/device/*` 接口: +- **列表**(`device/list`):看自己所有已登录设备 +- **登出某设备**(`device/logout`):把指定设备踢下线,对应设备下次请求会被拒绝 +- **改设备名**(`device/edit`):修改当前设备的 device_name / 品牌 / 型号 / 系统等显示字段 + +## 列表显示字段 +- 设备名(可改) +- 品牌、型号、操作系统(可改) +- 登录时间、最后活跃时间 +- IP 地址 +- 当前设备会标「本机」标识 + +## 操作步骤:登出某设备 +1. 进设备列表 +2. 找到要登出的设备,点「登出」 +3. 系统调用 `device/logout?id=xxx`,删除对应 UserDevice 记录 +4. 该设备下次请求会返回 401,被迫回登录页 + +## 操作步骤:改设备名 +1. 在设备卡片上点编辑/重命名 +2. 改完保存,调用 `device/edit` 写入 `detail` +3. 改的是当前设备的展示信息,不影响其它设备 + +## 不支持 +- 不支持「同设备多账号同时登录」(每个浏览器/客户端只能有一份 token) +- 不支持「按 IP 段限制设备登录」;这是 license/license-server 才有的能力 diff --git a/resources/ai-kb/zh/howto/user-account/email-verify.md b/resources/ai-kb/zh/howto/user-account/email-verify.md new file mode 100644 index 000000000..360469876 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/email-verify.md @@ -0,0 +1,54 @@ +--- +id: user-account.email-verify.howto +title: 邮箱验证 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 邮箱验证 + - 验证邮箱 + - 收不到验证邮件 + - 邮箱激活 + - 链接失效 + - 验证链接过期 +related_tools: [] +related_pages: [] +prerequisites: + - 管理员已开启「注册需邮箱验证」(emailSetting.reg_verify = open) + - 管理员已配置可用的 SMTP 邮件服务 +negative: + - 验证链接 30 分钟内有效,过期需重新登录/注册触发新邮件 + - 验证链接是一次性的,已使用过的链接会提示「链接已经使用过」 + - 没开启 reg_verify 时,注册后无需验证邮箱 + - 注销账号确认([[user-account.delete.howto]])也走邮箱验证,但用的是不同 type 的验证码 +last_verified: v1.7.90 +--- + +# 邮箱验证 + +## 触发场景 +- 注册时管理员开启了「注册需邮箱验证」 +- 已注册但 `email_verity = 0` 的账号尝试登录 +- 注销账号确认(type=3) + +## 操作步骤 +1. 注册/登录后系统调用 `UserEmailVerification::userEmailSend` 给你邮箱发一封验证邮件 +2. 打开邮件,点击「验证邮箱」链接 +3. 链接会带 `code` 参数,跳到验证页自动调 `api/users/email/verification?code=xxx` +4. 成功提示「绑定邮箱成功」,可返回登录页正常登录 + +## 收不到邮件怎么办 +- 检查垃圾邮件/广告邮件分类 +- 确认登录邮箱拼写正确 +- 等待 1-2 分钟(SMTP 投递延迟) +- 联系管理员检查系统 SMTP 配置和发件箱可用性 + +## 错误码 +- **无效连接,请重新注册**:code 不存在或已被篡改 +- **链接已经使用过**(data.code=2):同一个 code 只能用一次,重新触发邮件 +- **链接已失效,请重新登录/注册**:超过 30 分钟,重新触发 + +## 不支持 +- 不支持自助修改注册邮箱;如确需更换邮箱,按 [[user-account.delete.howto]] 注销后用新邮箱重新注册 +- 不支持短信验证码替代邮箱验证 diff --git a/resources/ai-kb/zh/howto/user-account/import.md b/resources/ai-kb/zh/howto/user-account/import.md new file mode 100644 index 000000000..bd78c876d --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/import.md @@ -0,0 +1,52 @@ +--- +id: user-account.import.howto +title: 批量导入用户 +type: howto +feature: user-account +scope: admin +locale: zh +aliases: + - 批量导入用户 + - 批量创建账号 + - 一次建多个用户 + - 上传 excel 用户 + - 用户导入模板 + - 导入员工 +related_tools: [] +related_pages: [] +prerequisites: + - 必须是系统管理员(userIsAdmin)才能调 import / import_preview / import_template +negative: + - 仅支持 xls / xlsx / csv 文件,单次最多导入 500 条 + - 不支持用导入更新已有用户;同邮箱已存在的行会标错跳过 + - 不支持在文件里指定头像 / 电话等扩展字段,列只有邮箱、昵称、初始密码、职位 + - 必须先预览解析确认,再确认导入;直接 import 不带 rows 会报「没有可导入的数据」 +last_verified: v1.7.90 +--- + +# 批量导入用户 + +## 入口 +- 桌面端:左上角头像 / 昵称下拉菜单 →「团队管理」→ 成员列表上方的「批量导入」按钮 +- 仅系统管理员可见 + +## 操作步骤 +1. 点「下载导入模板」获取官方模板(对应 `api/users/import/template`) +2. 按模板列顺序填写每一行(列顺序固定): + - 第 1 列 邮箱(必填,未被注册) + - 第 2 列 昵称(必填,2-20 字) + - 第 3 列 初始密码(必填,6-32 位,满足密码策略) + - 第 4 列 职位(选填,填写则需 2-20 字) +3. 上传文件(仅支持 xls / xlsx / csv,单次最多 500 行),系统先调 `api/users/import/preview` 解析校验(不创建账号) +4. 预览页逐行显示校验结果(邮箱重复、字段缺失、密码不合法等),确认后点「确认导入」调 `api/users/import` 实际创建 +5. 可勾选「首次登录强制改密码」(默认勾选,对应 changepass=1);预览中可按行调整邮箱认证状态(email_verity) + +## 失败行的处理 +- 预览阶段会标出每行解析错误(邮箱重复、字段缺失、密码不合法等) +- 导入阶段返回 `result`,包含成功条数和失败条数清单 +- 失败的行不影响成功的行,可修正后单独再传 + +## 不支持 +- 不支持「导入即邀请发送邮件」开关,邮箱通知由 reg_verify 设置统一决定 +- 不支持 Excel 一次性指定头像/电话;后续可让用户自行在「个人设置」补全 +- 普通用户无此入口;非管理员调 import 会被 `User::auth('admin')` 拦截 diff --git a/resources/ai-kb/zh/howto/user-account/login-codeimg.md b/resources/ai-kb/zh/howto/user-account/login-codeimg.md new file mode 100644 index 000000000..63343e2d9 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/login-codeimg.md @@ -0,0 +1,49 @@ +--- +id: user-account.login-codeimg.howto +title: 登录图形验证码 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 图形验证码 + - 登录验证码 + - 为什么要填验证码 + - 验证码看不清 + - 刷新验证码 + - needcode +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 验证码区分大小写;填错会反复要求重输 + - 图形验证码仅用于登录风控,不能用于注册/找回密码 + - 输入正确的账号密码后再没必要每次都填验证码;只有触发风控后才强制要求 +last_verified: v1.7.90 +--- + +# 登录图形验证码 + +## 是什么 +DooTask 登录页在风控触发后会弹出图形验证码,要求用户填写。底层接口 `api/users/login/codeimg`(返回图片)和 `login/codejson`(返回 base64 + key)。 + +## 触发条件 +- 同一邮箱多次密码错误(系统标记 `code::邮箱 = need`) +- 部分客户端/IP 默认就要求验证码 +- 可调 `api/users/login/needcode?email=xxx`,返回 need=1 即表示当前账号需要验证码 + +## 操作步骤 +1. 输入邮箱、密码后,登录页若出现验证码框,先填验证码 +2. 看不清:点验证码图刷新,会生成新的图片+新的 code_key +3. 验证通过且密码正确后,系统自动清除 `code::邮箱` 标记,后续不再要求验证码 + +## 两种验证码接口的区别 +- **codeimg**:返回 PNG 图片二进制,session 内验证,提交时不需要带 code_key +- **codejson**:返回 base64 图片 + key,提交时必须带 `code_key`;客户端/App 用这个(无 session) + +## 不支持 +- 不支持滑块/拼图验证码,目前仅文本图形码 +- 不支持邮箱/短信验证码替代图形验证码 + +## 相关 +- 登录主流程:[[user-account.login.howto]] diff --git a/resources/ai-kb/zh/howto/user-account/login-qrcode.md b/resources/ai-kb/zh/howto/user-account/login-qrcode.md new file mode 100644 index 000000000..5d2e00a2e --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/login-qrcode.md @@ -0,0 +1,49 @@ +--- +id: user-account.login-qrcode.howto +title: 扫码登录 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 扫码登录 + - 二维码登录 + - 扫码登陆 + - 怎么扫码登录 + - 网页扫码 + - App 扫码登 PC +related_tools: [] +related_pages: [] +prerequisites: + - 一端(网页/客户端/App)已登录,作为「扫码端」 + - 另一端处于登录页,作为「被登录端」 +negative: + - 二维码 code 30 秒内有效;过期需刷新登录页重新生成 + - 二维码 code 必须 ≥ 32 字符,被篡改/截断会报「参数错误」 + - 被登录端轮询拿到的是用户 token,会创建一条新登录记录(不是会话共享) + - 不支持「同一二维码多端复用」,扫码成功并被消费后立即失效 +last_verified: v1.7.90 +--- + +# 扫码登录 + +## 是什么 +DooTask 客户端/App/网页在登录页生成一个二维码,已登录的另一端扫码后即可让登录页直接登入对应账号。底层接口 `api/users/login/qrcode`。 + +## 操作步骤 +1. **被登录端**:打开登录页,切到「扫码登录」tab,自动生成二维码 +2. **扫码端**:用已登录的 App 扫一扫,弹「确认登录到 XX 端」 +3. 确认后被登录端自动跳转到首页,登录完成 + +## 接口流程(了解原理用) +- 被登录端:周期性调用 `login/qrcode?type=status&code=xxx`,返回 `success` + user 即代表扫码端确认 +- 扫码端:扫码后调用 `login/qrcode?type=login&code=xxx`,把当前用户与该 code 绑定 +- code 在 Redis 缓存中,TTL 30 秒;超时未确认需刷新二维码 + +## 不支持 +- 二维码不能截图给别人扫;扫码即视为本人授权登录 +- 不能用「未登录设备」反向扫「已登录设备」生成的码,方向必须是已登录端扫被登录端 + +## 相关 +- 普通密码登录:[[user-account.login.howto]] +- 图形验证码:[[user-account.login-codeimg.howto]] diff --git a/resources/ai-kb/zh/howto/user-account/login.md b/resources/ai-kb/zh/howto/user-account/login.md new file mode 100644 index 000000000..174184893 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/login.md @@ -0,0 +1,54 @@ +--- +id: user-account.login.howto +title: 登录账号 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 怎么登录 + - 登录 DooTask + - 登录方式 + - 怎么进系统 + - 登不上 + - 密码登录 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 邮箱、密码各自最长 32 字符,超过提示「帐号或密码错误」 + - 账号被停用(disable_at 非空)会提示「帐号已停用」,需联系管理员 + - 开启「注册需邮箱验证」时,未验证邮箱的账号无法登录,必须先完成验证([[user-account.email-verify.howto]]) + - 多次失败后系统会强制要求填验证码([[user-account.login-codeimg.howto]]) +last_verified: v1.7.90 +--- + +# 登录账号 + +## 入口 +- 登录页:`/login` +- 客户端启动时自动跳转 + +## 支持的登录方式 +DooTask 同时支持以下登录方式(在登录页可切换): + +1. **邮箱 + 密码**:默认方式 +2. **扫码登录**:客户端/App 已登录后扫码登录另一端,详见 [[user-account.login-qrcode.howto]] +3. **LDAP**:管理员启用 LDAP 时,邮箱+LDAP 密码也可登录,系统自动同步用户 +4. **SSO**:管理员配置 OAuth/SAML 后,登录页会出现对应按钮(具体取决于插件) + +## 邮箱密码登录步骤 +1. 填邮箱、密码 +2. 若系统判定需要验证码(API `login/needcode` 返回 need),填图形验证码 +3. 提交,成功返回 token 和用户信息 + +## 登录后行为 +- 写入 `last_ip`、`last_at`、`line_ip`、`line_at` +- 生成 token(默认 30 天有效,可在系统设置 token_valid_days 调整) +- 首次登录会自动创建「📝 个人项目」 + +## 常见错误 +- **帐号或密码错误**:邮箱不存在或密码不对;连续错误后会触发验证码 +- **请输入验证码 / 请输入正确的验证码**:触发风控,需填图形验证码 +- **您还没有验证邮箱**:需先按 [[user-account.email-verify.howto]] 完成验证 +- **帐号已停用**:账号被管理员禁用,联系管理员恢复 diff --git a/resources/ai-kb/zh/howto/user-account/logout.md b/resources/ai-kb/zh/howto/user-account/logout.md new file mode 100644 index 000000000..7ab9591bc --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/logout.md @@ -0,0 +1,47 @@ +--- +id: user-account.logout.howto +title: 退出登录 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 退出登录 + - 退出账号 + - 怎么登出 + - 注销登录 + - 切换账号 + - 退出 DooTask +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 退出登录只清除当前设备的 token / 设备记录,不影响其它设备 + - 退出登录不是注销账号;账号还在,下次还能登录(注销见 [[user-account.delete.howto]]) + - 退出后未发送/草稿消息不会保留 +last_verified: v1.7.90 +--- + +# 退出登录 + +## 入口 +- 桌面端:右上角头像 → 下拉菜单 →「退出登录」 +- 移动端:底部 Tabbar「我的」→ 顶部头像区下方 →「退出登录」 +- 客户端:同桌面端 + +## 操作步骤 +1. 点「退出登录」,弹确认对话框 +2. 确认后调用 `api/users/logout`,清除当前设备 token +3. 自动跳到登录页 + +## 退出后做了什么 +- 当前设备的 `UserDevice` 记录被删除(device hash 失效) +- 当前 token 不再可用;继续用旧 token 调接口会返回 401 +- 其它设备的登录不受影响(要全设备登出请用 [[user-account.device.howto]] 逐个登出) + +## 切换账号 +退出后直接在登录页用其它邮箱登入即可。DooTask 不支持「同时登录多个账号」,桌面端可用多个浏览器配置或客户端用「多开」入口实现多账号并行。 + +## 不支持 +- 不支持「保持登录」勾选项;token 有效期由管理员在系统设置统一配置(默认 30 天) +- 不支持「退出后保留聊天草稿」 diff --git a/resources/ai-kb/zh/howto/user-account/password.md b/resources/ai-kb/zh/howto/user-account/password.md new file mode 100644 index 000000000..48515a838 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/password.md @@ -0,0 +1,56 @@ +--- +id: user-account.password.howto +title: 修改密码 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 修改密码 + - 改密码 + - 重置密码 + - 忘记密码怎么办 + - 找回密码 + - 改完密码要重新登录吗 +related_tools: [] +related_pages: [] +prerequisites: + - 必须知道当前旧密码(editpass 接口要求填 oldpass) + - 临时账号(temp)不允许改密码 +negative: + - 普通用户无法「免旧密码重置」;忘记密码只能联系管理员,由管理员在团队管理里手动改 + - 系统/演示账号(system)禁止改密码,会提示「演示账号不允许修改密码」 + - 改完密码后所有现有 token 仍然有效,但 LDAP 同步会同步更新 LDAP 密码 + - 新旧密码不能相同,会提示「新旧密码一致」 +last_verified: v1.7.90 +--- + +# 修改密码 + +## 入口 +- 桌面端:右上角头像 → 「个人设置」→「账号安全」→「修改密码」 +- 移动端:「我的」→「个人设置」→「修改密码」 + +## 操作步骤 +1. 输入「旧密码」 +2. 输入「新密码」(满足密码策略:长度、复杂度由管理员配置) +3. 再次输入「确认新密码」 +4. 提交,系统调用 `api/users/editpass` +5. 成功提示「修改成功」 + +## 密码策略 +密码策略由系统管理员在「系统设置 → 注册设置」中配置,常见规则: +- 最小长度(默认 6 位) +- 是否要求包含数字 / 大小写字母 / 特殊字符 +- 不能与邮箱前缀相同 +不满足会返回具体错误,按提示调整。 + +## 改完之后 +- 当前会话不会断开,可继续操作 +- 其它设备已登录的会话也仍然有效;如要踢出其它设备,去 [[user-account.device.howto]] 手动登出 +- 若启用 LDAP,新密码会同步到 LDAP 服务器 + +## 忘记密码 +- DooTask 当前不提供「邮箱找回密码」自助流程 +- 解决路径:联系系统管理员,在「系统设置 → 团队管理 → 用户列表」找到你的账号 → 重置密码后告知新密码 +- 强烈建议改完后立即再次走「修改密码」改成你自己的密码 diff --git a/resources/ai-kb/zh/howto/user-account/register.md b/resources/ai-kb/zh/howto/user-account/register.md new file mode 100644 index 000000000..b6cf00f73 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/register.md @@ -0,0 +1,54 @@ +--- +id: user-account.register.howto +title: 注册账号 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 怎么注册 + - 新用户注册 + - 注册账号 + - 注册 DooTask + - 没有账号怎么办 + - 邀请码注册 +related_tools: [] +related_pages: [] +prerequisites: + - 系统管理员已开放注册(系统设置 → 注册方式 ≠ close) +negative: + - 注册方式为「关闭」时所有人都无法自助注册,需管理员手动创建账号 + - 注册方式为「邀请码」时必须填正确邀请码,否则报「请输入正确的邀请码」 + - 邮箱长度和密码长度都不能超过 32 个字符 + - 开启「注册需邮箱验证」时,注册后必须先验证邮箱才能登录 +last_verified: v1.7.90 +--- + +# 注册账号 + +## 入口 +- 登录页底部「注册账号」链接 +- URL 直达:`/login?type=reg` + +## 注册前置判断 +注册方式由管理员在系统设置控制,分三种: + +- **open(开放)**:直接填邮箱+密码即可注册 +- **invite(邀请码)**:除邮箱+密码外,还需填邀请码;可调 `api/users/reg/needinvite` 提前判断(详见 [[user-account.reg-need-invite.concept]]) +- **close(关闭)**:注册入口不可用,提示「未开放注册」 + +## 操作步骤 +1. 进入登录页,切到「注册」tab +2. 输入邮箱(≤ 32 字符) +3. 输入密码(≤ 32 字符,需满足密码策略) +4. 若注册方式为 invite,填邀请码 +5. 提交 + +## 注册后行为 +- 系统自动给新用户创建一个「📝 个人项目」 +- 若开启「注册需邮箱验证」(emailSetting.reg_verify = open),返回「注册成功,请验证邮箱后登录」并发送验证邮件;验证流程见 [[user-account.email-verify.howto]] +- 未开启邮箱验证时直接登录成功,返回 token + +## 不支持 +- 不支持用户名注册,账号必须是邮箱 +- 不支持第三方账号(微信/手机号)直接注册;扫码/SSO 是登录方式不是注册方式 diff --git a/resources/ai-kb/zh/howto/user-account/search.md b/resources/ai-kb/zh/howto/user-account/search.md new file mode 100644 index 000000000..db4f550b1 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-account/search.md @@ -0,0 +1,60 @@ +--- +id: user-account.search.howto +title: 搜索用户 +type: howto +feature: user-account +scope: end-user +locale: zh +aliases: + - 搜索用户 + - 找人 + - 搜同事 + - 按部门筛人 + - 按项目找成员 + - 添加联系人 +related_tools: [search_users, get_users_basic] +related_pages: [] +prerequisites: [] +negative: + - 默认排除离职用户(disable=0),如要看离职用户须 disable=1 或 disable=2(含离职) + - 默认排除机器人(bot=0),需要机器人时 bot=1/2 + - 单次最多返回 100 条,超过需翻页(page + pagesize) + - 搜索结果只含基础字段(basicField),完整资料需调 user/info 或 get_users_basic +last_verified: v1.7.90 +--- + +# 搜索用户 + +## 入口 +- 桌面端:右上角头像 →「联系人」→ 搜索框 +- 桌面端:任务/项目「添加成员」「指派负责人」时的弹窗里 +- 桌面端:聊天「+ 发起对话」时的人员选择器 +- 通用接口:`api/users/search` + +## 关键词支持 +单一关键词 `keys.key` 智能匹配: +- 含 `@` → 按 email 模糊匹配 +- 纯数字 → 同时按 userid 精确 + nickname / pinyin / profession 模糊 +- 其它 → 按 nickname / pinyin / profession 模糊 + +## 高级筛选 +- `keys.disable`:`0` 仅在职(默认)/ `1` 仅离职 / `2` 全部 +- `keys.bot`:`0` 排除机器人(默认)/ `1` 仅机器人 / `2` 全部 +- `keys.project_id`:仅项目内的成员 +- `keys.no_project_id`:排除项目内的成员(常用于「邀请新成员」时排除已在的人) +- `keys.dialog_id`:仅对话/群里的成员 +- `keys.departments`:按部门 ID 过滤(多个逗号分隔) +- `sorts.az`:按拼音首字母 asc/desc 排序 +- `with_department=1`:返回结果带 department_info +- `state=1`:返回结果带 online 在线状态 + +## 分页 +- 默认 take 模式:`take` 10-100,单页返回 +- 分页模式:传 `page` 参数后,用 `pagesize`(≤ 100,默认 10) + +## 与 MCP 工具的关系 +AI 助手内置 `search_users` 工具直接复用此接口;调 `get_users_basic` 可按 ID 列表批量取昵称/头像/邮箱,性能比搜索更高。 + +## 不支持 +- 不支持按身份 identity 过滤(如「只搜管理员」),需取回后前端自行筛 +- 不支持模糊匹配电话号码或地址字段 diff --git a/resources/ai-kb/zh/howto/user-settings/app-sort.md b/resources/ai-kb/zh/howto/user-settings/app-sort.md new file mode 100644 index 000000000..467e53fd7 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/app-sort.md @@ -0,0 +1,68 @@ +--- +id: user-settings.app-sort.howto +title: 调整应用菜单排序 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 应用排序 + - 改菜单顺序 + - 拖动应用图标 + - 应用中心排序 + - 把某个应用放前面 + - 重排微应用 + - 自定义菜单顺序 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 应用排序只影响当前用户自己看到的顺序,不影响其他成员 + - 排序按「分组」隔离:普通应用(base)与管理员应用(admin)各排各的 + - 系统内置应用 / 微应用 / 管理员应用都参与排序,但隐藏的应用不会出现在排序里 +last_verified: v1.7.90 +--- + +# 调整应用菜单排序 + +「应用菜单排序」让用户按自己习惯重新排列应用中心 / 左侧应用栏的图标顺序。每个用户独立配置,不会影响他人。 + +## 入口 + +- 桌面端:左侧「应用」→ 进入应用中心 → 拖动应用卡片调整位置 +- 桌面端:右上角全局「+」面板里同步排序(共用同一份配置) +- 后端接口: + - 获取:`GET api/users/appsort` + - 保存:`POST api/users/appsort/save` + +## 数据结构 + +存表 `user_app_sorts`(一个用户一行),字段 `sorts` 为 JSON: + +``` +{ + "base": ["micro:calendar", "system:approve"], + "admin": ["system:ldap"] +} +``` + +- `base` 普通成员可见的应用 +- `admin` 管理员独占应用 +- 每项为 `:` 形式(`system` / `micro` 等命名空间 + 应用 id) + +## 操作步骤 + +1. 进入「应用中心」(或「应用」面板) +2. 长按 / 拖动应用图标到目标位置 +3. 松手后会自动调用 `appsort__save` 保存 +4. 其他终端登录会拉新顺序 + +## 默认顺序 + +未配置时按系统默认顺序(按插件注册先后 + 安装时间)。任意拖动一次即生成本人配置。 + +## 不支持 + +- 不支持隐藏单个应用图标(请去插件 / 微应用设置卸载) +- 不支持把「admin 应用」拖进「base 分组」 +- 不支持团队级 / 部门级统一应用顺序模板 diff --git a/resources/ai-kb/zh/howto/user-settings/checkin.md b/resources/ai-kb/zh/howto/user-settings/checkin.md new file mode 100644 index 000000000..2b9997095 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/checkin.md @@ -0,0 +1,67 @@ +--- +id: user-settings.checkin.howto +title: 签到个人偏好 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 录入人脸 + - 绑定 MAC + - WiFi 签到设置 + - 人脸签到设置 + - 签到记录在哪 + - 怎么打卡 + - 签到机器人 +related_tools: [] +related_pages: [setting] +prerequisites: + - 需系统管理员已安装并启用签到(checkin)插件 +negative: + - 签到的考勤规则 / 时段 / 部门策略由管理员配置,个人不可改 + - 一个用户最多录入一张人脸,不支持多张备份 + - MAC 地址 / 人脸录入不会自动签到当天补卡,只对启用后生效 +last_verified: v1.7.90 +--- + +# 签到个人偏好 + +「设置 → 签到」是用户给自己的签到方式做绑定与查看记录的页面。考勤规则在 [[checkin.rule.concept]],此处只讲个人侧。 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「签到」(需安装 checkin 插件) +- 移动端:「我的」→「设置」→「签到」 + +## 子区块 + +### 签到记录 + +- 时间线展示最近若干天的签到情况 +- 蓝点 = 当日有签到,橙点 = 未签到 +- 点「查看更多签到数据」展开月历,按月查询 +- 点「打开签到机器人」直接打开签到机器人对话 + +### 签到设置 → 人脸签到(face Tab) + +- 上传 1 张本人正面照,建议尺寸 500x500 +- 用于人脸识别打卡(移动端或带摄像头的终端) +- 重新上传会覆盖旧照片 + +### 签到设置 → WiFi 签到(mac Tab) + +- 添加多条「设备 MAC 地址 + 备注」 +- 设备连上指定路由器(管理员配置)后自动打卡 +- 清空 MAC 列空字符串即删除该条;或点 × 清除按钮 + +## 操作步骤 + +1. 选 Tab:人脸 / WiFi +2. 上传人脸 / 录入 MAC 列表 +3. 点底部「提交」保存,弹「修改成功」即生效 + +## 不支持 + +- 不支持人脸活体检测策略个人调整(由插件统一) +- 不支持自定义打卡地点 GPS 围栏(除非插件版本提供) +- 详细签到玩法见 [[checkin.concept]] diff --git a/resources/ai-kb/zh/howto/user-settings/email.md b/resources/ai-kb/zh/howto/user-settings/email.md new file mode 100644 index 000000000..155821f8a --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/email.md @@ -0,0 +1,57 @@ +--- +id: user-settings.email.howto +title: 修改邮箱 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 改邮箱 + - 换邮箱 + - 绑定新邮箱 + - 修改登录邮箱 + - 邮箱地址更改 +related_tools: [] +related_pages: [setting] +prerequisites: + - 新邮箱地址未被其他账号占用 +negative: + - LDAP 用户禁止修改邮箱(接口直接拒绝,提示「LDAP 用户禁止修改邮箱」) + - 体验 / 演示账号禁止修改邮箱 + - 新邮箱与当前邮箱相同不会报错,但不会触发任何变更 + - 邮箱验证开关关闭时无需验证码,但仍要求邮箱地址合法 +last_verified: v1.7.90 +--- + +# 修改邮箱 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「修改邮箱」 +- 移动端:「我的」→「设置」→「修改邮箱」 +- 后端接口:`POST api/users/email/edit` + +## 操作步骤 + +1. 输入「新邮箱地址」 +2. 如系统开启了「注册邮箱验证」(`emailSetting.reg_verify = open`): + - 点击邮箱栏右侧「发送验证码」 + - 在「验证码」栏输入收到的 6 位验证码(场景类型 `2` = 改邮箱) +3. 点击「提交」 +4. 弹「修改成功」即生效;下次登录用新邮箱 + +## 验证码相关 + +- 验证码由 `UserEmailVerification` 表存储,按邮箱 + 场景隔离 +- 收不到邮件先查系统设置 → 邮件设置是否配好 SMTP +- 同一邮箱短时间内重复发送会限流 + +## 不开启邮箱验证时 + +- 系统设置里 `reg_verify` 关闭时邮箱栏不显示「发送验证码」,直接填新邮箱即可保存 +- 仍会校验邮箱格式合法(`Base::isEmail`) + +## 不支持 + +- 不支持手机号登录改邮箱二合一流程;邮箱是唯一登录凭证 +- 不支持邮箱别名 / 多邮箱 diff --git a/resources/ai-kb/zh/howto/user-settings/language.md b/resources/ai-kb/zh/howto/user-settings/language.md new file mode 100644 index 000000000..5416cb30e --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/language.md @@ -0,0 +1,62 @@ +--- +id: user-settings.language.howto +title: 切换界面语言 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 改语言 + - 换语言 + - 切换中文 + - 切换英文 + - 改成繁体 + - 怎么变英文 + - language switch +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 语言切换只影响当前账号,不会改其他成员 + - 不影响其他用户给你发的消息(消息不会自动翻译,要单独用「消息翻译」功能) + - 某些插件 / 微应用可能未提供完整翻译,会回退到中文 / 英文 +last_verified: v1.7.90 +--- + +# 切换界面语言 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「语言设置」 +- 移动端:「我的」→「设置」→「语言设置」 +- 后端接口:`POST api/users/editdata`(`lang` 字段) + +## 支持的语言 + +由 `resources/assets/js/language/` 下文件清单决定,常见: + +- 简体中文(zh) +- 繁体中文(zh-CHT) +- English(en) +- 其他按部署版本提供(如日语 / 韩语 / 越南语等) + +实际列表在「选择语言」下拉中展示,由 `languageList` 统一控制。 + +## 操作步骤 + +1. 进入「语言设置」子页 +2. 在「选择语言」下拉选目标语言 +3. 点击「提交」后立即热切换,无需刷新;浏览器 localStorage 会缓存为 `__system:languageName__` +4. 服务端同步保存 `users.lang` 字段,登录其他终端时按此自动恢复 + +## 影响范围 + +- 所有 `$L("...")` 包裹的界面文字 +- 系统通知 / 邮件标题中带 `language` 参数的部分 +- AI 助手回答会取当前语言作为弱提示词 + +## 不影响 + +- 已发出的聊天消息(消息内容不会自动翻译) +- 其他用户看到你的昵称 / 资料(按对方语言显示) +- 文件名 / 任务名 / 评论原文 diff --git a/resources/ai-kb/zh/howto/user-settings/notification.md b/resources/ai-kb/zh/howto/user-settings/notification.md new file mode 100644 index 000000000..cab114874 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/notification.md @@ -0,0 +1,56 @@ +--- +id: user-settings.notification.howto +title: 个人通知开关 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 关通知 + - 静音 + - 不想收消息提醒 + - 关闭桌面通知 + - 关闭邮件通知 + - 通知偏好 + - 不要弹窗 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - DooTask 没有单一「通知偏好」设置页;各通道的开关分散在不同位置 + - 邮件通知的全局开关由系统管理员控制,普通用户只能关单条 + - 不支持「按时间段免打扰」全局规则(仅会话级置顶/免打扰) +last_verified: v1.7.90 +--- + +# 个人通知开关 + +DooTask 的通知分多个通道,没有集中的「通知偏好」设置页,按通道分散管理。普通用户能调的开关如下。 + +## 桌面通知(浏览器 / Electron) + +- 入口:浏览器右上角站点权限 → 允许 / 屏蔽通知;Electron 在系统通知中心管理 +- DooTask 检测到无权限时会弹一次「是否允许通知」请求,被拒后不再弹 +- 通知只在「消息」未读、@提及、任务到期等触发,沉默会话不发桌面通知 + +## 移动端推送(iOS / Android) + +- 入口:手机系统设置 → DooTask → 通知;APP 内只跟随系统权限 +- 注册推送通过 UMENG 渠道,APP 启动时自动注册 device-token +- 关掉手机系统通知后,APP 内只剩前台徽标,没有推送 + +## 会话级免打扰 / 静音 + +- 单聊 / 群聊 → 会话右上角设置 →「消息免打扰」开关 +- 免打扰只屏蔽通知声音 / 桌面弹窗,不影响未读数与角标 + +## 邮件通知 + +- 系统管理员配置(系统设置 → 邮件设置)开关「邮件通知」总闸 +- 用户层面无单独总开关;要按事件(如任务分配 / 评论)选择性退订需联系管理员配置规则 + +## 不支持 + +- 不支持「每日只在 9-18 点推送」时间窗口 +- 不支持「按项目维度静音」(要逐个项目讨论组设静音) +- 不支持自定义提示音 diff --git a/resources/ai-kb/zh/howto/user-settings/password.md b/resources/ai-kb/zh/howto/user-settings/password.md new file mode 100644 index 000000000..872324b67 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/password.md @@ -0,0 +1,61 @@ +--- +id: user-settings.password.howto +title: 修改密码 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 改密码 + - 修改登录密码 + - 怎么换密码 + - 密码设置 + - 重设密码 +related_tools: [] +related_pages: [setting] +prerequisites: + - 需要知道当前旧密码(忘记请走找回密码流程) +negative: + - 修改密码不支持只改新密码不输旧密码(除非走找回密码邮件流程) + - 新旧密码不能相同 + - LDAP 用户改密码会同步回 LDAP;如 LDAP 服务异常会改失败 + - 体验账号 / 演示账号(`checkSystem`)禁止修改密码 +last_verified: v1.7.90 +--- + +# 修改密码 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「密码设置」 +- 移动端:「我的」→「设置」→「密码设置」 +- 后端接口:`POST api/users/editpass` + +## 操作步骤 + +1. 输入「旧密码」「新密码」「确认新密码」 +2. 三栏校验通过后点击「提交」 +3. 提示「修改成功」即生效,token 会刷新 + +## 密码策略 + +后端 `User::passwordPolicy` 强制校验,常见规则: + +- 至少 6 位 +- 不能与旧密码相同 +- 部分合规版本还要求大小写 / 数字 / 符号组合(看系统设置) + +不满足策略时弹「密码强度不够」「请填写正确的旧密码」等错误。 + +## 强制修改场景 + +- 首次登录管理员预设密码:登录后会弹「请先修改登录密码」(`changepass=1`),不改完无法进入主功能 +- 密码到期 / 系统强制刷新:同样会强制走本流程 + +## 找不回旧密码 + +走登录页「忘记密码」邮件验证码重置,不走本流程。详细见账号模块。 + +## 相关 + +- 注销 / 设备管理在「登录设备」「删除帐号」子页,与密码无关 diff --git a/resources/ai-kb/zh/howto/user-settings/profile.md b/resources/ai-kb/zh/howto/user-settings/profile.md new file mode 100644 index 000000000..b713b1ba7 --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/profile.md @@ -0,0 +1,62 @@ +--- +id: user-settings.profile.howto +title: 修改个人资料 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 改昵称 + - 换头像 + - 改职位 + - 改电话 + - 改生日 + - 改个人简介 + - 怎么改名字 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 邮箱在「个人设置」中只读,修改需走「修改邮箱」子页 + - 部门信息只读,不可自助修改,需联系系统管理员调整 + - LDAP 用户的昵称 / 头像 / 电话改动会同步回 LDAP,但 LDAP 拒收时本地也不会保存 +last_verified: v1.7.90 +--- + +# 修改个人资料 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「个人设置」 +- 移动端:底部「我的」→「设置」→「个人设置」 +- 后端接口:`POST api/users/editdata` + +## 可改字段与约束 + +| 字段 | 约束 | +|---|---| +| 头像 | 图片上传,建议 200x200;含 `/avatar/` 路径会被视为默认头像清空 | +| 电话 | 6-20 字符;不可与其他用户重复 | +| 昵称 | 2-20 字符;改动后会同步重算首字母 / 拼音用于搜索排序 | +| 职位 / 职称 | 2-20 字符(也可清空) | +| 生日 | 日期格式 YYYY-MM-DD,可清空 | +| 地址 | ≤ 100 字符 | +| 个人简介 | ≤ 500 字符 | +| 个性标签 | 单独管理,见 [[user-settings.tags.howto]] | + +## 操作步骤 + +1. 进入「个人设置」子页 +2. 修改需要改的字段(其他字段留空表示不变) +3. 点击底部「提交」;显示「修改成功」后字段全局生效 +4. 头像 / 昵称改动会在下次刷新或对方接收消息时显示 + +## 部门 / 邮箱 + +- 部门信息只读显示(含部门负责人身份);要换部门联系管理员 +- 邮箱修改入口在「修改邮箱」子页:[[user-settings.email.howto]] + +## 不支持 + +- 不支持批量修改其他成员资料(管理员请去「团队管理」) +- 昵称 < 2 字会被后端拒绝,提示「昵称不可以少于2个字」 diff --git a/resources/ai-kb/zh/howto/user-settings/tags.md b/resources/ai-kb/zh/howto/user-settings/tags.md new file mode 100644 index 000000000..50ac4fdad --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/tags.md @@ -0,0 +1,61 @@ +--- +id: user-settings.tags.howto +title: 管理个性标签 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 个性标签 + - 加个性标签 + - 给自己打标签 + - 删除标签 + - 个人标签 + - 怎么改标签 + - 认可标签 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 个性标签是「贴在用户身上」的标签,与「任务标签」「项目标签」不互通 + - 每位用户最多 100 个标签;单个标签 ≤ 20 字符 + - 已存在的同名标签会拒绝重复添加(提示「标签已存在」) + - 自己只能改 / 删自己创建的标签;他人给你打的标签需对方或管理员处理 +last_verified: v1.7.90 +--- + +# 管理个性标签 + +「个性标签」是其他成员或自己贴在你账号上的简短描述(如「Vue 大佬」「沟通能力强」),出现在「个人资料」名片中,用于团队互评 / 互相认识。 + +## 入口 + +- 桌面端:「设置」→「个人设置」→ 个性标签栏 → 点「管理」按钮 +- 移动端:同上 +- 后端接口: + - 列表:`GET api/users/tags/lists` + - 新增:`POST api/users/tags/add` + - 修改:`POST api/users/tags/update` + - 删除:`POST api/users/tags/delete` + - 认可 / 取消认可:`POST api/users/tags/recognize` + +## 操作步骤 + +1. 进入「个人设置」,看到「个性标签」预览(前 10 条 + 总数) +2. 点「管理」打开标签弹窗 +3. 新增:输入名称(1-20 字符)→ 回车 / 确定 +4. 修改:点已有标签 → 编辑模式 → 保存 +5. 删除:标签上 × 按钮 +6. 认可他人标签:在对方资料里点标签即给 `+1`,再次点击取消 + +## 权限规则 + +- 自己页内:可建 / 改 / 删自己的标签 +- 看别人页:默认只能「认可」,不能直接改对方标签 +- 「认可数」展示在标签右上角,越多越靠前 + +## 不支持 + +- 不支持给标签设颜色 / 图标 +- 不支持私密标签(所有人可见) +- 不支持把多个用户的标签合并 / 统一管理 diff --git a/resources/ai-kb/zh/howto/user-settings/theme.md b/resources/ai-kb/zh/howto/user-settings/theme.md new file mode 100644 index 000000000..e99281f0d --- /dev/null +++ b/resources/ai-kb/zh/howto/user-settings/theme.md @@ -0,0 +1,63 @@ +--- +id: user-settings.theme.howto +title: 切换深色/浅色主题 +type: howto +feature: user-settings +scope: end-user +locale: zh +aliases: + - 改主题 + - 深色模式 + - 暗黑模式 + - dark mode + - 跟随系统 + - 切换主题 + - 浅色模式 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 浏览器 Web 端仅 Chrome 系(含 Edge)才支持深色切换;Safari / Firefox 老版本无效 + - iOS EEUI 端不支持手动切换主题(按系统设置走,提示「仅 Android 设置支持主题功能」) + - 「跟随系统」依赖系统 / 浏览器 `prefers-color-scheme`,浏览器不支持时退化为浅色 +last_verified: v1.7.90 +--- + +# 切换深色/浅色主题 + +## 入口 + +- 桌面端:右上角头像 →「设置」→「主题设置」 +- 移动端(Android EEUI):「我的」→「设置」→「主题设置」 +- 客户端:Electron 通过 IPC 同步主题,浏览器通过 localStorage 缓存 + +## 三种模式 + +| 模式 | 含义 | +|---|---| +| auto / 跟随系统 | 根据系统或浏览器 `prefers-color-scheme` 自动切换 | +| light / 浅色 | 强制浅色主题 | +| dark / 深色 | 强制深色主题 | + +state 中存为 `themeConf`(用户选择)+ `themeName`(实际生效)。 + +## 操作步骤 + +1. 进入「主题设置」子页 +2. 在「选择主题」下拉选 `auto` / `light` / `dark` +3. 点击「提交」后立即切换;缓存到 localStorage `__system:themeConf__` +4. Electron 客户端会 IPC 通知 preload 池重建,确保新窗口主题一致 + +## 不支持的环境 + +- Safari / 旧版 Firefox:无 `prefers-color-scheme` 或不响应主题切换,会弹「仅客户端或 Chrome 浏览器支持主题功能」 +- iOS EEUI:不支持手动选主题,提示「仅 Android 设置支持主题功能」 +- 部分插件 / 微应用未做深色样式适配,会显示与主站不一致的颜色 + +## 与高亮 / 颜色字段的关系 + +主题只影响界面整体配色,不会改: + +- 任务卡片颜色(见 [[task.field.color.concept]] 之类的字段) +- 看板列颜色 +- 用户自定义头像 / 头像背景 diff --git a/resources/ai-kb/zh/howto/view/filter.md b/resources/ai-kb/zh/howto/view/filter.md new file mode 100644 index 000000000..58cf6ec0c --- /dev/null +++ b/resources/ai-kb/zh/howto/view/filter.md @@ -0,0 +1,59 @@ +--- +id: view.filter.howto +title: 视图筛选条件 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 任务筛选 + - 按负责人筛选 + - 只看我的任务 + - 按标签筛选 + - 怎么过滤任务 + - 项目筛选条件 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 筛选条件不持久化(刷新或换项目会重置为「全部」) + - 一次只能选一个筛选条件(不支持「负责人 A + 标签 B」组合) + - 移动端的筛选 Cascader 与桌面端共用,但下拉空间有限 + - 没有「保存常用筛选」功能 +last_verified: v1.7.90 +--- + +# 视图筛选条件 + +## 入口 +- 桌面端 Web:项目详情页顶部,视图切换条左侧的 Cascader(默认显示「全部 (n)」) +- 移动端:项目详情页顶部同位置 + +## 可用筛选维度 +- **全部**:不筛选 +- **未计划**:start_at 为空且未完成 +- **工作流状态**:选某个工作流的某个具体状态(flow_item_id 命中) +- **标签**:选某个项目标签(前缀 `tag:` 内部标识) +- **负责人**:选项目内某个成员(前缀 `user:`,显示其在该项目的任务数) + +筛选项含人数计数(如「张三 (5)」表示张三作为负责人有 5 个任务)。 + +## 与"显示已完成"的关系 +- 顶部「显示已完成」复选框控制是否展示 complete_at 非空的任务 +- 当选工作流的「结束色」状态(end)时,「显示已完成」会被自动勾上 +- 在不显示已完成的情况下,负责人筛选只统计未完成任务 + +## 与"搜索"的关系 +- 顶部还有搜索输入框,按任务名 / 描述 / ID 模糊匹配 +- 搜索与 Cascader 筛选会叠加(先按 Cascader 过滤,再按搜索词二次过滤) + +## 应用范围 +- 看板视图:每列只显示命中任务(列本身仍全部展示,空列也保留) +- 列表视图:每个分段都按筛选过滤 +- 甘特图:未命中的任务隐藏 + +## 不支持 +- 不支持多条件组合筛选(如「负责人=A AND 标签=B」) +- 不支持保存自定义筛选 / 我的筛选 +- 不支持按截止时间区间筛选 +- 不支持按创建时间筛选 diff --git a/resources/ai-kb/zh/howto/view/flow.md b/resources/ai-kb/zh/howto/view/flow.md new file mode 100644 index 000000000..ac2241a1a --- /dev/null +++ b/resources/ai-kb/zh/howto/view/flow.md @@ -0,0 +1,58 @@ +--- +id: view.flow.howto +title: 按工作流状态分栏查看任务 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 工作流视图 + - 按状态看任务 + - 评审中的任务 + - 按 flow 分栏 + - 工作流筛选 + - 任务流程视图 +related_tools: [list_tasks, get_project] +related_pages: [project_detail] +prerequisites: + - 项目已配置工作流(至少一条 flow) +negative: + - 工作流视图不是独立视图按钮,是通过顶部「工作流」Cascader 在看板视图上叠加的筛选 + - 一个项目可以有多条工作流,但筛选 Cascader 一次只能选一个工作流的某个状态 + - 项目未配置工作流时筛选下拉只显示「全部」与「未计划」 + - 工作流状态(flow_item)不等于看板列(column),两者独立 +last_verified: v1.7.90 +--- + +# 按工作流状态分栏查看任务 + +## 入口 +- 桌面端 Web:项目详情页顶部「工作流」Cascader(默认显示「全部 (n)」) +- 点开下拉 → 选某个工作流的某个状态(如「评审 → 评审中」) + +## 操作步骤 +1. 确保项目已配置工作流(项目设置 → 工作流设置;详见 [[project.flow.howto.create]]) +2. 在顶部「工作流」Cascader 中选择目标状态 +3. 当前视图(看板 / 列表 / 甘特图)立即过滤,只展示 flow_item_id 命中的任务 +4. 选择「全部」回到无筛选状态 + +## 可选筛选维度 +工作流 Cascader 下拉里除了工作流状态,还混合了: + +- **全部 (n)**:取消筛选,显示所有任务 +- **未计划 (n)**:start_at 为空且未完成的任务 +- **某工作流的某状态**:按 `flow_item_id` 过滤 +- **某标签**:按任务标签筛选(`tag:xxx`) +- **某负责人**:按 owner 过滤(`user:userid`) + +## 状态着色 +工作流状态有三档着色(status 字段): + +- `start`(起步色):常用作「待办」「待评审」 +- 中间状态:自定义颜色 +- `end`(结束色):常用作「已完成」「已通过」;选这种状态时若未开启「显示已完成」会自动打开 + +## 不支持 +- 不支持同时选择多个状态进行联合筛选 +- 不支持跨工作流的状态合并 +- 不支持把工作流分栏当成视图独立保存(每次进入仍是 column / table / gantt 视图) diff --git a/resources/ai-kb/zh/howto/view/gantt.md b/resources/ai-kb/zh/howto/view/gantt.md new file mode 100644 index 000000000..db8473550 --- /dev/null +++ b/resources/ai-kb/zh/howto/view/gantt.md @@ -0,0 +1,58 @@ +--- +id: view.gantt.howto +title: 使用甘特图视图 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 甘特图 + - 时间轴视图 + - 项目排期 + - 看任务时间线 + - gantt 视图 + - 任务计划图 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 没有 start_at 或 end_at 的任务在甘特图中不显示(需要先设置时间段) + - 子任务在甘特图中独立显示,不会自动归并到父任务 + - 不支持任务依赖关系(A 完成才能开始 B 这种) + - 移动端 / 触屏端不支持拖拽改时间,只能查看 +last_verified: v1.7.90 +--- + +# 使用甘特图视图 + +## 入口 +- 桌面端 Web:项目详情页 → 右上角视图切换条 → 选第三个图标(时间轴) +- 视图记忆在 `cacheParameter.menuType='gantt'` + +## 视图能力 +甘特图(基于 GSTC 库)以横向时间轴展示项目任务,每条任务一行,矩形从 `start_at` 跨到 `end_at`。 + +- 矩形颜色 = 任务颜色 / 工作流状态颜色 +- 鼠标悬停显示任务名 + 时间段 + 负责人 +- 点击任务条 → 打开任务详情 + +## 操作能力 +- **改时间段**:抓矩形两端拖动 → 改 start_at 或 end_at(仅桌面端) +- **整段移动**:抓矩形中间拖动 → 同步平移 start_at 与 end_at +- **横向滚动**:滚轮 / 拖动时间轴 +- **缩放**:顶部按钮切换日 / 周 / 月粒度 + +## 与筛选的联动 +顶部 Cascader 筛选条件(按工作流状态 / 负责人 / 标签)在甘特图同样生效,未命中的任务隐藏。 + +## 不显示的任务 +- 没有 start_at 的任务(未排期) +- 没有 end_at 的任务(开放截止) +- 这些任务在「未计划」筛选项里可单独查看 + +## 不支持 +- 不支持任务依赖(前置任务关系) +- 不支持关键路径计算 +- 不支持资源直方图(按人负载) +- 不支持导出 PNG / PDF +- 不支持子任务的层级缩进展示(子任务平铺一行) diff --git a/resources/ai-kb/zh/howto/view/kanban-add-column.md b/resources/ai-kb/zh/howto/view/kanban-add-column.md new file mode 100644 index 000000000..fb0293310 --- /dev/null +++ b/resources/ai-kb/zh/howto/view/kanban-add-column.md @@ -0,0 +1,46 @@ +--- +id: view.kanban.howto.add-column +title: 看板新增列 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 看板加一列 + - 新建看板列 + - 增加任务列 + - 怎么加状态列 + - 看板增加分组 +related_tools: [] +related_pages: [project_detail] +prerequisites: + - 当前用户是项目成员,且角色具备编辑列的权限(通常是负责人或管理员) +negative: + - 普通成员(仅参与任务)通常无权改列,提示无权限请联系项目负责人 + - 项目处于已归档状态时不能改列 +last_verified: v1.7.90 +--- + +# 看板新增列 + +## 是什么 +看板视图里的「列」对应任务的一个状态/阶段(如「待办」「进行中」「已完成」),列从左到右一般代表任务流转方向。 + +## 入口 +- 桌面端:进入项目详情页 → 切换到「看板」视图 → 滚到最右侧,有「+ 新增列」占位 +- 移动端:看板视图右下角的「+」按钮 + +## 操作步骤 +1. 点击「+ 新增列」 +2. 输入列名(如「测试中」),不超过 50 字符 +3. 回车或点确认保存 +4. 列默认插到最右侧,可拖拽调整顺序 + +## 字段说明 +- 列名:可重复但不建议 +- 颜色 / 限额:在列设置菜单(列标题右侧的「···」)里配置 + +## 相关 +- 改列名:列标题右侧「···」→ 重命名 +- 删列:列标题「···」→ 删除。**注意:删列会级联软删该列下所有任务**(可从回收站恢复),删前先把任务拖到其他列,详见 [[project.column.howto.remove]] +- 工作流:列与工作流状态可绑定(工作流详细 chunk 后续起草) diff --git a/resources/ai-kb/zh/howto/view/kanban-column-color.md b/resources/ai-kb/zh/howto/view/kanban-column-color.md new file mode 100644 index 000000000..4315b6b98 --- /dev/null +++ b/resources/ai-kb/zh/howto/view/kanban-column-color.md @@ -0,0 +1,54 @@ +--- +id: view.kanban.howto.column-color +title: 看板列设置颜色 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 看板列改颜色 + - 列头颜色 + - 怎么给列标记颜色 + - 任务列上色 + - 看板分栏颜色 +related_tools: [get_project] +related_pages: [project_detail] +prerequisites: + - 当前用户对项目有列编辑权限(负责人或管理员) +negative: + - 颜色只能从预设色板选,不能自定义十六进制 + - 颜色仅影响看板视图的列头底色,不影响列表 / 甘特图 + - 部门只读模式下颜色按钮不显示 + - 没有「无颜色」单独按钮,需点击当前已选色取消 +last_verified: v1.7.90 +--- + +# 看板列设置颜色 + +## 入口 +- 桌面端 Web:进入项目详情页 → 看板视图 → 列标题右侧「···」图标 +- 移动端:列标题区域长按 → 弹出菜单(受写权限保护) + +## 操作步骤 +1. 点列头「···」弹出下拉 +2. 下拉底部有项目预设色板(每色一条 Item,色块在左、色名在右) +3. 点击某色 → 列头背景立即更新,所有看到该项目的人通过 WebSocket 同步 +4. 想取消颜色:再次点击当前已选的色(不是另选「默认」) + +## 颜色作用范围 +- 仅影响看板视图(menuType='column')的列头底色 +- 列表视图、甘特图不展示列颜色(任务卡颜色另算) +- 当列头有自定义颜色时,CSS 类切换为 `custom-color` + +## 颜色与"工作流状态颜色" +- 列颜色:列层面的视觉标记,与任务无关 +- 工作流状态颜色:单个任务的 flow_item 标签底色,影响每张任务卡的小标签 + +## 预设色板 +颜色清单由 `$store.state.columnColorList` 提供,全系统统一(如蓝 / 绿 / 黄 / 红 / 灰几种)。 + +## 不支持 +- 自定义十六进制颜色(只能选预设) +- 不支持单列设置渐变色 +- 不支持颜色按规则自动变化(如已完成列变绿) +- 不支持把列颜色批量应用到其他项目 diff --git a/resources/ai-kb/zh/howto/view/list.md b/resources/ai-kb/zh/howto/view/list.md new file mode 100644 index 000000000..59a60a7eb --- /dev/null +++ b/resources/ai-kb/zh/howto/view/list.md @@ -0,0 +1,60 @@ +--- +id: view.list.howto +title: 使用列表视图查看任务 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 列表视图 + - 任务表格 + - 怎么用表格看任务 + - 表格视图 + - 按行看任务 + - table 视图 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 列表视图列结构固定(任务名 / 列表 / 优先级 / 负责人 / 到期时间),不能自定义增删列 + - 不支持双击编辑(点击任务行打开任务详情) + - 没有 Excel 式选区批量操作 + - 行内排序仅 优先级 / 到期时间 两列可点 +last_verified: v1.7.90 +--- + +# 使用列表视图查看任务 + +## 入口 +- 桌面端 Web:进入项目详情页 → 右上角视图切换条 → 选第二个图标(「表格」) +- 视图切换记忆在 `cacheParameter.menuType='table'`,下次进入同一项目仍是列表视图 + +## 列表分段 +切到列表视图后,任务自动按归属分成 4 段: + +1. **我的任务**:当前用户是负责人的任务 +2. **协助的任务**:当前用户是协助者的任务(仅当存在时显示) +3. **未完成任务**:项目内其他未完成任务 +4. **已完成任务**:项目内已完成任务(仅当 task_num > 0 时显示) + +每段标题旁有箭头可折叠 / 展开,状态记忆在 `cacheParameter.showMy / showHelp / showUndone / showCompleted`。 + +## 列结构 +列表视图列固定为: + +- 任务名称(含 # 编号) +- 列表(任务所在 column) +- 优先级(可点击表头排序) +- 负责人 +- 到期时间(可点击表头排序) + +## 行内操作 +- 点击任务行 → 打开任务详情 +- 行右侧「+」 → 在该段下快速添加任务 +- 行右侧「···」 → 单行任务操作菜单 + +## 不支持 +- 不能自定义列(增删 / 改顺序 / 改宽度) +- 不能多选批量改字段(如批量改负责人) +- 表头排序只对优先级 / 到期时间生效 +- 没有筛选器(用顶部 Cascader 筛选) diff --git a/resources/ai-kb/zh/howto/view/sort.md b/resources/ai-kb/zh/howto/view/sort.md new file mode 100644 index 000000000..9e028a29a --- /dev/null +++ b/resources/ai-kb/zh/howto/view/sort.md @@ -0,0 +1,53 @@ +--- +id: view.sort.howto +title: 列表视图排序 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 任务怎么排序 + - 按到期时间排序 + - 按优先级排 + - 列表排序 + - 任务先后顺序 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 只有列表视图(table)的优先级 / 到期时间两列可点击排序 + - 看板视图没有列内排序按钮,只能拖拽(拖拽顺序持久化到 sort 字段) + - 甘特图按 start_at 排序,不可改 + - 排序仅在当前段内生效(我的 / 协助 / 未完成 / 已完成 各自排) +last_verified: v1.7.90 +--- + +# 列表视图排序 + +## 入口 +- 桌面端 Web:项目详情页 → 切到列表视图(table)→ 表头「优先级」或「到期时间」可点 + +## 操作步骤 +1. 切换到列表视图 +2. 点击表头「优先级」字段:第一次升序、第二次降序、第三次清除排序 +3. 同样适用于「到期时间」表头 +4. 排序状态记忆在 `sortField` / `sortType`,刷新页面后保留 + +## 默认顺序 +- 未设置排序时:按任务 sort 字段升序(即手动拖拽顺序) +- 手动拖动看板任务卡:把目标位置的 sort 值更新,下次按 sort 排 + +## 各视图的排序策略 +- **看板视图**:列内按 sort 字段;拖拽即写新值 +- **列表视图**:默认按 sort;点表头切到字段排序后覆盖默认 +- **甘特图**:始终按 start_at 升序 +- **每段排序独立**:列表视图的「我的 / 协助 / 未完成 / 已完成」四段独立,每段都用相同字段排 + +## 跨字段排序 +当前不支持多字段排序(如「先按优先级再按时间」),表头点击是单字段排序。 + +## 不支持 +- 看板视图按字段排序(只能拖拽) +- 不支持按负责人 / 标签 / 任务名排序 +- 不支持多字段联合排序 +- 不支持列表视图的「列表」「负责人」字段点击排序 diff --git a/resources/ai-kb/zh/howto/view/switch.md b/resources/ai-kb/zh/howto/view/switch.md new file mode 100644 index 000000000..176ddbd9c --- /dev/null +++ b/resources/ai-kb/zh/howto/view/switch.md @@ -0,0 +1,58 @@ +--- +id: view.switch.howto +title: 切换看板 / 列表 / 甘特图视图 +type: howto +feature: view +scope: end-user +locale: zh +aliases: + - 怎么切换视图 + - 换种方式看任务 + - 看板换列表 + - 切到甘特图 + - 视图按钮在哪 +related_tools: [list_tasks] +related_pages: [project_detail] +prerequisites: [] +negative: + - 视图选择按项目持久化(cacheParameter.menuType),换项目不会自动跟随 + - 没有快捷键切换视图 + - 移动端视图切换按钮位置与桌面一致,但小屏更靠右 + - 工作流视图不是这里切换,是通过工作流筛选 Cascader 叠加 +last_verified: v1.7.90 +--- + +# 切换看板 / 列表 / 甘特图视图 + +## 入口 +- 桌面端 Web:项目详情页右上角,3 个图标排成一行的切换条 +- 移动端:项目详情页顶部同位置(图标更小) + +## 三个切换按钮 +从左到右依次: + +1. **看板**(图标:方块阵列)→ `menuType='column'`,默认视图 +2. **列表**(图标:横线列表)→ `menuType='table'` +3. **甘特图**(图标:时间轴)→ `menuType='gantt'` + +切换器底部有一条滑块(slider)会跟随高亮,所选视图按钮变色。 + +## 操作步骤 +1. 进入项目详情页 +2. 点切换条上对应图标 +3. 数据立即按新视图重排,切换过程不重新请求数据(已在前端) +4. 选择记录在 `cacheParameter.menuType`,下次进入该项目仍是此视图 + +## 持久化 +- 视图状态按 `项目 ID × 当前用户` 维度记录 +- 不跨设备同步(本地缓存) +- 默认值为 `column`(看板) + +## 与"全部项目页" +- 项目列表页(all 项目)有自己的视图(项目卡片 / 项目列表),与单项目的视图无关 + +## 不支持 +- 视图切换没有键盘快捷键 +- 不能强制所有项目用同一视图 +- 不能新增第 5 种自定义视图 +- 部门只读模式下视图仍可切换(只是不能编辑任务) diff --git a/resources/ai-kb/zh/menu-map/.gitkeep b/resources/ai-kb/zh/menu-map/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/menu-map/abuse-report/entry.md b/resources/ai-kb/zh/menu-map/abuse-report/entry.md new file mode 100644 index 000000000..d81ab1a85 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/abuse-report/entry.md @@ -0,0 +1,50 @@ +--- +id: abuse-report.entry.menu-map +title: 举报管理入口在哪 +type: menu-map +feature: abuse-report +scope: admin +locale: zh +aliases: + - 举报管理在哪 + - 投诉管理入口 + - 怎么找到举报后台 + - 用户举报哪里看 + - complaint 入口 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(普通成员看不到) +negative: + - 普通成员只看得到「举报」提交入口,看不到管理后台 + - 移动端同样在「应用 → 管理员」分组下 +last_verified: v1.7.90 +--- + +# 举报管理入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 顶部分组「管理员」→「举报管理」卡片 +- 移动端:底部 Tabbar「应用」→ 同样在「管理员」分组 +- 快捷键:无 + +## 权限要求 +卡片在 `pages/manage/application.vue` 中声明为 `{type: 'admin', value: 'complaint', show: this.userIsAdmin}`。 +- 必须是系统管理员(identity 含 `admin`) +- 后端 `api/complaint/lists` 和 `api/complaint/action` 也会用 `User::auth('admin')` 二次校验 +- 超级管理员(id=1)自然有权限 + +## 找不到怎么办 +- 个人头像下拉菜单顶部如果没有显示「系统管理员」徽标,说明账号无权限 +- 联系超级管理员到「团队管理」把账号 identity 加上 `admin` +- 刷新页面后「举报管理」会出现在「管理员」分组 + +## 用户侧举报入口 +普通成员举报路径不在「应用」菜单里,而是在群聊 / 个人对话内: +- 桌面端:对话窗口右上角「···」→「举报对话」 +- 移动端:对话窗口右上角「···」→「举报对话」 +- 走 `POST api/complaint/submit`,需要选举报类型、填原因、可传图 + +## 相关 +- 处理流程:[[abuse-report.handle.howto]] +- 概念:[[abuse-report.concept]] diff --git a/resources/ai-kb/zh/menu-map/application/entry.md b/resources/ai-kb/zh/menu-map/application/entry.md new file mode 100644 index 000000000..d8ad1287d --- /dev/null +++ b/resources/ai-kb/zh/menu-map/application/entry.md @@ -0,0 +1,39 @@ +--- +id: application.entry.menu-map +title: 应用中心入口在哪 +type: menu-map +feature: application +scope: end-user +locale: zh +aliases: + - 应用中心在哪 + - 怎么打开应用 + - 应用列表入口 + - 应用图标在哪 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 应用中心不等于应用市场(AppStore),后者只有管理员能进 +last_verified: v1.7.90 +--- + +# 应用中心入口在哪 + +## 路径 +- 桌面端:左侧主导航栏的「应用」图标(位于仪表盘 / 日历 / 消息 / 文件之后) +- 移动端竖屏:底部 Tabbar 「应用」(与日历、文件、设置一并被收纳进应用中心) +- 快捷键:无 + +## 页面内构成 +- 顶部右上角「⋯」菜单:调整排序、自定义应用菜单(仅管理员) +- 「常用」分区:所有用户可见的系统应用 + 微应用 +- 「管理员」分区:仅 `userIsAdmin` 可见的管理员应用 + +## 权限要求 +- end-user 可见「常用」区 +- admin 才能看到「管理员」区及「自定义应用菜单」按钮 + +## 相关 +- 应用中心的整体定义:[[application.center.concept]] +- 三类应用怎么区分:[[application.classify.concept]] diff --git a/resources/ai-kb/zh/menu-map/approve/entry.md b/resources/ai-kb/zh/menu-map/approve/entry.md new file mode 100644 index 000000000..d51c9d34f --- /dev/null +++ b/resources/ai-kb/zh/menu-map/approve/entry.md @@ -0,0 +1,46 @@ +--- +id: approve.entry.menu-map +title: 审批中心入口在哪 +type: menu-map +feature: approve +scope: end-user +locale: zh +aliases: + - 审批在哪 + - 怎么进审批 + - 审批中心入口 + - 走流程在哪 + - 找不到审批 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 管理员已配置至少一个审批流程模板 +negative: + - 未安装 approve 插件时左侧应用中心看不到「审批」卡片 + - 没有可用流程模板时进入页面会提示「暂无数据」,发起按钮无效 +last_verified: v1.7.90 +--- + +# 审批中心入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 卡片「审批」 +- 移动端:底部 Tabbar「应用」→ 列表「审批」 +- 快捷键:无 + +## 页面结构 +进入后顶部是 4 个 Tab,按用户视角分组: +- **待办**:分配给我、需要我点同意/拒绝的审批,Tab 名后会带未读数量(如「待办(3)」) +- **已办**:我曾经处理过(同意/拒绝/撤销)的审批 +- **抄送我**:流程节点把我设为抄送人的审批 +- **已发起**:我自己提交的审批,含审批中/通过/拒绝/撤回各状态 + +## 权限要求 +- end-user 任何登录用户均可见入口和这 4 个 Tab +- admin 会额外看到「流程设置」按钮(在页面右上角);管理员的流程模板配置不在本 chunk 范围 + +## 相关 +- 简介与一图速览:[[app-system.approve.howto]] +- 是什么:[[approve.concept]] +- 怎么发起:[[approve.start.howto]] diff --git a/resources/ai-kb/zh/menu-map/apps/.gitkeep b/resources/ai-kb/zh/menu-map/apps/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/menu-map/apps/admin-apps/entry.md b/resources/ai-kb/zh/menu-map/apps/admin-apps/entry.md new file mode 100644 index 000000000..492433b2a --- /dev/null +++ b/resources/ai-kb/zh/menu-map/apps/admin-apps/entry.md @@ -0,0 +1,48 @@ +--- +id: app-admin.entry.menu-map +title: 管理员应用入口在哪 +type: menu-map +feature: app-admin +scope: admin +locale: zh +aliases: + - 管理员应用怎么打开 + - LDAP 在哪 + - 邮件通知入口 + - 团队管理入口 + - 举报管理入口 + - 数据导出入口 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 不在「系统设置」页面里,而是在「应用」中心 + - 普通成员路径不存在该入口 +last_verified: v1.7.90 +--- + +# 管理员应用入口在哪 + +## 路径 +- 桌面端:左侧主导航「应用」→ 页面下方「管理员」分区 +- 移动端竖屏:底部 Tabbar「应用」→ 滚动到「管理员」分区 +- 快捷键:无 + +## 「管理员」分区在哪 +- 应用中心页面分两行:上方「常用」+ 下方「管理员」 +- 当前管理员账号没有任何卡片可见时(极少见),分区标题也不显示 +- 排序模式下可拖动调整顺序(保存后仅自己生效) + +## 各卡片打开方式 +点击卡片直接弹出右侧抽屉,不跳页面: +- 「LDAP」→ LDAP 设置抽屉(700 宽) +- 「邮件通知」→ 邮件设置抽屉 +- 「APP 推送」→ UMENG 推送抽屉 +- 「举报管理」→ 举报记录抽屉 +- 「数据导出」→ 下拉菜单选导出类型(任务/超期/审批/签到) +- 「团队管理」→ 跳转到团队管理页 + +## 权限要求 +- admin 才能看到「管理员」分区 +- 详见 [[app-admin.visibility.concept]] diff --git a/resources/ai-kb/zh/menu-map/apps/system-apps/entry.md b/resources/ai-kb/zh/menu-map/apps/system-apps/entry.md new file mode 100644 index 000000000..f995bad0f --- /dev/null +++ b/resources/ai-kb/zh/menu-map/apps/system-apps/entry.md @@ -0,0 +1,42 @@ +--- +id: app-system.entry.menu-map +title: 系统应用入口路径 +type: menu-map +feature: app-system +scope: end-user +locale: zh +aliases: + - 系统应用在哪 + - 内置应用入口 + - 怎么找到审批/签到/会议 + - 应用怎么进 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 系统应用没有独立的左侧栏入口,必须先进应用中心 + - 不同终端没有快捷键直达单个系统应用 +last_verified: v1.7.90 +--- + +# 系统应用入口路径 + +## 路径 +所有 11 个内置系统应用都收纳在应用中心,没有自己的一级导航位。 + +- 桌面端:左侧主导航「应用」→ 常用区找到对应卡片 +- 移动端竖屏:底部 Tabbar「应用」→ 常用区 +- 全局快捷入口:部分右上角全局「+」按钮也会触发系统应用(创建群组 / 添加任务 / 创建项目) + +## 单卡片打开方式 +- 大多数:点击卡片直接打开抽屉 / 弹窗(审批 / 签到 / 会议 / 报告 / 机器人) +- 创建类(createGroup / addProject / addTask / meeting):点击后弹「创建」对话框 +- 收藏 / 最近:点击后弹侧滑列表 +- 导出管理:点击后弹「导出任务统计 / 超期 / 审批 / 签到」二级菜单 + +## 权限要求 +- 11 个常用系统应用对 end-user 全部可见 +- 实际能否用还要看插件是否已安装(如审批要 approve 插件) + +## 找单个卡片入口 +全集对照见:[[app-system.list.concept]] diff --git a/resources/ai-kb/zh/menu-map/appstore/entry.md b/resources/ai-kb/zh/menu-map/appstore/entry.md new file mode 100644 index 000000000..eeac903f6 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/appstore/entry.md @@ -0,0 +1,55 @@ +--- +id: appstore.entry.menu-map +title: 应用市场入口在哪 +type: menu-map +feature: appstore +scope: admin +locale: zh +aliases: + - 应用市场在哪 + - 应用商店在哪 + - 怎么打开 AppStore + - 装插件入口 + - 插件管理在哪 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 普通成员看不到「应用商店」入口 + - 不在「系统设置」里,而在「应用 → 管理员」分组 + - 不支持快捷键打开 +last_verified: v1.7.90 +--- + +# 应用市场入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 顶部分组「管理员」→「应用商店」卡片 +- 移动端:底部 Tabbar「应用」→「管理员」分组 → 「应用商店」 +- URL:内部走 `appstore/internal?language={lang}&theme={theme}` +- 快捷键:无 + +## 注册方式 +入口由 `store/mutations.js` 的 `microApps/data` mutation 在 `userIsAdmin` 时动态注入,是一个 menu_item: +- `location`: `application/admin` +- `label`: `应用商店` +- `icon`: `images/application/appstore.svg` +- `capsule`: 右上角胶囊(top 18 / right 18) + +## 权限要求 +- 必须是系统管理员(identity 含 `admin`) +- 后端 `App\Module\Apps::isInstalled('appstore')` 强制返回 true,但前端入口注册只在 `userIsAdmin = true` 时执行 +- 超级管理员(id=1)默认有权限 + +## 找不到怎么办 +- 头像下拉菜单顶部如果没有显示「系统管理员」徽标 → 联系超管把 identity 加上 admin +- 已是管理员但仍看不到 → 强制刷新页面 / 重登 +- 还是没有 → 看服务器是否禁用了 appstore 容器,必要时联系运维 + +## 在哪管理已装插件 +入口里同一面板可看到「已安装」「未安装」「更新可用」三个分类。逐个操作详见: +- 安装:[[appstore.install.howto]] +- 卸载:[[appstore.uninstall.howto]] +- 更新:[[appstore.update.howto]] +- 装不上:[[appstore.cannot-install.faq]] diff --git a/resources/ai-kb/zh/menu-map/bot/entry.md b/resources/ai-kb/zh/menu-map/bot/entry.md new file mode 100644 index 000000000..e560813c6 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/bot/entry.md @@ -0,0 +1,48 @@ +--- +id: bot.entry.menu-map +title: 机器人入口 +type: menu-map +feature: bot +scope: end-user +locale: zh +aliases: + - 机器人在哪 + - 我的机器人入口 + - 怎么打开机器人面板 + - 在哪管理机器人 + - 机器人列表怎么进 + - bot 设置入口 +related_tools: [] +related_pages: [application, messenger] +prerequisites: [] +negative: + - 没有顶部主导航的「机器人」标签,机器人统一在「应用」面板下 + - 系统机器人不会出现在「我的机器人」列表里,只能在消息列表搜索 +last_verified: v1.7.90 +--- + +# 机器人入口 + +## 路径 +- **桌面端 Web**:左侧栏「应用」→「我的机器人」卡片,打开右侧抽屉(720px 宽),列出自建机器人,可「开始聊天 / 修改 / 删除」 +- **桌面端 Electron**:同 Web +- **移动端**:底部 Tabbar「应用」→ 「我的机器人」卡片 +- **指令入口**:和「机器人管理」(`bot-manager@bot.system`)单聊里发 `/list` 也能看到列表 + +## 添加机器人 +- 在「我的机器人」抽屉右上角「添加机器人」按钮 → 弹出表单,详见 [[bot.create.howto]] +- 抽屉里也可点已有机器人的「修改」打开同一编辑表单 + +## 和系统机器人聊天 +内置系统机器人(任务提醒、审批、AI 等)默认会自动出现在「消息」列表,无需手动添加: +- 桌面端:左侧栏「消息」→ 在搜索框输入机器人名(如「任务提醒」「Claude」)即可定位单聊 +- 移动端:底部「消息」Tab 同样可搜索 + +## 权限要求 +- 任何登录用户都能创建自建机器人(最多 50 个) +- 修改系统机器人头像/昵称仅 `userIsAdmin` 可操作 +- 删除按钮对系统机器人会报「系统机器人不能删除」 + +## 不支持 +- 没有「机器人广场」「公共机器人市场」的入口;只能自建或用内置 +- 没有独立的机器人快捷键,只能从「应用」面板进入 diff --git a/resources/ai-kb/zh/menu-map/calendar/entry.md b/resources/ai-kb/zh/menu-map/calendar/entry.md new file mode 100644 index 000000000..f76b3222e --- /dev/null +++ b/resources/ai-kb/zh/menu-map/calendar/entry.md @@ -0,0 +1,52 @@ +--- +id: calendar.entry.menu-map +title: 日历入口在哪 +type: menu-map +feature: calendar +scope: end-user +locale: zh +aliases: + - 日历在哪 + - 怎么进日历 + - 时间表入口 + - 我的日程 + - calendar 在哪 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 日历只显示有 end_at 的任务,不显示会议、签到等其他事件 + - 移动端日历只读,不能拖动改时间 + - 日历不支持其他人的视图 +last_verified: v1.7.90 +--- + +# 日历入口在哪 + +## 路径 +- **桌面端**:左侧栏「日历」菜单项(路由 `/manage/calendar`) +- **桌面端 URL**:`https://<域名>/manage/calendar` +- **移动端**:底部 Tabbar 「日历」Tab +- **桌面快捷键**:无 + +## 谁能看到 +- 所有登录用户都能进入日历 +- 内容是当前用户私有:显示我作为负责人(owner=1)的有 end_at 的任务 +- 详见 [[calendar.concept]] + +## 主要内容 +- 月 / 周 / 日 视图切换(详见 [[calendar.view.howto]]) +- 任务按 start_at / end_at 显示为日历格中的事件 +- 拖动任务改时间(仅桌面端,详见 [[calendar.drag.howto]]) +- 移动端仅查看,不可拖 + +## 与其他终端的差异 +| 终端 | 视图 | 编辑 | +|---|---|---| +| 桌面端 | 月 / 周 / 日 | ✓ 拖拽 | +| 移动端 | 月 | 只读 | + +## 不支持 +- 不显示会议(B2 模块)、签到、报告 +- 不支持订阅他人日历 +- 详见 [[calendar.meeting-not-shown.faq]] diff --git a/resources/ai-kb/zh/menu-map/checkin/entry.md b/resources/ai-kb/zh/menu-map/checkin/entry.md new file mode 100644 index 000000000..0d4c27963 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/checkin/entry.md @@ -0,0 +1,45 @@ +--- +id: checkin.entry.menu-map +title: 签到打卡入口在哪 +type: menu-map +feature: checkin +scope: end-user +locale: zh +aliases: + - 签到入口 + - 打卡入口 + - 签到在哪里 + - 怎么找到签到 + - 签到打卡入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 左侧栏没有「签到」一级入口,必须从「应用」展开 + - 应用中心看不到「签到打卡」卡片时,多半是被管理员在「签到设置」里整体关闭了 +last_verified: v1.7.90 +--- + +# 签到打卡入口在哪 + +## 路径 +桌面端:左侧栏「应用」→ 应用中心面板 →「签到打卡」卡片 +移动端:底部 Tabbar「应用」→「签到打卡」卡片 +快捷键:无 + +签到打卡是 DooTask **内置的系统应用**(非插件),默认显示在应用中心,无需安装。卡片显示顺序约在「我的机器人」之后、「在线会议」之前(受应用排序设置影响)。 + +## 打开后能看到什么 +点击卡片会从右侧弹出「签到管理」抽屉,包含: + +- 顶部:近 5 天签到时间线(哪天签了 / 没签) +- 「查看更多签到数据」:弹出本月 / 上月日历视图 +- 「打开签到机器人」:跳到 `check-in@bot.system` 对话 +- 「签到设置」Tab:人脸图片上传 / WiFi 签到 MAC 地址 + +管理员可在抽屉右上角看到「签到设置」入口,进入全局参数配置(签到时间、签到方式、提醒等)。详见 [[checkin.rule.concept]]。 + +## 权限要求 +- 任何登录成员都能看到「签到打卡」卡片 +- 全局「签到设置」按钮仅管理员可见 +- 个别能力(如人脸上传 / 修改 MAC)受「允许修改」开关控制,默认允许 diff --git a/resources/ai-kb/zh/menu-map/compliance/entry.md b/resources/ai-kb/zh/menu-map/compliance/entry.md new file mode 100644 index 000000000..f7741d8b9 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/compliance/entry.md @@ -0,0 +1,57 @@ +--- +id: compliance.entry.menu-map +title: 合规设置入口在哪 +type: menu-map +feature: compliance +scope: admin +locale: zh +aliases: + - 合规设置在哪 + - 合规入口 + - GDPR 设置 + - 在哪配置合规 + - compliance 菜单 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 +negative: + - DooTask 主程序不提供独立的「合规设置」菜单 + - 合规相关能力分散在多个菜单下 + - 普通成员看不到任何合规相关后台 +last_verified: v1.7.90 +--- + +# 合规设置入口在哪 + +## 路径 +DooTask **没有**单独的「合规设置」菜单,合规相关能力分散在以下入口: + +| 合规维度 | 实际入口 | 角色 | +|---|---|---| +| 用户协议 / 隐私政策 | 「应用 → 系统设置 → 通用设置」 | 系统管理员 | +| 注册策略 | 「应用 → 系统设置 → 注册策略」 | 系统管理员 | +| 安全(密码强度) | 「应用 → 系统设置 → 安全设置」 | 系统管理员 | +| 内容审核 | 「应用 → 举报管理」 | 系统管理员 | +| 数据导出(可携性) | 「应用 → 数据导出」 | 系统管理员 | +| 账号删除(DSR) | 「应用 → 团队管理」选成员后删除 | 系统管理员 | +| LDAP / SSO | 「应用 → LDAP 集成」 | 系统管理员 | +| HTTPS / 加密传输 | 服务器 Nginx 配置 | 服务器运维 | +| 数据备份 | 服务器侧 `./cmd backup` 等脚本 | 服务器运维 | + +## 权限要求 +- 列表中产品内入口都要求 `userIsAdmin = true` +- 服务器层(HTTPS / 备份)需要 root 或 docker 权限 +- 超级管理员(id=1)默认有全部产品权限 + +## 责任人建议 +- **CTO / IT**:HTTPS、备份、数据本地化 +- **系统管理员**:用户协议、注册策略、举报、账号管理 +- **法务**:审定协议文本,监督流程 + +## 找不到具体功能怎么办 +按维度查 [[compliance.howto]] 的检查清单,每一项都指向具体入口。 + +## 相关 +- 概览:[[compliance.concept]] +- 配置项清单:[[compliance.howto]] diff --git a/resources/ai-kb/zh/menu-map/dashboard/entry.md b/resources/ai-kb/zh/menu-map/dashboard/entry.md new file mode 100644 index 000000000..26c858d2a --- /dev/null +++ b/resources/ai-kb/zh/menu-map/dashboard/entry.md @@ -0,0 +1,47 @@ +--- +id: dashboard.entry.menu-map +title: 仪表盘入口在哪 +type: menu-map +feature: dashboard +scope: end-user +locale: zh +aliases: + - 仪表盘在哪 + - 怎么进仪表盘 + - 我的工作台 + - 主页在哪 + - 首页入口 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 仪表盘是登录后默认页之一,无单独权限 + - 移动端有专属的"我"Tab,与桌面端仪表盘内容相近但布局不同 + - 仪表盘内容是当前用户私有,不能切换查别人的 +last_verified: v1.7.90 +--- + +# 仪表盘入口在哪 + +## 路径 +- **桌面端**:左侧栏顶部「仪表盘」菜单项(路由 `/manage/dashboard`) +- **桌面端**:登录默认页之一,多数用户进站后自动落到此页 +- **桌面端 URL**:`https://<域名>/manage/dashboard` +- **移动端**:底部 Tabbar 的「我」Tab(功能近似仪表盘) +- **桌面快捷键**:无直达快捷键 + +## 谁能看到 +- 所有登录用户都能看到仪表盘 +- 内容是当前用户私有(自己名下任务、自己负责的任务) +- 站点管理员看到的也是自己的视图,不能切换查他人 + +## 主要内容 +仪表盘展示当前用户「今日要做什么」的快速视图,详见 [[dashboard.concept]]: +- 顶部三个数字卡片:今日到期、超期任务、待完成 +- 下方四个分组列表:今日到期 / 超期 / 待完成 / 协助的任务 +- 每个分组可折叠展开 + +## 不支持 +- 不能给团队 / 部门展示统一的"团队仪表盘" +- 不能切换"看某成员的仪表盘" +- 不能把仪表盘嵌入其他页面 / 桌面小组件 diff --git a/resources/ai-kb/zh/menu-map/data-export/entry.md b/resources/ai-kb/zh/menu-map/data-export/entry.md new file mode 100644 index 000000000..b2460561f --- /dev/null +++ b/resources/ai-kb/zh/menu-map/data-export/entry.md @@ -0,0 +1,52 @@ +--- +id: data-export.entry.menu-map +title: 数据导出入口在哪 +type: menu-map +feature: data-export +scope: admin +locale: zh +aliases: + - 数据导出在哪 + - 怎么找到导出 + - 导出菜单 + - 后台导出入口 + - 管理员导出按钮 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限(普通成员看不到此入口) +negative: + - 普通成员(非 admin)看不到「数据导出」卡片 + - 移动端「应用」页同样仅管理员可见 +last_verified: v1.7.90 +--- + +# 数据导出入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 顶部分组「管理员」→「数据导出」卡片(点击展开 4 个子项菜单) +- 移动端:底部 Tabbar「应用」→ 同样在「管理员」区 +- 快捷键:无 + +## 子菜单 +点击「数据导出」会弹出 4 个子项菜单: + +| 菜单项 | 对应文档 | +|---|---| +| 导出任务统计 | [[data-export.project.howto]] | +| 导出超期任务 | [[data-export.task.howto]] | +| 导出审批数据 | [[data-export.approve.howto]] | +| 导出签到数据 | [[data-export.checkin.howto]] | + +## 权限要求 +- `userIsAdmin = true` 才会渲染卡片 +- 后端各 API 也会用 `User::auth('admin')` 二次校验 +- 第三方插件(如审批微服务)不可用时对应导出会推送错误 + +## 找不到怎么办 +- 个人头像下拉菜单顶部如果**没有**显示「系统管理员」徽标,说明当前账号无权限 +- 联系超级管理员(id=1)到「团队管理」把账号 identity 加上 `admin` +- 设置完成后退出重登或刷新页面 + +## 导出后看哪里 +所有导出文件通过 `system-msg` 系统机器人发送到管理员的私聊会话中,链接限时下载。详见 [[data-export.concept]]。 diff --git a/resources/ai-kb/zh/menu-map/drawio/entry.md b/resources/ai-kb/zh/menu-map/drawio/entry.md new file mode 100644 index 000000000..133641cd5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/drawio/entry.md @@ -0,0 +1,55 @@ +--- +id: drawio.entry.menu-map +title: 流程图入口在哪 +type: menu-map +feature: drawio +scope: end-user +locale: zh +aliases: + - 流程图在哪 + - 找不到流程图 + - drawio 入口 + - 怎么打开 drawio + - 图表在哪个菜单 +related_tools: [] +related_pages: [file, application] +prerequisites: + - 应用市场已安装 drawio 插件 +negative: + - 流程图不是左侧栏一级菜单,要从「文件」页进入 + - 未安装 drawio 插件时,文件新建菜单不会出现「图表」选项 + - 没有「在线流程图中心」这种独立页面,所有图都散落在各自文件夹中 +last_verified: v1.7.90 +--- + +# 流程图入口在哪 + +## 路径 +流程图作为「文件」存在,没有独立的一级菜单,入口都在文件相关页面: + +- 桌面端:左侧栏「文件」→ 文件列表右上角「新建」→「图表」 +- 桌面端(右键):文件页空白区右键 →「新建」→「图表」 +- 桌面端(项目):进入项目详情 →「文件」标签页 → 新建菜单 →「图表」 +- 移动端:底部 Tabbar「文件」→ 选定目标文件夹 → 右下角「+」按钮 →「图表」 +- 已有 drawio 文件:在文件列表直接双击/单击文件名即可打开 + +> 菜单文案叫「图表」,文件类型字段叫 `drawio`,是同一个东西。 + +## 编辑器布局 +进入后页面被 iframe 全屏占用,drawio 标准三栏: +- 左侧:图形库(流程图、UML、网络、思维导图等多分类可勾选) +- 中部:画布 +- 右侧:选中元素的样式/几何/排版面板 +- 顶部:菜单栏(File/Edit/View/Arrange/Extras/Help) + +## 权限要求 +- 普通成员:在自己有权访问的文件夹/项目内可建可编辑 +- 只读访问者:只能预览,无法编辑(drawio 以 `readOnly=true` 模式打开) + +## 看不到入口怎么办 +1. 确认应用市场已装 drawio 插件(约 700MB,安装较慢,按「安装日志」判断进度) +2. 没有「新建」按钮通常是当前文件夹无写入权限,换文件夹再试 + +## 相关 +- 插件元信息:[[drawio.plugin.concept]] +- 是什么:[[drawio.concept]] diff --git a/resources/ai-kb/zh/menu-map/favorite/entry.md b/resources/ai-kb/zh/menu-map/favorite/entry.md new file mode 100644 index 000000000..f5b2eece4 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/favorite/entry.md @@ -0,0 +1,57 @@ +--- +id: favorite.entry.menu-map +title: 我的收藏 / 最近打开入口 +type: menu-map +feature: favorite +scope: end-user +locale: zh +aliases: + - 我的收藏在哪 + - 最近打开在哪 + - 收藏夹入口 + - 怎么找到我的收藏 + - 最近浏览入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 没有顶部导航的独立入口,必须通过「应用」中心进入 + - 不在左侧栏一级菜单上,不会默认置顶 + - 桌面端和移动端入口结构一致,没有平台差异化路径 +last_verified: v1.7.90 +--- + +# 我的收藏 / 最近打开入口 + +## 路径 +**桌面端** +- 左侧栏「应用」→ 应用列表中的「我的收藏」卡片 → 打开「我的收藏」弹窗 +- 左侧栏「应用」→ 应用列表中的「最近打开」卡片 → 打开「最近打开」弹窗 + +**移动端** +- 底部 Tabbar「应用」→ 应用列表中的「我的收藏」/「最近打开」卡片 +- 进入后弹窗以全屏方式展示 + +**快捷键**:无 + +## 入口属性 +| 应用 | value | 默认排序 sort | 触发事件 | +|---|---|---|---| +| 我的收藏 | `favorite` | 45 | `openFavorite` | +| 最近打开 | `recent` | 47 | `openRecent` | + +两个入口都属于「常用应用」分组,定义在 `manage/application.vue` 的 `applyList`。可通过应用排序设置调整位置(见相关「应用中心排序」文档)。 + +## 权限要求 +- `end-user`:所有登录用户可见可用 +- 不区分管理员 / 超管,无开关可关闭 +- 插件市场不提供,是系统内置功能 + +## 进入后能看到什么 +- **我的收藏**:4 类对象(任务 / 项目 / 文件 / 消息)的收藏列表,支持类型过滤、编辑备注、取消收藏、跳转。详见 [[favorite.list.howto]] +- **最近打开**:系统自动记录的最近访问对象(任务 / 文件 / 任务附件 / 消息附件)。详见 [[favorite.recent.concept]] + +## 相关 +- 添加收藏:[[favorite.add.howto]] +- 取消收藏:[[favorite.remove.howto]] +- 收藏与最近的概念区别:[[favorite.concept]] diff --git a/resources/ai-kb/zh/menu-map/file/entry.md b/resources/ai-kb/zh/menu-map/file/entry.md new file mode 100644 index 000000000..4ecf0ce73 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/file/entry.md @@ -0,0 +1,44 @@ +--- +id: file.entry.menu-map +title: 文件入口在哪 +type: menu-map +feature: file +scope: end-user +locale: zh +aliases: + - 文件在哪里 + - 怎么进文件 + - 文件菜单 + - 我的文件入口 + - 网盘在哪 +related_tools: [list_files] +related_pages: [file] +prerequisites: [] +negative: + - 文件入口不在「应用」二级页面,是左侧栏一级菜单 + - 移动端目前没有专门的「文件」Tabbar,需要从「更多」进 +last_verified: v1.7.90 +--- + +# 文件入口在哪 + +## 路径 +DooTask 的「文件」是一级导航,相当于个人网盘 + 团队共享盘。 + +- 桌面端 Web:左侧栏「文件」(图标为文件夹)→ 进入个人文件根目录 +- 桌面端 Electron:同上,支持外部窗口拖入上传 +- 移动端:底部 Tabbar「更多」→「文件」 + +## 默认视图 +- 顶部面包屑显示当前路径(根目录 / 文件夹层级) +- 主区域列出当前文件夹下的文件与文件夹(最多 500 条,超出滚动加载) +- 自己创建的在「我的文件」段,他人共享给我的在「共享」段 + +## 权限要求 +- 所有登录用户可见 +- 无管理员限制;访客(游客 token)只能访问被显式标记 `guest_access` 的链接 + +## 不支持 +- 文件菜单不能隐藏 / 不能改顺序(系统级一级入口) +- 不支持挂载外部网盘(如百度网盘 / OneDrive) +- 不支持按全公司维度浏览所有人文件(出于隐私) diff --git a/resources/ai-kb/zh/menu-map/kpi/entry.md b/resources/ai-kb/zh/menu-map/kpi/entry.md new file mode 100644 index 000000000..7a56ebfc5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/kpi/entry.md @@ -0,0 +1,57 @@ +--- +id: kpi.entry.menu-map +title: KPI 绩效考核入口 +type: menu-map +feature: kpi +scope: end-user +locale: zh +aliases: + - KPI 在哪 + - 怎么打开绩效 + - 找不到绩效考核 + - 绩效入口 + - 怎么进 KPI +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 kpi 插件 + - 主程序版本 > 1.4.67 +negative: + - 主程序不内置 KPI,未装插件时入口不会出现 + - 主程序版本不够无法安装插件,入口也不会出现 + - 不同角色看到的页面功能不同,但入口是同一个 +last_verified: v1.7.90 +--- + +# KPI 绩效考核入口 + +## 路径 +KPI 由独立插件 `community_kuaifan_kpi` 提供,安装后在应用中心注册一个菜单项: + +- 桌面端:左侧栏「应用」→「绩效考核」(对应 URL `apps/kpi`) +- 移动端:底部 Tabbar「应用」→「绩效考核」 +- URL 上会自动附带 `theme` 参数,用于主题(亮 / 暗)同步 + +## 加载方式 +- 菜单项类型 `url_type: iframe`,在 DooTask 主框架内嵌打开 +- `immersive: true`:进入后会全屏沉浸展示,左侧主导航被收起 +- 同一个入口对所有角色可见,进入后页面根据当前用户的 KPI 角色(employee / manager / hr)展示对应功能 + +## 权限要求 +- 入口本身:所有已登录用户可见 +- 角色映射: + - DooTask 系统管理员 → KPI 内部 hr 角色 + - DooTask 部门负责人 → KPI 内部 manager 角色 + - 其他用户 → KPI 内部 employee 角色 +- 注意:角色只在用户首次进入 KPI 时分配,后续 DooTask 角色变更不会自动同步 + +## 看不到入口怎么办 +1. 确认应用市场已安装 `kpi` 插件 +2. 主程序版本必须 > 1.4.67,否则插件无法安装 +3. 容器首次启动需要拉取镜像,可能等待几分钟 +4. 安装完成后刷新页面或重新登录让菜单生效 + +## 相关 +- 插件元信息:[[kpi.plugin.concept]] +- KPI 是什么:[[kpi.concept]] +- 创建考核:[[kpi.create.howto]] diff --git a/resources/ai-kb/zh/menu-map/meeting/entry.md b/resources/ai-kb/zh/menu-map/meeting/entry.md new file mode 100644 index 000000000..2c17c8c22 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/meeting/entry.md @@ -0,0 +1,43 @@ +--- +id: meeting.entry.menu-map +title: 在哪打开会议 +type: menu-map +feature: meeting +scope: end-user +locale: zh +aliases: + - 会议入口 + - 会议在哪 + - 怎么打开会议 + - 视频会议入口 + - 加入会议在哪里 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 会议没有放在左侧主导航一级菜单 + - 没有独立的全局快捷键查看历史会议(历史以会议消息卡片形式留在对话里) +last_verified: v1.7.90 +--- + +# 在哪打开会议 + +## 路径 +DooTask 在线会议有多个入口,按使用场景就近选择: + +- 桌面端:右上角全局「+」→「新会议」或「加入会议」(快捷键 Cmd/Ctrl + J 直开新会议) +- 桌面端:左侧栏「应用」→ 应用中心「会议」卡片 →「创建会议 / 加入会议」 +- 桌面端:消息对话窗口底部「+」→「会议」(按会话成员自动预填邀请名单) +- 桌面端:消息列表中长按某个联系人 →「发起会议」 +- 移动端:底部 Tabbar「+」按钮 →「新会议 / 加入会议」 +- 移动端:对话窗口底部「+」→「会议」 +- 浏览器:直接打开分享链接(路径形如 `/meeting//`)也可拉起加入对话框 + +## 权限要求 +- end-user 即可创建和加入会议,无需管理员权限 +- 但管理员必须先在「系统设置 → 会议」配置 appid 和密钥后,功能才可用 + +## 相关 +- 详细新建步骤:[[meeting.create.howto]] +- 加入步骤:[[meeting.join.howto]] +- 从对话发起会议:[[meeting.from-dialog.howto]] diff --git a/resources/ai-kb/zh/menu-map/memos/entry.md b/resources/ai-kb/zh/menu-map/memos/entry.md new file mode 100644 index 000000000..006098162 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/memos/entry.md @@ -0,0 +1,50 @@ +--- +id: memos.entry.menu-map +title: Memos 笔记入口 +type: menu-map +feature: memos +scope: end-user +locale: zh +aliases: + - Memos 在哪 + - 怎么打开 Memos + - 找不到 Memos + - 笔记入口 + - memos 应用入口 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 memos 插件 +negative: + - 主程序不内置 Memos,未装插件时入口不会出现 + - 入口对所有登录用户可见,不要求管理员权限 +last_verified: v1.7.90 +--- + +# Memos 笔记入口 + +## 路径 +Memos 由独立插件 `community_kuaifan_memos` 提供,安装后在应用中心注册一个菜单项: + +- 桌面端:左侧栏「应用」→「Memos 笔记」(对应 URL `apps/memos/`) +- 移动端:底部 Tabbar「应用」→「Memos 笔记」 +- URL 上会自动附带 `token`、`lang`、`theme` 参数,用于单点登录与主题同步 + +## 加载方式 +- 菜单项类型 `url_type: iframe`,在 DooTask 主框架内嵌打开 +- `immersive: true`:进入页面后会全屏沉浸展示 +- 隐藏 DooTask 的浮动胶囊条(与 Memos 自带顶栏重叠),返回主程序请使用 Memos 左侧栏的「关闭应用」按钮 + +## 权限要求 +- 所有已登录的 DooTask 用户可见可用 +- 是否成为 Memos 管理员,由安装时的「管理员」配置决定(其余用户为普通成员) + +## 看不到入口怎么办 +1. 确认应用市场已安装 `memos` 插件 +2. 容器首次启动需要拉取镜像,可能等待几分钟 +3. 刷新页面或重新登录 DooTask 让菜单生效 + +## 相关 +- 插件元信息:[[memos.plugin.concept]] +- Memos 是什么:[[memos.concept]] +- 写一条 memo:[[memos.create.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/ai-assistant.md b/resources/ai-kb/zh/menu-map/menu-navigation/ai-assistant.md new file mode 100644 index 000000000..538c37a13 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/ai-assistant.md @@ -0,0 +1,42 @@ +--- +id: menu-navigation.ai-assistant.menu-map +title: AI 助手入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - AI 在哪 + - AI 助手怎么打开 + - 智能助手入口 + - Claude 在哪 + - 怎么找 AI +related_tools: [search_help_docs, get_page_context] +related_pages: [] +prerequisites: + - 应用市场已安装 ai 插件 + - 管理员已在「系统设置 → AI 设置」配置至少一个模型 +negative: + - 未安装 ai 插件时右上「+」菜单不出现「AI 助手」一项,浮动按钮也不渲染 + - 没有左侧栏一级菜单,AI 助手是浮窗形态 + - 移动端首次加载会自动收起浮按钮 +last_verified: v1.7.90 +--- + +# AI 助手入口在哪 + +## 路径 +- 桌面端:右上角「+」下拉 →「AI 助手」(仅安装 ai 插件后出现) +- 桌面端:屏幕右下角悬浮的圆形 AI 按钮 → 点开浮窗 +- 桌面端:项目 / 任务详情里某些字段旁的 AI 小按钮(如「项目名 AI 生成」「描述 AI 生成」) +- 移动端:屏幕侧边浮动按钮(默认贴边收起,触摸唤起) +- 桌面快捷键:Cmd/Ctrl + I + +## 权限要求 +- 任何登录用户可用 +- 单个会话由当前账号私有,不会跨账号 + +## 相关 +- 浮动入口与场景模式:[[ai-assistant.entry.howto]] +- 快速开始:[[ai-assistant.entry.howto]] +- 模型与默认值由管理员配:[[system-setting.ai-model.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/ai-config.md b/resources/ai-kb/zh/menu-map/menu-navigation/ai-config.md new file mode 100644 index 000000000..e852f3303 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/ai-config.md @@ -0,0 +1,47 @@ +--- +id: menu-navigation.ai-config.menu-map +title: AI 模型配置入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - AI 配置在哪 + - 怎么配置 AI 模型 + - AI 设置入口 + - 加 Claude 的 key 在哪 + - 模型配置 +related_tools: [] +related_pages: [] +prerequisites: + - 已安装 ai 插件 + - 需要系统管理员权限 +negative: + - AI 模型配置不在「系统设置」菜单里,入口在「AI 助手」应用内的设置面板 + - 普通成员打开 AI 助手看不到设置入口(提示仅管理员可操作) + - 未安装 ai 插件时「AI 助手」应用不出现 +last_verified: v1.7.90 +--- + +# AI 模型配置入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→「AI 助手」应用 → 各 AI 机器人(供应商)卡片上的设置按钮 → 打开设置面板(仅管理员可见) +- 移动端:底部 Tabbar「应用」→「AI 助手」→ 同上 +- 快捷键:无 +- 注意:不在「系统设置」菜单里,旧版「系统设置 → AI 设置」入口已废弃(v1.4.35 起) + +## 能配置 +- 各供应商(ChatGPT/OpenAI、Claude、DeepSeek、Gemini、Grok、Ollama、智谱、通义千问、文心一言等)的 API Key、Base URL +- 模型列表(一行一个,可点「使用默认模型列表」一键填入)与默认模型 +- 代理、Temperature、默认提示词 +- 另有 MCP 工具配置和视觉(识图)模型配置卡片 + +## 权限要求 +- 系统管理员(`userIsAdmin`)才能打开设置面板,配置全局生效 +- 普通成员只能使用 AI 对话和切换可用模型 + +## 相关 +- AI 模型配置步骤:[[system-setting.ai-model.howto]] +- AI 机器人配置:[[system-setting.ai-bot.howto]] +- 用户侧 AI 助手:[[menu-navigation.ai-assistant.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/apps-sort.md b/resources/ai-kb/zh/menu-map/menu-navigation/apps-sort.md new file mode 100644 index 000000000..24f632015 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/apps-sort.md @@ -0,0 +1,47 @@ +--- +id: menu-navigation.apps-sort.menu-map +title: 应用排序入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么调应用顺序 + - 应用排序在哪 + - 应用中心排序 + - 自定义应用顺序 + - 移动顶部应用 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 排序是当前账号私有,不会影响其他人 + - 没有"按字母排序"快捷动作,只能拖拽 + - 隐藏 / 删除卡片不在排序模式内,需要安装 / 卸载相应插件 +last_verified: v1.7.90 +--- + +# 应用排序入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 应用中心右上角「排序」/「编辑顺序」按钮 +- 桌面端:进入排序模式后拖动卡片调整顺序,再点「保存」 +- 移动端:底部 Tabbar「应用」→ 同样有「排序」按钮 +- 快捷键:无 + +## 怎么排 +1. 进入排序模式,卡片出现拖拽手柄 +2. 拖动卡片到目标位置 +3. 「常用应用」与「管理员应用」按分组独立排序 +4. 保存后立即生效 + +## 权限要求 +- 所有登录用户可改自己的排序 +- 个人配置,互不影响 + +## 不在排序里的项 +- 已卸载的插件卡片:先到 [[menu-navigation.appstore.menu-map]] 安装 +- 隐藏的卡片:通常因角色 / 权限不足,无法手动显隐 + +## 相关 +- 应用中心入口:[[menu-navigation.apps.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/apps.md b/resources/ai-kb/zh/menu-map/menu-navigation/apps.md new file mode 100644 index 000000000..cad0d69ea --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/apps.md @@ -0,0 +1,46 @@ +--- +id: menu-navigation.apps.menu-map +title: 应用中心入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 应用中心在哪 + - 应用菜单怎么找 + - 怎么打开应用面板 + - apps 入口 + - 所有插件入口 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 部分卡片受插件安装 / 角色权限影响显隐 + - 卡片顺序可在「应用排序」里调整,详见 [[menu-navigation.apps-sort.menu-map]] +last_verified: v1.7.90 +--- + +# 应用中心入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」一级菜单(图标为九宫格) +- 桌面端 URL:`/manage/application` +- 移动端:底部 Tabbar「应用」Tab(5 个 Tab 之一) +- 快捷键:无 + +## 默认看到什么 +桌面端进入后是「常用应用 + 管理员应用」的卡片墙,含: +- 常用:审批 / 我的收藏 / 最近打开 / 工作报告 / 我的机器人 / 签到打卡 / 在线会议 / 创建群组 / 群投票 / 群接龙 / 创建项目 / 添加任务 +- 管理员(仅管理员可见):LDAP / 邮件通知 / APP 推送 / 举报管理 / 数据导出 / 团队管理 / 应用商店 + +移动端竖屏额外含:日历、文件、设置(因为它们不在 Tabbar 上)。 + +## 权限要求 +- 所有登录用户可见入口 +- 但「管理员」分组卡片只对 `admin` 可见 + +## 相关 +- 应用排序:[[menu-navigation.apps-sort.menu-map]] +- 微应用入口:[[micro-app.entry.menu-map]] +- 审批中心:[[approve.entry.menu-map]] +- 在线会议:[[meeting.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/appstore.md b/resources/ai-kb/zh/menu-map/menu-navigation/appstore.md new file mode 100644 index 000000000..b75cda34b --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/appstore.md @@ -0,0 +1,44 @@ +--- +id: menu-navigation.appstore.menu-map +title: 应用市场入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 应用市场在哪 + - 应用商店入口 + - 装插件在哪 + - 插件管理入口 + - AppStore 怎么进 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 普通成员看不到「应用商店」入口 + - 应用商店不在「系统设置」里,而在「应用」中心 → 管理员分组 + - 不支持快捷键 +last_verified: v1.7.90 +--- + +# 应用市场入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 顶部分组「管理员」→「应用商店」卡片 +- 移动端:底部 Tabbar「应用」→「管理员」分组 →「应用商店」 +- URL:内部走 `appstore/internal?language={lang}&theme={theme}` +- 快捷键:无 + +## 能做什么 +- 安装 / 卸载 / 更新插件 +- 查看已安装、未安装、有更新可用三类 + +## 权限要求 +- `admin` 才能看到入口 +- 普通成员无此卡片 + +## 相关 +- 完整入口说明:[[appstore.entry.menu-map]] +- 安装插件:[[appstore.install.howto]] +- 卸载插件:[[appstore.uninstall.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/bot-mgmt.md b/resources/ai-kb/zh/menu-map/menu-navigation/bot-mgmt.md new file mode 100644 index 000000000..1cf9bd941 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/bot-mgmt.md @@ -0,0 +1,47 @@ +--- +id: menu-navigation.bot-mgmt.menu-map +title: 机器人管理入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 机器人管理在哪 + - 我的机器人入口 + - 怎么加机器人 + - 自建机器人 + - bot 在哪管理 +related_tools: [] +related_pages: [application, messenger] +prerequisites: [] +negative: + - 系统内置机器人(任务提醒 / 审批等)不会出现在「我的机器人」列表 + - 系统机器人无法删除,仅管理员可改头像 / 昵称 + - 单个账号最多创建 50 个自建机器人 +last_verified: v1.7.90 +--- + +# 机器人管理入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→「我的机器人」卡片 → 右侧 720px 抽屉 +- 桌面端指令入口:消息列表搜 `bot-manager@bot.system` → 在单聊里发 `/list` 看列表、`/add` 新建 +- 移动端:底部 Tabbar「应用」→「我的机器人」 +- 快捷键:无 + +## 抽屉里能做什么 +- 查看自己创建的机器人列表 +- 「添加机器人」按钮:新建 +- 每条机器人:「开始聊天 / 修改 / 删除」三个操作 + +## 权限要求 +- 任何登录用户都能创建自建机器人(最多 50 个) +- 修改 / 删除系统机器人需管理员权限 + +## 找系统机器人 +- 不在「我的机器人」里 +- 在「消息」列表搜机器人名(如「任务提醒」「Claude」) + +## 相关 +- 机器人入口详解:[[bot.entry.menu-map]] +- 创建机器人:[[bot.create.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/calendar.md b/resources/ai-kb/zh/menu-map/menu-navigation/calendar.md new file mode 100644 index 000000000..eb3ab05c3 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/calendar.md @@ -0,0 +1,42 @@ +--- +id: menu-navigation.calendar.menu-map +title: 日历入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 日历在哪 + - 怎么打开日历 + - 我的日程入口 + - 时间表怎么看 +related_tools: [list_tasks] +related_pages: [calendar] +prerequisites: [] +negative: + - 日历只显示有 end_at 的任务,不显示会议 / 签到 / 报告 + - 移动端日历是只读模式 +last_verified: v1.7.90 +--- + +# 日历入口在哪 + +## 路径 +- 桌面端:左侧栏「日历」菜单项(一级入口) +- 桌面端 URL:`https://<域名>/manage/calendar` +- 移动端竖屏:底部 Tabbar 默认不显示「日历」,需要在「应用」→「日历」打开(仅在 windowPortrait 模式下卡片可见) +- 移动端横屏:和桌面端类似从应用入口 +- 快捷键:无 + +## 视图 +- 月 / 周 / 日 三视图切换 +- 拖动任务改时间(仅桌面端) +- 移动端只读 + +## 权限要求 +- 所有登录用户可见 +- 仅显示自己名下的任务 + +## 相关 +- 日历入口详解:[[calendar.entry.menu-map]] +- 视图切换:[[calendar.view.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/checkin-rule.md b/resources/ai-kb/zh/menu-map/menu-navigation/checkin-rule.md new file mode 100644 index 000000000..140b6becc --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/checkin-rule.md @@ -0,0 +1,46 @@ +--- +id: menu-navigation.checkin-rule.menu-map +title: 签到规则配置入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 签到规则在哪 + - 打卡规则配置 + - 设置签到时间 + - WiFi 签到怎么配 + - 人脸签到怎么开 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 +negative: + - 普通成员看不到「签到设置」按钮,只看到自己的签到面板 + - 修改签到规则后已生成的签到记录不会回溯 +last_verified: v1.7.90 +--- + +# 签到规则配置入口在哪 + +## 路径 +- 桌面端:右上角头像 →「系统设置」→ 左侧子菜单「签到」 +- 桌面端:左侧栏「应用」→「签到打卡」→ 右上角「签到设置」按钮(管理员可见) +- 桌面端 URL:`/manage/setting-system?tab=checkin`(视版本) +- 移动端:管理员菜单内进系统设置 + +## 能配置 +- 上下班时间 / 弹性窗口 +- 签到方式:手动 / WiFi MAC / 地理围栏 / 人脸 +- 提醒推送时间 +- 是否允许员工自行修改人脸图 / MAC +- 节假日规则 + +## 权限要求 +- `admin` 才能看到入口 +- 改完立即生效(对未来签到) + +## 相关 +- 系统设置入口:[[menu-navigation.system-setting.menu-map]] +- 用户侧打卡入口:[[menu-navigation.checkin.menu-map]] +- 规则概念:[[checkin.rule.concept]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/checkin.md b/resources/ai-kb/zh/menu-map/menu-navigation/checkin.md new file mode 100644 index 000000000..1745e2ac1 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/checkin.md @@ -0,0 +1,41 @@ +--- +id: menu-navigation.checkin.menu-map +title: 签到打卡入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么打卡 + - 签到在哪 + - 打卡按钮 + - 上下班签到入口 + - 打卡机器人在哪 +related_tools: [] +related_pages: [application, messenger] +prerequisites: [] +negative: + - 没有左侧一级菜单,必须从「应用」展开 + - 不支持快捷键 + - 「签到打卡」卡片被管理员关闭时不会显示 +last_verified: v1.7.90 +--- + +# 签到打卡入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→「签到打卡」卡片 → 右侧抽屉「签到管理」 +- 桌面端:消息列表搜索 `check-in@bot.system` 找到「签到机器人」单聊 → 在对话里发指令打卡 +- 移动端:底部 Tabbar「应用」→「签到打卡」 +- 移动端:消息列表找「签到机器人」单聊 +- 快捷键:无 + +## 权限要求 +- 所有登录成员可见 +- 修改人脸 / WiFi MAC 受「允许修改」开关控制 +- 「签到设置」按钮仅管理员可见 + +## 相关 +- 签到入口总览:[[checkin.entry.menu-map]] +- 怎么打卡:[[checkin.regular.howto]] +- 管理员配置规则:[[checkin.rule.concept]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/dashboard.md b/resources/ai-kb/zh/menu-map/menu-navigation/dashboard.md new file mode 100644 index 000000000..a961786dd --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/dashboard.md @@ -0,0 +1,42 @@ +--- +id: menu-navigation.dashboard.menu-map +title: 仪表盘入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 仪表盘在哪 + - 工作台入口 + - 首页在哪 + - 主页怎么进 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 仪表盘内容是个人私有,不能切换查别人的 + - 没有"团队仪表盘",团队维度需要走「数据导出」 +last_verified: v1.7.90 +--- + +# 仪表盘入口在哪 + +## 路径 +- 桌面端:左侧栏顶部「仪表盘」(路由 `/manage/dashboard`) +- 桌面端:登录后多数账号默认落到仪表盘 +- 移动端:底部 Tabbar「仪表盘」Tab +- 桌面 URL:`https://<域名>/manage/dashboard` +- 快捷键:无 + +## 看到什么 +- 顶部三个数字卡片:今日到期、超期、待完成 +- 下方四个分组:今日 / 超期 / 待完成 / 协助 +- 「我的项目」卡片 + +## 权限要求 +- 所有登录用户可见 +- 内容是当前用户私有视角 + +## 相关 +- 详细界面:[[dashboard.entry.menu-map]] +- 各分组用法:[[dashboard.today.howto]] / [[dashboard.overdue.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/data-export-mgmt.md b/resources/ai-kb/zh/menu-map/menu-navigation/data-export-mgmt.md new file mode 100644 index 000000000..6aff271ca --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/data-export-mgmt.md @@ -0,0 +1,48 @@ +--- +id: menu-navigation.data-export-mgmt.menu-map +title: 数据导出管理入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 数据导出在哪 + - 后台导出入口 + - 怎么导出任务数据 + - 怎么导出签到数据 + - 导出审批 +related_tools: [] +related_pages: [application] +prerequisites: + - 需要系统管理员权限 +negative: + - 普通成员看不到此卡片 + - 导出文件以系统消息形式推送,不在网页直接下载列表 +last_verified: v1.7.90 +--- + +# 数据导出管理入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→「管理员」分组 →「数据导出」卡片 → 弹出 4 个子项 +- 桌面端:右上角头像 →「团队管理」二级菜单也含「导出任务统计 / 超期任务 / 审批 / 签到」4 个直接动作 +- 移动端:底部 Tabbar「应用」→「管理员」→「数据导出」 +- 快捷键:无 + +## 4 个子项 +- 导出任务统计 → [[data-export.project.howto]] +- 导出超期任务 → [[data-export.task.howto]] +- 导出审批数据 → [[data-export.approve.howto]] +- 导出签到数据 → [[data-export.checkin.howto]] + +## 权限要求 +- `admin` 才能看到 +- 后端各 API 用 `User::auth('admin')` 二次校验 + +## 导出后去哪取 +- 通过 `system-msg` 系统机器人发送到管理员私聊会话 +- 链接限时有效,过期需重导 +- 详见 [[data-export.entry.menu-map]] + +## 相关 +- 数据导出入口:[[data-export.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/email-config.md b/resources/ai-kb/zh/menu-map/menu-navigation/email-config.md new file mode 100644 index 000000000..db8193248 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/email-config.md @@ -0,0 +1,44 @@ +--- +id: menu-navigation.email-config.menu-map +title: 邮件配置入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 邮件配置在哪 + - SMTP 设置入口 + - 注册邮件怎么配 + - 邮件服务器配置 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限 +negative: + - 个人邮件通知偏好在「个人设置」改,不在这里 + - 系统未配 SMTP 时所有「邮件验证」「忘记密码」等流程都失效 +last_verified: v1.7.90 +--- + +# 邮件配置入口在哪 + +## 路径 +- 桌面端:右上角头像 →「系统设置」→ 左侧子菜单「邮件」 +- 桌面端 URL:`/manage/setting-system?tab=email`(视版本) +- 移动端:通常不展示 + +## 能配置 +- SMTP 服务器、端口、TLS 开关 +- 发件人地址 + 显示名 +- 注册验证邮件 +- 未读消息提醒邮件(频率、阈值) +- 系统告警接收人 + +## 权限要求 +- `admin` 才能看到 +- 改后建议先发测试邮件验证 + +## 相关 +- 系统设置入口:[[menu-navigation.system-setting.menu-map]] +- 用户侧通知偏好:[[menu-navigation.notification-setting.menu-map]] +- 邮件通知功能:[[email-notice.config.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/favorite.md b/resources/ai-kb/zh/menu-map/menu-navigation/favorite.md new file mode 100644 index 000000000..39c709be5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/favorite.md @@ -0,0 +1,41 @@ +--- +id: menu-navigation.favorite.menu-map +title: 我的收藏入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 我的收藏在哪 + - 收藏夹入口 + - 怎么打开收藏 + - 我收藏过的怎么看 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 没有左侧栏一级入口,藏在「应用」中心和头像下拉里 + - 没有快捷键 +last_verified: v1.7.90 +--- + +# 我的收藏入口在哪 + +## 路径 +- 桌面端:左上角头像 / 昵称下拉菜单(主菜单)→「我的收藏」(位于「最近打开的任务」下方) +- 桌面端:左侧栏「应用」→「我的收藏」卡片 +- 移动端:底部 Tabbar「应用」→「我的收藏」卡片 +- 快捷键:无 + +## 打开后能看到 +- 4 类对象:任务 / 项目 / 文件 / 消息 +- 支持类型筛选、取消收藏、跳到原对象 + +## 权限要求 +- 所有登录用户可见 +- 个人私有,不与他人共享 + +## 相关 +- 收藏入口与最近打开:[[favorite.entry.menu-map]] +- 添加收藏:[[favorite.add.howto]] +- 与最近打开的区别:[[favorite.concept]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/files.md b/resources/ai-kb/zh/menu-map/menu-navigation/files.md new file mode 100644 index 000000000..38fd04aa5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/files.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.files.menu-map +title: 我的文件入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 文件在哪 + - 我的文件入口 + - 网盘在哪 + - 怎么找上传过的文件 +related_tools: [list_files, search_files] +related_pages: [file] +prerequisites: [] +negative: + - 「文件」入口不能隐藏 / 改顺序 + - 不支持挂载外部网盘(如百度网盘 / OneDrive) +last_verified: v1.7.90 +--- + +# 我的文件入口在哪 + +## 路径 +- 桌面端:左侧栏「文件」(一级菜单,文件夹图标) +- 桌面端 Electron:同上,支持窗口拖入上传 +- 桌面端 URL:`https://<域名>/manage/file` +- 移动端竖屏:底部 Tabbar 不显示「文件」一级,需要从「应用」→「文件」卡片 +- 快捷键:无 + +## 默认视图 +- 顶部面包屑显示路径 +- 主区列出文件夹和文件 +- 分「我的文件」和「共享」两段 + +## 权限要求 +- 所有登录用户可见 +- 看到的是自己创建的 + 他人共享给我的 + +## 相关 +- 入口详解:[[file.entry.menu-map]] +- 上传 / 新建:[[file.upload.howto]] +- 共享:[[file.share.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/language.md b/resources/ai-kb/zh/menu-map/menu-navigation/language.md new file mode 100644 index 000000000..0b983941c --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/language.md @@ -0,0 +1,44 @@ +--- +id: menu-navigation.language.menu-map +title: 切换语言入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 切换语言 + - 换语言在哪 + - 改成英文 + - 改成中文 + - language switch +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 切换后部分页面需要刷新才完全生效 + - 后端推送通知文本受推送时的当前语言影响,不会回填 +last_verified: v1.7.90 +--- + +# 切换语言入口在哪 + +## 路径 +- 桌面端:右上角头像 →「个人设置」→「语言设置」子页 +- 桌面端 URL:`/manage/setting/language` +- 移动端:底部 Tabbar「我的」→「设置」→「语言设置」 +- 登录页:右上角语言切换器(未登录也可切) +- 快捷键:无 + +## 支持的语言 +- 简体中文(zh) +- 繁体中文(zh-CHT) +- 英文(en) +- 越南语 / 韩语 等(视部署版本) + +## 权限要求 +- 所有用户(含未登录)可切换 +- 个人选择存到当前账号 + 浏览器 localStorage + +## 相关 +- 详细步骤:[[user-settings.language.howto]] +- 个人设置入口:[[user-settings.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/license.md b/resources/ai-kb/zh/menu-map/menu-navigation/license.md new file mode 100644 index 000000000..a6709d10b --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/license.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.license.menu-map +title: License Key 入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - License 在哪 + - 授权码在哪填 + - License Key 入口 + - 怎么激活 + - 企业版授权 +related_tools: [] +related_pages: [] +prerequisites: + - 系统管理员账号 +negative: + - 普通成员看不到「License Key」选项 + - License 失效会触发部分企业功能降级,但不会立即停机 +last_verified: v1.7.90 +--- + +# License Key 入口在哪 + +## 路径 +- 桌面端:右上角头像下拉菜单 →「License Key」(管理员可见) +- 桌面端:「系统设置」→ 左侧子菜单「License」 +- 桌面端 URL:`/manage/setting-system?tab=license`(视版本) +- 移动端:建议在桌面端 / 浏览器操作 + +## 能做什么 +- 查看当前授权状态(终端数 / 到期时间 / 类型) +- 录入新的 License Key +- 联系官方续期 + +## 权限要求 +- `admin` 可见 +- 部分超大授权操作仅超级管理员(id=1) + +## 相关 +- License 概念与续期:[[license.howto]] +- 系统设置入口:[[menu-navigation.system-setting.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/logout.md b/resources/ai-kb/zh/menu-map/menu-navigation/logout.md new file mode 100644 index 000000000..2190f7db4 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/logout.md @@ -0,0 +1,48 @@ +--- +id: menu-navigation.logout.menu-map +title: 退出登录入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 退出登录在哪 + - 怎么登出 + - 切换账号怎么办 + - 注销当前账号入口 + - sign out +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 「退出登录」≠「注销账号」,前者只是登出,账号数据不删 + - 移动端 EEUI 才有「删除帐号」选项(真正注销) + - Electron 客户端登出后会回到登录页,缓存不会自动清 +last_verified: v1.7.90 +--- + +# 退出登录入口在哪 + +## 路径 +- 桌面端:右上角头像下拉菜单最底部「退出登录」(红色) +- 桌面端:点击后会弹出确认框「你确定要登出系统吗?」 +- 移动端:底部 Tabbar「我的」→ 滚到底部「退出登录」 +- 快捷键:无 + +## 操作流程 +1. 点「退出登录」 +2. 弹出确认框 +3. 确认后清 session → 回到登录页 + +## 想清缓存再退 +- 头像菜单同一组里有「清除缓存」选项(位于「退出登录」上方),会执行 reload + +## 切换账号 +- 当前版本只能先退出再登录另一账号 +- 不支持桌面端多账号并存 + +## 权限要求 +- 所有登录用户可见 + +## 相关 +- 个人设置入口(含清缓存):[[user-settings.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/messages.md b/resources/ai-kb/zh/menu-map/menu-navigation/messages.md new file mode 100644 index 000000000..1e58772b5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/messages.md @@ -0,0 +1,50 @@ +--- +id: menu-navigation.messages.menu-map +title: 消息列表入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 消息在哪 + - 怎么打开聊天 + - 消息列表入口 + - 看未读怎么进 + - 单聊群聊在哪 +related_tools: [search_dialogs] +related_pages: [messenger] +prerequisites: [] +negative: + - 不支持完全隐藏消息模块,仅可逐个隐藏单条会话 + - 没有「未登录" 访客访问入口 +last_verified: v1.7.90 +--- + +# 消息列表入口在哪 + +## 路径 +- 桌面端:左侧栏「消息」(气泡图标) +- 桌面端 Electron:同上,任务栏图标小红点提示未读 +- 移动端:底部 Tabbar「消息」Tab +- 顶部搜索框可直接搜会话和历史消息 +- 快捷键:无(但搜索可用 Cmd/Ctrl + F) + +## 打开后界面 +- 左侧:会话列表(置顶 + 最后活跃倒序) +- 右侧:当前会话消息流 +- 每条会话右侧角标:未读数 / @我 数 + +## 会话类型 +- 单聊(与单个用户) +- 群聊(手动建的多人群) +- 项目讨论(自动生成) +- 任务讨论(自动生成) +- 机器人单聊 + +## 权限要求 +- 所有登录用户可见 +- 临时账号也可收发消息 + +## 相关 +- 入口详解:[[messenger.entry.menu-map]] +- 通讯录:联系人列表 diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/my-projects.md b/resources/ai-kb/zh/menu-map/menu-navigation/my-projects.md new file mode 100644 index 000000000..94a74bf5f --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/my-projects.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.my-projects.menu-map +title: 我的项目入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 我的项目在哪 + - 我加入了哪些项目 + - 项目列表怎么看 + - 我负责的项目入口 +related_tools: [list_projects] +related_pages: [project_list, dashboard] +prerequisites: [] +negative: + - 默认列表只显示我加入的项目,未加入项目不显示 + - 已归档项目要切到「已归档」筛选 + - 不支持申请加入未加入的项目 +last_verified: v1.7.90 +--- + +# 我的项目入口在哪 + +## 路径 +- 桌面端:左侧栏 →「项目」分组(默认展开),所有我加入的项目按置顶 + 自定义顺序排列 +- 桌面端:左侧栏顶部「仪表盘」→「我的项目」卡片 +- 桌面端:头像下拉(管理员)→「所有项目」可看全站 +- 移动端:底部 Tabbar「项目」Tab +- 桌面快捷键:Cmd/Ctrl + P 唤起项目快搜 + +## 筛选选项 +- 「我加入的」(默认) +- 「全部」:仅站点管理员可见 +- 「已归档」:archived_at 非空的 + +## 权限要求 +- end-user 默认看到自己加入的项目 +- 站点管理员(admin)可看到全站项目 + +## 相关 +- 项目入口总览:[[project.entry.menu-map]] +- 个人项目概念:[[project.personal.concept]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/my-tasks.md b/resources/ai-kb/zh/menu-map/menu-navigation/my-tasks.md new file mode 100644 index 000000000..1c75410e2 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/my-tasks.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.my-tasks.menu-map +title: 我的任务入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 我的任务在哪 + - 我有哪些待办 + - 我负责的任务怎么看 + - 我的 todo 列表 +related_tools: [list_tasks] +related_pages: [dashboard] +prerequisites: [] +negative: + - 没有「我的任务」一级菜单,它由仪表盘 + 日历 + 各项目内分布呈现 + - 不支持跨项目按截止时间统一排序(除日历视图外) +last_verified: v1.7.90 +--- + +# 我的任务入口在哪 + +## 路径 +- 桌面端:左侧栏「仪表盘」→「今日 / 超期 / 待完成 / 协助」四个分组都是我的任务 +- 桌面端:左侧栏「日历」→ 我作为负责人的任务按时间显示 +- 桌面端:进入任意项目 → 顶部筛选切到「我负责的」/「我协助的」 +- 移动端:底部 Tabbar「仪表盘」→ 同样的四组 +- 移动端:日历 Tab(管理员菜单内) +- 快捷键:无 + +## 怎么算"我的任务" +- 负责人(owner)含我的全部任务 +- 协助人(assist)含我的任务也算 +- 不包括只关注 / 抄送的任务 + +## 权限要求 +- end-user 默认可见自己名下任务 +- 不能查看他人名下任务(除非进入项目并有权限) + +## 相关 +- 仪表盘入口:[[dashboard.entry.menu-map]] +- 日历入口:[[calendar.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-approve.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-approve.md new file mode 100644 index 000000000..f71a6ccc4 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-approve.md @@ -0,0 +1,41 @@ +--- +id: menu-navigation.new-approve.menu-map +title: 新建审批入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么发起审批 + - 新建审批在哪 + - 发起流程入口 + - 报销审批怎么提 + - 走流程按钮 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 approve 插件 + - 管理员已配置至少一个审批流程模板 +negative: + - 未安装 approve 插件时找不到入口 + - 不在右上「+」全局新建菜单里 + - 不支持全局快捷键 +last_verified: v1.7.90 +--- + +# 新建审批入口在哪 + +## 路径 +- 桌面端:左侧栏「应用」→ 卡片「审批」→ 进入审批中心 → 右上角「+ 发起审批」 +- 桌面端:审批中心顶部「已发起」Tab 内同样有「+ 发起」按钮 +- 移动端:底部 Tabbar「应用」→「审批」→ 右上「+」 +- 快捷键:无 + +## 权限要求 +- end-user 可发起 +- 要看到具体模板,须管理员先在「流程设置」配置 + +## 相关 +- 审批中心总览:[[approve.entry.menu-map]] +- 发起步骤:[[approve.start.howto]] +- 概念:[[approve.concept]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-group.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-group.md new file mode 100644 index 000000000..fbed2b569 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-group.md @@ -0,0 +1,39 @@ +--- +id: menu-navigation.new-group.menu-map +title: 新建群聊入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么建群 + - 新建群聊在哪 + - 创建群组入口 + - 拉群按钮 + - 怎么开群 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - 临时账号(temp)无法主动建群 + - 全员群和部门群由系统自动维护,不需要也不能手动新建 +last_verified: v1.7.90 +--- + +# 新建群聊入口在哪 + +## 路径 +- 桌面端:右上角「+」下拉 →「创建群组」 +- 桌面端:左侧栏「应用」→「创建群组」卡片 +- 桌面端:左侧栏「消息」→ 消息列表右上「+」→「新建群聊」 +- 桌面端:通讯录页面 → 勾选多名成员后顶部「发起群聊」 +- 移动端:底部 Tabbar「消息」→ 右上「+」→「发起群聊」 +- 移动端:底部 Tabbar「应用」→「创建群组」卡片 +- 桌面快捷键:Cmd/Ctrl + U + +## 权限要求 +- end-user 可建 +- 临时账号不可建群 + +## 相关 +- 完整建群步骤:[[messenger.group.howto.create]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-meeting.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-meeting.md new file mode 100644 index 000000000..5061d3348 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-meeting.md @@ -0,0 +1,40 @@ +--- +id: menu-navigation.new-meeting.menu-map +title: 新建会议入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么开会议 + - 新会议入口 + - 视频会议在哪 + - 发起会议按钮 +related_tools: [] +related_pages: [messenger] +prerequisites: + - 管理员已在「系统设置 → 会议」配置 Agora appid / 密钥 +negative: + - 未配置 Agora 时按钮可见但点了无效(弹错提示) + - 没有专门「会议列表」入口,历史会议以消息卡片留在对话中 +last_verified: v1.7.90 +--- + +# 新建会议入口在哪 + +## 路径 +- 桌面端:右上角「+」下拉 →「新会议」(直接弹出新建表单) +- 桌面端:右上角「+」下拉 →「加入会议」(输入会议号加入) +- 桌面端:左侧栏「应用」→「在线会议」卡片 +- 桌面端:对话窗口底部「+」→「会议」(自动预填邀请名单) +- 桌面端:消息列表长按联系人 →「发起会议」 +- 移动端:底部 Tabbar「+」→「新会议 / 加入会议」 +- 移动端:对话窗口底部「+」→「会议」 +- 桌面快捷键:Cmd/Ctrl + J(直开「新会议」) + +## 权限要求 +- end-user 即可创建和加入 + +## 相关 +- 完整入口与场景:[[meeting.entry.menu-map]] +- 创建步骤:[[meeting.create.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-project.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-project.md new file mode 100644 index 000000000..50dbfed65 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-project.md @@ -0,0 +1,38 @@ +--- +id: menu-navigation.new-project.menu-map +title: 新建项目入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么建项目 + - 新建项目在哪 + - 创建项目入口 + - 添加项目按钮 +related_tools: [create_project] +related_pages: [project_list] +prerequisites: [] +negative: + - 项目分组下没有专门的「+」按钮,必须走右上角全局「+」或应用中心 + - 临时账号(temp)可能受限于「禁止新建项目」的系统策略 +last_verified: v1.7.90 +--- + +# 新建项目入口在哪 + +## 路径 +- 桌面端:右上角「+」下拉 →「新建项目」 +- 桌面端:左侧栏「应用」→「创建项目」卡片 +- 桌面端:头像下拉菜单(管理员)→「所有项目」→ 右上「+」 +- 移动端:底部 Tabbar「应用」→「创建项目」卡片 +- 移动端:项目 Tab 右上角「+」 +- 桌面快捷键:Cmd/Ctrl + B + +## 权限要求 +- end-user 默认可建,由系统配置「project_create」开关控制 +- 不需要管理员权限 + +## 相关 +- 创建步骤、模板与工作流:[[project.create.howto]] +- 项目入口列表:[[project.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-report.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-report.md new file mode 100644 index 000000000..58d48a8b6 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-report.md @@ -0,0 +1,39 @@ +--- +id: menu-navigation.new-report.menu-map +title: 新建工作报告入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么写日报 + - 怎么写周报 + - 新建工作报告 + - 写汇报在哪 + - 新建报告按钮 +related_tools: [create_report] +related_pages: [] +prerequisites: [] +negative: + - 报告入口对普通成员在头像下拉显示「工作报告」,对管理员菜单中不出现,需要走「应用」 + - 没有全局快捷键 +last_verified: v1.7.90 +--- + +# 新建工作报告入口在哪 + +## 路径 +- 桌面端(普通成员):右上角头像 → 下拉菜单「工作报告」→ 右上角「+ 新建」 +- 桌面端(任何角色):左侧栏「应用」→「工作报告」卡片 → 右上角「+ 新建」 +- 移动端:底部 Tabbar「应用」→「工作报告」→ 右上「+」 +- 编辑独立页:URL 形如 `single/report/edit/` +- 快捷键:无 + +## 权限要求 +- end-user 可写可收,无需插件 +- 模板与汇报对象由系统设置控制 + +## 相关 +- 报告入口总览:[[report.entry.menu-map]] +- 创建步骤:[[report.create.howto]] +- 用 AI 自动生成模板:[[report.ai-generate.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/new-task.md b/resources/ai-kb/zh/menu-map/menu-navigation/new-task.md new file mode 100644 index 000000000..0ccb45525 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/new-task.md @@ -0,0 +1,41 @@ +--- +id: menu-navigation.new-task.menu-map +title: 新建任务入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么建任务 + - 新建任务入口 + - 新建任务在哪 + - 添加任务在哪 + - 添加任务入口 + - 我要加一条 todo +related_tools: [create_task] +related_pages: [project_detail, task_list, dashboard] +prerequisites: [] +negative: + - 主菜单没有「新建任务」一级菜单,必须从「+」按钮或项目内进入 + - 移动端没有桌面端那种 Cmd+K 快捷键,需用底部「+」 +last_verified: v1.7.90 +--- + +# 新建任务入口在哪 + +## 路径 +- 桌面端:左下角「+ 新建任务」蓝色主按钮(项目栏底部) +- 桌面端:右上角「+」下拉 →「新建任务」 +- 桌面端:进入某个项目后,右上角「+ 添加任务」/ 在任意列底部「+ 添加任务」 +- 桌面端:左侧栏「应用」→「添加任务」卡片(应用中心快捷入口) +- 移动端:底部 Tabbar「应用」→「添加任务」卡片 +- 移动端:项目详情页右上「+」 +- 桌面快捷键:Cmd/Ctrl + K(或 Cmd/Ctrl + N) + +## 权限要求 +- end-user 可见可用 +- 要把任务建到某个项目,需是该项目成员 + +## 相关 +- 完整建任务步骤:[[task.create.howto.quick]] +- 项目内建任务:[[project.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/notification-setting.md b/resources/ai-kb/zh/menu-map/menu-navigation/notification-setting.md new file mode 100644 index 000000000..882ce20d8 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/notification-setting.md @@ -0,0 +1,45 @@ +--- +id: menu-navigation.notification-setting.menu-map +title: 通知偏好设置入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 关闭通知在哪 + - 通知偏好设置 + - 静音消息在哪 + - 邮件通知怎么关 + - 推送怎么关 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 没有一站式「全部静音」开关,需要按渠道分别关 + - 关掉浏览器通知后桌面弹窗也会同时失效 +last_verified: v1.7.90 +--- + +# 通知偏好设置入口在哪 + +## 路径 +- 桌面端:右上角头像 →「个人设置」→「键盘设置 / 通知设置」子页(视版本) +- 桌面端:浏览器原生通知 → 浏览器地址栏锁形图标 → 网站权限 +- 桌面端 Electron:菜单栏 → 通知偏好(仅 Electron) +- 移动端:底部 Tabbar「我的」→「设置」→「通知 / 推送」 +- 移动端原生:系统设置 → 通知 → DooTask APP +- 快捷键:无 + +## 可调项 +- 浏览器 / 桌面端弹窗通知(on / off) +- 邮件通知(详见 [[email-notice.config.howto]]) +- 移动端 APP 推送(详见 [[push-notice.config.howto]]) +- 单个会话静音:消息列表中长按会话 →「免打扰」 + +## 权限要求 +- 所有登录用户可改 +- 部分系统级邮件(如管理员告警)由管理员设置 + +## 相关 +- 邮件通知入口:[[email-notice.config.howto]] +- APP 推送入口:[[push-notice.config.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/notifications.md b/resources/ai-kb/zh/menu-map/menu-navigation/notifications.md new file mode 100644 index 000000000..7ab774945 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/notifications.md @@ -0,0 +1,47 @@ +--- +id: menu-navigation.notifications.menu-map +title: 通知中心入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 通知在哪 + - 系统通知怎么看 + - 通知中心入口 + - 系统消息在哪 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - DooTask 没有独立的「通知中心」页面,所有系统通知都通过系统机器人单聊推送 + - 没有桌面端通知小铃铛入口 +last_verified: v1.7.90 +--- + +# 通知中心入口在哪 + +## 路径 +DooTask 的"通知"以系统机器人单聊形式存在,没有独立通知中心。 + +- 桌面端:左侧栏「消息」→ 列表里找系统机器人单聊: + - 「任务提醒」(task-alert@bot.system) + - 「签到机器人」(check-in@bot.system) + - 「审批助手」(approve@bot.system) + - 「系统消息」(system-msg@bot.system) +- 桌面端:搜索框输入机器人名(如「任务提醒」)直达 +- 移动端:底部 Tabbar「消息」→ 同样找系统机器人 +- 浏览器原生通知 / 桌面端弹窗也会同步推送 + +## 推送渠道 +- 浏览器:浏览器通知 API(需授权) +- 桌面端:系统通知中心 + 任务栏角标 +- 移动端:APP 推送(详见 [[push-notice.config.howto]]) +- 邮件:[[email-notice.config.howto]] + +## 权限要求 +- 所有登录用户可见 +- 通知偏好开关在「个人设置」中 + +## 相关 +- 通知偏好:[[menu-navigation.notification-setting.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/password-change.md b/resources/ai-kb/zh/menu-map/menu-navigation/password-change.md new file mode 100644 index 000000000..aef0d46c6 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/password-change.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.password-change.menu-map +title: 修改密码入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 改密码在哪 + - 修改密码入口 + - 怎么改登录密码 + - 重置密码按钮 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 忘记密码 / 重置密码(未登录场景)走登录页「忘记密码」流程,不走个人设置 + - LDAP / OAuth 账号通常无法在 DooTask 内改密,需到上游系统 +last_verified: v1.7.90 +--- + +# 修改密码入口在哪 + +## 路径 +- 桌面端:右上角头像 →「个人设置」→「密码设置」子页 +- 桌面端 URL:`/manage/setting/password` +- 桌面端:右上角头像 → 子菜单可能直接跳到「密码设置」(视版本) +- 移动端:底部 Tabbar「我的」→「设置」→「密码设置」 +- 快捷键:无 + +## 操作 +1. 输入旧密码 +2. 输入新密码(要求 6 位以上,含数字 + 字母) +3. 确认新密码 +4. 提交,下次登录用新密码 + +## 权限要求 +- 所有登录用户可改自己密码 +- LDAP / 第三方登录账号通常不可改 + +## 相关 +- 详细步骤:[[user-settings.password.howto]] +- 个人设置总览:[[user-settings.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/profile.md b/resources/ai-kb/zh/menu-map/menu-navigation/profile.md new file mode 100644 index 000000000..c12e211f2 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/profile.md @@ -0,0 +1,45 @@ +--- +id: menu-navigation.profile.menu-map +title: 个人资料入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 改头像在哪 + - 改昵称怎么改 + - 个人资料入口 + - 我的资料怎么编辑 + - profile 在哪 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 邮箱、手机号修改不在「个人设置」第一页,需进「修改邮箱」子页 + - 不能修改自己的部门,只能由管理员调整 +last_verified: v1.7.90 +--- + +# 个人资料入口在哪 + +## 路径 +- 桌面端:右上角头像下拉 →「个人设置」→「个人设置」(资料)子页 +- 桌面端 URL:`/manage/setting/personal` +- 桌面端:直接点左侧栏顶部自己的头像也可触发头像菜单 +- 移动端:底部 Tabbar「我的」→「设置」→ 资料 +- 快捷键:无 + +## 可编辑字段 +- 头像(点击头像上传图片) +- 昵称 +- 职位 / 性别 / 生日(视系统开关) +- 个人简介 + +## 权限要求 +- 所有登录用户可编辑自己的资料 +- 部门归属由管理员维护,本页不可改 + +## 相关 +- 个人设置总览:[[user-settings.entry.menu-map]] +- 修改资料步骤:[[user-settings.profile.howto]] +- 改邮箱:[[user-settings.email.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/recent.md b/resources/ai-kb/zh/menu-map/menu-navigation/recent.md new file mode 100644 index 000000000..b096b8650 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/recent.md @@ -0,0 +1,41 @@ +--- +id: menu-navigation.recent.menu-map +title: 最近打开入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 最近打开在哪 + - 最近浏览入口 + - 最近看过的任务怎么找 + - 历史浏览记录 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 「最近打开」只记录任务 / 文件 / 任务附件 / 消息附件,不包含项目和会话 + - 不支持手动清空全部记录 +last_verified: v1.7.90 +--- + +# 最近打开入口在哪 + +## 路径 +- 桌面端:头像下拉菜单顶部「最近打开的任务」→ 右侧二级菜单展开最近 10 条 +- 桌面端:在上述二级菜单底部点「查看更多...」→ 打开「最近打开」全屏弹窗 +- 桌面端:左侧栏「应用」→「最近打开」卡片 +- 移动端:底部 Tabbar「应用」→「最近打开」卡片 +- 快捷键:无 + +## 与"我的收藏"的区别 +- 最近打开:系统自动记录的访问记录 +- 我的收藏:用户主动收藏的对象 +- 详见 [[favorite.concept]] + +## 权限要求 +- 所有登录用户可见 +- 个人私有,不与他人共享 + +## 相关 +- 收藏与最近的总入口:[[favorite.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/search.md b/resources/ai-kb/zh/menu-map/menu-navigation/search.md new file mode 100644 index 000000000..d127abed3 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/search.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.search.menu-map +title: 全局搜索入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 怎么搜 + - 全局搜索在哪 + - 搜索框入口 + - 找东西的快捷键 + - 搜任务搜文件 +related_tools: [intelligent_search, search_dialogs, search_files, search_users] +related_pages: [] +prerequisites: [] +negative: + - 全局搜索框不是固定显示,需要快捷键或菜单触发 + - 移动端无 Cmd+F 快捷键,需要在消息 / 项目页内点搜索图标 +last_verified: v1.7.90 +--- + +# 全局搜索入口在哪 + +## 路径 +- 桌面端:任意页面按 Cmd/Ctrl + F 或 Cmd/Ctrl + /(`/`、`F` 同效) +- 桌面端:左侧栏顶部用户名旁的搜索图标(在部分版本里) +- 桌面端搜索框打开后默认聚焦输入框,输入关键词即时返回 +- 移动端:消息 Tab 顶部搜索栏(搜会话和消息) +- 移动端:项目页顶部搜索栏(搜任务) +- 移动端:通讯录 Tab 顶部搜索栏(搜人) + +## 搜索范围 +- 任务名 / 项目名 / 文件名 / 联系人 / 历史消息内容 +- 支持语义搜索(详见 [[search.concept]]) + +## 权限要求 +- end-user 可用 +- 结果只返回当前账号有权访问的对象 + +## 相关 +- 搜索能力总览:[[search.entry.menu-map]] +- 高级搜索语法:高级筛选 diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/system-setting.md b/resources/ai-kb/zh/menu-map/menu-navigation/system-setting.md new file mode 100644 index 000000000..141dcac3b --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/system-setting.md @@ -0,0 +1,43 @@ +--- +id: menu-navigation.system-setting.menu-map +title: 系统设置入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 系统设置在哪 + - 后台在哪 + - 管理后台入口 + - 系统配置怎么进 +related_tools: [] +related_pages: [] +prerequisites: + - 当前账号必须是系统管理员(identity 含 admin) +negative: + - 普通成员菜单中没有该项 + - 部分子项(License)仅超级管理员可改 + - 移动端通常不展示系统设置入口 +last_verified: v1.7.90 +--- + +# 系统设置入口在哪 + +## 路径 +- 桌面端:右上角头像下拉菜单 →「系统设置」(管理员可见) +- 桌面端 URL:`/manage/setting-system` +- 桌面端快捷键:无直达 +- 移动端:通常不显示,建议在桌面端 / 浏览器操作 + +## 主要子菜单 +- 通用 / 邮件 / 会议 / AI 设置 / AI 机器人 +- 签到 / APP 推送 / 第三方接入(LDAP / OAuth) +- 文件 / 任务优先级 / 列模板 / License + +## 权限要求 +- `admin` 才能看到入口 +- 部分项要超级管理员(id=1) + +## 相关 +- 系统设置详细子菜单:[[system-setting.entry.menu-map]] +- 通用设置:[[system-setting.general.howto]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/team-mgmt.md b/resources/ai-kb/zh/menu-map/menu-navigation/team-mgmt.md new file mode 100644 index 000000000..4028f5dc6 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/team-mgmt.md @@ -0,0 +1,46 @@ +--- +id: menu-navigation.team-mgmt.menu-map +title: 团队 / 部门管理入口在哪 +type: menu-map +feature: menu-navigation +scope: admin +locale: zh +aliases: + - 团队管理在哪 + - 部门管理入口 + - 怎么管理成员 + - 添加员工在哪 + - 用户管理 +related_tools: [search_users] +related_pages: [] +prerequisites: + - 需要系统管理员权限(普通成员看不到) +negative: + - 普通成员看不到「团队管理」入口 + - 不能用此页面改自己资料,自己资料在「个人设置」 + - 删除用户后任务归属不会自动迁移,需要先处理 +last_verified: v1.7.90 +--- + +# 团队 / 部门管理入口在哪 + +## 路径 +- 桌面端:右上角头像 →「团队管理」(管理员可见)→ 右侧 1380px 抽屉 +- 桌面端:右上角头像 →「团队管理」二级菜单也含「导出任务统计 / 超期任务 / 审批 / 签到」 +- 桌面端:左侧栏「应用」→「管理员」分组 →「团队管理」卡片 +- 移动端:底部 Tabbar「应用」→「管理员」→「团队管理」 +- 快捷键:无 + +## 能做什么 +- 新增 / 编辑 / 禁用 / 删除用户 +- 维护部门树(增删改 / 调整层级) +- 设置部门负责人 +- 批量分配 identity(admin / 普通) + +## 权限要求 +- `admin` 才能看到入口 +- 超管才能管理其他管理员 + +## 相关 +- 添加用户:[[user-account.import.howto]] +- 部门管理:[[org-department.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/menu-navigation/theme.md b/resources/ai-kb/zh/menu-map/menu-navigation/theme.md new file mode 100644 index 000000000..6cd080522 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/menu-navigation/theme.md @@ -0,0 +1,42 @@ +--- +id: menu-navigation.theme.menu-map +title: 切换主题入口在哪 +type: menu-map +feature: menu-navigation +scope: end-user +locale: zh +aliases: + - 暗色模式在哪 + - 深色主题怎么开 + - 主题切换入口 + - 夜间模式 + - 浅色 / 深色 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 不支持自定义主题色 / 上传背景图 + - 跟随系统模式需要浏览器 / 系统支持 `prefers-color-scheme` +last_verified: v1.7.90 +--- + +# 切换主题入口在哪 + +## 路径 +- 桌面端:右上角头像 →「个人设置」→「主题设置」子页 +- 桌面端 URL:`/manage/setting/theme` +- 移动端:底部 Tabbar「我的」→「设置」→「主题设置」 +- 快捷键:无 + +## 三个选项 +- 浅色(light) +- 深色(dark) +- 跟随系统(auto,按 `prefers-color-scheme`) + +## 权限要求 +- 所有登录用户可改 +- 个人偏好,不影响其他人 + +## 相关 +- 详细步骤:[[user-settings.theme.howto]] +- 个人设置入口:[[user-settings.entry.menu-map]] diff --git a/resources/ai-kb/zh/menu-map/messenger/entry.md b/resources/ai-kb/zh/menu-map/messenger/entry.md new file mode 100644 index 000000000..38514c041 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/messenger/entry.md @@ -0,0 +1,46 @@ +--- +id: messenger.entry.menu-map +title: 即时通讯入口 +type: menu-map +feature: messenger +scope: end-user +locale: zh +aliases: + - 即时通讯在哪 + - 怎么打开消息 + - 聊天入口 + - 消息中心 + - 聊天界面在哪 + - 打开消息面板 +related_tools: [search_dialogs] +related_pages: [messenger, dialog_chat] +prerequisites: [] +negative: + - 即时通讯没有独立的子路由,所有会话共用一个左侧栏「消息」入口 + - 未登录用户无法访问消息模块 +last_verified: v1.7.90 +--- + +# 即时通讯入口 + +DooTask 的「即时通讯」(也叫「消息」「聊天」)是内置 IM 模块,所有单聊、群聊、项目讨论、任务讨论、机器人消息都在这里。 + +## 路径 + +- 桌面端 Web:左侧主导航栏「消息」图标(气泡形状) +- 桌面端 Electron:同 Web;可通过任务栏图标小红点提示未读 +- 移动端:底部 Tabbar「消息」 +- 全局搜索:顶部搜索框可直接搜会话名 / 联系人 / 历史消息内容 + +打开后页面左侧是「会话列表」(按置顶时间 + 最后活跃时间倒序),右侧是当前会话的消息流。 + +## 权限要求 + +- 所有登录用户可见 +- 临时账号(temp)无法主动创建群组,但可参与项目讨论 / 任务讨论 +- 全员群、部门群由系统自动维护,普通成员不能解散 + +## 不支持 + +- 即时通讯模块不支持完全隐藏,仅能逐个隐藏单条会话(隐藏不等于退出) +- 不支持游客 / 未登录访问 diff --git a/resources/ai-kb/zh/menu-map/micro-app/entry.md b/resources/ai-kb/zh/menu-map/micro-app/entry.md new file mode 100644 index 000000000..bc0f61bfe --- /dev/null +++ b/resources/ai-kb/zh/menu-map/micro-app/entry.md @@ -0,0 +1,51 @@ +--- +id: micro-app.entry.menu-map +title: 微应用入口在哪 +type: menu-map +feature: micro-app +scope: end-user +locale: zh +aliases: + - 微应用在哪看到 + - 插件入口在哪 + - 找不到微应用 + - 应用图标在哪 + - 怎么打开微应用 +related_tools: [] +related_pages: [application] +prerequisites: [] +negative: + - 普通成员看不到 `visible_to: admin` 的微应用 + - 仅装了未配置菜单的插件,应用中心不会显示卡片 + - 微应用入口和应用市场入口不是同一个,前者是用、后者是装 +last_verified: v1.7.90 +--- + +# 微应用入口在哪 + +## 路径 +- 桌面端:左侧主导航「应用」→ 「常用」分区里夹杂的非系统卡片(图标来自插件资源) +- 桌面端:部分微应用经管理员配置可挂到「左侧主导航」(`location: main/menu`) +- 移动端竖屏:底部 Tabbar「应用」→ 滚动卡片网格 +- 快捷键:无 + +## 三种挂载位置 +- `location: application` → 应用中心「常用」分区(最常见) +- `location: application/admin` → 应用中心「管理员」分区(仅管理员可见) +- `location: main/menu` → 主导航顶层(如 OKR 安装后可注入) + +## 微应用卡片长什么样 +- 图标取自插件 `icon` 字段,背景与系统应用区分明显 +- 标签为插件 `label`(支持中英双语 JSON) +- 点击直接打开 iframe / 跳转目标 URL +- 不显示徽标(系统应用如审批 / 报告才有未读数) + +## 权限要求 +- end-user 看到所有 `visible_to: all` 的微应用 +- admin 额外看到 `visible_to: admin` 的微应用 +- 详见 [[micro-app.permission.concept]] + +## 相关 +- 微应用是什么:[[micro-app.concept]] +- 排序:[[micro-app.sort.howto]] +- 自定义菜单:[[micro-app.menu.concept]] diff --git a/resources/ai-kb/zh/menu-map/minder/entry.md b/resources/ai-kb/zh/menu-map/minder/entry.md new file mode 100644 index 000000000..b5e86b53f --- /dev/null +++ b/resources/ai-kb/zh/menu-map/minder/entry.md @@ -0,0 +1,51 @@ +--- +id: minder.entry.menu-map +title: 思维导图入口在哪 +type: menu-map +feature: minder +scope: end-user +locale: zh +aliases: + - 思维导图在哪 + - 找不到思维导图 + - 脑图入口 + - 怎么打开思维导图 + - 思维导图在哪个菜单 +related_tools: [] +related_pages: [file, application] +prerequisites: + - 应用市场已安装 minder 插件 +negative: + - 思维导图不是左侧栏一级菜单,要从「文件」页进入 + - 未安装 minder 插件时,文件新建菜单不会出现「思维导图」选项 + - 移动端入口与桌面端一致,仅交互略有不同 +last_verified: v1.7.90 +--- + +# 思维导图入口在哪 + +## 路径 +思维导图作为「文件」存在,没有独立的一级菜单,入口都在文件相关页面: + +- 桌面端:左侧栏「文件」→ 文件列表右上角「新建」→「思维导图」 +- 桌面端(右键):文件页空白区右键 →「新建」→「思维导图」 +- 桌面端(项目):进入项目详情 →「文件」标签页 → 新建菜单 →「思维导图」 +- 移动端:底部 Tabbar「文件」→ 选定目标文件夹 → 右下角「+」按钮 →「思维导图」 +- 已有 mind 文件:在文件列表直接双击/单击文件名即可打开 + +## 编辑器布局 +进入后页面被 iframe 全屏占用: +- 左下角浮动工具条:缩放、图形模板、主题切换、折叠层级、居中、移动模式 +- 节点直接双击即可编辑文本 + +## 权限要求 +- 普通成员:在自己有权访问的文件夹/项目内可建可编辑 +- 只读访问者:只能预览,无法编辑 + +## 看不到入口怎么办 +1. 确认应用市场已装 minder 插件(约 20MB,安装较慢) +2. 没有「新建」按钮通常是当前文件夹无写入权限,换文件夹再试 + +## 相关 +- 插件元信息:[[minder.plugin.concept]] +- 是什么:[[minder.concept]] diff --git a/resources/ai-kb/zh/menu-map/office/entry.md b/resources/ai-kb/zh/menu-map/office/entry.md new file mode 100644 index 000000000..9e4c75d41 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/office/entry.md @@ -0,0 +1,58 @@ +--- +id: office.entry.menu-map +title: 在线文档入口在哪 +type: menu-map +feature: office +scope: end-user +locale: zh +aliases: + - 在线文档在哪 + - 在线 Word 入口 + - 在哪建在线表格 + - office 在哪 + - 找不到在线 PPT +related_tools: [] +related_pages: [file, application] +prerequisites: + - 应用市场已安装 office(OnlyOffice)插件 +negative: + - 在线文档不是左侧栏一级菜单,要从「文件」页进入 + - 未安装 office 插件时,双击 Word/Excel/PPT 文件不会进入编辑器,只显示静态预览(依赖 fileview 插件) + - 没有「在线文档中心」这种独立页面,所有 office 文档散落在各自文件夹中 +last_verified: v1.7.90 +--- + +# 在线文档入口在哪 + +## 路径 +在线 Word/Excel/PPT 作为「文件」存在,没有独立的一级菜单,入口都在文件相关页面: + +- 桌面端:左侧栏「文件」→ 文件列表右上角「新建」→「Word 文档 / Excel 工作表 / PPT 演示文稿」 +- 桌面端(右键):文件页空白区右键 →「新建」→ 同上三选一 +- 桌面端(项目):进入项目详情 →「文件」标签页 → 新建菜单 → 同上三选一 +- 移动端:底部 Tabbar「文件」→ 选定目标文件夹 → 右下角「+」按钮 → 同上三选一 +- 已有文档:在文件列表直接双击/单击文件名即可打开编辑 + +## 上传后自动可编辑 +扩展名在以下列表内的上传文件,双击即可在线编辑(无需先转格式): +- Word 系:doc, docx, dot, dotx, odt, ott, rtf +- Excel 系:xls, xlsx, xlsm, xlt, xltx, ods, ots, csv, tsv +- PPT 系:ppt, pptx, pps, ppsx, pot, potx, odp, otp + +## 编辑器布局 +进入后页面被 iframe 全屏占用,由 OnlyOffice 提供完整菜单: +- 顶部:标题栏(含协作者头像)+ 菜单栏(文件、首页、插入、布局、引用、协作、视图等) +- 中部:文档编辑区 +- 右侧:批注、聊天、协作状态浮层 + +## 权限要求 +- 普通成员:在自己有权访问的文件夹/项目内可建可编辑 +- 只读访问者:只能预览,无法编辑 + +## 看不到入口怎么办 +1. 确认应用市场已装 office 插件(约 1.3GB,安装较慢) +2. 没有「新建」按钮通常是当前文件夹无写入权限,换文件夹再试 + +## 相关 +- 插件元信息:[[office.plugin.concept]] +- 是什么:[[office.concept]] diff --git a/resources/ai-kb/zh/menu-map/okr/entry.md b/resources/ai-kb/zh/menu-map/okr/entry.md new file mode 100644 index 000000000..d0cb91968 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/okr/entry.md @@ -0,0 +1,47 @@ +--- +id: okr.entry.menu-map +title: OKR 入口在哪里 +type: menu-map +feature: okr +scope: end-user +locale: zh +aliases: + - OKR 在哪 + - 怎么打开 OKR + - 找不到 OKR + - OKR 管理入口 + - OKR 结果在哪看 +related_tools: [] +related_pages: [application] +prerequisites: + - 应用市场已安装 okr 插件(约 15MB) +negative: + - 主程序不内置 OKR,未装插件时入口不会出现 + - 「OKR 结果」(OKR Analysis)入口仅系统管理员可见 +last_verified: v1.7.90 +--- + +# OKR 入口在哪里 + +## 路径 +OKR 由独立插件提供,安装后会在应用中心注册两个菜单项: + +- 桌面端:左侧栏「应用」→「OKR 管理」(对应 URL `apps/okr/list`) +- 移动端:底部 Tabbar「应用」→「OKR 管理」 +- 管理员视角:左侧栏「应用」→「管理员应用」→「OKR 结果」(对应 URL `apps/okr/analysis`,仅 admin 可见) + +## 加载方式 +两个入口都是 `url_type: inline`,会在 DooTask 主框架内嵌打开插件页面,不跳转到外部站点。 + +## 权限要求 +- 「OKR 管理」:所有已登录用户可见可用 +- 「OKR 结果」:只有系统管理员(`userIsAdmin`)能看到入口 + +## 看不到入口怎么办 +1. 确认应用市场已安装 okr 插件,参见 [[okr.cannot-install.faq]] +2. 安装较慢(约 15MB),首次安装后等几分钟刷新页面 +3. 「OKR 结果」入口缺失通常是因为当前用户不是系统管理员 + +## 相关 +- 插件元信息:[[okr.plugin.concept]] +- OKR 方法论:[[okr.concept]] diff --git a/resources/ai-kb/zh/menu-map/org-department/entry.md b/resources/ai-kb/zh/menu-map/org-department/entry.md new file mode 100644 index 000000000..ef4f457a5 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/org-department/entry.md @@ -0,0 +1,58 @@ +--- +id: org-department.entry.menu-map +title: 部门管理入口在哪 +type: menu-map +feature: org-department +scope: admin +locale: zh +aliases: + - 部门管理在哪 + - 怎么进部门管理 + - 部门入口 + - 团队管理在哪 + - 添加部门入口 + - 部门设置在哪 + - 找不到部门 +related_tools: [] +related_pages: [] +prerequisites: + - 需要系统管理员权限(userIsAdmin)才能看到管理后台「团队管理」入口 +negative: + - 普通成员**看不到**「团队管理」菜单;只能通过个人资料/头像查看自己所在部门 + - 移动端不提供完整的部门管理界面(仅管理后台桌面端可用) + - 「默认部门」表示未分配部门的成员,是系统内置,不能新建/删除/改名 + - 没有快捷键 +last_verified: v1.7.90 +--- + +# 部门管理入口在哪 + +## 路径 +- 桌面端:右上角头像菜单 → 「管理后台」→ 左侧菜单「团队管理」→ 顶部部门栏(左侧树形) +- 接口直接调用:`GET api/users/department/list`(限管理员) +- 快捷键:无 + +## 页面结构 +进入团队管理后页面分两栏: + +- **左侧部门树**:顶部「默认部门」+ 全部部门按 id 升序的树形列表 + - 每行:负责人头像、部门管理员头像(多人显示 +N)、部门名称、行尾「⋯」操作菜单 + - 底部按钮:「+ 新建部门」 +- **右侧成员列表**:选中部门后展示该部门成员,可搜索(关键词 = 邮箱 / 昵称 / 职位) + +## 部门行操作菜单(⋯) +| 操作 | 说明 | +|---|---| +| 添加子部门 | 见 [[org-department.add.howto]] | +| 部门交流群 | 跳转到该部门绑定的部门群 | +| 同步部门成员 | 见 [[org-department.sync.howto]] | +| 编辑 | 改名 / 改上级 / 改负责人 | +| 删除 | 红色文字;含子部门时无法删除 | + +## 权限要求 +- 管理后台入口仅 `userIsAdmin = true` 的系统管理员可见 +- 普通成员的「我的部门」查看走个人资料页(接口 `info/departments`),最多看到自己所在的 10 个部门 + +## 相关 +- 整体概念:[[org-department.concept]] +- 负责人视角(不同入口,普通成员也可触发):[[org-department.deputy-view.howto]] diff --git a/resources/ai-kb/zh/menu-map/project/entry.md b/resources/ai-kb/zh/menu-map/project/entry.md new file mode 100644 index 000000000..32a6db6ba --- /dev/null +++ b/resources/ai-kb/zh/menu-map/project/entry.md @@ -0,0 +1,52 @@ +--- +id: project.entry.menu-map +title: 项目入口在哪 +type: menu-map +feature: project +scope: end-user +locale: zh +aliases: + - 项目在哪 + - 怎么找项目 + - 项目入口 + - 项目列表 + - 进入项目 +related_tools: [list_projects] +related_pages: [project_list, dashboard] +prerequisites: [] +negative: + - 已归档项目默认不在主列表,要在筛选切到「已归档」 + - 已删除项目仅在回收站可见 + - 个人项目([[project.personal.concept]])也在同一列表,按类型筛选 +last_verified: v1.7.90 +--- + +# 项目入口在哪 + +## 路径 +- **桌面端**:左侧栏 → 「项目」分组 → 单击展开项目列表 +- **桌面端仪表盘**:顶部「我的项目」卡片 +- **桌面端右上「+」全局快捷**:「+ 添加项目」直接建项目([[project.create.howto]]) +- **移动端**:底部 Tabbar → 「项目」Tab +- **桌面快捷键**:Cmd/Ctrl + P 唤起项目快搜 + +## 项目列表里能看到什么 +- 项目名 + 图标 / emoji +- 项目类型标签(团队 / 个人) +- 任务进度(X/Y 完成) +- 置顶项目排在前面(top_at DESC) + +## 默认筛选 +- 「我加入的」(默认):仅显示 ProjectUser 命中你的 +- 「全部」:站点管理员可见全站 +- 「已归档」:archived_at 非空的项目 +- 按时间范围、按项目名搜 + +## 权限要求 +- 任何登录用户都能看到项目入口 +- 看到具体项目要求你已加入(ProjectUser),管理员可见全部 +- 加入项目方式:[[project.member.howto]] 被加 / [[project.invite.howto]] 链接邀请 + +## 不支持 +- 没有"未加入的可申请项目"列表,无法主动申请加入 +- 没有项目分组 / 文件夹(移动端 / 桌面端均扁平) diff --git a/resources/ai-kb/zh/menu-map/report/entry.md b/resources/ai-kb/zh/menu-map/report/entry.md new file mode 100644 index 000000000..0708d4e76 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/report/entry.md @@ -0,0 +1,43 @@ +--- +id: report.entry.menu-map +title: 工作报告入口在哪 +type: menu-map +feature: report +scope: end-user +locale: zh +aliases: + - 工作报告在哪 + - 工作汇报怎么打开 + - 周报入口 + - 日报在哪写 + - 怎么进报告页面 + - 打开汇报 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 「工作报告」不在左侧主导航栏,是右上角头像菜单 + 应用中心系统应用 + - 普通成员菜单显示「工作报告」;系统管理员菜单中不直接显示该项,可改走应用中心 +last_verified: v1.7.90 +--- + +# 工作报告入口在哪 + +## 路径 +- 桌面端(普通成员):右上角头像 → 下拉菜单「工作报告」 +- 桌面端(任何角色):左侧栏「应用」→ 系统应用「工作报告」卡片 +- 移动端:底部 Tabbar「我的」→「工作报告」 +- 详情独立页(分享后访问):`single/report/detail/` +- 编辑独立页:`single/report/edit/` +- 快捷键:无 + +## 打开后的界面 +顶部两个 Tab: +- **我发送的**:自己提交过的报告列表 [[report.my.howto]] +- **我收到的**:别人发给我的报告列表,带未读数 [[report.receive.howto]] + +右上角「+」可新建报告 [[report.create.howto]]。 + +## 权限要求 +- end-user 可见,所有登录用户都能写和收报告 +- 不需要插件,是主程序内置功能 diff --git a/resources/ai-kb/zh/menu-map/role-permission/entry.md b/resources/ai-kb/zh/menu-map/role-permission/entry.md new file mode 100644 index 000000000..6360b1c8e --- /dev/null +++ b/resources/ai-kb/zh/menu-map/role-permission/entry.md @@ -0,0 +1,59 @@ +--- +id: role-permission.entry.menu-map +title: 改成员角色 / 权限相关入口在哪 +type: menu-map +feature: role-permission +scope: end-user +locale: zh +aliases: + - 在哪改权限 + - 权限设置在哪 + - 怎么改角色 + - 团队管理在哪 + - 项目权限在哪改 + - 任务可见用户在哪设 + - 部门负责人在哪改 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 移动端无团队管理 / 部门管理 / LDAP 等系统级入口,必须在桌面端操作 + - 没有「全局权限设置」总入口,按场景分散在各模块 +last_verified: v1.7.90 +--- + +# 改成员角色 / 权限相关入口在哪 + +## 系统级(admin / 超管操作) +路径:右上角头像 → 「团队管理」(仅系统管理员可见) +- 设 / 取消系统管理员(setadmin / clearadmin) +- 设 / 取消临时账号(settemp / cleartemp) +- 设为离职 + 指定交接人(setdisable) +- 删除会员(delete) +- 修改部门归属(department) +权限要求:admin identity。详见 [[role-permission.grant-admin.howto]] 和 [[role-permission.transfer-owner.howto]] + +## 部门级 +路径:右上角头像 → 「团队管理」 → 「部门管理」标签 +- 修改部门负责人(owner_userid) +- 任命 / 罢免部门管理员(adddeputy / deldeputy) +权限要求:admin identity + +## 项目级 +路径:左侧栏「项目」 → 进项目 → 右上角项目设置(齿轮图标) +- 项目成员管理:改成员的项目角色(负责人 / 项目管理员 / 成员) +- 转让项目:换项目负责人 +- 项目权限策略:11 种动作粒度配置(添加列 / 删除任务等允许哪些角色) +权限要求:项目负责人或项目管理员。详见 [[role-permission.project-role.concept]] + +## 任务级 +路径:进任务详情页 +- 任务负责人:负责人区域 → 点选成员 +- 任务协助人:协助人区域 → 点选成员 +- 可见用户:可见性区域 → 添加用户名单(不设 = 全员可见) +权限要求:项目负责人或任务负责人。详见 [[role-permission.task-role.concept]] + +## 个人角色查询 +路径:右上角头像 → 「个人设置」 +- 查看自己所属部门、是否系统管理员 +- 系统管理员 / 部门负责人身份会显示在右上角下拉菜单顶部 diff --git a/resources/ai-kb/zh/menu-map/search/entry.md b/resources/ai-kb/zh/menu-map/search/entry.md new file mode 100644 index 000000000..5d4a6ef09 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/search/entry.md @@ -0,0 +1,47 @@ +--- +id: search.entry.menu-map +title: 全局搜索入口在哪 +type: menu-map +feature: search +scope: end-user +locale: zh +aliases: + - 搜索快捷键 + - 怎么打开搜索 + - 搜索框在哪 + - 搜索入口 + - Ctrl F + - Cmd F +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - "桌面端无顶部固定搜索栏按钮,主要通过快捷键唤起" + - "`Ctrl/Cmd + Shift + F` 不是全局搜索,会被浏览器或系统拦截" +last_verified: v1.7.90 +--- + +# 全局搜索入口在哪 + +## 路径 +- 桌面端:快捷键 `Ctrl + F` 或 `Cmd + F`(Mac)唤起全局搜索框 +- 桌面端备用快捷键:`Ctrl + /` 或 `Cmd + /` +- 桌面端:左侧栏「仪表盘」页面中的「全局搜索」入口卡片 +- 移动端:底部 Tabbar / 仪表盘内的搜索按钮,点击弹出全屏搜索 + +## 搜索框形态 +- 桌面端:居中弹窗,宽 768px,含输入框、5 个对象分类标签(任务 / 项目 / 消息 / 联系人 / 文件)和结果列表 +- 移动端(窗口宽 < 576px):自动全屏展开 + +## 在搜索框内的操作 +- 输入关键词后自动延时触发搜索(无需回车) +- 点击顶部标签可只看某一类对象的结果;再次点击取消筛选 +- 同时装了 search + ai 插件时,会出现「AI 搜索」按钮,把搜索词转给 AI 助手做语义对话 + +## 权限要求 +- 所有登录用户均可使用,无角色限制 +- 但搜索结果会按用户权限过滤(见各子接口的权限说明,如 [[search.contact.howto]]) + +## 不支持 +- 桌面端没有顶部常驻搜索栏,必须用快捷键或仪表盘入口 +- `Ctrl/Cmd + Shift + F` 已被快捷键路由忽略,不会触发全局搜索 diff --git a/resources/ai-kb/zh/menu-map/system-setting/entry.md b/resources/ai-kb/zh/menu-map/system-setting/entry.md new file mode 100644 index 000000000..e7eef29cc --- /dev/null +++ b/resources/ai-kb/zh/menu-map/system-setting/entry.md @@ -0,0 +1,55 @@ +--- +id: system-setting.entry.menu-map +title: 系统设置入口 +type: menu-map +feature: system-setting +scope: admin +locale: zh +aliases: + - 系统设置在哪 + - 怎么进后台 + - 怎么进管理后台 + - 系统配置页面 + - 管理后台入口 + - 在哪改系统配置 +related_tools: [] +related_pages: [] +prerequisites: + - 当前账号必须是系统管理员(identity 含 admin) +negative: + - 普通用户没有「系统设置」入口,左侧栏看不到 + - 部分子项(如 LDAP / License)需要进一步的权限或环境支持 +last_verified: v1.7.90 +--- + +# 系统设置入口 + +## 路径 +桌面端:左上角头像 → 下拉菜单 →「系统设置」(仅管理员可见)。 +打开后是一个左侧子菜单 + 右侧表单的二级页面,所有系统级配置都在这里。 + +移动端:通常不展示「系统设置」入口,需要使用桌面端或浏览器后台进行配置。 + +## 主要子菜单 +进入「系统设置」后,左侧子菜单按顺序通常包括: + +- **通用** — 注册策略、密码策略、消息撤回时长、自动归档等:[[system-setting.general.howto]] +- **邮件** — SMTP 服务器、注册验证邮件、未读消息提醒 +- **会议** — 声网 Agora 参数:[[system-setting.meeting.howto]] +- **AI 设置** — 配置 AI 模型供应商:[[system-setting.ai-model.howto]] +- **AI 机器人** — 关联机器人与默认模型:[[system-setting.ai-bot.howto]] +- **签到** — 打卡规则、地理围栏、人脸:[[system-setting.checkin.howto]] +- **APP 推送** — UMENG iOS/Android 推送配置 +- **第三方接入** — LDAP / OAuth:[[system-setting.third-access.howto]] +- **文件** — 文件打包下载权限:[[system-setting.file.howto]] +- **任务优先级** — 自定义颜色与天数:[[system-setting.priority.howto]] +- **列模板** — 创建项目时可选的预置列:[[system-setting.column-template.howto]] +- **License** — 终端授权:[[license.howto]] + +## 权限要求 +- 需要 `admin` 身份才能进入 +- 部分服务(License)仅超管可改 + +## 不支持 +- 普通成员(end-user)无入口 +- 配置项不下放到项目级或部门级,全部全局生效 diff --git a/resources/ai-kb/zh/menu-map/system-setting/menu-map.md b/resources/ai-kb/zh/menu-map/system-setting/menu-map.md new file mode 100644 index 000000000..d5b596264 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/system-setting/menu-map.md @@ -0,0 +1,50 @@ +--- +id: system-setting.menu-map +title: 系统设置页面总览 +type: menu-map +feature: system-setting +scope: admin +locale: zh +aliases: + - 系统设置页面有哪些 + - 系统设置 tab + - 任务优先级在哪改 + - 项目模板在哪 + - 文件设置在哪 + - 后台系统设置概览 +prerequisites: + - 当前账号必须是系统管理员 +related_tools: [] +related_pages: [] +negative: + - 移动端通常不展示「系统设置」入口,需用桌面端 / 网页后台 + - 普通成员看不到该页,无入口 + - 这 4 个 tab 只是「系统设置」一级菜单内的内容;邮件、AI、签到等是同级别的其他左侧菜单项,不在这个页内 +last_verified: v1.7.90 +--- + +# 系统设置页面总览 + +## 路径 +桌面端:左上角头像 → 下拉菜单 →「系统设置」(仅管理员可见)→ 左侧子菜单选「系统设置」一级项。 +打开后顶部是 4 个并列的 tab,对应同一 URL 下的 4 个子表单。 + +移动端:不展示,需用桌面端或浏览器后台。 + +## 4 个 tab 一句话目录 + +| Tab | name | 内容 | +|---|---|---| +| **系统设置** | `setting` | 全站通用开关:注册、密码、消息、视频、上传、欢迎语等几十项;详见 [[system-setting.general.howto]] | +| **任务优先级** | `taskPriority` | 自定义任务优先级的颜色、名称、提前提醒天数;详见 [[system-setting.priority.howto]] | +| **项目模板** | `columnTemplate` | 新建项目时可选的预置「列模板」清单(如 看板列、状态列);详见 [[system-setting.column-template.howto]] | +| **文件设置** | `fileSetting` | 文件相关策略(如打包下载权限、缩略图);详见 [[system-setting.file.howto]] | + +默认进入「系统设置」tab。切换 tab 不会重置已填未保存的表单值,但每个 tab 单独保存。 + +## 同级菜单(不在这 4 tab 内) +左侧子菜单的其他独立项见 [[system-setting.entry.menu-map]],包括邮件、会议、AI 设置、AI 机器人、签到、APP 推送、第三方接入、License 等。 + +## 权限要求 +- 需要 `admin` 身份才能打开整页 +- License 子项仅超级管理员可改 diff --git a/resources/ai-kb/zh/menu-map/user-account/entry.md b/resources/ai-kb/zh/menu-map/user-account/entry.md new file mode 100644 index 000000000..2e1c1ee90 --- /dev/null +++ b/resources/ai-kb/zh/menu-map/user-account/entry.md @@ -0,0 +1,57 @@ +--- +id: user-account.entry.menu-map +title: 账号相关入口在哪里 +type: menu-map +feature: user-account +scope: end-user +locale: zh +aliases: + - 个人设置在哪 + - 账号设置入口 + - 登录页在哪 + - 怎么找个人资料 + - 修改密码入口 + - 注销账号入口 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 账号管理类入口都在「个人设置」里,不在「应用中心」「系统设置」 + - 「系统设置 → 团队管理」是给系统管理员管别人账号用的,不是当前用户自己的账号设置入口 +last_verified: v1.7.90 +--- + +# 账号相关入口在哪里 + +## 登录 / 注册 +桌面端:浏览器访问 `/login`,或客户端启动时自动跳转 +- 注册:登录页底部「注册账号」链接(受 reg 模式控制,可能被隐藏,详见 [[user-account.reg-need-invite.concept]]) +- 扫码登录:登录页切到「扫码登录」tab + +## 个人设置(核心入口) +桌面端:右上角头像 →「个人设置」,分多个 tab: +- **个人资料**:昵称、头像、电话、生日、地址、个人简介 +- **账号安全**:修改密码、登录设备、注销账号 +- **通知设置**、**语言**:界面偏好(按版本可能拆到不同 tab) + +移动端:底部 Tabbar「我的」→ 顶部头像区 →「个人设置」 + +客户端:同桌面端 + +## 各动作入口速查 +| 想做的事 | 路径 | +|---|---| +| 注册账号 | 登录页底部「注册账号」 | +| 登录 | 登录页 | +| 扫码登录 | 登录页切到「扫码登录」tab | +| 退出登录 | 右上角头像 →「退出登录」 | +| 修改资料(昵称、头像等) | 右上角头像 →「个人设置 → 个人资料」 | +| 修改密码 | 右上角头像 →「个人设置 → 账号安全 → 修改密码」 | +| 设备管理 | 右上角头像 →「个人设置 → 账号安全 → 登录设备」 | +| 注销账号 | 右上角头像 →「个人设置 → 账号安全 → 注销账号」 | +| 邮箱验证 | 由系统自动发送邮件,点邮件链接跳转 | + +## 权限要求 +- 上述所有入口对 end-user 可见 +- 「团队管理」里改别人账号 / 批量导入用户需 admin +- 注销账号系统/演示账号被禁止 diff --git a/resources/ai-kb/zh/menu-map/user-settings/entry.md b/resources/ai-kb/zh/menu-map/user-settings/entry.md new file mode 100644 index 000000000..3d221612d --- /dev/null +++ b/resources/ai-kb/zh/menu-map/user-settings/entry.md @@ -0,0 +1,50 @@ +--- +id: user-settings.entry.menu-map +title: 个人设置入口 +type: menu-map +feature: user-settings +scope: end-user +locale: zh +aliases: + - 个人设置在哪 + - 设置在哪打开 + - 用户中心 + - 我的资料在哪 + - 修改密码入口 + - 怎么打开设置 +related_tools: [] +related_pages: [setting] +prerequisites: [] +negative: + - 个人设置没有移动端 Tabbar 一级入口,需先进「我的」再进设置 + - 未登录用户没有「个人设置」入口 +last_verified: v1.7.90 +--- + +# 个人设置入口 + +「个人设置」(也叫「设置」「用户中心」)是 DooTask 单个用户管理自己资料、密码、邮箱、语言、主题、签到偏好等的页面。所有项都只影响当前账号自己,不影响他人。 + +## 路径 + +- 桌面端 Web / Electron:右上角头像 → 下拉菜单「设置」 +- 桌面端快捷键:Cmd/Ctrl + ,(Electron 才有) +- 移动端:底部 Tabbar「我的」→「设置」 +- 路由:`/manage/setting/personal`(默认子页),其他子页为 `/manage/setting/` + +## 子页清单(按菜单顺序) + +- 个人设置(资料)→ [[user-settings.profile.howto]] +- 密码设置 → [[user-settings.password.howto]] +- 修改邮箱 → [[user-settings.email.howto]] +- 语言设置 → [[user-settings.language.howto]] +- 主题设置 → [[user-settings.theme.howto]] +- 键盘设置(仅 Electron / 移动端)→ [[user-settings.shortcut.concept]] +- 系统设置 / License Key(仅系统管理员可见) +- 更新日志 / 版本 / 登录设备 / 清除缓存 / 退出登录 + +## 权限要求 + +- 所有登录用户可见 +- 「系统设置」「License Key」需 `userIsAdmin` +- 「删除帐号」仅 EEUI 移动端(自助注销入口) diff --git a/resources/ai-kb/zh/shortcut/.gitkeep b/resources/ai-kb/zh/shortcut/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/resources/ai-kb/zh/shortcut/dialog.md b/resources/ai-kb/zh/shortcut/dialog.md new file mode 100644 index 000000000..73796bdbc --- /dev/null +++ b/resources/ai-kb/zh/shortcut/dialog.md @@ -0,0 +1,47 @@ +--- +id: shortcut.dialog.shortcut +title: 弹窗与抽屉关闭快捷键 +type: shortcut +feature: shortcut +scope: end-user +locale: zh +aliases: + - 关闭弹窗 + - 关闭对话框 + - Esc 关闭 + - 怎么关掉这个窗口 + - 关闭抽屉 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 重要的二次确认弹窗(删除、退出群、撤销审批等)不响应 Esc,必须显式点「取消」 + - 全屏会议、文档编辑全屏模式不响应 Esc,需点界面退出按钮 +last_verified: v1.7.90 +--- + +# 弹窗与抽屉关闭快捷键 + +DooTask 的对话框 / 抽屉 / 详情面板的关闭方式。 + +| 弹窗类型 | 关闭快捷键 | 其他关闭方式 | +|---|---|---| +| 普通对话框(Modal) | Esc | 右上角 × 或点击遮罩 | +| 任务详情抽屉 | Esc | 右上角 × 或点击遮罩 | +| 聊天侧栏 / 文件预览 | Esc | 右上角 × | +| 新建任务 / 新建项目 / 新建群组 | Esc | 右上角 × 或「取消」按钮 | +| AI 助手浮窗 | Esc | 右上角 × 或再按一次 Cmd/Ctrl + I | +| 设置抽屉 | Esc | 右上角 × | +| 二次确认弹窗(删除、退出、撤销等) | (无)只能点按钮 | 「确认」/「取消」按钮 | +| 全屏会议 | (无)点界面退出按钮 | 「离开会议」按钮 | +| 全屏文档(office / minder) | (无)点退出按钮 | 退出全屏按钮 | + +## 退出前的提示 +- 任务详情、文档、消息输入框中有未保存内容时,Esc 会弹出确认;点「确认离开」才会丢弃改动 +- 某些表单弹窗在输入 / 编辑状态下,第一次 Esc 先作用于编辑控件(取消编辑态),需要再按一次 Esc 才关闭弹窗 +- 移动端「Esc」不可用,统一用左上角「返回」或屏幕手势 + +## 不支持 +- 重要二次确认弹窗不响应 Esc(避免误触造成数据丢失) +- 全屏会议 / 全屏文档编辑不响应 Esc +- 没有「Esc 一键关所有弹窗」的能力,每按一次只关最上层 diff --git a/resources/ai-kb/zh/shortcut/global.md b/resources/ai-kb/zh/shortcut/global.md new file mode 100644 index 000000000..541241e66 --- /dev/null +++ b/resources/ai-kb/zh/shortcut/global.md @@ -0,0 +1,48 @@ +--- +id: shortcut.global.shortcut +title: 全局快捷键 +type: shortcut +feature: shortcut +scope: end-user +locale: zh +aliases: + - 全局快捷键 + - 系统快捷键 + - 常用快捷键 + - AI 助手快捷键 + - 搜索快捷键 + - DooTask 怎么呼出 AI + - 搜索的快捷键是什么 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 浏览器端只有在焦点不在输入框 / 富文本编辑器内时才响应 + - AI 助手快捷键仅在 AI 微应用已安装时生效 + - 移动端无键盘快捷键,需通过界面按钮触发 +last_verified: v1.7.90 +--- + +# 全局快捷键 + +DooTask 全局可用的快捷键,主要在桌面端(Electron 客户端、Chrome / Safari 等浏览器)生效。下表中 macOS 用 Cmd,Windows / Linux 用 Ctrl。 + +| 操作 | Windows / Linux | macOS | 移动端 | +|---|---|---|---| +| 打开搜索 | Ctrl + F 或 Ctrl + / | Cmd + F 或 Cmd + / | (无) | +| 呼出 AI 助手 | Ctrl + I | Cmd + I | (无) | +| 新建任务 | Ctrl + N 或 Ctrl + K | Cmd + N 或 Cmd + K | (无) | +| 新建项目 | Ctrl + B | Cmd + B | (无) | +| 新建会议 | Ctrl + J | Cmd + J | (无) | +| 创建群组 | Ctrl + U | Cmd + U | (无) | +| 进入设置 | Ctrl + , | Cmd + , | (无) | +| 下载内容(仅 Electron) | Ctrl + Alt + L | Cmd + Option + L | (无) | +| 截图(仅 Electron) | 可在「设置 → 快捷键」中自定义 | 可在「设置 → 快捷键」中自定义 | (无) | + +## 修改方式 +桌面端:右上角头像 →「设置」→「快捷键」中可修改截图、消息发送按钮(Enter / Cmd+Enter)等。其余组合键固定,不支持改键。 + +## 不支持 +- 浏览器端只在焦点不在输入框 / 富文本编辑器内时才响应这些快捷键 +- 未安装 AI 微应用时,AI 助手快捷键(Cmd/Ctrl+I)不生效 +- 移动端不提供键盘快捷键 diff --git a/resources/ai-kb/zh/shortcut/messenger.md b/resources/ai-kb/zh/shortcut/messenger.md new file mode 100644 index 000000000..734bb4884 --- /dev/null +++ b/resources/ai-kb/zh/shortcut/messenger.md @@ -0,0 +1,44 @@ +--- +id: shortcut.messenger.shortcut +title: 消息发送快捷键 +type: shortcut +feature: shortcut +scope: end-user +locale: zh +aliases: + - 发消息快捷键 + - 消息撤回 + - 怎么换行不发送 + - Enter 发送 + - Cmd Enter 发送 + - 发送按钮设置 +related_tools: [] +related_pages: [messenger] +prerequisites: [] +negative: + - 撤回限时 24 小时内,超时不能撤回 + - 没有专门的「撤回快捷键」,撤回需在消息右键 / 长按菜单中触发 + - 移动端没有快捷键,发送 / 换行行为通过「设置 → 快捷键 → 发送按钮」切换 +last_verified: v1.7.90 +--- + +# 消息发送快捷键 + +聊天输入框的发送 / 换行规则,可在「设置 → 快捷键 → 发送按钮」中切换。 + +| 操作 | 桌面端(Enter 模式,默认) | 桌面端(Cmd/Ctrl+Enter 模式) | 移动端 | +|---|---|---|---| +| 发送消息 | Enter | Ctrl + Enter / Cmd + Enter | 软键盘「发送」键 或 屏幕「发送」按钮 | +| 换行 | Shift + Enter | Enter | 软键盘换行键 | +| @ 提及成员 | 输入 @ | 输入 @ | 输入 @ | +| 引用回复 | 在消息上右键 / 悬停菜单 →「回复」 | 同左 | 长按消息 →「回复」 | +| 撤回消息 | 在自己 24 小时内的消息上右键 →「撤回」 | 同左 | 长按消息 →「撤回」 | +| 关闭聊天会话 | Esc | Esc | 左滑返回 | + +## 切换发送模式 +桌面端:右上角头像 →「设置」→「快捷键」→「发送按钮」,可在「Enter 发送」与「Cmd/Ctrl + Enter 发送」之间切换。移动端:同入口下,「开启」=换行键替换为「发送」按钮,「关闭」=发送键替换为换行。 + +## 不支持 +- 没有「撤回」专用快捷键,只能在消息菜单里点 +- 超过 24 小时无法撤回(撤回有时限,超时按钮变灰) +- 发送模式切换是用户级设置,不能按会话或按群单独配置 diff --git a/resources/ai-kb/zh/shortcut/mobile-gesture.md b/resources/ai-kb/zh/shortcut/mobile-gesture.md new file mode 100644 index 000000000..73de49ba6 --- /dev/null +++ b/resources/ai-kb/zh/shortcut/mobile-gesture.md @@ -0,0 +1,51 @@ +--- +id: shortcut.mobile-gesture.shortcut +title: 移动端手势 +type: shortcut +feature: shortcut +scope: end-user +locale: zh +aliases: + - 移动端手势 + - 手机怎么操作 + - App 滑动 + - 长按 + - 移动端怎么撤回消息 + - App 手势操作 +related_tools: [] +related_pages: [] +prerequisites: [] +negative: + - 移动端不支持任何键盘快捷键(手机无物理键盘) + - 任务列表不支持「滑动完成」「滑动归档」(与左滑返回手势冲突) + - 没有「摇一摇」「双击侧栏」等隐藏手势 +last_verified: v1.7.90 +--- + +# 移动端手势 + +DooTask 移动端(EEUIApp / 浏览器移动版)的常用手势。 + +| 操作 | 手势 | 入口 | +|---|---|---| +| 返回上一级 | 左侧右滑(边缘) | 任意二级页面 | +| 关闭任务详情 | 左侧右滑 或 点左上角「返回」 | 任务详情页 | +| 撤回消息 | 长按自己的消息 → 菜单选「撤回」 | 聊天会话内(24 小时内) | +| 引用回复 | 长按消息 → 菜单选「回复」 | 聊天会话内 | +| 转发 / 收藏 / 删除消息 | 长按消息 → 菜单选项 | 聊天会话内 | +| 切换 Tab | 点底部 Tabbar 图标 | 主界面底部 | +| 上拉加载更多 | 列表底部上滑 | 任务 / 消息 / 文件列表 | +| 下拉刷新 | 列表顶部下拉 | 任务 / 消息 / 文件列表 | +| 选项菜单 | 右上角「···」 | 大部分二级页面 | +| 拖动 AI 助手浮按钮 | 长按浮按钮拖动,松手贴边 | 任意页面 | +| 收起 AI 助手浮按钮 | 拖到屏幕边缘自动半隐藏 | 任意页面 | + +## 与桌面端的差异 +- 不支持物理键盘快捷键,所有操作通过手势或按钮触发 +- 没有右键菜单,统一用「长按」呼出菜单 +- 抽屉 / 对话框统一通过左上角「返回」或左滑关闭 + +## 不支持 +- 任务列表不支持「左滑完成 / 右滑归档」,避免与系统返回手势冲突 +- 没有「摇一摇」「双击 Tabbar 回顶」等隐藏手势 +- 全屏会议 / 文档编辑不响应返回手势,需点界面按钮退出 diff --git a/resources/ai-kb/zh/shortcut/task.md b/resources/ai-kb/zh/shortcut/task.md new file mode 100644 index 000000000..2b93149de --- /dev/null +++ b/resources/ai-kb/zh/shortcut/task.md @@ -0,0 +1,48 @@ +--- +id: shortcut.task.shortcut +title: 任务编辑快捷键 +type: shortcut +feature: shortcut +scope: end-user +locale: zh +aliases: + - 任务快捷键 + - 任务编辑快捷键 + - 任务怎么保存 + - 怎么快速建任务 + - 保存任务的快捷键 +related_tools: [] +related_pages: [task_detail, project_detail] +prerequisites: [] +negative: + - 任务详情页的保存仅在「内容 / 描述」有未保存改动时才会生效 + - 任务里没有撤销 / 重做(Cmd+Z)的快捷键,富文本编辑器内的 Ctrl+Z 仅作用于当前编辑器 +last_verified: v1.7.90 +--- + +# 任务编辑快捷键 + +任务相关的桌面端快捷键。macOS 用 Cmd,Windows / Linux 用 Ctrl。 + +| 操作 | Windows / Linux | macOS | 移动端 | +|---|---|---|---| +| 新建任务 | Ctrl + N 或 Ctrl + K | Cmd + N 或 Cmd + K | 点击底部「+」按钮 | +| 保存任务内容 | Ctrl + S | Cmd + S | 点击「保存」按钮 | +| 保存任务名修改 | Enter(任务名输入框内) | Enter | 软键盘 Enter | +| 任务名内换行 | Shift + Enter | Shift + Enter | (无) | +| 关闭任务详情 | Esc | Esc | 滑动关闭 / 点击左上角返回 | +| 子任务确认输入 | Enter | Enter | 软键盘 Enter | + +## 触发条件 +- Ctrl/Cmd + N / K:在任意页面均可,弹出新建任务对话框 +- Ctrl/Cmd + S:仅在任务详情页且「内容」字段有未保存改动时生效,保存正文 +- 任务名输入框:按回车直接保存修改,Shift+回车换行 +- Esc:仅在任务详情抽屉打开时关闭抽屉,关闭前若有未保存内容会有二次确认 + +## 富文本编辑器 +任务「详细描述」使用 TinyMCE 富文本编辑器,编辑器内支持通用富文本快捷键,如 Ctrl/Cmd + B 加粗、Ctrl/Cmd + I 斜体、Ctrl/Cmd + Z 撤销(仅作用于编辑器内部)。 + +## 不支持 +- 任务内的「撤销 / 重做」没有全局快捷键,富文本里的 Ctrl/Cmd+Z 只作用于当前编辑器 +- 任务列表 / 看板视图内不支持方向键移动选中任务 +- 状态切换、设置优先级等没有快捷键,需要点击菜单 diff --git a/resources/assets/js/components/AIAssistant/index.vue b/resources/assets/js/components/AIAssistant/index.vue index f7ecb05f3..93095e710 100644 --- a/resources/assets/js/components/AIAssistant/index.vue +++ b/resources/assets/js/components/AIAssistant/index.vue @@ -1004,10 +1004,14 @@ export default { * 请求 stream_key */ async fetchStreamKey({model_type, model_name, context}) { + // ai-kb 检索语种;'zh' / 'en'。基于 localStorage 当前语言简单映射 + const lang = (window.localStorage.getItem('__system:languageName__') || 'zh').toLowerCase(); + const locale = lang.startsWith('en') ? 'en' : 'zh'; const payload = { model_type, model_name, context: JSON.stringify(context || []), + locale, }; const {data} = await this.$store.dispatch("call", { url: 'assistant/auth',