Jelajahi Sumber

Merge remote-tracking branch 'origin/package' into package-lingfeng

bilingfeng 9 bulan lalu
induk
melakukan
dabf6bcc97

+ 25 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/vo/OrderBackQueryRpcVO.java

@@ -0,0 +1,25 @@
+package com.zanxiang.game.back.base.pojo.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class OrderBackQueryRpcVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Boolean doBack;
+
+    private Long backMoney;
+
+    /**
+     * 回传信息
+     */
+    private String backMsg;
+}

+ 2 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtAppBackRpc.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.base.rpc;
 
 import com.zanxiang.game.back.base.pojo.dto.*;
+import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
 /**
@@ -34,7 +35,7 @@ public interface ITtAppBackRpc {
     /**
      * 订单是否回传
      */
-    ResultVO<Boolean> orderBackQuery(TtAppOrderBackQueryRpcDTO dto);
+    ResultVO<OrderBackQueryRpcVO> orderBackQuery(TtAppOrderBackQueryRpcDTO dto);
 
     /**
      * 创角是否回传

+ 11 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.back.serve.rpc.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.*;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
+import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
 import com.zanxiang.game.back.base.rpc.ITtAppBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.*;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
@@ -223,7 +224,7 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
     }
 
     @Override
-    public ResultVO<Boolean> orderBackQuery(TtAppOrderBackQueryRpcDTO dto) {
+    public ResultVO<OrderBackQueryRpcVO> orderBackQuery(TtAppOrderBackQueryRpcDTO dto) {
         log.error("头条APP订单回传结果查询:{}", JsonUtil.toString(dto));
 
         // 加锁最大等待 60s
@@ -237,9 +238,16 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                 .eq(GameOceanengineAppOrderLog::getUserId, dto.getUserId())
         );
         if  (orderLog == null) {
-            return ResultVO.ok(Boolean.FALSE);
+            return ResultVO.ok(OrderBackQueryRpcVO.builder()
+                            .doBack(Boolean.FALSE)
+                            .backMsg("回传异常,找不到订单:" + dto.getOrderId())
+                    .build());
         }
-        return ResultVO.ok(BackStatusEnum.getByValue(orderLog.getBackStatus()) ==  BackStatusEnum.SUCCESS);
+        return ResultVO.ok(OrderBackQueryRpcVO.builder()
+                        .doBack(BackStatusEnum.getByValue(orderLog.getBackStatus()) ==  BackStatusEnum.SUCCESS)
+                        .backMoney(orderLog.getBackMoney())
+                        .backMsg(orderLog.getBackMsg())
+                .build());
     }
 
     @Override

+ 3 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameMonitorAlarmController.java

@@ -39,13 +39,12 @@ public class GameMonitorAlarmController {
     }
 
 
+
+
     @ApiOperation(value = "测试")
     @PutMapping("/monitor")
     public ResultVO<Boolean> test() {
-        List<String> serverIdByGSId = gameServerService.getServerIdByGSId(120L);
-        serverIdByGSId.forEach(System.out::println);
-//        orderCostMonitorAlarmService.monitorTencentCostStatus();
-//        orderCostMonitorAlarmService.monitorDataStatus();
+        gameMonitorAlarmService.sendMsgToUserTest();
         return ResultVO.ok();
     }
 }

+ 4 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameMonitorAlarmVO.java

@@ -93,6 +93,10 @@ public class GameMonitorAlarmVO {
      * 策略内容
      */
     private String configExplain;
+    /**
+     * 策略类型
+     */
+    private Integer configType;
 
     /**
      * 报警状态,0表示未报警,1标识已报警

+ 2 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameMonitorAlarmService.java

@@ -10,4 +10,6 @@ public interface IGameMonitorAlarmService {
 
     boolean sendMsgToUser();
 
+    boolean sendMsgToUserTest();
+
 }

+ 124 - 23
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameMonitorAlarmServiceImpl.java

@@ -8,6 +8,7 @@ import com.zanxiang.game.data.serve.service.IGameMonitorAlarmService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.nutz.dao.Chain;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
@@ -18,7 +19,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author tianhua
@@ -46,37 +51,64 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
         dao.execute(sql);
         //结果
         log.info("查询告警信息结束");
-        try{
+        try {
             List<GameMonitorAlarmVO> list1 = sql.getList(GameMonitorAlarmVO.class);
             log.info("告警信息:{}", list1);
-            if (CollectionUtils.isEmpty(list1)){
+            if (CollectionUtils.isEmpty(list1)) {
                 log.info("没有告警信息");
                 return true;
             }
+            //用type==4进行分组
+            Map<Boolean, List<GameMonitorAlarmVO>> partitionedMap = list1.stream()
+                    .collect(Collectors.partitioningBy(vo -> vo.getConfigType() == 4));
+            List<GameMonitorAlarmVO> listWithType4 = partitionedMap.get(true);
+
+            //如果有type==4的,则每个投手的消息整合为1条告警
+            if (CollectionUtils.isNotEmpty(listWithType4)) {
+                Map<String, List<GameMonitorAlarmVO>> map = new HashMap<>();
+                for (GameMonitorAlarmVO vo : listWithType4) {
+                    String[] pitcherIds = vo.getPitcherId().split("-");
+                    for (String pitcherId : pitcherIds) {
+                        if (map.get(pitcherId) != null) {
+                            map.get(pitcherId).add(vo);
+                        }else {
+                            ArrayList<GameMonitorAlarmVO> newList = new ArrayList<>();
+                            newList.add(vo);
+                            map.put(pitcherId,newList);
+                        }
+                    }
+                }
+                for (String pitcherId : map.keySet()) {
+                    List<GameMonitorAlarmVO> gameMonitorAlarmVOS = map.get(pitcherId);
+                    StringBuilder msgStr = new StringBuilder(0);
+                    //把消息拼成一条
+                    for (int i = 0; i < gameMonitorAlarmVOS.size(); i++) {
+                        String s = alarmStr(gameMonitorAlarmVOS.get(i),i);
+                        msgStr.append(s);
+                    }
+
+                    log.info("type类型为4的告警信息,投手id:{}",pitcherId);
+                    dingTalkMsgRpc.sendByUserId(Long.valueOf(pitcherId), new String(msgStr));
+                    log.info("type类型为4的告警信息发送成功,投手id:{}",pitcherId);
+                }
+                for (GameMonitorAlarmVO vo : listWithType4) {
+                    Criteria cri = getCriteria(vo);
+                    dao.update(AdsMonitorAlarm.class, Chain.make("warn_status", 1), cri);
+                }
+            }
+
+            //如果没有type==4的,则每个投手的消息单独发送
+            List<GameMonitorAlarmVO> listWithoutType4 = partitionedMap.get(false);
             log.info("准备发送告警信息");
-            for (GameMonitorAlarmVO vo : list1) {
+            for (GameMonitorAlarmVO vo : listWithoutType4) {
                 String[] pitcherIds = vo.getPitcherId().split("-");
                 for (String pitcherId : pitcherIds) {
                     //发送给多个投手
                     log.info("发送告警信息给投手:{}", pitcherId);
-                    dingTalkMsgRpc.sendByUserId(Long.valueOf(pitcherId), alarmStr(vo));
+                    dingTalkMsgRpc.sendByUserId(Long.valueOf(pitcherId), alarmStr(vo,null));
                     log.info("发送告警信息给投手:{}成功", pitcherId);
                 }
-                //更新的条件
-                Criteria cri = Cnd.cri();
-                if (vo.getId() != null) {
-                    cri.where().andEquals("id", vo.getId());
-                }
-                if (vo.getDt() != null) {
-                    cri.where().andEquals("dt", vo.getDt());
-                }
-                if (vo.getGameId() != null) {
-                    cri.where().andEquals("gameId", vo.getGameId());
-                }
-                if (vo.getUserId() != null) {
-                    cri.where().andEquals("userId", vo.getUserId());
-                }
-                log.info("更新告警信息状态");
+                Criteria cri = getCriteria(vo);
                 dao.update(AdsMonitorAlarm.class, Chain.make("warn_status", 1), cri);
             }
 
@@ -86,11 +118,76 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
         return true;
     }
 
+    @Override
+    public boolean sendMsgToUserTest() {
+        Sql sql = Sqls.create(getMonitorAlarmInfoSql());
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(GameMonitorAlarmVO.class));
+        dao.execute(sql);
+        List<GameMonitorAlarmVO> list1 = sql.getList(GameMonitorAlarmVO.class);
+        //用type==4进行分组
+        Map<Boolean, List<GameMonitorAlarmVO>> partitionedMap = list1.stream()
+                .collect(Collectors.partitioningBy(vo -> vo.getConfigType() == 4));
+        List<GameMonitorAlarmVO> listWithType4 = partitionedMap.get(true);
+        //如果有type==4的,则每个投手的消息整合为1条告警
+        if (CollectionUtils.isNotEmpty(listWithType4)) {
+            Map<String, List<GameMonitorAlarmVO>> map = new HashMap<>();
+            for (GameMonitorAlarmVO vo : listWithType4) {
+                String[] pitcherIds = vo.getPitcherId().split("-");
+                for (String pitcherId : pitcherIds) {
+                    if (map.get(pitcherId) != null) {
+                        map.get(pitcherId).add(vo);
+                    }else {
+                        ArrayList<GameMonitorAlarmVO> newList = new ArrayList<>();
+                        newList.add(vo);
+                        map.put(pitcherId,newList);
+                    }
+                }
+            }
+            for (String pitcherId : map.keySet()) {
+                List<GameMonitorAlarmVO> gameMonitorAlarmVOS = map.get(pitcherId);
+                StringBuilder msgStr = new StringBuilder(0);
+                //把消息拼成一条
+                for (int i = 0; i < gameMonitorAlarmVOS.size(); i++) {
+                    String s = alarmStr(gameMonitorAlarmVOS.get(i),i);
+                    msgStr.append(s);
+                }
+
+                log.info("type类型为4的告警信息,投手id:{}",pitcherId);
+                log.info("type类型为4的告警信息:{}",msgStr);
+                log.info("type类型为4的告警信息发送成功,投手id:{}",pitcherId);
+            }
+        }
+        return true;
+    }
+
+    private  Criteria getCriteria(GameMonitorAlarmVO vo) {
+        //更新的条件
+        Criteria cri = Cnd.cri();
+        if (vo.getId() != null) {
+            cri.where().andEquals("id", vo.getId());
+        }
+        if (vo.getDt() != null) {
+            cri.where().andEquals("dt", vo.getDt());
+        }
+        if (vo.getGameId() != null) {
+            cri.where().andEquals("gameId", vo.getGameId());
+        }
+        if (vo.getUserId() != null) {
+            cri.where().andEquals("userId", vo.getUserId());
+        }
+        log.info("更新告警信息状态");
+        return cri;
+    }
+
     /**
      * 生成告警信息字符串
      */
-    private String alarmStr(GameMonitorAlarmVO vo) {
+    private String alarmStr(GameMonitorAlarmVO vo,Integer index) {
         StringBuilder msgStr = new StringBuilder(0);
+        if(index!=null){
+            msgStr.append("【"+(index+1)+"】 \n");
+        }
         msgStr.append("游戏策略响应时间:")
                 .append(vo.getDt())
                 .append(" ;")
@@ -112,13 +209,16 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
                 .append(" ;")
                 .append("\n")
                 .append("该用户响应的策略属于:")
-                .append(vo.getConfigExplain());
+                .append(vo.getConfigExplain())
+                .append(";")
+                .append("\n");
 
         return msgStr.toString();
     }
 
     /**
      * 游戏监控告警sql
+     *
      * @return String
      */
     private String getMonitorAlarmInfoSql() {
@@ -139,6 +239,7 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
                 	a.pitcher_id ,
                 	a.message ,
                 	a.config_explain ,
+                	a.config_type,
                 	a.warn_status
                 FROM game_ads.ads_monitor_alarm a
                 LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
@@ -155,6 +256,6 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
                 WHERE a.warn_status = 0
                 """;
     }
-    
-    
+
+
 }

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OrderCostMonitorAlarmBySmsServiceImpl.java

@@ -57,7 +57,7 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
         int count = orderSql.getInt(0);
         //如果为0直接告警
         if (count == 0) {
-            String msg = "前小时订单表数据为空,请检查";
+            String msg = "前小时订单表数据为空,请检查";
             log.info(msg);
             if(!sendSms(msg)){
                 throw new RuntimeException("短信发送失败");

+ 3 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -360,9 +360,9 @@ public class RoleManageServiceImpl implements IRoleManageService {
         if (dto.getGsId() != null) {
             //GS
             if (dto.getGsId() == 0L) {
-                criA.where().andIsNull("gs_id");
+                criA.where().andIsNull("gsId");
             } else {
-                criA.where().andEquals("gs_id", dto.getGsId());
+                criA.where().andEquals("gsId", dto.getGsId());
             }
         }
         if (dto.getPitcherId() != null) {
@@ -2370,7 +2370,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                         IF(TIMESTAMPDIFF(HOUR, f.pay_time, NOW()) < 72 , 0, 1) , 0) as is_remove_game_for_system, -- 是否退游 1-是;0-否(系统判定)
                         IFNULL(j.is_remove_game,2) as is_remove_game, -- 是否退游 1-是;0-否;2-代表未操作数据
                         IFNULL(j.is_wake_up,2) as is_wake_up, -- 是否唤醒 1-是;0-否 2-未操作
-                        j.gs_id as gs_id, -- GS_ID
+                        j.gs_id as gsId, -- GS_ID
                         j.customer_service_id as customer_service_id, -- 客服ID
                         j.oper_user_id as oper_user_id, -- 运营ID
                         j.is_delete as is_delete, -- 是否删除 1-删除;0-正常

+ 1 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -111,6 +111,7 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
                         GameServer::getCustomerIds, userIds));
         //新增保存指派记录
         gameServerAssignLogService.save(GameServerAssignLog.builder()
+                .gameId(gameServer.getGameId())
                 .serverId(gameServer.getServerId())
                 .assignType(param.getAssignType().getValue())
                 .oldUserIds(oldUserIds)

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServerAssignLog.java

@@ -34,6 +34,11 @@ public class GameServerAssignLog implements Serializable {
      */
     private String assignType;
 
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
     /**
      * 区服id
      */