jinshihui 9 luni în urmă
părinte
comite
125cc0bb65
21 a modificat fișierele cu 900 adăugiri și 109 ștergeri
  1. 1 0
      .gitignore
  2. 155 0
      CLAUDE.md
  3. 324 0
      linkwe-ai/CLAUDE.md
  4. 1 0
      linkwe-chinacoal/bin/pom.xml
  5. 25 12
      linkwe-chinacoal/bin/src/main/resources/spy.properties
  6. 5 15
      linkwe-chinacoal/pom.xml
  7. 108 18
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/BdshdbDataSourceConfig.java
  8. 1 1
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/JzgdbDataSourceConfig.java
  9. 1 1
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/LtycaasdbDataSourceConfig.java
  10. 1 1
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/QywxDataSourceConfig.java
  11. 1 1
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/XxxtDataSourceConfig.java
  12. 0 23
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/service/ICustomerLeadsService.java
  13. 42 17
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/controller/CustomerLeadsController.java
  14. 13 1
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/entity/CustomerLeads.java
  15. 34 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/query/CustomerLeadsProcessRequest.java
  16. 54 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/query/CustomerLeadsQuery.java
  17. 2 2
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/mapper/CustomerLeadsMapper.java
  18. 41 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/service/ICustomerLeadsService.java
  19. 64 5
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/service/impl/CustomerLeadsServiceImpl.java
  20. 25 12
      linkwe-chinacoal/src/main/resources/spy.properties
  21. 2 0
      linkwe-common/src/main/java/com/linkwechat/common/core/controller/BaseController.java

+ 1 - 0
.gitignore

@@ -24,4 +24,5 @@ logs
 linkwe-service\bin\**
 linkwe-wecom\bin\**
 linkwe-wx-api\bin\**
+linkwe-chinacoal\bin\**
 rebel.xml

+ 155 - 0
CLAUDE.md

@@ -0,0 +1,155 @@
+# LinkWeChat 开源项目 - Claude AI 辅助开发指南
+
+## 项目概述
+
+LinkWeChat 是基于企业微信的开源 SCRM(Social Customer Relationship Management)系统,是企业私域流量管理与营销的综合解决方案。本项目采用微服务架构,基于 Spring Cloud & Alibaba 技术栈开发。
+
+## 技术栈
+
+### 后端技术栈
+- **框架**: Spring Boot 2.6.6
+- **微服务**: Spring Cloud 2021.0.1
+- **服务注册/配置**: Nacos
+- **网关**: Spring Cloud Gateway 3.0.7
+- **数据库**: MyBatis-Plus 3.4.0
+- **定时任务**: XXL-Job
+- **消息队列**: RabbitMQ
+- **HTTP 客户端**: Forest 1.5.24
+- **其他**: Druid、FastJSON、JWT、Lombok、Hutool 等
+
+### 前端技术栈
+- **框架**: Vue.js
+- **状态管理**: Vuex
+- **路由**: Vue-router
+- **UI组件**: Element-ui
+- **构建工具**: Vue-cli
+- **HTTP客户端**: Axios
+
+## 项目结构
+
+```
+linkwechat-cloud/
+├── linkwe-api/              # 系统业务接口模块
+├── linkwe-auth/             # 角色权限部门用户认证等模块
+├── linkwe-common/           # 公共组件模块
+├── linkwe-fileservice/      # 文件服务模块
+├── linkwe-framework/        # 框架配置
+├── linkwe-gateway/          # 网关服务
+├── linkwe-scheduler/        # 定时任务相关模块
+├── linkwe-service/          # 系统service层抽取,与数据库相关交互
+├── linkwe-ai/               # AI相关功能模块
+├── linkwe-chinacoal/        # 中煤定制模块
+├── linkwe-wecom/            # 企微接口实现
+├── linkwe-wx-api/           # 系统中设计微信公众号相关接口模块
+├── config/                  # 配置文件目录
+├── xxl-job-master/          # XXL-Job 任务调度中心
+└── pom.xml                  # Maven 主配置文件
+```
+
+## 开发环境要求
+
+- JDK 1.8+
+- Maven 3.5+
+- MySQL 5.7+
+- Redis 3.0+
+- RabbitMQ 3.8+
+- Node.js 12+
+
+## 核心业务模块
+
+1. **运营中心**: 客户、客群、会话等全功能数据报表
+2. **引流获客**: 活码、群活码、公海、客服等多渠道引流
+3. **销售中心**: 承接引流获客模块客户线索,高效协作跟进
+4. **客户中心**: 助力企业搭建私域流量池,高效运营客户
+5. **客群中心**: 客群运营场景全覆盖
+6. **客情维系**: 企业客户运营精细化,朋友圈、红包工具提高客户活跃度
+7. **内容中心**: 搭建企业自有内容库,多类型素材一键调用
+8. **全能营销**: 提供多类型、多场景客户营销工具
+9. **商城中心**: 自有小程序商城,快捷搭建企业转化链路
+10. **企业风控**: 会话合规存档,敏感内容全局风控
+11. **企业管理**: 组织架构、自建应用全融合,实现"一个后台"
+
+## 开发指南
+
+### 本地开发环境搭建
+
+1. 克隆项目到本地
+2. 安装依赖:`mvn clean install`
+3. 配置数据库连接信息
+4. 启动 Nacos 服务注册中心
+5. 启动 Redis、RabbitMQ 等中间件
+6. 按顺序启动各个微服务模块
+
+### 代码规范
+
+- 遵循阿里巴巴 Java 开发手册
+- 使用 Lombok 简化代码
+- 实体类使用 MyBatis-Plus 注解
+- Controller 使用 RESTful 风格
+- 统一异常处理和返回格式
+
+### API 接口规范
+
+- 统一使用 `/api` 前缀
+- 使用 RESTful 风格设计接口
+- 统一返回格式:`{ code: 200, msg: "success", data: {} }`
+- 接口文档使用 Swagger 生成
+
+## 部署指南
+
+### Docker 部署
+
+项目提供 Docker Compose 配置文件,可一键部署所有服务:
+
+```bash
+docker-compose up -d
+```
+
+### 传统部署
+
+1. 打包项目:`mvn clean package`
+2. 上传 jar 包到服务器
+3. 启动各微服务:`java -jar xxx.jar`
+
+## 常见问题
+
+### Q: 如何配置企业微信相关参数?
+
+A: 在系统管理-企业配置中填写企业微信的 CorpID、Secret 等参数。
+
+### Q: 如何添加新的微服务模块?
+
+A: 1. 在主 pom.xml 中添加模块;2. 创建新的模块目录结构;3. 配置 application.yml;4. 在 Nacos 中注册服务。
+
+### Q: 如何扩展企微 API?
+
+A: 在 `linkwe-wecom` 模块中添加新的 API 接口实现。
+
+## 贡献指南
+
+欢迎提交 Pull Request 或 Issue,请确保:
+
+1. 代码风格统一
+2. 添加必要的注释
+3. 编写单元测试
+4. 更新相关文档
+
+## 许可证
+
+本项目遵循 GPL-3.0 开源协议。
+
+## 联系方式
+
+- 官网:http://www.linkwechat.net/
+- 官方论坛:http://community.linkwechat.net/
+- 在线演示:http://demo.linkwechat.net/
+
+## 相关链接
+
+- 企业微信开放文档:https://open.work.weixin.qq.com/api/doc
+- 前端项目:https://gitee.com/LinkWeChat/link-we-chat-front
+- 帮助手册:https://www.yuque.com/linkwechat/help
+
+---
+
+注意:本项目为企业微信 SCRM 系统,开发前请务必熟悉企业微信官方开发文档和相关 API。

+ 324 - 0
linkwe-ai/CLAUDE.md

@@ -0,0 +1,324 @@
+# LinkWeChat AI 模块开发文档
+
+## 模块概述
+
+linkwe-ai 是 LinkWeChat 项目中的 AI 助手功能模块,虽然项目描述中标注"该项目没有用到",但实际上该模块实现了基于阿里云大模型的 AI 对话功能。该模块集成了阿里云通义千问(DashScope)服务,提供了单次对话、多轮对话和流式对话等 AI 交互能力。
+
+## 技术架构
+
+### 核心技术栈
+- **Spring Boot 2.6.6**: 基础框架
+- **Spring Cloud**: 微服务架构支持
+- **MyBatis-Plus**: 数据访问层框架
+- **Druid**: 数据库连接池
+- **Redis**: 缓存服务
+- **Nacos**: 服务注册与配置中心
+- **WebFlux**: 响应式编程支持(用于流式响应)
+- **Apache Commons Net**: FTP 客户端支持
+
+### AI 服务集成
+- **阿里云 DashScope SDK** (版本 2.18.2): 通义千问大模型服务
+- **支持的模型**:
+  - deepseek-r1: DeepSeek 推理模型
+  - qwen-plus: 通义千问增强版
+  - qwq-32b: 通义千问 32B 参数模型
+
+## 项目结构
+
+```
+linkwe-ai/
+├── src/main/java/com/linkwechat/coal/
+│   ├── LinkweAiApplication.java         # 应用程序入口
+│   ├── config/
+│   │   └── Constant.java                # 常量配置类
+│   ├── datasource/
+│   │   ├── AiDataSourceConfig.java      # AI 数据源配置
+│   │   └── QwDataSourceConfig.java      # 企微数据源配置
+│   ├── exception/
+│   │   └── SystemHandlerException.java  # 系统异常处理
+│   ├── filter/
+│   │   └── HttpServletRequestWrapperFilter.java # 请求过滤器
+│   └── modules/
+│       ├── ai/
+│       │   ├── controller/
+│       │   │   ├── AliAiController.java  # 阿里云 AI 控制器
+│       │   │   ├── FileController.java   # 文件处理控制器
+│       │   │   └── ZmAiController.java   # 智能AI控制器
+│       │   ├── domain/dto/
+│       │   │   ├── AliAiTextDto.java     # AI 文本交互 DTO
+│       │   │   └── RequestIdDto.java     # 请求 ID DTO
+│       │   ├── mapper/
+│       │   │   ├── SysUserMapper1.java   # 用户 Mapper1
+│       │   │   └── SysUserMapper2.java   # 用户 Mapper2
+│       │   ├── service/impl/
+│       │   │   └── FtpStorageService.java # FTP 存储服务
+│       │   └── utils/
+│       │       ├── AliAiUtils.java       # 阿里 AI 工具类
+│       │       ├── FileUtils.java        # 文件工具类
+│       │       ├── SSEHelper.java        # SSE (Server-Sent Events) 辅助类
+│       │       └── WordUtils.java        # Word 文档处理工具
+│       └── qw/mapper/
+│           └── SysUserMapper1.java      # 企微用户 Mapper
+├── src/main/resources/
+│   ├── application.properties            # 应用配置
+│   └── spy.properties                   # P6Spy 监控配置
+├── bin/                                 # 构建输出目录
+├── pom.xml                              # Maven 配置文件
+└── CLAUDE.md                           # 本文档
+```
+
+## 核心功能
+
+### 1. AI 对话功能
+
+#### AliAiController 提供的接口:
+
+1. **单次对话** (`/aliAi/single`)
+   - 支持文本输入和 Word 文档内容解析
+   - 返回完整的 AI 响应结果
+   - 包含思考过程和最终回答
+
+2. **多轮对话** (`/aliAi/multiwheel`)
+   - 支持上下文连续对话
+   - 通过 Redis 缓存会话历史
+   - 维护对话的连贯性
+
+3. **流式对话** (`/aliAi/stream`)
+   - 基于 Server-Sent Events (SSE) 的实时流式响应
+   - 使用 WebFlux 的 Flowable 实现响应式流
+   - 支持大文本的流式输出
+
+#### ZmAiController 提供的接口:
+
+1. **智能聊天** (`/zmAi/chat`)
+   - 支持阿里云和本地模型切换
+   - 支持跨域请求
+   - 使用 SSE 实现实时响应
+
+### 2. 文件处理功能
+
+1. **Word 文档解析**
+   - 使用 Apache POI 解析 Word 文档
+   - 提取文档内容作为 AI 对话上下文
+   - 支持控制字符转义
+
+2. **FTP 文件存储**
+   - 支持文件上传到 FTP 服务器
+   - 生成唯一文件标识
+   - 支持文件的存储和检索
+
+### 3. 多数据源配置
+
+模块配置了两个数据源:
+- **AI 数据源**: 用于 AI 相关业务数据
+- **企微数据源**: 用于企业微信相关业务数据
+
+## 配置说明
+
+### 应用配置 (application.properties)
+
+```properties
+# 应用名称
+spring.application.name=linkwe-ai
+
+# FTP 服务器配置
+ftp.server=ftp.example.com
+ftp.port=21
+ftp.username=your_username
+ftp.password=your_password
+ftp.base-dir=/path/to/base/directory
+```
+
+### 常量配置 (Constant.java)
+
+```java
+public class Constant {
+    // 阿里云 API Key (注意:生产环境应从配置中心或环境变量获取)
+    public static String KEY = "sk-1f095e5103dd4567a9afec6b17ec0187";
+
+    // 支持的模型
+    public static String DEEPSEEK_R1 = "deepseek-r1";
+    public static String QWEN_PLUS = "qwen-plus";
+    public static String QWQ_32B = "qwq-32b";
+
+    // 文件上传路径
+    public static final String FILE_UPLOAD_PATH = "path/to/upload/directory";
+}
+```
+
+## API 接口文档
+
+### 1. 阿里云 AI 接口
+
+#### 单次对话
+- **URL**: `/aliAi/single`
+- **Method**: POST
+- **Request Body**:
+```json
+{
+  "content": "用户输入的问题",
+  "filePath": "Word文档路径(可选)"
+}
+```
+- **Response**:
+```json
+{
+  "code": 200,
+  "msg": "success",
+  "data": {
+    "output": {
+      "choices": [{
+        "message": {
+          "reasoning_content": "AI的思考过程",
+          "content": "AI的最终回答"
+        }
+      }]
+    }
+  }
+}
+```
+
+#### 多轮对话
+- **URL**: `/aliAi/multiwheel`
+- **Method**: POST
+- **Request Body**: 同单次对话
+- **Features**: 支持会话上下文管理
+
+#### 流式对话
+- **URL**: `/aliAi/stream`
+- **Method**: POST
+- **Content-Type**: `text/event-stream`
+- **Response**: 流式返回 GenerationResult
+
+### 2. 智能聊天接口
+
+#### 聊天对话
+- **URL**: `/zmAi/chat`
+- **Method**: POST
+- **CORS**: 支持跨域
+- **Request Body**:
+```json
+{
+  "content": "聊天内容",
+  "filePath": "文件路径(可选)"
+}
+```
+- **Response**: SseEmitter 对象,支持流式输出
+
+## 开发指南
+
+### 环境要求
+
+1. **JDK 1.8+**
+2. **Maven 3.5+**
+3. **Redis 3.0+**(用于会话缓存)
+4. **MySQL 5.7+**
+5. **FTP 服务器**(文件存储)
+
+### 本地开发
+
+1. **配置修改**
+   - 修改 `Constant.java` 中的 API Key
+   - 配置 `application.properties` 中的 FTP 连接信息
+   - 确保数据库和 Redis 连接正常
+
+2. **启动步骤**
+   ```bash
+   # 构建项目
+   mvn clean install
+
+   # 启动应用
+   mvn spring-boot:run
+   ```
+
+### 代码规范
+
+1. **API Key 安全**
+   - 生产环境应使用环境变量或配置中心存储 API Key
+   - 避免将密钥硬编码在代码中
+
+2. **异常处理**
+   - 统一使用 `SystemException` 处理业务异常
+   - 记录详细的错误日志
+
+3. **资源清理**
+   - 及时关闭 FTP 连接
+   - 管理 SSE 连接的生命周期
+
+## 扩展开发
+
+### 添加新的 AI 模型
+
+1. 在 `Constant.java` 中添加模型常量
+2. 在 `AliAiUtils.java` 中实现调用方法
+3. 在 Controller 中添加对应的接口
+
+### 自定义文件处理
+
+1. 扩展 `WordUtils.java` 支持更多文件格式
+2. 在 `FileController.java` 中添加新的处理接口
+3. 配置相应的文件解析器
+
+### 集成其他 AI 服务
+
+1. 添加新的 SDK 依赖到 `pom.xml`
+2. 创建新的工具类封装 API 调用
+3. 实现 Controller 层的接口
+
+## 部署说明
+
+### Docker 部署
+
+```dockerfile
+FROM openjdk:8-jre-alpine
+COPY target/lw-ai.jar app.jar
+EXPOSE 8080
+ENTRYPOINT ["java", "-jar", "/app.jar"]
+```
+
+### 配置管理
+
+- 使用 Nacos 配置中心管理动态配置
+- API Key、数据库连接等信息应外部化配置
+- 支持多环境配置切换(dev/test/prod)
+
+## 注意事项
+
+1. **API Key 安全**
+   - 当前代码中的 API Key 仅用于测试
+   - 生产环境必须使用安全的配置管理方案
+
+2. **性能优化**
+   - 大文件处理建议使用异步方式
+   - 合理设置 Redis 过期时间
+   - FTP 连接池复用
+
+3. **监控告警**
+   - 添加 API 调用量监控
+   - 设置异常响应时间告警
+   - 监控文件存储使用情况
+
+## 常见问题
+
+### Q: 如何切换不同的 AI 模型?
+A: 在调用 `AliAiUtils` 的方法时传入不同的 model 参数,支持的模型见 `Constant.java`。
+
+### Q: Word 文档解析失败怎么办?
+A: 检查文档格式是否为 `.docx`,确保文档没有损坏,查看 `WordUtils.java` 的错误日志。
+
+### Q: 流式响应中断如何处理?
+A: 检查网络连接,查看 SSE 连接状态,参考 `SSEHelper.java` 的错误处理逻辑。
+
+### Q: 如何扩展支持本地大模型?
+A: 参考 `ZmAiController.java` 中的 LOCAL 模式实现,添加新的配置和调用逻辑。
+
+## 版本历史
+
+- **v3.1.0**: 初始版本,集成阿里云 DashScope 服务
+- 支持单次、多轮、流式对话
+- 集成 Word 文档解析
+- 支持 FTP 文件存储
+
+## 联系方式
+
+如有问题或建议,请联系项目维护团队或提交 Issue。

+ 1 - 0
linkwe-chinacoal/bin/pom.xml

@@ -75,6 +75,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+
         <!--mybatis-plus多数据源配置-->
         <dependency>
             <groupId>com.baomidou</groupId>

+ 25 - 12
linkwe-chinacoal/bin/src/main/resources/spy.properties

@@ -1,24 +1,37 @@
-#3.2.1\u4EE5\u4E0A\u4F7F\u7528
+# P6Spy 数据库监控配置文件
+
+# 模块配置 - 3.2.1以上版本使用
 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
-#3.2.1\u4EE5\u4E0B\u4F7F\u7528\u6216\u8005\u4E0D\u914D\u7F6E
+
+# 模块配置 - 3.2.1以下版本使用或者不配置
 #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
-# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
+
+# 自定义日志打印格式
 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
-#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0
+
+# 日志输出方式 - 输出到控制台
 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
-# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql
+
+# 日志输出方式 - 使用日志系统记录 sql(可选)
 #appender=com.p6spy.engine.spy.appender.Slf4JLogger
-# \u8BBE\u7F6E p6spy driver \u4EE3\u7406
+
+# 设置 p6spy driver 代理
 deregisterdrivers=true
-# \u53D6\u6D88JDBC URL\u524D\u7F00
+
+# 取消JDBC URL前缀
 useprefix=true
-# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset.
+
+# 配置记录 Log 例外,可去掉的结果集有:error,info,batch,debug,statement,commit,rollback,result,resultset
 excludecategories=info,debug,result,commit,resultset
-# \u65E5\u671F\u683C\u5F0F
+
+# 日期格式配置
 dateformat=yyyy-MM-dd HH:mm:ss
-# \u5B9E\u9645\u9A71\u52A8\u53EF\u591A\u4E2A
+
+# 实际驱动列表(可配置多个)
 #driverlist=oracle.jdbc.driver.OracleDriver
-# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
+
+# 是否开启慢SQL记录
 outagedetection=true
-# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2
+
+# 慢SQL记录标准(单位:秒)
 outagedetectioninterval=2

+ 5 - 15
linkwe-chinacoal/pom.xml

@@ -50,31 +50,25 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.12</version>
         </dependency>
-        <!-- 阿里JSON解析器 -->
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>fastjson</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <!--    oracle    -->
+
         <!--    mysql    -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
 
-        <dependency>
+        <!--<dependency>
             <groupId>p6spy</groupId>
             <artifactId>p6spy</artifactId>
-        </dependency>
+        </dependency>-->
 
         <!-- redis 缓存操作 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+
         <!--mybatis-plus多数据源配置-->
         <dependency>
             <groupId>com.baomidou</groupId>
@@ -106,7 +100,6 @@
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
-
         <!-- SpringCloud Alibaba Nacos Config -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
@@ -124,6 +117,7 @@
             <groupId>com.linkwechat</groupId>
             <artifactId>linkwe-service</artifactId>
         </dependency>
+
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
@@ -131,7 +125,6 @@
         </dependency>
     </dependencies>
 
-
     <build>
         <finalName>lw-chinacoal</finalName>
         <plugins>
@@ -147,9 +140,6 @@
                     </execution>
                 </executions>
             </plugin>
-
         </plugins>
     </build>
-
-
 </project>

+ 108 - 18
linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/BdshdbDataSourceConfig.java

@@ -14,58 +14,148 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import javax.sql.DataSource;
 
 /**
- * 从数据源配置
+ * Bdshdb 数据源配置类
+ *
+ * 该配置类用于配置项目中第二个数据源(bdshdb数据库),实现多数据源支持。
+ * 主要用于中煤集团定制化业务模块的数据访问。
+ *
+ * 功能特性:
+ * 1. 使用 Druid 连接池管理数据库连接
+ * 2. 集成 MyBatis-Plus 框架,提供分页、性能优化等功能
+ * 3. 支持驼峰命名转换和SQL日志输出
+ * 4. 独立的事务管理机制
+ * 5. 扫描指定包路径下的Mapper接口
+ *
+ * 使用说明:
+ * - 配置文件中需要以 spring.datasource.bdshdb 为前缀配置数据库连接信息
+ * - Mapper接口需放在 com.linkwechat.coal.modules.bdshdb.*.mapper 包下
+ * - XML映射文件需放在 mapper/modules/bdshdb 目录下
+ *
+ * @author LinkWeChat
+ * @since 1.0.0
  */
 @Configuration
-@MapperScan(basePackages = {"com.linkwechat.coal.modules.bdshdb.*.mapper"}, sqlSessionFactoryRef = "bdshdbSqlSessionFactory")
+@EnableTransactionManagement  // 启用事务管理
+@MapperScan(
+    basePackages = {"com.linkwechat.coal.modules.bdshdb.*.mapper"},
+    sqlSessionFactoryRef = "bdshdbSqlSessionFactory"
+)
 public class BdshdbDataSourceConfig {
 
+    /**
+     * 配置 Bdshdb 数据源
+     *
+     * 使用 Druid 连接池创建数据源,通过 @ConfigurationProperties 注解
+     * 自动绑定 application.yml 中的 spring.datasource.bdshdb 配置项。
+     *
+     * 配置示例:
+     * spring:
+     *   datasource:
+     *     bdshdb:
+     *       url: jdbc:mysql://localhost:3306/bdshdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+     *       username: root
+     *       password: password
+     *       driver-class-name: com.mysql.cj.jdbc.Driver
+     *
+     * @return 返回配置好的 Druid 数据源实例
+     */
     @Bean(name = "bdshdbDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.bdshdb")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.bdshdb")
     public DataSource bdshdbDataSource() {
         return DruidDataSourceBuilder.create().build();
     }
 
+  /**
+     * 配置 MyBatis-Plus 的 SqlSessionFactory
+     *
+     * 创建 MyBatis 的核心工厂类,配置 MyBatis-Plus 的相关功能,
+     * 包括分页插件、驼峰命名转换、SQL 日志输出等。
+     *
+     * @param datasource 注入名为 bdshdbDataSource 的数据源
+     * @return 配置好的 SqlSessionFactory 实例
+     * @throws Exception 配置过程中可能抛出的异常
+     */
     @Bean(name = "bdshdbSqlSessionFactory")
-    public SqlSessionFactory bdshdbSqlSessionFactory(@Qualifier("bdshdbDataSource") DataSource datasource)
-            throws Exception {
+    public SqlSessionFactory bdshdbSqlSessionFactory(
+            @Qualifier("bdshdbDataSource") DataSource datasource
+    ) throws Exception {
         MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
-        //configuration配置bean
+
+        // 配置 MyBatis 核心参数
         MybatisConfiguration configuration = new MybatisConfiguration();
-        configuration.setMapUnderscoreToCamelCase(true);
-        configuration.setCacheEnabled(false);
-        // 配置打印sql语句s
-        configuration.setLogImpl(StdOutImpl.class);
-        // 添加自定义SQL注入
+        configuration.setMapUnderscoreToCamelCase(true);  // 开启驼峰命名转换(user_name -> userName)
+        configuration.setCacheEnabled(false);             // 关闭二级缓存,避免多数据源缓存混乱
+        configuration.setLogImpl(StdOutImpl.class);       // 配置 SQL 输出到控制台,方便开发调试
         bean.setConfiguration(configuration);
 
-        //插件对象
+        // 配置 MyBatis-Plus 插件
         MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
-
-        //分页插件
+        // 添加分页插件,自动实现物理分页
         mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+
+        // 设置数据源
         bean.setDataSource(datasource);
-        // 设置mybatis的xml所在位置
-        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/modules/bdshdb/*/*.xml"));
+
+        // 设置 Mapper XML 文件位置
+        // 扫描 classpath:mapper/modules/bdshdb 目录下所有子目录的 XML 文件
+        bean.setMapperLocations(
+            new PathMatchingResourcePatternResolver()
+                .getResources("classpath:mapper/modules/bdshdb/*/*.xml")
+        );
+
+        // 设置插件
         bean.setPlugins(mybatisPlusInterceptor);
+
         return bean.getObject();
     }
 
+    /**
+     * 配置 SqlSessionTemplate
+     *
+     * SqlSessionTemplate 是 MyBatis-Spring 的核心类,提供了线程安全的 SqlSession 实现。
+     * 它确保每个线程都能获得独立的 SqlSession 实例,避免了并发问题。
+     *
+     * 使用场景:
+     * - 在 Service 层中注入使用
+     * - 替代原生的 MyBatis SqlSession,实现线程安全
+     *
+     * @param sessionFactory 注入名为 bdshdbSqlSessionFactory 的 SqlSessionFactory
+     * @return 配置好的 SqlSessionTemplate 实例
+     */
     @Bean("bdshdbSqlSessionTemplate")
     public SqlSessionTemplate bdshdbSqlSessionTemplate(
-            @Qualifier("bdshdbSqlSessionFactory") SqlSessionFactory sessionFactory) {
+            @Qualifier("bdshdbSqlSessionFactory") SqlSessionFactory sessionFactory
+    ) {
         return new SqlSessionTemplate(sessionFactory);
     }
 
+    /**
+     * 配置事务管理器
+     *
+     * 为 Bdshdb 数据源配置独立的事务管理器,确保该数据源的数据库操作
+     * 能够正确地进行事务管理(提交、回滚等)。
+     *
+     * 注意事项:
+     * - 在使用 @Transactional 注解时,需要指定事务管理器:
+     *   @Transactional("bdshdbTransactionManager")
+     * - 每个数据源都需要独立的事务管理器,避免事务混乱
+     *
+     * @param dataSource 注入名为 bdshdbDataSource 的数据源
+     * @return 配置好的事务管理器实例
+     */
     @Bean("bdshdbTransactionManager")
-    public PlatformTransactionManager bdshdbTransactionManager(@Qualifier("bdshdbDataSource") DataSource dataSource) {
+    public PlatformTransactionManager bdshdbTransactionManager(
+            @Qualifier("bdshdbDataSource") DataSource dataSource
+    ) {
         return new DataSourceTransactionManager(dataSource);
     }
 

+ 1 - 1
linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/JzgdbDataSourceConfig.java

@@ -28,7 +28,7 @@ import javax.sql.DataSource;
 public class JzgdbDataSourceConfig {
 
     @Bean(name = "jzgdbDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.jzgdb")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.jzgdb")
     public DataSource jzgdbDataSource() {
         return DruidDataSourceBuilder.create().build();
     }

+ 1 - 1
linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/LtycaasdbDataSourceConfig.java

@@ -29,7 +29,7 @@ public class LtycaasdbDataSourceConfig {
 
 
     @Bean(name = "ltycaasdbDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.ltycaasdb")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.ltycaasdb")
     public DataSource ltycaasdbDataSource() {
         return DruidDataSourceBuilder.create().build();
     }

+ 1 - 1
linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/QywxDataSourceConfig.java

@@ -33,7 +33,7 @@ public class QywxDataSourceConfig {
 
 
     @Bean(name = "qywxDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.qywx")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.qywx")
     public DataSource qywxDataSource() {
         return DruidDataSourceBuilder.create().build();
     }

+ 1 - 1
linkwe-chinacoal/src/main/java/com/linkwechat/coal/datasource/XxxtDataSourceConfig.java

@@ -37,7 +37,7 @@ public class XxxtDataSourceConfig {
     public static ThreadLocal<String> myTableName = new ThreadLocal<>();
 
     @Bean(name = "xxxtDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.xxxt")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.xxxt")
     @Primary
     public DataSource xxxtDataSource() {
         return DruidDataSourceBuilder.create().build();

+ 0 - 23
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/service/ICustomerLeadsService.java

@@ -1,23 +0,0 @@
-package com.linkwechat.coal.modules.bdshdb.customer.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.CustomerLeads;
-
-/**
- * 客户线索服务接口
- *
- * @author linkwechat
- * @since 2025-12-04
- */
-public interface ICustomerLeadsService extends IService<CustomerLeads> {
-
-    /**
-     * 保存客户线索数据
-     * 根据手机号先查询we_user表,如果不存在则查询local_app_user表
-     * 将查询结果保存到customer_leads表
-     *
-     * @param phone 手机号码
-     * @return boolean 保存结果
-     */
-    boolean saveCustomerLeads(String phone);
-}

+ 42 - 17
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/controller/CustomerLeadsController.java → linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/controller/CustomerLeadsController.java

@@ -1,5 +1,6 @@
-package com.linkwechat.coal.modules.bdshdb.customer.controller;
-import com.linkwechat.coal.modules.bdshdb.customer.service.ICustomerLeadsService;
+package com.linkwechat.coal.modules.xxxt.system.controller;
+
+import com.linkwechat.coal.modules.xxxt.system.service.ICustomerLeadsService;
 import com.linkwechat.common.annotation.Log;
 import com.linkwechat.common.core.controller.BaseController;
 import com.linkwechat.common.core.domain.AjaxResult;
@@ -12,6 +13,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Map;
+import java.util.List;
+
+import com.linkwechat.common.core.page.TableDataInfo;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsQuery;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsProcessRequest;
+import com.linkwechat.coal.modules.xxxt.system.domain.entity.CustomerLeads;
 
 /**
  * 客户线索Controller
@@ -53,36 +60,54 @@ public class CustomerLeadsController extends BaseController {
                 return AjaxResult.error("客户线索保存失败");
             }
         } catch (Exception e) {
+            e.printStackTrace();
             log.error("保存客户线索异常: {}", e.getMessage(), e);
             return AjaxResult.error("保存客户线索异常:" + e.getMessage());
         }
     }
 
     /**
-     * 根据手机号保存客户线索数据(GET方式)
+     * 查询客户线索列表
      *
-     * @param phone 手机号码
-     * @return 保存结果
+     * @param query
+     * @return 客户线索列表
      */
-    @ApiOperation(value = "根据手机号保存客户线索", notes = "根据手机号保存客户线索数据(GET方式)")
-    @Log(title = "保存客户线索", businessType = BusinessType.INSERT)
-    @GetMapping("/saveByPhone")
-    public AjaxResult saveCustomerLeadsByPhone(
-            @ApiParam(value = "手机号码", required = true) @RequestParam String phone) {
+    @ApiOperation(value = "查询客户线索列表", notes = "根据条件查询客户线索列表")
+    @GetMapping("/list")
+    public TableDataInfo<CustomerLeads> list(CustomerLeadsQuery query) {
+        startPage();
+        List<CustomerLeads> list = customerLeadsService.selectCustomerLeadsList(query);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 处理客户线索
+     * @param request
+     * @return AjaxResult
+     */
+    @ApiOperation(value = "处理客户线索", notes = "处理客户线索,更新客户意向和关键信息")
+    @Log(title = "处理客户线索", businessType = BusinessType.UPDATE)
+    @PostMapping("/process")
+    public AjaxResult processCustomerLeads(@RequestBody CustomerLeadsProcessRequest request) {
         try {
-            if (phone == null || phone.trim().isEmpty()) {
-                return AjaxResult.error("手机号码不能为空");
+            if (request.getUserId() == null) {
+                return AjaxResult.error("用户ID不能为空");
+            }
+            if (request.getCustomerIntent() == null || request.getCustomerIntent().trim().isEmpty()) {
+                return AjaxResult.error("客户意向不能为空");
             }
 
-            boolean result = customerLeadsService.saveCustomerLeads(phone.trim());
+            boolean result = customerLeadsService.processCustomerLeads(request);
             if (result) {
-                return AjaxResult.success("客户线索保存成功");
+                return AjaxResult.success("客户线索处理成功");
             } else {
-                return AjaxResult.error("客户线索保存失败");
+                return AjaxResult.error("客户线索处理失败");
             }
         } catch (Exception e) {
-            log.error("保存客户线索异常: {}", e.getMessage(), e);
-            return AjaxResult.error("保存客户线索异常:" + e.getMessage());
+            e.printStackTrace();
+            log.error("处理客户线索异常: {}", e.getMessage(), e);
+            return AjaxResult.error("处理客户线索异常:" + e.getMessage());
         }
     }
 }

+ 13 - 1
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/CustomerLeads.java → linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/entity/CustomerLeads.java

@@ -1,4 +1,4 @@
-package com.linkwechat.coal.modules.bdshdb.customer.domain.entity;
+package com.linkwechat.coal.modules.xxxt.system.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -87,6 +87,18 @@ public class CustomerLeads {
     @TableField("processing_status")
     private Integer processingStatus;
 
+    /**
+     * 客户意向(1:初步了解 2:确认投保)
+     */
+    @TableField("customer_intent")
+    private String customerIntent;
+
+    /**
+     * 关键信息描述
+     */
+    @TableField("key_info_description")
+    private String keyInfoDescription;
+
     /**
      * 创建人
      */

+ 34 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/query/CustomerLeadsProcessRequest.java

@@ -0,0 +1,34 @@
+package com.linkwechat.coal.modules.xxxt.system.domain.query;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 处理客户线索请求参数
+ *
+ * @author linkwechat
+ * @since 2025-12-08
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CustomerLeadsProcessRequest {
+
+    /**
+     * 用户ID(客户线索ID)
+     */
+    private Long userId;
+
+    /**
+     * 客户意向(1:初步了解 2:确认投保)
+     */
+    private String customerIntent;
+
+    /**
+     * 关键信息描述
+     */
+    private String keyInfoDescription;
+}

+ 54 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/domain/query/CustomerLeadsQuery.java

@@ -0,0 +1,54 @@
+package com.linkwechat.coal.modules.xxxt.system.domain.query;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 客户线索查询参数
+ *
+ * @author linkwechat
+ * @since 2025-12-08
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CustomerLeadsQuery {
+
+    /**
+     * 用户ID(客户线索ID)
+     */
+    private Long userId;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 用户来源(1:晋掌柜 2:掌柜生活)
+     */
+    private Integer userSource;
+
+    /**
+     * 用户状态:1-正式用户,2-临时用户
+     */
+    private Integer userStatus;
+
+    /**
+     * 处理状态:1-已处理,2-未处理
+     */
+    private Integer processingStatus;
+
+    /**
+     * 客户意向(1:初步了解 2:确认投保)
+     */
+    private String customerIntent;
+}

+ 2 - 2
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/CustomerLeadsMapper.java → linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/mapper/CustomerLeadsMapper.java

@@ -1,7 +1,7 @@
-package com.linkwechat.coal.modules.bdshdb.customer.mapper;
+package com.linkwechat.coal.modules.xxxt.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.CustomerLeads;
+import com.linkwechat.coal.modules.xxxt.system.domain.entity.CustomerLeads;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 41 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/service/ICustomerLeadsService.java

@@ -0,0 +1,41 @@
+package com.linkwechat.coal.modules.xxxt.system.service;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.coal.modules.xxxt.system.domain.entity.CustomerLeads;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsQuery;
+import java.util.List;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsProcessRequest;
+
+/**
+ * 客户线索服务接口
+ *
+ * @author linkwechat
+ * @since 2025-12-04
+ */
+public interface ICustomerLeadsService extends IService<CustomerLeads> {
+
+    /**
+     * 保存客户线索数据
+     * 根据手机号先查询we_user表,如果不存在则查询local_app_user表
+     * 将查询结果保存到customer_leads表
+     *
+     * @param phone 手机号码
+     * @return boolean 保存结果
+     */
+    boolean saveCustomerLeads(String phone);
+
+    /**
+     * 查询客户线索列表
+     *
+     * @param query 查询参数
+     * @return List<CustomerLeads> 客户线索列表
+     */
+    List<CustomerLeads> selectCustomerLeadsList(CustomerLeadsQuery query);
+
+    /**
+     * 处理客户线索
+     *
+     * @param request 处理请求参数
+     * @return boolean 处理结果
+     */
+    boolean processCustomerLeads(CustomerLeadsProcessRequest request);
+}

+ 64 - 5
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/service/impl/CustomerLeadsServiceImpl.java → linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/xxxt/system/service/impl/CustomerLeadsServiceImpl.java

@@ -1,17 +1,21 @@
-package com.linkwechat.coal.modules.bdshdb.customer.service.impl;
+package com.linkwechat.coal.modules.xxxt.system.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.CustomerLeads;
 import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocalAppUser;
-import com.linkwechat.coal.modules.bdshdb.customer.mapper.CustomerLeadsMapper;
-import com.linkwechat.coal.modules.bdshdb.customer.service.ICustomerLeadsService;
 import com.linkwechat.coal.modules.bdshdb.customer.service.ILocalAppUserService;
+import com.linkwechat.coal.modules.xxxt.system.domain.entity.CustomerLeads;
+import com.linkwechat.coal.modules.xxxt.system.mapper.CustomerLeadsMapper;
+import com.linkwechat.coal.modules.xxxt.system.service.ICustomerLeadsService;
 import com.linkwechat.domain.WeUser;
 import com.linkwechat.service.IWeUserService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import java.util.Date;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsQuery;
+import com.linkwechat.coal.modules.xxxt.system.domain.query.CustomerLeadsProcessRequest;
+import com.linkwechat.common.utils.StringUtils;
+import java.util.List;
 /**
  * 客户线索服务实现类
  *
@@ -68,7 +72,7 @@ public class CustomerLeadsServiceImpl extends ServiceImpl<CustomerLeadsMapper, C
             CustomerLeads existingLeads = this.getOne(existWrapper);
             if (existingLeads != null) {
                 log.info("手机号 {} 的客户线索已存在", phone);
-                return true;
+                return false;
             }
 
             CustomerLeads customerLeads = CustomerLeads.builder()
@@ -127,4 +131,59 @@ public class CustomerLeadsServiceImpl extends ServiceImpl<CustomerLeadsMapper, C
             return false;
         }
     }
+
+    @Override
+    public List<CustomerLeads> selectCustomerLeadsList(CustomerLeadsQuery query) {
+        LambdaQueryWrapper<CustomerLeads> wrapper = new LambdaQueryWrapper<>();
+
+        if (query.getUserId() != null) {
+            wrapper.eq(CustomerLeads::getUserId, query.getUserId());
+        }
+        if (StringUtils.isNotEmpty(query.getUserName())) {
+            wrapper.like(CustomerLeads::getUserName, query.getUserName());
+        }
+        if (StringUtils.isNotEmpty(query.getPhone())) {
+            wrapper.eq(CustomerLeads::getPhone, query.getPhone());
+        }
+        if (query.getUserSource() != null) {
+            wrapper.eq(CustomerLeads::getUserSource, query.getUserSource());
+        }
+        if (query.getUserStatus() != null) {
+            wrapper.eq(CustomerLeads::getUserStatus, query.getUserStatus());
+        }
+        if (query.getProcessingStatus() != null) {
+            wrapper.eq(CustomerLeads::getProcessingStatus, query.getProcessingStatus());
+        }
+        wrapper.orderByDesc(CustomerLeads::getCreatedTime);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public boolean processCustomerLeads(CustomerLeadsProcessRequest request) {
+        try {
+            if (request.getUserId() == null) {
+                log.warn("处理客户线索失败:用户ID不能为空");
+                return false;
+            }
+
+            // 查询客户线索
+            CustomerLeads customerLeads = this.getById(request.getUserId());
+            if (customerLeads == null) {
+                log.warn("处理客户线索失败:未找到用户ID为 {} 的客户线索", request.getUserId());
+                return false;
+            }
+
+            // 更新处理信息
+            customerLeads.setProcessingStatus(1); // 1-已处理
+            customerLeads.setCustomerIntent(request.getCustomerIntent());
+            customerLeads.setKeyInfoDescription(request.getKeyInfoDescription());
+            customerLeads.setUpdatedBy("system");
+            customerLeads.setUpdatedTime(new Date());
+
+            return this.updateById(customerLeads);
+        } catch (Exception e) {
+            log.error("处理客户线索失败: userId={}, error={}", request.getUserId(), e.getMessage(), e);
+            return false;
+        }
+    }
 }

+ 25 - 12
linkwe-chinacoal/src/main/resources/spy.properties

@@ -1,24 +1,37 @@
-#3.2.1\u4EE5\u4E0A\u4F7F\u7528
+# P6Spy 数据库监控配置文件
+
+# 模块配置 - 3.2.1以上版本使用
 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
-#3.2.1\u4EE5\u4E0B\u4F7F\u7528\u6216\u8005\u4E0D\u914D\u7F6E
+
+# 模块配置 - 3.2.1以下版本使用或者不配置
 #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
-# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
+
+# 自定义日志打印格式
 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
-#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0
+
+# 日志输出方式 - 输出到控制台
 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
-# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql
+
+# 日志输出方式 - 使用日志系统记录 sql(可选)
 #appender=com.p6spy.engine.spy.appender.Slf4JLogger
-# \u8BBE\u7F6E p6spy driver \u4EE3\u7406
+
+# 设置 p6spy driver 代理
 deregisterdrivers=true
-# \u53D6\u6D88JDBC URL\u524D\u7F00
+
+# 取消JDBC URL前缀
 useprefix=true
-# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset.
+
+# 配置记录 Log 例外,可去掉的结果集有:error,info,batch,debug,statement,commit,rollback,result,resultset
 excludecategories=info,debug,result,commit,resultset
-# \u65E5\u671F\u683C\u5F0F
+
+# 日期格式配置
 dateformat=yyyy-MM-dd HH:mm:ss
-# \u5B9E\u9645\u9A71\u52A8\u53EF\u591A\u4E2A
+
+# 实际驱动列表(可配置多个)
 #driverlist=oracle.jdbc.driver.OracleDriver
-# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
+
+# 是否开启慢SQL记录
 outagedetection=true
-# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2
+
+# 慢SQL记录标准(单位:秒)
 outagedetectioninterval=2

+ 2 - 0
linkwe-common/src/main/java/com/linkwechat/common/core/controller/BaseController.java

@@ -99,6 +99,8 @@ public class BaseController
 
     /**
      * 响应请求分页数据
+     * @param list 分页数据列表
+     * @return 分页数据对象
      */
     @SuppressWarnings({ "rawtypes", "unchecked" })
     protected <T>TableDataInfo getDataTable(List<T> list)