|  | @@ -0,0 +1,153 @@
 | 
	
		
			
				|  |  | +package com.zanxiang.game.module.manage.service.impl;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.pojo.params.ChatSubmitParam;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.pojo.params.GameUserChatListParam;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.pojo.vo.GameUserChatVO;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.service.IGameService;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.service.IGameUserChatService;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.service.IGameUserRoleService;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.mybatis.entity.Game;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.mybatis.entity.GameUserChat;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.mybatis.mapper.GameUserChatMapper;
 | 
	
		
			
				|  |  | +import com.zanxiang.module.util.DateUtil;
 | 
	
		
			
				|  |  | +import com.zanxiang.module.util.JsonUtil;
 | 
	
		
			
				|  |  | +import com.zanxiang.module.util.bean.BeanUtil;
 | 
	
		
			
				|  |  | +import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  | +import org.apache.commons.collections4.CollectionUtils;
 | 
	
		
			
				|  |  | +import org.apache.logging.log4j.util.Strings;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.time.LocalDateTime;
 | 
	
		
			
				|  |  | +import java.time.LocalTime;
 | 
	
		
			
				|  |  | +import java.util.Collections;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Optional;
 | 
	
		
			
				|  |  | +import java.util.function.Consumer;
 | 
	
		
			
				|  |  | +import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * @author : lingfeng
 | 
	
		
			
				|  |  | + * @time : 2025-03-12
 | 
	
		
			
				|  |  | + * @description : 角色聊天记录
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Slf4j
 | 
	
		
			
				|  |  | +@Service
 | 
	
		
			
				|  |  | +public class GameUserChatServiceImpl extends ServiceImpl<GameUserChatMapper, GameUserChat> implements IGameUserChatService {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IGameService gameService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IGameUserRoleService gameUserRoleService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public Map<Long, String> chatGameMap() {
 | 
	
		
			
				|  |  | +        return Collections.singletonMap(12L, "仙剑奇侠传");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public IPage<GameUserChatVO> listOfPage(GameUserChatListParam param) {
 | 
	
		
			
				|  |  | +        return super.page(param.toPage(), new LambdaQueryWrapper<GameUserChat>()
 | 
	
		
			
				|  |  | +                .eq(Strings.isNotBlank(param.getRoleId()), GameUserChat::getRoleId, param.getRoleId())
 | 
	
		
			
				|  |  | +                .like(Strings.isNotBlank(param.getRoleName()), GameUserChat::getRoleName, param.getRoleName())
 | 
	
		
			
				|  |  | +                .ge(param.getChatStart() != null, GameUserChat::getChatTime,
 | 
	
		
			
				|  |  | +                        param.getChatStart() == null ? null : LocalDateTime.of(param.getChatStart(), LocalTime.MIN))
 | 
	
		
			
				|  |  | +                .le(param.getChatEnd() != null, GameUserChat::getChatTime,
 | 
	
		
			
				|  |  | +                        param.getChatEnd() == null ? null : LocalDateTime.of(param.getChatEnd(), LocalTime.MAX))
 | 
	
		
			
				|  |  | +                .orderByDesc(GameUserChat::getCreateTime)
 | 
	
		
			
				|  |  | +        ).convert(this::toVO);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private GameUserChatVO toVO(GameUserChat gameUserChat) {
 | 
	
		
			
				|  |  | +        if (gameUserChat == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return BeanUtil.copy(gameUserChat, GameUserChatVO.class);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void addGameUserChat(ChatSubmitParam param) {
 | 
	
		
			
				|  |  | +        List<Long> gameIdList = getGameIdBySuperGameId(param.getGameId());
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(gameIdList)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //构造聊天记录对象
 | 
	
		
			
				|  |  | +        GameUserChat chat = this.transform(param);
 | 
	
		
			
				|  |  | +        //补充玩家公会信息, 区服信息
 | 
	
		
			
				|  |  | +        this.processRoleInfo(gameIdList, chat.getRoleId(), chat::setGuildId, chat::setGuildName,
 | 
	
		
			
				|  |  | +                role -> {
 | 
	
		
			
				|  |  | +                    chat.setServerName(role.getServerName());
 | 
	
		
			
				|  |  | +                    if (Strings.isBlank(chat.getRoleName())) {
 | 
	
		
			
				|  |  | +                        chat.setRoleName(role.getRoleName());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +        //补充被私聊玩家公会信息, 区服信息
 | 
	
		
			
				|  |  | +        this.processRoleInfo(gameIdList, chat.getChatRoleId(), chat::setChatRoleGuildId, chat::setChatRoleGuildName,
 | 
	
		
			
				|  |  | +                role -> {
 | 
	
		
			
				|  |  | +                    chat.setChatRoleName(role.getRoleName());
 | 
	
		
			
				|  |  | +                    chat.setChatRoleServerName(role.getServerName());
 | 
	
		
			
				|  |  | +                    if (Strings.isBlank(chat.getServerId())) {
 | 
	
		
			
				|  |  | +                        chat.setChatRoleServerId(role.getServerId());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +        //保存聊天记录
 | 
	
		
			
				|  |  | +        super.save(chat);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void processRoleInfo(List<Long> gameIds, String roleId, Consumer<String> guildIdSetter,
 | 
	
		
			
				|  |  | +                                 Consumer<String> guildNameSetter, Consumer<GameUserRole> serverInfoSetter) {
 | 
	
		
			
				|  |  | +        if (Strings.isBlank(roleId)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Optional.ofNullable(this.getGameUserRole(gameIds, roleId)).ifPresent(gameUserRole -> {
 | 
	
		
			
				|  |  | +            Optional.ofNullable(JsonUtil.toMap(gameUserRole.getExtra(), Map.class, String.class))
 | 
	
		
			
				|  |  | +                    .ifPresent(extraMap -> {
 | 
	
		
			
				|  |  | +                        Optional.ofNullable(extraMap.get("countryId"))
 | 
	
		
			
				|  |  | +                                .filter(Strings::isNotBlank)
 | 
	
		
			
				|  |  | +                                .ifPresent(guildIdSetter);
 | 
	
		
			
				|  |  | +                        Optional.ofNullable(extraMap.get("country"))
 | 
	
		
			
				|  |  | +                                .filter(Strings::isNotBlank)
 | 
	
		
			
				|  |  | +                                .ifPresent(guildNameSetter);
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  | +            serverInfoSetter.accept(gameUserRole);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private List<Long> getGameIdBySuperGameId(Long superGameId) {
 | 
	
		
			
				|  |  | +        return gameService.list(new LambdaQueryWrapper<Game>()
 | 
	
		
			
				|  |  | +                .select(Game::getId)
 | 
	
		
			
				|  |  | +                .eq(Game::getSuperGameId, superGameId)
 | 
	
		
			
				|  |  | +        ).stream().map(Game::getId).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private GameUserRole getGameUserRole(List<Long> gameIdList, String roleId) {
 | 
	
		
			
				|  |  | +        return gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
 | 
	
		
			
				|  |  | +                .eq(GameUserRole::getRoleId, roleId)
 | 
	
		
			
				|  |  | +                .in(GameUserRole::getGameId, gameIdList)
 | 
	
		
			
				|  |  | +                .orderByDesc(GameUserRole::getUpdateTime)
 | 
	
		
			
				|  |  | +                .last("LIMIT 1"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private GameUserChat transform(ChatSubmitParam param) {
 | 
	
		
			
				|  |  | +        Map<String, Object> chatContentMap = param.getChatContentMap();
 | 
	
		
			
				|  |  | +        return GameUserChat.builder()
 | 
	
		
			
				|  |  | +                .supperGameId(param.getGameId())
 | 
	
		
			
				|  |  | +                .serverId(param.getServerId())
 | 
	
		
			
				|  |  | +                .roleId(chatContentMap.containsKey("role_id") ? chatContentMap.get("role_id").toString() : null)
 | 
	
		
			
				|  |  | +                .roleName(chatContentMap.containsKey("role_name") ? chatContentMap.get("role_name").toString() : null)
 | 
	
		
			
				|  |  | +                .chatTime(chatContentMap.containsKey("chatTime") ? DateUtil.parseLocalDateTime(chatContentMap.get("chatTime").toString()) : null)
 | 
	
		
			
				|  |  | +                .content(chatContentMap.containsKey("content") ? chatContentMap.get("content").toString() : null)
 | 
	
		
			
				|  |  | +                .channel(chatContentMap.containsKey("channel") ? chatContentMap.get("channel").toString() : null)
 | 
	
		
			
				|  |  | +                .chatRoleId(chatContentMap.containsKey("chat_role_id") ? chatContentMap.get("chat_role_id").toString() : null)
 | 
	
		
			
				|  |  | +                .chatRoleServerId(chatContentMap.containsKey("chat_role_server_id") ? chatContentMap.get("chat_role_server_id").toString() : null)
 | 
	
		
			
				|  |  | +                .sourceData(JsonUtil.toString(param))
 | 
	
		
			
				|  |  | +                .createTime(LocalDateTime.now())
 | 
	
		
			
				|  |  | +                .build();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |