|
|
@@ -0,0 +1,209 @@
|
|
|
+package com.inspur.device.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.http.HttpRequest;
|
|
|
+import cn.hutool.http.HttpResponse;
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
+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.inspur.device.domain.SmsbDeviceChatRecord;
|
|
|
+import com.inspur.device.domain.bo.SmsbDeviceChatRecordBo;
|
|
|
+import com.inspur.device.domain.vo.*;
|
|
|
+import com.inspur.device.mapper.SmsbDeviceChatKeyMapper;
|
|
|
+import com.inspur.device.mapper.SmsbDeviceChatRecordMapper;
|
|
|
+import com.inspur.device.service.ISmsbDeviceChatRecordService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 问答记录Service业务层处理
|
|
|
+ *
|
|
|
+ * @author Hao Li
|
|
|
+ * @date 2025-06-19
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class SmsbDeviceChatRecordServiceImpl implements ISmsbDeviceChatRecordService {
|
|
|
+
|
|
|
+ private final SmsbDeviceChatRecordMapper baseMapper;
|
|
|
+ private final SmsbDeviceChatKeyMapper smsbDeviceChatKeyMapper;
|
|
|
+ @Value("${dify.url}")
|
|
|
+ private String difyBaseUrl;
|
|
|
+ private static final String SYNC_CHAT_RECORD_URL = "/v1/conversations";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询问答记录
|
|
|
+ *
|
|
|
+ * @param id 主键
|
|
|
+ * @return 问答记录
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public SmsbDeviceChatRecordVo queryById(Long id) {
|
|
|
+ return baseMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询问答记录列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 问答记录分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<SmsbDeviceChatRecordVo> queryPageList(SmsbDeviceChatRecordBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<SmsbDeviceChatRecord> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<SmsbDeviceChatRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询符合条件的问答记录列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @return 问答记录列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<SmsbDeviceChatRecordVo> queryList(SmsbDeviceChatRecordBo bo) {
|
|
|
+ LambdaQueryWrapper<SmsbDeviceChatRecord> lqw = buildQueryWrapper(bo);
|
|
|
+ return baseMapper.selectVoList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<SmsbDeviceChatRecord> buildQueryWrapper(SmsbDeviceChatRecordBo bo) {
|
|
|
+ LambdaQueryWrapper<SmsbDeviceChatRecord> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getDifyId()), SmsbDeviceChatRecord::getDifyId, bo.getDifyId());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getName()), SmsbDeviceChatRecord::getName, bo.getName());
|
|
|
+ lqw.eq(bo.getDeviceId() != null, SmsbDeviceChatRecord::getDeviceId, bo.getDeviceId());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getDeviceName()), SmsbDeviceChatRecord::getDeviceName, bo.getDeviceName());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增问答记录
|
|
|
+ *
|
|
|
+ * @param bo 问答记录
|
|
|
+ * @return 是否新增成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean insertByBo(SmsbDeviceChatRecordBo bo) {
|
|
|
+ SmsbDeviceChatRecord add = MapstructUtils.convert(bo, SmsbDeviceChatRecord.class);
|
|
|
+ validEntityBeforeSave(add);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ if (flag) {
|
|
|
+ bo.setId(add.getId());
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改问答记录
|
|
|
+ *
|
|
|
+ * @param bo 问答记录
|
|
|
+ * @return 是否修改成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateByBo(SmsbDeviceChatRecordBo bo) {
|
|
|
+ SmsbDeviceChatRecord update = MapstructUtils.convert(bo, SmsbDeviceChatRecord.class);
|
|
|
+ validEntityBeforeSave(update);
|
|
|
+ return baseMapper.updateById(update) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(SmsbDeviceChatRecord entity) {
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验并批量删除问答记录信息
|
|
|
+ *
|
|
|
+ * @param ids 待删除的主键集合
|
|
|
+ * @param isValid 是否进行有效性校验
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if (isValid) {
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean syncRecordFromDify() {
|
|
|
+ // 1、查询出本地保存的所有工作流 即API KEY
|
|
|
+ List<SmsbDeviceChatKeyVo> chatKeyVOList = smsbDeviceChatKeyMapper.selectVoWithDevice();
|
|
|
+ if (CollectionUtils.isEmpty(chatKeyVOList)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ List<SmsbDeviceChatRecord> addRecordList = new ArrayList<>();
|
|
|
+ for (SmsbDeviceChatKeyVo chatKey : chatKeyVOList) {
|
|
|
+ String requestUrl = difyBaseUrl + SYNC_CHAT_RECORD_URL + "?user=role&limit=20";
|
|
|
+ String apiKey = chatKey.getApiKey();
|
|
|
+ // 2、调用接口 获取数据
|
|
|
+ JSONObject difyResponse = getRecordFromDify(requestUrl,apiKey);
|
|
|
+ if (null == difyResponse) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 3 data中取出对话列表
|
|
|
+ List<DifyChatRecordRspData> rspDataList = difyResponse.getJSONArray("data").toJavaList(DifyChatRecordRspData.class);
|
|
|
+ if (CollectionUtils.isEmpty(rspDataList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 4、遍历返回结果
|
|
|
+ for (DifyChatRecordRspData rspData : rspDataList) {
|
|
|
+ String difyId = rspData.getId();
|
|
|
+ // 5、查询数据库中是否存在该ID
|
|
|
+ SmsbDeviceChatRecordVo dbRecordVo = baseMapper.selectVoOne(new LambdaQueryWrapper<SmsbDeviceChatRecord>()
|
|
|
+ .eq(SmsbDeviceChatRecord::getDifyId,difyId));
|
|
|
+ // 已经存在 下次循环查询
|
|
|
+ if (null != dbRecordVo) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 不存在 插入数据库
|
|
|
+ SmsbDeviceChatRecord addRecord = new SmsbDeviceChatRecord();
|
|
|
+ createNewAddRecord(addRecord,rspData,chatKey);
|
|
|
+ addRecordList.add(addRecord);
|
|
|
+ // 5、需要插入 再获取对话内容 TODO
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ baseMapper.insertBatch(addRecordList);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void createNewAddRecord(SmsbDeviceChatRecord addRecord, DifyChatRecordRspData rspData, SmsbDeviceChatKeyVo chatKey) {
|
|
|
+ addRecord.setDeviceId(chatKey.getDeviceId());
|
|
|
+ addRecord.setDeviceName(chatKey.getDeviceName());
|
|
|
+ addRecord.setCreatedAt(rspData.getCreated_at());
|
|
|
+ addRecord.setUpdatedAt(rspData.getUpdated_at());
|
|
|
+ addRecord.setDifyId(rspData.getId());
|
|
|
+ addRecord.setName(rspData.getName());
|
|
|
+ addRecord.setCreateTime(DateUtil.date(rspData.getCreated_at() * 1000));
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONObject getRecordFromDify(String requestUrl, String apiKey) {
|
|
|
+ HttpRequest request = HttpRequest.get(requestUrl)
|
|
|
+ .header("Authorization", "Bearer " + apiKey)
|
|
|
+ .header("User-Agent","PostmanRuntime/7.26.8");
|
|
|
+ HttpResponse response = request.execute();
|
|
|
+ if (!response.isOk()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String responseBody = response.body();
|
|
|
+ JSONObject jsonObject = JSON.parseObject(responseBody);
|
|
|
+ return jsonObject;
|
|
|
+ }
|
|
|
+}
|