Kaynağa Gözat

CRM管理系统代码提交

沐梦. 2 gün önce
ebeveyn
işleme
da56b3c916
100 değiştirilmiş dosya ile 7222 ekleme ve 50 silme
  1. 0 0
      dummy.db
  2. 3 4
      pom.xml
  3. 5 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCompanyService.java
  4. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCustomerLevelService.java
  5. 0 1
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpSystemService.java
  6. 34 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteComCompanyVo.java
  7. 2 1
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  8. 14 4
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java
  9. 2 1
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java
  10. 2 0
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java
  11. 2 0
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java
  12. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/InvoiceInfoController.java
  13. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementDetailController.java
  14. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceController.java
  15. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceDetailController.java
  16. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceProductController.java
  17. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementOrderController.java
  18. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementProductController.java
  19. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementDetailController.java
  20. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceController.java
  21. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceDetailController.java
  22. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementOrderController.java
  23. 2 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementProductController.java
  24. 43 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/annotation/CrmLog.java
  25. 124 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/aspect/CrmLogAspect.java
  26. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/constant/CustomerConstants.java
  27. 43 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/AddressAreaController.java
  28. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/AnnualTaskController.java
  29. 75 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/ClientTaskController.java
  30. 101 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/ContactPersonController.java
  31. 74 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmCustomerCareController.java
  32. 34 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmStaffController.java
  33. 31 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitOperateLogController.java
  34. 73 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitPlanController.java
  35. 74 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitRecordController.java
  36. 73 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitRoutineController.java
  37. 43 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerDictController.java
  38. 41 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerExtContactController.java
  39. 63 8
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  40. 72 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/FollowUpLogController.java
  41. 68 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MonthlyTaskController.java
  42. 31 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/OperationLogController.java
  43. 92 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/QuarterlyTaskController.java
  44. 68 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesAccountsReceivableController.java
  45. 67 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesAnnualFinalizationController.java
  46. 67 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesQuotationListController.java
  47. 84 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesleadsController.java
  48. 94 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesresultanalyzeController.java
  49. 67 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/TeamMemberController.java
  50. 93 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/AddressArea.java
  51. 115 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/AnnualTask.java
  52. 105 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ClientTask.java
  53. 224 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ContactPerson.java
  54. 194 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmCustomerCare.java
  55. 105 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmStaff.java
  56. 31 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitOperateLog.java
  57. 40 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitPlan.java
  58. 109 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitRecord.java
  59. 147 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitRoutine.java
  60. 125 22
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContact.java
  61. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContactInfo.java
  62. 67 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerDict.java
  63. 94 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerExtContact.java
  64. 60 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  65. 65 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerTarget.java
  66. 170 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/FollowUpLog.java
  67. 114 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MonthlyTask.java
  68. 91 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/OperationLog.java
  69. 151 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/QuarterlyTask.java
  70. 159 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesAccountsReceivable.java
  71. 300 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesAnnualFinalization.java
  72. 141 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesQuotationList.java
  73. 205 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/Salesleads.java
  74. 71 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/Salesresultanalyze.java
  75. 160 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SysDept.java
  76. 72 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/TeamMember.java
  77. 124 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/AnnualTaskBo.java
  78. 13 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ClaimBo.java
  79. 59 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ClientTaskBo.java
  80. 182 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ContactPersonBo.java
  81. 138 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmCustomerCareBo.java
  82. 21 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitOperateLogBo.java
  83. 28 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitPlanBo.java
  84. 73 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitRecordBo.java
  85. 58 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitRoutineBo.java
  86. 72 8
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContactBo.java
  87. 43 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerExtContactBo.java
  88. 52 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  89. 3 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerListBo.java
  90. 48 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerTargetBo.java
  91. 137 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/FollowUpLogBo.java
  92. 89 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/HighSeasQueryBo.java
  93. 53 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MonthlyTaskBo.java
  94. 72 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/OperationLogBo.java
  95. 79 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/QuarterlyTaskBo.java
  96. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesAccountsReceivableBo.java
  97. 295 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesAnnualFinalizationBo.java
  98. 131 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesQuotationListBo.java
  99. 132 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesleadsBo.java
  100. 71 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesresultanalyzeBo.java

+ 0 - 0
dummy.db


+ 3 - 4
pom.xml

@@ -66,7 +66,6 @@
     </properties>
 
     <profiles>
-
         <profile>
             <id>ljy</id>
             <properties>
@@ -96,11 +95,11 @@
 
         </profile>
         <profile>
-            <id>zl</id>
+            <id>tys</id>
             <properties>
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
-                <profiles.active>zl</profiles.active>
-                <nacos.server>169.254.38.213:8848</nacos.server>
+                <profiles.active>7e606cd1-c8f7-4449-bbca-493e4f3d1d64</profiles.active>
+                <nacos.server>127.0.0.1:8848</nacos.server>
                 <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
                 <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
                 <nacos.username>nacos</nacos.username>

+ 5 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCompanyService.java

@@ -1,9 +1,14 @@
 package org.dromara.system.api;
 
+import org.dromara.system.api.domain.vo.RemoteComCompanyVo;
+
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 public interface RemoteComCompanyService {
 
     Map<Long, String> selectCompanyNameByIds(Set<Long> ids);
+
+    List<RemoteComCompanyVo> selectCompanyList();
 }

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCustomerLevelService.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 客户等级远程服务接口
+ */
+public interface RemoteComCustomerLevelService {
+
+    /**
+     * 根据ID批量查询客户等级名称
+     *
+     * @param ids 客户等级ID集合
+     * @return Map<ID, 名称>
+     */
+    Map<Long, String> selectLevelNameByIds(Set<Long> ids);
+}

+ 0 - 1
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpSystemService.java

@@ -161,5 +161,4 @@ public interface RemoteErpSystemService {
      * 删除客户类别
      * */
     Boolean deleteCustomerType(ErpCustomerTypeData customerType);
-
 }

+ 34 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteComCompanyVo.java

@@ -0,0 +1,34 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 远程公司信息视图对象
+ *
+ * @author LionLi
+ */
+@Data
+public class RemoteComCompanyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 公司编码
+     */
+    private String companyCode;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+}

+ 2 - 1
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -105,7 +105,8 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_user",
         "statement_invoice",
         "statement_invoice_detail",
-        "statement_invoice_product"
+        "statement_invoice_product",
+        "salesaccountsreceivable"
 
 
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法

+ 14 - 4
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java

@@ -42,8 +42,16 @@ public class PlatformTenantLineHandler implements TenantLineHandler {
         "maintenance_server_time",
         "maintenance_type",
         "invoice_type",
-        "sys_company"
-        // 注意:前缀匹配(如 qrtz_)在 ignoreTable 中单独处理
+        "sys_company",
+        // 组织基础数据:全平台共享,不参与平台隔离
+        "com_staff",
+        "com_company",
+        "com_dept",
+        "com_post",
+        "com_bank",
+        "com_currency",
+        "com_warehouse",
+        "salesaccountsreceivable"
     ));
 
     /**
@@ -87,8 +95,10 @@ public class PlatformTenantLineHandler implements TenantLineHandler {
             return true;
         }
 
-        // 可扩展其他前缀,例如:
-        // if (table.startsWith("act_") || table.startsWith("flyway_")) return true;
+        // 组织基础数据(com_ 前缀全部忽略,与 PlatformDataScopeInterceptor 保持一致)
+        if (table.startsWith("com_")) {
+            return true;
+        }
 
         return false;
     }

+ 2 - 1
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java

@@ -20,7 +20,8 @@ public class DictTypeTranslationImpl implements TranslationInterface<String> {
 
     @Override
     public String translation(Object key, String other) {
-        if (key instanceof String && StringUtils.isNotBlank(other)) {
+        // 兼容 String、Integer 等类型,统一转为字符串后查字典
+        if (key != null && StringUtils.isNotBlank(other)) {
             return dictService.getDictLabel(other, key.toString());
         }
         return null;

+ 2 - 0
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java

@@ -144,3 +144,5 @@ public class TestDemoController extends BaseController {
         return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java

@@ -102,3 +102,5 @@ public class TestTreeController extends BaseController {
         return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/InvoiceInfoController.java

@@ -105,3 +105,5 @@ public class InvoiceInfoController extends BaseController {
         return toAjax(invoiceInfoService.deleteWithValidByIds(List.of(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementDetailController.java

@@ -104,3 +104,5 @@ public class StatementDetailController extends BaseController {
         return toAjax(statementDetailService.deleteWithValidByIds(List.of(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceController.java

@@ -116,3 +116,5 @@ public class StatementInvoiceController extends BaseController {
 
 
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceDetailController.java

@@ -105,3 +105,5 @@ public class StatementInvoiceDetailController extends BaseController {
         return toAjax(statementInvoiceDetailService.deleteWithValidByIds(List.of(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementInvoiceProductController.java

@@ -105,3 +105,5 @@ public class StatementInvoiceProductController extends BaseController {
         return toAjax(statementInvoiceProductService.deleteWithValidByIds(List.of(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementOrderController.java

@@ -144,3 +144,5 @@ public class StatementOrderController extends BaseController {
         return statementOrderService.listDetailsByCustomerIdPage(customerId, pageQuery);
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/StatementProductController.java

@@ -104,3 +104,5 @@ public class StatementProductController extends BaseController {
         return toAjax(statementProductService.deleteWithValidByIds(List.of(ids), true));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementDetailController.java

@@ -70,3 +70,5 @@ public class PcStatementDetailController extends BaseController {
         return R.ok(vo);
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceController.java

@@ -69,3 +69,5 @@ public class PcStatementInvoiceController extends BaseController {
         return R.ok(insert);
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceDetailController.java

@@ -64,3 +64,5 @@ public class PcStatementInvoiceDetailController extends BaseController {
         return R.ok(vo);
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementOrderController.java

@@ -141,3 +141,5 @@ public class PcStatementOrderController extends BaseController {
         return toAjax(statementOrderService.updateStatus(bo));
     }
 }
+
+

+ 2 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementProductController.java

@@ -101,3 +101,5 @@ public class PcStatementProductController extends BaseController {
         return R.ok(vo);
     }
 }
+
+

+ 43 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/annotation/CrmLog.java

@@ -0,0 +1,43 @@
+package org.dromara.customer.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * CRM 业务日志注解
+ */
+@Target({ ElementType.PARAMETER, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface CrmLog {
+    /**
+     * 数据类型 (1-线索, 3-联系人等)
+     */
+    int dataType() default 0;
+
+    /**
+     * 操作类型 (1-新增, 2-修改, 3-删除, 4-认领, 5-转移)
+     */
+    int actionType() default 0;
+
+    /**
+     * 操作模块 (1-销售中心等)
+     */
+    int actionModule() default 1;
+
+    /**
+     * 详情描述
+     */
+    String details() default "";
+
+    /**
+     * 对象编号在参数中的表达式 (支持 SpEL)
+     * 例如: "#bo.id" 或 "#ids"
+     */
+    String objectNo() default "";
+
+    /**
+     * 目标对象在参数中的表达式
+     * 例如: "#bo.projectName"
+     */
+    String targetObject() default "";
+}

+ 124 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/aspect/CrmLogAspect.java

@@ -0,0 +1,124 @@
+package org.dromara.customer.aspect;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.customer.annotation.CrmLog;
+import org.dromara.customer.service.IOperationLogService;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+/**
+ * CRM 日志切面处理
+ */
+@Slf4j
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class CrmLogAspect {
+
+    private final IOperationLogService operationLogService;
+
+    private final ExpressionParser parser = new SpelExpressionParser();
+    private final DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
+
+    @AfterReturning(pointcut = "@annotation(crmLog)", returning = "jsonResult")
+    public void doAfterReturning(JoinPoint joinPoint, CrmLog crmLog, Object jsonResult) {
+        handleLog(joinPoint, crmLog, jsonResult);
+    }
+
+    protected void handleLog(final JoinPoint joinPoint, CrmLog crmLog, Object jsonResult) {
+        try {
+            // 获取方法参数
+            Object[] args = joinPoint.getArgs();
+            Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
+            String[] parameterNames = discoverer.getParameterNames(method);
+
+            // 设置 SpEL 上下文
+            EvaluationContext context = new StandardEvaluationContext();
+            if (parameterNames != null) {
+                for (int i = 0; i < parameterNames.length; i++) {
+                    context.setVariable(parameterNames[i], args[i]);
+                }
+            }
+
+            // 解析 ObjectNo
+            String objectNo = "";
+            if (StringUtils.isNotBlank(crmLog.objectNo())) {
+                Object val = parseExpression(crmLog.objectNo(), context);
+                if (val instanceof Collection) {
+                    // 如果是批量删除,则循环记录或记录 ID 串
+                    for (Object id : (Collection<?>) val) {
+                        if (id != null) saveLog(crmLog, String.valueOf(id), context);
+                    }
+                    return;
+                } else if (val != null && val.getClass().isArray()) {
+                    for (Object id : (Object[]) val) {
+                        if (id != null) saveLog(crmLog, String.valueOf(id), context);
+                    }
+                    return;
+                }
+                objectNo = (val != null) ? String.valueOf(val) : "";
+            }
+
+            // 兜底策略:如果 objectNo 为空且有 bo 参数,尝试获取 bo.id
+            if (StringUtils.isBlank(objectNo) || "null".equals(objectNo)) {
+                if (parameterNames != null) {
+                    for (int i = 0; i < parameterNames.length; i++) {
+                        if ("bo".equals(parameterNames[i]) && args[i] != null) {
+                            try {
+                                Method getId = args[i].getClass().getMethod("getId");
+                                Object id = getId.invoke(args[i]);
+                                if (id != null) objectNo = String.valueOf(id);
+                            } catch (Exception ignored) {}
+                        }
+                    }
+                }
+            }
+
+            if (StringUtils.isNotBlank(objectNo) && !"null".equals(objectNo)) {
+                saveLog(crmLog, objectNo, context);
+            }
+
+        } catch (Exception exp) {
+            log.error("CRM日志记录异常: {}", exp.getMessage());
+        }
+    }
+
+    private void saveLog(CrmLog crmLog, String objectNo, EvaluationContext context) {
+        String targetObject = "";
+        if (StringUtils.isNotBlank(crmLog.targetObject())) {
+            Object val = parseExpression(crmLog.targetObject(), context);
+            targetObject = val != null ? String.valueOf(val) : "";
+        }
+
+        operationLogService.recordLog(
+            crmLog.dataType(),
+            objectNo,
+            crmLog.actionType(),
+            crmLog.actionModule(),
+            crmLog.details(),
+            targetObject
+        );
+    }
+
+    private Object parseExpression(String expressionStr, EvaluationContext context) {
+        if (expressionStr.startsWith("#")) {
+            Expression expression = parser.parseExpression(expressionStr);
+            return expression.getValue(context);
+        }
+        return expressionStr;
+    }
+}

+ 57 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/constant/CustomerConstants.java

@@ -0,0 +1,57 @@
+package org.dromara.customer.constant;
+
+/**
+ * 客户管理模块常量
+ */
+public interface CustomerConstants {
+
+    /**
+     * 默认平台编码
+     */
+    String DEFAULT_PLATFORM = "crm";
+
+    /**
+     * 销售线索类型
+     */
+    String PROJECT_TYPE_LEADS = "销售线索";
+
+    /**
+     * 数据类型:销售线索/项目商机
+     */
+    Integer DATA_TYPE_LEADS = 1;
+
+    /**
+     * 操作类型:新增
+     */
+    Integer ACTION_TYPE_INSERT = 1;
+
+    /**
+     * 操作类型:修改
+     */
+    Integer ACTION_TYPE_UPDATE = 2;
+
+    /**
+     * 操作类型:删除
+     */
+    Integer ACTION_TYPE_DELETE = 3;
+
+    /**
+     * 团队角色:业务负责人
+     */
+    String TEAM_ROLE_LEADER = "1";
+
+    /**
+     * 模块:项目商机
+     */
+    String MODULE_SALES_LEADS = "项目商机";
+
+    /**
+     * 模块:团队成员
+     */
+    String MODULE_TEAM_MEMBER = "团队成员";
+
+    /**
+     * 模块:项目进度
+     */
+    String MODULE_PROJECT_PROGRESS = "项目进度";
+}

+ 43 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/AddressAreaController.java

@@ -0,0 +1,43 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.vo.AddressAreaVo;
+import org.dromara.customer.service.IAddressAreaService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 地址区域控制器,提供省市联动查询接口
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/address")
+public class AddressAreaController extends BaseController {
+
+    private final IAddressAreaService addressAreaService;
+
+    /**
+     * 获取省市两级联动列表(省级含 children 市级)
+     */
+    @GetMapping("/province-cities")
+    public R<List<AddressAreaVo>> listProvinceWithCities() {
+        return R.ok(addressAreaService.listProvinceWithCities());
+    }
+
+    /**
+     * 根据父级ID获取子级城市列表(懒加载备用)
+     */
+    @GetMapping("/cities")
+    public R<List<AddressAreaVo>> listCitiesByParent(@RequestParam Long parentId) {
+        return R.ok(addressAreaService.listCitiesByParent(parentId));
+    }
+
+}

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/AnnualTaskController.java

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.AnnualTaskBo;
+import org.dromara.customer.domain.vo.AnnualTaskVo;
+import org.dromara.customer.service.IAnnualTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 销售年度任务控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/annualTask")
+public class AnnualTaskController extends BaseController {
+
+    private final IAnnualTaskService annualTaskService;
+
+    /**
+     * 查询销售年度任务列表
+     */
+    @SaCheckPermission("sale:annualTask:list")
+    @GetMapping("/list")
+    public TableDataInfo<AnnualTaskVo> list(AnnualTaskBo bo, PageQuery pageQuery) {
+        return annualTaskService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出销售年度任务列表
+     */
+    @SaCheckPermission("sale:annualTask:export")
+    @Log(title = "销售年度任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(AnnualTaskBo bo, HttpServletResponse response) {
+        List<AnnualTaskVo> list = annualTaskService.queryList(bo);
+        ExcelUtil.exportExcel(list, "销售年度任务", AnnualTaskVo.class, response);
+    }
+
+    /**
+     * 获取销售年度任务详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("sale:annualTask:query")
+    @GetMapping("/{id}")
+    public R<AnnualTaskVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(annualTaskService.queryById(id));
+    }
+
+    /**
+     * 新增销售年度任务
+     */
+    @SaCheckPermission("sale:annualTask:add")
+    @Log(title = "销售年度任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody AnnualTaskBo bo) {
+        return toAjax(annualTaskService.insertByBo(bo));
+    }
+
+    /**
+     * 修改销售年度任务
+     */
+    @SaCheckPermission("sale:annualTask:edit")
+    @Log(title = "销售年度任务", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody AnnualTaskBo bo) {
+        return toAjax(annualTaskService.updateByBo(bo));
+    }
+
+    /**
+     * 删除销售年度任务
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("sale:annualTask:remove")
+    @Log(title = "销售年度任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(annualTaskService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}
+
+

+ 75 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/ClientTaskController.java

@@ -0,0 +1,75 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.customer.domain.bo.ClientTaskBo;
+import org.dromara.customer.domain.vo.ClientTaskVo;
+import org.dromara.customer.service.IClientTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 客户目标任务控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/customerTarget")
+public class ClientTaskController {
+
+    private final IClientTaskService clientTaskService;
+
+    /**
+     * 查询客户目标任务信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<ClientTaskVo> list(ClientTaskBo bo, PageQuery pageQuery) {
+        return clientTaskService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取客户目标任务详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<ClientTaskVo> getInfo(@PathVariable Long id) {
+        return R.ok(clientTaskService.queryById(id));
+    }
+
+    /**
+     * 新增客户目标任务
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody ClientTaskBo bo) {
+        return clientTaskService.insertByBo(bo) ? R.ok() : R.fail();
+    }
+
+    /**
+     * 修改客户目标任务
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody ClientTaskBo bo) {
+        return clientTaskService.updateByBo(bo) ? R.ok() : R.fail();
+    }
+
+    /**
+     * 删除客户目标任务
+     *
+     * @param ids 主键串
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return clientTaskService.deleteWithValidByIds(Arrays.asList(ids), true) ? R.ok() : R.fail();
+    }
+}
+
+

+ 101 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/ContactPersonController.java

@@ -0,0 +1,101 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+import java.util.Arrays;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.customer.domain.vo.ContactPersonVo;
+import org.dromara.customer.domain.bo.ContactPersonBo;
+import org.dromara.customer.service.IContactPersonService;
+import org.dromara.customer.annotation.CrmLog;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 联系人控制器
+ *
+ * @author LionLi
+ * @date 2024-04-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/contactPerson")
+public class ContactPersonController extends BaseController {
+
+    private final IContactPersonService contactPersonService;
+
+    /**
+     * 查询联系人列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<ContactPersonVo> list(ContactPersonBo bo, PageQuery pageQuery) {
+        return contactPersonService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出联系人列表
+     */
+    @Log(title = "联系人", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ContactPersonBo bo, HttpServletResponse response) {
+        List<ContactPersonVo> list = contactPersonService.queryList(bo);
+        ExcelUtil.exportExcel(list, "联系人", ContactPersonVo.class, response);
+    }
+
+    /**
+     * 获取联系人详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<ContactPersonVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(contactPersonService.queryById(id));
+    }
+
+    /**
+     * 新增联系人
+     */
+    @CrmLog(dataType = 3, actionType = 1, details = "新增联系人", objectNo = "#bo.id", targetObject = "#bo.name")
+    @Log(title = "联系人", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ContactPersonBo bo) {
+        return toAjax(contactPersonService.insertByBo(bo));
+    }
+
+    /**
+     * 修改联系人
+     */
+    @CrmLog(dataType = 3, actionType = 2, details = "修改联系人", objectNo = "#bo.id", targetObject = "#bo.name")
+    @Log(title = "联系人", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ContactPersonBo bo) {
+        return toAjax(contactPersonService.updateByBo(bo));
+    }
+
+    /**
+     * 删除联系人
+     *
+     * @param ids 主键串
+     */
+    @CrmLog(dataType = 3, actionType = 3, details = "删除联系人", objectNo = "#ids")
+    @Log(title = "联系人", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(contactPersonService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}

+ 74 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmCustomerCareController.java

@@ -0,0 +1,74 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.CrmCustomerCareBo;
+import org.dromara.customer.domain.vo.CrmCustomerCareVo;
+import org.dromara.customer.service.ICrmCustomerCareService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 客户关怀Controller
+ *
+ * @author yoe
+ * @date 2026-04-08
+ */
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/care")
+public class CrmCustomerCareController extends BaseController {
+
+    private final ICrmCustomerCareService crmCustomerCareService;
+
+    /**
+     * 查询客户关怀分页列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CrmCustomerCareVo> list(CrmCustomerCareBo bo, PageQuery pageQuery) {
+        return crmCustomerCareService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取客户关怀详细信息
+     */
+    @GetMapping("/{id}")
+    public R<CrmCustomerCareVo> getInfo(@PathVariable Long id) {
+        return R.ok(crmCustomerCareService.queryById(id));
+    }
+
+    /**
+     * 新增客户关怀
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody CrmCustomerCareBo bo) {
+        return toAjax(crmCustomerCareService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户关怀
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody CrmCustomerCareBo bo) {
+        return toAjax(crmCustomerCareService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户关怀
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(crmCustomerCareService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+}
+
+

+ 34 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmStaffController.java

@@ -0,0 +1,34 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.vo.CrmStaffVo;
+import org.dromara.customer.service.ICrmStaffService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * CRM人员信息
+ * 前端访问路由地址为:/customer/crmStaff
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crmStaff")
+public class CrmStaffController extends BaseController {
+
+    private final ICrmStaffService crmStaffService;
+
+    /**
+     * 查询CRM人员下拉选项列表(供前端下拉框使用)
+     */
+    @GetMapping("/options")
+    public R<List<CrmStaffVo>> selectOptionList() {
+        return R.ok(crmStaffService.selectOptionList());
+    }
+}

+ 31 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitOperateLogController.java

@@ -0,0 +1,31 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.customer.domain.bo.CrmVisitOperateLogBo;
+import org.dromara.customer.domain.vo.CrmVisitOperateLogVo;
+import org.dromara.customer.service.ICrmVisitOperateLogService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 拜访操作日志
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/visit/operateLog")
+public class CrmVisitOperateLogController {
+
+    private final ICrmVisitOperateLogService operateLogService;
+
+    /**
+     * 查询操作日志列表
+     */
+    @GetMapping("/list")
+    public R<List<CrmVisitOperateLogVo>> list(CrmVisitOperateLogBo bo) {
+        return R.ok(operateLogService.queryList(bo));
+    }
+}

+ 73 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitPlanController.java

@@ -0,0 +1,73 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.CrmVisitPlanBo;
+import org.dromara.customer.domain.vo.CrmVisitPlanVo;
+import org.dromara.customer.service.ICrmVisitPlanService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 拜访计划Controller
+ *
+ * @author yoe
+ */
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/visit/plan")
+public class CrmVisitPlanController extends BaseController {
+
+    private final ICrmVisitPlanService crmVisitPlanService;
+
+    /**
+     * 查询拜访计划分页列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CrmVisitPlanVo> list(CrmVisitPlanBo bo, PageQuery pageQuery) {
+        return crmVisitPlanService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取拜访计划详细信息
+     */
+    @GetMapping("/{id}")
+    public R<CrmVisitPlanVo> getInfo(@PathVariable Long id) {
+        return R.ok(crmVisitPlanService.queryById(id));
+    }
+
+    /**
+     * 新增拜访计划
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody CrmVisitPlanBo bo) {
+        return toAjax(crmVisitPlanService.insertByBo(bo));
+    }
+
+    /**
+     * 修改拜访计划
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody CrmVisitPlanBo bo) {
+        return toAjax(crmVisitPlanService.updateByBo(bo));
+    }
+
+    /**
+     * 删除拜访计划
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(crmVisitPlanService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+}
+
+

+ 74 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitRecordController.java

@@ -0,0 +1,74 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.CrmVisitRecordBo;
+import org.dromara.customer.domain.vo.CrmVisitRecordVo;
+import org.dromara.customer.service.ICrmVisitRecordService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 拜访跟进记录接口
+ *
+ * @author Lion Li
+ * @date 2024-04-08
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/visit/record")
+public class CrmVisitRecordController extends BaseController {
+
+    private final ICrmVisitRecordService crmVisitRecordService;
+
+    /**
+     * 查询拜访跟进记录列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CrmVisitRecordVo> list(CrmVisitRecordBo bo, PageQuery pageQuery) {
+        return crmVisitRecordService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取拜访跟进记录详细信息
+     */
+    @GetMapping("/{id}")
+    public R<CrmVisitRecordVo> getInfo(@PathVariable Long id) {
+        return R.ok(crmVisitRecordService.queryById(id));
+    }
+
+    /**
+     * 新增拜访跟进记录
+     */
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmVisitRecordBo bo) {
+        return toAjax(crmVisitRecordService.insertByBo(bo));
+    }
+
+    /**
+     * 修改拜访跟进记录
+     */
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmVisitRecordBo bo) {
+        return toAjax(crmVisitRecordService.updateByBo(bo));
+    }
+
+    /**
+     * 删除拜访跟进记录
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(crmVisitRecordService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
+
+

+ 73 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CrmVisitRoutineController.java

@@ -0,0 +1,73 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.CrmVisitRoutineBo;
+import org.dromara.customer.domain.vo.CrmVisitRoutineVo;
+import org.dromara.customer.service.ICrmVisitRoutineService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 拜访日程Controller
+ *
+ * @author yoe
+ */
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/visit/routine")
+public class CrmVisitRoutineController extends BaseController {
+
+    private final ICrmVisitRoutineService crmVisitRoutineService;
+
+    /**
+     * 查询拜访日程分页列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CrmVisitRoutineVo> list(CrmVisitRoutineBo bo, PageQuery pageQuery) {
+        return crmVisitRoutineService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取拜访日程详细信息
+     */
+    @GetMapping("/{id}")
+    public R<CrmVisitRoutineVo> getInfo(@PathVariable Long id) {
+        return R.ok(crmVisitRoutineService.queryById(id));
+    }
+
+    /**
+     * 新增拜访日程
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody CrmVisitRoutineBo bo) {
+        return toAjax(crmVisitRoutineService.insertByBo(bo));
+    }
+
+    /**
+     * 修改拜访日程
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody CrmVisitRoutineBo bo) {
+        return toAjax(crmVisitRoutineService.updateByBo(bo));
+    }
+
+    /**
+     * 删除拜访日程
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(crmVisitRoutineService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+}
+
+

+ 43 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerDictController.java

@@ -0,0 +1,43 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.vo.CustomerDictVo;
+import org.dromara.customer.service.ICustomerDictService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 客户字典控制器
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/dict")
+public class CustomerDictController extends BaseController {
+
+    private final ICustomerDictService customerDictService;
+
+    /**
+     * 根据字典类型获取数据列表
+     */
+    @GetMapping("/type/{dictType}")
+    public R<List<CustomerDictVo>> getDictByType(@PathVariable String dictType) {
+        return R.ok(customerDictService.selectListByType(dictType));
+    }
+
+    /**
+     * 根据字典code获取通用字典数据列表
+     */
+    @GetMapping("/common/{dictCode}")
+    public R<List<CustomerDictVo>> getCommonDictByCode(@PathVariable String dictCode) {
+        return R.ok(customerDictService.selectListByCode(dictCode));
+    }
+
+}

+ 41 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerExtContactController.java

@@ -0,0 +1,41 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.CustomerExtContactBo;
+import org.dromara.customer.service.ICustomerExtContactService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 客户扩展联系人前端控制器
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/extContact")
+public class CustomerExtContactController extends BaseController {
+
+    private final ICustomerExtContactService contactService;
+
+    /**
+     * 单独新增或保存公海新增页面的联系人(批量)
+     */
+    @PostMapping("/batch")
+    public R<Void> addBatch(@RequestBody @Validated List<CustomerExtContactBo> contactList) {
+        contactService.insertBatch(contactList);
+        return R.ok();
+    }
+    
+    /**
+     * 新增单个扩展联系人
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody @Validated CustomerExtContactBo bo) {
+        contactService.insertByBo(bo);
+        return R.ok();
+    }
+}

+ 63 - 8
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java

@@ -14,16 +14,15 @@ import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
-import org.dromara.customer.domain.bo.CustomerInfoBo;
-import org.dromara.customer.domain.bo.CustomerListBo;
-import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
-import org.dromara.customer.domain.bo.MessagePublishCustomerBo;
+import org.dromara.customer.domain.bo.*;
 import org.dromara.customer.domain.dto.SetCustomerInfoTagDto;
-import org.dromara.customer.domain.vo.ContractVo;
-import org.dromara.customer.domain.vo.CustomerInfoVo;
-import org.dromara.customer.domain.vo.CustomerListVo;
-import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
+import org.dromara.customer.domain.vo.*;
+import org.dromara.customer.service.ICustomerDictService;
 import org.dromara.customer.service.ICustomerInfoService;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.system.api.domain.vo.RemoteComCompanyVo;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
+import org.dromara.system.api.domain.vo.RemoteDictDataVo;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -202,4 +201,60 @@ public class CustomerInfoController extends BaseController {
     public R<Integer> transferServiceStaff(@RequestBody SetCustomerInfoTagDto bo) {
         return R.ok(customerInfoService.transferServiceStaff(bo.getCustomerIds(), bo.getServiceStaffId()));
     }
+
+    /**
+     * 查询客户公海信息列表
+     */
+    @SaCheckPermission("customer:pool:list")
+    @GetMapping("/highseas")
+    public TableDataInfo<HighSeasListVo> highSeasList(HighSeasQueryBo bo, PageQuery pageQuery) {
+        return customerInfoService.queryHighSeasPage(bo, pageQuery);
+    }
+
+    /**
+     * 认领客户
+     */
+    @SaCheckPermission("customer:pool:claim")
+    @Log(title = "客户公海", businessType = BusinessType.UPDATE)
+    @PostMapping("/claim")
+    public R<Void> claim(@RequestBody ClaimBo bo) {
+        return toAjax(customerInfoService.claim(bo));
+    }
+
+    /**
+     * 分配客户
+     */
+    @SaCheckPermission("customer:pool:allocate")
+    @Log(title = "客户公海", businessType = BusinessType.UPDATE)
+    @GetMapping("/allocate")
+    public R<Void> allocate(Long id, Long userId) {
+        return toAjax(customerInfoService.allocate(id, userId));
+    }
+
+    /**
+     * 退回到公海
+     */
+    @SaCheckPermission("customer:pool:release")
+    @Log(title = "客户公海", businessType = BusinessType.UPDATE)
+    @PutMapping("/release")
+    public R<Void> releaseToPool(Long customerId, String reason) {
+        return toAjax(customerInfoService.releaseToPool(customerId, reason));
+    }
+
+    /**
+     * 获取归属公司下拉列表
+     */
+    @GetMapping("/companyOptionList")
+    public R<List<RemoteComCompanyVo>> companyOptionList() {
+        return R.ok(customerInfoService.selectCompanyOptionList());
+    }
+
+    /**
+     * 获取客户等级下拉列表
+     */
+    @GetMapping("/levelOptionList")
+    public R<List<RemoteDictDataVo>> levelOptionList() {
+        return R.ok(customerInfoService.selectLevelOptionList());
+    }
 }
+

+ 72 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/FollowUpLogController.java

@@ -0,0 +1,72 @@
+package org.dromara.customer.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.FollowUpLogBo;
+import org.dromara.customer.domain.vo.FollowUpLogVo;
+import org.dromara.customer.service.IFollowUpLogService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 跟进记录Controller
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/followup/log")
+public class FollowUpLogController extends BaseController {
+
+    private final IFollowUpLogService followUpLogService;
+
+    /**
+     * 查询跟进记录分页列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<FollowUpLogVo> list(FollowUpLogBo bo, PageQuery pageQuery) {
+        return followUpLogService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取跟进记录详细信息
+     */
+    @GetMapping("/{id}")
+    public R<FollowUpLogVo> getInfo(@PathVariable Long id) {
+        return R.ok(followUpLogService.queryById(id));
+    }
+
+    /**
+     * 新增跟进记录
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody FollowUpLogBo bo) {
+        return toAjax(followUpLogService.insertByBo(bo));
+    }
+
+    /**
+     * 修改跟进记录
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody FollowUpLogBo bo) {
+        return toAjax(followUpLogService.updateByBo(bo));
+    }
+
+    /**
+     * 删除跟进记录
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(followUpLogService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MonthlyTaskController.java

@@ -0,0 +1,68 @@
+package org.dromara.customer.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.MonthlyTaskBo;
+import org.dromara.customer.domain.vo.MonthlyTaskVo;
+import org.dromara.customer.service.IMonthlyTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 月度任务信息
+ *
+ * @author Antigravity
+ */
+@Validated
+@Tag(name = "月度任务管理", description = "月度任务管理接口")
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/monthlyTask")
+public class MonthlyTaskController extends BaseController {
+
+    private final IMonthlyTaskService monthlyTaskService;
+
+    /**
+     * 查询月度任务信息列表
+     */
+    @Operation(summary = "查询月度任务信息列表", description = "分页查询业务员月度任务及同期对比数据")
+    @GetMapping("/list")
+    public TableDataInfo<MonthlyTaskVo> list(MonthlyTaskBo bo, PageQuery pageQuery) {
+        return monthlyTaskService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 新增月度任务信息
+     */
+    @Operation(summary = "新增月度任务信息")
+    @PostMapping()
+    public R<Void> add(@RequestBody MonthlyTaskBo bo) {
+        return toAjax(monthlyTaskService.insertByBo(bo));
+    }
+
+    /**
+     * 修改月度任务信息
+     */
+    @Operation(summary = "修改月度任务信息")
+    @PutMapping()
+    public R<Void> edit(@RequestBody MonthlyTaskBo bo) {
+        return toAjax(monthlyTaskService.updateByBo(bo));
+    }
+
+    /**
+     * 删除月度任务信息
+     */
+    @Operation(summary = "删除月度任务信息")
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@Parameter(description = "主键ID串") @PathVariable Long[] ids) {
+        return toAjax(monthlyTaskService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 31 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/OperationLogController.java

@@ -0,0 +1,31 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.customer.domain.bo.OperationLogBo;
+import org.dromara.customer.domain.vo.OperationLogVo;
+import org.dromara.customer.service.IOperationLogService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 操作日志Controller
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/crm/operationLog")
+public class OperationLogController {
+
+    private final IOperationLogService operationLogService;
+
+    /**
+     * 查询操作日志列表
+     */
+    @GetMapping("/list")
+    public R<List<OperationLogVo>> list(OperationLogBo bo) {
+        return R.ok(operationLogService.queryList(bo));
+    }
+}

+ 92 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/QuarterlyTaskController.java

@@ -0,0 +1,92 @@
+package org.dromara.customer.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.QuarterlyTaskBo;
+import org.dromara.customer.domain.vo.QuarterlyTaskVo;
+import org.dromara.customer.service.IQuarterlyTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+/**
+ * 季度任务信息
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Tag(name = "季度任务信息控制器", description = "季度任务信息管理")
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/quarterlyTask")
+public class QuarterlyTaskController extends BaseController {
+
+    private final IQuarterlyTaskService baseService;
+
+    /**
+     * 查询季度任务信息列表 (报表分页)
+     */
+    @SaCheckPermission("sale:quarterlyTask:list")
+    @Operation(summary = "查询季度任务信息列表", description = "用于展示季度任务报表")
+    @GetMapping("/list")
+    public TableDataInfo<QuarterlyTaskVo> list(QuarterlyTaskBo bo, PageQuery pageQuery) {
+        return baseService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取季度任务信息详细信息
+     */
+    @SaCheckPermission("sale:quarterlyTask:query")
+    @Operation(summary = "获取季度任务信息详细信息")
+    @GetMapping("/{id}")
+    public R<QuarterlyTaskVo> getInfo(@Parameter(description = "主键", required = true) @PathVariable Long id) {
+        return R.ok(baseService.queryById(id));
+    }
+
+    /**
+     * 新增季度任务信息
+     */
+    @SaCheckPermission("sale:quarterlyTask:add")
+    @Operation(summary = "新增季度任务信息")
+    @Log(title = "季度任务信息", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody QuarterlyTaskBo bo) {
+        return toAjax(baseService.insertByBo(bo));
+    }
+
+    /**
+     * 修改季度任务信息
+     */
+    @SaCheckPermission("sale:quarterlyTask:edit")
+    @Operation(summary = "修改季度任务信息")
+    @Log(title = "季度任务信息", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody QuarterlyTaskBo bo) {
+        return toAjax(baseService.updateByBo(bo));
+    }
+
+    /**
+     * 删除季度任务信息
+     */
+    @SaCheckPermission("sale:quarterlyTask:remove")
+    @Operation(summary = "删除季度任务信息")
+    @Log(title = "季度任务信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@Parameter(description = "主键串", required = true) @PathVariable Long[] ids) {
+        return toAjax(baseService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
+
+

+ 68 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesAccountsReceivableController.java

@@ -0,0 +1,68 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.SalesAccountsReceivableBo;
+import org.dromara.customer.domain.vo.SalesAccountsReceivableVo;
+import org.dromara.customer.service.ISalesAccountsReceivableService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 应收账款 前端控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/accountsReceivable")
+public class SalesAccountsReceivableController extends BaseController {
+
+    private final ISalesAccountsReceivableService salesAccountsReceivableService;
+
+    /**
+     * 查询应收账款列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SalesAccountsReceivableVo> list(SalesAccountsReceivableBo bo, PageQuery pageQuery) {
+        return salesAccountsReceivableService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取应收账款详细信息
+     */
+    @GetMapping("/{id}")
+    public R<SalesAccountsReceivableVo> getInfo(@PathVariable Long id) {
+        return R.ok(salesAccountsReceivableService.queryById(id));
+    }
+
+    /**
+     * 新增应收账款
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody SalesAccountsReceivableBo bo) {
+        return toAjax(salesAccountsReceivableService.insertByBo(bo));
+    }
+
+    /**
+     * 修改应收账款
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody SalesAccountsReceivableBo bo) {
+        return toAjax(salesAccountsReceivableService.updateByBo(bo));
+    }
+
+    /**
+     * 删除应收账款
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(salesAccountsReceivableService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesAnnualFinalizationController.java

@@ -0,0 +1,67 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.SalesAnnualFinalizationBo;
+import org.dromara.customer.domain.vo.SalesAnnualFinalizationVo;
+import org.dromara.customer.service.ISalesAnnualFinalizationService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 年度入围项目 前端控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-18
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/annualFinalization")
+public class SalesAnnualFinalizationController extends BaseController {
+
+    private final ISalesAnnualFinalizationService salesAnnualFinalizationService;
+
+    /**
+     * 查询年度入围项目列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SalesAnnualFinalizationVo> list(SalesAnnualFinalizationBo bo, PageQuery pageQuery) {
+        return salesAnnualFinalizationService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取年度入围项目详细信息
+     */
+    @GetMapping("/{id}")
+    public R<SalesAnnualFinalizationVo> getInfo(@PathVariable Long id) {
+        return R.ok(salesAnnualFinalizationService.queryById(id));
+    }
+
+    /**
+     * 新增年度入围项目
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody SalesAnnualFinalizationBo bo) {
+        return toAjax(salesAnnualFinalizationService.insertByBo(bo));
+    }
+
+    /**
+     * 修改年度入围项目
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody SalesAnnualFinalizationBo bo) {
+        return toAjax(salesAnnualFinalizationService.updateByBo(bo));
+    }
+
+    /**
+     * 删除年度入围项目
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(salesAnnualFinalizationService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}

+ 67 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesQuotationListController.java

@@ -0,0 +1,67 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.SalesQuotationListBo;
+import org.dromara.customer.domain.vo.SalesQuotationListVo;
+import org.dromara.customer.service.ISalesQuotationListService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 销售报价单明细 前端控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/quotation")
+public class SalesQuotationListController extends BaseController {
+
+    private final ISalesQuotationListService salesQuotationListService;
+
+    /**
+     * 查询销售报价单明细列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SalesQuotationListVo> list(SalesQuotationListBo bo, PageQuery pageQuery) {
+        return salesQuotationListService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取销售报价单明细详细信息
+     */
+    @GetMapping("/{id}")
+    public R<SalesQuotationListVo> getInfo(@PathVariable Long id) {
+        return R.ok(salesQuotationListService.queryById(id));
+    }
+
+    /**
+     * 新增销售报价单明细
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody SalesQuotationListBo bo) {
+        return toAjax(salesQuotationListService.insertByBo(bo));
+    }
+
+    /**
+     * 修改销售报价单明细
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody SalesQuotationListBo bo) {
+        return toAjax(salesQuotationListService.updateByBo(bo));
+    }
+
+    /**
+     * 删除销售报价单明细
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(salesQuotationListService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}

+ 84 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesleadsController.java

@@ -0,0 +1,84 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.SalesleadsBo;
+import org.dromara.customer.domain.vo.SalesleadsVo;
+import org.dromara.customer.service.ISalesleadsService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 销售线索/项目商机 前端控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-16
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/salesleads")
+public class SalesleadsController extends BaseController {
+
+    private final ISalesleadsService salesleadsService;
+
+    /**
+     * 查询列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SalesleadsVo> list(SalesleadsBo bo, PageQuery pageQuery) {
+        return salesleadsService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取详细信息
+     */
+    @GetMapping("/{id}")
+    public R<SalesleadsVo> getInfo(@PathVariable Long id) {
+        return R.ok(salesleadsService.queryById(id));
+    }
+
+    /**
+     * 新增
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody SalesleadsBo bo) {
+        return toAjax(salesleadsService.insertLeads(bo));
+    }
+
+    /**
+     * 修改
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody SalesleadsBo bo) {
+        return toAjax(salesleadsService.updateLeads(bo));
+    }
+
+    /**
+     * 删除
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(salesleadsService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+
+    /**
+     * 认领销售线索
+     */
+    @PostMapping("/claim")
+    public R<Void> claim(@RequestBody SalesleadsBo bo) {
+        return toAjax(salesleadsService.claimLeads(bo));
+    }
+
+    /**
+     * 转移销售线索
+     */
+    @PostMapping("/transfer")
+    public R<Void> transfer(@RequestBody SalesleadsBo bo) {
+        return toAjax(salesleadsService.transferLeads(bo));
+    }
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SalesresultanalyzeController.java

@@ -0,0 +1,94 @@
+package org.dromara.customer.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.customer.domain.bo.SalesresultanalyzeBo;
+import org.dromara.customer.domain.vo.SalesresultanalyzeVo;
+import org.dromara.customer.service.ISalesresultanalyzeService;
+import org.dromara.customer.annotation.CrmLog;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 销售结果分析控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-21
+ */
+@Validated
+@Tag(name = "销售结果分析控制器", description = "销售结果分析相关接口")
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/salesresultanalyze")
+public class SalesresultanalyzeController extends BaseController {
+
+    private final ISalesresultanalyzeService salesresultanalyzeService;
+
+    /**
+     * 查询销售结果分析列表
+     */
+    @Operation(summary = "查询销售结果分析列表")
+    @GetMapping("/list")
+    public TableDataInfo<SalesresultanalyzeVo> list(SalesresultanalyzeBo bo, PageQuery pageQuery) {
+        return salesresultanalyzeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取销售结果分析详细信息
+     */
+    @Operation(summary = "获取销售结果分析详细信息")
+    @GetMapping("/{id}")
+    public R<SalesresultanalyzeVo> getInfo(@Parameter(description = "主键") @PathVariable Long id) {
+        return R.ok(salesresultanalyzeService.queryById(id));
+    }
+    
+    /**
+     * 根据对象编号获取销售结果分析详细信息
+     */
+    @Operation(summary = "根据对象编号获取销售结果分析")
+    @GetMapping("/objectNo/{objectNo}")
+    public R<SalesresultanalyzeVo> getInfoByObjectNo(@Parameter(description = "对象编号") @PathVariable String objectNo) {
+        return R.ok(salesresultanalyzeService.queryByObjectNo(objectNo));
+    }
+
+    /**
+     * 新增销售结果分析
+     */
+    @Operation(summary = "新增销售结果分析")
+    @CrmLog(dataType = 1, actionType = 6, details = "新增成交结果分析", objectNo = "#bo.objectNo")
+    @Log(title = "销售结果分析", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<Void> add(@RequestBody SalesresultanalyzeBo bo) {
+        return toAjax(salesresultanalyzeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改销售结果分析
+     */
+    @Operation(summary = "修改销售结果分析")
+    @Log(title = "销售结果分析", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<Void> edit(@RequestBody SalesresultanalyzeBo bo) {
+        return toAjax(salesresultanalyzeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除销售结果分析
+     */
+    @Operation(summary = "删除销售结果分析")
+    @Log(title = "销售结果分析", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@Parameter(description = "主键串") @PathVariable Long[] ids) {
+        return toAjax(salesresultanalyzeService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 67 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/TeamMemberController.java

@@ -0,0 +1,67 @@
+package org.dromara.customer.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.TeamMemberBo;
+import org.dromara.customer.domain.vo.TeamMemberVo;
+import org.dromara.customer.service.ITeamMemberService;
+import org.springframework.web.bind.annotation.*;
+import org.dromara.customer.annotation.CrmLog;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 团队成员 前端控制器
+ *
+ * @author Antigravity
+ * @date 2026-04-17
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/teamMember")
+public class TeamMemberController extends BaseController {
+
+    private final ITeamMemberService teamMemberService;
+
+    /**
+     * 按对象编号查询团队成员列表
+     */
+    @GetMapping("/list/{objectNo}")
+    public R<List<TeamMemberVo>> list(@PathVariable String objectNo) {
+        return R.ok(teamMemberService.queryByObjectNo(objectNo));
+    }
+
+    /**
+     * 获取详细信息
+     */
+    @GetMapping("/{id}")
+    public R<TeamMemberVo> getInfo(@PathVariable Long id) {
+        return R.ok(teamMemberService.queryById(id));
+    }
+
+    /**
+     * 新增团队成员
+     */
+    @PostMapping
+    public R<Void> add(@RequestBody TeamMemberBo bo) {
+        return toAjax(teamMemberService.insertMember(bo));
+    }
+
+    /**
+     * 修改团队成员
+     */
+    @PutMapping
+    public R<Void> edit(@RequestBody TeamMemberBo bo) {
+        return toAjax(teamMemberService.updateMember(bo));
+    }
+
+    /**
+     * 删除团队成员
+     */
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(teamMemberService.deleteByIds(Arrays.asList(ids)));
+    }
+}

+ 93 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/AddressArea.java

@@ -0,0 +1,93 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 地址区域实体类,对应 address_area 表
+ */
+@Data
+@TableName("address_area")
+public class AddressArea implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 地区编码
+     */
+    private String areaCode;
+
+    /**
+     * 地区名称
+     */
+    private String areaName;
+
+    /**
+     * 父级ID
+     */
+    private Long parentId;
+
+    /**
+     * 父级编码
+     */
+    private String parentCode;
+
+    /**
+     * 地区简称
+     */
+    private String simpleName;
+
+    /**
+     * 地区等级:省 1,市 2,区 3
+     */
+    private Integer level;
+
+    /**
+     * 拼音
+     */
+    private String pinYin;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+}

+ 115 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/AnnualTask.java

@@ -0,0 +1,115 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+
+/**
+ * 年度任务信息对象 crm_annual_task
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_annual_task")
+public class AnnualTask extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 年份 (如: 2026)
+     */
+    private Integer year;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 行业条线
+     */
+    private String industryLine;
+
+    /**
+     * 目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 冲刺任务(元)
+     */
+    private BigDecimal sprintTask;
+
+    /**
+     * 核心客户名称汇总 (对应 core_customer_ids 字段)
+     */
+    @TableField("core_customer_ids")
+    private String coreCustomerNames;
+
+    /**
+     * 重点项目名称汇总 (对应 key_project_ids 字段)
+     */
+    @TableField("key_project_ids")
+    private String keyProjectNames;
+
+    /**
+     * 业务人员ID
+     */
+    private Long salesUserId;
+
+    /**
+     * 客服人员ID
+     */
+    private Long serviceUserId;
+
+    /**
+     * 实绩(元)
+     */
+    private BigDecimal actualAchievement;
+
+    /**
+     * 上年目标(元)
+     */
+    private BigDecimal lastYearTarget;
+
+    /**
+     * 上年实绩(元)
+     */
+    private BigDecimal lastYearActual;
+
+    /**
+     * 状态 (0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 业务人员名称
+     */
+    @TableField(exist = false)
+    private String salesUserName;
+
+    /**
+     * 客服人员名称
+     */
+    @TableField(exist = false)
+    private String serviceUserName;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 105 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ClientTask.java

@@ -0,0 +1,105 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 客户目标任务对象 crm_client_task
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_client_task")
+public class ClientTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 客户档案ID
+     */
+    private Long clientId;
+
+    /**
+     * 客户编号
+     */
+    private String clientCode;
+
+    /**
+     * 客户名称
+     */
+    private String clientName;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 行业条线
+     */
+    private String industryLine;
+
+    /**
+     * 业务人员ID
+     */
+    private Long salesUserId;
+
+    /**
+     * 年度任务(元)
+     */
+    private BigDecimal annualTask;
+
+    /**
+     * 累计总实绩(元)
+     */
+    private BigDecimal actualAchievement;
+
+    /**
+     * 关联主任务ID
+     */
+    private Long parentTaskId;
+
+    /**
+     * 状态 (0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志 (0存在 2删除)
+     */
+    private String delFlag;
+
+}

+ 224 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ContactPerson.java

@@ -0,0 +1,224 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 联系人对象 contactperson
+ *
+ * @author LionLi
+ * @date 2024-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("contactperson")
+public class ContactPerson extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "Id")
+    private Long id;
+
+    /**
+     * 人员编号
+     */
+    @TableField("PersonnelNumber")
+    private String personnelNumber;
+
+    /**
+     * 姓名
+     */
+    @TableField("`Name`")
+    private String name;
+
+    /**
+     * 联系人类型
+     */
+    @TableField("ContactType")
+    private String contactType;
+
+    /**
+     * 性别
+     */
+    @TableField("Sex")
+    private String sex;
+
+    /**
+     * 年龄
+     */
+    @TableField("Age")
+    private Integer age;
+
+    /**
+     * 籍贯
+     */
+    @TableField("NativePlace")
+    private String nativePlace;
+
+    /**
+     * 生日
+     */
+    @TableField("Birthday")
+    private Date birthday;
+
+    /**
+     * 工作描述
+     */
+    @TableField("WorkDesc")
+    private String workDesc;
+
+    /**
+     * 公司编号
+     */
+    @TableField("CompanyNo")
+    private String companyNo;
+
+    /**
+     * 客户编号
+     */
+    @TableField("CustomerNo")
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    @TableField("CustomName")
+    private String customName;
+
+    /**
+     * 在职状态代码
+     */
+    @TableField("EmploymentStatusCode")
+    private String employmentStatusCode;
+
+    /**
+     * 手机号码
+     */
+    @TableField("PhoneNumber")
+    private String phoneNumber;
+
+    /**
+     * 部门
+     */
+    @TableField("Department")
+    private String department;
+
+    /**
+     * 职位
+     */
+    @TableField("Position")
+    private String position;
+
+    /**
+     * 座机
+     */
+    @TableField("Landline")
+    private String landline;
+
+    /**
+     * 项目角色
+     */
+    @TableField("ProjectRole")
+    private String projectRole;
+
+    /**
+     * 是否关键人物
+     */
+    @TableField("IzCruxPerson")
+    private String izCruxPerson;
+
+    /**
+     * 办公地址
+     */
+    @TableField("OfficeAddress")
+    private String officeAddress;
+
+    /**
+     * 工作地址
+     */
+    @TableField("WorkAddress")
+    private String workAddress;
+
+    /**
+     * 权限描述
+     */
+    @TableField("AuthorityDesc")
+    private String authorityDesc;
+
+    /**
+     * 项目关系描述
+     */
+    @TableField("ProjectRelationDesc")
+    private String projectRelationDesc;
+
+    /**
+     * 家庭地址
+     */
+    @TableField("HomeAddress")
+    private String homeAddress;
+
+    /**
+     * 家属地址
+     */
+    @TableField("FamilyAddress")
+    private String familyAddress;
+
+    /**
+     * 是否吸烟
+     */
+    @TableField("IzSmoking")
+    private Integer izSmoking;
+
+    /**
+     * 是否饮酒
+     */
+    @TableField("IzWineDrink")
+    private Integer izWineDrink;
+
+    /**
+     * 家庭情况
+     */
+    @TableField("FamilySituation")
+    private String familySituation;
+
+    /**
+     * 爱好
+     */
+    @TableField("Fond")
+    private String fond;
+
+    /**
+     * 性格
+     */
+    @TableField("`Character`")
+    private String characterDesc;
+
+    /**
+     * 是否删除(0-否,1-是)
+     */
+    @TableField("IsDelete")
+    @TableLogic
+    private Integer isDelete;
+
+    /**
+     * 项目商机ID
+     */
+    @TableField("OpportunityId")
+    private Long opportunityId;
+
+    /**
+     * 平台标识
+     */
+    @TableField("platform_code")
+    private String platformCode;
+
+}

+ 194 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmCustomerCare.java

@@ -0,0 +1,194 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户关怀信息对象 crm_customer_care
+ *
+ * @author yoe
+ * @date 2026-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customerconcern")
+public class CrmCustomerCare extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "Id")
+    private Long id;
+
+    /**
+     * 收据/单据编号
+     */
+    @TableField("ReceiptId")
+    private String receiptId;
+
+    /**
+     * 客户ID
+     */
+    @TableField("CustomerId")
+    private String customerId;
+
+    /**
+     * 客户名称
+     */
+    @TableField("CustomerName")
+    private String customerName;
+
+    /**
+     * 行业
+     */
+    @TableField("Profession")
+    private String profession;
+
+    /**
+     * 部门
+     */
+    @TableField("Department")
+    private String department;
+
+    /**
+     * 销售员
+     */
+    @TableField("Salesman")
+    private String salesman;
+
+    /**
+     * 人员编号
+     */
+    @TableField("PersonnelNumber")
+    private String personnelNumber;
+
+    /**
+     * 联系人
+     */
+    @TableField("ContactPerson")
+    private String contactPerson;
+
+    /**
+     * 电话
+     */
+    @TableField("Phone")
+    private String phone;
+
+    /**
+     * 固定电话
+     */
+    @TableField("Telephone")
+    private String telephone;
+
+    /**
+     * 关注类型
+     */
+    @TableField("ConcernType")
+    private String concernType;
+
+    /**
+     * 金额
+     */
+    @TableField("Amount")
+    private BigDecimal amount;
+
+    /**
+     * 需求日期
+     */
+    @TableField("RequirementDate")
+    private Date requirementDate;
+
+    /**
+     * 文件编号
+     */
+    @TableField("FileNo")
+    private String fileNo;
+
+    /**
+     * 礼品描述
+     */
+    @TableField("GiftDesc")
+    private String giftDesc;
+
+    /**
+     * 关注论据
+     */
+    @TableField("ConcernArgument")
+    private String concernArgument;
+
+    /**
+     * 审核状态(0-待审核,1-已通过,2-已驳回)
+     */
+    @TableField("AuditStatus")
+    private Integer auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    @TableField("AuditPeople")
+    private Long auditPeople;
+
+    /**
+     * 审核日期
+     */
+    @TableField("AuditDate")
+    private Date auditDate;
+
+    /**
+     * 创建组织ID(对应数据库 CreateOrgId,由 createDept 填充)
+     */
+    @TableField(value = "CreateOrgId", fill = FieldFill.INSERT)
+    private Long createOrgId;
+
+    /**
+     * 创建部门 (表无此列,排除;setter 同步到 createOrgId)
+     */
+    @TableField(exist = false)
+    private Long createDept;
+
+    public void setCreateDept(Long createDept) {
+        this.createDept = createDept;
+        this.createOrgId = createDept;
+    }
+
+    /**
+     * 创建者 (覆盖 BaseEntity)
+     */
+    @TableField(value = "CreateUserId", fill = FieldFill.INSERT)
+    private Long createBy;
+
+    /**
+     * 创建时间 (覆盖 BaseEntity)
+     */
+    @TableField(value = "CreateTime", fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新者 (覆盖 BaseEntity)
+     */
+    @TableField(value = "UpdateUserId", fill = FieldFill.INSERT_UPDATE)
+    private Long updateBy;
+
+    /**
+     * 更新时间 (覆盖 BaseEntity)
+     */
+    @TableField(value = "UpdateTime", fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    /**
+     * 是否删除 (0-未删除, 1-已删除)
+     */
+    @TableLogic(value = "0", delval = "1")
+    @TableField("IsDelete")
+    private Boolean isDelete = false;
+
+}

+ 105 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmStaff.java

@@ -0,0 +1,105 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * CRM人员信息对象 crm_staff
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_staff")
+public class CrmStaff extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人员ID
+     */
+    @TableId(value = "staff_id")
+    private Long staffId;
+
+    /**
+     * 人员编码
+     */
+    private String staffCode;
+
+    /**
+     * 姓名
+     */
+    private String staffName;
+
+    /**
+     * 所属部门编码
+     */
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 岗位编码
+     */
+    private Long postId;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 角色编码
+     */
+    private Long roleId;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 有效期起始
+     */
+    private Date validFrom;
+
+    /**
+     * 有效期截止
+     */
+    private Date validTo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+}

+ 31 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitOperateLog.java

@@ -0,0 +1,31 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 拜访操作日志对象 crm_visit_operate_log
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_visit_operate_log")
+public class CrmVisitOperateLog extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @TableId
+    private Long id;
+
+    /** 拜访计划ID */
+    private Long planId;
+
+    /** 操作类型 */
+    private String operateType;
+
+    /** 操作明细 */
+    private String operateContent;
+}

+ 40 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitPlan.java

@@ -0,0 +1,40 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("callonplan")
+public class CrmVisitPlan extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "Id")
+    private Long id;
+
+    @TableField("PlanNo")
+    private String planNo;
+
+    @TableField("CallPeopleNo")
+    private Long visitorId;
+
+    @TableField("CallPeopleName")
+    private String visitorName;
+
+    @TableField("StartDate")
+    private Date startTime;
+
+    @TableField("EndDate")
+    private Date endTime;
+
+    @TableField("Status")
+    private String status;
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitRecord.java

@@ -0,0 +1,109 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 拜访跟进记录对象 crm_visit_record
+ *
+ * @author Lion Li
+ * @date 2024-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_visit_record")
+public class CrmVisitRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 记录编号
+     */
+    private String recordNo;
+
+    /**
+     * 关联拜访计划ID
+     */
+    private Long planId;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 部门
+     */
+    private String deptName;
+
+    /**
+     * 行业
+     */
+    private String industry;
+
+    /**
+     * 业务员
+     */
+    private String salesman;
+
+    /**
+     * 对象类型
+     */
+    private String objectType;
+
+    /**
+     * 拜访对象
+     */
+    private String visitObject;
+
+    /**
+     * 拜访人
+     */
+    private String visitorName;
+
+    /**
+     * 随访人
+     */
+    private String accompanyPerson;
+
+    /**
+     * 拜访日期
+     */
+    private Date visitDate;
+
+    /**
+     * 拜访方式
+     */
+    private String visitType;
+
+    /**
+     * 拜访目的
+     */
+    private String purpose;
+
+    /**
+     * 跟进情况
+     */
+    private String progress;
+
+    /**
+     * 记录图片
+     */
+    private String recordImages;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+}

+ 147 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CrmVisitRoutine.java

@@ -0,0 +1,147 @@
+package org.dromara.customer.domain;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 拜访日程对象 callonschedule
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("callonschedule")
+public class CrmVisitRoutine extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID,自增
+     */
+    @TableId(value = "Id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 计划编号,关联拜访计划表
+     */
+    @TableField("PlanNo")
+    private String planNo;
+
+    /**
+     * 日程编号,唯一标识
+     */
+    @TableField("ScheduleNo")
+    private String scheduleNo;
+
+    /**
+     * 关联类型
+     */
+    @TableField("RelevanceType")
+    private Integer relevanceType;
+
+    /**
+     * 对象编号
+     */
+    @TableField("ObjectNo")
+    private String objectNo;
+
+    /**
+     * 对象名称
+     */
+    @TableField("ObjectName")
+    private String objectName;
+
+    /**
+     * 客户编号
+     */
+    @TableField("CustomerNo")
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    @TableField("CustomerName")
+    private String customerName;
+
+    /**
+     * 拜访人员编号
+     */
+    @TableField("CallPeopleNo")
+    private Long callPeopleNo;
+
+    /**
+     * 拜访人员姓名
+     */
+    @TableField("CallPeopleName")
+    private String callPeopleName;
+
+    /**
+     * 拜访日期
+     */
+    @TableField("CallDate")
+    private Date callDate;
+
+    /**
+     * 跟进人员编号
+     */
+    @TableField("FollowPeopleNo")
+    private String followPeopleNo;
+
+    /**
+     * 跟进人员姓名
+     */
+    @TableField("FollowPeopleName")
+    private String followPeopleName;
+
+    /**
+     * 紧要级别
+     */
+    @ExcelProperty(value = "紧要级别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1=一般,2=重要,3=紧急")
+    @TableField("ImportantLevel")
+    private Integer importantLevel;
+
+    /**
+     * 拜访目的
+     */
+    @TableField("PurposeVisit")
+    private String purposeVisit;
+
+    /**
+     * 日程状态
+     */
+    @ExcelProperty(value = "日程状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=未执行,1=已执行,2=放弃执行")
+    @TableField("ScheduleStatus")
+    private Integer scheduleStatus;
+
+    /**
+     * 实际执行时间
+     */
+    @TableField("ExecuteTime")
+    private Date executeTime;
+
+    /**
+     * 未执行原因
+     */
+    @TableField("UnExecuteReason")
+    private String unExecuteReason;
+
+    /**
+     * 是否删除 (0:否, 1:是)
+     */
+    @TableLogic(value = "0", delval = "1")
+    @TableField("IsDelete")
+    private Integer isDelete;
+
+}

+ 125 - 22
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContact.java

@@ -1,18 +1,18 @@
 package org.dromara.customer.domain;
 
-import org.dromara.common.tenant.core.TenantEntity;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
 import java.util.Date;
 
 /**
  * 客户联系人信息对象 customer_contact
- *
- * @author LionLi
- * @date 2025-12-11
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -28,7 +28,9 @@ public class CustomerContact extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
-    /*系统用户id*/
+    /**
+     * 系统用户Id
+     */
     private Long userId;
 
     /**
@@ -36,8 +38,9 @@ public class CustomerContact extends TenantEntity {
      */
     private Long customerId;
 
-
-    /*联系人编号*/
+    /**
+     * 联系人编号
+     */
     private String contactNo;
 
     /**
@@ -45,8 +48,10 @@ public class CustomerContact extends TenantEntity {
      */
     private String contactName;
 
-    /*自定义登录名*/
-    private String customLoginName;
+    /**
+     * 微信号
+     */
+    private String wechat;
 
     /**
      * 手机号码
@@ -69,20 +74,30 @@ public class CustomerContact extends TenantEntity {
     private String gender;
 
     /**
-     * 采购角色(如:采购经理、财务)
+     * 自定义登录名
+     */
+    private String customLoginName;
+
+    /**
+     * 采购角色ID
      */
     private Long roleId;
 
+    /**
+     * 采购角色名称
+     */
     private String roleName;
 
+    /**
+     * 所属部门ID
+     */
     private Long deptId;
 
+    /**
+     * 所属部门名称
+     */
     private String deptName;
 
-    private String email;
-
-    private Date birthday;
-
     /**
      * 是否主联系人:0=是,1=否
      */
@@ -91,28 +106,38 @@ public class CustomerContact extends TenantEntity {
     /**
      * 详细地址
      */
-    private String addressDetail;
+    private String detailAddress;
 
     /**
-     * 所在省编码
+     * 所在省ID
      */
-    private String addressProvince;
+    private Long provinceId;
 
     /**
-     * 所在市编码
+     * 所在市ID
      */
-    private String addressCity;
+    private Long cityId;
 
     /**
-     * 所在区县编码
+     * 所在区县ID
      */
-    private String addressCounty;
+    private Long districtId;
 
     /**
      * 省市区
      */
     private String provincialCityCounty;
 
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 生日
+     */
+    private Date birthday;
+
     /**
      * 状态(0正常 1停用)
      */
@@ -129,5 +154,83 @@ public class CustomerContact extends TenantEntity {
      */
     private String remark;
 
+    // --- 以下字段移至扩展表 customer_contact_info,标记为非数据库字段以兼容旧逻辑 ---
+
+    /**
+     * 联系人类型 (1公司职员 2关系资源人)
+     */
+    @TableField(exist = false)
+    private String type;
+
+    /**
+     * 年龄
+     */
+    @TableField(exist = false)
+    private Integer age;
+
+    /**
+     * 籍贯
+     */
+    @TableField(exist = false)
+    private String nativePlace;
+
+    /**
+     * 在职状态 (1在职 2离职)
+     */
+    @TableField(exist = false)
+    private String jobStatus;
+
+    /**
+     * 工作内容
+     */
+    @TableField(exist = false)
+    private String jobContent;
+
+    /**
+     * 家庭地址(省)
+     */
+    @TableField(exist = false)
+    private Long homeProvinceId;
+
+    /**
+     * 家庭地址(市)
+     */
+    @TableField(exist = false)
+    private Long homeCityId;
 
+    /**
+     * 家庭详细地址
+     */
+    @TableField(exist = false)
+    private String homeAddressDetail;
+
+    /**
+     * 家庭情况
+     */
+    @TableField(exist = false)
+    private String familyStatus;
+
+    /**
+     * 爱好
+     */
+    @TableField(exist = false)
+    private String hobby;
+
+    /**
+     * 性格特征
+     */
+    @TableField(exist = false)
+    private String characterTrait;
+
+    /**
+     * 是否抽烟 (1是 0否)
+     */
+    @TableField(exist = false)
+    private String isSmoke;
+
+    /**
+     * 是否喝酒 (1是 0否)
+     */
+    @TableField(exist = false)
+    private String isDrink;
 }

+ 100 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContactInfo.java

@@ -0,0 +1,100 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.customer.domain.vo.CustomerContactVo;
+
+import java.io.Serial;
+
+/**
+ * 客户联系人扩展信息对象 customer_contact_info
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_contact_info")
+@AutoMapper(target = CustomerContactVo.class)
+public class CustomerContactInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联联系人ID
+     */
+    private Long contactId;
+
+    /**
+     * 联系人类型 (1公司职员 2关系资源人)
+     */
+    private String type;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 籍贯
+     */
+    private String nativePlace;
+
+    /**
+     * 在职状态 (1在职 2离职)
+     */
+    private String jobStatus;
+
+    /**
+     * 工作内容
+     */
+    private String jobContent;
+
+    /**
+     * 家庭地址(省)
+     */
+    private Long homeProvinceId;
+
+    /**
+     * 家庭地址(市)
+     */
+    private Long homeCityId;
+
+    /**
+     * 家庭详细地址
+     */
+    private String homeAddressDetail;
+
+    /**
+     * 家庭情况
+     */
+    private String familyStatus;
+
+    /**
+     * 爱好
+     */
+    private String hobby;
+
+    /**
+     * 性格特征
+     */
+    private String characterTrait;
+
+    /**
+     * 是否抽烟 (1是 0否)
+     */
+    private String isSmoke;
+
+    /**
+     * 是否喝酒 (1是 0否)
+     */
+    private String isDrink;
+}

+ 67 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerDict.java

@@ -0,0 +1,67 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.customer.domain.vo.CustomerDictVo;
+
+/**
+ * 通用字典对象 commondicc
+ *
+ * @author LionLi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerDictVo.class)
+@TableName("commondicc")
+public class CustomerDict extends TenantEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "Id")
+    private Integer id;
+
+    /**
+     * 名称
+     */
+    @TableField("Name")
+    private String name;
+
+    /**
+     * 代码 (对应 dictType)
+     */
+    @TableField("Code")
+    private String code;
+
+    /**
+     * 代码索引 (对应 dictValue)
+     */
+    @TableField("CodeIndex")
+    private Integer codeIndex;
+
+    /**
+     * 值
+     */
+    @TableField("Value")
+    private String value;
+
+    /**
+     * 排序
+     */
+    @TableField("Sort")
+    private Integer sort;
+
+    /**
+     * 备注
+     */
+    @TableField("Remark")
+    private String remark;
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerExtContact.java

@@ -0,0 +1,94 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 客户扩展联系人对象 crm_customer_ext_contact
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_customer_ext_contact")
+public class CustomerExtContact extends TenantEntity {
+
+    /** 主键ID */
+    @TableId(value = "id")
+    private Long id;
+
+    /** 关联客户ID */
+    private Long customerId;
+
+    /** 姓名 */
+    private String name;
+
+    /** 联系人类型 (1公司职员 2关系资源人) */
+    private String type;
+
+    /** 性别 (1男 2女) */
+    private String gender;
+
+    /** 年龄 */
+    private Integer age;
+
+    /** 籍贯 */
+    private String nativePlace;
+
+    /** 生日 */
+    private Date birthday;
+
+    /** 在职状态 (1在职 2离职) */
+    private String jobStatus;
+
+    /** 手机号码 */
+    private String mobile;
+
+    /** 部门 */
+    private String dept;
+
+    /** 职位 */
+    private String jobTitle;
+
+    /** 办公座机 */
+    private String tel;
+
+    /** 办公省市 */
+    private String officeProvince;
+
+    /** 办公详细地址 */
+    private String officeAddressDetail;
+
+    /** 工作内容 */
+    private String jobContent;
+
+    /** 家庭省市 */
+    private String homeProvince;
+
+    /** 家庭详细地址 */
+    private String homeAddressDetail;
+
+    /** 家庭情况 */
+    private String familyStatus;
+
+    /** 爱好 */
+    private String hobby;
+
+    /** 性格特征 */
+    private String characterTrait;
+
+    /** 是否抽烟 */
+    private String isSmoke;
+
+    /** 是否喝酒 */
+    private String isDrink;
+
+    /** 描述/备注 */
+    private String remark;
+
+    /** 删除标志(0存在 2删除) */
+    private String delFlag;
+}

+ 60 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java

@@ -78,6 +78,18 @@ public class CustomerInfo extends TenantEntity {
      */
     private Long customerTypeId;
 
+    /**
+     * 客户来源
+     */
+    @TableField(exist = false)
+    private Long customerSourceId;
+
+    /**
+     * 企业类型
+     */
+    @TableField(exist = false)
+    private Long enterpriseTypeId;
+
     /**
      * 行业类别
      */
@@ -177,5 +189,53 @@ public class CustomerInfo extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 合作类型(整数代码)
+     */
+    @TableField("Cooperation")
+    private Integer cooperation;
+
+    /**
+     * 企业类型(整数代码)
+     */
+    @TableField("EnterpriseType")
+    private Integer enterpriseType;
+
+    /**
+     * 企业来源(整数代码)
+     */
+    @TableField("EnterpriseSource")
+    private Integer enterpriseSource;
+
+    /**
+     * 采购类型
+     */
+    @TableField("ProcurementType")
+    private String procurementType;
+
+    /**
+     * 是否批准(布尔值)
+     */
+    @TableField("IsApprove")
+    private Boolean isApprove;
+
+    /**
+     * 年采购规模
+     */
+    @TableField("AnnualProcurementScale")
+    private String annualProcurementScale;
+
+    /**
+     * 销售目标
+     */
+    @TableField("SalesTarget")
+    private String salesTarget;
+
+    /**
+     * 文件编号
+     */
+    @TableField("FileNo")
+    private String fileNo;
+
 
 }

+ 65 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerTarget.java

@@ -0,0 +1,65 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 客户任务分解对象 crm_customer_target
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_customer_target")
+public class CustomerTarget extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 冲刺任务(元)
+     */
+    private BigDecimal sprintTask;
+
+    /**
+     * 客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 客户名称 (冗余用于显示)
+     */
+    private String customerName;
+
+    /**
+     * 重点项目
+     */
+    private String keyProject;
+
+    /**
+     * 关联主任务ID (指向 crm_annual_task)
+     */
+    private Long parentTaskId;
+
+}

+ 170 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/FollowUpLog.java

@@ -0,0 +1,170 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 跟进记录对象 followuplog
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("followuplog")
+public class FollowUpLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "Id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 记录编号
+     */
+    @TableField("RecordsNo")
+    private String recordsNo;
+
+    /**
+     * 数据类型
+     */
+    @TableField("DataType")
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    @TableField("ObjectNo")
+    private String objectNo;
+
+    /**
+     * 客户编号
+     */
+    @TableField("CustomerNo")
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    @TableField("CustomerName")
+    private String customerName;
+
+    /**
+     * 目标对象编号
+     */
+    @TableField("GoalObjectNo")
+    private String goalObjectNo;
+
+    /**
+     * 目标对象
+     */
+    @TableField("GoalObject")
+    private String goalObject;
+
+    /**
+     * 部门
+     */
+    @TableField("Department")
+    private String department;
+
+    /**
+     * 行业
+     */
+    @TableField("Profession")
+    private String profession;
+
+    /**
+     * 业务员
+     */
+    @TableField("Salesman")
+    private String salesman;
+
+    /**
+     * 拜访人编号
+     */
+    @TableField("VisitorNo")
+    private Long visitorNo;
+
+    /**
+     * 拜访人
+     */
+    @TableField("Visitor")
+    private String visitor;
+
+    /**
+     * 跟进人编号
+     */
+    @TableField("FollowPeopleNo")
+    private String followPeopleNo;
+
+    /**
+     * 跟进人姓名
+     */
+    @TableField("FollowPeopleName")
+    private String followPeopleName;
+
+    /**
+     * 拜访类型代码
+     */
+    @TableField("CallTypeCode")
+    private String callTypeCode;
+
+    /**
+     * 拜访日期
+     */
+    @TableField("CallDate")
+    private Date callDate;
+
+    /**
+     * 下次拜访日期
+     */
+    @TableField("NextCallDate")
+    private Date nextCallDate;
+
+    /**
+     * 拜访目的
+     */
+    @TableField("CallAim")
+    private String callAim;
+
+    /**
+     * 跟进情况
+     */
+    @TableField("FollowUpCondition")
+    private String followUpCondition;
+
+    /**
+     * 记录图片
+     */
+    @TableField("RecordPicture")
+    private String recordPicture;
+
+    /**
+     * 文件编号
+     */
+    @TableField("FileNo")
+    private String fileNo;
+
+    /**
+     * 创建部门
+     */
+    @TableField(exist = false)
+    private Long createDept;
+
+    /**
+     * 是否删除(0-否,1-是)
+     */
+    @TableLogic(value = "0", delval = "1")
+    @TableField("IsDelete")
+    private Integer isDelete = 0;
+
+}

+ 114 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MonthlyTask.java

@@ -0,0 +1,114 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 月度任务信息对象 crm_monthly_task
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_monthly_task")
+public class MonthlyTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 所属季度任务ID
+     */
+    private Long quarterlyTaskId;
+
+    /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 季度 (1:Q1, 2:Q2, 3:Q3, 4:Q4)
+     */
+    private Integer quarter;
+
+    /**
+     * 月份 (1-12)
+     */
+    private Integer month;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 行业条线
+     */
+    private String industryLine;
+
+    /**
+     * 业务人员ID
+     */
+    private Long salesUserId;
+
+    /**
+     * 客服人员/服务人员ID
+     */
+    private Long serviceUserId;
+
+    /**
+     * 月度目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 月度实绩(元)
+     */
+    private BigDecimal actualAchievement;
+
+    /**
+     * 核心客户
+     */
+    private String coreCustomer;
+
+    /**
+     * 重点项目
+     */
+    private String keyProject;
+
+    /**
+     * 潜在商机
+     */
+    private String potentialOpportunity;
+
+    /**
+     * 状态 (0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+}

+ 91 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/OperationLog.java

@@ -0,0 +1,91 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 操作日志对象 operationlog
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("operationlog")
+public class OperationLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "Id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 数据类型
+     */
+    @TableField("DataType")
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    @TableField("ObjectNo")
+    private String objectNo;
+
+    /**
+     * 操作人
+     */
+    @TableField("Operator")
+    private String operator;
+
+    /**
+     * 操作类型
+     */
+    @TableField("ActionType")
+    private Integer actionType;
+
+    /**
+     * 目标对象
+     */
+    @TableField("TargetObject")
+    private String targetObject;
+
+    /**
+     * 操作模块
+     */
+    @TableField("ActionModule")
+    private Integer actionModule;
+
+    /**
+     * 操作详情
+     */
+    @TableField("ActionDetails")
+    private String actionDetails;
+
+    /**
+     * 客户端信息
+     */
+    @TableField("ClientInformation")
+    private String clientInformation;
+
+    /**
+     * 是否删除(0-否,1-是)
+     */
+    @TableLogic(value = "0", delval = "1")
+    @TableField("IsDelete")
+    private Integer isDelete = 0;
+
+    /**
+     * 平台标识
+     */
+    @TableField("platform_code")
+    private String platformCode;
+
+}

+ 151 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/QuarterlyTask.java

@@ -0,0 +1,151 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+
+/**
+ * 季度任务信息对象 crm_quarterly_task
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("crm_quarterly_task")
+public class QuarterlyTask extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 年度任务ID
+     */
+    private Long annualTaskId;
+
+    /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 季度 (1:Q1, 2:Q2, 3:Q3, 4:Q4)
+     */
+    private Integer quarter;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 行业条线
+     */
+    private String industryLine;
+
+    /**
+     * 业务人员ID
+     */
+    private Long salesUserId;
+
+    /**
+     * 客服人员ID
+     */
+    private Long serviceUserId;
+
+    /**
+     * 关联年度目标任务(元) - 冒余字段
+     */
+    private BigDecimal annualTargetTask;
+
+    /**
+     * 关联年度冲刺任务(元) - 冗余字段
+     */
+    private BigDecimal annualSprintTask;
+
+    /**
+     * 季度目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 季度冲刺任务(元)
+     */
+    private BigDecimal sprintTask;
+
+    /**
+     * 季度占比(%)
+     */
+    private BigDecimal targetPercentage;
+
+    /**
+     * 季度总实绩(元)
+     */
+    private BigDecimal actualAchievement;
+
+    /**
+     * 当季第1个月实绩(元)
+     */
+    private BigDecimal month1Actual;
+
+    /**
+     * 当季第2个月实绩(元)
+     */
+    private BigDecimal month2Actual;
+
+    /**
+     * 当季第3个月实绩(元)
+     */
+    private BigDecimal month3Actual;
+
+    /**
+     * 上年Q1实绩(元)
+     */
+    private BigDecimal lastYearQ1Actual;
+
+    /**
+     * 上年Q2实绩(元)
+     */
+    private BigDecimal lastYearQ2Actual;
+
+    /**
+     * 上年Q3实绩(元)
+     */
+    private BigDecimal lastYearQ3Actual;
+
+    /**
+     * 上年Q4实绩(元)
+     */
+    private BigDecimal lastYearQ4Actual;
+
+    /**
+     * 状态 (0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 159 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesAccountsReceivable.java

@@ -0,0 +1,159 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 应收账款对象 salesaccountsreceivable
+ * 注意:该表列名使用 PascalCase,需通过 @TableField 显式指定列名
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@Data
+@TableName("salesaccountsreceivable")
+public class SalesAccountsReceivable implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId("Id")
+    private Long id;
+
+    /**
+     * 应收账款编号
+     */
+    @TableField("AccountsReceivableNo")
+    private String accountsReceivableNo;
+
+    /**
+     * 产品名称
+     */
+    @TableField("ProductName")
+    private String productName;
+
+    /**
+     * 发票日期
+     */
+    @TableField("InvoiceDate")
+    private Date invoiceDate;
+
+    /**
+     * 发票号码
+     */
+    @TableField("InvoiceNumber")
+    private String invoiceNumber;
+
+    /**
+     * 发票金额
+     */
+    @TableField("InvoiceAmount")
+    private BigDecimal invoiceAmount;
+
+    /**
+     * 账单周期
+     */
+    @TableField("BillingCycle")
+    private Integer billingCycle;
+
+    /**
+     * 到期日期
+     */
+    @TableField("DueDate")
+    private Date dueDate;
+
+    /**
+     * 逾期天数
+     */
+    @TableField("OverdueDays")
+    private Integer overdueDays;
+
+    /**
+     * 已付金额
+     */
+    @TableField("PaidAmount")
+    private BigDecimal paidAmount;
+
+    /**
+     * 是否欠款(0-否,1-是)
+     */
+    @TableField("IzArrears")
+    private Integer izArrears;
+
+    /**
+     * 逾期余额
+     */
+    @TableField("OverdueBalance")
+    private BigDecimal overdueBalance;
+
+    /**
+     * 公司名称
+     */
+    @TableField("CompanyName")
+    private String companyName;
+
+    /**
+     * 联系人
+     */
+    @TableField("ContactPerson")
+    private String contactPerson;
+
+    /**
+     * 电话
+     */
+    @TableField("Telephone")
+    private String telephone;
+
+    /**
+     * 状态
+     */
+    @TableField("Status")
+    private String status;
+
+    /**
+     * 创建时间
+     */
+    @TableField("CreateTime")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("UpdateTime")
+    private Date updateTime;
+
+    /**
+     * 创建用户ID
+     */
+    @TableField("CreateUserId")
+    private Long createUserId;
+
+    /**
+     * 更新用户ID
+     */
+    @TableField("UpdateUserId")
+    private Long updateUserId;
+
+    /**
+     * 附件编号
+     */
+    @TableField("FileNo")
+    private String fileNo;
+
+    /**
+     * 是否删除(0-否,1-是)
+     */
+    @TableLogic
+    @TableField("IsDelete")
+    private Integer isDelete;
+
+}

+ 300 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesAnnualFinalization.java

@@ -0,0 +1,300 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 年度入围项目对象 salesannualfinalization
+ *
+ * @author Antigravity
+ * @date 2026-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("salesannualfinalization")
+public class SalesAnnualFinalization extends TenantEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "Id")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @TableField(value = "ProjectNo")
+    private String projectNo;
+
+    /**
+     * 公司编号
+     */
+    @TableField(value = "CompanyNo")
+    private String companyNo;
+
+    /**
+     * 项目名称
+     */
+    @TableField(value = "ProjectName")
+    private String projectName;
+
+    /**
+     * 项目状态
+     */
+    @TableField(value = "ProjectStatus")
+    private Integer projectStatus;
+
+    /**
+     * 业务类型
+     */
+    @TableField(value = "BusinessType")
+    private Integer businessType;
+
+    /**
+     * 项目级别
+     */
+    @TableField(value = "ProjectLevel")
+    private Integer projectLevel;
+
+    /**
+     * 客户编号
+     */
+    @TableField(value = "CustomNo")
+    private String customNo;
+
+    /**
+     * 客户名称
+     */
+    @TableField(value = "CustomName")
+    private String customName;
+
+    /**
+     * 行业
+     */
+    @TableField(value = "Profession")
+    private Integer profession;
+
+    /**
+     * 部门编号
+     */
+    @TableField(value = "DeptNo")
+    private String deptNo;
+
+    /**
+     * 业务员
+     */
+    @TableField(value = "Salesman")
+    private String salesman;
+
+    /**
+     * 客服
+     */
+    @TableField(value = "CustomService")
+    private String customService;
+
+    /**
+     * 签约日期
+     */
+    @TableField(value = "SignDate")
+    private Date signDate;
+
+    /**
+     * 项目金额
+     */
+    @TableField(value = "Amount")
+    private BigDecimal amount;
+
+    /**
+     * 入围费
+     */
+    @TableField(value = "EntryFee")
+    private BigDecimal entryFee;
+
+    /**
+     * 投标保证金
+     */
+    @TableField(value = "BidBond")
+    private BigDecimal bidBond;
+
+    /**
+     * 保证金状态
+     */
+    @TableField(value = "BidBondStatus")
+    private Integer bidBondStatus;
+
+    /**
+     * 招标日期
+     */
+    @TableField(value = "TenderDate")
+    private Date tenderDate;
+
+    /**
+     * 中标率
+     */
+    @TableField(value = "WinningRate")
+    private Double winningRate;
+
+    /**
+     * 报名截止日期
+     */
+    @TableField(value = "SignUpDeadline")
+    private Date signUpDeadline;
+
+    /**
+     * 投标截止日期
+     */
+    @TableField(value = "TenderDeadline")
+    private Date tenderDeadline;
+
+    /**
+     * 标准周期
+     */
+    @TableField(value = "StandardPeriod")
+    private Double standardPeriod;
+
+    /**
+     * 入围类型
+     */
+    @TableField(value = "ShortlistedType")
+    private Integer shortlistedType;
+
+    /**
+     * 招标类型
+     */
+    @TableField(value = "BiddingType")
+    private Integer biddingType;
+
+    /**
+     * 招标代理机构
+     */
+    @TableField(value = "BiddingAgency")
+    private String biddingAgency;
+
+    /**
+     * 代理联系人
+     */
+    @TableField(value = "AgencyContact")
+    private String agencyContact;
+
+    /**
+     * 项目描述
+     */
+    @TableField(value = "ProjectDesc")
+    private String projectDesc;
+
+    /**
+     * 负责人ID
+     */
+    @TableField(value = "Leader")
+    private Long leader;
+
+    /**
+     * 负责人名称
+     */
+    @TableField(value = "LeaderName")
+    private String leaderName;
+
+    /**
+     * 文件编号
+     */
+    @TableField(value = "FileNo")
+    private String fileNo;
+
+    /**
+     * 产品支持
+     */
+    @TableField(value = "ProductSupport")
+    private String productSupport;
+
+    /**
+     * 是否删除 0=否 1=是
+     */
+    @TableLogic
+    @TableField(value = "IsDelete")
+    private Integer isDelete;
+
+
+    /**
+     * 项目进度
+     */
+    @TableField(value = "ProjectSchedule")
+    private String projectSchedule;
+
+    /**
+     * 投标周期类型
+     */
+    @TableField(value = "BidPeriodType")
+    private Integer bidPeriodType;
+
+    /**
+     * 下次招标时间
+     */
+    @TableField(value = "NextBiddingTime")
+    private Date nextBiddingTime;
+
+    /**
+     * 入围类型 (FinalizationType)
+     */
+    @TableField(value = "FinalizationType")
+    private Integer finalizationType;
+
+    /**
+     * 提前通知天数
+     */
+    @TableField(value = "NoticeAdvanceDays")
+    private Integer noticeAdvanceDays;
+
+    /**
+     * 是否提前通知
+     */
+    @TableField(value = "IsNoticeAdvance")
+    private Integer isNoticeAdvance;
+
+    /**
+     * 项目等级
+     */
+    @TableField(value = "ProjectGrade")
+    private String projectGrade;
+
+    /**
+     * 条件
+     */
+    @TableField(value = "`Condition`")
+    private String condition;
+
+    /**
+     * 招标链接
+     */
+    @TableField(value = "BiddingLink")
+    private String biddingLink;
+
+    /**
+     * 平台名称
+     */
+    @TableField(value = "PlatformName")
+    private String platformName;
+
+    /**
+     * 平台链接
+     */
+    @TableField(value = "PlatformLink")
+    private String platformLink;
+
+    /**
+     * 服务时间
+     */
+    @TableField(value = "ServiceTime")
+    private String serviceTime;
+
+}
+

+ 141 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SalesQuotationList.java

@@ -0,0 +1,141 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 销售报价单明细对象 salesquotationlist
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("salesquotationlist")
+public class SalesQuotationList extends TenantEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "Id")
+    private Long id;
+
+    /**
+     * 报价单号
+     */
+    @TableField(value = "QuotationNo")
+    private String quotationNo;
+
+    /**
+     * 产品编号
+     */
+    @TableField(value = "ProductNo")
+    private String productNo;
+
+    /**
+     * 产品图片
+     */
+    @TableField(value = "ProductImage")
+    private String productImage;
+
+    /**
+     * 产品名称
+     */
+    @TableField(value = "ProductName")
+    private String productName;
+
+    /**
+     * 单位名称
+     */
+    @TableField(value = "UnitName")
+    private String unitName;
+
+    /**
+     * 市场价格
+     */
+    @TableField(value = "MarketPrice")
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    @TableField(value = "MemberPrice")
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    @TableField(value = "MinSellingPrice")
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 最小订购数量
+     */
+    @TableField(value = "MinOrderQuantity")
+    private Integer minOrderQuantity;
+
+    /**
+     * 采购数量
+     */
+    @TableField(value = "PurchaseQuantity")
+    private Integer purchaseQuantity;
+
+    /**
+     * 报价
+     */
+    @TableField(value = "Quote")
+    private BigDecimal quote;
+
+    /**
+     * 利润率
+     */
+    @TableField(value = "ProfitMargin")
+    private Double profitMargin;
+
+    /**
+     * 报价状态
+     */
+    @TableField(value = "QuoteStatus")
+    private Integer quoteStatus;
+
+    /**
+     * 创建用户ID
+     */
+    @TableField(value = "CreateUserId")
+    private Long createUserId;
+
+    /**
+     * 更新用户ID
+     */
+    @TableField(value = "UpdateUserId")
+    private Long updateUserId;
+
+    /**
+     * 是否删除(0-否,1-是)
+     */
+    @TableLogic
+    @TableField(value = "IsDelete")
+    private Integer isDelete;
+
+    /**
+     * 客户ID
+     */
+    @TableField(value = "customer_id")
+    private Integer customerId;
+
+    /**
+     * 附件编号
+     */
+    @TableField(value = "FileNo")
+    private String fileNo;
+}

+ 205 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/Salesleads.java

@@ -0,0 +1,205 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 销售线索对象 salesleads
+ *
+ * @author Antigravity
+ * @date 2026-04-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("salesleads")
+public class Salesleads extends TenantEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 是否线索(0:否, 1:是)
+     */
+    private Integer izClue;
+
+    /**
+     * 项目编号
+     */
+    private String projectNo;
+
+    /**
+     * 公司编号
+     */
+    private String companyNo;
+
+    /**
+     * 部门编号
+     */
+    private String deptNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 项目类型
+     */
+    private String projectType;
+
+    /**
+     * 项目预算
+     */
+    private BigDecimal projectBudget;
+
+    /**
+     * 中标率
+     */
+    private String winRate;
+
+    /**
+     * 批准日期
+     */
+    private Date approvalDate;
+
+    /**
+     * 预计完成时间
+     */
+    private Date expectedCompletionTime;
+
+    /**
+     * 项目级别
+     */
+    private Integer projectLevel;
+
+    /**
+     * 行业
+     */
+    private Long profession;
+
+    /**
+     * 业务人员
+     */
+    private String businessPersonnel;
+
+    /**
+     * 提交人
+     */
+    private String submitter;
+
+    /**
+     * 项目区域
+     */
+    private String projectArea;
+
+    /**
+     * 采购方式
+     */
+    private Integer procurementMethod;
+
+    /**
+     * 信息来源
+     */
+    private Integer infoSource;
+
+    /**
+     * 竞争对手
+     */
+    private String competitor;
+
+    /**
+     * 项目描述
+     */
+    private String projectDescription;
+
+    /**
+     * 档案编号
+     */
+    private String fileNo;
+
+    /**
+     * 负责人ID
+     */
+    private Long leader;
+
+    /**
+     * 负责人姓名
+     */
+    private String leaderName;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+
+    /**
+     * 活动编号
+     */
+    private String activityNo;
+
+    /**
+     * 营销活动名称
+     */
+    private String marketingActivityName;
+
+    /**
+     * 产品支持
+     */
+    private String productSupport;
+
+
+    /**
+     * 项目进度
+     */
+    private String projectSchedule;
+
+    /**
+     * 公开招标截止日期
+     */
+    private Date publicBiddingDeadline;
+
+    /**
+     * 采购内容
+     */
+    private String purchaseContent;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/Salesresultanalyze.java

@@ -0,0 +1,71 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 销售结果分析对象 salesresultanalyze
+ *
+ * @author Antigravity
+ * @date 2026-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("salesresultanalyze")
+public class Salesresultanalyze extends TenantEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "Id")
+    private Long id;
+
+    /**
+     * 数据类型(1:线索, 2:商机, 等)
+     */
+    @TableField("DataType")
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    @TableField("ObjectNo")
+    private String objectNo;
+
+    /**
+     * 成交结果(1:赢单, 2:丢单)
+     */
+    @TableField("DealResult")
+    private Integer dealResult;
+
+    /**
+     * 胜利总结
+     */
+    @TableField("WinSumUp")
+    private String winSumUp;
+
+    /**
+     * 失败原因
+     */
+    @TableField("LoseReason")
+    private String loseReason;
+
+    /**
+     * 文件编号
+     */
+    @TableField("FileNo")
+    private String fileNo;
+
+    /**
+     * 是否删除(0:否, 1:是)
+     */
+    @TableField("IsDelete")
+    private Integer isDelete;
+
+}

+ 160 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SysDept.java

@@ -0,0 +1,160 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author Antigravity
+ * @date 2026-04-02
+ */
+@Data
+@TableName("sys_dept")
+public class SysDept implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门id
+     */
+    @TableId(value = "dept_id")
+    private Long deptId;
+
+    /**
+     * 部门编号
+     */
+    private String deptNo;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 父部门id
+     */
+    private Long parentId;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 部门类别编码
+     */
+    private String deptCategory;
+
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    private Long leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 部门状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 创建部门
+     */
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+    /**
+     * 是否是公司(0是  1否)
+     */
+    private String isCompanyFlag;
+
+    /**
+     * 部门经理id
+     */
+    private Long managerId;
+
+    /**
+     * 部门主管id
+     */
+    private Long chargeId;
+
+    /**
+     * 部门经理编号
+     */
+    private String managerNo;
+
+    /**
+     * 部门主管编号
+     */
+    private String chargeNo;
+
+    /**
+     * 部门经理
+     */
+    private String managerName;
+
+    /**
+     * 部门主管
+     */
+    private String chargeName;
+
+}

+ 72 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/TeamMember.java

@@ -0,0 +1,72 @@
+package org.dromara.customer.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 团队成员对象 team_member
+ *
+ * @author Antigravity
+ * @date 2026-04-17
+ */
+@Data
+@TableName("team_member")
+public class TeamMember {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 数据类型:标识对象所属的业务类型(如1-销售线索项目) */
+    private Integer dataType;
+
+    /** 对象编号:关联团队/项目的编号 */
+    private String objectNo;
+
+    /** 用户编号:关联用户表 */
+    private Long userNo;
+
+    /** 真实姓名:团队成员的姓名 */
+    private String realName;
+
+    /** 角色代码:团队成员在团队中的角色 */
+    private String roleCode;
+
+    /** 更新授权:0-无权限,1-有权限 */
+    private Integer updateAccredit;
+
+    /** 是否管理员:0-普通成员,1-管理员 */
+    private Integer izManager;
+
+    /** 创建组织ID */
+    private Long createOrgId;
+
+    /** 创建时间 */
+    private Date createTime;
+
+    /** 更新时间 */
+    private Date updateTime;
+
+    /** 创建人ID */
+    private Long createUserId;
+
+    /** 更新人ID */
+    private Long updateUserId;
+
+    /** 删除标记:0-未删除,1-已删除 */
+    @TableLogic(value = "0", delval = "1")
+    private Integer isDelete;
+
+    /** 租户ID */
+    private String tenantId;
+
+    /** 平台标识 */
+    private String platformCode;
+}

+ 124 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/AnnualTaskBo.java

@@ -0,0 +1,124 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.AnnualTask;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import jakarta.validation.constraints.*;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+
+/**
+ * 销售年度任务业务对象
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AnnualTask.class, reverseConvertGenerate = false)
+public class AnnualTaskBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 年份 (如: 2026)
+     */
+    @NotNull(message = "年份不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer year;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 行业条线
+     */
+    private String industryLine;
+
+    /**
+     * 目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 冲刺任务(元)
+     */
+    private BigDecimal sprintTask;
+
+    /**
+     * 核心客户ID集合
+     */
+    private String coreCustomerIds;
+
+    /**
+     * 重点项目ID集合
+     */
+    private String keyProjectIds;
+
+    /**
+     * 业务人员ID
+     */
+    private Long salesUserId;
+
+    /**
+     * 业务人员名称
+     */
+    private String salesUserName;
+
+    /**
+     * 客服人员ID
+     */
+    private Long serviceUserId;
+
+    /**
+     * 客服人员名称
+     */
+    private String serviceUserName;
+
+    /**
+     * 实绩(元)
+     */
+    private BigDecimal actualAchievement;
+
+    /**
+     * 上年目标(元)
+     */
+    private BigDecimal lastYearTarget;
+
+    /**
+     * 上年实绩(元)
+     */
+    private BigDecimal lastYearActual;
+
+    /**
+     * 任务分解列表
+     */
+    private List<CustomerTargetBo> details;
+
+    /**
+     * 状态 (0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 13 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ClaimBo.java

@@ -0,0 +1,13 @@
+package org.dromara.customer.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ClaimBo implements Serializable {
+    private Long id;
+    private Long salespersonId;
+    private Long serviceStaffId;
+    private String keepOwner;
+}

+ 59 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ClientTaskBo.java

@@ -0,0 +1,59 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.ClientTask;
+
+import java.math.BigDecimal;
+
+/**
+ * 客户目标任务业务对象 crm_client_task
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ClientTask.class)
+@Schema(description = "客户目标任务业务对象")
+public class ClientTaskBo extends BaseEntity {
+
+    private Long id;
+
+    @Schema(description = "年份")
+    private Integer year;
+
+    @Schema(description = "客户档案ID")
+    private Long clientId;
+
+    @Schema(description = "客户编号")
+    private String clientCode;
+
+    @Schema(description = "客户名称")
+    private String clientName;
+
+    @Schema(description = "部门ID")
+    private Long deptId;
+
+    @Schema(description = "行业条线")
+    private String industryLine;
+
+    @Schema(description = "业务人员ID")
+    private Long salesUserId;
+
+    @Schema(description = "年度任务(元)")
+    private BigDecimal annualTask;
+
+    @Schema(description = "累计总实绩(元)")
+    private BigDecimal actualAchievement;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "状态")
+    private String status;
+
+}

+ 182 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ContactPersonBo.java

@@ -0,0 +1,182 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.ContactPerson;
+
+import java.util.Date;
+
+/**
+ * 联系人业务对象 contactperson
+ *
+ * @author LionLi
+ * @date 2024-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ContactPerson.class, reverseConvertGenerate = false)
+public class ContactPersonBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 人员编号
+     */
+    private String personnelNumber;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 联系人类型
+     */
+    private String contactType;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 籍贯
+     */
+    private String nativePlace;
+
+    /**
+     * 生日
+     */
+    private Date birthday;
+
+    /**
+     * 工作描述
+     */
+    private String workDesc;
+
+    /**
+     * 公司编号
+     */
+    private String companyNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    private String customName;
+
+    /**
+     * 在职状态代码
+     */
+    private String employmentStatusCode;
+
+    /**
+     * 手机号码
+     */
+    private String phoneNumber;
+
+    /**
+     * 部门
+     */
+    private String department;
+
+    /**
+     * 职位
+     */
+    private String position;
+
+    /**
+     * 座机
+     */
+    private String landline;
+
+    /**
+     * 项目角色
+     */
+    private String projectRole;
+
+    /**
+     * 是否关键人物
+     */
+    private String izCruxPerson;
+
+    /**
+     * 办公地址
+     */
+    private String officeAddress;
+
+    /**
+     * 工作地址
+     */
+    private String workAddress;
+
+    /**
+     * 权限描述
+     */
+    private String authorityDesc;
+
+    /**
+     * 项目关系描述
+     */
+    private String projectRelationDesc;
+
+    /**
+     * 家庭地址
+     */
+    private String homeAddress;
+
+    /**
+     * 家属地址
+     */
+    private String familyAddress;
+
+    /**
+     * 是否吸烟
+     */
+    private Integer izSmoking;
+
+    /**
+     * 是否饮酒
+     */
+    private Integer izWineDrink;
+
+    /**
+     * 家庭情况
+     */
+    private String familySituation;
+
+    /**
+     * 爱好
+     */
+    private String fond;
+
+    /**
+     * 性格
+     */
+    private String characterDesc;
+
+    /**
+     * 项目商机ID
+     */
+    private Long opportunityId;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+}

+ 138 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmCustomerCareBo.java

@@ -0,0 +1,138 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.CrmCustomerCare;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户关怀业务对象 crm_customer_care
+ *
+ * @author yoe
+ * @date 2026-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CrmCustomerCare.class, reverseConvertGenerate = true)
+public class CrmCustomerCareBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 收据/单据编号
+     */
+    private String receiptId;
+
+    /**
+     * 客户ID
+     */
+    private String customerId;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 行业
+     */
+    private String profession;
+
+    /**
+     * 部门
+     */
+    private String department;
+
+    /**
+     * 销售员
+     */
+    private String salesman;
+
+    /**
+     * 人员编号
+     */
+    private String personnelNumber;
+
+    /**
+     * 联系人
+     */
+    private String contactPerson;
+
+    /**
+     * 电话
+     */
+    private String phone;
+
+    /**
+     * 固定电话
+     */
+    private String telephone;
+
+    /**
+     * 关注类型
+     */
+    private String concernType;
+
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 需求日期
+     */
+    private Date requirementDate;
+
+    /**
+     * 文件编号
+     */
+    private String fileNo;
+
+    /**
+     * 礼品描述
+     */
+    private String giftDesc;
+
+    /**
+     * 关注论据
+     */
+    private String concernArgument;
+
+    /**
+     * 审核状态(0-待审核,1-已通过,2-已驳回)
+     */
+    private Integer auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditPeople;
+
+    /**
+     * 审核日期
+     */
+    private Date auditDate;
+
+    /**
+     * 创建组织ID
+     */
+    private Long createOrgId;
+
+    /**
+     * 平台编码
+     */
+    private String platformCode;
+
+    /**
+     * 查询范围(mine:我负责的,all:全部)
+     */
+    private String scope;
+
+}

+ 21 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitOperateLogBo.java

@@ -0,0 +1,21 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.CrmVisitOperateLog;
+
+/**
+ * 拜访操作日志业务对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CrmVisitOperateLog.class, reverseConvertGenerate = false)
+public class CrmVisitOperateLogBo extends BaseEntity {
+
+    private Long id;
+    private Long planId;
+    private String operateType;
+    private String operateContent;
+}

+ 28 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitPlanBo.java

@@ -0,0 +1,28 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.CrmVisitPlan;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CrmVisitPlan.class)
+public class CrmVisitPlanBo extends BaseEntity {
+
+    private Long id;
+    private String planNo;
+    private Long visitorId;
+    private String visitorName;
+    private Date startTime;
+    private Date endTime;
+    private String status;
+
+    /** 子表日程明细 */
+    private List<CrmVisitRoutineBo> detailList;
+
+}

+ 73 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitRecordBo.java

@@ -0,0 +1,73 @@
+package org.dromara.customer.domain.bo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 拜访跟进记录业务对象 crm_visit_record
+ *
+ * @author Lion Li
+ * @date 2024-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CrmVisitRecordBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 关联拜访计划ID
+     */
+    private Long planId;
+
+    /**
+     * 记录编号
+     */
+    private String recordNo;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 随访人
+     */
+    private String accompanyPerson;
+
+    /**
+     * 拜访日期
+     */
+    @NotNull(message = "拜访日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date visitDate;
+
+    /**
+     * 拜访方式
+     */
+    @NotBlank(message = "拜访方式不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String visitType;
+
+    /**
+     * 拜访目的
+     */
+    @NotBlank(message = "拜访目的不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purpose;
+
+    /**
+     * 跟进情况
+     */
+    @NotBlank(message = "跟进情况不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String progress;
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CrmVisitRoutineBo.java

@@ -0,0 +1,58 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.CrmVisitRoutine;
+
+import java.util.Date;
+
+/**
+ * 拜访日程业务对象 callonschedule
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CrmVisitRoutine.class, reverseConvertGenerate = true)
+public class CrmVisitRoutineBo extends BaseEntity {
+
+    private Long id;
+
+    private String planNo;
+
+    private String scheduleNo;
+
+    private Integer relevanceType;
+
+    private String objectNo;
+
+    private String objectName;
+
+    private String customerNo;
+
+    private String customerName;
+
+    private Long callPeopleNo;
+
+    private String callPeopleName;
+
+    private Date callDate;
+
+    private String followPeopleNo;
+
+    private String followPeopleName;
+
+    private Integer importantLevel;
+
+    private String purposeVisit;
+
+    private Integer scheduleStatus;
+
+    private Date executeTime;
+
+    private String unExecuteReason;
+
+}

+ 72 - 8
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContactBo.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.domain.bo;
 
 import org.dromara.customer.domain.CustomerContact;
+import org.dromara.customer.domain.CustomerContactInfo;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -90,25 +91,25 @@ public class CustomerContactBo extends BaseEntity {
     /**
      * 详细地址
      */
-    private String addressDetail;
+    private String detailAddress;
 
     /**
-     * 所在省编码
+     * 所在省ID
      */
-    private String addressProvince;
+    private Long provinceId;
 
     /**
-     * 所在市编码
+     * 所在市ID
      */
-    private String addressCity;
+    private Long cityId;
 
     /**
-     * 所在区县编码
+     * 所在区县ID
      */
-    private String addressCounty;
+    private Long districtId;
 
     /**
-     * 省市区
+     * 省市区名称
      */
     private String provincialCityCounty;
 
@@ -122,5 +123,68 @@ public class CustomerContactBo extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 联系人类型 (1公司职员 2关系资源人)
+     */
+    private String type;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
 
+    /**
+     * 籍贯
+     */
+    private String nativePlace;
+
+    /**
+     * 在职状态 (1在职 2离职)
+     */
+    private String jobStatus;
+
+    /**
+     * 工作内容
+     */
+    private String jobContent;
+
+    /**
+     * 家庭地址(省)
+     */
+    private Long homeProvinceId;
+
+    /**
+     * 家庭地址(市)
+     */
+    private Long homeCityId;
+
+    /**
+     * 家庭详细地址
+     */
+    private String homeAddressDetail;
+
+    /**
+     * 家庭情况
+     */
+    private String familyStatus;
+
+    /**
+     * 爱好
+     */
+    private String hobby;
+
+    /**
+     * 性格特征
+     */
+    private String characterTrait;
+
+    /**
+     * 是否抽烟
+     */
+    private String isSmoke;
+
+    /**
+     * 是否喝酒
+     */
+    private String isDrink;
 }

+ 43 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerExtContactBo.java

@@ -0,0 +1,43 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.CustomerExtContact;
+
+import java.util.Date;
+
+/**
+ * 客户扩展联系人业务对象 
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerExtContact.class, reverseConvertGenerate = false)
+public class CustomerExtContactBo extends BaseEntity {
+
+    private Long id;
+    private Long customerId;
+    private String name;
+    private String type;
+    private String gender;
+    private Integer age;
+    private String nativePlace;
+    private Date birthday;
+    private String jobStatus;
+    private String mobile;
+    private String dept;
+    private String jobTitle;
+    private String tel;
+    private String officeProvince;
+    private String officeAddressDetail;
+    private String jobContent;
+    private String homeProvince;
+    private String homeAddressDetail;
+    private String familyStatus;
+    private String hobby;
+    private String characterTrait;
+    private String isSmoke;
+    private String isDrink;
+    private String remark;
+}

+ 52 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java

@@ -85,10 +85,19 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private Long customerTypeId;
 
+    /**
+     * 客户来源
+     */
+    private Long customerSourceId;
+
+    /**
+     * 企业类型
+     */
+    private Long enterpriseTypeId;
+
     /**
      * 行业类别
      */
-//    @NotNull(message = "行业类别不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long industryCategoryId;
 
     /**
@@ -179,12 +188,54 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 合作类型(整数代码)
+     */
+    private Integer cooperation;
+
+    /**
+     * 企业类型(整数代码)
+     */
+    private Integer enterpriseType;
+
+    /**
+     * 企业来源(整数代码)
+     */
+    private Integer enterpriseSource;
+
+    /**
+     * 采购类型
+     */
+    private String procurementType;
+
+    /**
+     * 是否批准(布尔值)
+     */
+    private Boolean isApprove;
+
+    /**
+     * 年采购规模
+     */
+    private String annualProcurementScale;
+
+    /**
+     * 销售目标
+     */
+    private String salesTarget;
+
+    /**
+     * 文件编号
+     */
+    private String fileNo;
+
     private CustomerBusinessInfoBo customerBusinessBo;
 
     private CustomerSalesInfoBo customerSalesInfoBo;
 
     private List<CustomerContactBo> customerContactBoList;
 
+    private List<CustomerExtContactBo> customerExtContactBoList;
+
     private List<CustomerInvoiceInfoBo> customerInvoiceInfoBoList;
 
 }

+ 3 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerListBo.java

@@ -31,4 +31,7 @@ public class CustomerListBo extends BaseEntity {
 
     /** 客户等级ID */
     private Long customerLevelId;
+
+    /** 是否公海 (true: 是, false: 否) */
+    private Boolean isPublicSea;
 }

+ 48 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerTargetBo.java

@@ -0,0 +1,48 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.customer.domain.CustomerTarget;
+import java.math.BigDecimal;
+
+/**
+ * 客户任务分解业务对象
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@AutoMapper(target = CustomerTarget.class)
+public class CustomerTargetBo {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 目标任务(元)
+     */
+    private BigDecimal targetTask;
+
+    /**
+     * 冲刺任务(元)
+     */
+    private BigDecimal sprintTask;
+
+    /**
+     * 核心客户名称
+     */
+    private String customerName;
+
+    /**
+     * 核心客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 重点项目
+     */
+    private String keyProject;
+
+}

+ 137 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/FollowUpLogBo.java

@@ -0,0 +1,137 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.FollowUpLog;
+
+import java.util.Date;
+
+/**
+ * 跟进记录业务对象 followuplog
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FollowUpLog.class, reverseConvertGenerate = true)
+public class FollowUpLogBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 记录编号
+     */
+    private String recordsNo;
+
+    /**
+     * 数据类型
+     */
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    private String objectNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 目标对象编号
+     */
+    private String goalObjectNo;
+
+    /**
+     * 目标对象
+     */
+    private String goalObject;
+
+    /**
+     * 部门
+     */
+    private String department;
+
+    /**
+     * 行业
+     */
+    private String profession;
+
+    /**
+     * 业务员
+     */
+    private String salesman;
+
+    /**
+     * 拜访人编号
+     */
+    private Long visitorNo;
+
+    /**
+     * 拜访人
+     */
+    private String visitor;
+
+    /**
+     * 跟进人编号
+     */
+    private String followPeopleNo;
+
+    /**
+     * 跟进人姓名
+     */
+    private String followPeopleName;
+
+    /**
+     * 拜访类型代码
+     */
+    private String callTypeCode;
+
+    /**
+     * 拜访日期
+     */
+    private Date callDate;
+
+    /**
+     * 下次拜访日期
+     */
+    private Date nextCallDate;
+
+    /**
+     * 拜访目的
+     */
+    private String callAim;
+
+    /**
+     * 跟进情况
+     */
+    private String followUpCondition;
+
+    /**
+     * 记录图片
+     */
+    private String recordPicture;
+
+    /**
+     * 文件编号
+     */
+    private String fileNo;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+}

+ 89 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/HighSeasQueryBo.java

@@ -0,0 +1,89 @@
+package org.dromara.customer.domain.bo;
+
+import lombok.Data;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 客户公海信息列表查询条件(基于 customer_info 表)
+ *
+ * @author LionLi
+ * @date 2026-04-10
+ */
+@Data
+public class HighSeasQueryBo extends BaseEntity {
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户名称(模糊查询)
+     */
+    private String customerName;
+
+    /**
+     * 所属公司ID
+     */
+    private Long belongCompanyId;
+
+    /**
+     * 行业类别ID
+     */
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级ID
+     */
+    private Long customerLevelId;
+
+    /**
+     * 企业类型ID
+     */
+    private Long enterpriseTypeId;
+
+    /**
+     * 业务负责人ID(customer_sales_info.sales_person_id)
+     */
+    private Long salesPersonId;
+
+    /**
+     * 客服支持ID(customer_sales_info.service_staff_id)
+     */
+    private Long serviceStaffId;
+
+    /**
+     * 部门ID(customer_sales_info.belonging_department_id)
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 合作类型(整数代码)
+     */
+    private Integer cooperation;
+
+    /**
+     * 是否批准(布尔值)
+     */
+    private Boolean isApprove;
+
+    /**
+     * 企业来源(整数代码)
+     */
+    private Integer enterpriseSource;
+
+    /**
+     * 采购类型
+     */
+    private String procurementType;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+}

+ 53 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MonthlyTaskBo.java

@@ -0,0 +1,53 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.MonthlyTask;
+
+import java.math.BigDecimal;
+
+/**
+ * 月度任务业务对象
+ *
+ * @author Antigravity
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MonthlyTask.class)
+@Schema(description = "月度任务业务对象")
+public class MonthlyTaskBo extends BaseEntity {
+
+    private Long id;
+
+    @Schema(description = "所属季度任务ID")
+    private Long quarterlyTaskId;
+
+    @Schema(description = "年份")
+    private Integer year;
+
+    @Schema(description = "季度")
+    private Integer quarter;
+
+    @Schema(description = "月份")
+    private Integer month;
+
+    private String deptName;
+    private String industryLine;
+    private String salesName;
+    private String csName;
+
+    @Schema(description = "月度目标任务(元)")
+    private BigDecimal targetTask;
+
+    @Schema(description = "状态")
+    private String status;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "任务分解明细")
+    private java.util.List<CustomerTargetBo> targets;
+}

+ 72 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/OperationLogBo.java

@@ -0,0 +1,72 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.OperationLog;
+
+import java.io.Serializable;
+
+/**
+ * 操作日志业务对象 operationlog
+ *
+ * @author yoe
+ * @date 2026-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OperationLog.class, reverseConvertGenerate = true)
+public class OperationLogBo extends BaseEntity implements Serializable {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 数据类型
+     */
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    private String objectNo;
+
+    /**
+     * 操作人
+     */
+    private String operator;
+
+    /**
+     * 操作类型
+     */
+    private Integer actionType;
+
+    /**
+     * 目标对象
+     */
+    private String targetObject;
+
+    /**
+     * 操作模块
+     */
+    private Integer actionModule;
+
+    /**
+     * 操作详情
+     */
+    private String actionDetails;
+
+    /**
+     * 客户端信息
+     */
+    private String clientInformation;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+
+}

+ 79 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/QuarterlyTaskBo.java

@@ -0,0 +1,79 @@
+package org.dromara.customer.domain.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 季度任务业务对象
+ *
+ * @author Antigravity
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "季度任务业务对象")
+public class QuarterlyTaskBo extends BaseEntity {
+
+    private Long id;
+
+    @Schema(description = "年度任务ID")
+    private Long annualTaskId;
+
+    @Schema(description = "年份")
+    private Integer year;
+
+    @Schema(description = "季度")
+    private Integer quarter;
+
+    @Schema(description = "部门ID")
+    private Long deptId;
+
+    @Schema(description = "行业条线")
+    private String industryLine;
+
+    @Schema(description = "业务人员ID")
+    private Long salesUserId;
+
+    @Schema(description = "客服人员ID")
+    private Long serviceUserId;
+
+    @Schema(description = "季度目标任务(元)")
+    private BigDecimal targetTask;
+
+    @Schema(description = "季度冲刺任务(元)")
+    private BigDecimal sprintTask;
+
+    @Schema(description = "季度占比(%)")
+    private BigDecimal targetPercentage;
+
+    @Schema(description = "季度总实绩(元)")
+    private BigDecimal actualAchievement;
+
+    @Schema(description = "当季第1个月实绩(元)")
+    private BigDecimal month1Actual;
+
+    @Schema(description = "当季第2个月实绩(元)")
+    private BigDecimal month2Actual;
+
+    @Schema(description = "当季第3个月实绩(元)")
+    private BigDecimal month3Actual;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    /** 搜索字段 */
+    private String deptName;
+    private String salesName;
+    private String csName;
+
+    /**
+     * 季度任务分解明细 (对应 crm_customer_target 表)
+     */
+    @Schema(description = "季度任务分解明细")
+    private java.util.List<CustomerTargetBo> details;
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesAccountsReceivableBo.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.dromara.customer.domain.SalesAccountsReceivable;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 应收账款业务对象
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@Data
+@Schema(description = "应收账款业务对象")
+@AutoMapper(target = SalesAccountsReceivable.class, reverseConvertGenerate = false)
+public class SalesAccountsReceivableBo {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "应收账款编号")
+    private String accountsReceivableNo;
+
+    @Schema(description = "产品名称")
+    private String productName;
+
+    @Schema(description = "发票日期")
+    private Date invoiceDate;
+
+    @Schema(description = "发票号码")
+    private String invoiceNumber;
+
+    @Schema(description = "发票金额")
+    private BigDecimal invoiceAmount;
+
+    @Schema(description = "账单周期")
+    private Integer billingCycle;
+
+    @Schema(description = "到期日期")
+    private Date dueDate;
+
+    @Schema(description = "逾期天数")
+    private Integer overdueDays;
+
+    @Schema(description = "已付金额")
+    private BigDecimal paidAmount;
+
+    @Schema(description = "是否欠款(0-否,1-是)")
+    private Integer izArrears;
+
+    @Schema(description = "逾期余额")
+    private BigDecimal overdueBalance;
+
+    @Schema(description = "公司名称")
+    private String companyName;
+
+    @Schema(description = "联系人")
+    private String contactPerson;
+
+    @Schema(description = "电话")
+    private String telephone;
+
+    @Schema(description = "状态")
+    private String status;
+
+}

+ 295 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesAnnualFinalizationBo.java

@@ -0,0 +1,295 @@
+package org.dromara.customer.domain.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.SalesAnnualFinalization;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 年度入围项目业务对象 salesannualfinalization
+ *
+ * @author Antigravity
+ * @date 2026-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SalesAnnualFinalization.class, reverseConvertGenerate = true)
+@Schema(description = "年度入围项目业务对象")
+public class SalesAnnualFinalizationBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @Schema(description = "项目编号")
+    private String projectNo;
+
+    /**
+     * 公司编号
+     */
+    @Schema(description = "公司编号")
+    private String companyNo;
+
+    /**
+     * 项目名称
+     */
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    /**
+     * 项目状态
+     */
+    @Schema(description = "项目状态")
+    private Integer projectStatus;
+
+    /**
+     * 业务类型
+     */
+    @Schema(description = "业务类型")
+    private Integer businessType;
+
+    /**
+     * 项目级别
+     */
+    @Schema(description = "项目级别")
+    private Integer projectLevel;
+
+    /**
+     * 客户编号
+     */
+    @Schema(description = "客户编号")
+    private String customNo;
+
+    /**
+     * 客户名称
+     */
+    @Schema(description = "客户名称")
+    private String customName;
+
+    /**
+     * 行业
+     */
+    @Schema(description = "行业")
+    private Integer profession;
+
+    /**
+     * 部门编号
+     */
+    @Schema(description = "部门编号")
+    private String deptNo;
+
+    /**
+     * 业务员
+     */
+    @Schema(description = "业务员")
+    private String salesman;
+
+    /**
+     * 客服
+     */
+    @Schema(description = "客服")
+    private String customService;
+
+    /**
+     * 签约日期
+     */
+    @Schema(description = "签约日期")
+    private Date signDate;
+
+    /**
+     * 项目金额
+     */
+    @Schema(description = "项目金额")
+    private BigDecimal amount;
+
+    /**
+     * 入围费
+     */
+    @Schema(description = "入围费")
+    private BigDecimal entryFee;
+
+    /**
+     * 投标保证金
+     */
+    @Schema(description = "投标保证金")
+    private BigDecimal bidBond;
+
+    /**
+     * 保证金状态
+     */
+    @Schema(description = "保证金状态")
+    private Integer bidBondStatus;
+
+    /**
+     * 招标日期
+     */
+    @Schema(description = "招标日期")
+    private Date tenderDate;
+
+    /**
+     * 中标率
+     */
+    @Schema(description = "中标率")
+    private Double winningRate;
+
+    /**
+     * 报名截止日期
+     */
+    @Schema(description = "报名截止日期")
+    private Date signUpDeadline;
+
+    /**
+     * 投标截止日期
+     */
+    @Schema(description = "投标截止日期")
+    private Date tenderDeadline;
+
+    /**
+     * 标准周期
+     */
+    @Schema(description = "标准周期")
+    private Double standardPeriod;
+
+    /**
+     * 入围类型
+     */
+    @Schema(description = "入围类型")
+    private Integer shortlistedType;
+
+    /**
+     * 招标类型
+     */
+    @Schema(description = "招标类型")
+    private Integer biddingType;
+
+    /**
+     * 招标代理机构
+     */
+    @Schema(description = "招标代理机构")
+    private String biddingAgency;
+
+    /**
+     * 代理联系人
+     */
+    @Schema(description = "代理联系人")
+    private String agencyContact;
+
+    /**
+     * 项目描述
+     */
+    @Schema(description = "项目描述")
+    private String projectDesc;
+
+    /**
+     * 负责人ID
+     */
+    @Schema(description = "负责人ID")
+    private Long leader;
+
+    /**
+     * 负责人名称
+     */
+    @Schema(description = "负责人名称")
+    private String leaderName;
+
+    /**
+     * 文件编号
+     */
+    @Schema(description = "文件编号")
+    private String fileNo;
+
+    /**
+     * 产品支持
+     */
+    @Schema(description = "产品支持")
+    private String productSupport;
+
+    /**
+     * 创建组织ID
+     */
+    @Schema(description = "创建组织ID")
+    private Long createOrgId;
+
+    /**
+     * 项目进度
+     */
+    @Schema(description = "项目进度")
+    private String projectSchedule;
+
+    /**
+     * 投标周期类型
+     */
+    @Schema(description = "投标周期类型")
+    private Integer bidPeriodType;
+
+    /**
+     * 下次招标时间
+     */
+    @Schema(description = "下次招标时间")
+    private Date nextBiddingTime;
+
+    /**
+     * 入围类型 (FinalizationType)
+     */
+    @Schema(description = "入围类型")
+    private Integer finalizationType;
+
+    /**
+     * 提前通知天数
+     */
+    @Schema(description = "提前通知天数")
+    private Integer noticeAdvanceDays;
+
+    /**
+     * 是否提前通知
+     */
+    @Schema(description = "是否提前通知")
+    private Integer isNoticeAdvance;
+
+    /**
+     * 项目等级
+     */
+    @Schema(description = "项目等级")
+    private String projectGrade;
+
+    /**
+     * 条件
+     */
+    @Schema(description = "条件")
+    private String condition;
+
+    /**
+     * 招标链接
+     */
+    @Schema(description = "招标链接")
+    private String biddingLink;
+
+    /**
+     * 平台名称
+     */
+    @Schema(description = "平台名称")
+    private String platformName;
+
+    /**
+     * 平台链接
+     */
+    @Schema(description = "平台链接")
+    private String platformLink;
+
+    /**
+     * 服务时间
+     */
+    @Schema(description = "服务时间")
+    private String serviceTime;
+
+}

+ 131 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesQuotationListBo.java

@@ -0,0 +1,131 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.customer.domain.SalesQuotationList;
+
+import java.math.BigDecimal;
+
+/**
+ * 销售报价单明细业务对象 salesquotationlist
+ *
+ * @author Antigravity
+ * @date 2026-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SalesQuotationList.class, reverseConvertGenerate = true)
+@Schema(description = "销售报价单明细业务对象")
+public class SalesQuotationListBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Long id;
+
+    /**
+     * 报价单号
+     */
+    @Schema(description = "报价单号")
+    private String quotationNo;
+
+    /**
+     * 产品编号
+     */
+    @Schema(description = "产品编号")
+    private String productNo;
+
+    /**
+     * 产品图片
+     */
+    @Schema(description = "产品图片")
+    private String productImage;
+
+    /**
+     * 产品名称
+     */
+    @Schema(description = "产品名称")
+    private String productName;
+
+    /**
+     * 单位名称
+     */
+    @Schema(description = "单位名称")
+    private String unitName;
+
+    /**
+     * 市场价格
+     */
+    @Schema(description = "市场价格")
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    @Schema(description = "会员价格")
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    @Schema(description = "最低销售价格")
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 最小订购数量
+     */
+    @Schema(description = "最小订购数量")
+    private Integer minOrderQuantity;
+
+    /**
+     * 采购数量
+     */
+    @Schema(description = "采购数量")
+    private Integer purchaseQuantity;
+
+    /**
+     * 报价
+     */
+    @Schema(description = "报价")
+    private BigDecimal quote;
+
+    /**
+     * 利润率
+     */
+    @Schema(description = "利润率")
+    private Double profitMargin;
+
+    /**
+     * 报价状态
+     */
+    @Schema(description = "报价状态")
+    private Integer quoteStatus;
+
+    /**
+     * 创建用户ID
+     */
+    @Schema(description = "创建用户ID")
+    private Long createUserId;
+
+    /**
+     * 更新用户ID
+     */
+    @Schema(description = "更新用户ID")
+    private Long updateUserId;
+
+    /**
+     * 客户ID
+     */
+    @Schema(description = "客户ID")
+    private Integer customerId;
+
+    /**
+     * 附件编号
+     */
+    @Schema(description = "附件编号")
+    private String fileNo;
+}

+ 132 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesleadsBo.java

@@ -0,0 +1,132 @@
+package org.dromara.customer.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.customer.domain.Salesleads;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 销售线索/项目商机业务对象
+ *
+ * @author Antigravity
+ * @date 2026-04-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "销售线索/项目商机业务对象")
+@AutoMapper(target = Salesleads.class, reverseConvertGenerate = false)
+public class SalesleadsBo extends TenantEntity {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "是否线索(0:否, 1:是)")
+    private Integer izClue;
+
+    @Schema(description = "项目编号")
+    private String projectNo;
+
+    @Schema(description = "公司编号")
+    private String companyNo;
+
+    @Schema(description = "部门编号")
+    private String deptNo;
+
+    @Schema(description = "客户编号")
+    private String customerNo;
+
+    @Schema(description = "客户名称")
+    private String customerName;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    @Schema(description = "项目类型")
+    private String projectType;
+
+    @Schema(description = "项目预算")
+    private BigDecimal projectBudget;
+
+    @Schema(description = "中标率")
+    private String winRate;
+
+    @Schema(description = "批准日期")
+    private Date approvalDate;
+
+    @Schema(description = "预计完成时间")
+    private Date expectedCompletionTime;
+
+    @Schema(description = "项目级别")
+    private Integer projectLevel;
+
+    @Schema(description = "行业")
+    private Long profession;
+
+    @Schema(description = "业务人员")
+    private String businessPersonnel;
+
+    @Schema(description = "提交人")
+    private String submitter;
+
+    @Schema(description = "项目区域")
+    private String projectArea;
+
+    @Schema(description = "采购方式")
+    private Integer procurementMethod;
+
+    @Schema(description = "信息来源")
+    private Integer infoSource;
+
+    @Schema(description = "竞争对手")
+    private String competitor;
+
+    @Schema(description = "项目描述")
+    private String projectDescription;
+
+    @Schema(description = "档案编号")
+    private String fileNo;
+
+    @Schema(description = "负责人ID")
+    private Long leader;
+
+    @Schema(description = "负责人姓名")
+    private String leaderName;
+
+    @Schema(description = "状态")
+    private String status;
+
+    @Schema(description = "平台标识")
+    private String platformCode;
+
+
+    @Schema(description = "活动编号")
+    private String activityNo;
+
+    @Schema(description = "营销活动名称")
+    private String marketingActivityName;
+
+    @Schema(description = "产品支持")
+    private String productSupport;
+
+
+    @Schema(description = "项目进度")
+    private String projectSchedule;
+
+    @Schema(description = "公开招标截止日期")
+    private Date publicBiddingDeadline;
+
+    @Schema(description = "采购内容")
+    private String purchaseContent;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "批量操作ID列表")
+    private List<Long> ids;
+}

+ 71 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesresultanalyzeBo.java

@@ -0,0 +1,71 @@
+package org.dromara.customer.domain.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import org.dromara.customer.domain.Salesresultanalyze;
+
+/**
+ * 销售结果分析业务对象 salesresultanalyze
+ *
+ * @author Antigravity
+ * @date 2026-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Salesresultanalyze.class, reverseConvertGenerate = true)
+@Schema(description = "销售结果分析业务对象")
+public class SalesresultanalyzeBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    @Schema(description = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 数据类型(1:线索, 2:商机)
+     */
+    @Schema(description = "数据类型(1:线索, 2:商机)")
+    private Integer dataType;
+
+    /**
+     * 对象编号
+     */
+    @Schema(description = "对象编号")
+    private String objectNo;
+
+    /**
+     * 成交结果(1:赢单, 2:丢单)
+     */
+    @Schema(description = "成交结果(1:赢单, 2:丢单)")
+    private Integer dealResult;
+
+    /**
+     * 胜利总结
+     */
+    @Schema(description = "胜利总结")
+    private String winSumUp;
+
+    /**
+     * 失败原因
+     */
+    @Schema(description = "失败原因")
+    private String loseReason;
+
+    /**
+     * 文件编号
+     */
+    @Schema(description = "文件编号")
+    private String fileNo;
+
+    /**
+     * 平台标识
+     */
+    @Schema(description = "平台标识")
+    private String platformCode;
+
+}

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor