Browse Source

管理端whatsapp与zoomphone
客户管理与会话管理增添

Zhangbw 2 months ago
parent
commit
e1a59a9b49
27 changed files with 1426 additions and 9 deletions
  1. 106 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/PhoneUserController.java
  2. 115 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/WhatsAppHistoryController.java
  3. 115 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/WhatsAppUserController.java
  4. 33 9
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/api/ChatController.java
  5. 41 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/PhoneUser.java
  6. 4 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/TalkAgent.java
  7. 62 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/WhatsAppHistory.java
  8. 41 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/WhatsAppUser.java
  9. 35 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/PhoneUserBo.java
  10. 4 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/TalkAgentBo.java
  11. 57 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/WhatsAppHistoryBo.java
  12. 35 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/WhatsAppUserBo.java
  13. 45 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/PhoneUserVo.java
  14. 5 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/TalkAgentVo.java
  15. 65 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/WhatsAppHistoryVo.java
  16. 39 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/WhatsAppUserVo.java
  17. 15 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/PhoneUserMapper.java
  18. 15 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/WhatsAppHistoryMapper.java
  19. 15 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/WhatsAppUserMapper.java
  20. 48 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IPhoneUserService.java
  21. 8 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/ITalkAgentService.java
  22. 68 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IWhatsAppHistoryService.java
  23. 68 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IWhatsAppUserService.java
  24. 107 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/PhoneUserServiceImpl.java
  25. 13 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/TalkAgentServiceImpl.java
  26. 135 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/WhatsAppHistoryServiceImpl.java
  27. 132 0
      ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/WhatsAppUserServiceImpl.java

+ 106 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/PhoneUserController.java

@@ -0,0 +1,106 @@
+package org.dromara.talk.controller.admin;
+
+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.talk.domain.vo.PhoneUserVo;
+import org.dromara.talk.domain.bo.PhoneUserBo;
+import org.dromara.talk.service.IPhoneUserService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * ZoomPhone用户管理
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/talk/admin/zoomphone/user")
+public class PhoneUserController extends BaseController {
+
+    private final IPhoneUserService phoneUserService;
+
+    /**
+     * 查询ZoomPhone用户列表
+     */
+    @SaCheckPermission("zoomphone:user:list")
+    @GetMapping("/list")
+    public TableDataInfo<PhoneUserVo> list(PhoneUserBo bo, PageQuery pageQuery) {
+        return phoneUserService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出ZoomPhone用户列表
+     */
+    @SaCheckPermission("zoomphone:user:export")
+    @Log(title = "ZoomPhone用户", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PhoneUserBo bo, HttpServletResponse response) {
+        List<PhoneUserVo> list = phoneUserService.queryList(bo);
+        ExcelUtil.exportExcel(list, "ZoomPhone用户", PhoneUserVo.class, response);
+    }
+
+    /**
+     * 获取ZoomPhone用户详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("zoomphone:user:query")
+    @GetMapping("/{id}")
+    public R<PhoneUserVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(phoneUserService.queryById(id));
+    }
+
+    /**
+     * 新增ZoomPhone用户
+     */
+    @SaCheckPermission("zoomphone:user:add")
+    @Log(title = "ZoomPhone用户", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PhoneUserBo bo) {
+        return toAjax(phoneUserService.insertByBo(bo));
+    }
+
+    /**
+     * 修改ZoomPhone用户
+     */
+    @SaCheckPermission("zoomphone:user:edit")
+    @Log(title = "ZoomPhone用户", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PhoneUserBo bo) {
+        return toAjax(phoneUserService.updateByBo(bo));
+    }
+
+    /**
+     * 删除ZoomPhone用户
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("zoomphone:user:remove")
+    @Log(title = "ZoomPhone用户", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(phoneUserService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 115 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/WhatsAppHistoryController.java

@@ -0,0 +1,115 @@
+package org.dromara.talk.controller.admin;
+
+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.talk.domain.vo.WhatsAppHistoryVo;
+import org.dromara.talk.domain.bo.WhatsAppHistoryBo;
+import org.dromara.talk.service.IWhatsAppHistoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * WhatsApp历史记录
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/talk/admin/whatsapp/history")
+public class WhatsAppHistoryController extends BaseController {
+
+    private final IWhatsAppHistoryService whatsAppHistoryService;
+
+    /**
+     * 查询WhatsApp历史记录列表
+     *
+     * @param bo 查询条件对象,包含会话ID、用户账号等筛选条件
+     * @param pageQuery 分页参数,包含页码和每页数量
+     */
+    @SaCheckPermission("talk:whatsapp:history:list")
+    @GetMapping("/list")
+    public TableDataInfo<WhatsAppHistoryVo> list(WhatsAppHistoryBo bo, PageQuery pageQuery) {
+        return whatsAppHistoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出WhatsApp历史记录列表
+     *
+     * @param bo 查询条件对象,包含会话ID、用户账号等筛选条件
+     * @param response HTTP响应对象,用于输出Excel文件流
+     */
+    @SaCheckPermission("talk:whatsapp:history:export")
+    @Log(title = "WhatsApp历史记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(WhatsAppHistoryBo bo, HttpServletResponse response) {
+        List<WhatsAppHistoryVo> list = whatsAppHistoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "WhatsApp历史记录", WhatsAppHistoryVo.class, response);
+    }
+
+    /**
+     * 获取WhatsApp历史记录详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("talk:whatsapp:history:query")
+    @GetMapping("/{id}")
+    public R<WhatsAppHistoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(whatsAppHistoryService.queryById(id));
+    }
+
+    /**
+     * 新增WhatsApp历史记录
+     *
+     * @param bo 历史记录对象,包含会话ID、用户账号、对话JSON、开始时间、结束时间等信息
+     */
+    @SaCheckPermission("talk:whatsapp:history:add")
+    @Log(title = "WhatsApp历史记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody WhatsAppHistoryBo bo) {
+        return toAjax(whatsAppHistoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改WhatsApp历史记录
+     *
+     * @param bo 历史记录对象,包含记录ID及需要修改的字段(对话JSON、结束时间等)
+     */
+    @SaCheckPermission("talk:whatsapp:history:edit")
+    @Log(title = "WhatsApp历史记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WhatsAppHistoryBo bo) {
+        return toAjax(whatsAppHistoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除WhatsApp历史记录
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("talk:whatsapp:history:remove")
+    @Log(title = "WhatsApp历史记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(whatsAppHistoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 115 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/WhatsAppUserController.java

@@ -0,0 +1,115 @@
+package org.dromara.talk.controller.admin;
+
+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.talk.domain.vo.WhatsAppUserVo;
+import org.dromara.talk.domain.bo.WhatsAppUserBo;
+import org.dromara.talk.service.IWhatsAppUserService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * WhatsApp用户
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/talk/admin/whatsapp/user")
+public class WhatsAppUserController extends BaseController {
+
+    private final IWhatsAppUserService whatsAppUserService;
+
+    /**
+     * 查询WhatsApp用户列表
+     *
+     * @param bo 查询条件对象,包含用户账号等筛选条件
+     * @param pageQuery 分页参数,包含页码和每页数量
+     */
+    @SaCheckPermission("talk:whatsapp:user:list")
+    @GetMapping("/list")
+    public TableDataInfo<WhatsAppUserVo> list(WhatsAppUserBo bo, PageQuery pageQuery) {
+        return whatsAppUserService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出WhatsApp用户列表
+     *
+     * @param bo 查询条件对象,包含用户账号等筛选条件
+     * @param response HTTP响应对象,用于输出Excel文件流
+     */
+    @SaCheckPermission("talk:whatsapp:user:export")
+    @Log(title = "WhatsApp用户", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(WhatsAppUserBo bo, HttpServletResponse response) {
+        List<WhatsAppUserVo> list = whatsAppUserService.queryList(bo);
+        ExcelUtil.exportExcel(list, "WhatsApp用户", WhatsAppUserVo.class, response);
+    }
+
+    /**
+     * 获取WhatsApp用户详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("talk:whatsapp:user:query")
+    @GetMapping("/{id}")
+    public R<WhatsAppUserVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(whatsAppUserService.queryById(id));
+    }
+
+    /**
+     * 新增WhatsApp用户
+     *
+     * @param bo 用户对象,包含用户账号等信息
+     */
+    @SaCheckPermission("talk:whatsapp:user:add")
+    @Log(title = "WhatsApp用户", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody WhatsAppUserBo bo) {
+        return toAjax(whatsAppUserService.insertByBo(bo));
+    }
+
+    /**
+     * 修改WhatsApp用户
+     *
+     * @param bo 用户对象,包含用户ID及需要修改的字段(用户账号等)
+     */
+    @SaCheckPermission("talk:whatsapp:user:edit")
+    @Log(title = "WhatsApp用户", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WhatsAppUserBo bo) {
+        return toAjax(whatsAppUserService.updateByBo(bo));
+    }
+
+    /**
+     * 删除WhatsApp用户
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("talk:whatsapp:user:remove")
+    @Log(title = "WhatsApp用户", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(whatsAppUserService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 33 - 9
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/api/ChatController.java

@@ -5,7 +5,6 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.dto.DictDataDTO;
 import org.dromara.common.core.service.DictService;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.talk.domain.bo.TalkAgentBo;
 import org.dromara.talk.domain.bo.TalkSessionBo;
@@ -13,6 +12,8 @@ import org.dromara.talk.domain.vo.TalkAgentVo;
 import org.dromara.talk.service.IChatService;
 import org.dromara.talk.service.ITalkAgentService;
 import org.dromara.talk.service.ITalkSessionService;
+import org.dromara.talk.service.IPhoneUserService;
+import org.dromara.talk.domain.bo.PhoneUserBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
@@ -40,6 +41,7 @@ public class ChatController {
     private final DictService dictService;
     private final ITalkAgentService talkAgentService;
     private final ITalkSessionService talkSessionService;
+    private final IPhoneUserService phoneUserService;
 
     /**
      * 获取TTS发言人字典
@@ -53,16 +55,25 @@ public class ChatController {
     }
 
     /**
-     * 获取客服列表
-     * 返回符合条件的客服列表,用于对话前端展示
+     * 根据当前登录用户ID获取对应的客服
+     * 用于对话前端自动匹配客服
      *
-     * @param bo 查询条件(可选)
-     * @return 客服列表(分页数据)
+     * @return 客服配置,如果没有找到则返回null
      */
-    @GetMapping("/agent/list")
-    public TableDataInfo<TalkAgentVo> getAgentList(TalkAgentBo bo) {
-        List<TalkAgentVo> list = talkAgentService.queryList(bo);
-        return TableDataInfo.build(list);
+    @GetMapping("/agent/my")
+    public Map<String, Object> getMyAgent() {
+        try {
+            Long userId = LoginHelper.getUserId();
+            TalkAgentVo agent = talkAgentService.queryByUserId(userId);
+            if (agent != null) {
+                return Map.of("code", 200, "data", agent);
+            } else {
+                return Map.of("code", 404, "msg", "未找到对应的客服");
+            }
+        } catch (Exception e) {
+            log.error("获取当前用户客服失败", e);
+            return Map.of("code", 500, "msg", "获取客服失败: " + e.getMessage());
+        }
     }
 
     /**
@@ -107,6 +118,19 @@ public class ChatController {
             String tempSessionId = UUID.randomUUID().toString();
             String customerPhone = request != null ? request.get("customerPhone") : null;
 
+            // 如果有客户电话,检查并保存到 phone_user 表
+            if (customerPhone != null && !customerPhone.isEmpty()) {
+                try {
+                    PhoneUserBo phoneUserBo = new PhoneUserBo();
+                    phoneUserBo.setCustomerPhone(customerPhone);
+                    phoneUserService.insertByBo(phoneUserBo);
+                    log.info("新客户电话已保存: {}", customerPhone);
+                } catch (Exception e) {
+                    // 如果插入失败(可能是重复),忽略错误继续执行
+                    log.debug("客户电话可能已存在: {}", customerPhone);
+                }
+            }
+
             TalkSessionBo sessionBo = new TalkSessionBo();
             sessionBo.setSessionId(tempSessionId);
             sessionBo.setAgentId(id);

+ 41 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/PhoneUser.java

@@ -0,0 +1,41 @@
+package org.dromara.talk.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * ZoomPhone用户对象 phone_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("phone_user")
+public class PhoneUser extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户电话
+     */
+    private String customerPhone;
+
+    /**
+     * 删除标志(0=存在 1=删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 4 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/TalkAgent.java

@@ -83,5 +83,9 @@ public class TalkAgent extends TenantEntity {
     @TableLogic
     private String delFlag;
 
+    /**
+     * 使用者ID(关联 talk_user 表)
+     */
+    private Long userId;
 
 }

+ 62 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/WhatsAppHistory.java

@@ -0,0 +1,62 @@
+package org.dromara.talk.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * WhatsApp历史记录对象 whatsapp_history
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("whatsapp_history")
+public class WhatsAppHistory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 会话ID
+     */
+    private String sessionId;
+
+    /**
+     * 用户账号
+     */
+    private String userAccount;
+
+    /**
+     * 对话详细数据
+     */
+    private String conversationJson;
+
+    /**
+     * 会话开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 会话结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 41 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/WhatsAppUser.java

@@ -0,0 +1,41 @@
+package org.dromara.talk.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * WhatsApp用户对象 whatsapp_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("whatsapp_user")
+public class WhatsAppUser extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户账号
+     */
+    private String userAccount;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 35 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/PhoneUserBo.java

@@ -0,0 +1,35 @@
+package org.dromara.talk.domain.bo;
+
+import org.dromara.talk.domain.PhoneUser;
+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.*;
+
+/**
+ * ZoomPhone用户业务对象 phone_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PhoneUser.class, reverseConvertGenerate = false)
+public class PhoneUserBo extends BaseEntity {
+
+    /**
+     * 用户ID
+     */
+    @NotNull(message = "用户ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 用户电话
+     */
+    @NotBlank(message = "用户电话不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customerPhone;
+
+}

+ 4 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/TalkAgentBo.java

@@ -78,5 +78,9 @@ public class TalkAgentBo extends BaseEntity {
      */
     private Long ttsBgs;
 
+    /**
+     * 使用者ID
+     */
+    private Long userId;
 
 }

+ 57 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/WhatsAppHistoryBo.java

@@ -0,0 +1,57 @@
+package org.dromara.talk.domain.bo;
+
+import org.dromara.talk.domain.WhatsAppHistory;
+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;
+
+/**
+ * WhatsApp历史记录业务对象 whatsapp_history
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = WhatsAppHistory.class, reverseConvertGenerate = false)
+public class WhatsAppHistoryBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 会话ID
+     */
+    @NotBlank(message = "会话ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String sessionId;
+
+    /**
+     * 用户账号
+     */
+    @NotBlank(message = "用户账号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String userAccount;
+
+    /**
+     * 对话详细数据
+     */
+    private String conversationJson;
+
+    /**
+     * 会话开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 会话结束时间
+     */
+    private Date endTime;
+
+}

+ 35 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/WhatsAppUserBo.java

@@ -0,0 +1,35 @@
+package org.dromara.talk.domain.bo;
+
+import org.dromara.talk.domain.WhatsAppUser;
+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.*;
+
+/**
+ * WhatsApp用户业务对象 whatsapp_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = WhatsAppUser.class, reverseConvertGenerate = false)
+public class WhatsAppUserBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 用户账号
+     */
+    @NotBlank(message = "用户账号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String userAccount;
+
+}

+ 45 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/PhoneUserVo.java

@@ -0,0 +1,45 @@
+package org.dromara.talk.domain.vo;
+
+import org.dromara.talk.domain.PhoneUser;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * ZoomPhone用户视图对象 phone_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PhoneUser.class)
+public class PhoneUserVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "用户ID")
+    private Long id;
+
+    /**
+     * 用户电话
+     */
+    @ExcelProperty(value = "用户电话")
+    private String customerPhone;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+}

+ 5 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/TalkAgentVo.java

@@ -95,5 +95,10 @@ public class TalkAgentVo implements Serializable {
     @ExcelProperty(value = "TTS背景音开关 0=无背景音 1=有背景音")
     private Long ttsBgs;
 
+    /**
+     * 使用者ID
+     */
+    @ExcelProperty(value = "使用者ID")
+    private Long userId;
 
 }

+ 65 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/WhatsAppHistoryVo.java

@@ -0,0 +1,65 @@
+package org.dromara.talk.domain.vo;
+
+import java.util.Date;
+
+import org.dromara.talk.domain.WhatsAppHistory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * WhatsApp历史记录视图对象 whatsapp_history
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = WhatsAppHistory.class)
+public class WhatsAppHistoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 会话ID
+     */
+    @ExcelProperty(value = "会话ID")
+    private String sessionId;
+
+    /**
+     * 用户账号
+     */
+    @ExcelProperty(value = "用户账号")
+    private String userAccount;
+
+    /**
+     * 对话详细数据
+     */
+    @ExcelProperty(value = "对话详细数据")
+    private String conversationJson;
+
+    /**
+     * 会话开始时间
+     */
+    @ExcelProperty(value = "会话开始时间")
+    private Date startTime;
+
+    /**
+     * 会话结束时间
+     */
+    @ExcelProperty(value = "会话结束时间")
+    private Date endTime;
+
+}

+ 39 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/WhatsAppUserVo.java

@@ -0,0 +1,39 @@
+package org.dromara.talk.domain.vo;
+
+import org.dromara.talk.domain.WhatsAppUser;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * WhatsApp用户视图对象 whatsapp_user
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = WhatsAppUser.class)
+public class WhatsAppUserVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 用户账号
+     */
+    @ExcelProperty(value = "用户账号")
+    private String userAccount;
+
+}

+ 15 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/PhoneUserMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.talk.mapper;
+
+import org.dromara.talk.domain.PhoneUser;
+import org.dromara.talk.domain.vo.PhoneUserVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * ZoomPhone用户Mapper接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface PhoneUserMapper extends BaseMapperPlus<PhoneUser, PhoneUserVo> {
+
+}

+ 15 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/WhatsAppHistoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.talk.mapper;
+
+import org.dromara.talk.domain.WhatsAppHistory;
+import org.dromara.talk.domain.vo.WhatsAppHistoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * WhatsApp历史记录Mapper接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface WhatsAppHistoryMapper extends BaseMapperPlus<WhatsAppHistory, WhatsAppHistoryVo> {
+
+}

+ 15 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/mapper/WhatsAppUserMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.talk.mapper;
+
+import org.dromara.talk.domain.WhatsAppUser;
+import org.dromara.talk.domain.vo.WhatsAppUserVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * WhatsApp用户Mapper接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface WhatsAppUserMapper extends BaseMapperPlus<WhatsAppUser, WhatsAppUserVo> {
+
+}

+ 48 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IPhoneUserService.java

@@ -0,0 +1,48 @@
+package org.dromara.talk.service;
+
+import org.dromara.talk.domain.vo.PhoneUserVo;
+import org.dromara.talk.domain.bo.PhoneUserBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * ZoomPhone用户Service接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface IPhoneUserService {
+
+    /**
+     * 查询ZoomPhone用户
+     */
+    PhoneUserVo queryById(Long id);
+
+    /**
+     * 查询ZoomPhone用户列表
+     */
+    TableDataInfo<PhoneUserVo> queryPageList(PhoneUserBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询ZoomPhone用户列表
+     */
+    List<PhoneUserVo> queryList(PhoneUserBo bo);
+
+    /**
+     * 新增ZoomPhone用户
+     */
+    Boolean insertByBo(PhoneUserBo bo);
+
+    /**
+     * 修改ZoomPhone用户
+     */
+    Boolean updateByBo(PhoneUserBo bo);
+
+    /**
+     * 校验并批量删除ZoomPhone用户信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 8 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/ITalkAgentService.java

@@ -85,4 +85,12 @@ public interface ITalkAgentService {
      * @return 是否修改成功
      */
     Boolean changeAgentStatus(Long id, String newStatus);
+
+    /**
+     * 根据用户ID查询客服
+     *
+     * @param userId 用户ID
+     * @return 客服配置
+     */
+    TalkAgentVo queryByUserId(Long userId);
 }

+ 68 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IWhatsAppHistoryService.java

@@ -0,0 +1,68 @@
+package org.dromara.talk.service;
+
+import org.dromara.talk.domain.vo.WhatsAppHistoryVo;
+import org.dromara.talk.domain.bo.WhatsAppHistoryBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * WhatsApp历史记录Service接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface IWhatsAppHistoryService {
+
+    /**
+     * 查询WhatsApp历史记录
+     *
+     * @param id 主键
+     * @return WhatsApp历史记录
+     */
+    WhatsAppHistoryVo queryById(Long id);
+
+    /**
+     * 分页查询WhatsApp历史记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return WhatsApp历史记录分页列表
+     */
+    TableDataInfo<WhatsAppHistoryVo> queryPageList(WhatsAppHistoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的WhatsApp历史记录列表
+     *
+     * @param bo 查询条件
+     * @return WhatsApp历史记录列表
+     */
+    List<WhatsAppHistoryVo> queryList(WhatsAppHistoryBo bo);
+
+    /**
+     * 新增WhatsApp历史记录
+     *
+     * @param bo WhatsApp历史记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(WhatsAppHistoryBo bo);
+
+    /**
+     * 修改WhatsApp历史记录
+     *
+     * @param bo WhatsApp历史记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(WhatsAppHistoryBo bo);
+
+    /**
+     * 校验并批量删除WhatsApp历史记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IWhatsAppUserService.java

@@ -0,0 +1,68 @@
+package org.dromara.talk.service;
+
+import org.dromara.talk.domain.vo.WhatsAppUserVo;
+import org.dromara.talk.domain.bo.WhatsAppUserBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * WhatsApp用户Service接口
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+public interface IWhatsAppUserService {
+
+    /**
+     * 查询WhatsApp用户
+     *
+     * @param id 主键
+     * @return WhatsApp用户
+     */
+    WhatsAppUserVo queryById(Long id);
+
+    /**
+     * 分页查询WhatsApp用户列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return WhatsApp用户分页列表
+     */
+    TableDataInfo<WhatsAppUserVo> queryPageList(WhatsAppUserBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的WhatsApp用户列表
+     *
+     * @param bo 查询条件
+     * @return WhatsApp用户列表
+     */
+    List<WhatsAppUserVo> queryList(WhatsAppUserBo bo);
+
+    /**
+     * 新增WhatsApp用户
+     *
+     * @param bo WhatsApp用户
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(WhatsAppUserBo bo);
+
+    /**
+     * 修改WhatsApp用户
+     *
+     * @param bo WhatsApp用户
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(WhatsAppUserBo bo);
+
+    /**
+     * 校验并批量删除WhatsApp用户信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 107 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/PhoneUserServiceImpl.java

@@ -0,0 +1,107 @@
+package org.dromara.talk.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 org.springframework.stereotype.Service;
+import org.dromara.talk.domain.bo.PhoneUserBo;
+import org.dromara.talk.domain.vo.PhoneUserVo;
+import org.dromara.talk.domain.PhoneUser;
+import org.dromara.talk.mapper.PhoneUserMapper;
+import org.dromara.talk.service.IPhoneUserService;
+
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * ZoomPhone用户Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@RequiredArgsConstructor
+@Service
+public class PhoneUserServiceImpl implements IPhoneUserService {
+
+    private final PhoneUserMapper baseMapper;
+
+    /**
+     * 查询ZoomPhone用户
+     */
+    @Override
+    public PhoneUserVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 查询ZoomPhone用户列表
+     */
+    @Override
+    public TableDataInfo<PhoneUserVo> queryPageList(PhoneUserBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PhoneUser> lqw = buildQueryWrapper(bo);
+        Page<PhoneUserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询ZoomPhone用户列表
+     */
+    @Override
+    public List<PhoneUserVo> queryList(PhoneUserBo bo) {
+        LambdaQueryWrapper<PhoneUser> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<PhoneUser> buildQueryWrapper(PhoneUserBo bo) {
+        LambdaQueryWrapper<PhoneUser> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getCustomerPhone()), PhoneUser::getCustomerPhone, bo.getCustomerPhone());
+        return lqw;
+    }
+
+    /**
+     * 新增ZoomPhone用户
+     */
+    @Override
+    public Boolean insertByBo(PhoneUserBo bo) {
+        PhoneUser add = MapstructUtils.convert(bo, PhoneUser.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改ZoomPhone用户
+     */
+    @Override
+    public Boolean updateByBo(PhoneUserBo bo) {
+        PhoneUser update = MapstructUtils.convert(bo, PhoneUser.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(PhoneUser entity){
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除ZoomPhone用户
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 13 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/TalkAgentServiceImpl.java

@@ -225,4 +225,17 @@ public class TalkAgentServiceImpl implements ITalkAgentService {
         }
         return result;
     }
+
+    /**
+     * 根据用户ID查询客服
+     *
+     * @param userId 用户ID
+     * @return 客服配置
+     */
+    @Override
+    public TalkAgentVo queryByUserId(Long userId) {
+        LambdaQueryWrapper<TalkAgent> lqw = Wrappers.lambdaQuery();
+        lqw.eq(TalkAgent::getUserId, userId);
+        return baseMapper.selectVoOne(lqw);
+    }
 }

+ 135 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/WhatsAppHistoryServiceImpl.java

@@ -0,0 +1,135 @@
+package org.dromara.talk.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.talk.domain.bo.WhatsAppHistoryBo;
+import org.dromara.talk.domain.vo.WhatsAppHistoryVo;
+import org.dromara.talk.domain.WhatsAppHistory;
+import org.dromara.talk.mapper.WhatsAppHistoryMapper;
+import org.dromara.talk.service.IWhatsAppHistoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * WhatsApp历史记录Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class WhatsAppHistoryServiceImpl implements IWhatsAppHistoryService {
+
+    private final WhatsAppHistoryMapper baseMapper;
+
+    /**
+     * 查询WhatsApp历史记录
+     *
+     * @param id 主键
+     * @return WhatsApp历史记录
+     */
+    @Override
+    public WhatsAppHistoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询WhatsApp历史记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return WhatsApp历史记录分页列表
+     */
+    @Override
+    public TableDataInfo<WhatsAppHistoryVo> queryPageList(WhatsAppHistoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<WhatsAppHistory> lqw = buildQueryWrapper(bo);
+        Page<WhatsAppHistoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的WhatsApp历史记录列表
+     *
+     * @param bo 查询条件
+     * @return WhatsApp历史记录列表
+     */
+    @Override
+    public List<WhatsAppHistoryVo> queryList(WhatsAppHistoryBo bo) {
+        LambdaQueryWrapper<WhatsAppHistory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<WhatsAppHistory> buildQueryWrapper(WhatsAppHistoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<WhatsAppHistory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(WhatsAppHistory::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getSessionId()), WhatsAppHistory::getSessionId, bo.getSessionId());
+        lqw.eq(StringUtils.isNotBlank(bo.getUserAccount()), WhatsAppHistory::getUserAccount, bo.getUserAccount());
+        lqw.eq(bo.getStartTime() != null, WhatsAppHistory::getStartTime, bo.getStartTime());
+        lqw.eq(bo.getEndTime() != null, WhatsAppHistory::getEndTime, bo.getEndTime());
+        return lqw;
+    }
+
+    /**
+     * 新增WhatsApp历史记录
+     *
+     * @param bo WhatsApp历史记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(WhatsAppHistoryBo bo) {
+        WhatsAppHistory add = MapstructUtils.convert(bo, WhatsAppHistory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改WhatsApp历史记录
+     *
+     * @param bo WhatsApp历史记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(WhatsAppHistoryBo bo) {
+        WhatsAppHistory update = MapstructUtils.convert(bo, WhatsAppHistory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(WhatsAppHistory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除WhatsApp历史记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 132 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/WhatsAppUserServiceImpl.java

@@ -0,0 +1,132 @@
+package org.dromara.talk.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.talk.domain.bo.WhatsAppUserBo;
+import org.dromara.talk.domain.vo.WhatsAppUserVo;
+import org.dromara.talk.domain.WhatsAppUser;
+import org.dromara.talk.mapper.WhatsAppUserMapper;
+import org.dromara.talk.service.IWhatsAppUserService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * WhatsApp用户Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2026-02-06
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class WhatsAppUserServiceImpl implements IWhatsAppUserService {
+
+    private final WhatsAppUserMapper baseMapper;
+
+    /**
+     * 查询WhatsApp用户
+     *
+     * @param id 主键
+     * @return WhatsApp用户
+     */
+    @Override
+    public WhatsAppUserVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询WhatsApp用户列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return WhatsApp用户分页列表
+     */
+    @Override
+    public TableDataInfo<WhatsAppUserVo> queryPageList(WhatsAppUserBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<WhatsAppUser> lqw = buildQueryWrapper(bo);
+        Page<WhatsAppUserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的WhatsApp用户列表
+     *
+     * @param bo 查询条件
+     * @return WhatsApp用户列表
+     */
+    @Override
+    public List<WhatsAppUserVo> queryList(WhatsAppUserBo bo) {
+        LambdaQueryWrapper<WhatsAppUser> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<WhatsAppUser> buildQueryWrapper(WhatsAppUserBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<WhatsAppUser> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(WhatsAppUser::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getUserAccount()), WhatsAppUser::getUserAccount, bo.getUserAccount());
+        return lqw;
+    }
+
+    /**
+     * 新增WhatsApp用户
+     *
+     * @param bo WhatsApp用户
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(WhatsAppUserBo bo) {
+        WhatsAppUser add = MapstructUtils.convert(bo, WhatsAppUser.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改WhatsApp用户
+     *
+     * @param bo WhatsApp用户
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(WhatsAppUserBo bo) {
+        WhatsAppUser update = MapstructUtils.convert(bo, WhatsAppUser.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(WhatsAppUser entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除WhatsApp用户信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}