From 726de53a23bd9b6b24ccc3ae6c3b1a6b24b67379 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 16 Sep 2025 16:49:19 +0800
Subject: [PATCH] feat(ai): 添加用户学习时长记录功能

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java          |    2 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java                             |    4 
 src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointPageDto.java             |    3 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java                         |    3 
 src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java             |    2 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java                |    8 +
 src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java                          |   25 +++
 src/main/java/cc/mrbird/febs/ai/controller/memberPoint/ApiMemberPointController.java     |   40 +++++
 src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java   |    2 
 src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java                         |   23 +++
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java             |    1 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java                    |   77 +++++++++++
 src/main/resources/mapper/modules/AiProductPointMapper.xml                               |    5 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java              |    6 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java                   |    2 
 src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java               |   43 ++++++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java               |   67 +++++++++
 src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java                        |   18 ++
 src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java |   25 +--
 src/main/java/cc/mrbird/febs/ai/req/memberPoint/ApiMemberPointDto.java                   |   23 +++
 20 files changed, 359 insertions(+), 20 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java b/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
new file mode 100644
index 0000000..4c90cad
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
@@ -0,0 +1,43 @@
+package cc.mrbird.febs.ai.controller.member;
+
+import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
+import cc.mrbird.febs.ai.req.memberPoint.ApiMemberPointDto;
+import cc.mrbird.febs.ai.res.member.ApiMemberPageVo;
+import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerVoV2;
+import cc.mrbird.febs.ai.service.AiMemberService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/member")
+@Api(value = "ApiMemberController", tags = "AI-用户")
+public class ApiMemberController {
+
+    private final AiMemberService aiMemberService;
+
+    @ApiOperation(value = "我的团队", notes = "我的团队")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMemberPageVo.class)
+    })
+    @PostMapping(value = "/myTeam")
+    public FebsResponse myTeam(@RequestBody @Validated ApiMemberPageDto dto) {
+
+        return aiMemberService.myTeam(dto);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberPoint/ApiMemberPointController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberPoint/ApiMemberPointController.java
new file mode 100644
index 0000000..14b28a4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberPoint/ApiMemberPointController.java
@@ -0,0 +1,40 @@
+package cc.mrbird.febs.ai.controller.memberPoint;
+
+import cc.mrbird.febs.ai.req.memberAnswer.*;
+import cc.mrbird.febs.ai.req.memberPoint.ApiMemberPointDto;
+import cc.mrbird.febs.ai.res.memberAnswer.*;
+import cc.mrbird.febs.ai.service.AiMemberAnswerService;
+import cc.mrbird.febs.ai.service.AiMemberPointService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/memberPoint")
+@Api(value = "ApiMemberPointController", tags = "AI-用户学习")
+public class ApiMemberPointController {
+
+    private final AiMemberPointService aiMemberPointService;
+
+    @ApiOperation(value = "学习时长保存", notes = "学习时长保存")
+    @PostMapping(value = "/saveTime")
+    public FebsResponse saveTime(@RequestBody @Validated ApiMemberPointDto dto) {
+
+        return aiMemberPointService.saveTime(dto);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
index 1dea19b..a0bca59 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
@@ -2,25 +2,18 @@
 
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
 import cc.mrbird.febs.ai.req.memberTalkStream.*;
-import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo;
-import cc.mrbird.febs.ai.service.ApiMemberTalkStreamService;
-import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
-import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
+import cc.mrbird.febs.ai.service.AiMemberTalkStreamService;
 import cc.mrbird.febs.common.entity.FebsResponse;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.dashscope.common.Role;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Flux;
-
-import java.util.ArrayList;
 
 /**
  * @author Administrator
@@ -33,7 +26,7 @@
 @Api(value = "ApiMemberTalkStreamController", tags = "AI-用户陪练(流式)")
 public class ApiMemberTalkStreamController {
 
-    private final ApiMemberTalkStreamService apiMemberTalkStreamService;
+    private final AiMemberTalkStreamService aiMemberTalkStreamService;
 
     @ApiOperation("生成题目")
     @ApiResponses({
@@ -41,7 +34,7 @@
     })
     @PostMapping("/start")
     public FebsResponse start(@RequestBody @Validated ApiMemberTalkStreamDto dto) {
-        return apiMemberTalkStreamService.start(dto);
+        return aiMemberTalkStreamService.start(dto);
     }
 
     @ApiOperation(value = "再练一次(重新回答)", notes = "再练一次(重新回答)")
@@ -51,7 +44,7 @@
     @PostMapping(value = "/reload")
     public FebsResponse reload(@RequestBody @Validated ApiMemberTalkReloadStreamDto dto) {
 
-        return apiMemberTalkStreamService.reload(dto);
+        return aiMemberTalkStreamService.reload(dto);
     }
 
     @ApiOperation(value = "对话记录分页查询", notes = "对话记录分页查询")
@@ -61,14 +54,14 @@
     @PostMapping(value = "/historyPage")
     public FebsResponse historyPage(@RequestBody @Validated ApiMemberTalkItemPageDto dto) {
 
-        return apiMemberTalkStreamService.historyPage(dto);
+        return aiMemberTalkStreamService.historyPage(dto);
     }
 
     @ApiOperation(value = "保存用户回答", notes = "保存答案")
     @PostMapping(value = "/saveMemberAnswer")
     public FebsResponse saveMemberAnswer(@RequestBody @Validated ApiMemberTalkMemberAnswerSavaDto dto) {
 
-        return apiMemberTalkStreamService.saveMemberAnswer(dto);
+        return aiMemberTalkStreamService.saveMemberAnswer(dto);
     }
 
     @ApiOperation("回答(流式)")
@@ -80,7 +73,7 @@
         if (StrUtil.isEmpty(dto.getId()) || StrUtil.isEmpty(dto.getReqContext())|| StrUtil.isEmpty(dto.getReqContext())){
             return Flux.just(new FebsResponse().fail().message("参数异常"));
         }
-        return apiMemberTalkStreamService.answer(dto);
+        return aiMemberTalkStreamService.answer(dto);
     }
 
     @ApiOperation("回答(流式)")
@@ -92,14 +85,14 @@
         if (StrUtil.isEmpty(dto.getId()) || StrUtil.isEmpty(dto.getReqContext())|| StrUtil.isEmpty(dto.getReqContext())){
             return Flux.just(new FebsResponse().fail().message("参数异常"));
         }
-        return apiMemberTalkStreamService.answerV2(dto);
+        return aiMemberTalkStreamService.answerV2(dto);
     }
 
     @ApiOperation(value = "保存AI回答", notes = "保存AI回答")
     @PostMapping(value = "/saveAnswer")
     public FebsResponse saveAnswer(@RequestBody @Validated ApiMemberTalkAnswerSavaDto dto) {
 
-        return apiMemberTalkStreamService.saveAnswer(dto);
+        return aiMemberTalkStreamService.saveAnswer(dto);
     }
 
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
index 0507a5c..c0d8996 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
@@ -27,7 +27,7 @@
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/api/ai/product")
-@Api(value = "ApiProductController", tags = "AI-产品")
+@Api(value = "ApiProductController", tags = "AI-产品(培训)")
 public class ApiProductController {
 
     private final AiProductService aiProductService;
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java
index f79657f..4ffe6e1 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java
@@ -30,7 +30,7 @@
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/api/ai/productPoint")
-@Api(value = "ApiProductPointController", tags = "AI-产品知识点")
+@Api(value = "ApiProductPointController", tags = "AI-知识点(学习)")
 public class ApiProductPointController {
 
     private final AiProductPointService aiProductPointService;
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java
new file mode 100644
index 0000000..2420d39
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.ai.req.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiMemberPageDto", description = "参数")
+public class ApiMemberPageDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNow;
+
+    @NotNull(message = "每页数量不能为空")
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(hidden = true)
+    private String memberUuid;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberPoint/ApiMemberPointDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberPoint/ApiMemberPointDto.java
new file mode 100644
index 0000000..9f8b063
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberPoint/ApiMemberPointDto.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.ai.req.memberPoint;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiMemberPointDto", description = "参数")
+public class ApiMemberPointDto {
+
+    @NotBlank(message = "知识点ID不能为空")
+    @ApiModelProperty(value = "知识点ID")
+    private String productPointId;
+
+    @NotNull(message = "时长不能为空")
+    @Min(value = 1, message = "时长不能小于1")
+    @ApiModelProperty(value = "时长")
+    private Integer totalTime;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointPageDto.java
index 955bb4a..6d7de38 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointPageDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointPageDto.java
@@ -24,4 +24,7 @@
     @ApiModelProperty(value = "公司ID", example = "123")
     private String companyId;
 
+    @ApiModelProperty(value = "角色ID", example = "123")
+    private String memberRoleId;
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java
new file mode 100644
index 0000000..c107eab
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiMemberPageVo", description = "参数")
+public class ApiMemberPageVo {
+
+    @ApiModelProperty(value = "用户ID")
+    private String memberUuid;
+
+    @ApiModelProperty(value = "微信名")
+    private String nickName;
+
+    @ApiModelProperty(value = "用户姓名")
+    private String memberName;
+
+    @ApiModelProperty(value = "联系次数")
+    private Integer practiceCnt;
+
+    @ApiModelProperty(value = "学习时长")
+    private Integer studyTime;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java
new file mode 100644
index 0000000..ba96321
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java
@@ -0,0 +1,18 @@
+package cc.mrbird.febs.ai.service;
+
+import cc.mrbird.febs.ai.entity.AiMemberPoint;
+import cc.mrbird.febs.ai.req.memberPoint.ApiMemberPointDto;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface AiMemberPointService extends IService<AiMemberPoint> {
+
+    AiMemberPoint getById(String id);
+
+    AiMemberPoint add(String memberUuid, String productPointId, String companyId, Integer totalTime);
+
+
+
+    FebsResponse saveTime(ApiMemberPointDto dto);
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
index 5315209..0edc3bd 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
@@ -1,9 +1,13 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMember;
+import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
+import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 public interface AiMemberService extends IService<AiMember> {
 
     AiMember getById(String id);
+
+    FebsResponse myTeam(ApiMemberPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
index e1ae7d0..736d13d 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
@@ -9,6 +9,7 @@
 import reactor.core.publisher.Flux;
 
 import java.util.Date;
+import java.util.List;
 import java.util.function.Consumer;
 
 /**
@@ -39,4 +40,6 @@
     FebsResponse historyPage(ApiMemberTalkItemPageDto dto);
 
     Flux<FebsResponse> answerStream(String question);
+
+    List<AiMemberTalk> getListByCompanyId(String companyId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
similarity index 92%
rename from src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java
rename to src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
index 0ca15c4..b48361e 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
@@ -9,7 +9,7 @@
 
 import java.util.Date;
 
-public interface ApiMemberTalkStreamService extends IService<AiMemberTalk> {
+public interface AiMemberTalkStreamService extends IService<AiMemberTalk> {
     /**
      * 生成题目(流式)
      * @param dto
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java
new file mode 100644
index 0000000..eea26fd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java
@@ -0,0 +1,67 @@
+package cc.mrbird.febs.ai.service.impl;
+
+import cc.mrbird.febs.ai.entity.AiMemberPoint;
+import cc.mrbird.febs.ai.mapper.AiMemberPointMapper;
+import cc.mrbird.febs.ai.req.memberPoint.ApiMemberPointDto;
+import cc.mrbird.febs.ai.service.AiMemberPointService;
+import cc.mrbird.febs.ai.utils.UUID;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AiMemberPointServiceImpl extends ServiceImpl<AiMemberPointMapper, AiMemberPoint> implements AiMemberPointService {
+
+    private final AiMemberPointMapper aiMemberPointMapper;
+
+    @Override
+    public AiMemberPoint getById(String id) {
+        return aiMemberPointMapper.selectById( id);
+    }
+
+    @Override
+    public AiMemberPoint add(String memberUuid, String productPointId, String companyId, Integer totalTime) {
+        AiMemberPoint aiMemberPoint = new AiMemberPoint();
+        aiMemberPoint.setId(UUID.getSimpleUUIDString());
+        aiMemberPoint.setCreatedTime(new Date());
+        aiMemberPoint.setMemberId(memberUuid);
+        aiMemberPoint.setProductPointId(productPointId);
+        aiMemberPoint.setCompanyId(companyId);
+        aiMemberPoint.setTotalTime(totalTime);
+        aiMemberPointMapper.insert(aiMemberPoint);
+        return aiMemberPoint;
+    }
+
+    @Override
+    public FebsResponse saveTime(ApiMemberPointDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+
+        String productPointId = dto.getProductPointId();
+        Integer totalTime = dto.getTotalTime();
+
+        AiMemberPoint aiMemberPoint = this.getById(productPointId);
+        if (ObjectUtil.isNull(aiMemberPoint)){
+            aiMemberPoint = this.add(memberUuid, productPointId, companyId, totalTime);
+        }else{
+            Integer oldTotalTime = aiMemberPoint.getTotalTime();
+            aiMemberPointMapper.update(
+                    null,
+                    Wrappers.lambdaUpdate(AiMemberPoint.class)
+                            .set(AiMemberPoint::getTotalTime,oldTotalTime + totalTime)
+                            .set(AiMemberPoint::getUpdatedTime,new Date())
+                            .eq(AiMemberPoint::getId,aiMemberPoint.getId())
+            );
+        }
+        return new FebsResponse().success();
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
index 4ab010e..f09837b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -1,12 +1,30 @@
 package cc.mrbird.febs.ai.service.impl;
 
 import cc.mrbird.febs.ai.entity.AiMember;
+import cc.mrbird.febs.ai.entity.AiMemberTalk;
 import cc.mrbird.febs.ai.mapper.AiMemberMapper;
+import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
+import cc.mrbird.febs.ai.res.member.ApiMemberPageVo;
 import cc.mrbird.febs.ai.service.AiMemberService;
+import cc.mrbird.febs.ai.service.AiMemberTalkService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.mapper.MallMemberMapper;
+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.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author Administrator
@@ -17,8 +35,67 @@
 public class AiMemberServiceImpl extends ServiceImpl<AiMemberMapper, AiMember> implements AiMemberService {
 
     private final AiMemberMapper aiMemberMapper;
+    private final MallMemberMapper mallMemberMapper;
+    private final AiMemberTalkService aiMemberTalkService;
     @Override
     public AiMember getById(String id) {
         return aiMemberMapper.selectById( id);
     }
+
+    @Override
+    public FebsResponse myTeam(ApiMemberPageDto dto) {
+        List<ApiMemberPageVo> objects = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+
+        // 创建分页对象,传入当前页和每页大小
+        Page<AiMember> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+
+        LambdaQueryWrapper<AiMember> queryWrapper = Wrappers.lambdaQuery(AiMember.class);
+        queryWrapper.eq(AiMember::getCompanyId, companyId);
+        Page<AiMember> pageListByQuery = aiMemberMapper.selectPage(page, queryWrapper);
+        List<AiMember> records = pageListByQuery.getRecords();
+        if (CollUtil.isNotEmpty( records)){
+            objects = buildMemberPages(companyId,records,objects);
+        }
+        return new FebsResponse().success().data(objects);
+    }
+
+    private List<ApiMemberPageVo> buildMemberPages(String companyId,List<AiMember> records,List<ApiMemberPageVo> objects) {
+        /**
+         * 获取用户信息
+         */
+        //stream流操作records,获取全部的id
+        Set<String> memberIds = records.stream().map(AiMember::getId).collect(Collectors.toSet());
+
+        List<MallMember> mallMembers = mallMemberMapper.selectList(
+                Wrappers.lambdaQuery(MallMember.class)
+                        .select(MallMember::getMemberUuid, MallMember::getName, MallMember::getRealName)
+                        .in(MallMember::getMemberUuid, memberIds)
+                        .eq(MallMember::getCompanyId, companyId)
+        );
+        //Stream流操作mallMembers,获取一个map<memberUuid,mallMember>的对象
+        Map<String, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember));
+
+        /**
+         * 获取用户联系次数
+         *  ai陪练
+         *  ai答题
+         */
+        List<AiMemberTalk> aiMemberTalks = aiMemberTalkService.getListByCompanyId(companyId);
+        //Stream流操作aiMemberTalks,获取一个map<memberUuid,aiMemberTalk>的对象
+
+
+        for (AiMember aiMember : records){
+            ApiMemberPageVo apiMemberPageVo = new ApiMemberPageVo();
+            apiMemberPageVo.setMemberUuid(aiMember.getId());
+
+            //判断mallMemberMap中是否存在该会员
+            apiMemberPageVo.setMemberName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
+            apiMemberPageVo.setNickName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
+
+            objects.add(apiMemberPageVo);
+        }
+        return objects;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
index 61c9102..5c725dd 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
@@ -293,4 +293,12 @@
         return aiService.answerStream(question);
     }
 
+    @Override
+    public List<AiMemberTalk> getListByCompanyId(String companyId) {
+        return aiMemberTalkMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberTalk.class)
+                .eq(AiMemberTalk::getCompanyId, companyId)
+        );
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
similarity index 99%
rename from src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java
rename to src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
index c25e496..00411bc 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
@@ -41,7 +41,7 @@
 @Slf4j
 @Service
 @RequiredArgsConstructor
-public class ApiMemberTalkStreamServiceImpl extends ServiceImpl<AiMemberTalkMapper, AiMemberTalk> implements ApiMemberTalkStreamService {
+public class AiMemberTalkStreamServiceImpl extends ServiceImpl<AiMemberTalkMapper, AiMemberTalk> implements AiMemberTalkStreamService {
 
     private final AiMemberTalkMapper aiMemberTalkMapper;
     private final AiProductRoleLinkService aiProductRoleLinkService;
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
index 26895c7..92b9271 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
@@ -42,6 +42,7 @@
     private final AiProductPointMapper aiProductPointMapper;
     private final AiProductPointLinkService aiProductPointLinkService;
     private final AiProductCategoryService aiProductCategoryService;
+    private final AiMemberRoleService aiMemberRoleService;
 
     @Override
     public AiProductPoint getById(String id) {
@@ -81,6 +82,11 @@
     @Override
     public FebsResponse productPointList(ApiProductPointPageDto dto) {
 
+        if(StrUtil.isEmpty(dto.getMemberRoleId())){
+            String memberRoleId = aiMemberRoleService.getDefaultMemberRoleId();
+            dto.setMemberRoleId(memberRoleId);
+        }
+
         if(StrUtil.isEmpty(dto.getCategoryId())){
             String categoryId = aiProductCategoryService.getDefaultProductCategoryId();
             dto.setCategoryId(categoryId);
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index d5c99c4..2709a51 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -749,6 +749,7 @@
                         mallMember.setCompanyId(aiMember.getCompanyId());
                     }
                     mallMember.setInviteId(inviteId);
+                    mallMember.setName("新用户"+inviteId);
                     this.baseMapper.updateById(mallMember);
                     MallMemberWallet wallet = new MallMemberWallet();
                     wallet.setBalance(BigDecimal.ZERO);
diff --git a/src/main/resources/mapper/modules/AiProductPointMapper.xml b/src/main/resources/mapper/modules/AiProductPointMapper.xml
index 48bd2cd..342afed 100644
--- a/src/main/resources/mapper/modules/AiProductPointMapper.xml
+++ b/src/main/resources/mapper/modules/AiProductPointMapper.xml
@@ -19,6 +19,11 @@
                 <if test="record.companyId != null and record.companyId != ''">
                     and a.company_id = #{record.companyId}
                 </if>
+                <if test="record.memberRoleId != null and record.memberRoleId != ''">
+                    and a.id in (
+                        select product_point_id from ai_member_role_point where role_id = #{record.memberRoleId}
+                    )
+                </if>
             </if>
         </where>
         order by a.CREATED_TIME asc

--
Gitblit v1.9.1