diff --git a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImContent.java b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImContent.java index 306b6555..d22a4ca7 100644 --- a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImContent.java +++ b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImContent.java @@ -31,6 +31,10 @@ public class ImContent extends CommonEntity { @ApiModelProperty("主键") private String id; + @ApiModelProperty("会话ID") + @NotBlank(message = "发送会话ID不能为空") + private String sessionId; + @ApiModelProperty("发送者") @NotBlank(message = "发送者ID不能为空") private String sendUserId; diff --git a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImSession.java b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImSession.java new file mode 100644 index 00000000..9b1bcd1e --- /dev/null +++ b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/ImSession.java @@ -0,0 +1,42 @@ +package com.cloud.kicc.system.api.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.cloud.kicc.common.data.entity.CommonEntity; + +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + *

+ * 聊天会话 + *

+ * + * @author wangxiang4 + * @since 2023-12-12 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName(value = "sys_im_session", excludeProperty = { "createById", "createByName", "createTime", "updateById", "updateByName", "updateTime", "remarks" }) +@ApiModel(value = "ImSession对象", description = "聊天会话") +public class ImSession extends CommonEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + private String id; + + @ApiModelProperty("用户主键") + private String userId; + + @ApiModelProperty("接收用户") + private String receiveUserId; + + @ApiModelProperty("接收时间") + private LocalDateTime receiveTime; + +} diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java index 3f07c7a7..f3fde9b0 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java @@ -37,7 +37,7 @@ public class ChatGptController { public R list(Page page, ImContent imContent) { if (StrUtil.isBlank(imContent.getSendUserId()) || StrUtil.isBlank(imContent.getReceiveUserId())) throw new CheckedException("当前发送者ID与接收者ID必填!"); - // 查询一个会话内的聊天记录 + // 查询当前用户的所有会话内的聊天记录 SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId()); IPage> result = iImContentService.listHistoryMessage(page, imContent); return R.ok(result.getRecords(), result.getTotal()); diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ImSessionController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ImSessionController.java new file mode 100644 index 00000000..bc8478ed --- /dev/null +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ImSessionController.java @@ -0,0 +1,98 @@ +package com.cloud.kicc.system.controller; + + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cloud.kicc.common.core.api.R; +import com.cloud.kicc.common.core.constant.AppConstants; +import com.cloud.kicc.common.core.exception.CheckedException; +import com.cloud.kicc.common.security.annotation.Inner; +import com.cloud.kicc.common.security.util.SecurityUtils; +import com.cloud.kicc.system.api.entity.ImContent; +import com.cloud.kicc.system.api.entity.ImSession; +import com.cloud.kicc.system.service.IImSessionService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Optional; + +/** + *

+ * 聊天会话 前端控制器 + *

+ * + * @author wangxiang4 + * @since 2023-12-12 + */ +@Controller +@RequiredArgsConstructor +@RequestMapping(AppConstants.APP_SYSTEM + "/imSession") +public class ImSessionController { + + private final IImSessionService iImSessionService; + + private LambdaQueryWrapper getQueryWrapper(ImSession imSession) { + return new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(imSession.getUserId()), ImSession::getUserId, imSession.getUserId()) + .eq(StrUtil.isNotBlank(imSession.getReceiveUserId()), ImSession::getReceiveUserId, imSession.getReceiveUserId()) + .orderByDesc(ImSession::getReceiveTime); + } + + @GetMapping("/list") + public R list(Page page, ImSession imSession) { + IPage result = iImSessionService.page(page, getQueryWrapper(imSession)); + return R.ok(result.getRecords(), result.getTotal()); + } + + @GetMapping("/{id:\\w+}") + public R getById(@PathVariable("id") String id) { + return R.ok(iImSessionService.getById(id)); + } + + @PostMapping("/save") + public R save(@Validated @RequestBody ImSession imSession) { + iImSessionService.save(imSession); + return R.ok(); + } + + @Inner(false) + @PostMapping("/sessionSave") + public R sessionSave(@Validated @RequestBody ImSession imSession) { + SecurityUtils.openInterfaceTemporaryLoginSession(imSession.getUserId()); + imSession.setReceiveTime(LocalDateTime.now()); + iImSessionService.save(imSession); + return R.ok(imSession); + } + + @Inner(false) + @GetMapping("/lastSession") + public R lastSession(String userId) { + Optional.ofNullable(userId).orElseThrow(() -> new CheckedException("发送用户ID必传!")); + ImSession session = iImSessionService.getOne(Wrappers.lambdaQuery() + .eq(ImSession::getUserId, userId) + .orderByDesc(ImSession::getReceiveTime) + .last("LIMIT 1")); + return R.ok(session); + } + + @PutMapping("/update") + public R update(@Validated @RequestBody ImSession imSession) { + iImSessionService.updateById(imSession); + return R.ok(); + } + + @DeleteMapping("/remove/{id:[\\w,]+}") + public R remove(@PathVariable String[] id) { + iImSessionService.removeByIds(Arrays.asList(id)); + return R.ok(); + } + +} + diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/ImSessionMapper.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/ImSessionMapper.java new file mode 100644 index 00000000..6485028b --- /dev/null +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/ImSessionMapper.java @@ -0,0 +1,16 @@ +package com.cloud.kicc.system.mapper; + +import com.cloud.kicc.system.api.entity.ImSession; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 聊天会话 Mapper 接口 + *

+ * + * @author wangxiang4 + * @since 2023-12-12 + */ +public interface ImSessionMapper extends BaseMapper { + +} diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/IImSessionService.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/IImSessionService.java new file mode 100644 index 00000000..fb44967d --- /dev/null +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/IImSessionService.java @@ -0,0 +1,16 @@ +package com.cloud.kicc.system.service; + +import com.cloud.kicc.system.api.entity.ImSession; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 聊天会话 服务类 + *

+ * + * @author wangxiang4 + * @since 2023-12-12 + */ +public interface IImSessionService extends IService { + +} diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java index 4175c880..fdc4d91c 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java @@ -75,19 +75,10 @@ public class ImContentServiceImpl extends ServiceImpl imContents = super.list(Wrappers.lambdaQuery().and(i -> - i.eq(ImContent::getSendUserId, imContent.getSendUserId()) - .eq(ImContent::getReceiveUserId, imContent.getReceiveUserId()) - ).or(i -> - i.eq(ImContent::getSendUserId, imContent.getReceiveUserId()) - .eq(ImContent::getReceiveUserId, imContent.getSendUserId()) - ).last(String.format("LIMIT %s", openAiConfigProperties.getContextMessageMaxCount())) - .orderByDesc(ImContent::getSendTime)); + // 根据当前会话查询当前历史消息,进行AI上下文消息合并 + List imContents = super.list(Wrappers.lambdaQuery().eq(ImContent::getSessionId, imContent.getSessionId()) + .last(String.format("LIMIT %s", openAiConfigProperties.getContextMessageMaxCount())) + .orderByDesc(ImContent::getSendTime)); // 历史上下文消息 List historyMessages = imContents.stream().map(item -> { @@ -98,16 +89,18 @@ public class ImContentServiceImpl extends ServiceImpl choiceList = chatCompletionResult.getChoices(); @@ -118,6 +111,7 @@ public class ImContentServiceImpl extends ServiceImpl + * 聊天会话 服务实现类 + *

+ * + * @author wangxiang4 + * @since 2023-12-12 + */ +@Service +public class ImSessionServiceImpl extends ServiceImpl implements IImSessionService { + +} diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/ImSessionMapper.xml b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/ImSessionMapper.xml new file mode 100644 index 00000000..4ec00b92 --- /dev/null +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/ImSessionMapper.xml @@ -0,0 +1,5 @@ + + + + +