Browse Source

feat(customer): 新增客户工商注册信息和联系人信息模块

- 新增客户工商注册信息实体类、业务对象、控制器、映射器及服务实现
- 新增客户联系人信息实体类、业务对象、控制器、映射器及服务实现
- 配置客户模块的Nacos配置文件及应用YAML配置
- 在数据权限拦截器和租户处理器中排除新表的干扰
- 提供完整的CRUD功能支持包括分页查询、导出Excel等功能
hurx 4 tháng trước cách đây
mục cha
commit
7dfc664d81
87 tập tin đã thay đổi với 6985 bổ sung0 xóa
  1. 1 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  2. 1 0
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java
  3. 132 0
      ruoyi-modules/ruoyi-customer/pom.xml
  4. 17 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/RuoyiCustomerApplication.java
  5. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerBusinessInfoController.java
  6. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerContactController.java
  7. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  8. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInvoiceInfoController.java
  9. 100 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerSalesInfoController.java
  10. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerTagController.java
  11. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/EnterpriseScaleController.java
  12. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/IndustryCategoryController.java
  13. 118 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/MaintainInfoController.java
  14. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/TagCategoryController.java
  15. 109 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerBusinessInfo.java
  16. 112 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerContact.java
  17. 159 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  18. 92 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInvoiceInfo.java
  19. 123 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java
  20. 57 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerTag.java
  21. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/EnterpriseScale.java
  22. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/IndustryCategory.java
  23. 159 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintainInfo.java
  24. 51 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/TagCategory.java
  25. 101 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerBusinessInfoBo.java
  26. 107 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerContactBo.java
  27. 171 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  28. 89 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInvoiceInfoBo.java
  29. 119 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java
  30. 50 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerTagBo.java
  31. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/EnterpriseScaleBo.java
  32. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/IndustryCategoryBo.java
  33. 151 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintainInfoBo.java
  34. 44 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/TagCategoryBo.java
  35. 17 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/dto/TechnicalAdviserDto.java
  36. 125 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerBusinessInfoVo.java
  37. 132 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerContactVo.java
  38. 201 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java
  39. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInvoiceInfoVo.java
  40. 145 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java
  41. 68 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerTagVo.java
  42. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/EnterpriseScaleVo.java
  43. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/IndustryCategoryVo.java
  44. 192 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintainInfoVo.java
  45. 56 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/TagCategoryVo.java
  46. 20 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerBusinessInfoMapper.java
  47. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerContactMapper.java
  48. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java
  49. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInvoiceInfoMapper.java
  50. 20 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerSalesInfoMapper.java
  51. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerTagMapper.java
  52. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/EnterpriseScaleMapper.java
  53. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/IndustryCategoryMapper.java
  54. 18 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/MaintainInfoMapper.java
  55. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/TagCategoryMapper.java
  56. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerBusinessInfoService.java
  57. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContactService.java
  58. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  59. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInvoiceInfoService.java
  60. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerSalesInfoService.java
  61. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerTagService.java
  62. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IEnterpriseScaleService.java
  63. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IIndustryCategoryService.java
  64. 79 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IMaintainInfoService.java
  65. 69 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ITagCategoryService.java
  66. 146 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerBusinessInfoServiceImpl.java
  67. 147 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java
  68. 365 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  69. 143 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInvoiceInfoServiceImpl.java
  70. 149 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java
  71. 136 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerTagServiceImpl.java
  72. 135 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/EnterpriseScaleServiceImpl.java
  73. 135 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/IndustryCategoryServiceImpl.java
  74. 196 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/MaintainInfoServiceImpl.java
  75. 134 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/TagCategoryServiceImpl.java
  76. 34 0
      ruoyi-modules/ruoyi-customer/src/main/resources/application.yml
  77. 28 0
      ruoyi-modules/ruoyi-customer/src/main/resources/logback-plus.xml
  78. 17 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerBusinessInfoMapper.xml
  79. 17 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerContactMapper.xml
  80. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInfoMapper.xml
  81. 17 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInvoiceInfoMapper.xml
  82. 17 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerSalesInfoMapper.xml
  83. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerTagMapper.xml
  84. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/EnterpriseScaleMapper.xml
  85. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/IndustryCategoryMapper.xml
  86. 12 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/MaintainInfoMapper.xml
  87. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/TagCategoryMapper.xml

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

@@ -42,6 +42,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_user_post",
         "sys_config",
         "sys_dict",
+        "sys_dict_data",
         "sys_dict_type",
         "sys_oss",
         "sys_oss_config",

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

@@ -29,6 +29,7 @@ public class PlatformTenantLineHandler implements TenantLineHandler {
         "sys_user_post",
         "sys_config",
         "sys_dict",
+        "sys_dict_data",
         "sys_dict_type",
         "sys_oss",
         "sys_oss_config",

+ 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/CustomerInfoController.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.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);
+    }
+
+    /**
+     * 导出客户信息列表
+     */
+    @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));
+    }
+}

+ 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));
+    }
+}

+ 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));
+    }
+}

+ 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;
+
+
+}

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

@@ -0,0 +1,112 @@
+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_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 phone;
+
+    /**
+     * 办公电话
+     */
+    private String officePhone;
+
+    /**
+     * 办公电话2
+     */
+    private String officePhoneTwo;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    private Long roleId;
+
+    /**
+     * 是否主联系人: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;
+
+
+}

+ 159 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.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;
+
+/**
+ * 客户信息对象 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 businessCustomerName;
+
+    /**
+     * 企业简称
+     */
+    private String shortName;
+
+    /**
+     * 开票类型
+     */
+    private Long invoiceTypeId;
+
+    /**
+     * 企业规模
+     */
+    private Long enterpriseScaleId;
+
+    /**
+     * 客户类别
+     */
+    private Long customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    private Long 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;
+
+
+}

+ 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;
+
+
+}

+ 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;
+
+
+}

+ 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;
+
+
+}

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

@@ -0,0 +1,107 @@
+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.*;
+
+/**
+ * 客户联系人信息业务对象 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 gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    private Long roleId;
+
+    /**
+     * 是否主联系人: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;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,171 @@
+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;
+
+    /**
+     * 客户名称
+     */
+    @NotBlank(message = "客户名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String companyName;
+
+    /**
+     * 工商名称
+     */
+    @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;
+
+    /**
+     * 客户类别
+     */
+    @NotNull(message = "客户类别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    @NotNull(message = "行业类别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    @NotNull(message = "客户等级不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long 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;
+
+
+}

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

@@ -0,0 +1,119 @@
+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;
+
+/**
+ * 客户销售信息业务对象 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;
+
+
+}

+ 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;
+
+
+}

+ 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;
+
+}

+ 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;
+}

+ 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;
+
+
+}

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

@@ -0,0 +1,132 @@
+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;
+
+    /**
+     * 手机号码
+     */
+    @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;
+
+    /**
+     * 是否主联系人:0=是,1=否
+     */
+    @ExcelProperty(value = "是否主联系人:0=是,1=否", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "is_enabled")
+    private String isPrimary;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String addressDetail;
+
+    /**
+     * 所在省编码
+     */
+    @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;
+
+
+}

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

@@ -0,0 +1,201 @@
+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 businessCustomerName;
+
+    /**
+     * 企业简称
+     */
+    @ExcelProperty(value = "企业简称")
+    private String shortName;
+
+    /**
+     * 开票类型
+     */
+    @ExcelProperty(value = "开票类型")
+    private Long invoiceTypeId;
+
+    /**
+     * 企业规模
+     */
+    @ExcelProperty(value = "企业规模")
+    private Long enterpriseScaleId;
+
+    /**
+     * 客户类别
+     */
+    @ExcelProperty(value = "客户类别")
+    private Long customerTypeId;
+
+    /**
+     * 行业类别
+     */
+    @ExcelProperty(value = "行业类别")
+    private Long industryCategoryId;
+
+    /**
+     * 客户等级
+     */
+    @ExcelProperty(value = "客户等级")
+    private Long 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;
+
+
+}

+ 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;
+
+}

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

@@ -0,0 +1,192 @@
+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;
+
+
+}

+ 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);
+}

+ 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> {
+
+}

+ 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);
+}

+ 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/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/ICustomerInfoService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.CustomerInfo;
+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.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 查询条件
+     * @return 客户信息列表
+     */
+    List<CustomerInfoVo> queryList(CustomerInfoBo bo);
+
+    /**
+     * 新增客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CustomerInfoBo bo);
+
+    /**
+     * 修改客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CustomerInfoBo 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/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);
+}

+ 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);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.EnterpriseScale;
+import org.dromara.customer.domain.vo.EnterpriseScaleVo;
+import org.dromara.customer.domain.bo.EnterpriseScaleBo;
+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 IEnterpriseScaleService extends IService<EnterpriseScale>{
+
+    /**
+     * 查询企业规模
+     *
+     * @param id 主键
+     * @return 企业规模
+     */
+    EnterpriseScaleVo queryById(Long id);
+
+    /**
+     * 分页查询企业规模列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 企业规模分页列表
+     */
+    TableDataInfo<EnterpriseScaleVo> queryPageList(EnterpriseScaleBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的企业规模列表
+     *
+     * @param bo 查询条件
+     * @return 企业规模列表
+     */
+    List<EnterpriseScaleVo> queryList(EnterpriseScaleBo bo);
+
+    /**
+     * 新增企业规模
+     *
+     * @param bo 企业规模
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(EnterpriseScaleBo bo);
+
+    /**
+     * 修改企业规模
+     *
+     * @param bo 企业规模
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(EnterpriseScaleBo 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/IIndustryCategoryService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.IndustryCategory;
+import org.dromara.customer.domain.vo.IndustryCategoryVo;
+import org.dromara.customer.domain.bo.IndustryCategoryBo;
+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 IIndustryCategoryService extends IService<IndustryCategory>{
+
+    /**
+     * 查询所属行业
+     *
+     * @param id 主键
+     * @return 所属行业
+     */
+    IndustryCategoryVo queryById(Long id);
+
+    /**
+     * 分页查询所属行业列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 所属行业分页列表
+     */
+    TableDataInfo<IndustryCategoryVo> queryPageList(IndustryCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的所属行业列表
+     *
+     * @param bo 查询条件
+     * @return 所属行业列表
+     */
+    List<IndustryCategoryVo> queryList(IndustryCategoryBo bo);
+
+    /**
+     * 新增所属行业
+     *
+     * @param bo 所属行业
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(IndustryCategoryBo bo);
+
+    /**
+     * 修改所属行业
+     *
+     * @param bo 所属行业
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(IndustryCategoryBo bo);
+
+    /**
+     * 校验并批量删除所属行业信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 79 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IMaintainInfoService.java

@@ -0,0 +1,79 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.MaintainInfo;
+import org.dromara.customer.domain.dto.TechnicalAdviserDto;
+import org.dromara.customer.domain.vo.MaintainInfoVo;
+import org.dromara.customer.domain.bo.MaintainInfoBo;
+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-12
+ */
+public interface IMaintainInfoService extends IService<MaintainInfo>{
+
+    /**
+     * 查询维保记录
+     *
+     * @param id 主键
+     * @return 维保记录
+     */
+    MaintainInfoVo queryById(Long id);
+
+    /**
+     * 分页查询维保记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 维保记录分页列表
+     */
+    TableDataInfo<MaintainInfoVo> queryPageList(MaintainInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的维保记录列表
+     *
+     * @param bo 查询条件
+     * @return 维保记录列表
+     */
+    List<MaintainInfoVo> queryList(MaintainInfoBo bo);
+
+    /**
+     * 新增维保记录
+     *
+     * @param bo 维保记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(MaintainInfoBo bo);
+
+    /**
+     * 分配技术顾问
+     *
+     * @param bo
+     * @return 是否新增成功
+     */
+    Boolean allotTechnicalAdviser(TechnicalAdviserDto bo);
+
+    /**
+     * 修改维保记录
+     *
+     * @param bo 维保记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(MaintainInfoBo bo);
+
+    /**
+     * 校验并批量删除维保记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 69 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ITagCategoryService.java

@@ -0,0 +1,69 @@
+package org.dromara.customer.service;
+
+import org.dromara.customer.domain.TagCategory;
+import org.dromara.customer.domain.vo.TagCategoryVo;
+import org.dromara.customer.domain.bo.TagCategoryBo;
+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-09
+ */
+public interface ITagCategoryService {
+
+    /**
+     * 查询标签类别信息
+     *
+     * @param id 主键
+     * @return 标签类别信息
+     */
+    TagCategoryVo queryById(Long id);
+
+    /**
+     * 分页查询标签类别信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 标签类别信息分页列表
+     */
+    TableDataInfo<TagCategoryVo> queryPageList(TagCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的标签类别信息列表
+     *
+     * @param bo 查询条件
+     * @return 标签类别信息列表
+     */
+    List<TagCategoryVo> queryList(TagCategoryBo bo);
+
+    /**
+     * 新增标签类别信息
+     *
+     * @param bo 标签类别信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(TagCategoryBo bo);
+
+    /**
+     * 修改标签类别信息
+     *
+     * @param bo 标签类别信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(TagCategoryBo bo);
+
+    /**
+     * 校验并批量删除标签类别信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 146 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerBusinessInfoServiceImpl.java

@@ -0,0 +1,146 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.CustomerBusinessInfoBo;
+import org.dromara.customer.domain.vo.CustomerBusinessInfoVo;
+import org.dromara.customer.domain.CustomerBusinessInfo;
+import org.dromara.customer.mapper.CustomerBusinessInfoMapper;
+import org.dromara.customer.service.ICustomerBusinessInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客户工商注册信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerBusinessInfoServiceImpl  extends ServiceImpl<CustomerBusinessInfoMapper, CustomerBusinessInfo> implements ICustomerBusinessInfoService {
+
+    private final CustomerBusinessInfoMapper baseMapper;
+
+    /**
+     * 查询客户工商注册信息
+     *
+     * @param customerId 主键
+     * @return 客户工商注册信息
+     */
+    @Override
+    public CustomerBusinessInfoVo queryById(Long customerId){
+        return baseMapper.selectVoById(customerId);
+    }
+
+    /**
+     * 分页查询客户工商注册信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户工商注册信息分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerBusinessInfoVo> queryPageList(CustomerBusinessInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerBusinessInfo> lqw = buildQueryWrapper(bo);
+        Page<CustomerBusinessInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户工商注册信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户工商注册信息列表
+     */
+    @Override
+    public List<CustomerBusinessInfoVo> queryList(CustomerBusinessInfoBo bo) {
+        LambdaQueryWrapper<CustomerBusinessInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerBusinessInfo> buildQueryWrapper(CustomerBusinessInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerBusinessInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerBusinessInfo::getCustomerId);
+        lqw.like(StringUtils.isNotBlank(bo.getBusinessCustomerName()), CustomerBusinessInfo::getBusinessCustomerName, bo.getBusinessCustomerName());
+        lqw.eq(StringUtils.isNotBlank(bo.getSocialCreditCode()), CustomerBusinessInfo::getSocialCreditCode, bo.getSocialCreditCode());
+        lqw.like(StringUtils.isNotBlank(bo.getLegalPersonName()), CustomerBusinessInfo::getLegalPersonName, bo.getLegalPersonName());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegisteredCapital()), CustomerBusinessInfo::getRegisteredCapital, bo.getRegisteredCapital());
+        lqw.eq(StringUtils.isNotBlank(bo.getPaidInCapital()), CustomerBusinessInfo::getPaidInCapital, bo.getPaidInCapital());
+        lqw.eq(bo.getEstablishmentDate() != null, CustomerBusinessInfo::getEstablishmentDate, bo.getEstablishmentDate());
+        lqw.eq(bo.getRevocationDate() != null, CustomerBusinessInfo::getRevocationDate, bo.getRevocationDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegistrationStatus()), CustomerBusinessInfo::getRegistrationStatus, bo.getRegistrationStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegistrationAuthority()), CustomerBusinessInfo::getRegistrationAuthority, bo.getRegistrationAuthority());
+        lqw.eq(StringUtils.isNotBlank(bo.getBussinessRange()), CustomerBusinessInfo::getBussinessRange, bo.getBussinessRange());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusinessLicense()), CustomerBusinessInfo::getBusinessLicense, bo.getBusinessLicense());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusinessAddress()), CustomerBusinessInfo::getBusinessAddress, bo.getBusinessAddress());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerBusinessInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerBusinessInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户工商注册信息
+     *
+     * @param bo 客户工商注册信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CustomerBusinessInfoBo bo) {
+        CustomerBusinessInfo add = MapstructUtils.convert(bo, CustomerBusinessInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setCustomerId(add.getCustomerId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客户工商注册信息
+     *
+     * @param bo 客户工商注册信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CustomerBusinessInfoBo bo) {
+        CustomerBusinessInfo update = MapstructUtils.convert(bo, CustomerBusinessInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerBusinessInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户工商注册信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 147 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java

@@ -0,0 +1,147 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.CustomerContactBo;
+import org.dromara.customer.domain.vo.CustomerContactVo;
+import org.dromara.customer.domain.CustomerContact;
+import org.dromara.customer.mapper.CustomerContactMapper;
+import org.dromara.customer.service.ICustomerContactService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客户联系人信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapper, CustomerContact> implements ICustomerContactService {
+
+    private final CustomerContactMapper baseMapper;
+
+    /**
+     * 查询客户联系人信息
+     *
+     * @param id 主键
+     * @return 客户联系人信息
+     */
+    @Override
+    public CustomerContactVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客户联系人信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户联系人信息分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerContactVo> queryPageList(CustomerContactBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerContact> lqw = buildQueryWrapper(bo);
+        Page<CustomerContactVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户联系人信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户联系人信息列表
+     */
+    @Override
+    public List<CustomerContactVo> queryList(CustomerContactBo bo) {
+        LambdaQueryWrapper<CustomerContact> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerContact> buildQueryWrapper(CustomerContactBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerContact> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerContact::getId);
+        lqw.eq(bo.getCustomerId() != null, CustomerContact::getCustomerId, bo.getCustomerId());
+        lqw.like(StringUtils.isNotBlank(bo.getContactName()), CustomerContact::getContactName, bo.getContactName());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), CustomerContact::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getOfficePhone()), CustomerContact::getOfficePhone, bo.getOfficePhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getOfficePhoneTwo()), CustomerContact::getOfficePhoneTwo, bo.getOfficePhoneTwo());
+        lqw.eq(StringUtils.isNotBlank(bo.getGender()), CustomerContact::getGender, bo.getGender());
+        lqw.eq(bo.getRoleId() != null, CustomerContact::getRoleId, bo.getRoleId());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsPrimary()), CustomerContact::getIsPrimary, bo.getIsPrimary());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddressDetail()), CustomerContact::getAddressDetail, bo.getAddressDetail());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddressProvince()), CustomerContact::getAddressProvince, bo.getAddressProvince());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddressCity()), CustomerContact::getAddressCity, bo.getAddressCity());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddressCounty()), CustomerContact::getAddressCounty, bo.getAddressCounty());
+        lqw.eq(StringUtils.isNotBlank(bo.getProvincialCityCounty()), CustomerContact::getProvincialCityCounty, bo.getProvincialCityCounty());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerContact::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerContact::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户联系人信息
+     *
+     * @param bo 客户联系人信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CustomerContactBo bo) {
+        CustomerContact add = MapstructUtils.convert(bo, CustomerContact.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客户联系人信息
+     *
+     * @param bo 客户联系人信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CustomerContactBo bo) {
+        CustomerContact update = MapstructUtils.convert(bo, CustomerContact.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerContact entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户联系人信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 365 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -0,0 +1,365 @@
+package org.dromara.customer.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.customer.domain.*;
+import org.dromara.customer.domain.bo.*;
+import org.dromara.customer.domain.vo.*;
+import org.dromara.customer.mapper.*;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.service.ICustomerInfoService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 客户信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerInfoServiceImpl  extends ServiceImpl<CustomerInfoMapper, CustomerInfo> implements ICustomerInfoService {
+
+    private final CustomerInfoMapper baseMapper;
+    private final CustomerBusinessInfoMapper customerBusinessInfoMapper;
+    private final CustomerInvoiceInfoMapper customerInvoiceInfoMapper;
+    private final CustomerContactMapper customerContactMapper;
+    private final CustomerSalesInfoMapper customerSalesInfoMapper;
+    private final IndustryCategoryMapper industryCategoryMapper;
+    private final EnterpriseScaleMapper enterpriseScaleMapper;
+
+
+    /**
+     * 查询客户信息
+     *
+     * @param id 主键
+     * @return 客户信息
+     */
+    @Override
+    public CustomerInfoVo queryById(Long id){
+        if (id == null || id <= 0) {
+            return null;
+        }
+
+        // 1. 查询主表
+        CustomerInfoVo vo = baseMapper.selectVoById(id);
+        if (vo == null) {
+            return null;
+        }
+        EnterpriseScaleVo enterpriseScaleVo = enterpriseScaleMapper.selectVoById(vo.getEnterpriseScaleId());
+        if (enterpriseScaleVo != null){
+            vo.setEnterpriseScale(enterpriseScaleVo.getEnterpriseScaleName());
+        }
+
+        IndustryCategoryVo industryCategoryVo = industryCategoryMapper.selectVoById(vo.getIndustryCategoryId());
+        if (industryCategoryVo != null){
+            vo.setIndustryCategory(industryCategoryVo.getIndustryCategoryName());
+        }
+        // 2. 查询关联信息
+        vo.setCustomerBusinessInfoVo(
+            Optional.ofNullable(customerBusinessInfoMapper.selectByCustomerId(id))
+                .map(entity -> MapstructUtils.convert(entity, CustomerBusinessInfoVo.class))
+                .orElse(null)
+        );
+
+        vo.setCustomerSalesInfoVo(
+            Optional.ofNullable(customerSalesInfoMapper.selectByCustomerId(id))
+                .map(entity -> MapstructUtils.convert(entity, CustomerSalesInfoVo.class))
+                .orElse(null)
+        );
+
+        List<CustomerContact> contactEntities = customerContactMapper.selectListByCustomerId(id);
+        vo.setCustomerContactVoList(
+            contactEntities != null
+                ? contactEntities.stream()
+                .map(contact -> MapstructUtils.convert(contact, CustomerContactVo.class))
+                .collect(Collectors.toList())
+                : Collections.emptyList()
+        );
+
+        List<CustomerInvoiceInfo> invoiceEntities = customerInvoiceInfoMapper.selectListByCustomerId(id);
+        vo.setCustomerInvoiceInfoVoList(
+            invoiceEntities != null
+                ? invoiceEntities.stream()
+                .map(invoice -> MapstructUtils.convert(invoice, CustomerInvoiceInfoVo.class))
+                .collect(Collectors.toList())
+                : Collections.emptyList()
+        );
+
+        return vo;
+    }
+
+    /**
+     * 分页查询客户信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户信息分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerInfoVo> queryPageList(CustomerInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerInfo> lqw = buildQueryWrapper(bo);
+        Page<CustomerInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<CustomerInfoVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty( records)){
+            Set<Long>industryIds = records.stream()
+                .map(CustomerInfoVo::getIndustryCategoryId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            List<IndustryCategoryVo> industryList = industryCategoryMapper.selectVoByIds(industryIds);
+
+            Map<Long, String> industryMap = industryList.stream()
+                .collect(Collectors.toMap(
+                    IndustryCategoryVo::getId,
+                    IndustryCategoryVo::getIndustryCategoryName,
+                    (existing, replacement) -> existing
+                ));
+
+            records.forEach(vo -> {
+                vo.setIndustryCategory(industryMap.get(vo.getIndustryCategoryId()));
+            });
+        }
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户信息列表
+     */
+    @Override
+    public List<CustomerInfoVo> queryList(CustomerInfoBo bo) {
+        LambdaQueryWrapper<CustomerInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerInfo> buildQueryWrapper(CustomerInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerInfo::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), CustomerInfo::getCustomerNo, bo.getCustomerNo());
+        lqw.eq(bo.getBelongCompanyId() != null, CustomerInfo::getBelongCompanyId, bo.getBelongCompanyId());
+        lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), CustomerInfo::getCompanyName, bo.getCompanyName());
+        lqw.like(StringUtils.isNotBlank(bo.getBusinessCustomerName()), CustomerInfo::getBusinessCustomerName, bo.getBusinessCustomerName());
+        lqw.like(StringUtils.isNotBlank(bo.getShortName()), CustomerInfo::getShortName, bo.getShortName());
+        lqw.eq(bo.getInvoiceTypeId() != null, CustomerInfo::getInvoiceTypeId, bo.getInvoiceTypeId());
+        lqw.eq(bo.getEnterpriseScaleId() != null, CustomerInfo::getEnterpriseScaleId, bo.getEnterpriseScaleId());
+        lqw.eq(bo.getCustomerTypeId() != null, CustomerInfo::getCustomerTypeId, bo.getCustomerTypeId());
+        lqw.eq(bo.getIndustryCategoryId() != null, CustomerInfo::getIndustryCategoryId, bo.getIndustryCategoryId());
+        lqw.eq(bo.getCustomerLevelId() != null, CustomerInfo::getCustomerLevelId, bo.getCustomerLevelId());
+        lqw.eq(StringUtils.isNotBlank(bo.getLandline()), CustomerInfo::getLandline, bo.getLandline());
+        lqw.eq(StringUtils.isNotBlank(bo.getFax()), CustomerInfo::getFax, bo.getFax());
+        lqw.eq(StringUtils.isNotBlank(bo.getUrl()), CustomerInfo::getUrl, bo.getUrl());
+        lqw.eq(StringUtils.isNotBlank(bo.getPostCode()), CustomerInfo::getPostCode, bo.getPostCode());
+        lqw.eq(bo.getValidityFromDate() != null, CustomerInfo::getValidityFromDate, bo.getValidityFromDate());
+        lqw.eq(bo.getValidityToDate() != null, CustomerInfo::getValidityToDate, bo.getValidityToDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getInvoiceTop()), CustomerInfo::getInvoiceTop, bo.getInvoiceTop());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), CustomerInfo::getAddress, bo.getAddress());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegProvincialNo()), CustomerInfo::getRegProvincialNo, bo.getRegProvincialNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegCityNo()), CustomerInfo::getRegCityNo, bo.getRegCityNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegCountyNo()), CustomerInfo::getRegCountyNo, bo.getRegCountyNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getProvincialCityCounty()), CustomerInfo::getProvincialCityCounty, bo.getProvincialCityCounty());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否新增成功
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertByBo(CustomerInfoBo bo) {
+        if (bo == null) {
+            return false;
+        }
+
+        boolean isNew = bo.getId() == null || bo.getId() <= 0;
+
+        // 1. 处理主表 CustomerInfo
+        CustomerInfo entity = MapstructUtils.convert(bo, CustomerInfo.class);
+        validEntityBeforeSave(entity);
+
+        boolean success;
+        if (isNew) {
+            success = baseMapper.insert(entity) > 0;
+            if (success) {
+                bo.setId(entity.getId()); // 回填ID
+            }
+        } else {
+            success = baseMapper.updateById(entity) > 0;
+        }
+
+        if (!success) {
+            return false;
+        }
+
+        Long customerId = entity.getId();
+
+        // 2. 获取各子对象
+        CustomerBusinessInfoBo businessBo = bo.getCustomerBusinessBo();
+        CustomerSalesInfoBo salesBo = bo.getCustomerSalesInfoBo();
+        List<CustomerContactBo> contactList = bo.getCustomerContactBoList();
+        List<CustomerInvoiceInfoBo> invoiceList = bo.getCustomerInvoiceInfoBoList();
+
+        // 3. 如果是更新,先删除旧的关联数据
+        if (!isNew) {
+            // 删除业务信息(一对一)
+            customerBusinessInfoMapper.deleteByCustomerId(customerId);
+            // 删除销售信息(一对一)
+            customerSalesInfoMapper.deleteByCustomerId(customerId);
+            // 删除联系人(一对多)
+            customerContactMapper.deleteByCustomerId(customerId);
+            // 删除发票信息(一对多)
+            customerInvoiceInfoMapper.deleteByCustomerId(customerId);
+        }
+
+        // 4. 插入新的关联数据(即使为空也安全处理)
+        // 业务信息
+        if (businessBo != null) {
+            CustomerBusinessInfo businessEntity = MapstructUtils.convert(businessBo, CustomerBusinessInfo.class);
+            businessEntity.setCustomerId(customerId);
+            customerBusinessInfoMapper.insert(businessEntity);
+        }
+
+        // 销售信息
+        if (salesBo != null) {
+            CustomerSalesInfo salesEntity = MapstructUtils.convert(salesBo, CustomerSalesInfo.class);
+            salesEntity.setCustomerId(customerId);
+            customerSalesInfoMapper.insert(salesEntity);
+        }
+
+        // 联系人列表
+        if (contactList != null && !contactList.isEmpty()) {
+            for (CustomerContactBo contactBo : contactList) {
+                CustomerContact contact = MapstructUtils.convert(contactBo, CustomerContact.class);
+                contact.setCustomerId(customerId);
+                customerContactMapper.insert(contact);
+            }
+        }
+
+        // 发票信息列表
+        if (invoiceList != null && !invoiceList.isEmpty()) {
+            for (CustomerInvoiceInfoBo invoiceBo : invoiceList) {
+                CustomerInvoiceInfo invoice = MapstructUtils.convert(invoiceBo, CustomerInvoiceInfo.class);
+                invoice.setCustomerId(customerId);
+                customerInvoiceInfoMapper.insert(invoice);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 修改客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否修改成功
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateByBo(CustomerInfoBo bo) {
+        if (bo == null || bo.getId() == null || bo.getId() <= 0) {
+            return false;
+        }
+
+        // 1. 更新主表
+        CustomerInfo entity = MapstructUtils.convert(bo, CustomerInfo.class);
+        validEntityBeforeSave(entity);
+        boolean mainUpdated = baseMapper.updateById(entity) > 0;
+        if (!mainUpdated) {
+            return false;
+        }
+
+        Long customerId = bo.getId();
+
+        // 2. 删除旧的关联数据
+        customerBusinessInfoMapper.deleteByCustomerId(customerId);
+        customerSalesInfoMapper.deleteByCustomerId(customerId);
+        customerContactMapper.deleteByCustomerId(customerId);
+        customerInvoiceInfoMapper.deleteByCustomerId(customerId);
+
+        // 3. 插入新的关联数据
+        saveAssociatedData(customerId, bo);
+
+        return true;
+    }
+
+    /**
+     * 保存客户的关联信息(不包含删除逻辑,仅插入)
+     */
+    private void saveAssociatedData(Long customerId, CustomerInfoBo bo) {
+        // 业务信息
+        if (bo.getCustomerBusinessBo() != null) {
+            CustomerBusinessInfo business = MapstructUtils.convert(bo.getCustomerBusinessBo(), CustomerBusinessInfo.class);
+            business.setCustomerId(customerId);
+            customerBusinessInfoMapper.insert(business);
+        }
+
+        // 销售信息
+        if (bo.getCustomerSalesInfoBo() != null) {
+            CustomerSalesInfo sales = MapstructUtils.convert(bo.getCustomerSalesInfoBo(), CustomerSalesInfo.class);
+            sales.setCustomerId(customerId);
+            customerSalesInfoMapper.insert(sales);
+        }
+
+        // 联系人列表
+        if (bo.getCustomerContactBoList() != null && !bo.getCustomerContactBoList().isEmpty()) {
+            for (CustomerContactBo contactBo : bo.getCustomerContactBoList()) {
+                CustomerContact contact = MapstructUtils.convert(contactBo, CustomerContact.class);
+                contact.setCustomerId(customerId);
+                customerContactMapper.insert(contact);
+            }
+        }
+
+        // 发票信息列表
+        if (bo.getCustomerInvoiceInfoBoList() != null && !bo.getCustomerInvoiceInfoBoList().isEmpty()) {
+            for (CustomerInvoiceInfoBo invoiceBo : bo.getCustomerInvoiceInfoBoList()) {
+                CustomerInvoiceInfo invoice = MapstructUtils.convert(invoiceBo, CustomerInvoiceInfo.class);
+                invoice.setCustomerId(customerId);
+                customerInvoiceInfoMapper.insert(invoice);
+            }
+        }
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 143 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInvoiceInfoServiceImpl.java

@@ -0,0 +1,143 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.CustomerInvoiceInfoBo;
+import org.dromara.customer.domain.vo.CustomerInvoiceInfoVo;
+import org.dromara.customer.domain.CustomerInvoiceInfo;
+import org.dromara.customer.mapper.CustomerInvoiceInfoMapper;
+import org.dromara.customer.service.ICustomerInvoiceInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客户开票信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerInvoiceInfoServiceImpl  extends ServiceImpl<CustomerInvoiceInfoMapper, CustomerInvoiceInfo> implements ICustomerInvoiceInfoService {
+
+    private final CustomerInvoiceInfoMapper baseMapper;
+
+    /**
+     * 查询客户开票信息
+     *
+     * @param id 主键
+     * @return 客户开票信息
+     */
+    @Override
+    public CustomerInvoiceInfoVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客户开票信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户开票信息分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerInvoiceInfoVo> queryPageList(CustomerInvoiceInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerInvoiceInfo> lqw = buildQueryWrapper(bo);
+        Page<CustomerInvoiceInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户开票信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户开票信息列表
+     */
+    @Override
+    public List<CustomerInvoiceInfoVo> queryList(CustomerInvoiceInfoBo bo) {
+        LambdaQueryWrapper<CustomerInvoiceInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerInvoiceInfo> buildQueryWrapper(CustomerInvoiceInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerInvoiceInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerInvoiceInfo::getId);
+        lqw.eq(bo.getCustomerId() != null, CustomerInvoiceInfo::getCustomerId, bo.getCustomerId());
+        lqw.eq(StringUtils.isNotBlank(bo.getTaxId()), CustomerInvoiceInfo::getTaxId, bo.getTaxId());
+        lqw.eq(StringUtils.isNotBlank(bo.getBankCode()), CustomerInvoiceInfo::getBankCode, bo.getBankCode());
+        lqw.eq(bo.getBankId() != null, CustomerInvoiceInfo::getBankId, bo.getBankId());
+        lqw.like(StringUtils.isNotBlank(bo.getBankName()), CustomerInvoiceInfo::getBankName, bo.getBankName());
+        lqw.eq(StringUtils.isNotBlank(bo.getBankAccount()), CustomerInvoiceInfo::getBankAccount, bo.getBankAccount());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), CustomerInvoiceInfo::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), CustomerInvoiceInfo::getAddress, bo.getAddress());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsPrimaryAccount()), CustomerInvoiceInfo::getIsPrimaryAccount, bo.getIsPrimaryAccount());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerInvoiceInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerInvoiceInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户开票信息
+     *
+     * @param bo 客户开票信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CustomerInvoiceInfoBo bo) {
+        CustomerInvoiceInfo add = MapstructUtils.convert(bo, CustomerInvoiceInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客户开票信息
+     *
+     * @param bo 客户开票信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CustomerInvoiceInfoBo bo) {
+        CustomerInvoiceInfo update = MapstructUtils.convert(bo, CustomerInvoiceInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerInvoiceInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户开票信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 149 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java

@@ -0,0 +1,149 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+import org.dromara.customer.domain.vo.CustomerSalesInfoVo;
+import org.dromara.customer.domain.CustomerSalesInfo;
+import org.dromara.customer.mapper.CustomerSalesInfoMapper;
+import org.dromara.customer.service.ICustomerSalesInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客户销售信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerSalesInfoServiceImpl  extends ServiceImpl<CustomerSalesInfoMapper, CustomerSalesInfo> implements ICustomerSalesInfoService {
+
+    private final CustomerSalesInfoMapper baseMapper;
+
+    /**
+     * 查询客户销售信息
+     *
+     * @param id 主键
+     * @return 客户销售信息
+     */
+    @Override
+    public CustomerSalesInfoVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客户销售信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户销售信息分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerSalesInfoVo> queryPageList(CustomerSalesInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerSalesInfo> lqw = buildQueryWrapper(bo);
+        Page<CustomerSalesInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户销售信息列表
+     *
+     * @param bo 查询条件
+     * @return 客户销售信息列表
+     */
+    @Override
+    public List<CustomerSalesInfoVo> queryList(CustomerSalesInfoBo bo) {
+        LambdaQueryWrapper<CustomerSalesInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerSalesInfo> buildQueryWrapper(CustomerSalesInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerSalesInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerSalesInfo::getId);
+        lqw.eq(bo.getCustomerId() != null, CustomerSalesInfo::getCustomerId, bo.getCustomerId());
+        lqw.eq(bo.getCreditAmount() != null, CustomerSalesInfo::getCreditAmount, bo.getCreditAmount());
+        lqw.eq(bo.getRemainingQuota() != null, CustomerSalesInfo::getRemainingQuota, bo.getRemainingQuota());
+        lqw.eq(bo.getTemporaryQuota() != null, CustomerSalesInfo::getTemporaryQuota, bo.getTemporaryQuota());
+        lqw.eq(StringUtils.isNotBlank(bo.getAccountPeriod()), CustomerSalesInfo::getAccountPeriod, bo.getAccountPeriod());
+        lqw.eq(bo.getBillDate() != null, CustomerSalesInfo::getBillDate, bo.getBillDate());
+        lqw.eq(bo.getBillingDay() != null, CustomerSalesInfo::getBillingDay, bo.getBillingDay());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderAudit()), CustomerSalesInfo::getOrderAudit, bo.getOrderAudit());
+        lqw.eq(StringUtils.isNotBlank(bo.getCreditManagement()), CustomerSalesInfo::getCreditManagement, bo.getCreditManagement());
+        lqw.eq(StringUtils.isNotBlank(bo.getCreditPaymentPassword()), CustomerSalesInfo::getCreditPaymentPassword, bo.getCreditPaymentPassword());
+        lqw.eq(bo.getPayDays() != null, CustomerSalesInfo::getPayDays, bo.getPayDays());
+        lqw.eq(bo.getSalesPersonId() != null, CustomerSalesInfo::getSalesPersonId, bo.getSalesPersonId());
+        lqw.eq(bo.getServiceStaffId() != null, CustomerSalesInfo::getServiceStaffId, bo.getServiceStaffId());
+        lqw.eq(bo.getBelongingDepartmentId() != null, CustomerSalesInfo::getBelongingDepartmentId, bo.getBelongingDepartmentId());
+        lqw.eq(bo.getAccountsReceivable() != null, CustomerSalesInfo::getAccountsReceivable, bo.getAccountsReceivable());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerSalesInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerSalesInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户销售信息
+     *
+     * @param bo 客户销售信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CustomerSalesInfoBo bo) {
+        CustomerSalesInfo add = MapstructUtils.convert(bo, CustomerSalesInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客户销售信息
+     *
+     * @param bo 客户销售信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CustomerSalesInfoBo bo) {
+        CustomerSalesInfo update = MapstructUtils.convert(bo, CustomerSalesInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerSalesInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户销售信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 136 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerTagServiceImpl.java

@@ -0,0 +1,136 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.CustomerTagBo;
+import org.dromara.customer.domain.vo.CustomerTagVo;
+import org.dromara.customer.domain.CustomerTag;
+import org.dromara.customer.mapper.CustomerTagMapper;
+import org.dromara.customer.service.ICustomerTagService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客户标签Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CustomerTagServiceImpl  extends ServiceImpl<CustomerTagMapper, CustomerTag> implements ICustomerTagService {
+
+    private final CustomerTagMapper baseMapper;
+
+    /**
+     * 查询客户标签
+     *
+     * @param id 主键
+     * @return 客户标签
+     */
+    @Override
+    public CustomerTagVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客户标签列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户标签分页列表
+     */
+    @Override
+    public TableDataInfo<CustomerTagVo> queryPageList(CustomerTagBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CustomerTag> lqw = buildQueryWrapper(bo);
+        Page<CustomerTagVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客户标签列表
+     *
+     * @param bo 查询条件
+     * @return 客户标签列表
+     */
+    @Override
+    public List<CustomerTagVo> queryList(CustomerTagBo bo) {
+        LambdaQueryWrapper<CustomerTag> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<CustomerTag> buildQueryWrapper(CustomerTagBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CustomerTag> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CustomerTag::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getTagName()), CustomerTag::getTagName, bo.getTagName());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductTagIds()), CustomerTag::getProductTagIds, bo.getProductTagIds());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerTag::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerTag::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增客户标签
+     *
+     * @param bo 客户标签
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CustomerTagBo bo) {
+        CustomerTag add = MapstructUtils.convert(bo, CustomerTag.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客户标签
+     *
+     * @param bo 客户标签
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CustomerTagBo bo) {
+        CustomerTag update = MapstructUtils.convert(bo, CustomerTag.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CustomerTag entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客户标签信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 135 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/EnterpriseScaleServiceImpl.java

@@ -0,0 +1,135 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.EnterpriseScaleBo;
+import org.dromara.customer.domain.vo.EnterpriseScaleVo;
+import org.dromara.customer.domain.EnterpriseScale;
+import org.dromara.customer.mapper.EnterpriseScaleMapper;
+import org.dromara.customer.service.IEnterpriseScaleService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 企业规模Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class EnterpriseScaleServiceImpl  extends ServiceImpl<EnterpriseScaleMapper, EnterpriseScale> implements IEnterpriseScaleService {
+
+    private final EnterpriseScaleMapper baseMapper;
+
+    /**
+     * 查询企业规模
+     *
+     * @param id 主键
+     * @return 企业规模
+     */
+    @Override
+    public EnterpriseScaleVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询企业规模列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 企业规模分页列表
+     */
+    @Override
+    public TableDataInfo<EnterpriseScaleVo> queryPageList(EnterpriseScaleBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EnterpriseScale> lqw = buildQueryWrapper(bo);
+        Page<EnterpriseScaleVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的企业规模列表
+     *
+     * @param bo 查询条件
+     * @return 企业规模列表
+     */
+    @Override
+    public List<EnterpriseScaleVo> queryList(EnterpriseScaleBo bo) {
+        LambdaQueryWrapper<EnterpriseScale> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<EnterpriseScale> buildQueryWrapper(EnterpriseScaleBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EnterpriseScale> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(EnterpriseScale::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getEnterpriseScaleName()), EnterpriseScale::getEnterpriseScaleName, bo.getEnterpriseScaleName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EnterpriseScale::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), EnterpriseScale::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增企业规模
+     *
+     * @param bo 企业规模
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(EnterpriseScaleBo bo) {
+        EnterpriseScale add = MapstructUtils.convert(bo, EnterpriseScale.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改企业规模
+     *
+     * @param bo 企业规模
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(EnterpriseScaleBo bo) {
+        EnterpriseScale update = MapstructUtils.convert(bo, EnterpriseScale.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(EnterpriseScale entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除企业规模信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 135 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/IndustryCategoryServiceImpl.java

@@ -0,0 +1,135 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.IndustryCategoryBo;
+import org.dromara.customer.domain.vo.IndustryCategoryVo;
+import org.dromara.customer.domain.IndustryCategory;
+import org.dromara.customer.mapper.IndustryCategoryMapper;
+import org.dromara.customer.service.IIndustryCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 所属行业Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-10
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class IndustryCategoryServiceImpl  extends ServiceImpl<IndustryCategoryMapper, IndustryCategory> implements IIndustryCategoryService {
+
+    private final IndustryCategoryMapper baseMapper;
+
+    /**
+     * 查询所属行业
+     *
+     * @param id 主键
+     * @return 所属行业
+     */
+    @Override
+    public IndustryCategoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询所属行业列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 所属行业分页列表
+     */
+    @Override
+    public TableDataInfo<IndustryCategoryVo> queryPageList(IndustryCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<IndustryCategory> lqw = buildQueryWrapper(bo);
+        Page<IndustryCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的所属行业列表
+     *
+     * @param bo 查询条件
+     * @return 所属行业列表
+     */
+    @Override
+    public List<IndustryCategoryVo> queryList(IndustryCategoryBo bo) {
+        LambdaQueryWrapper<IndustryCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<IndustryCategory> buildQueryWrapper(IndustryCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<IndustryCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(IndustryCategory::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getIndustryCategoryName()), IndustryCategory::getIndustryCategoryName, bo.getIndustryCategoryName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), IndustryCategory::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), IndustryCategory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增所属行业
+     *
+     * @param bo 所属行业
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(IndustryCategoryBo bo) {
+        IndustryCategory add = MapstructUtils.convert(bo, IndustryCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改所属行业
+     *
+     * @param bo 所属行业
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(IndustryCategoryBo bo) {
+        IndustryCategory update = MapstructUtils.convert(bo, IndustryCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(IndustryCategory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除所属行业信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 196 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/MaintainInfoServiceImpl.java

@@ -0,0 +1,196 @@
+package org.dromara.customer.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.customer.domain.MaintainInfo;
+import org.dromara.customer.domain.bo.MaintainInfoBo;
+import org.dromara.customer.domain.dto.TechnicalAdviserDto;
+import org.dromara.customer.domain.vo.CustomerInfoVo;
+import org.dromara.customer.domain.vo.MaintainInfoVo;
+import org.dromara.customer.mapper.CustomerInfoMapper;
+import org.dromara.customer.mapper.MaintainInfoMapper;
+import org.dromara.customer.service.IMaintainInfoService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 维保记录Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-12
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MaintainInfoServiceImpl  extends ServiceImpl<MaintainInfoMapper, MaintainInfo> implements IMaintainInfoService {
+
+    private final MaintainInfoMapper baseMapper;
+
+    private final CustomerInfoMapper customerInfoMapper;
+
+    /**
+     * 查询维保记录
+     *
+     * @param id 主键
+     * @return 维保记录
+     */
+    @Override
+    public MaintainInfoVo queryById(Long id){
+        MaintainInfoVo maintainInfoVo = baseMapper.selectVoById(id);
+        CustomerInfoVo customerInfoVo = customerInfoMapper.selectVoById(maintainInfoVo.getCustomerId());
+        if (null != customerInfoVo) {
+            maintainInfoVo.setCustomerName(customerInfoVo.getCompanyName());
+        }
+        return maintainInfoVo;
+    }
+
+    /**
+     * 分页查询维保记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 维保记录分页列表
+     */
+    @Override
+    public TableDataInfo<MaintainInfoVo> queryPageList(MaintainInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MaintainInfo> lqw = buildQueryWrapper(bo);
+        Page<MaintainInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<MaintainInfoVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long>customerIds = records.stream().map(MaintainInfoVo::getCustomerId).collect(Collectors.toSet());
+            List<CustomerInfoVo> industryList = customerInfoMapper.selectVoByIds(customerIds);
+
+            Map<Long, String> customerMap = industryList.stream()
+                .collect(Collectors.toMap(
+                    CustomerInfoVo::getId,
+                    CustomerInfoVo::getCompanyName,
+                    (existing, replacement) -> existing
+                ));
+            records.forEach(vo -> {
+                vo.setCustomerName(customerMap.get(vo.getCustomerId()));
+                vo.setMaintainCount(baseMapper.selectMaintainCountByCustomerId(vo.getCustomerId()));
+            });
+        }
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的维保记录列表
+     *
+     * @param bo 查询条件
+     * @return 维保记录列表
+     */
+    @Override
+    public List<MaintainInfoVo> queryList(MaintainInfoBo bo) {
+        LambdaQueryWrapper<MaintainInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<MaintainInfo> buildQueryWrapper(MaintainInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<MaintainInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(MaintainInfo::getId);
+        lqw.eq(bo.getCustomerId() != null, MaintainInfo::getCustomerId, bo.getCustomerId());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintainNo()), MaintainInfo::getMaintainNo, bo.getMaintainNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), MaintainInfo::getCustomerNo, bo.getCustomerNo());
+        lqw.like(StringUtils.isNotBlank(bo.getApplicantName()), MaintainInfo::getApplicantName, bo.getApplicantName());
+        lqw.eq(StringUtils.isNotBlank(bo.getApplicantPhone()), MaintainInfo::getApplicantPhone, bo.getApplicantPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getServiceTime()), MaintainInfo::getServiceTime, bo.getServiceTime());
+        lqw.eq(bo.getMonthMainten() != null, MaintainInfo::getMonthMainten, bo.getMonthMainten());
+        lqw.eq(bo.getRemainingMainten() != null, MaintainInfo::getRemainingMainten, bo.getRemainingMainten());
+        lqw.eq(bo.getMaintenLimit() != null, MaintainInfo::getMaintenLimit, bo.getMaintenLimit());
+        lqw.eq(StringUtils.isNotBlank(bo.getServiceContent()), MaintainInfo::getServiceContent, bo.getServiceContent());
+        lqw.eq(StringUtils.isNotBlank(bo.getOtherService()), MaintainInfo::getOtherService, bo.getOtherService());
+        lqw.eq(bo.getServiceStartTime() != null, MaintainInfo::getServiceStartTime, bo.getServiceStartTime());
+        lqw.eq(bo.getServiceEndTime() != null, MaintainInfo::getServiceEndTime, bo.getServiceEndTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintainStatus()), MaintainInfo::getMaintainStatus, bo.getMaintainStatus());
+        lqw.eq(bo.getServiceEngineerId() != null, MaintainInfo::getServiceEngineerId, bo.getServiceEngineerId());
+        lqw.eq(StringUtils.isNotBlank(bo.getServiceEngineer()), MaintainInfo::getServiceEngineer, bo.getServiceEngineer());
+        lqw.eq(StringUtils.isNotBlank(bo.getEngineerPhone()), MaintainInfo::getEngineerPhone, bo.getEngineerPhone());
+        lqw.eq(bo.getTechnicalAdviserId() != null, MaintainInfo::getTechnicalAdviserId, bo.getTechnicalAdviserId());
+        lqw.like(StringUtils.isNotBlank(bo.getTechnicalAdviser()), MaintainInfo::getTechnicalAdviser, bo.getTechnicalAdviser());
+        lqw.eq(StringUtils.isNotBlank(bo.getTechnicalAdviserPhone()), MaintainInfo::getTechnicalAdviserPhone, bo.getTechnicalAdviserPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintainFile()), MaintainInfo::getMaintainFile, bo.getMaintainFile());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintainType()), MaintainInfo::getMaintainType, bo.getMaintainType());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), MaintainInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), MaintainInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增维保记录
+     *
+     * @param bo 维保记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(MaintainInfoBo bo) {
+        MaintainInfo add = MapstructUtils.convert(bo, MaintainInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean allotTechnicalAdviser(TechnicalAdviserDto bo) {
+        MaintainInfo maintainInfo = baseMapper.selectById(bo.getId());
+        maintainInfo.setTechnicalAdviserId(bo.getTechnicalAdviserId());
+        maintainInfo.setTechnicalAdviser(bo.getTechnicalAdviser());
+        maintainInfo.setTechnicalAdviserPhone(bo.getTechnicalAdviserPhone());
+
+
+        return baseMapper.updateById(maintainInfo)>0;
+    }
+
+    /**
+     * 修改维保记录
+     *
+     * @param bo 维保记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(MaintainInfoBo bo) {
+        MaintainInfo update = MapstructUtils.convert(bo, MaintainInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(MaintainInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除维保记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 134 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/TagCategoryServiceImpl.java

@@ -0,0 +1,134 @@
+package org.dromara.customer.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.TagCategoryBo;
+import org.dromara.customer.domain.vo.TagCategoryVo;
+import org.dromara.customer.domain.TagCategory;
+import org.dromara.customer.mapper.TagCategoryMapper;
+import org.dromara.customer.service.ITagCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 标签类别信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-09
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TagCategoryServiceImpl implements ITagCategoryService {
+
+    private final TagCategoryMapper baseMapper;
+
+    /**
+     * 查询标签类别信息
+     *
+     * @param id 主键
+     * @return 标签类别信息
+     */
+    @Override
+    public TagCategoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询标签类别信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 标签类别信息分页列表
+     */
+    @Override
+    public TableDataInfo<TagCategoryVo> queryPageList(TagCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<TagCategory> lqw = buildQueryWrapper(bo);
+        Page<TagCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的标签类别信息列表
+     *
+     * @param bo 查询条件
+     * @return 标签类别信息列表
+     */
+    @Override
+    public List<TagCategoryVo> queryList(TagCategoryBo bo) {
+        LambdaQueryWrapper<TagCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<TagCategory> buildQueryWrapper(TagCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<TagCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(TagCategory::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getTagCategoryName()), TagCategory::getTagCategoryName, bo.getTagCategoryName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TagCategory::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), TagCategory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增标签类别信息
+     *
+     * @param bo 标签类别信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(TagCategoryBo bo) {
+        TagCategory add = MapstructUtils.convert(bo, TagCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改标签类别信息
+     *
+     * @param bo 标签类别信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(TagCategoryBo bo) {
+        TagCategory update = MapstructUtils.convert(bo, TagCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(TagCategory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除标签类别信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 34 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/application.yml

@@ -0,0 +1,34 @@
+# Tomcat
+server:
+  port: 9212
+
+# Spring
+spring:
+  application:
+    # ????
+    name: ruoyi-customer
+  profiles:
+    # ????
+    active: @profiles.active@
+
+--- # nacos ??
+spring:
+  cloud:
+    nacos:
+      # nacos ????
+      server-addr: @nacos.server@
+      username: @nacos.username@
+      password: @nacos.password@
+      discovery:
+        # ???
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # ???
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:datasource.yml
+      - optional:nacos:${spring.application.name}.yml

+ 28 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/logback-plus.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 日志输出格式 -->
+    <property name="console.log.pattern"
+              value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 开启 skywalking 日志收集 -->
+    <include resource="logback-skylog.xml" />
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerBusinessInfoMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerBusinessInfoMapper">
+    <!-- 删除客户业务信息(根据 customer_id) -->
+    <delete id="deleteByCustomerId" parameterType="java.lang.Long">
+        DELETE FROM customer_business_info
+        WHERE customer_id = #{customerId}
+    </delete>
+
+    <select id="selectByCustomerId" resultType="org.dromara.customer.domain.CustomerBusinessInfo">
+        SELECT * FROM customer_business_info
+        WHERE customer_id = #{customerId}
+            LIMIT 1
+    </select>
+</mapper>

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerContactMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerContactMapper">
+    <!-- 删除客户业务信息(根据 customer_id) -->
+    <delete id="deleteByCustomerId" parameterType="java.lang.Long">
+        DELETE FROM customer_contact
+        WHERE customer_id = #{customerId}
+    </delete>
+
+    <select id="selectListByCustomerId" resultType="org.dromara.customer.domain.CustomerContact">
+        SELECT * FROM customer_contact
+        WHERE customer_id = #{customerId}
+        ORDER BY id
+    </select>
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInfoMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerInfoMapper">
+
+</mapper>

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInvoiceInfoMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerInvoiceInfoMapper">
+    <!-- 删除客户业务信息(根据 customer_id) -->
+    <delete id="deleteByCustomerId" parameterType="java.lang.Long">
+        DELETE FROM customer_invoice_info
+        WHERE customer_id = #{customerId}
+    </delete>
+
+    <select id="selectListByCustomerId" resultType="org.dromara.customer.domain.CustomerInvoiceInfo">
+        SELECT * FROM customer_invoice_info
+        WHERE customer_id = #{customerId}
+        ORDER BY id
+    </select>
+</mapper>

+ 17 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerSalesInfoMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerSalesInfoMapper">
+    <!-- 删除客户业务信息(根据 customer_id) -->
+    <delete id="deleteByCustomerId" parameterType="java.lang.Long">
+        DELETE FROM customer_sales_info
+        WHERE customer_id = #{customerId}
+    </delete>
+
+    <select id="selectByCustomerId" resultType="org.dromara.customer.domain.CustomerSalesInfo">
+        SELECT * FROM customer_sales_info
+        WHERE customer_id = #{customerId}
+            LIMIT 1
+    </select>
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerTagMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.CustomerTagMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/EnterpriseScaleMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.EnterpriseScaleMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/IndustryCategoryMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.IndustryCategoryMapper">
+
+</mapper>

+ 12 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/MaintainInfoMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.MaintainInfoMapper">
+
+    <select id="selectMaintainCountByCustomerId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM maintain_info
+        WHERE customer_id = #{customerId}
+    </select>
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/TagCategoryMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.TagCategoryMapper">
+
+</mapper>