content: package org.jeecg.modules.system.service.impl;
  
  import cn.hutool.core.util.ObjectUtil;
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONObject;
  import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  import lombok.extern.slf4j.Slf4j;
  import org.jeecg.common.base.BaseMap;
  import org.jeecg.common.constant.CacheConstant;
  import org.jeecg.common.constant.GlobalConstants;
  import org.jeecg.modules.system.entity.SysGatewayRoute;
  import org.jeecg.modules.system.mapper.SysGatewayRouteMapper;
  import org.jeecg.modules.system.service.ISysGatewayRouteService;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.data.redis.core.RedisTemplate;
  import org.springframework.stereotype.Service;
  import org.springframework.transaction.annotation.Transactional;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  /**
   * @Description: gateway路由管理
   * @Author: jeecg-boot
   * @Date: 2020-05-26
   * @Version: V1.0
   */
  @Service
  @Slf4j
  public class SysGatewayRouteServiceImpl extends ServiceImpl<SysGatewayRouteMapper, SysGatewayRoute> implements ISysGatewayRouteService {
  
      @Autowired
      private RedisTemplate<String, Object> redisTemplate;
  
  
      @Override
      public void addRoute2Redis(String key) {
          List<SysGatewayRoute> ls = this.list(new LambdaQueryWrapper<SysGatewayRoute>().eq(SysGatewayRoute::getStatus, 1));
          redisTemplate.opsForValue().set(key, JSON.toJSONString(ls));
      }
  
      @Override
      public void deleteById(String id) {
          this.removeById(id);
          this.resreshRouter();
      }
  
      @Override
      @Transactional(rollbackFor = Exception.class)
      public void updateAll(JSONObject json) {
          log.info("--gateway 路由配置修改--");
          try {
              json = json.getJSONObject("router");
              String id = json.getString("id");
              SysGatewayRoute route = getById(id);
              if (ObjectUtil.isEmpty(route)) {
                  route = new SysGatewayRoute();
              }
              route.setRouterId(json.getString("routerId"));
              route.setName(json.getString("name"));
              route.setPredicates(json.getString("predicates"));
              String filters = json.getString("filters");
              if (ObjectUtil.isEmpty(filters)) {
                  filters = "[]";
              }
              route.setFilters(filters);
              route.setUri(json.getString("uri"));
              if (json.get("status") == null) {
                  route.setStatus(1);
              } else {
                  route.setStatus(json.getInteger("status"));
              }
              this.saveOrUpdate(route);
              resreshRouter();
          } catch (Exception e) {
              log.error("路由配置解析失败", e);
              resreshRouter();
              e.printStackTrace();
          }
      }
  
      /**
       * 更新redis路由缓存
       */
      private void resreshRouter() {
          //更新redis路由缓存
          addRoute2Redis(CacheConstant.GATEWAY_ROUTES);
          BaseMap params = new BaseMap();
          params.put(GlobalConstants.HANDLER_NAME, "loderRouderHandler");
          //刷新网关
          redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params);
      }
  
      @Override
      public void clearRedis() {
          redisTemplate.opsForValue().set(CacheConstant.GATEWAY_ROUTES, null);
      }
  
  
  }
  