From 4455b95e376c2136cb98c522f0dfbd98aa68672f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=89=AB=E5=9C=B0=E5=83=A7?= <357099073@qq.com>
Date: Sat, 12 Sep 2026 23:29:45 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=90=88=E5=90=8C=E4=B8=AA?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E5=92=8C=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/src/api/crmDashboard.js | 14 +
backend/src/api/crmPayback.js | 49 ++
.../crm/contract/components/DevModuleTree.vue | 165 ++++
.../crm/contract/components/ModuleNode.vue | 119 +++
.../crm/contract/components/ProductList.vue | 166 +++-
.../apps/crm/contract/components/create.vue | 67 +-
.../apps/crm/contract/components/detail.vue | 357 ++++----
.../crm/contract/components/detail_basic.vue | 209 +++++
.../contract/components/detail_payback.vue | 151 ++++
.../apps/crm/contract/components/utils.js | 35 +
backend/src/views/apps/crm/contract/index.vue | 156 ++--
.../apps/crm/customer/components/edit.vue | 28 +-
.../src/views/apps/crm/dashboard/index.vue | 298 ++-----
backend/src/views/apps/crm/dict.js | 133 +++
.../apps/crm/payback/components/create.vue | 763 ++++++++++++++++++
.../apps/crm/payback/components/detail.vue | 260 ++++++
backend/src/views/apps/crm/payback/index.vue | 661 ++++++++++++++-
.../apps/crm/product/components/edit.vue | 71 +-
.../apps/crm/project/components/detail.vue | 57 +-
.../crm/project/components/detail_attach.vue | 596 +++++++++++++-
.../project/components/detail_contract.vue | 8 +-
backend/src/views/apps/crm/project/index.vue | 62 +-
.../apps/crm/supplier/components/edit.vue | 28 +-
go/controllers/backend_crm_contract.go | 117 ++-
go/controllers/backend_crm_dashboard.go | 387 +++++++++
go/controllers/backend_crm_payback.go | 646 +++++++++++++++
go/controllers/backend_crm_product.go | 63 +-
go/controllers/backend_crm_support.go | 36 +-
go/docs/sql/add_storage_config_table.sql | 18 -
.../alter_backend_ai_chat_message_images.sql | 3 -
.../alter_backend_ai_chat_message_stats.sql | 6 -
go/docs/sql/alter_backend_crm_overdue.sql | 63 ++
.../alter_backend_crm_payback_plan_date.sql | 42 +
.../sql/alter_backend_crm_payback_receipt.sql | 12 +
...er_backend_crm_project_products_column.sql | 15 -
.../alter_system_files_storage_columns.sql | 93 ---
go/docs/sql/yz_backend_crm_product.sql | 29 -
.../sql/yz_backend_crm_product_category.sql | 19 -
go/docs/sql/yz_complaint.sql | 45 --
go/docs/sql/yz_oa_document.sql | 129 ---
.../yz_platform_cursor_activation_code.sql | 31 -
go/docs/sql/yz_software_upgrade.sql | 26 -
go/models/init.go | 69 ++
go/models/tenant_crm_contract.go | 1 +
go/models/tenant_crm_payback.go | 47 ++
go/models/tenant_crm_product.go | 7 +-
go/routers/backend/backend.go | 10 +
sql/add_contacts_table.sql | 38 -
sql/alter_company_contact_unify.sql | 198 -----
sql/alter_contact_add_dept_position.sql | 6 -
sql/alter_contact_add_qq.sql | 42 -
sql/alter_contact_rename_to_global.sql | 5 -
sql/alter_crm_follow_add_stage.sql | 40 -
...lter_crm_pipeline_add_contact_position.sql | 42 -
sql/alter_crm_project_add_doc_category.sql | 14 -
sql/alter_crm_rename_to_backend_prefix.sql | 69 --
sql/alter_employee_file_add_cert_photos.sql | 8 -
sql/alter_equipment_add_heartbeat.sql | 8 -
sql/alter_notebook_add_pinned.sql | 14 -
sql/alter_oa_schedule_add_carry.sql | 19 -
...alter_password_store_to_multi_accounts.sql | 78 --
...eimbursement_items_add_receipt_amounts.sql | 12 -
...imbursement_items_add_receipt_file_ids.sql | 3 -
...r_reimbursement_items_add_receipt_urls.sql | 3 -
...imbursement_items_drop_receipt_file_id.sql | 12 -
...reimbursement_items_rename_receipt_url.sql | 6 -
...reimbursements_drop_title_expense_type.sql | 7 -
sql/alter_tenant_domain_add_custom.sql | 39 -
sql/cleanup_cms_auto_categories.sql | 7 -
sql/fix_crm_owner_user_name.sql | 102 ---
...ame_erp_tables_to_backend_organization.sql | 193 -----
sql/seed_employee_file_menu.sql | 27 -
sql/seed_oa_compensation_menu.sql | 69 --
sql/seed_oa_notice_menu.sql | 69 --
sql/seed_organization_menus.sql | 91 ---
sql/upgrade_yz_system_reminderlist.sql | 12 -
sql/yz_backend_crm_contract.sql | 53 --
sql/yz_backend_crm_pipeline.sql | 229 ------
sql/yz_backend_employee_file.sql | 70 --
sql/yz_backend_oa_notice.sql | 25 -
sql/yz_backend_oa_schedule.sql | 32 -
sql/yz_backend_organization.sql | 69 --
...yz_backend_reimbursement_expense_types.sql | 34 -
sql/yz_backend_reimbursements.sql | 107 ---
sql/yz_cms_frontend_tables.sql | 84 --
sql/yz_cms_product.sql | 35 -
sql/yz_cms_solution.sql | 34 -
sql/yz_password_store.sql | 37 -
sql/yz_platform_cursor_equipment_ip_log.sql | 28 -
sql/yz_platform_notebook.sql | 18 -
sql/yz_system_login_log.sql | 20 -
sql/yz_system_sitereminder.sql | 36 -
92 files changed, 5367 insertions(+), 3144 deletions(-)
create mode 100644 backend/src/api/crmDashboard.js
create mode 100644 backend/src/api/crmPayback.js
create mode 100644 backend/src/views/apps/crm/contract/components/DevModuleTree.vue
create mode 100644 backend/src/views/apps/crm/contract/components/ModuleNode.vue
create mode 100644 backend/src/views/apps/crm/contract/components/detail_basic.vue
create mode 100644 backend/src/views/apps/crm/contract/components/detail_payback.vue
create mode 100644 backend/src/views/apps/crm/payback/components/create.vue
create mode 100644 backend/src/views/apps/crm/payback/components/detail.vue
create mode 100644 go/controllers/backend_crm_dashboard.go
create mode 100644 go/controllers/backend_crm_payback.go
delete mode 100644 go/docs/sql/add_storage_config_table.sql
delete mode 100644 go/docs/sql/alter_backend_ai_chat_message_images.sql
delete mode 100644 go/docs/sql/alter_backend_ai_chat_message_stats.sql
create mode 100644 go/docs/sql/alter_backend_crm_overdue.sql
create mode 100644 go/docs/sql/alter_backend_crm_payback_plan_date.sql
create mode 100644 go/docs/sql/alter_backend_crm_payback_receipt.sql
delete mode 100644 go/docs/sql/alter_backend_crm_project_products_column.sql
delete mode 100644 go/docs/sql/alter_system_files_storage_columns.sql
delete mode 100644 go/docs/sql/yz_backend_crm_product.sql
delete mode 100644 go/docs/sql/yz_backend_crm_product_category.sql
delete mode 100644 go/docs/sql/yz_complaint.sql
delete mode 100644 go/docs/sql/yz_oa_document.sql
delete mode 100644 go/docs/sql/yz_platform_cursor_activation_code.sql
delete mode 100644 go/docs/sql/yz_software_upgrade.sql
create mode 100644 go/models/tenant_crm_payback.go
delete mode 100644 sql/add_contacts_table.sql
delete mode 100644 sql/alter_company_contact_unify.sql
delete mode 100644 sql/alter_contact_add_dept_position.sql
delete mode 100644 sql/alter_contact_add_qq.sql
delete mode 100644 sql/alter_contact_rename_to_global.sql
delete mode 100644 sql/alter_crm_follow_add_stage.sql
delete mode 100644 sql/alter_crm_pipeline_add_contact_position.sql
delete mode 100644 sql/alter_crm_project_add_doc_category.sql
delete mode 100644 sql/alter_crm_rename_to_backend_prefix.sql
delete mode 100644 sql/alter_employee_file_add_cert_photos.sql
delete mode 100644 sql/alter_equipment_add_heartbeat.sql
delete mode 100644 sql/alter_notebook_add_pinned.sql
delete mode 100644 sql/alter_oa_schedule_add_carry.sql
delete mode 100644 sql/alter_password_store_to_multi_accounts.sql
delete mode 100644 sql/alter_reimbursement_items_add_receipt_amounts.sql
delete mode 100644 sql/alter_reimbursement_items_add_receipt_file_ids.sql
delete mode 100644 sql/alter_reimbursement_items_add_receipt_urls.sql
delete mode 100644 sql/alter_reimbursement_items_drop_receipt_file_id.sql
delete mode 100644 sql/alter_reimbursement_items_rename_receipt_url.sql
delete mode 100644 sql/alter_reimbursements_drop_title_expense_type.sql
delete mode 100644 sql/alter_tenant_domain_add_custom.sql
delete mode 100644 sql/cleanup_cms_auto_categories.sql
delete mode 100644 sql/fix_crm_owner_user_name.sql
delete mode 100644 sql/rename_erp_tables_to_backend_organization.sql
delete mode 100644 sql/seed_employee_file_menu.sql
delete mode 100644 sql/seed_oa_compensation_menu.sql
delete mode 100644 sql/seed_oa_notice_menu.sql
delete mode 100644 sql/seed_organization_menus.sql
delete mode 100644 sql/upgrade_yz_system_reminderlist.sql
delete mode 100644 sql/yz_backend_crm_contract.sql
delete mode 100644 sql/yz_backend_crm_pipeline.sql
delete mode 100644 sql/yz_backend_employee_file.sql
delete mode 100644 sql/yz_backend_oa_notice.sql
delete mode 100644 sql/yz_backend_oa_schedule.sql
delete mode 100644 sql/yz_backend_organization.sql
delete mode 100644 sql/yz_backend_reimbursement_expense_types.sql
delete mode 100644 sql/yz_backend_reimbursements.sql
delete mode 100644 sql/yz_cms_frontend_tables.sql
delete mode 100644 sql/yz_cms_product.sql
delete mode 100644 sql/yz_cms_solution.sql
delete mode 100644 sql/yz_password_store.sql
delete mode 100644 sql/yz_platform_cursor_equipment_ip_log.sql
delete mode 100644 sql/yz_platform_notebook.sql
delete mode 100644 sql/yz_system_login_log.sql
delete mode 100644 sql/yz_system_sitereminder.sql
diff --git a/backend/src/api/crmDashboard.js b/backend/src/api/crmDashboard.js
new file mode 100644
index 0000000..965b575
--- /dev/null
+++ b/backend/src/api/crmDashboard.js
@@ -0,0 +1,14 @@
+import request from "@/utils/request";
+
+/**
+ * CRM 数据仪表盘接口
+ *
+ * 说明:
+ * - range 维度:day(天) / week(周) / month(月) / quarter(季度) / year(年);
+ * - 后端按租户 + 时间维度聚合真实业务数据(客户/联系人/项目/合同/线索/商机/回访/回款)。
+ */
+
+/** 仪表盘汇总数据 */
+export function getCrmDashboard(params) {
+ return request({ url: "/backend/crm/dashboard", method: "get", params });
+}
diff --git a/backend/src/api/crmPayback.js b/backend/src/api/crmPayback.js
new file mode 100644
index 0000000..272497f
--- /dev/null
+++ b/backend/src/api/crmPayback.js
@@ -0,0 +1,49 @@
+import request from "@/utils/request";
+
+/**
+ * CRM 回款管理接口(针对于合同)
+ *
+ * 说明:
+ * - 回款计划必须挂靠合同(contract_id);
+ * - plan_type 回款周期:1月度/2季度/3年度/4进度/5自定义,决定 items 明细结构;
+ * 月度/季度/年度:{seq,name,amount};
+ * 进度:{seq,name,percent,amount};
+ * 自定义:{seq,name,plan_date,amount};
+ * - pay_method 回款方式:1对公转账/2网银转账/3现金/4支票/5支付宝/6微信/7其他;
+ * - items 每行带 received_amount/received_date/status,用于回款进度登记。
+ */
+
+/** 回款计划列表 */
+export function getPaybackList(params) {
+ return request({ url: "/backend/crm/payback/list", method: "get", params });
+}
+
+/** 回款计划详情 */
+export function getPaybackDetail(id) {
+ return request({ url: `/backend/crm/payback/${id}`, method: "get" });
+}
+
+/** 创建回款计划 */
+export function createPayback(data) {
+ return request({ url: "/backend/crm/payback", method: "post", data });
+}
+
+/** 更新回款计划 */
+export function updatePayback(id, data) {
+ return request({ url: `/backend/crm/payback/${id}`, method: "put", data });
+}
+
+/** 删除回款计划 */
+export function deletePayback(id) {
+ return request({ url: `/backend/crm/payback/${id}`, method: "delete" });
+}
+
+/** 回款进度列表(跨计划摊平的分期明细 + 汇总) */
+export function getPaybackProgress(params) {
+ return request({ url: "/backend/crm/payback/progress/list", method: "get", params });
+}
+
+/** 回款进度登记:按明细序号写入实收金额 / 回款日期 */
+export function registerPaybackReceive(id, data) {
+ return request({ url: `/backend/crm/payback/${id}/receive`, method: "post", data });
+}
diff --git a/backend/src/views/apps/crm/contract/components/DevModuleTree.vue b/backend/src/views/apps/crm/contract/components/DevModuleTree.vue
new file mode 100644
index 0000000..eb58f2d
--- /dev/null
+++ b/backend/src/views/apps/crm/contract/components/DevModuleTree.vue
@@ -0,0 +1,165 @@
+
+
针对于合同的回款计划创建与回款进度跟踪
+