Ver Fonte

Merge branch 'master' into zl

林小张 há 3 dias atrás
pai
commit
c52b2131d1
100 ficheiros alterados com 7599 adições e 2 exclusões
  1. 4 0
      ruoyi-common/ruoyi-common-core/pom.xml
  2. 25 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/IsDefault.java
  3. 6 1
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  4. 6 1
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java
  5. 1 0
      ruoyi-modules/pom.xml
  6. 132 0
      ruoyi-modules/ruoyi-customer/pom.xml
  7. 17 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/RuoyiCustomerApplication.java
  8. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerBusinessInfoController.java
  9. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerContactController.java
  10. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerContractController.java
  11. 148 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  12. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInvoiceInfoController.java
  13. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerSalesInfoController.java
  14. 118 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerShippingAddressController.java
  15. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerTagController.java
  16. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/EnterpriseScaleController.java
  17. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/IndustryCategoryController.java
  18. 118 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintainInfoController.java
  19. 105 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceServerItemController.java
  20. 105 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceServerTimeController.java
  21. 105 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceTypeController.java
  22. 112 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PurchaseHabitController.java
  23. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/TagCategoryController.java
  24. 109 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerBusinessInfo.java
  25. 122 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContact.java
  26. 123 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContract.java
  27. 164 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  28. 42 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfoTag.java
  29. 92 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInvoiceInfo.java
  30. 123 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java
  31. 127 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerShippingAddress.java
  32. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerTag.java
  33. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/EnterpriseScale.java
  34. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/IndustryCategory.java
  35. 159 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintainInfo.java
  36. 52 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerItem.java
  37. 52 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerTime.java
  38. 52 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceType.java
  39. 113 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PurchaseHabit.java
  40. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/TagCategory.java
  41. 101 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerBusinessInfoBo.java
  42. 117 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContactBo.java
  43. 121 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContractBo.java
  44. 173 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  45. 89 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInvoiceInfoBo.java
  46. 122 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java
  47. 120 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerShippingAddressBo.java
  48. 50 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerTagBo.java
  49. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/EnterpriseScaleBo.java
  50. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/IndustryCategoryBo.java
  51. 151 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintainInfoBo.java
  52. 45 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerItemBo.java
  53. 45 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerTimeBo.java
  54. 45 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceTypeBo.java
  55. 108 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PurchaseHabitBo.java
  56. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/TagCategoryBo.java
  57. 13 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/dto/SetCustomerInfoTagDto.java
  58. 17 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/dto/TechnicalAdviserDto.java
  59. 41 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/ContractVo.java
  60. 125 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerBusinessInfoVo.java
  61. 140 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerContactVo.java
  62. 140 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerContractVo.java
  63. 208 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java
  64. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInvoiceInfoVo.java
  65. 145 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java
  66. 149 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerShippingAddressVo.java
  67. 68 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerTagVo.java
  68. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/EnterpriseScaleVo.java
  69. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/IndustryCategoryVo.java
  70. 194 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintainInfoVo.java
  71. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerItemVo.java
  72. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerTimeVo.java
  73. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceTypeVo.java
  74. 139 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PurchaseHabitVo.java
  75. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/TagCategoryVo.java
  76. 20 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerBusinessInfoMapper.java
  77. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerContactMapper.java
  78. 21 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerContractMapper.java
  79. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java
  80. 16 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoTagMapper.java
  81. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInvoiceInfoMapper.java
  82. 20 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerSalesInfoMapper.java
  83. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerShippingAddressMapper.java
  84. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerTagMapper.java
  85. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/EnterpriseScaleMapper.java
  86. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/IndustryCategoryMapper.java
  87. 18 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintainInfoMapper.java
  88. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceServerItemMapper.java
  89. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceServerTimeMapper.java
  90. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceTypeMapper.java
  91. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PurchaseHabitMapper.java
  92. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/TagCategoryMapper.java
  93. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerBusinessInfoService.java
  94. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContactService.java
  95. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContractService.java
  96. 93 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  97. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInvoiceInfoService.java
  98. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerSalesInfoService.java
  99. 75 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerShippingAddressService.java
  100. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerTagService.java

+ 4 - 0
ruoyi-common/ruoyi-common-core/pom.xml

@@ -98,6 +98,10 @@
             <groupId>org.lionsoul</groupId>
             <artifactId>ip2region</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-redis</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 25 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/IsDefault.java

@@ -0,0 +1,25 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum IsDefault {
+
+    /**
+     * 默认
+     */
+    Yes("0", "是"),
+
+    /**
+     * 否
+     */
+    No("1", "否");
+
+
+
+    private final String code;
+    private final String info;
+
+}

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

@@ -42,13 +42,18 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_user_post",
         "sys_config",
         "sys_dict",
+        "sys_dict_data",
         "sys_dict_type",
         "sys_dict_data",
         "sys_oss",
         "sys_oss_config",
         "sys_oper_log",
         "sys_logininfor",
-        "qrtz_"
+        "qrtz_",
+        "maintenance_server_item",
+        "maintenance_server_time",
+        "maintenance_type",
+        "customer_info_tag"
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
 

+ 6 - 1
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java

@@ -29,12 +29,17 @@ public class PlatformTenantLineHandler implements TenantLineHandler {
         "sys_user_post",
         "sys_config",
         "sys_dict",
+        "sys_dict_data",
         "sys_dict_type",
         "sys_oss",
         "sys_oss_config",
         "gen_table",
         "gen_table_column",
-        "qrtz_"
+        "qrtz_",
+        "maintenance_server_item",
+        "maintenance_server_time",
+        "maintenance_type"
+
         // 注意:前缀匹配(如 qrtz_)在 ignoreTable 中单独处理
     ));
 

+ 1 - 0
ruoyi-modules/pom.xml

@@ -16,6 +16,7 @@
         <module>ruoyi-workflow</module>
         <module>ruoyi-order</module>
 	    <module>ruoyi-product</module>
+        <module>ruoyi-customer</module>
     </modules>
 
     <artifactId>ruoyi-modules</artifactId>

+ 132 - 0
ruoyi-modules/ruoyi-customer/pom.xml

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-customer</artifactId>
+
+    <description>
+        ruoyi-customer客户模块
+    </description>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-nacos</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sentinel</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-service-impl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-dubbo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-resource</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-workflow</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/RuoyiCustomerApplication.java

@@ -0,0 +1,17 @@
+package org.dromara.customer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication
+public class RuoyiCustomerApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoyiCustomerApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  客户模块启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+
+}

+ 100 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerBusinessInfoController.java

@@ -0,0 +1,100 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerBusinessInfoVo;
+import org.dromara.customer.domain.bo.CustomerBusinessInfoBo;
+import org.dromara.customer.service.ICustomerBusinessInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户工商注册信息
+ * 前端访问路由地址为:/customer/businessInfo
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/businessInfo")
+public class CustomerBusinessInfoController extends BaseController {
+
+    private final ICustomerBusinessInfoService customerBusinessInfoService;
+
+    /**
+     * 查询客户工商注册信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CustomerBusinessInfoVo> list(CustomerBusinessInfoBo bo, PageQuery pageQuery) {
+        return customerBusinessInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户工商注册信息列表
+     */
+    @Log(title = "客户工商注册信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerBusinessInfoBo bo, HttpServletResponse response) {
+        List<CustomerBusinessInfoVo> list = customerBusinessInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户工商注册信息", CustomerBusinessInfoVo.class, response);
+    }
+
+    /**
+     * 获取客户工商注册信息详细信息
+     *
+     * @param customerId 主键
+     */
+    @GetMapping("/{customerId}")
+    public R<CustomerBusinessInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("customerId") Long customerId) {
+        return R.ok(customerBusinessInfoService.queryById(customerId));
+    }
+
+    /**
+     * 新增客户工商注册信息
+     */
+    @Log(title = "客户工商注册信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerBusinessInfoBo bo) {
+        return toAjax(customerBusinessInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户工商注册信息
+     */
+    @Log(title = "客户工商注册信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerBusinessInfoBo bo) {
+        return toAjax(customerBusinessInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户工商注册信息
+     *
+     * @param customerIds 主键串
+     */
+    @Log(title = "客户工商注册信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{customerIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("customerIds") Long[] customerIds) {
+        return toAjax(customerBusinessInfoService.deleteWithValidByIds(List.of(customerIds), true));
+    }
+}

+ 100 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerContactController.java

@@ -0,0 +1,100 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerContactVo;
+import org.dromara.customer.domain.bo.CustomerContactBo;
+import org.dromara.customer.service.ICustomerContactService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户联系人信息
+ * 前端访问路由地址为:/customer/customerContact
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/customerContact")
+public class CustomerContactController extends BaseController {
+
+    private final ICustomerContactService customerContactService;
+
+    /**
+     * 查询客户联系人信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CustomerContactVo> list(CustomerContactBo bo, PageQuery pageQuery) {
+        return customerContactService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户联系人信息列表
+     */
+    @Log(title = "客户联系人信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerContactBo bo, HttpServletResponse response) {
+        List<CustomerContactVo> list = customerContactService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户联系人信息", CustomerContactVo.class, response);
+    }
+
+    /**
+     * 获取客户联系人信息详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<CustomerContactVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerContactService.queryById(id));
+    }
+
+    /**
+     * 新增客户联系人信息
+     */
+    @Log(title = "客户联系人信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerContactBo bo) {
+        return toAjax(customerContactService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户联系人信息
+     */
+    @Log(title = "客户联系人信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerContactBo bo) {
+        return toAjax(customerContactService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户联系人信息
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "客户联系人信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerContactService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerContractVo;
+import org.dromara.customer.domain.bo.CustomerContractBo;
+import org.dromara.customer.service.ICustomerContractService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户合同
+ * 前端访问路由地址为:/customer/contract
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/contract")
+public class CustomerContractController extends BaseController {
+
+    private final ICustomerContractService customerContractService;
+
+    /**
+     * 查询客户合同列表
+     */
+    @SaCheckPermission("customer:contract:list")
+    @GetMapping("/list")
+    public TableDataInfo<CustomerContractVo> list(CustomerContractBo bo, PageQuery pageQuery) {
+        return customerContractService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户合同列表
+     */
+    @SaCheckPermission("customer:contract:export")
+    @Log(title = "客户合同", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerContractBo bo, HttpServletResponse response) {
+        List<CustomerContractVo> list = customerContractService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户合同", CustomerContractVo.class, response);
+    }
+
+    /**
+     * 获取客户合同详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:contract:query")
+    @GetMapping("/{id}")
+    public R<CustomerContractVo> getInfo(@NotNull(message = "主键不能为空")
+                                         @PathVariable("id") Long id) {
+        return R.ok(customerContractService.queryById(id));
+    }
+
+    /**
+     * 新增客户合同
+     */
+    @SaCheckPermission("customer:contract:add")
+    @Log(title = "客户合同", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerContractBo bo) {
+        return toAjax(customerContractService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户合同
+     */
+    @SaCheckPermission("customer:contract:edit")
+    @Log(title = "客户合同", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerContractBo bo) {
+        return toAjax(customerContractService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户合同
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:contract:remove")
+    @Log(title = "客户合同", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerContractService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 148 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java

@@ -0,0 +1,148 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.customer.domain.CustomerSalesInfo;
+import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+import org.dromara.customer.domain.dto.SetCustomerInfoTagDto;
+import org.dromara.customer.domain.vo.ContractVo;
+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.CustomerInfoVo;
+import org.dromara.customer.domain.bo.CustomerInfoBo;
+import org.dromara.customer.service.ICustomerInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户信息
+ * 前端访问路由地址为:/customer/customerInfo
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/customerInfo")
+public class CustomerInfoController extends BaseController {
+
+    private final ICustomerInfoService customerInfoService;
+
+    /**
+     * 查询客户信息列表
+     */
+    @SaCheckPermission("customer:customerInfo:list")
+    @GetMapping("/list")
+    public TableDataInfo<CustomerInfoVo> list(CustomerInfoBo bo, PageQuery pageQuery) {
+        return customerInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 查询合同管理
+     */
+    @GetMapping("/contractList")
+    public TableDataInfo<ContractVo> contractList(CustomerInfoBo bo, PageQuery pageQuery) {
+        return customerInfoService.queryContractPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户信息列表
+     */
+    @SaCheckPermission("customer:customerInfo:export")
+    @Log(title = "客户信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerInfoBo bo, HttpServletResponse response) {
+        List<CustomerInfoVo> list = customerInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户信息", CustomerInfoVo.class, response);
+    }
+
+    /**
+     * 获取客户信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:customerInfo:query")
+    @GetMapping("/{id}")
+    public R<CustomerInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerInfoService.queryById(id));
+    }
+
+    /**
+     * 新增客户信息
+     */
+    @SaCheckPermission("customer:customerInfo:add")
+    @Log(title = "客户信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerInfoBo bo) {
+        return toAjax(customerInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户信息
+     */
+    @SaCheckPermission("customer:customerInfo:edit")
+    @Log(title = "客户信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerInfoBo bo) {
+        return toAjax(customerInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:customerInfo:remove")
+    @Log(title = "客户信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 状态修改
+     */
+    @SaCheckPermission("customer:customerInfo:edit")
+    @Log(title = "客户信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@RequestBody CustomerInfoBo bo) {
+        return toAjax(customerInfoService.updateCustomerCheckStatus(bo.getId(), bo.getStatus()));
+    }
+
+    /**
+     * 状态临时额度
+     */
+    @SaCheckPermission("customer:customerInfo:edit")
+    @Log(title = "客户信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateCreditAmount")
+    public R<Void> updateCreditAmount(@RequestBody CustomerSalesInfoBo bo) {
+        return toAjax(customerInfoService.updateCreditAmount(bo.getCustomerIds(), bo.getCreditAmount()));
+    }
+
+    /**
+     * 设置客户标签
+     */
+    @SaCheckPermission("customer:customerInfo:edit")
+    @Log(title = "客户信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/setCustomerInfoTag")
+    public R<Void> setCustomerInfoTag(@RequestBody SetCustomerInfoTagDto bo) {
+        return toAjax(customerInfoService.setCustomerInfoTag(bo.getCustomerIds(), bo.getTagIds()));
+    }
+}

+ 100 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInvoiceInfoController.java

@@ -0,0 +1,100 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerInvoiceInfoVo;
+import org.dromara.customer.domain.bo.CustomerInvoiceInfoBo;
+import org.dromara.customer.service.ICustomerInvoiceInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户开票信息
+ * 前端访问路由地址为:/customer/invoiceInfo
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/invoiceInfo")
+public class CustomerInvoiceInfoController extends BaseController {
+
+    private final ICustomerInvoiceInfoService customerInvoiceInfoService;
+
+    /**
+     * 查询客户开票信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CustomerInvoiceInfoVo> list(CustomerInvoiceInfoBo bo, PageQuery pageQuery) {
+        return customerInvoiceInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户开票信息列表
+     */
+    @Log(title = "客户开票信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerInvoiceInfoBo bo, HttpServletResponse response) {
+        List<CustomerInvoiceInfoVo> list = customerInvoiceInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户开票信息", CustomerInvoiceInfoVo.class, response);
+    }
+
+    /**
+     * 获取客户开票信息详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<CustomerInvoiceInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerInvoiceInfoService.queryById(id));
+    }
+
+    /**
+     * 新增客户开票信息
+     */
+    @Log(title = "客户开票信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerInvoiceInfoBo bo) {
+        return toAjax(customerInvoiceInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户开票信息
+     */
+    @Log(title = "客户开票信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerInvoiceInfoBo bo) {
+        return toAjax(customerInvoiceInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户开票信息
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "客户开票信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerInvoiceInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 100 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerSalesInfoController.java

@@ -0,0 +1,100 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerSalesInfoVo;
+import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+import org.dromara.customer.service.ICustomerSalesInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户销售信息
+ * 前端访问路由地址为:/customer/salesInfo
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/salesInfo")
+public class CustomerSalesInfoController extends BaseController {
+
+    private final ICustomerSalesInfoService customerSalesInfoService;
+
+    /**
+     * 查询客户销售信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<CustomerSalesInfoVo> list(CustomerSalesInfoBo bo, PageQuery pageQuery) {
+        return customerSalesInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户销售信息列表
+     */
+    @Log(title = "客户销售信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerSalesInfoBo bo, HttpServletResponse response) {
+        List<CustomerSalesInfoVo> list = customerSalesInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户销售信息", CustomerSalesInfoVo.class, response);
+    }
+
+    /**
+     * 获取客户销售信息详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<CustomerSalesInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerSalesInfoService.queryById(id));
+    }
+
+    /**
+     * 新增客户销售信息
+     */
+    @Log(title = "客户销售信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerSalesInfoBo bo) {
+        return toAjax(customerSalesInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户销售信息
+     */
+    @Log(title = "客户销售信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerSalesInfoBo bo) {
+        return toAjax(customerSalesInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户销售信息
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "客户销售信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerSalesInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 118 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerShippingAddressController.java

@@ -0,0 +1,118 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import cn.dev33.satoken.annotation.SaCheckRole;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.constant.TenantConstants;
+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.CustomerShippingAddressVo;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
+import org.dromara.customer.service.ICustomerShippingAddressService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户收货地址
+ * 前端访问路由地址为:/customer/shippingAddress
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/shippingAddress")
+public class CustomerShippingAddressController extends BaseController {
+
+    private final ICustomerShippingAddressService customerShippingAddressService;
+
+    /**
+     * 查询客户收货地址列表
+     */
+    @SaCheckPermission("customer:shippingAddress:list")
+    @GetMapping("/list")
+    public TableDataInfo<CustomerShippingAddressVo> list(CustomerShippingAddressBo bo, PageQuery pageQuery) {
+        return customerShippingAddressService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户收货地址列表
+     */
+    @SaCheckPermission("customer:shippingAddress:export")
+    @Log(title = "客户收货地址", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerShippingAddressBo bo, HttpServletResponse response) {
+        List<CustomerShippingAddressVo> list = customerShippingAddressService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户收货地址", CustomerShippingAddressVo.class, response);
+    }
+
+    /**
+     * 获取客户收货地址详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:shippingAddress:query")
+    @GetMapping("/{id}")
+    public R<CustomerShippingAddressVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerShippingAddressService.queryById(id));
+    }
+
+    /**
+     * 新增客户收货地址
+     */
+    @SaCheckPermission("customer:shippingAddress:add")
+    @Log(title = "客户收货地址", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerShippingAddressBo bo) {
+        return toAjax(customerShippingAddressService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户收货地址
+     */
+    @SaCheckPermission("customer:shippingAddress:edit")
+    @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerShippingAddressBo bo) {
+        return toAjax(customerShippingAddressService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户收货地址
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:shippingAddress:remove")
+    @Log(title = "客户收货地址", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerShippingAddressService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 设置默认地址
+     */
+    @SaCheckPermission("customer:shippingAddress:edit")
+    @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeDefaultAddress")
+    public R<Void> changeDefaultAddress(@RequestBody CustomerShippingAddressBo bo) {
+        return toAjax(customerShippingAddressService.changeDefaultAddress(bo));
+    }
+}

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

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.CustomerTagVo;
+import org.dromara.customer.domain.bo.CustomerTagBo;
+import org.dromara.customer.service.ICustomerTagService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户标签
+ * 前端访问路由地址为:/customer/customerTag
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/customerTag")
+public class CustomerTagController extends BaseController {
+
+    private final ICustomerTagService customerTagService;
+
+    /**
+     * 查询客户标签列表
+     */
+    @SaCheckPermission("customer:customerTag:list")
+    @GetMapping("/list")
+    public TableDataInfo<CustomerTagVo> list(CustomerTagBo bo, PageQuery pageQuery) {
+        return customerTagService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户标签列表
+     */
+    @SaCheckPermission("customer:customerTag:export")
+    @Log(title = "客户标签", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CustomerTagBo bo, HttpServletResponse response) {
+        List<CustomerTagVo> list = customerTagService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户标签", CustomerTagVo.class, response);
+    }
+
+    /**
+     * 获取客户标签详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:customerTag:query")
+    @GetMapping("/{id}")
+    public R<CustomerTagVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(customerTagService.queryById(id));
+    }
+
+    /**
+     * 新增客户标签
+     */
+    @SaCheckPermission("customer:customerTag:add")
+    @Log(title = "客户标签", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerTagBo bo) {
+        return toAjax(customerTagService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户标签
+     */
+    @SaCheckPermission("customer:customerTag:edit")
+    @Log(title = "客户标签", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerTagBo bo) {
+        return toAjax(customerTagService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户标签
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:customerTag:remove")
+    @Log(title = "客户标签", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(customerTagService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.EnterpriseScaleVo;
+import org.dromara.customer.domain.bo.EnterpriseScaleBo;
+import org.dromara.customer.service.IEnterpriseScaleService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 企业规模
+ * 前端访问路由地址为:/customer/enterpriseScale
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/enterpriseScale")
+public class EnterpriseScaleController extends BaseController {
+
+    private final IEnterpriseScaleService enterpriseScaleService;
+
+    /**
+     * 查询企业规模列表
+     */
+    @SaCheckPermission("customer:enterpriseScale:list")
+    @GetMapping("/list")
+    public TableDataInfo<EnterpriseScaleVo> list(EnterpriseScaleBo bo, PageQuery pageQuery) {
+        return enterpriseScaleService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出企业规模列表
+     */
+    @SaCheckPermission("customer:enterpriseScale:export")
+    @Log(title = "企业规模", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EnterpriseScaleBo bo, HttpServletResponse response) {
+        List<EnterpriseScaleVo> list = enterpriseScaleService.queryList(bo);
+        ExcelUtil.exportExcel(list, "企业规模", EnterpriseScaleVo.class, response);
+    }
+
+    /**
+     * 获取企业规模详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:enterpriseScale:query")
+    @GetMapping("/{id}")
+    public R<EnterpriseScaleVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(enterpriseScaleService.queryById(id));
+    }
+
+    /**
+     * 新增企业规模
+     */
+    @SaCheckPermission("customer:enterpriseScale:add")
+    @Log(title = "企业规模", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EnterpriseScaleBo bo) {
+        return toAjax(enterpriseScaleService.insertByBo(bo));
+    }
+
+    /**
+     * 修改企业规模
+     */
+    @SaCheckPermission("customer:enterpriseScale:edit")
+    @Log(title = "企业规模", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EnterpriseScaleBo bo) {
+        return toAjax(enterpriseScaleService.updateByBo(bo));
+    }
+
+    /**
+     * 删除企业规模
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:enterpriseScale:remove")
+    @Log(title = "企业规模", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(enterpriseScaleService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.IndustryCategoryVo;
+import org.dromara.customer.domain.bo.IndustryCategoryBo;
+import org.dromara.customer.service.IIndustryCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 所属行业
+ * 前端访问路由地址为:/customer/industryCategory
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/industryCategory")
+public class IndustryCategoryController extends BaseController {
+
+    private final IIndustryCategoryService industryCategoryService;
+
+    /**
+     * 查询所属行业列表
+     */
+    @SaCheckPermission("customer:industryCategory:list")
+    @GetMapping("/list")
+    public TableDataInfo<IndustryCategoryVo> list(IndustryCategoryBo bo, PageQuery pageQuery) {
+        return industryCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出所属行业列表
+     */
+    @SaCheckPermission("customer:industryCategory:export")
+    @Log(title = "所属行业", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(IndustryCategoryBo bo, HttpServletResponse response) {
+        List<IndustryCategoryVo> list = industryCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "所属行业", IndustryCategoryVo.class, response);
+    }
+
+    /**
+     * 获取所属行业详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:industryCategory:query")
+    @GetMapping("/{id}")
+    public R<IndustryCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(industryCategoryService.queryById(id));
+    }
+
+    /**
+     * 新增所属行业
+     */
+    @SaCheckPermission("customer:industryCategory:add")
+    @Log(title = "所属行业", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody IndustryCategoryBo bo) {
+        return toAjax(industryCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改所属行业
+     */
+    @SaCheckPermission("customer:industryCategory:edit")
+    @Log(title = "所属行业", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody IndustryCategoryBo bo) {
+        return toAjax(industryCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除所属行业
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:industryCategory:remove")
+    @Log(title = "所属行业", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(industryCategoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 118 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintainInfoController.java

@@ -0,0 +1,118 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.customer.domain.dto.TechnicalAdviserDto;
+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.MaintainInfoVo;
+import org.dromara.customer.domain.bo.MaintainInfoBo;
+import org.dromara.customer.service.IMaintainInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 维保记录
+ * 前端访问路由地址为:/customer/maintainInfo
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/maintainInfo")
+public class MaintainInfoController extends BaseController {
+
+    private final IMaintainInfoService maintainInfoService;
+
+    /**
+     * 查询维保记录列表
+     */
+    @SaCheckPermission("customer:maintainInfo:list")
+    @GetMapping("/list")
+    public TableDataInfo<MaintainInfoVo> list(MaintainInfoBo bo, PageQuery pageQuery) {
+        return maintainInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出维保记录列表
+     */
+    @SaCheckPermission("customer:maintainInfo:export")
+    @Log(title = "维保记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(MaintainInfoBo bo, HttpServletResponse response) {
+        List<MaintainInfoVo> list = maintainInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "维保记录", MaintainInfoVo.class, response);
+    }
+
+    /**
+     * 获取维保记录详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:maintainInfo:query")
+    @GetMapping("/{id}")
+    public R<MaintainInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(maintainInfoService.queryById(id));
+    }
+
+    /**
+     * 新增维保记录
+     */
+    @SaCheckPermission("customer:maintainInfo:add")
+    @Log(title = "维保记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MaintainInfoBo bo) {
+        return toAjax(maintainInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改维保记录
+     */
+    @SaCheckPermission("customer:maintainInfo:edit")
+    @Log(title = "维保记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MaintainInfoBo bo) {
+        return toAjax(maintainInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除维保记录
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:maintainInfo:remove")
+    @Log(title = "维保记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(maintainInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 分配技术顾问
+     */
+    @SaCheckPermission("customer:maintainInfo:add")
+    @Log(title = "维保记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/allotTechnicalAdviser")
+    public R<Void> allotTechnicalAdviser(@Validated(AddGroup.class) @RequestBody TechnicalAdviserDto bo) {
+        return toAjax(maintainInfoService.allotTechnicalAdviser(bo));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceServerItemController.java

@@ -0,0 +1,105 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.MaintenanceServerItemVo;
+import org.dromara.customer.domain.bo.MaintenanceServerItemBo;
+import org.dromara.customer.service.IMaintenanceServerItemService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 维保服务内容
+ * 前端访问路由地址为:/customer/serverItem
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/serverItem")
+public class MaintenanceServerItemController extends BaseController {
+
+    private final IMaintenanceServerItemService maintenanceServerItemService;
+
+    /**
+     * 查询维保服务内容列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<MaintenanceServerItemVo> list(MaintenanceServerItemBo bo, PageQuery pageQuery) {
+        return maintenanceServerItemService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出维保服务内容列表
+     */
+    @SaCheckPermission("customer:serverItem:export")
+    @Log(title = "维保服务内容", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(MaintenanceServerItemBo bo, HttpServletResponse response) {
+        List<MaintenanceServerItemVo> list = maintenanceServerItemService.queryList(bo);
+        ExcelUtil.exportExcel(list, "维保服务内容", MaintenanceServerItemVo.class, response);
+    }
+
+    /**
+     * 获取维保服务内容详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:serverItem:query")
+    @GetMapping("/{id}")
+    public R<MaintenanceServerItemVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(maintenanceServerItemService.queryById(id));
+    }
+
+    /**
+     * 新增维保服务内容
+     */
+    @SaCheckPermission("customer:serverItem:add")
+    @Log(title = "维保服务内容", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MaintenanceServerItemBo bo) {
+        return toAjax(maintenanceServerItemService.insertByBo(bo));
+    }
+
+    /**
+     * 修改维保服务内容
+     */
+    @SaCheckPermission("customer:serverItem:edit")
+    @Log(title = "维保服务内容", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MaintenanceServerItemBo bo) {
+        return toAjax(maintenanceServerItemService.updateByBo(bo));
+    }
+
+    /**
+     * 删除维保服务内容
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:serverItem:remove")
+    @Log(title = "维保服务内容", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(maintenanceServerItemService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceServerTimeController.java

@@ -0,0 +1,105 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.MaintenanceServerTimeVo;
+import org.dromara.customer.domain.bo.MaintenanceServerTimeBo;
+import org.dromara.customer.service.IMaintenanceServerTimeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 维保服务时间
+ * 前端访问路由地址为:/customer/serverTime
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/serverTime")
+public class MaintenanceServerTimeController extends BaseController {
+
+    private final IMaintenanceServerTimeService maintenanceServerTimeService;
+
+    /**
+     * 查询维保服务时间列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<MaintenanceServerTimeVo> list(MaintenanceServerTimeBo bo, PageQuery pageQuery) {
+        return maintenanceServerTimeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出维保服务时间列表
+     */
+    @SaCheckPermission("customer:serverTime:export")
+    @Log(title = "维保服务时间", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(MaintenanceServerTimeBo bo, HttpServletResponse response) {
+        List<MaintenanceServerTimeVo> list = maintenanceServerTimeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "维保服务时间", MaintenanceServerTimeVo.class, response);
+    }
+
+    /**
+     * 获取维保服务时间详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:serverTime:query")
+    @GetMapping("/{id}")
+    public R<MaintenanceServerTimeVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(maintenanceServerTimeService.queryById(id));
+    }
+
+    /**
+     * 新增维保服务时间
+     */
+    @SaCheckPermission("customer:serverTime:add")
+    @Log(title = "维保服务时间", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MaintenanceServerTimeBo bo) {
+        return toAjax(maintenanceServerTimeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改维保服务时间
+     */
+    @SaCheckPermission("customer:serverTime:edit")
+    @Log(title = "维保服务时间", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MaintenanceServerTimeBo bo) {
+        return toAjax(maintenanceServerTimeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除维保服务时间
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:serverTime:remove")
+    @Log(title = "维保服务时间", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(maintenanceServerTimeService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintenanceTypeController.java

@@ -0,0 +1,105 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.MaintenanceTypeVo;
+import org.dromara.customer.domain.bo.MaintenanceTypeBo;
+import org.dromara.customer.service.IMaintenanceTypeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 维保类型
+ * 前端访问路由地址为:/customer/maintenanceType
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/maintenanceType")
+public class MaintenanceTypeController extends BaseController {
+
+    private final IMaintenanceTypeService maintenanceTypeService;
+
+    /**
+     * 查询维保类型列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<MaintenanceTypeVo> list(MaintenanceTypeBo bo, PageQuery pageQuery) {
+        return maintenanceTypeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出维保类型列表
+     */
+    @SaCheckPermission("customer:maintenanceType:export")
+    @Log(title = "维保类型", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(MaintenanceTypeBo bo, HttpServletResponse response) {
+        List<MaintenanceTypeVo> list = maintenanceTypeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "维保类型", MaintenanceTypeVo.class, response);
+    }
+
+    /**
+     * 获取维保类型详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:maintenanceType:query")
+    @GetMapping("/{id}")
+    public R<MaintenanceTypeVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(maintenanceTypeService.queryById(id));
+    }
+
+    /**
+     * 新增维保类型
+     */
+    @SaCheckPermission("customer:maintenanceType:add")
+    @Log(title = "维保类型", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MaintenanceTypeBo bo) {
+        return toAjax(maintenanceTypeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改维保类型
+     */
+    @SaCheckPermission("customer:maintenanceType:edit")
+    @Log(title = "维保类型", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MaintenanceTypeBo bo) {
+        return toAjax(maintenanceTypeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除维保类型
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:maintenanceType:remove")
+    @Log(title = "维保类型", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(maintenanceTypeService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 112 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PurchaseHabitController.java

@@ -0,0 +1,112 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.PurchaseHabitVo;
+import org.dromara.customer.domain.bo.PurchaseHabitBo;
+import org.dromara.customer.service.IPurchaseHabitService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客户采购习惯
+ * 前端访问路由地址为:/customer/purchaseHabit
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/purchaseHabit")
+public class PurchaseHabitController extends BaseController {
+
+    private final IPurchaseHabitService purchaseHabitService;
+
+    /**
+     * 查询客户采购习惯列表
+     */
+    @SaCheckPermission("customer:purchaseHabit:list")
+    @GetMapping("/list")
+    public TableDataInfo<PurchaseHabitVo> list(PurchaseHabitBo bo, PageQuery pageQuery) {
+        return purchaseHabitService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客户采购习惯列表
+     */
+    @SaCheckPermission("customer:purchaseHabit:export")
+    @Log(title = "客户采购习惯", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PurchaseHabitBo bo, HttpServletResponse response) {
+        List<PurchaseHabitVo> list = purchaseHabitService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客户采购习惯", PurchaseHabitVo.class, response);
+    }
+
+    /**
+     * 获取客户采购习惯详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:purchaseHabit:query")
+    @GetMapping("/{id}")
+    public R<PurchaseHabitVo> getInfo(@NotNull(message = "主键不能为空")
+                                      @PathVariable("id") Long id) {
+        return R.ok(purchaseHabitService.queryById(id));
+    }
+
+    /**
+     * 新增客户采购习惯
+     */
+    @SaCheckPermission("customer:purchaseHabit:add")
+    @Log(title = "客户采购习惯", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PurchaseHabitBo bo) {
+        return toAjax(purchaseHabitService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客户采购习惯
+     */
+    @SaCheckPermission("customer:purchaseHabit:edit")
+    @Log(title = "客户采购习惯", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PurchaseHabitBo bo) {
+        return toAjax(purchaseHabitService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客户采购习惯
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:purchaseHabit:remove")
+    @Log(title = "客户采购习惯", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(purchaseHabitService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    @SaCheckPermission("customer:purchaseHabit:list")
+    @GetMapping("/getCustomerPurchaseHabitData")
+    public R<PurchaseHabitVo> getOpenPlatformSettingData(@RequestParam("customerNo") String customerNo) {
+        return R.ok(purchaseHabitService.getCustomerPurchaseHabitData(customerNo));
+    }
+}

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

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.TagCategoryVo;
+import org.dromara.customer.domain.bo.TagCategoryBo;
+import org.dromara.customer.service.ITagCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 标签类别信息
+ * 前端访问路由地址为:/customer/tagCategory
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/tagCategory")
+public class TagCategoryController extends BaseController {
+
+    private final ITagCategoryService tagCategoryService;
+
+    /**
+     * 查询标签类别信息列表
+     */
+    @SaCheckPermission("customer:tagCategory:list")
+    @GetMapping("/list")
+    public TableDataInfo<TagCategoryVo> list(TagCategoryBo bo, PageQuery pageQuery) {
+        return tagCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出标签类别信息列表
+     */
+    @SaCheckPermission("customer:tagCategory:export")
+    @Log(title = "标签类别信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(TagCategoryBo bo, HttpServletResponse response) {
+        List<TagCategoryVo> list = tagCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "标签类别信息", TagCategoryVo.class, response);
+    }
+
+    /**
+     * 获取标签类别信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("customer:tagCategory:query")
+    @GetMapping("/{id}")
+    public R<TagCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(tagCategoryService.queryById(id));
+    }
+
+    /**
+     * 新增标签类别信息
+     */
+    @SaCheckPermission("customer:tagCategory:add")
+    @Log(title = "标签类别信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody TagCategoryBo bo) {
+        return toAjax(tagCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改标签类别信息
+     */
+    @SaCheckPermission("customer:tagCategory:edit")
+    @Log(title = "标签类别信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody TagCategoryBo bo) {
+        return toAjax(tagCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除标签类别信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("customer:tagCategory:remove")
+    @Log(title = "标签类别信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(tagCategoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -0,0 +1,109 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 客户工商注册信息对象 customer_business_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_business_info")
+public class CustomerBusinessInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联客户ID
+     */
+    @TableId(value = "customer_id")
+    private Long customerId;
+
+    /**
+     * 工商全称
+     */
+    private String businessCustomerName;
+
+    /**
+     * 统一社会信用代码
+     */
+    private String socialCreditCode;
+
+    /**
+     * 法人姓名
+     */
+    private String legalPersonName;
+
+    /**
+     * 注册资本
+     */
+    private String registeredCapital;
+
+    /**
+     * 实缴资本
+     */
+    private String paidInCapital;
+
+    /**
+     * 成立日期
+     */
+    private Date establishmentDate;
+
+    /**
+     * 吊销日期
+     */
+    private Date revocationDate;
+
+    /**
+     * 登记状态
+     */
+    private String registrationStatus;
+
+    /**
+     * 登记机关
+     */
+    private String registrationAuthority;
+
+    /**
+     * 经营范围
+     */
+    private String bussinessRange;
+
+    /**
+     * 营业执照路径
+     */
+    private String businessLicense;
+
+    /**
+     * 工商地址-详细地址
+     */
+    private String businessAddress;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 122 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContact.java

@@ -0,0 +1,122 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 客户联系人信息对象 customer_contact
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_contact")
+public class CustomerContact extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 联系人ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 联系人姓名
+     */
+    private String contactName;
+
+    /*自定义登录名*/
+    private String customLoginName;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    /**
+     * 办公电话
+     */
+    private String officePhone;
+
+    /**
+     * 办公电话2
+     */
+    private String officePhoneTwo;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    private Long roleId;
+
+    private Long deptId;
+
+    private String email;
+
+    private Date birthday;
+
+    /**
+     * 是否主联系人:0=是,1=否
+     */
+    private String isPrimary;
+
+    /**
+     * 详细地址
+     */
+    private String addressDetail;
+
+    /**
+     * 所在省编码
+     */
+    private String addressProvince;
+
+    /**
+     * 所在市编码
+     */
+    private String addressCity;
+
+    /**
+     * 所在区县编码
+     */
+    private String addressCounty;
+
+    /**
+     * 省市区
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 123 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContract.java

@@ -0,0 +1,123 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 客户合同对象 customer_contract
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_contract")
+public class CustomerContract extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    private String customerName;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 合同金额
+     */
+    private String contractAmount;
+
+    /**
+     * 客服负责人
+     */
+    private String customerLeader;
+
+    /**
+     * 项目负责人
+     */
+    private String projectLeader;
+
+    /**
+     * 合同类型
+     */
+    private String contractType;
+
+    /**
+     * 合同开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 合同结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 合同上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 结算方式
+     */
+    private String settlementType;
+
+    /**
+     * 合同状态
+     */
+    private String contractStatus;
+
+    /**
+     * 审批状态(如:0-待审批,1-已通过,2-已驳回等)
+     */
+    private String approvalStatus;
+
+    /**
+     * 附件路径或信息
+     */
+    private String annex;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

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

@@ -0,0 +1,164 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 客户信息对象 customer_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_info")
+public class CustomerInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 所属公司
+     */
+    private Long belongCompanyId;
+
+
+    private String companyName;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 工商名称
+     */
+    private String businessCustomerName;
+
+    /**
+     * 企业简称
+     */
+    private String shortName;
+
+    /**
+     * 开票类型
+     */
+    private Long invoiceTypeId;
+
+    /**
+     * 企业规模
+     */
+    private Long enterpriseScaleId;
+
+    /**
+     * 客户类别
+     */
+    private String customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    private String customerLevelId;
+
+    /**
+     * 固定电话
+     */
+    private String landline;
+
+    /**
+     * 传真
+     */
+    private String fax;
+
+    /**
+     * 网址
+     */
+    private String url;
+
+    /**
+     * 邮政编码
+     */
+    private String postCode;
+
+    /**
+     * 开始时间
+     */
+    private Date validityFromDate;
+
+    /**
+     * 结束时间
+     */
+    private Date validityToDate;
+
+    /**
+     * 发票抬头
+     */
+    private String invoiceTop;
+
+    /**
+     * 详细地址(注册地址)
+     */
+    private String address;
+
+    /**
+     * 省份编码
+     */
+    private String regProvincialNo;
+
+    /**
+     * 城市编码
+     */
+    private String regCityNo;
+
+    /**
+     * 区县编码
+     */
+    private String regCountyNo;
+
+    /**
+     * 省市区
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfoTag.java

@@ -0,0 +1,42 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.PlatformEntity;
+
+import java.io.Serial;
+
+/**
+ * 客户标签关联对象 customer_info_tag
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_info_tag")
+public class CustomerInfoTag extends PlatformEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 标签id
+     */
+    private Long tagId;
+
+
+}

+ 92 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInvoiceInfo.java

@@ -0,0 +1,92 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 客户开票信息对象 customer_invoice_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_invoice_info")
+public class CustomerInvoiceInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开票信息ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxId;
+
+    /**
+     * 开户行行号
+     */
+    private String bankCode;
+
+    /**
+     * 开户行
+     */
+    private Long bankId;
+
+    /**
+     * 开户行名称
+     */
+    private String bankName;
+
+    /**
+     * 银行账户
+     */
+    private String bankAccount;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 开户行地址
+     */
+    private String address;
+
+    /**
+     * 是否主账号:0=是,1=否
+     */
+    private String isPrimaryAccount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 123 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java

@@ -0,0 +1,123 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 客户销售信息对象 customer_sales_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_sales_info")
+public class CustomerSalesInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 销售信息ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 信用额度
+     */
+    private BigDecimal creditAmount;
+
+    /**
+     * 剩余额度
+     */
+    private BigDecimal remainingQuota;
+
+    /**
+     * 临时额度
+     */
+    private BigDecimal temporaryQuota;
+
+    /**
+     * 账期(如:30天)
+     */
+    private String accountPeriod;
+
+    /**
+     * 账单日(每月几号)
+     */
+    private Integer billDate;
+
+    /**
+     * 计费日(如:每月1日)
+     */
+    private Integer billingDay;
+
+    /**
+     * 订单审核方式
+     */
+    private String orderAudit;
+
+    /**
+     * 信用管理方式
+     */
+    private String creditManagement;
+
+    /**
+     * 信用支付密码
+     */
+    private String creditPaymentPassword;
+
+    /**
+     * 付款天数
+     */
+    private Integer payDays;
+
+    /**
+     * 销售人员
+     */
+    private Long salesPersonId;
+
+    /**
+     * 服务人员
+     */
+    private Long serviceStaffId;
+
+    /**
+     * 所属部门
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 应收账款
+     */
+    private BigDecimal accountsReceivable;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 127 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerShippingAddress.java

@@ -0,0 +1,127 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 客户收货地址对象 customer_shipping_address
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_shipping_address")
+public class CustomerShippingAddress extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 收货地址编号
+     */
+    private String shippingAddressNo;
+
+    /**
+     * 收货人姓名
+     */
+    private String consignee;
+
+    /**
+     * 部门编号
+     */
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    private String postal;
+
+    /**
+     * 是否默认地址(0-是,1-否)
+     */
+    private String defaultAddress;
+
+    /**
+     * 地址标签
+     */
+    private String addressLabel;
+
+    /**
+     * 省份编码
+     */
+    private String provincialNo;
+
+    /**
+     * 城市编码
+     */
+    private String cityNo;
+
+    /**
+     * 区县编码
+     */
+    private String countryNo;
+
+    /**
+     * 区县编码
+     */
+    private String provincialCityCountry;
+
+    /**
+     * 推送状态(0-已推送,1-未推送等)
+     */
+    private String pushStatus;
+
+    /**
+     * 序号/排序号
+     */
+    private Long num;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerTag.java

@@ -0,0 +1,57 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 客户标签对象 customer_tag
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("customer_tag")
+public class CustomerTag extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 标签名称
+     */
+    private String tagName;
+
+    /**
+     * 商品标签
+     */
+    private String productTagIds;
+
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/EnterpriseScale.java

@@ -0,0 +1,51 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 企业规模对象 enterprise_scale
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("enterprise_scale")
+public class EnterpriseScale extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 企业规模名称
+     */
+    private String enterpriseScaleName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/IndustryCategory.java

@@ -0,0 +1,51 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 所属行业对象 industry_category
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("industry_category")
+public class IndustryCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 所属行业
+     */
+    private String industryCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

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

@@ -0,0 +1,159 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 维保记录对象 maintain_info
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("maintain_info")
+public class MaintainInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 维保单号
+     */
+    private String maintainNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 申请人姓名
+     */
+    private String applicantName;
+
+    /**
+     * 申请人电话
+     */
+    private String applicantPhone;
+
+    /**
+     * 服务时长
+     */
+    private String serviceTime;
+
+    /**
+     * 每月维保次数
+     */
+    private Long monthMainten;
+
+    /**
+     * 剩余维保次数
+     */
+    private Long remainingMainten;
+
+    /**
+     * 维保总次数限制
+     */
+    private Long maintenLimit;
+
+    /**
+     * 服务内容
+     */
+    private String serviceContent;
+
+    /**
+     * 其他服务内容
+     */
+    private String otherService;
+
+    /**
+     * 服务开始时间
+     */
+    private Date serviceStartTime;
+
+    /**
+     * 服务结束时间
+     */
+    private Date serviceEndTime;
+
+    /**
+     * 维保状态
+     */
+    private String maintainStatus;
+
+    /**
+     * 服务工程师
+     */
+    private Long serviceEngineerId;
+
+    /**
+     * 服务工程师姓名
+     */
+    private String serviceEngineer;
+
+    /**
+     * 工程师联系电话
+     */
+    private String engineerPhone;
+
+    /**
+     * 技术顾问
+     */
+    private Long technicalAdviserId;
+
+    /**
+     * 技术顾问姓名
+     */
+    private String technicalAdviser;
+
+    /**
+     * 技术顾问联系电话
+     */
+    private String technicalAdviserPhone;
+
+    /**
+     * 维保附件路径或文件名
+     */
+    private String maintainFile;
+
+    /**
+     * 维保类型
+     */
+    private String maintainType;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerItem.java

@@ -0,0 +1,52 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 维保服务内容对象 maintenance_server_item
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("maintenance_server_item")
+public class MaintenanceServerItem extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 服务内容
+     */
+    private String itemName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerTime.java

@@ -0,0 +1,52 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 维保服务时间对象 maintenance_server_time
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("maintenance_server_time")
+public class MaintenanceServerTime extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 时间类型
+     */
+    private String timeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceType.java

@@ -0,0 +1,52 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 维保类型对象 maintenance_type
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("maintenance_type")
+public class MaintenanceType extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 类型名称
+     */
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 113 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PurchaseHabit.java

@@ -0,0 +1,113 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 客户采购习惯对象 purchase_habit
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("purchase_habit")
+public class PurchaseHabit extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 月度采购量
+     */
+    private BigDecimal monthPurchase;
+
+    /**
+     * 年度采购量
+     */
+    private BigDecimal yearPurchase;
+
+    /**
+     * 常驻负责人/对接人
+     */
+    private String permanentOfficer;
+
+    /**
+     * 选择的机型/型号
+     */
+    private String choiceModel;
+
+    /**
+     * 打印量
+     */
+    private String printAmount;
+
+    /**
+     * 是否购买原装耗材(0-是,1-否)
+     */
+    private String buyOriginal;
+
+    /**
+     * 是否购买技术服务(0-是,1-否)
+     */
+    private String technologyService;
+
+    /**
+     * 采购品类(主选项)
+     */
+    private String purchaseCategory;
+
+    /**
+     * 采购品类(其他补充)
+     */
+    private String otherCategory;
+
+    /**
+     * 适用场景(主选项)
+     */
+    private String adaptScene;
+
+    /**
+     * 适用场景(其他补充)
+     */
+    private String otherScene;
+
+    /**
+     * 定制化需求(主选项)
+     */
+    private String customizeDemand;
+
+    /**
+     * 定制化需求(其他补充)
+     */
+    private String otherCustomize;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/TagCategory.java

@@ -0,0 +1,51 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 标签类别信息对象 tag_category
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tag_category")
+public class TagCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 标签分类
+     */
+    private String tagCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 101 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerBusinessInfoBo.java

@@ -0,0 +1,101 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerBusinessInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 客户工商注册信息业务对象 customer_business_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerBusinessInfo.class, reverseConvertGenerate = false)
+public class CustomerBusinessInfoBo extends BaseEntity {
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 工商全称
+     */
+    private String businessCustomerName;
+
+    /**
+     * 统一社会信用代码
+     */
+    private String socialCreditCode;
+
+    /**
+     * 法人姓名
+     */
+    private String legalPersonName;
+
+    /**
+     * 注册资本
+     */
+    private String registeredCapital;
+
+    /**
+     * 实缴资本
+     */
+    private String paidInCapital;
+
+    /**
+     * 成立日期
+     */
+    private Date establishmentDate;
+
+    /**
+     * 吊销日期
+     */
+    private Date revocationDate;
+
+    /**
+     * 登记状态
+     */
+    private String registrationStatus;
+
+    /**
+     * 登记机关
+     */
+    private String registrationAuthority;
+
+    /**
+     * 经营范围
+     */
+    private String bussinessRange;
+
+    /**
+     * 营业执照路径
+     */
+    private String businessLicense;
+
+    /**
+     * 工商地址-详细地址
+     */
+    private String businessAddress;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 117 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContactBo.java

@@ -0,0 +1,117 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerContact;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.util.Date;
+
+/**
+ * 客户联系人信息业务对象 customer_contact
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerContact.class, reverseConvertGenerate = false)
+public class CustomerContactBo extends BaseEntity {
+
+    /**
+     * 联系人ID
+     */
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 联系人姓名
+     */
+    @NotBlank(message = "联系人姓名不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String contactName;
+
+    /**
+     * 手机号码
+     */
+    @NotBlank(message = "手机号码不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String phone;
+
+    /**
+     * 办公电话
+     */
+    private String officePhone;
+
+    /**
+     * 办公电话2
+     */
+    private String officePhoneTwo;
+
+    /*自定义登录名*/
+    private String customLoginName;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    private Long roleId;
+
+    private Long deptId;
+
+    private String email;
+
+    private Date birthday;
+
+    /**
+     * 是否主联系人:0=是,1=否
+     */
+    private String isPrimary;
+
+    /**
+     * 详细地址
+     */
+    private String addressDetail;
+
+    /**
+     * 所在省编码
+     */
+    private String addressProvince;
+
+    /**
+     * 所在市编码
+     */
+    private String addressCity;
+
+    /**
+     * 所在区县编码
+     */
+    private String addressCounty;
+
+    /**
+     * 省市区
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 121 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContractBo.java

@@ -0,0 +1,121 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerContract;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 客户合同业务对象 customer_contract
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerContract.class, reverseConvertGenerate = false)
+public class CustomerContractBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    @NotBlank(message = "客户编号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    private String customerName;
+
+
+    /**
+     * 合同金额
+     */
+    @NotBlank(message = "合同金额不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String contractAmount;
+
+    /**
+     * 客服负责人
+     */
+    private String customerLeader;
+
+    /**
+     * 项目负责人
+     */
+    private String projectLeader;
+
+    /**
+     * 合同类型
+     */
+    @NotBlank(message = "合同类型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String contractType;
+
+    /**
+     * 合同开始时间
+     */
+    @NotNull(message = "合同开始时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date startTime;
+
+    /**
+     * 合同结束时间
+     */
+    @NotNull(message = "合同结束时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date endTime;
+
+    /**
+     * 合同上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 结算方式
+     */
+    private String settlementType;
+
+    /**
+     * 合同状态
+     */
+    private String contractStatus;
+
+    /**
+     * 审批状态
+     */
+    private String approvalStatus;
+
+    /**
+     * 附件路径或信息
+     */
+    private String annex;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 173 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java

@@ -0,0 +1,173 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 客户信息业务对象 customer_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerInfo.class, reverseConvertGenerate = false)
+public class CustomerInfoBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    @NotBlank(message = "客户编号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String customerNo;
+
+    /**
+     * 所属公司
+     */
+    @NotNull(message = "所属公司不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long belongCompanyId;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 工商名称
+     */
+    @NotBlank(message = "工商名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String businessCustomerName;
+
+    /**
+     * 企业简称
+     */
+    @NotBlank(message = "企业简称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String shortName;
+
+    /**
+     * 开票类型
+     */
+    @NotNull(message = "开票类型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long invoiceTypeId;
+
+    /**
+     * 企业规模
+     */
+    @NotNull(message = "企业规模不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long enterpriseScaleId;
+
+    /**
+     * 客户类别
+     */
+    private String customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    @NotNull(message = "行业类别不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    private String customerLevelId;
+
+    /**
+     * 固定电话
+     */
+    private String landline;
+
+    /**
+     * 传真
+     */
+    private String fax;
+
+    /**
+     * 网址
+     */
+    private String url;
+
+    /**
+     * 邮政编码
+     */
+    private String postCode;
+
+    /**
+     * 开始时间
+     */
+    private Date validityFromDate;
+
+    /**
+     * 结束时间
+     */
+    private Date validityToDate;
+
+    /**
+     * 发票抬头
+     */
+    private String invoiceTop;
+
+    /**
+     * 详细地址(注册地址)
+     */
+    private String address;
+
+    /**
+     * 省份编码
+     */
+    private String regProvincialNo;
+
+    /**
+     * 城市编码
+     */
+    private String regCityNo;
+
+    /**
+     * 区县编码
+     */
+    private String regCountyNo;
+
+    /**
+     * 省市区
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private CustomerBusinessInfoBo customerBusinessBo;
+
+    private CustomerSalesInfoBo customerSalesInfoBo;
+
+    private List<CustomerContactBo> customerContactBoList;
+
+    private List<CustomerInvoiceInfoBo> customerInvoiceInfoBoList;
+
+}

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

@@ -0,0 +1,89 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 客户开票信息业务对象 customer_invoice_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerInvoiceInfo.class, reverseConvertGenerate = false)
+public class CustomerInvoiceInfoBo extends BaseEntity {
+
+    /**
+     * 开票信息ID
+     */
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxId;
+
+    /**
+     * 开户行行号
+     */
+    @NotBlank(message = "开户行行号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bankCode;
+
+    /**
+     * 开户行
+     */
+    @NotNull(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long bankId;
+
+    /**
+     * 开户行名称
+     */
+    @NotBlank(message = "开户行名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bankName;
+
+    /**
+     * 银行账户
+     */
+    @NotBlank(message = "银行账户不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bankAccount;
+
+    /**
+     * 联系电话
+     */
+    @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String phone;
+
+    /**
+     * 开户行地址
+     */
+    private String address;
+
+    /**
+     * 是否主账号:0=是,1=否
+     */
+    private String isPrimaryAccount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 122 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java

@@ -0,0 +1,122 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerSalesInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 客户销售信息业务对象 customer_sales_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerSalesInfo.class, reverseConvertGenerate = false)
+public class CustomerSalesInfoBo extends BaseEntity {
+
+    /**
+     * 销售信息ID
+     */
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 信用额度
+     */
+    private BigDecimal creditAmount;
+
+    /**
+     * 剩余额度
+     */
+    private BigDecimal remainingQuota;
+
+    /**
+     * 临时额度
+     */
+    @NotNull(message = "临时额度不能为空", groups = {AddGroup.class, EditGroup.class})
+    private BigDecimal temporaryQuota;
+
+    /**
+     * 账期(如:30天)
+     */
+    @NotBlank(message = "账期(如:30天)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String accountPeriod;
+
+    /**
+     * 账单日(每月几号)
+     */
+    private Integer billDate;
+
+    /**
+     * 计费日(如:每月1日)
+     */
+    private Integer billingDay;
+
+    /**
+     * 订单审核方式
+     */
+    private String orderAudit;
+
+    /**
+     * 信用管理方式
+     */
+    private String creditManagement;
+
+    /**
+     * 信用支付密码
+     */
+    private String creditPaymentPassword;
+
+    /**
+     * 付款天数
+     */
+    private Integer payDays;
+
+    /**
+     * 销售人员
+     */
+    @NotNull(message = "销售人员不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long salesPersonId;
+
+    /**
+     * 服务人员
+     */
+    @NotNull(message = "服务人员不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long serviceStaffId;
+
+    /**
+     * 所属部门
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 应收账款
+     */
+    private BigDecimal accountsReceivable;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private List<Long> customerIds;
+
+}

+ 120 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerShippingAddressBo.java

@@ -0,0 +1,120 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerShippingAddress;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 客户收货地址业务对象 customer_shipping_address
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerShippingAddress.class, reverseConvertGenerate = false)
+public class CustomerShippingAddressBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 收货地址编号
+     */
+    private String shippingAddressNo;
+
+    /**
+     * 收货人姓名
+     */
+    @NotBlank(message = "收货人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String consignee;
+
+    /**
+     * 部门编号
+     */
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    private String postal;
+
+    /**
+     * 是否默认地址(0-是,1-否)
+     */
+    private String defaultAddress;
+
+    /**
+     * 地址标签
+     */
+    private String addressLabel;
+
+    /**
+     * 省份编码
+     */
+    private String provincialNo;
+
+    /**
+     * 城市编码
+     */
+    private String cityNo;
+
+    /**
+     * 区县编码
+     */
+    private String countryNo;
+
+    /**
+     * 区县编码
+     */
+    private String provincialCityCountry;
+
+    /**
+     * 推送状态(0-已推送,1-未推送等)
+     */
+    private String pushStatus;
+
+    /**
+     * 序号/排序号
+     */
+    private Long num;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 50 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerTagBo.java

@@ -0,0 +1,50 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.CustomerTag;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 客户标签业务对象 customer_tag
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CustomerTag.class, reverseConvertGenerate = false)
+public class CustomerTagBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 标签名称
+     */
+    @NotBlank(message = "标签名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String tagName;
+
+    /**
+     * 商品标签
+     */
+    private String productTagIds;
+
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/EnterpriseScaleBo.java

@@ -0,0 +1,44 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.EnterpriseScale;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 企业规模业务对象 enterprise_scale
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EnterpriseScale.class, reverseConvertGenerate = false)
+public class EnterpriseScaleBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 企业规模名称
+     */
+    @NotBlank(message = "企业规模名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String enterpriseScaleName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/IndustryCategoryBo.java

@@ -0,0 +1,44 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.IndustryCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 所属行业业务对象 industry_category
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = IndustryCategory.class, reverseConvertGenerate = false)
+public class IndustryCategoryBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 所属行业
+     */
+    @NotBlank(message = "所属行业不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String industryCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

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

@@ -0,0 +1,151 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.MaintainInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 维保记录业务对象 maintain_info
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintainInfo.class, reverseConvertGenerate = false)
+public class MaintainInfoBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 维保单号
+     */
+    private String maintainNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 申请人姓名
+     */
+    private String applicantName;
+
+    /**
+     * 申请人电话
+     */
+    private String applicantPhone;
+
+    /**
+     * 服务时长
+     */
+    private String serviceTime;
+
+    /**
+     * 每月维保次数
+     */
+    private Long monthMainten;
+
+    /**
+     * 剩余维保次数
+     */
+    private Long remainingMainten;
+
+    /**
+     * 维保总次数限制
+     */
+    private Long maintenLimit;
+
+    /**
+     * 服务内容
+     */
+    private String serviceContent;
+
+    /**
+     * 其他服务内容
+     */
+    private String otherService;
+
+    /**
+     * 服务开始时间
+     */
+    private Date serviceStartTime;
+
+    /**
+     * 服务结束时间
+     */
+    private Date serviceEndTime;
+
+    /**
+     * 维保状态
+     */
+    private String maintainStatus;
+
+    /**
+     * 服务工程师
+     */
+    private Long serviceEngineerId;
+
+    /**
+     * 服务工程师姓名
+     */
+    private String serviceEngineer;
+
+    /**
+     * 工程师联系电话
+     */
+    private String engineerPhone;
+
+    /**
+     * 技术顾问
+     */
+    private Long technicalAdviserId;
+
+    /**
+     * 技术顾问姓名
+     */
+    private String technicalAdviser;
+
+    /**
+     * 技术顾问联系电话
+     */
+    private String technicalAdviserPhone;
+
+    /**
+     * 维保附件路径或文件名
+     */
+    private String maintainFile;
+
+    /**
+     * 维保类型
+     */
+    private String maintainType;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerItemBo.java

@@ -0,0 +1,45 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.MaintenanceServerItem;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 维保服务内容业务对象 maintenance_server_item
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintenanceServerItem.class, reverseConvertGenerate = false)
+public class MaintenanceServerItemBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 服务内容
+     */
+    @NotBlank(message = "服务内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String itemName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerTimeBo.java

@@ -0,0 +1,45 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.MaintenanceServerTime;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 维保服务时间业务对象 maintenance_server_time
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintenanceServerTime.class, reverseConvertGenerate = false)
+public class MaintenanceServerTimeBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 时间类型
+     */
+    @NotBlank(message = "时间类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String timeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceTypeBo.java

@@ -0,0 +1,45 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.MaintenanceType;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 维保类型业务对象 maintenance_type
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintenanceType.class, reverseConvertGenerate = false)
+public class MaintenanceTypeBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 类型名称
+     */
+    @NotBlank(message = "类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 108 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PurchaseHabitBo.java

@@ -0,0 +1,108 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.PurchaseHabit;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 客户采购习惯业务对象 purchase_habit
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PurchaseHabit.class, reverseConvertGenerate = false)
+public class PurchaseHabitBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 月度采购量
+     */
+    private BigDecimal monthPurchase;
+
+    /**
+     * 年度采购量
+     */
+    private BigDecimal yearPurchase;
+
+    /**
+     * 常驻负责人/对接人
+     */
+    private String permanentOfficer;
+
+    /**
+     * 选择的机型/型号
+     */
+    private String choiceModel;
+
+    /**
+     * 打印量
+     */
+    private String printAmount;
+
+    /**
+     * 是否购买原装耗材(0-是,1-否)
+     */
+    @NotBlank(message = "是否购买原装耗材(0-是,1-否)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String buyOriginal;
+
+    /**
+     * 是否购买技术服务(0-是,1-否)
+     */
+    @NotBlank(message = "是否购买技术服务(0-是,1-否)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String technologyService;
+
+    /**
+     * 采购品类(主选项)
+     */
+    private String purchaseCategory;
+
+    /**
+     * 采购品类(其他补充)
+     */
+    private String otherCategory;
+
+    /**
+     * 适用场景(主选项)
+     */
+    private String adaptScene;
+
+    /**
+     * 适用场景(其他补充)
+     */
+    private String otherScene;
+
+    /**
+     * 定制化需求(主选项)
+     */
+    private String customizeDemand;
+
+    /**
+     * 定制化需求(其他补充)
+     */
+    private String otherCustomize;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/TagCategoryBo.java

@@ -0,0 +1,44 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.TagCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 标签类别信息业务对象 tag_category
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TagCategory.class, reverseConvertGenerate = false)
+public class TagCategoryBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 标签分类
+     */
+    @NotBlank(message = "标签分类不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String tagCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 13 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/dto/SetCustomerInfoTagDto.java

@@ -0,0 +1,13 @@
+package org.dromara.customer.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class SetCustomerInfoTagDto implements Serializable {
+    private List<Long> customerIds;
+
+    private List<Long> tagIds;
+}

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/dto/TechnicalAdviserDto.java

@@ -0,0 +1,17 @@
+package org.dromara.customer.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class TechnicalAdviserDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;//维保记录id
+
+    private Long technicalAdviserId;
+
+    private String technicalAdviser;
+
+    private String technicalAdviserPhone;
+}

+ 41 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/ContractVo.java

@@ -0,0 +1,41 @@
+package org.dromara.customer.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ContractVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    // 客户id
+    private Long customerId;
+    //客户编号
+    private String customerNo;
+
+    //客户名称
+    private String customerName;
+
+    private Long deptId;
+
+    //部门
+    private String deptName;
+
+    private Long industryCategoryId;
+
+    //行业类别
+    private String industryCategory;
+
+    //合同数量
+    private Integer contractCount;
+
+    //有效合同数量
+    private Integer effectiveContract;
+
+    //无效合同数量
+    private Integer invalidContract;
+
+    //作废合同数量
+    private Integer voidedContract;
+
+
+}

+ 125 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerBusinessInfoVo.java

@@ -0,0 +1,125 @@
+package org.dromara.customer.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.CustomerBusinessInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户工商注册信息视图对象 customer_business_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerBusinessInfo.class)
+public class CustomerBusinessInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联客户ID
+     */
+    @ExcelProperty(value = "关联客户ID")
+    private Long customerId;
+
+    /**
+     * 工商全称
+     */
+    @ExcelProperty(value = "工商全称")
+    private String businessCustomerName;
+
+    /**
+     * 统一社会信用代码
+     */
+    @ExcelProperty(value = "统一社会信用代码")
+    private String socialCreditCode;
+
+    /**
+     * 法人姓名
+     */
+    @ExcelProperty(value = "法人姓名")
+    private String legalPersonName;
+
+    /**
+     * 注册资本
+     */
+    @ExcelProperty(value = "注册资本")
+    private String registeredCapital;
+
+    /**
+     * 实缴资本
+     */
+    @ExcelProperty(value = "实缴资本")
+    private String paidInCapital;
+
+    /**
+     * 成立日期
+     */
+    @ExcelProperty(value = "成立日期")
+    private Date establishmentDate;
+
+    /**
+     * 吊销日期
+     */
+    @ExcelProperty(value = "吊销日期")
+    private Date revocationDate;
+
+    /**
+     * 登记状态
+     */
+    @ExcelProperty(value = "登记状态")
+    private String registrationStatus;
+
+    /**
+     * 登记机关
+     */
+    @ExcelProperty(value = "登记机关")
+    private String registrationAuthority;
+
+    /**
+     * 经营范围
+     */
+    @ExcelProperty(value = "经营范围")
+    private String bussinessRange;
+
+    /**
+     * 营业执照路径
+     */
+    @ExcelProperty(value = "营业执照路径")
+    private String businessLicense;
+
+    /**
+     * 工商地址-详细地址
+     */
+    @ExcelProperty(value = "工商地址-详细地址")
+    private String businessAddress;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 140 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerContactVo.java

@@ -0,0 +1,140 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.CustomerContact;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 客户联系人信息视图对象 customer_contact
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerContact.class)
+public class CustomerContactVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 联系人ID
+     */
+    @ExcelProperty(value = "联系人ID")
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    @ExcelProperty(value = "所属客户ID")
+    private Long customerId;
+
+    /**
+     * 联系人姓名
+     */
+    @ExcelProperty(value = "联系人姓名")
+    private String contactName;
+
+    /*自定义登录名*/
+    private String customLoginName;
+
+    /**
+     * 手机号码
+     */
+    @ExcelProperty(value = "手机号码")
+    private String phone;
+
+    /**
+     * 办公电话
+     */
+    @ExcelProperty(value = "办公电话")
+    private String officePhone;
+
+    /**
+     * 办公电话2
+     */
+    @ExcelProperty(value = "办公电话2")
+    private String officePhoneTwo;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    private String gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    @ExcelProperty(value = "采购角色", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:采购经理、财务")
+    private Long roleId;
+
+    private Long deptId;
+
+    /**
+     * 是否主联系人:0=是,1=否
+     */
+    @ExcelProperty(value = "是否主联系人:0=是,1=否", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "is_enabled")
+    private String isPrimary;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String addressDetail;
+
+    private String email;
+
+    private Date birthday;
+
+    /**
+     * 所在省编码
+     */
+    @ExcelProperty(value = "所在省编码")
+    private String addressProvince;
+
+    /**
+     * 所在市编码
+     */
+    @ExcelProperty(value = "所在市编码")
+    private String addressCity;
+
+    /**
+     * 所在区县编码
+     */
+    @ExcelProperty(value = "所在区县编码")
+    private String addressCounty;
+
+    /**
+     * 省市区
+     */
+    @ExcelProperty(value = "省市区")
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 140 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerContractVo.java

@@ -0,0 +1,140 @@
+package org.dromara.customer.domain.vo;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.CustomerContract;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 客户合同视图对象 customer_contract
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerContract.class)
+public class CustomerContractVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    @ExcelProperty(value = "客户id")
+    private Long customerId;
+
+    private String customerName;
+
+    /**
+     * 合同编号
+     */
+    @ExcelProperty(value = "合同编号")
+    private String contractNo;
+
+    /**
+     * 合同名称
+     */
+    @ExcelProperty(value = "合同名称")
+    private String contractName;
+
+    /**
+     * 合同金额
+     */
+    @ExcelProperty(value = "合同金额")
+    private String contractAmount;
+
+    /**
+     * 客服负责人
+     */
+    @ExcelProperty(value = "客服负责人")
+    private String customerLeader;
+
+    /**
+     * 项目负责人
+     */
+    @ExcelProperty(value = "项目负责人")
+    private String projectLeader;
+
+    /**
+     * 合同类型
+     */
+    @ExcelProperty(value = "合同类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "contract_type")
+    private String contractType;
+
+    /**
+     * 合同开始时间
+     */
+    @ExcelProperty(value = "合同开始时间")
+    private Date startTime;
+
+    /**
+     * 合同结束时间
+     */
+    @ExcelProperty(value = "合同结束时间")
+    private Date endTime;
+
+    /**
+     * 合同上传时间
+     */
+    @ExcelProperty(value = "合同上传时间")
+    private Date uploadTime;
+
+    /**
+     * 结算方式
+     */
+    @ExcelProperty(value = "结算方式")
+    private String settlementType;
+
+    /**
+     * 合同状态
+     */
+    @ExcelProperty(value = "合同状态")
+    private String contractStatus;
+
+    /**
+     * 审批状态(如:0-待审批,1-已通过,2-已驳回等)
+     */
+    @ExcelProperty(value = "审批状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:0-待审批,1-已通过,2-已驳回等")
+    private String approvalStatus;
+
+    /**
+     * 附件路径或信息
+     */
+    @ExcelProperty(value = "附件路径或信息")
+    private String annex;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 208 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java

@@ -0,0 +1,208 @@
+package org.dromara.customer.domain.vo;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.CustomerInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.customer.domain.bo.CustomerBusinessInfoBo;
+import org.dromara.customer.domain.bo.CustomerContactBo;
+import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 客户信息视图对象 customer_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerInfo.class)
+public class CustomerInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 所属公司
+     */
+    @ExcelProperty(value = "所属公司")
+    private Long belongCompanyId;
+
+    /**
+     * 公司名称
+     */
+    @ExcelProperty(value = "公司名称")
+    private String companyName;
+
+    /**
+     * 客户名称
+     */
+    @ExcelProperty(value = "客户名称")
+    private String customerName;
+
+    /**
+     * 工商名称
+     */
+    @ExcelProperty(value = "工商名称")
+    private String businessCustomerName;
+
+    /**
+     * 企业简称
+     */
+    @ExcelProperty(value = "企业简称")
+    private String shortName;
+
+    /**
+     * 开票类型
+     */
+    @ExcelProperty(value = "开票类型")
+    private Long invoiceTypeId;
+
+    /**
+     * 企业规模
+     */
+    @ExcelProperty(value = "企业规模")
+    private Long enterpriseScaleId;
+
+    /**
+     * 客户类别
+     */
+    @ExcelProperty(value = "客户类别")
+    private String customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    @ExcelProperty(value = "行业类别")
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    @ExcelProperty(value = "客户等级")
+    private String customerLevelId;
+
+    /**
+     * 固定电话
+     */
+    @ExcelProperty(value = "固定电话")
+    private String landline;
+
+    /**
+     * 传真
+     */
+    @ExcelProperty(value = "传真")
+    private String fax;
+
+    /**
+     * 网址
+     */
+    @ExcelProperty(value = "网址")
+    private String url;
+
+    /**
+     * 邮政编码
+     */
+    @ExcelProperty(value = "邮政编码")
+    private String postCode;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date validityFromDate;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private Date validityToDate;
+
+    /**
+     * 发票抬头
+     */
+    @ExcelProperty(value = "发票抬头")
+    private String invoiceTop;
+
+    /**
+     * 详细地址(注册地址)
+     */
+    @ExcelProperty(value = "详细地址", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "注=册地址")
+    private String address;
+
+    /**
+     * 省份编码
+     */
+    @ExcelProperty(value = "省份编码")
+    private String regProvincialNo;
+
+    /**
+     * 城市编码
+     */
+    @ExcelProperty(value = "城市编码")
+    private String regCityNo;
+
+    /**
+     * 区县编码
+     */
+    @ExcelProperty(value = "区县编码")
+    private String regCountyNo;
+
+    /**
+     * 省市区
+     */
+    @ExcelProperty(value = "省市区")
+    private String provincialCityCounty;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    private String industryCategory; //行业类别
+
+    private String enterpriseScale;//企业规模
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private CustomerBusinessInfoVo customerBusinessInfoVo;
+
+    private CustomerSalesInfoVo customerSalesInfoVo;
+
+    private List<CustomerContactVo> customerContactVoList;
+
+    private List<CustomerInvoiceInfoVo> customerInvoiceInfoVoList;
+
+
+}

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInvoiceInfoVo.java

@@ -0,0 +1,106 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户开票信息视图对象 customer_invoice_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerInvoiceInfo.class)
+public class CustomerInvoiceInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开票信息ID
+     */
+    @ExcelProperty(value = "开票信息ID")
+    private Long id;
+
+    /**
+     * 所属客户ID
+     */
+    @ExcelProperty(value = "所属客户ID")
+    private Long customerId;
+
+    /**
+     * 纳税人识别号
+     */
+    @ExcelProperty(value = "纳税人识别号")
+    private String taxId;
+
+    /**
+     * 开户行行号
+     */
+    @ExcelProperty(value = "开户行行号")
+    private String bankCode;
+
+    /**
+     * 开户行
+     */
+    @ExcelProperty(value = "开户行")
+    private Long bankId;
+
+    /**
+     * 开户行名称
+     */
+    @ExcelProperty(value = "开户行名称")
+    private String bankName;
+
+    /**
+     * 银行账户
+     */
+    @ExcelProperty(value = "银行账户")
+    private String bankAccount;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 开户行地址
+     */
+    @ExcelProperty(value = "开户行地址")
+    private String address;
+
+    /**
+     * 是否主账号:0=是,1=否
+     */
+    @ExcelProperty(value = "是否主账号:0=是,1=否", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "is_enabled")
+    private String isPrimaryAccount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 145 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java

@@ -0,0 +1,145 @@
+package org.dromara.customer.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.customer.domain.CustomerSalesInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户销售信息视图对象 customer_sales_info
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerSalesInfo.class)
+public class CustomerSalesInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 销售信息ID
+     */
+    @ExcelProperty(value = "销售信息ID")
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    @ExcelProperty(value = "关联客户ID")
+    private Long customerId;
+
+    /**
+     * 信用额度
+     */
+    @ExcelProperty(value = "信用额度")
+    private BigDecimal creditAmount;
+
+    /**
+     * 剩余额度
+     */
+    @ExcelProperty(value = "剩余额度")
+    private BigDecimal remainingQuota;
+
+    /**
+     * 临时额度
+     */
+    @ExcelProperty(value = "临时额度")
+    private BigDecimal temporaryQuota;
+
+    /**
+     * 账期(如:30天)
+     */
+    @ExcelProperty(value = "账期", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:30天")
+    private String accountPeriod;
+
+    /**
+     * 账单日(每月几号)
+     */
+    @ExcelProperty(value = "账单日", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "每=月几号")
+    private Integer billDate;
+
+    /**
+     * 计费日(如:每月1日)
+     */
+    @ExcelProperty(value = "计费日", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:每月1日")
+    private Integer billingDay;
+
+    /**
+     * 订单审核方式
+     */
+    @ExcelProperty(value = "订单审核方式")
+    private String orderAudit;
+
+    /**
+     * 信用管理方式
+     */
+    @ExcelProperty(value = "信用管理方式")
+    private String creditManagement;
+
+    /**
+     * 信用支付密码
+     */
+    @ExcelProperty(value = "信用支付密码")
+    private String creditPaymentPassword;
+
+    /**
+     * 付款天数
+     */
+    @ExcelProperty(value = "付款天数")
+    private Integer payDays;
+
+    /**
+     * 销售人员
+     */
+    @ExcelProperty(value = "销售人员")
+    private Long salesPersonId;
+
+    /**
+     * 服务人员
+     */
+    @ExcelProperty(value = "服务人员")
+    private Long serviceStaffId;
+
+    /**
+     * 所属部门
+     */
+    @ExcelProperty(value = "所属部门")
+    private Long belongingDepartmentId;
+
+    /**
+     * 应收账款
+     */
+    @ExcelProperty(value = "应收账款")
+    private BigDecimal accountsReceivable;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 149 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerShippingAddressVo.java

@@ -0,0 +1,149 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.CustomerShippingAddress;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户收货地址视图对象 customer_shipping_address
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerShippingAddress.class)
+public class CustomerShippingAddressVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 客户id
+     */
+    @ExcelProperty(value = "客户id")
+    private Long customerId;
+
+    /**
+     * 收货地址编号
+     */
+    @ExcelProperty(value = "收货地址编号")
+    private String shippingAddressNo;
+
+    /**
+     * 收货人姓名
+     */
+    @ExcelProperty(value = "收货人姓名")
+    private String consignee;
+
+    /**
+     * 部门编号
+     */
+    @ExcelProperty(value = "部门编号")
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    @ExcelProperty(value = "邮政编码")
+    private String postal;
+
+    /**
+     * 是否默认地址(0-是,1-否)
+     */
+    @ExcelProperty(value = "是否默认地址", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=-是,1-否")
+    private String defaultAddress;
+
+    /**
+     * 地址标签
+     */
+    @ExcelProperty(value = "地址标签")
+    private String addressLabel;
+
+    /**
+     * 省份编码
+     */
+    @ExcelProperty(value = "省份编码")
+    private String provincialNo;
+
+    /**
+     * 城市编码
+     */
+    @ExcelProperty(value = "城市编码")
+    private String cityNo;
+
+    /**
+     * 区县编码
+     */
+    @ExcelProperty(value = "区县编码")
+    private String countryNo;
+
+    /**
+     * 区县编码
+     */
+    @ExcelProperty(value = "区县编码")
+    private String provincialCityCountry;
+
+    /**
+     * 推送状态(0-已推送,1-未推送等)
+     */
+    @ExcelProperty(value = "推送状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=-已推送,1-未推送等")
+    private String pushStatus;
+
+    /**
+     * 序号/排序号
+     */
+    @ExcelProperty(value = "序号/排序号")
+    private Long num;
+
+    /**
+     * 部门名称
+     */
+    @ExcelProperty(value = "部门名称")
+    private String deptName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerTagVo.java

@@ -0,0 +1,68 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.CustomerTag;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户标签视图对象 customer_tag
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CustomerTag.class)
+public class CustomerTagVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 标签名称
+     */
+    @ExcelProperty(value = "标签名称")
+    private String tagName;
+
+    /**
+     * 商品标签
+     */
+
+    private String productTagIds;
+    /**
+     * 商品标签
+     */
+    @ExcelProperty(value = "商品标签")
+    private String productTags;
+
+    /**
+     * 状态(0启用 1禁用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "is_enabled")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/EnterpriseScaleVo.java

@@ -0,0 +1,56 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.EnterpriseScale;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 企业规模视图对象 enterprise_scale
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EnterpriseScale.class)
+public class EnterpriseScaleVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 企业规模名称
+     */
+    @ExcelProperty(value = "企业规模名称")
+    private String enterpriseScaleName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/IndustryCategoryVo.java

@@ -0,0 +1,56 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.IndustryCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 所属行业视图对象 industry_category
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = IndustryCategory.class)
+public class IndustryCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 所属行业
+     */
+    @ExcelProperty(value = "所属行业")
+    private String industryCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

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

@@ -0,0 +1,194 @@
+package org.dromara.customer.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.MaintainInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 维保记录视图对象 maintain_info
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = MaintainInfo.class)
+public class MaintainInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    @ExcelProperty(value = "关联客户ID")
+    private Long customerId;
+
+    /**
+     * 维保单号
+     */
+    @ExcelProperty(value = "维保单号")
+    private String maintainNo;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 申请人姓名
+     */
+    @ExcelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    /**
+     * 申请人电话
+     */
+    @ExcelProperty(value = "申请人电话")
+    private String applicantPhone;
+
+    /**
+     * 服务时长
+     */
+    @ExcelProperty(value = "服务时长", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "service_time_type")
+    private String serviceTime;
+
+    /**
+     * 每月维保次数
+     */
+    @ExcelProperty(value = "每月维保次数")
+    private Long monthMainten;
+
+    /**
+     * 剩余维保次数
+     */
+    @ExcelProperty(value = "剩余维保次数")
+    private Long remainingMainten;
+
+    /**
+     * 维保总次数限制
+     */
+    @ExcelProperty(value = "维保总次数限制")
+    private Long maintenLimit;
+
+    /**
+     * 服务内容
+     */
+    @ExcelProperty(value = "服务内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "service_content")
+    private String serviceContent;
+
+    /**
+     * 其他服务内容
+     */
+    @ExcelProperty(value = "其他服务内容")
+    private String otherService;
+
+    /**
+     * 服务开始时间
+     */
+    @ExcelProperty(value = "服务开始时间")
+    private Date serviceStartTime;
+
+    /**
+     * 服务结束时间
+     */
+    @ExcelProperty(value = "服务结束时间")
+    private Date serviceEndTime;
+
+    /**
+     * 维保状态
+     */
+    @ExcelProperty(value = "维保状态")
+    private String maintainStatus;
+
+    /**
+     * 服务工程师
+     */
+    @ExcelProperty(value = "服务工程师")
+    private Long serviceEngineerId;
+
+    /**
+     * 服务工程师姓名
+     */
+    @ExcelProperty(value = "服务工程师姓名")
+    private String serviceEngineer;
+
+    /**
+     * 工程师联系电话
+     */
+    @ExcelProperty(value = "工程师联系电话")
+    private String engineerPhone;
+
+    /**
+     * 技术顾问
+     */
+    @ExcelProperty(value = "技术顾问")
+    private Long technicalAdviserId;
+
+    /**
+     * 技术顾问姓名
+     */
+    @ExcelProperty(value = "技术顾问姓名")
+    private String technicalAdviser;
+
+    /**
+     * 技术顾问联系电话
+     */
+    @ExcelProperty(value = "技术顾问联系电话")
+    private String technicalAdviserPhone;
+
+    /**
+     * 维保附件路径或文件名
+     */
+    @ExcelProperty(value = "维保附件路径或文件名")
+    private String maintainFile;
+
+    /**
+     * 维保类型
+     */
+    @ExcelProperty(value = "维保类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "maintenance_type")
+    private String maintainType;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private String customerName;
+
+    private Integer maintainCount;
+
+    private String serviceContentStr;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerItemVo.java

@@ -0,0 +1,57 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.MaintenanceServerItem;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 维保服务内容视图对象 maintenance_server_item
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = MaintenanceServerItem.class)
+public class MaintenanceServerItemVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 服务内容
+     */
+    @ExcelProperty(value = "服务内容")
+    private String itemName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerTimeVo.java

@@ -0,0 +1,57 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.MaintenanceServerTime;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 维保服务时间视图对象 maintenance_server_time
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = MaintenanceServerTime.class)
+public class MaintenanceServerTimeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 时间类型
+     */
+    @ExcelProperty(value = "时间类型")
+    private String timeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceTypeVo.java

@@ -0,0 +1,57 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.MaintenanceType;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 维保类型视图对象 maintenance_type
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = MaintenanceType.class)
+public class MaintenanceTypeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 类型名称
+     */
+    @ExcelProperty(value = "类型名称")
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 139 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PurchaseHabitVo.java

@@ -0,0 +1,139 @@
+package org.dromara.customer.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.customer.domain.PurchaseHabit;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客户采购习惯视图对象 purchase_habit
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PurchaseHabit.class)
+public class PurchaseHabitVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 月度采购量
+     */
+    @ExcelProperty(value = "月度采购量")
+    private BigDecimal monthPurchase;
+
+    /**
+     * 年度采购量
+     */
+    @ExcelProperty(value = "年度采购量")
+    private BigDecimal yearPurchase;
+
+    /**
+     * 常驻负责人/对接人
+     */
+    @ExcelProperty(value = "常驻负责人/对接人")
+    private String permanentOfficer;
+
+    /**
+     * 选择的机型/型号
+     */
+    @ExcelProperty(value = "选择的机型/型号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "product_types_choosing")
+    private String choiceModel;
+
+    /**
+     * 打印量
+     */
+    @ExcelProperty(value = "打印量", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "daily_print_volume")
+    private String printAmount;
+
+    /**
+     * 是否购买原装耗材(0-是,1-否)
+     */
+    @ExcelProperty(value = "是否购买原装耗材", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String buyOriginal;
+
+    /**
+     * 是否购买技术服务(0-是,1-否)
+     */
+    @ExcelProperty(value = "是否购买技术服务", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String technologyService;
+
+    /**
+     * 采购品类(主选项)
+     */
+    @ExcelProperty(value = "采购品类", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "purchase_item")
+    private String purchaseCategory;
+
+    /**
+     * 采购品类(其他补充)
+     */
+    @ExcelProperty(value = "采购品类", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "其=他补充")
+    private String otherCategory;
+
+    /**
+     * 适用场景(主选项)
+     */
+    @ExcelProperty(value = "适用场景", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "welfare_item")
+    private String adaptScene;
+
+    /**
+     * 适用场景(其他补充)
+     */
+    @ExcelProperty(value = "适用场景", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "其=他补充")
+    private String otherScene;
+
+    /**
+     * 定制化需求(主选项)
+     */
+    @ExcelProperty(value = "定制化需求", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "product_customization")
+    private String customizeDemand;
+
+    /**
+     * 定制化需求(其他补充)
+     */
+    @ExcelProperty(value = "定制化需求", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "其=他补充")
+    private String otherCustomize;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/TagCategoryVo.java

@@ -0,0 +1,56 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.TagCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 标签类别信息视图对象 tag_category
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = TagCategory.class)
+public class TagCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 标签分类
+     */
+    @ExcelProperty(value = "标签分类")
+    private String tagCategoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

+ 20 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerBusinessInfoMapper.java

@@ -0,0 +1,20 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.customer.domain.CustomerBusinessInfo;
+import org.dromara.customer.domain.vo.CustomerBusinessInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户工商注册信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface CustomerBusinessInfoMapper extends BaseMapperPlus<CustomerBusinessInfo, CustomerBusinessInfoVo> {
+
+    void deleteByCustomerId(@Param("customerId") Long customerId);
+
+   CustomerBusinessInfo selectByCustomerId(@Param("customerId") Long customerId);
+
+}

+ 22 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerContactMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.customer.domain.CustomerContact;
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import org.dromara.customer.domain.vo.CustomerContactVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 客户联系人信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface CustomerContactMapper extends BaseMapperPlus<CustomerContact, CustomerContactVo> {
+
+    void deleteByCustomerId(@Param("customerId") Long customerId);
+
+    List<CustomerContact> selectListByCustomerId(@Param("customerId") Long customerId);
+}

+ 21 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerContractMapper.java

@@ -0,0 +1,21 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.customer.domain.CustomerContract;
+import org.dromara.customer.domain.vo.CustomerContractVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 客户合同Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+public interface CustomerContractMapper extends BaseMapperPlus<CustomerContract, CustomerContractVo> {
+
+    List<Map<String, Object>> selectContractStatsByCustomerIds(@Param("customerIdList") List<Long> customerIdList);
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.customer.domain.vo.CustomerInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface CustomerInfoMapper extends BaseMapperPlus<CustomerInfo, CustomerInfoVo> {
+
+}

+ 16 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoTagMapper.java

@@ -0,0 +1,16 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.CustomerInfoTag;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 客户标签关联Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface CustomerInfoTagMapper extends BaseMapperPlus<CustomerInfoTag, CustomerInfoTag> {
+    List<Long> selectCustomerIdsByTagId(Long tagId);
+}

+ 22 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInvoiceInfoMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import org.dromara.customer.domain.vo.CustomerInvoiceInfoVo;
+
+import java.util.List;
+
+/**
+ * 客户开票信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface CustomerInvoiceInfoMapper extends BaseMapperPlus<CustomerInvoiceInfo, CustomerInvoiceInfoVo> {
+
+    void deleteByCustomerId(@Param("customerId") Long customerId);
+
+    List<CustomerInvoiceInfo> selectListByCustomerId(@Param("customerId") Long customerId);
+
+}

+ 20 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerSalesInfoMapper.java

@@ -0,0 +1,20 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.customer.domain.CustomerSalesInfo;
+import org.dromara.customer.domain.vo.CustomerBusinessInfoVo;
+import org.dromara.customer.domain.vo.CustomerSalesInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户销售信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface CustomerSalesInfoMapper extends BaseMapperPlus<CustomerSalesInfo, CustomerSalesInfoVo> {
+
+    void deleteByCustomerId(@Param("customerId") Long customerId);
+
+    CustomerSalesInfo selectByCustomerId(@Param("customerId") Long customerId);
+}

+ 22 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerShippingAddressMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.customer.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.apache.ibatis.annotations.Update;
+import org.dromara.customer.domain.CustomerShippingAddress;
+import org.dromara.customer.domain.vo.CustomerShippingAddressVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户收货地址Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface CustomerShippingAddressMapper extends BaseMapperPlus<CustomerShippingAddress, CustomerShippingAddressVo> {
+
+    @Update("UPDATE customer_shipping_address SET default_address = #{noCode} WHERE customer_id = #{customerId} AND default_address = #{yesCode}")
+    int clearDefaultAddressByCustomerId(@Param("customerId") Long customerId,
+                                        @Param("yesCode") String yesCode,
+                                        @Param("noCode") String noCode);
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerTagMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.CustomerTag;
+import org.dromara.customer.domain.vo.CustomerTagVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户标签Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+public interface CustomerTagMapper extends BaseMapperPlus<CustomerTag, CustomerTagVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/EnterpriseScaleMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.EnterpriseScale;
+import org.dromara.customer.domain.vo.EnterpriseScaleVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 企业规模Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+public interface EnterpriseScaleMapper extends BaseMapperPlus<EnterpriseScale, EnterpriseScaleVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/IndustryCategoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.IndustryCategory;
+import org.dromara.customer.domain.vo.IndustryCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 所属行业Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+public interface IndustryCategoryMapper extends BaseMapperPlus<IndustryCategory, IndustryCategoryVo> {
+
+}

+ 18 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintainInfoMapper.java

@@ -0,0 +1,18 @@
+package org.dromara.customer.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.dromara.customer.domain.MaintainInfo;
+import org.dromara.customer.domain.vo.MaintainInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 维保记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+public interface MaintainInfoMapper extends BaseMapperPlus<MaintainInfo, MaintainInfoVo> {
+
+Integer selectMaintainCountByCustomerId(@Param("customerId") Long customerId);
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceServerItemMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.MaintenanceServerItem;
+import org.dromara.customer.domain.vo.MaintenanceServerItemVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 维保服务内容Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface MaintenanceServerItemMapper extends BaseMapperPlus<MaintenanceServerItem, MaintenanceServerItemVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceServerTimeMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.MaintenanceServerTime;
+import org.dromara.customer.domain.vo.MaintenanceServerTimeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 维保服务时间Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface MaintenanceServerTimeMapper extends BaseMapperPlus<MaintenanceServerTime, MaintenanceServerTimeVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintenanceTypeMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.MaintenanceType;
+import org.dromara.customer.domain.vo.MaintenanceTypeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 维保类型Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface MaintenanceTypeMapper extends BaseMapperPlus<MaintenanceType, MaintenanceTypeVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PurchaseHabitMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.PurchaseHabit;
+import org.dromara.customer.domain.vo.PurchaseHabitVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客户采购习惯Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+public interface PurchaseHabitMapper extends BaseMapperPlus<PurchaseHabit, PurchaseHabitVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/TagCategoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.TagCategory;
+import org.dromara.customer.domain.vo.TagCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 标签类别信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+public interface TagCategoryMapper extends BaseMapperPlus<TagCategory, TagCategoryVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerBusinessInfoService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerBusinessInfo;
+import org.dromara.customer.domain.vo.CustomerBusinessInfoVo;
+import org.dromara.customer.domain.bo.CustomerBusinessInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户工商注册信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ICustomerBusinessInfoService extends IService<CustomerBusinessInfo>{
+
+    /**
+     * 查询客户工商注册信息
+     *
+     * @param customerId 主键
+     * @return 客户工商注册信息
+     */
+    CustomerBusinessInfoVo queryById(Long customerId);
+
+    /**
+     * 分页查询客户工商注册信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户工商注册信息分页列表
+     */
+    TableDataInfo<CustomerBusinessInfoVo> queryPageList(CustomerBusinessInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户工商注册信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户工商注册信息列表
+     */
+    List<CustomerBusinessInfoVo> queryList(CustomerBusinessInfoBo bo);
+
+    /**
+     * 新增客户工商注册信息
+     *
+     * @param bo 客户工商注册信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerBusinessInfoBo bo);
+
+    /**
+     * 修改客户工商注册信息
+     *
+     * @param bo 客户工商注册信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerBusinessInfoBo bo);
+
+    /**
+     * 校验并批量删除客户工商注册信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContactService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerContact;
+import org.dromara.customer.domain.vo.CustomerContactVo;
+import org.dromara.customer.domain.bo.CustomerContactBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户联系人信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ICustomerContactService extends IService<CustomerContact>{
+
+    /**
+     * 查询客户联系人信息
+     *
+     * @param id 主键
+     * @return 客户联系人信息
+     */
+    CustomerContactVo queryById(Long id);
+
+    /**
+     * 分页查询客户联系人信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户联系人信息分页列表
+     */
+    TableDataInfo<CustomerContactVo> queryPageList(CustomerContactBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户联系人信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户联系人信息列表
+     */
+    List<CustomerContactVo> queryList(CustomerContactBo bo);
+
+    /**
+     * 新增客户联系人信息
+     *
+     * @param bo 客户联系人信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerContactBo bo);
+
+    /**
+     * 修改客户联系人信息
+     *
+     * @param bo 客户联系人信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerContactBo bo);
+
+    /**
+     * 校验并批量删除客户联系人信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContractService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerContract;
+import org.dromara.customer.domain.vo.CustomerContractVo;
+import org.dromara.customer.domain.bo.CustomerContractBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户合同Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-16
+ */
+public interface ICustomerContractService extends IService<CustomerContract>{
+
+    /**
+     * 查询客户合同
+     *
+     * @param id 主键
+     * @return 客户合同
+     */
+    CustomerContractVo queryById(Long id);
+
+    /**
+     * 分页查询客户合同列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户合同分页列表
+     */
+    TableDataInfo<CustomerContractVo> queryPageList(CustomerContractBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户合同列表
+     *
+     * @param bo 查询条件
+     * @return 客户合同列表
+     */
+    List<CustomerContractVo> queryList(CustomerContractBo bo);
+
+    /**
+     * 新增客户合同
+     *
+     * @param bo 客户合同
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerContractBo bo);
+
+    /**
+     * 修改客户合同
+     *
+     * @param bo 客户合同
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerContractBo bo);
+
+    /**
+     * 校验并批量删除客户合同信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 93 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java

@@ -0,0 +1,93 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.customer.domain.vo.ContractVo;
+import org.dromara.customer.domain.vo.CustomerInfoVo;
+import org.dromara.customer.domain.bo.CustomerInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ICustomerInfoService extends IService<CustomerInfo> {
+
+    /**
+     * 查询客户信息
+     *
+     * @param id 主键
+     * @return 客户信息
+     */
+    CustomerInfoVo queryById(Long id);
+
+    /**
+     * 分页查询客户信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户信息分页列表
+     */
+    TableDataInfo<CustomerInfoVo> queryPageList(CustomerInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 分页查询合同管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户信息分页列表
+     */
+    TableDataInfo<ContractVo> queryContractPageList(CustomerInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户信息列表
+     */
+    List<CustomerInfoVo> queryList(CustomerInfoBo bo);
+
+
+    /**
+     * 新增客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerInfoBo bo);
+
+    /**
+     * 修改客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerInfoBo bo);
+
+    /**
+     * 修改状态
+     */
+    int updateCustomerCheckStatus(Long customerId, String status);
+
+    /*修改临时额度*/
+    int updateCreditAmount(List<Long> customerIds, BigDecimal creditAmount);
+
+    /*设置客户标签*/
+    int setCustomerInfoTag(List<Long> customerIds, List<Long> tagIds);
+
+    /**
+     * 校验并批量删除客户信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInvoiceInfoService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import org.dromara.customer.domain.vo.CustomerInvoiceInfoVo;
+import org.dromara.customer.domain.bo.CustomerInvoiceInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户开票信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ICustomerInvoiceInfoService extends IService<CustomerInvoiceInfo>{
+
+    /**
+     * 查询客户开票信息
+     *
+     * @param id 主键
+     * @return 客户开票信息
+     */
+    CustomerInvoiceInfoVo queryById(Long id);
+
+    /**
+     * 分页查询客户开票信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户开票信息分页列表
+     */
+    TableDataInfo<CustomerInvoiceInfoVo> queryPageList(CustomerInvoiceInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户开票信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户开票信息列表
+     */
+    List<CustomerInvoiceInfoVo> queryList(CustomerInvoiceInfoBo bo);
+
+    /**
+     * 新增客户开票信息
+     *
+     * @param bo 客户开票信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerInvoiceInfoBo bo);
+
+    /**
+     * 修改客户开票信息
+     *
+     * @param bo 客户开票信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerInvoiceInfoBo bo);
+
+    /**
+     * 校验并批量删除客户开票信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerSalesInfoService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerSalesInfo;
+import org.dromara.customer.domain.vo.CustomerSalesInfoVo;
+import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户销售信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ICustomerSalesInfoService extends IService<CustomerSalesInfo>{
+
+    /**
+     * 查询客户销售信息
+     *
+     * @param id 主键
+     * @return 客户销售信息
+     */
+    CustomerSalesInfoVo queryById(Long id);
+
+    /**
+     * 分页查询客户销售信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户销售信息分页列表
+     */
+    TableDataInfo<CustomerSalesInfoVo> queryPageList(CustomerSalesInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户销售信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户销售信息列表
+     */
+    List<CustomerSalesInfoVo> queryList(CustomerSalesInfoBo bo);
+
+    /**
+     * 新增客户销售信息
+     *
+     * @param bo 客户销售信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerSalesInfoBo bo);
+
+    /**
+     * 修改客户销售信息
+     *
+     * @param bo 客户销售信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerSalesInfoBo bo);
+
+    /**
+     * 校验并批量删除客户销售信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 75 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerShippingAddressService.java

@@ -0,0 +1,75 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerShippingAddress;
+import org.dromara.customer.domain.vo.CustomerShippingAddressVo;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户收货地址Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-15
+ */
+public interface ICustomerShippingAddressService extends IService<CustomerShippingAddress>{
+
+    /**
+     * 查询客户收货地址
+     *
+     * @param id 主键
+     * @return 客户收货地址
+     */
+    CustomerShippingAddressVo queryById(Long id);
+
+    /**
+     * 分页查询客户收货地址列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户收货地址分页列表
+     */
+    TableDataInfo<CustomerShippingAddressVo> queryPageList(CustomerShippingAddressBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户收货地址列表
+     *
+     * @param bo 查询条件
+     * @return 客户收货地址列表
+     */
+    List<CustomerShippingAddressVo> queryList(CustomerShippingAddressBo bo);
+
+    /**
+     * 新增客户收货地址
+     *
+     * @param bo 客户收货地址
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerShippingAddressBo bo);
+
+    /**
+     * 修改客户收货地址
+     *
+     * @param bo 客户收货地址
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerShippingAddressBo bo);
+
+    /**
+     * 设置默认地址
+     */
+    int changeDefaultAddress(CustomerShippingAddressBo bo);
+
+    /**
+     * 校验并批量删除客户收货地址信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerTagService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerTag;
+import org.dromara.customer.domain.vo.CustomerTagVo;
+import org.dromara.customer.domain.bo.CustomerTagBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户标签Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+public interface ICustomerTagService extends IService<CustomerTag>{
+
+    /**
+     * 查询客户标签
+     *
+     * @param id 主键
+     * @return 客户标签
+     */
+    CustomerTagVo queryById(Long id);
+
+    /**
+     * 分页查询客户标签列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户标签分页列表
+     */
+    TableDataInfo<CustomerTagVo> queryPageList(CustomerTagBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客户标签列表
+     *
+     * @param bo 查询条件
+     * @return 客户标签列表
+     */
+    List<CustomerTagVo> queryList(CustomerTagBo bo);
+
+    /**
+     * 新增客户标签
+     *
+     * @param bo 客户标签
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerTagBo bo);
+
+    /**
+     * 修改客户标签
+     *
+     * @param bo 客户标签
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerTagBo bo);
+
+    /**
+     * 校验并批量删除客户标签信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff