Bläddra i källkod

客服功能完成

Gqingci 1 vecka sedan
förälder
incheckning
f41c19b89a

+ 96 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsMessageServiceImpl.java

@@ -9,6 +9,7 @@ import io.github.linpeilie.Converter;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.core.service.OssService;
 import org.dromara.common.oss.core.OssClient;
 import org.dromara.common.oss.entity.UploadResult;
 import org.dromara.common.oss.factory.OssFactory;
@@ -18,7 +19,9 @@ import org.dromara.main.domain.CsSession;
 import org.dromara.main.domain.bo.CsMessageBo;
 import org.dromara.main.domain.vo.CsMessageVo;
 import org.dromara.main.mapper.CsMessageMapper;
+import org.dromara.main.mapper.CsSeatConfigMapper;
 import org.dromara.main.mapper.CsSessionMapper;
+import org.dromara.main.mapper.MainCompanyApplyMapper;
 import org.dromara.main.service.ICsMessageService;
 import org.dromara.main.service.ICsSessionService;
 import org.springframework.stereotype.Service;
@@ -27,6 +30,16 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
 import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.main.domain.CsSeatConfig;
+import org.dromara.main.domain.MainCompanyApply;
 
 @RequiredArgsConstructor
 @Service
@@ -34,6 +47,10 @@ public class CsMessageServiceImpl implements ICsMessageService {
 
     private final CsMessageMapper baseMapper;
     private final CsSessionMapper sessionMapper;
+    private final CsSeatConfigMapper seatConfigMapper;
+    private final MainCompanyApplyMapper mainCompanyApplyMapper;
+    private final OssService ossService;
+    private final SysUserMapper sysUserMapper;
     private final ICsSessionService sessionService;
     private final Converter converter;
 
@@ -49,7 +66,8 @@ public class CsMessageServiceImpl implements ICsMessageService {
 
         Page<CsMessage> page = baseMapper.selectPage(pageQuery.build(), lqw);
         Page<CsMessageVo> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
-        voPage.setRecords(converter.convert(page.getRecords(), CsMessageVo.class));
+        List<CsMessageVo> records = converter.convert(page.getRecords(), CsMessageVo.class);
+        voPage.setRecords(enrichMessageVos(records, sessionMapper.selectById(sessionId)));
         return TableDataInfo.build(voPage);
     }
 
@@ -211,4 +229,81 @@ public class CsMessageServiceImpl implements ICsMessageService {
         }
         return 1;
     }
+
+    private List<CsMessageVo> enrichMessageVos(List<CsMessageVo> records, CsSession session) {
+        if (records == null || records.isEmpty()) {
+            return records;
+        }
+        Map<Long, SysUser> waiterMap = loadWaiterMap(records);
+        CsSeatConfig seat = session != null && session.getSeatId() != null ? seatConfigMapper.selectById(session.getSeatId()) : null;
+        MainCompanyApply companyApply = loadCompanyApply(session);
+        records.forEach(item -> enrichMessageVo(item, session, seat, companyApply, waiterMap));
+        return records;
+    }
+
+    private void enrichMessageVo(CsMessageVo vo, CsSession session, CsSeatConfig seat, MainCompanyApply companyApply, Map<Long, SysUser> waiterMap) {
+        if (vo == null) {
+            return;
+        }
+        if (Objects.equals(vo.getSenderType(), 2)) {
+            SysUser waiter = waiterMap.get(vo.getSenderId());
+            if (waiter != null) {
+                vo.setSenderName(StrUtil.blankToDefault(waiter.getNickName(), waiter.getUserName()));
+                vo.setSenderAvatar(seat != null ? seat.getAvatar() : null);
+                vo.setSenderRole("waiter");
+                return;
+            }
+        }
+        if (Objects.equals(vo.getSenderType(), 3)) {
+            vo.setSenderName("系统消息");
+            vo.setSenderRole("system");
+            return;
+        }
+        if (session != null) {
+            vo.setSenderName(session.getFromUserName());
+            vo.setSenderAvatar(resolveFromUserAvatar(session, companyApply));
+            vo.setSenderRole("user");
+        }
+    }
+
+    private MainCompanyApply loadCompanyApply(CsSession session) {
+        if (session == null || session.getSessionType() == null || session.getSessionType() != 2) {
+            return null;
+        }
+        return mainCompanyApplyMapper.selectOne(
+            Wrappers.lambdaQuery(MainCompanyApply.class)
+                .and(wrapper -> wrapper
+                    .eq(MainCompanyApply::getTenantId, String.valueOf(session.getFromUserId()))
+                    .or()
+                    .eq(MainCompanyApply::getId, session.getFromUserId())
+                    .or()
+                    .eq(StrUtil.isNotBlank(session.getFromUserName()), MainCompanyApply::getCompanyName, session.getFromUserName()))
+                .orderByDesc(MainCompanyApply::getCreateTime)
+                .last("LIMIT 1")
+        );
+    }
+
+    private String resolveFromUserAvatar(CsSession session, MainCompanyApply companyApply) {
+        if (session != null && StrUtil.isNotBlank(session.getFromUserAvatar())) {
+            return session.getFromUserAvatar();
+        }
+        if (companyApply != null && companyApply.getAvatar() != null) {
+            return ossService.selectUrlByIds(companyApply.getAvatar().toString());
+        }
+        return null;
+    }
+
+    private Map<Long, SysUser> loadWaiterMap(List<CsMessageVo> records) {
+        List<Long> waiterIds = records.stream()
+            .filter(item -> Objects.equals(item.getSenderType(), 2))
+            .map(CsMessageVo::getSenderId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .collect(Collectors.toList());
+        if (waiterIds.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        return sysUserMapper.selectBatchIds(waiterIds).stream()
+            .collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+    }
 }

+ 30 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsSessionServiceImpl.java

@@ -6,17 +6,20 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.github.linpeilie.Converter;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.service.OssService;
 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.dromara.main.domain.CsSeatConfig;
 import org.dromara.main.domain.CsSeatWaiter;
 import org.dromara.main.domain.CsSession;
+import org.dromara.main.domain.MainCompanyApply;
 import org.dromara.main.domain.bo.CsSessionBo;
 import org.dromara.main.domain.vo.CsSessionVo;
 import org.dromara.main.mapper.CsSeatConfigMapper;
 import org.dromara.main.mapper.CsSeatWaiterMapper;
 import org.dromara.main.mapper.CsSessionMapper;
+import org.dromara.main.mapper.MainCompanyApplyMapper;
 import org.dromara.main.service.ICsSessionService;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.mapper.SysUserMapper;
@@ -38,6 +41,8 @@ public class CsSessionServiceImpl implements ICsSessionService {
     private final CsSessionMapper baseMapper;
     private final CsSeatConfigMapper seatConfigMapper;
     private final CsSeatWaiterMapper seatWaiterMapper;
+    private final MainCompanyApplyMapper mainCompanyApplyMapper;
+    private final OssService ossService;
     private final SysUserMapper sysUserMapper;
     private final Converter converter;
 
@@ -184,8 +189,12 @@ public class CsSessionServiceImpl implements ICsSessionService {
     }
 
     private void enrichSessionVo(CsSessionVo vo, Map<Long, SysUser> waiterMap, Map<Long, CsSeatConfig> seatMap) {
+        if (StringUtils.isBlank(vo.getFromUserAvatar())) {
+            vo.setFromUserAvatar(resolveFromUserAvatar(vo));
+        }
         if (vo.getSeatId() != null && seatMap.containsKey(vo.getSeatId())) {
             vo.setSeatName(seatMap.get(vo.getSeatId()).getSeatName());
+            vo.setWaiterAvatar(seatMap.get(vo.getSeatId()).getAvatar());
         }
         if (vo.getWaiterId() != null && waiterMap.containsKey(vo.getWaiterId())) {
             SysUser waiter = waiterMap.get(vo.getWaiterId());
@@ -219,4 +228,25 @@ public class CsSessionServiceImpl implements ICsSessionService {
         return seatConfigMapper.selectBatchIds(seatIds).stream()
             .collect(Collectors.toMap(CsSeatConfig::getId, Function.identity()));
     }
+
+    private String resolveFromUserAvatar(CsSessionVo vo) {
+        if (vo == null || vo.getSessionType() == null || vo.getSessionType() != 2) {
+            return null;
+        }
+        MainCompanyApply companyApply = mainCompanyApplyMapper.selectOne(
+            Wrappers.lambdaQuery(MainCompanyApply.class)
+                .and(wrapper -> wrapper
+                    .eq(MainCompanyApply::getTenantId, String.valueOf(vo.getFromUserId()))
+                    .or()
+                    .eq(MainCompanyApply::getId, vo.getFromUserId())
+                    .or()
+                    .eq(StringUtils.isNotBlank(vo.getFromUserName()), MainCompanyApply::getCompanyName, vo.getFromUserName()))
+                .orderByDesc(MainCompanyApply::getCreateTime)
+                .last("LIMIT 1")
+        );
+        if (companyApply == null || companyApply.getAvatar() == null) {
+            return null;
+        }
+        return ossService.selectUrlByIds(companyApply.getAvatar().toString());
+    }
 }