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