|  | @@ -6,10 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
	
		
			
				|  |  |  import com.zanxiang.erp.security.util.SecurityUtil;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
 | 
	
		
			
				|  |  | -import com.zanxiang.game.module.manage.enums.KfRoomMsgOwnerEnum;
 | 
	
		
			
				|  |  | -import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
 | 
	
		
			
				|  |  | -import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
 | 
	
		
			
				|  |  | -import com.zanxiang.game.module.manage.enums.OrderStateEnum;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.enums.*;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.dto.KfAppletMsgDTO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.dto.KfWebSocketMsgDTO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.dto.PayApplicationDTO;
 | 
	
	
		
			
				|  | @@ -110,9 +107,18 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private IDistributedLockComponent distributedLockComponent;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IKfAppletReplyService kfAppletReplyService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IUserAppletService userAppletService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public void appletMsg(String postData) {
 | 
	
		
			
				|  |  | +        log.error("接收到客服消息, postData : {}", postData);
 | 
	
		
			
				|  |  |          KfAppletMsgDTO kfAppletMsgDTO = JsonUtil.toObj(postData, KfAppletMsgDTO.class);
 | 
	
		
			
				|  |  | +        log.error("接收到客服消息, kfAppletMsgDTO : {}", JsonUtil.toString(kfAppletMsgDTO));
 | 
	
		
			
				|  |  | +        log.error("SessionFrom : {}", kfAppletMsgDTO.getSessionFrom());
 | 
	
		
			
				|  |  |          GameApplet gameApplet = gameAppletService.getOne(new LambdaQueryWrapper<GameApplet>()
 | 
	
		
			
				|  |  |                  .eq(GameApplet::getGhId, kfAppletMsgDTO.getToUserName()));
 | 
	
		
			
				|  |  |          //小游戏信息不存在, 消息不处理
 | 
	
	
		
			
				|  | @@ -155,6 +161,8 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //客服休息时间, 发送自动回复
 | 
	
		
			
				|  |  |          this.systemReplyHandle(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
 | 
	
		
			
				|  |  | +        //小程序自动回复
 | 
	
		
			
				|  |  | +        this.appletReplyHandle(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom, gameApplet.getAppId());
 | 
	
		
			
				|  |  |          //消息报警监测
 | 
	
		
			
				|  |  |          this.monitorWordHandle(gameApplet, kfAppletMsgDTO);
 | 
	
		
			
				|  |  |          //保存房间消息
 | 
	
	
		
			
				|  | @@ -165,6 +173,7 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |                      .set(KfSessionUser::getIsWait, Boolean.TRUE)
 | 
	
		
			
				|  |  |                      .set(KfSessionUser::getWaitStartTime, LocalDateTime.now())
 | 
	
		
			
				|  |  |                      .set(KfSessionUser::getUpdateTime, LocalDateTime.now())
 | 
	
		
			
				|  |  | +                    .isNull(KfSessionUser::getSessionFrom)
 | 
	
		
			
				|  |  |                      .eq(KfSessionUser::getOpenId, kfAppletMsgDTO.getFromUserName())
 | 
	
		
			
				|  |  |                      .eq(KfSessionUser::getGameId, gameApplet.getGameId())
 | 
	
		
			
				|  |  |              );
 | 
	
	
		
			
				|  | @@ -173,6 +182,72 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |          this.pushMessage(this.transform(kfRoom, gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoomMsg, msgContent));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private void appletReplyHandle(Long gameId, String openId, KfRoom kfRoom, String appId) {
 | 
	
		
			
				|  |  | +        //玩家信息
 | 
	
		
			
				|  |  | +        KfSessionUser kfSessionUser = kfSessionUserService.getById(openId, gameId);
 | 
	
		
			
				|  |  | +        //来源类型
 | 
	
		
			
				|  |  | +        KfSessionFromEnum kfSessionFrom = KfSessionFromEnum.getKfSessionFrom(kfSessionUser.getSessionFrom());
 | 
	
		
			
				|  |  | +        if (kfSessionFrom == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //获取自动回复配置
 | 
	
		
			
				|  |  | +        KfAppletReply kfAppletReply = kfAppletReplyService.getById(gameId);
 | 
	
		
			
				|  |  | +        if (kfAppletReply == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //判断是否来源与平台
 | 
	
		
			
				|  |  | +        if (Objects.equals(kfSessionFrom, KfSessionFromEnum.KF_SESSION_FROM_PLATFORM)) {
 | 
	
		
			
				|  |  | +            //回复默认消息
 | 
	
		
			
				|  |  | +            if (Strings.isNotBlank(kfAppletReply.getReplyDefault())) {
 | 
	
		
			
				|  |  | +                this.sysMsgSend(gameId, openId, kfAppletReply.getReplyDefault(), kfRoom);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //判断是否来源于广告
 | 
	
		
			
				|  |  | +        if (Objects.equals(kfSessionFrom, KfSessionFromEnum.KF_SESSION_FROM_AD)) {
 | 
	
		
			
				|  |  | +            //存在文本消息发送
 | 
	
		
			
				|  |  | +            if (Strings.isNotBlank(kfAppletReply.getReplyText())) {
 | 
	
		
			
				|  |  | +                this.sysMsgSend(gameId, openId, kfAppletReply.getReplyText(), kfRoom);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //存在图片发送
 | 
	
		
			
				|  |  | +            if (Strings.isNotBlank(kfAppletReply.getReplyImg())) {
 | 
	
		
			
				|  |  | +                this.sysImgMsgSend(gameId, openId, kfAppletReply.getReplyImg(), kfRoom);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //存在链接发送
 | 
	
		
			
				|  |  | +            if (Strings.isNotBlank(kfAppletReply.getReplyLink())) {
 | 
	
		
			
				|  |  | +                //链接消息参数转换
 | 
	
		
			
				|  |  | +                Map<String, String> linkMap = JsonUtil.toMap(kfAppletReply.getReplyLink(), Map.class, String.class);
 | 
	
		
			
				|  |  | +                String url = linkMap.get("url");
 | 
	
		
			
				|  |  | +                //链接拼接短链id
 | 
	
		
			
				|  |  | +                if (Strings.isNotBlank(url)) {
 | 
	
		
			
				|  |  | +                    UserApplet userApplet = userAppletService.getOne(new LambdaQueryWrapper<UserApplet>()
 | 
	
		
			
				|  |  | +                            .eq(UserApplet::getAppId, appId)
 | 
	
		
			
				|  |  | +                            .eq(UserApplet::getOpenId, openId)
 | 
	
		
			
				|  |  | +                            .orderByDesc(UserApplet::getCreateTime)
 | 
	
		
			
				|  |  | +                            .last("limit 1"));
 | 
	
		
			
				|  |  | +                    if (userApplet != null) {
 | 
	
		
			
				|  |  | +                        linkMap.put("url", url + "?customer_channel=" + userApplet.getId());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                this.sysLinkMsgSend(gameId, openId, kfRoom, linkMap);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void sysLinkMsgSend(Long gameId, String openId, KfRoom kfRoom, Map<String, String> linkMap) {
 | 
	
		
			
				|  |  | +        //发送消息
 | 
	
		
			
				|  |  | +        Map<String, Object> msgParamMap = new HashMap<>(3);
 | 
	
		
			
				|  |  | +        msgParamMap.put("touser", openId);
 | 
	
		
			
				|  |  | +        msgParamMap.put("link", linkMap);
 | 
	
		
			
				|  |  | +        msgParamMap.put("msgtype", KfRoomMsgTypeEnum.KF_MSG_TYPE_LINK.getValue());
 | 
	
		
			
				|  |  | +        Tuple2<Long, String> tuple2 = kfWxApiService.sendCustomMessageApi(gameId, msgParamMap);
 | 
	
		
			
				|  |  | +        //发送失败
 | 
	
		
			
				|  |  | +        if (!Objects.equals(tuple2.getT1(), 0L)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //保存发送的支付链接消息
 | 
	
		
			
				|  |  | +        kfRoomMsgService.save(this.transform(openId, gameId, kfRoom, KfRoomMsgTypeEnum.KF_MSG_TYPE_LINK, JsonUtil.toString(msgParamMap)));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private void monitorWordHandle(GameApplet gameApplet, KfAppletMsgDTO kfAppletMsgDTO) {
 | 
	
		
			
				|  |  |          //非文本消息
 | 
	
		
			
				|  |  |          if (!Objects.equals(kfAppletMsgDTO.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_TEXT.getValue())) {
 | 
	
	
		
			
				|  | @@ -399,20 +474,22 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //不存在角色信息, 不做更新
 | 
	
		
			
				|  |  | -        if (gameUserRole == null) {
 | 
	
		
			
				|  |  | +        if (user == null && Strings.isBlank(kfAppletMsgDTO.getSessionFrom())) {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //存在, 更新玩家信息
 | 
	
		
			
				|  |  |          kfSessionUserService.update(new LambdaUpdateWrapper<KfSessionUser>()
 | 
	
		
			
				|  |  | -                .set(KfSessionUser::getUserId, user.getId())
 | 
	
		
			
				|  |  | -                .set(KfSessionUser::getLastRoleId, gameUserRole.getRoleId())
 | 
	
		
			
				|  |  | -                .set(KfSessionUser::getLastRoleName, gameUserRole.getRoleName())
 | 
	
		
			
				|  |  | -                .set(KfSessionUser::getServerId, gameUserRole.getServerId())
 | 
	
		
			
				|  |  | -                .set(KfSessionUser::getServerName, gameUserRole.getServerName())
 | 
	
		
			
				|  |  | +                .set(user != null, KfSessionUser::getUserId, user == null ? null : user.getId())
 | 
	
		
			
				|  |  | +                .set(gameUserRole != null, KfSessionUser::getLastRoleId, gameUserRole == null ? null : gameUserRole.getRoleId())
 | 
	
		
			
				|  |  | +                .set(gameUserRole != null, KfSessionUser::getLastRoleName, gameUserRole == null ? null : gameUserRole.getRoleName())
 | 
	
		
			
				|  |  | +                .set(gameUserRole != null, KfSessionUser::getServerId, gameUserRole == null ? null : gameUserRole.getServerId())
 | 
	
		
			
				|  |  | +                .set(gameUserRole != null, KfSessionUser::getServerName, gameUserRole == null ? null : gameUserRole.getServerName())
 | 
	
		
			
				|  |  | +                .set(Strings.isNotBlank(kfAppletMsgDTO.getSessionFrom()), KfSessionUser::getSessionFrom, kfAppletMsgDTO.getSessionFrom())
 | 
	
		
			
				|  |  |                  .set(KfSessionUser::getUpdateTime, LocalDateTime.now())
 | 
	
		
			
				|  |  |                  .eq(KfSessionUser::getOpenId, kfAppletMsgDTO.getFromUserName())
 | 
	
		
			
				|  |  |                  .eq(KfSessionUser::getGameId, gameApplet.getGameId())
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  | +        distributedLockComponent.unlock(lockKey);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private KfSessionUser transform(KfAppletMsgDTO kfAppletMsgDTO, GameApplet gameApplet, User user, GameUserRole gameUserRole) {
 | 
	
	
		
			
				|  | @@ -425,6 +502,7 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
 | 
	
		
			
				|  |  |                  .lastRoleName(gameUserRole == null ? "神秘人[未创角]" : gameUserRole.getRoleName())
 | 
	
		
			
				|  |  |                  .serverId(gameUserRole == null ? null : gameUserRole.getServerId())
 | 
	
		
			
				|  |  |                  .serverName(gameUserRole == null ? null : gameUserRole.getServerName())
 | 
	
		
			
				|  |  | +                .sessionFrom(kfAppletMsgDTO.getSessionFrom())
 | 
	
		
			
				|  |  |                  .createTime(LocalDateTime.now())
 | 
	
		
			
				|  |  |                  .updateTime(LocalDateTime.now())
 | 
	
		
			
				|  |  |                  .build();
 |