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