From 840673bda5d2a76e132f6c162e9f9aa157eb9a9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com>
Date: Fri, 11 Sep 2026 17:00:23 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BA=BF=E7=B4=A2=E3=80=81?=
=?UTF-8?q?=E5=95=86=E6=9C=BA=E3=80=81=E9=A1=B9=E7=9B=AE=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E5=BC=80=E5=8F=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
$null | 1 +
.codebuddy/commands/mcp.md | 0
backend/components.d.ts | 3 +-
backend/src/api/crmPipeline.js | 36 ++
.../apps/crm/business/components/detail.vue | 170 ++++++
.../crm/business/components/detail_attach.vue | 156 +++++
.../crm/business/components/detail_basic.vue | 60 ++
.../business/components/detail_contact.vue | 176 ++++++
.../crm/business/components/detail_follow.vue | 315 ++++++++++
.../crm/business/components/detail_log.vue | 63 ++
backend/src/views/apps/crm/business/index.vue | 55 +-
.../apps/crm/clue/components/convert.vue | 2 +-
.../views/apps/crm/clue/components/detail.vue | 576 +++---------------
.../crm/clue/components/detail_attach.vue | 156 +++++
.../apps/crm/clue/components/detail_basic.vue | 44 ++
.../crm/clue/components/detail_contact.vue | 172 ++++++
.../crm/clue/components/detail_follow.vue | 315 ++++++++++
.../apps/crm/clue/components/detail_log.vue | 63 ++
backend/src/views/apps/crm/clue/index.vue | 22 +-
backend/src/views/apps/crm/customer/index.vue | 4 +-
backend/src/views/apps/crm/dict.js | 6 +
.../views/apps/crm/follow/components/edit.vue | 21 +
backend/src/views/apps/crm/follow/index.vue | 121 +++-
.../apps/crm/project/components/detail.vue | 182 ++++++
.../crm/project/components/detail_attach.vue | 156 +++++
.../crm/project/components/detail_basic.vue | 42 ++
.../crm/project/components/detail_contact.vue | 378 ++++++++++++
.../crm/project/components/detail_docs.vue | 507 +++++++++++++++
.../crm/project/components/detail_follow.vue | 315 ++++++++++
.../crm/project/components/detail_log.vue | 63 ++
backend/src/views/apps/crm/project/index.vue | 27 +-
go/controllers/backend_crm_business.go | 13 +-
go/controllers/backend_crm_clue.go | 9 +-
go/controllers/backend_crm_pipeline_common.go | 134 +++-
go/controllers/backend_crm_pool.go | 2 +-
go/controllers/backend_crm_project.go | 363 ++++++++++-
go/controllers/backend_crm_support.go | 134 +++-
go/controllers/backend_erp_customer.go | 2 +-
go/models/init.go | 9 +
go/models/tenant_crm_attach.go | 4 +-
go/models/tenant_crm_business.go | 5 +-
go/models/tenant_crm_clue.go | 4 +-
go/models/tenant_crm_entity_contact.go | 4 +-
go/models/tenant_crm_follow.go | 5 +-
go/models/tenant_crm_operate_log.go | 4 +-
go/models/tenant_crm_project.go | 8 +-
go/routers/backend/backend.go | 7 +
go/services/crm_project_doc.go | 271 ++++++++
sql/alter_company_contact_unify.sql | 2 +-
sql/alter_crm_follow_add_stage.sql | 40 ++
...lter_crm_pipeline_add_contact_position.sql | 49 +-
sql/alter_crm_project_add_doc_category.sql | 14 +
sql/alter_crm_rename_to_backend_prefix.sql | 69 +++
sql/fix_crm_owner_user_name.sql | 102 ++++
sql/yz_backend_crm_pipeline.sql | 30 +-
55 files changed, 4866 insertions(+), 625 deletions(-)
create mode 100644 $null
create mode 100644 .codebuddy/commands/mcp.md
create mode 100644 backend/src/views/apps/crm/business/components/detail.vue
create mode 100644 backend/src/views/apps/crm/business/components/detail_attach.vue
create mode 100644 backend/src/views/apps/crm/business/components/detail_basic.vue
create mode 100644 backend/src/views/apps/crm/business/components/detail_contact.vue
create mode 100644 backend/src/views/apps/crm/business/components/detail_follow.vue
create mode 100644 backend/src/views/apps/crm/business/components/detail_log.vue
create mode 100644 backend/src/views/apps/crm/clue/components/detail_attach.vue
create mode 100644 backend/src/views/apps/crm/clue/components/detail_basic.vue
create mode 100644 backend/src/views/apps/crm/clue/components/detail_contact.vue
create mode 100644 backend/src/views/apps/crm/clue/components/detail_follow.vue
create mode 100644 backend/src/views/apps/crm/clue/components/detail_log.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_attach.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_basic.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_contact.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_docs.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_follow.vue
create mode 100644 backend/src/views/apps/crm/project/components/detail_log.vue
create mode 100644 go/services/crm_project_doc.go
create mode 100644 sql/alter_crm_follow_add_stage.sql
create mode 100644 sql/alter_crm_project_add_doc_category.sql
create mode 100644 sql/alter_crm_rename_to_backend_prefix.sql
create mode 100644 sql/fix_crm_owner_user_name.sql
diff --git a/$null b/$null
new file mode 100644
index 0000000..32eecff
--- /dev/null
+++ b/$null
@@ -0,0 +1 @@
+mysql: [Warning] Using a password on the command line interface can be insecure.
diff --git a/.codebuddy/commands/mcp.md b/.codebuddy/commands/mcp.md
new file mode 100644
index 0000000..e69de29
diff --git a/backend/components.d.ts b/backend/components.d.ts
index 2f3d0d6..50d3e79 100644
--- a/backend/components.d.ts
+++ b/backend/components.d.ts
@@ -21,14 +21,12 @@ declare module 'vue' {
ElButton: typeof import('element-plus/es')['ElButton']
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
ElCard: typeof import('element-plus/es')['ElCard']
- ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElCollapseTransition: typeof import('element-plus/es')['ElCollapseTransition']
- ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
@@ -46,6 +44,7 @@ declare module 'vue' {
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
+ ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
diff --git a/backend/src/api/crmPipeline.js b/backend/src/api/crmPipeline.js
index c482bde..533a39c 100644
--- a/backend/src/api/crmPipeline.js
+++ b/backend/src/api/crmPipeline.js
@@ -82,6 +82,42 @@ export function deleteProject(id) {
return request({ url: `/backend/crm/project/${id}`, method: "delete" });
}
+/* --------------------------- 项目文档(OA 文档库) --------------------------- */
+
+/**
+ * 项目文档列表:对应文档库「共享文档 / 项目文档 / {项目名称}」文件夹(含子文件夹)。
+ * 存量项目在首次调用时自动补建文件夹。
+ */
+export function getProjectDocs(id, params) {
+ return request({ url: `/backend/crm/project/${id}/docs`, method: "get", params });
+}
+
+/**
+ * 上传项目文档:文件先经 POST /backend/uploadfile 上传,
+ * 再调用本接口写入文档库项目文件夹并同步登记 CRM 附件。
+ */
+export function uploadProjectDoc(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-upload`, method: "post", data });
+}
+
+/** 删除项目文档:同步软删文档库文档与对应 CRM 附件记录 */
+export function deleteProjectDoc(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-delete`, method: "post", data });
+}
+
+/**
+ * 新建项目文档文件夹(对应文档库中项目文件夹下的子分类),用于分类存放文档。
+ * data: { name, parent_id },parent_id 缺省时建在项目根文件夹下。
+ */
+export function createProjectDocFolder(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-folder`, method: "post", data });
+}
+
+/** 删除项目文档文件夹(需为空:无子文件夹、无文档;项目根文件夹不可删除) */
+export function deleteProjectDocFolder(id, data) {
+ return request({ url: `/backend/crm/project/${id}/doc-folder-delete`, method: "post", data });
+}
+
/* --------------------------------- 回访 --------------------------------- */
export function getFollowList(params) {
diff --git a/backend/src/views/apps/crm/business/components/detail.vue b/backend/src/views/apps/crm/business/components/detail.vue
new file mode 100644
index 0000000..915b4d4
--- /dev/null
+++ b/backend/src/views/apps/crm/business/components/detail.vue
@@ -0,0 +1,170 @@
+
+
+
推进商机阶段,达成后可转化为项目;转化后商机将锁定不可编辑
+推进商机阶段,达成后可转化为项目
登记潜在客户线索,跟进后可转化为商机;转化后线索将锁定不可编辑
+登记潜在客户线索,跟进后可转化为商机