hyingbo
2025-05-27 3a740faa161ec976986c0735ba18837f570a525f
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java
@@ -7,6 +7,9 @@
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.Joiner;
import lombok.extern.slf4j.Slf4j;
@@ -17,14 +20,21 @@
import org.jeecg.common.api.dto.message.*;
import org.jeecg.common.aspect.UrlMatchEnum;
import org.jeecg.common.constant.*;
import org.jeecg.common.constant.enums.MessageSplitTypeEnum;
import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.common.desensitization.util.SensitiveInfoUtil;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.base.entity.DataVersion;
import org.jeecg.common.system.base.entity.SysUpload;
import org.jeecg.common.system.base.entity.SysUploadRela;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.*;
import org.jeecg.common.util.*;
import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;
import org.jeecg.modules.base.entity.Unit;
import org.jeecg.modules.base.service.IEnterpriseService;
import org.jeecg.modules.base.service.IUnitService;
import org.jeecg.modules.message.entity.SysMessageTemplate;
import org.jeecg.modules.message.handle.impl.DdSendMsgHandle;
import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle;
@@ -32,6 +42,8 @@
import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.message.websocket.WebSocket;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.system.entity.*;
import org.jeecg.modules.system.mapper.*;
import org.jeecg.modules.system.service.*;
@@ -42,6 +54,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.sql.DataSource;
@@ -49,171 +62,194 @@
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Description: 底层共通业务API,提供其他独立模块调用
 * @Author: scott
 * @Date:2019-4-20
 * @Date:2019-4-20
 * @Version:V1.0
 */
@Slf4j
@Service
public class SysBaseApiImpl implements ISysBaseAPI {
   /** 当前系统数据库类型 */
   private static String DB_TYPE = "";
    /**
     * 当前系统数据库类型
     */
    private static String DB_TYPE = "";
   @Autowired
   private ISysMessageTemplateService sysMessageTemplateService;
   @Resource
   private SysUserMapper userMapper;
   @Resource
   private SysUserRoleMapper sysUserRoleMapper;
   @Autowired
   private ISysDepartService sysDepartService;
   @Autowired
   private ISysDictService sysDictService;
   @Resource
   private SysAnnouncementMapper sysAnnouncementMapper;
   @Resource
   private SysAnnouncementSendMapper sysAnnouncementSendMapper;
   @Resource
    @Autowired
    private ISysMessageTemplateService sysMessageTemplateService;
    @Resource
    private SysUserMapper userMapper;
    @Resource
    private SysUserRoleMapper sysUserRoleMapper;
    @Autowired
    private ISysDepartService sysDepartService;
    @Autowired
    private ISysDictService sysDictService;
    @Resource
    private SysAnnouncementMapper sysAnnouncementMapper;
    @Resource
    private SysAnnouncementSendMapper sysAnnouncementSendMapper;
    @Resource
    private WebSocket webSocket;
   @Resource
   private SysRoleMapper roleMapper;
   @Resource
   private SysDepartMapper departMapper;
   @Resource
   private SysCategoryMapper categoryMapper;
   @Autowired
   private ISysDataSourceService dataSourceService;
   @Autowired
   private ISysUserDepartService sysUserDepartService;
   @Resource
   private SysPermissionMapper sysPermissionMapper;
   @Autowired
   private ISysPermissionDataRuleService sysPermissionDataRuleService;
   @Autowired
   private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
   @Autowired
   private ThirdAppDingtalkServiceImpl dingtalkService;
   @Autowired
   ISysCategoryService sysCategoryService;
   @Autowired
   private ISysUserService sysUserService;
   @Autowired
   private ISysDataLogService sysDataLogService;
   @Autowired
   private ISysFilesService sysFilesService;
    @Resource
    private SysRoleMapper roleMapper;
    @Resource
    private SysDepartMapper departMapper;
    @Resource
    private SysCategoryMapper categoryMapper;
    @Autowired
    private ISysDataSourceService dataSourceService;
    @Autowired
    private ISysUserDepartService sysUserDepartService;
    @Resource
    private SysPermissionMapper sysPermissionMapper;
    @Autowired
    private ISysPermissionDataRuleService sysPermissionDataRuleService;
    @Autowired
    private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
    @Autowired
    private ThirdAppDingtalkServiceImpl dingtalkService;
    @Autowired
    ISysCategoryService sysCategoryService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private ISysDataLogService sysDataLogService;
    @Autowired
    private ISysFilesService sysFilesService;
   @Override
   //@SensitiveDecode
   public LoginUser getUserByName(String username) {
      //update-begin-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
      if (oConvertUtils.isEmpty(username)) {
         return null;
      }
      //update-end-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
      LoginUser user = sysUserService.getEncodeUserInfo(username);
    @Autowired
    private IUploadRelaService uploadRelaService;
      //相同类中方法间调用时脱敏解密 Aop会失效,获取用户信息太重要,此处采用原生解密方法,不采用@SensitiveDecodeAble注解方式
      try {
         SensitiveInfoUtil.handlerObject(user, false);
      } catch (IllegalAccessException e) {
         e.printStackTrace();
      }
    @Autowired
    private IUploadService uploadService;
      return user;
   }
    @Autowired
    private IDataVersionService dataVersionService;
   @Override
   public String translateDictFromTable(String table, String text, String code, String key) {
      return sysDictService.queryTableDictTextByKey(table, text, code, key);
   }
    @Autowired
    private IUnitService unitService;
    @Autowired
    private IEnterpriseService enterpriseService;
   @Override
   public String translateDict(String code, String key) {
      return sysDictService.queryDictTextByKey(code, key);
   }
   @Override
   public List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username) {
      List<SysPermission> currentSyspermission = null;
      if(oConvertUtils.isNotEmpty(component)) {
         //1.通过注解属性pageComponent 获取菜单
         LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
         query.eq(SysPermission::getDelFlag,0);
         query.eq(SysPermission::getComponent, component);
         currentSyspermission = sysPermissionMapper.selectList(query);
      }else {
         //1.直接通过前端请求地址查询菜单
         LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
         query.eq(SysPermission::getMenuType,2);
         query.eq(SysPermission::getDelFlag,0);
         query.eq(SysPermission::getUrl, requestPath);
         currentSyspermission = sysPermissionMapper.selectList(query);
         //2.未找到 再通过自定义匹配URL 获取菜单
         if(currentSyspermission==null || currentSyspermission.size()==0) {
            //通过自定义URL匹配规则 获取菜单(实现通过菜单配置数据权限规则,实际上针对获取数据接口进行数据规则控制)
            String userMatchUrl = UrlMatchEnum.getMatchResultByUrl(requestPath);
            LambdaQueryWrapper<SysPermission> queryQserMatch = new LambdaQueryWrapper<SysPermission>();
            // update-begin-author:taoyan date:20211027 for: online菜单如果配置成一级菜单 权限查询不到 取消menuType = 1
            //queryQserMatch.eq(SysPermission::getMenuType, 1);
            // update-end-author:taoyan date:20211027 for: online菜单如果配置成一级菜单 权限查询不到 取消menuType = 1
            queryQserMatch.eq(SysPermission::getDelFlag, 0);
            queryQserMatch.eq(SysPermission::getUrl, userMatchUrl);
            if(oConvertUtils.isNotEmpty(userMatchUrl)){
               currentSyspermission = sysPermissionMapper.selectList(queryQserMatch);
            }
         }
         //3.未找到 再通过正则匹配获取菜单
         if(currentSyspermission==null || currentSyspermission.size()==0) {
            //通过正则匹配权限配置
            String regUrl = getRegexpUrl(requestPath);
            if(regUrl!=null) {
               currentSyspermission = sysPermissionMapper.selectList(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getMenuType,2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag,0));
            }
         }
      }
      if(currentSyspermission!=null && currentSyspermission.size()>0){
         List<SysPermissionDataRuleModel> dataRules = new ArrayList<SysPermissionDataRuleModel>();
         for (SysPermission sysPermission : currentSyspermission) {
            // update-begin--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
            List<SysPermissionDataRule> temp = sysPermissionDataRuleService.queryPermissionDataRules(username, sysPermission.getId());
            if(temp!=null && temp.size()>0) {
               //dataRules.addAll(temp);
               dataRules = oConvertUtils.entityListToModelList(temp,SysPermissionDataRuleModel.class);
            }
            // update-end--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
         }
         return dataRules;
      }
      return null;
   }
    @Autowired
    private IQuartzJobService quartzJobService;
    @Autowired
    private ISysDictItemService sysDictItemService;
   /**
    * 匹配前端传过来的地址 匹配成功返回正则地址
    * AntPathMatcher匹配地址
    *()* 匹配0个或多个字符
    *()**匹配0个或多个目录
    */
   private String getRegexpUrl(String url) {
      List<String> list = sysPermissionMapper.queryPermissionUrlWithStar();
      if(list!=null && list.size()>0) {
         for (String p : list) {
            PathMatcher matcher = new AntPathMatcher();
            if(matcher.match(p, url)) {
               return p;
            }
         }
      }
      return null;
   }
    @Override
    //@SensitiveDecode
    public LoginUser getUserByName(String username) {
        //update-begin-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
        if (oConvertUtils.isEmpty(username)) {
            return null;
        }
        //update-end-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
        LoginUser user = sysUserService.getEncodeUserInfo(username);
   @Override
   public SysUserCacheInfo getCacheUser(String username) {
      SysUserCacheInfo info = new SysUserCacheInfo();
      info.setOneDepart(true);
      LoginUser user = this.getUserByName(username);
        //相同类中方法间调用时脱敏解密 Aop会失效,获取用户信息太重要,此处采用原生解密方法,不采用@SensitiveDecodeAble注解方式
        try {
            SensitiveInfoUtil.handlerObject(user, false);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return user;
    }
    @Override
    public String translateDictFromTable(String table, String text, String code, String key) {
        return sysDictService.queryTableDictTextByKey(table, text, code, key);
    }
    @Override
    public String translateDict(String code, String key) {
        return sysDictService.queryDictTextByKey(code, key);
    }
    @Override
    public List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username) {
        List<SysPermission> currentSyspermission = null;
        if (oConvertUtils.isNotEmpty(component)) {
            //1.通过注解属性pageComponent 获取菜单
            LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
            query.eq(SysPermission::getDelFlag, 0);
            query.eq(SysPermission::getComponent, component);
            currentSyspermission = sysPermissionMapper.selectList(query);
        } else {
            //1.直接通过前端请求地址查询菜单
            LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
            query.eq(SysPermission::getMenuType, 2);
            query.eq(SysPermission::getDelFlag, 0);
            query.eq(SysPermission::getUrl, requestPath);
            currentSyspermission = sysPermissionMapper.selectList(query);
            //2.未找到 再通过自定义匹配URL 获取菜单
            if (currentSyspermission == null || currentSyspermission.size() == 0) {
                //通过自定义URL匹配规则 获取菜单(实现通过菜单配置数据权限规则,实际上针对获取数据接口进行数据规则控制)
                String userMatchUrl = UrlMatchEnum.getMatchResultByUrl(requestPath);
                LambdaQueryWrapper<SysPermission> queryQserMatch = new LambdaQueryWrapper<SysPermission>();
                // update-begin-author:taoyan date:20211027 for: online菜单如果配置成一级菜单 权限查询不到 取消menuType = 1
                //queryQserMatch.eq(SysPermission::getMenuType, 1);
                // update-end-author:taoyan date:20211027 for: online菜单如果配置成一级菜单 权限查询不到 取消menuType = 1
                queryQserMatch.eq(SysPermission::getDelFlag, 0);
                queryQserMatch.eq(SysPermission::getUrl, userMatchUrl);
                if (oConvertUtils.isNotEmpty(userMatchUrl)) {
                    currentSyspermission = sysPermissionMapper.selectList(queryQserMatch);
                }
            }
            //3.未找到 再通过正则匹配获取菜单
            if (currentSyspermission == null || currentSyspermission.size() == 0) {
                //通过正则匹配权限配置
                String regUrl = getRegexpUrl(requestPath);
                if (regUrl != null) {
                    currentSyspermission = sysPermissionMapper.selectList(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getMenuType, 2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag, 0));
                }
            }
        }
        if (currentSyspermission != null && currentSyspermission.size() > 0) {
            List<SysPermissionDataRuleModel> dataRules = new ArrayList<SysPermissionDataRuleModel>();
            for (SysPermission sysPermission : currentSyspermission) {
                // update-begin--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
                List<SysPermissionDataRule> temp = sysPermissionDataRuleService.queryPermissionDataRules(username, sysPermission.getId());
                if (temp != null && temp.size() > 0) {
                    //dataRules.addAll(temp);
                    dataRules = oConvertUtils.entityListToModelList(temp, SysPermissionDataRuleModel.class);
                }
                // update-end--Author:scott Date:20191119 for:数据权限规则编码不规范,项目存在相同包名和类名 #722
            }
            return dataRules;
        }
        return null;
    }
    /**
     * 匹配前端传过来的地址 匹配成功返回正则地址
     * AntPathMatcher匹配地址
     * ()* 匹配0个或多个字符
     * ()**匹配0个或多个目录
     */
    private String getRegexpUrl(String url) {
        List<String> list = sysPermissionMapper.queryPermissionUrlWithStar();
        if (list != null && list.size() > 0) {
            for (String p : list) {
                PathMatcher matcher = new AntPathMatcher();
                if (matcher.match(p, url)) {
                    return p;
                }
            }
        }
        return null;
    }
    @Override
    public SysUserCacheInfo getCacheUser(String username) {
        SysUserCacheInfo info = new SysUserCacheInfo();
        info.setOneDepart(true);
        LoginUser user = this.getUserByName(username);
//      try {
//         //相同类中方法间调用时脱敏@SensitiveDecodeAble解密 Aop失效处理
@@ -222,454 +258,461 @@
//         e.printStackTrace();
//      }
      if(user!=null) {
         info.setSysUserCode(user.getUsername());
         info.setSysUserName(user.getRealname());
         info.setSysOrgCode(user.getOrgCode());
      }else{
         return null;
      }
      //多部门支持in查询
      List<SysDepart> list = departMapper.queryUserDeparts(user.getId());
      List<String> sysMultiOrgCode = new ArrayList<String>();
      if(list==null || list.size()==0) {
         //当前用户无部门
         //sysMultiOrgCode.add("0");
      }else if(list.size()==1) {
         sysMultiOrgCode.add(list.get(0).getOrgCode());
      }else {
         info.setOneDepart(false);
         for (SysDepart dpt : list) {
            sysMultiOrgCode.add(dpt.getOrgCode());
         }
      }
      info.setSysMultiOrgCode(sysMultiOrgCode);
      return info;
   }
        if (user != null) {
            info.setSysUserCode(user.getUsername());
            info.setSysUserName(user.getRealname());
            info.setSysOrgCode(user.getOrgCode());
        } else {
            return null;
        }
        //多部门支持in查询
        List<SysDepart> list = departMapper.queryUserDeparts(user.getId());
        List<String> sysMultiOrgCode = new ArrayList<String>();
        if (list == null || list.size() == 0) {
            //当前用户无部门
            //sysMultiOrgCode.add("0");
        } else if (list.size() == 1) {
            sysMultiOrgCode.add(list.get(0).getOrgCode());
        } else {
            info.setOneDepart(false);
            for (SysDepart dpt : list) {
                sysMultiOrgCode.add(dpt.getOrgCode());
            }
        }
        info.setSysMultiOrgCode(sysMultiOrgCode);
        return info;
    }
   @Override
   public LoginUser getUserById(String id) {
      if(oConvertUtils.isEmpty(id)) {
         return null;
      }
      LoginUser loginUser = new LoginUser();
      SysUser sysUser = userMapper.selectById(id);
      if(sysUser==null) {
         return null;
      }
      BeanUtils.copyProperties(sysUser, loginUser);
      return loginUser;
   }
    @Override
    public LoginUser getUserById(String id) {
        if (oConvertUtils.isEmpty(id)) {
            return null;
        }
        LoginUser loginUser = new LoginUser();
        SysUser sysUser = userMapper.selectById(id);
        if (sysUser == null) {
            return null;
        }
        BeanUtils.copyProperties(sysUser, loginUser);
        return loginUser;
    }
   @Override
   public List<String> getRolesByUsername(String username) {
      return sysUserRoleMapper.getRoleByUserName(username);
   }
    @Override
    public List<String> getRolesByUsername(String username) {
        return sysUserRoleMapper.getRoleByUserName(username);
    }
   @Override
   public List<String> getDepartIdsByUsername(String username) {
      List<SysDepart> list = sysDepartService.queryDepartsByUsername(username);
      List<String> result = new ArrayList<>(list.size());
      for (SysDepart depart : list) {
         result.add(depart.getId());
      }
      return result;
   }
    @Override
    public List<String> getDepartIdsByUsername(String username) {
        List<SysDepart> list = sysDepartService.queryDepartsByUsername(username);
        List<String> result = new ArrayList<>(list.size());
        for (SysDepart depart : list) {
            result.add(depart.getId());
        }
        return result;
    }
   @Override
   public List<String> getDepartNamesByUsername(String username) {
      List<SysDepart> list = sysDepartService.queryDepartsByUsername(username);
      List<String> result = new ArrayList<>(list.size());
      for (SysDepart depart : list) {
         result.add(depart.getDepartName());
      }
      return result;
   }
    @Override
    public List<String> getDepartNamesByUsername(String username) {
        List<SysDepart> list = sysDepartService.queryDepartsByUsername(username);
        List<String> result = new ArrayList<>(list.size());
        for (SysDepart depart : list) {
            result.add(depart.getDepartName());
        }
        return result;
    }
   @Override
   public DictModel getParentDepartId(String departId) {
      SysDepart depart = departMapper.getParentDepartId(departId);
      DictModel model = new DictModel(depart.getId(),depart.getParentId());
      return model;
   }
    @Override
    public DictModel getParentDepartId(String departId) {
        SysDepart depart = departMapper.getParentDepartId(departId);
        DictModel model = new DictModel(depart.getId(), depart.getParentId());
        return model;
    }
   @Override
   @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code", unless = "#result == null ")
   public List<DictModel> queryDictItemsByCode(String code) {
      return sysDictService.queryDictItemsByCode(code);
   }
    @Override
    @Cacheable(value = CacheConstant.SYS_DICT_CACHE, key = "#code", unless = "#result == null ")
    public List<DictModel> queryDictItemsByCode(String code) {
        return sysDictService.queryDictItemsByCode(code);
    }
   @Override
   @Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE,key = "#code", unless = "#result == null ")
   public List<DictModel> queryEnableDictItemsByCode(String code) {
      return sysDictService.queryEnableDictItemsByCode(code);
   }
    @Override
    @Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE, key = "#code", unless = "#result == null ")
    public List<DictModel> queryEnableDictItemsByCode(String code) {
        return sysDictService.queryEnableDictItemsByCode(code);
    }
   @Override
   public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) {
      //update-begin-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
      if(table.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){
         table = QueryGenerator.getSqlRuleValue(table);
      }
      //update-end-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
      String[] arr = new String[]{text, code};
      SqlInjectionUtil.filterContent(arr);
      SqlInjectionUtil.specialFilterContentForDictSql(table);
      return sysDictService.queryTableDictItemsByCode(table, text, code);
   }
    @Override
    public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) {
        //update-begin-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
        if (table.indexOf(SymbolConstant.SYS_VAR_PREFIX) >= 0) {
            table = QueryGenerator.getSqlRuleValue(table);
        }
        //update-end-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
        String[] arr = new String[]{text, code};
        SqlInjectionUtil.filterContent(arr);
        SqlInjectionUtil.specialFilterContentForDictSql(table);
        return sysDictService.queryTableDictItemsByCode(table, text, code);
    }
   @Override
   public List<DictModel> queryAllDepartBackDictModel() {
      return sysDictService.queryAllDepartBackDictModel();
   }
    @Override
    public List<DictModel> queryAllDepartBackDictModel() {
        return sysDictService.queryAllDepartBackDictModel();
    }
   @Override
   public void sendSysAnnouncement(MessageDTO message) {
      this.sendSysAnnouncement(message.getFromUser(),
            message.getToUser(),
            message.getTitle(),
            message.getContent(),
            message.getCategory());
      try {
         // 同步发送第三方APP消息
         wechatEnterpriseService.sendMessage(message, true);
         dingtalkService.sendMessage(message, true);
      } catch (Exception e) {
         log.error("同步发送第三方APP消息失败!", e);
      }
   }
    @Override
    public void sendSysAnnouncement(MessageDTO message) {
   @Override
   public void sendBusAnnouncement(BusMessageDTO message) {
      sendBusAnnouncement(message.getFromUser(),
            message.getToUser(),
            message.getTitle(),
            message.getContent(),
            message.getCategory(),
            message.getBusType(),
            message.getBusId());
      try {
         // 同步发送第三方APP消息
         wechatEnterpriseService.sendMessage(message, true);
         dingtalkService.sendMessage(message, true);
      } catch (Exception e) {
         log.error("同步发送第三方APP消息失败!", e);
      }
   }
        if (StringUtils.isNotBlank(message.getMessageType())) {
            //获取消息类型对应角色用户
            MessageSplitTypeEnum messageSplitTypeEnum = MessageSplitTypeEnum.valueOfType(message.getMessageType());
            SysDict sysDict = sysDictService.getOne(new LambdaQueryWrapper<SysDict>().eq(SysDict::getDictCode, messageSplitTypeEnum.getDictCode()));
            List<SysDictItem> sysDictItemList = sysDictItemService.list(new QueryWrapper<SysDictItem>().eq("dict_id",sysDict.getId()));
            if (CollectionUtils.isNotEmpty(sysDictItemList)) {
                List<SysUser> sysUserList = sysUserService.getUserByRoleCodeList(sysDictItemList.stream().map(SysDictItem::getItemValue).collect(Collectors.toList()));
                if (CollectionUtils.isNotEmpty(sysUserList)) {
                    Set<String> userIdList = new HashSet<>(Arrays.asList(message.getToUser().split(StringPool.COMMA)));
                    userIdList.addAll(sysUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()));
                    message.setToUser(StringUtils.join(userIdList, StringPool.COMMA));
                }
            }
        }
   @Override
   public void sendTemplateAnnouncement(TemplateMessageDTO message) {
      String templateCode = message.getTemplateCode();
      String title = message.getTitle();
      Map<String,String> map = message.getTemplateParam();
      String fromUser = message.getFromUser();
      String toUser = message.getToUser();
        this.sendSysAnnouncement(message.getFromUser(), message.getToUser(), message.getTitle(), message.getContent(), message.getCategory());
        try {
            // 同步发送第三方APP消息
            wechatEnterpriseService.sendMessage(message, true);
            dingtalkService.sendMessage(message, true);
        } catch (Exception e) {
            log.error("同步发送第三方APP消息失败!", e);
        }
    }
      List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
      if(sysSmsTemplates==null||sysSmsTemplates.size()==0){
         throw new JeecgBootException("消息模板不存在,模板编码:"+templateCode);
      }
      SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
      //模板标题
      title = title==null?sysSmsTemplate.getTemplateName():title;
      //模板内容
      String content = sysSmsTemplate.getTemplateContent();
      if(map!=null) {
         for (Map.Entry<String, String> entry : map.entrySet()) {
            String str = "${" + entry.getKey() + "}";
            if(oConvertUtils.isNotEmpty(title)){
               title = title.replace(str, entry.getValue());
            }
            content = content.replace(str, entry.getValue());
         }
      }
    @Override
    public void sendBusAnnouncement(BusMessageDTO message) {
        sendBusAnnouncement(message.getFromUser(), message.getToUser(), message.getTitle(), message.getContent(), message.getCategory(), message.getBusType(), message.getBusId());
        try {
            // 同步发送第三方APP消息
            wechatEnterpriseService.sendMessage(message, true);
            dingtalkService.sendMessage(message, true);
        } catch (Exception e) {
            log.error("同步发送第三方APP消息失败!", e);
        }
    }
      SysAnnouncement announcement = new SysAnnouncement();
      announcement.setTitile(title);
      announcement.setMsgContent(content);
      announcement.setSender(fromUser);
      announcement.setPriority(CommonConstant.PRIORITY_M);
      announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
      announcement.setSendStatus(CommonConstant.HAS_SEND);
      announcement.setSendTime(new Date());
      announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);
      announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
      sysAnnouncementMapper.insert(announcement);
      // 2.插入用户通告阅读标记表记录
      String userId = toUser;
      String[] userIds = userId.split(",");
      String anntId = announcement.getId();
      for(int i=0;i<userIds.length;i++) {
         if(oConvertUtils.isNotEmpty(userIds[i])) {
            SysUser sysUser = userMapper.getUserByName(userIds[i]);
            if(sysUser==null) {
               continue;
            }
            SysAnnouncementSend announcementSend = new SysAnnouncementSend();
            announcementSend.setAnntId(anntId);
            announcementSend.setUserId(sysUser.getId());
            announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
            sysAnnouncementSendMapper.insert(announcementSend);
            JSONObject obj = new JSONObject();
            obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
            obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
            obj.put(WebsocketConst.MSG_ID, announcement.getId());
            obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
            webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
         }
      }
      try {
         // 同步企业微信、钉钉的消息通知
         dingtalkService.sendActionCardMessage(announcement, true);
         wechatEnterpriseService.sendTextCardMessage(announcement, true);
      } catch (Exception e) {
         log.error("同步发送第三方APP消息失败!", e);
      }
    @Override
    public void sendTemplateAnnouncement(TemplateMessageDTO message) {
        String templateCode = message.getTemplateCode();
        String title = message.getTitle();
        Map<String, String> map = message.getTemplateParam();
        String fromUser = message.getFromUser();
        String toUser = message.getToUser();
   }
        List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
        if (sysSmsTemplates == null || sysSmsTemplates.size() == 0) {
            throw new JeecgBootException("消息模板不存在,模板编码:" + templateCode);
        }
        SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
        //模板标题
        title = title == null ? sysSmsTemplate.getTemplateName() : title;
        //模板内容
        String content = sysSmsTemplate.getTemplateContent();
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String str = "${" + entry.getKey() + "}";
                if (oConvertUtils.isNotEmpty(title)) {
                    title = title.replace(str, entry.getValue());
                }
                content = content.replace(str, entry.getValue());
            }
        }
   @Override
   public void sendBusTemplateAnnouncement(BusTemplateMessageDTO message) {
      String templateCode = message.getTemplateCode();
      String title = message.getTitle();
      Map<String,String> map = message.getTemplateParam();
      String fromUser = message.getFromUser();
      String toUser = message.getToUser();
      String busId = message.getBusId();
      String busType = message.getBusType();
        SysAnnouncement announcement = new SysAnnouncement();
        announcement.setTitile(title);
        announcement.setMsgContent(content);
        announcement.setSender(fromUser);
        announcement.setPriority(CommonConstant.PRIORITY_M);
        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
        announcement.setSendStatus(CommonConstant.HAS_SEND);
        announcement.setSendTime(new Date());
        announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);
        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
        sysAnnouncementMapper.insert(announcement);
        // 2.插入用户通告阅读标记表记录
        String userId = toUser;
        String[] userIds = userId.split(",");
        String anntId = announcement.getId();
        for (int i = 0; i < userIds.length; i++) {
            if (oConvertUtils.isNotEmpty(userIds[i])) {
                SysUser sysUser = userMapper.getUserByName(userIds[i]);
                if (sysUser == null) {
                    continue;
                }
                SysAnnouncementSend announcementSend = new SysAnnouncementSend();
                announcementSend.setAnntId(anntId);
                announcementSend.setUserId(sysUser.getId());
                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
                sysAnnouncementSendMapper.insert(announcementSend);
                JSONObject obj = new JSONObject();
                obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
                obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
                obj.put(WebsocketConst.MSG_ID, announcement.getId());
                obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
                webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
            }
        }
        try {
            // 同步企业微信、钉钉的消息通知
            dingtalkService.sendActionCardMessage(announcement, true);
            wechatEnterpriseService.sendTextCardMessage(announcement, true);
        } catch (Exception e) {
            log.error("同步发送第三方APP消息失败!", e);
        }
      List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
      if(sysSmsTemplates==null||sysSmsTemplates.size()==0){
         throw new JeecgBootException("消息模板不存在,模板编码:"+templateCode);
      }
      SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
      //模板标题
      title = title==null?sysSmsTemplate.getTemplateName():title;
      //模板内容
      String content = sysSmsTemplate.getTemplateContent();
      if(map!=null) {
         for (Map.Entry<String, String> entry : map.entrySet()) {
            String str = "${" + entry.getKey() + "}";
            title = title.replace(str, entry.getValue());
            content = content.replace(str, entry.getValue());
         }
      }
      SysAnnouncement announcement = new SysAnnouncement();
      announcement.setTitile(title);
      announcement.setMsgContent(content);
      announcement.setSender(fromUser);
      announcement.setPriority(CommonConstant.PRIORITY_M);
      announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
      announcement.setSendStatus(CommonConstant.HAS_SEND);
      announcement.setSendTime(new Date());
      announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);
      announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
      announcement.setBusId(busId);
      announcement.setBusType(busType);
      announcement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());
      announcement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());
      sysAnnouncementMapper.insert(announcement);
      // 2.插入用户通告阅读标记表记录
      String userId = toUser;
      String[] userIds = userId.split(",");
      String anntId = announcement.getId();
      for(int i=0;i<userIds.length;i++) {
         if(oConvertUtils.isNotEmpty(userIds[i])) {
            SysUser sysUser = userMapper.getUserByName(userIds[i]);
            if(sysUser==null) {
               continue;
            }
            SysAnnouncementSend announcementSend = new SysAnnouncementSend();
            announcementSend.setAnntId(anntId);
            announcementSend.setUserId(sysUser.getId());
            announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
            sysAnnouncementSendMapper.insert(announcementSend);
            JSONObject obj = new JSONObject();
            obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
            obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
            obj.put(WebsocketConst.MSG_ID, announcement.getId());
            obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
            webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
         }
      }
      try {
         // 同步企业微信、钉钉的消息通知
         dingtalkService.sendActionCardMessage(announcement, true);
         wechatEnterpriseService.sendTextCardMessage(announcement, true);
      } catch (Exception e) {
         log.error("同步发送第三方APP消息失败!", e);
      }
    }
   }
    @Override
    public void sendBusTemplateAnnouncement(BusTemplateMessageDTO message) {
        String templateCode = message.getTemplateCode();
        String title = message.getTitle();
        Map<String, String> map = message.getTemplateParam();
        String fromUser = message.getFromUser();
        String toUser = message.getToUser();
        String busId = message.getBusId();
        String busType = message.getBusType();
   @Override
   public String parseTemplateByCode(TemplateDTO templateDTO) {
      String templateCode = templateDTO.getTemplateCode();
      Map<String, String> map = templateDTO.getTemplateParam();
      List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
      if(sysSmsTemplates==null||sysSmsTemplates.size()==0){
         throw new JeecgBootException("消息模板不存在,模板编码:"+templateCode);
      }
      SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
      //模板内容
      String content = sysSmsTemplate.getTemplateContent();
      if(map!=null) {
         for (Map.Entry<String, String> entry : map.entrySet()) {
            String str = "${" + entry.getKey() + "}";
            content = content.replace(str, entry.getValue());
         }
      }
      return content;
   }
        List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
        if (sysSmsTemplates == null || sysSmsTemplates.size() == 0) {
            throw new JeecgBootException("消息模板不存在,模板编码:" + templateCode);
        }
        SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
        //模板标题
        title = title == null ? sysSmsTemplate.getTemplateName() : title;
        //模板内容
        String content = sysSmsTemplate.getTemplateContent();
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String str = "${" + entry.getKey() + "}";
                title = title.replace(str, entry.getValue());
                content = content.replace(str, entry.getValue());
            }
        }
        SysAnnouncement announcement = new SysAnnouncement();
        announcement.setTitile(title);
        announcement.setMsgContent(content);
        announcement.setSender(fromUser);
        announcement.setPriority(CommonConstant.PRIORITY_M);
        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
        announcement.setSendStatus(CommonConstant.HAS_SEND);
        announcement.setSendTime(new Date());
        announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);
        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
        announcement.setBusId(busId);
        announcement.setBusType(busType);
        announcement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());
        announcement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());
        sysAnnouncementMapper.insert(announcement);
        // 2.插入用户通告阅读标记表记录
        String userId = toUser;
        String[] userIds = userId.split(",");
        String anntId = announcement.getId();
        for (int i = 0; i < userIds.length; i++) {
            if (oConvertUtils.isNotEmpty(userIds[i])) {
                SysUser sysUser = userMapper.getUserByName(userIds[i]);
                if (sysUser == null) {
                    continue;
                }
                SysAnnouncementSend announcementSend = new SysAnnouncementSend();
                announcementSend.setAnntId(anntId);
                announcementSend.setUserId(sysUser.getId());
                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
                sysAnnouncementSendMapper.insert(announcementSend);
                JSONObject obj = new JSONObject();
                obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
                obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
                obj.put(WebsocketConst.MSG_ID, announcement.getId());
                obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
                webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
            }
        }
        try {
            // 同步企业微信、钉钉的消息通知
            dingtalkService.sendActionCardMessage(announcement, true);
            wechatEnterpriseService.sendTextCardMessage(announcement, true);
        } catch (Exception e) {
            log.error("同步发送第三方APP消息失败!", e);
        }
   @Override
   public void updateSysAnnounReadFlag(String busType, String busId) {
      SysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper<SysAnnouncement>().eq("bus_type",busType).eq("bus_id",busId));
      if(announcement != null){
         LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
         String userId = sysUser.getId();
         LambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();
         updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);
         updateWrapper.set(SysAnnouncementSend::getReadTime, new Date());
         updateWrapper.last("where annt_id ='"+announcement.getId()+"' and user_id ='"+userId+"'");
         SysAnnouncementSend announcementSend = new SysAnnouncementSend();
         sysAnnouncementSendMapper.update(announcementSend, updateWrapper);
      }
   }
    }
   /**
    * 获取数据库类型
    * @param dataSource
    * @return
    * @throws SQLException
    */
   private String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException{
      if("".equals(DB_TYPE)) {
         Connection connection = dataSource.getConnection();
         try {
            DatabaseMetaData md = connection.getMetaData();
            String dbType = md.getDatabaseProductName().toLowerCase();
            if(dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL.toLowerCase())>=0) {
               DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL;
            }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE.toLowerCase())>=0) {
               DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE;
            }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER.toLowerCase())>=0||dbType.indexOf(DataBaseConstant.DB_TYPE_SQL_SERVER_BLANK)>=0) {
               DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER;
            }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL.toLowerCase())>=0) {
               DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL;
            }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB.toLowerCase())>=0) {
               DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB;
            }else {
               log.error("数据库类型:[" + dbType + "]不识别!");
               //throw new JeecgBootException("数据库类型:["+dbType+"]不识别!");
            }
         } catch (Exception e) {
            log.error(e.getMessage(), e);
         }finally {
            connection.close();
         }
      }
      return DB_TYPE;
    @Override
    public String parseTemplateByCode(TemplateDTO templateDTO) {
        String templateCode = templateDTO.getTemplateCode();
        Map<String, String> map = templateDTO.getTemplateParam();
        List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);
        if (sysSmsTemplates == null || sysSmsTemplates.size() == 0) {
            throw new JeecgBootException("消息模板不存在,模板编码:" + templateCode);
        }
        SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);
        //模板内容
        String content = sysSmsTemplate.getTemplateContent();
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String str = "${" + entry.getKey() + "}";
                content = content.replace(str, entry.getValue());
            }
        }
        return content;
    }
   }
    @Override
    public void updateSysAnnounReadFlag(String busType, String busId) {
        SysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper<SysAnnouncement>().eq("bus_type", busType).eq("bus_id", busId));
        if (announcement != null) {
            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            String userId = sysUser.getId();
            LambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();
            updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);
            updateWrapper.set(SysAnnouncementSend::getReadTime, new Date());
            updateWrapper.last("where annt_id ='" + announcement.getId() + "' and user_id ='" + userId + "'");
            SysAnnouncementSend announcementSend = new SysAnnouncementSend();
            sysAnnouncementSendMapper.update(announcementSend, updateWrapper);
        }
    }
   @Override
   public List<DictModel> queryAllDict() {
      // 查询并排序
      QueryWrapper<SysDict> queryWrapper = new QueryWrapper<SysDict>();
      queryWrapper.orderByAsc("create_time");
      List<SysDict> dicts = sysDictService.list(queryWrapper);
      // 封装成 model
      List<DictModel> list = new ArrayList<DictModel>();
      for (SysDict dict : dicts) {
         list.add(new DictModel(dict.getDictCode(), dict.getDictName()));
      }
    /**
     * 获取数据库类型
     *
     * @param dataSource
     * @return
     */
    @Resource
    private String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException {
        if ("".equals(DB_TYPE)) {
            Connection connection = dataSource.getConnection();
            try {
                DatabaseMetaData md = connection.getMetaData();
                String dbType = md.getDatabaseProductName().toLowerCase();
                if (dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL.toLowerCase()) >= 0) {
                    DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL;
                } else if (dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE.toLowerCase()) >= 0) {
                    DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE;
                } else if (dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER.toLowerCase()) >= 0 || dbType.indexOf(DataBaseConstant.DB_TYPE_SQL_SERVER_BLANK) >= 0) {
                    DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER;
                } else if (dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL.toLowerCase()) >= 0) {
                    DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL;
                } else if (dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB.toLowerCase()) >= 0) {
                    DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB;
                } else {
                    log.error("数据库类型:[" + dbType + "]不识别!");
                    //throw new JeecgBootException("数据库类型:["+dbType+"]不识别!");
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            } finally {
                connection.close();
            }
        }
        return DB_TYPE;
      return list;
   }
    }
   @Override
   public List<SysCategoryModel> queryAllSysCategory() {
      List<SysCategory> ls = categoryMapper.selectList(null);
      List<SysCategoryModel> res = oConvertUtils.entityListToModelList(ls,SysCategoryModel.class);
      return res;
   }
    @Override
    public List<DictModel> queryAllDict() {
        // 查询并排序
        QueryWrapper<SysDict> queryWrapper = new QueryWrapper<SysDict>();
        queryWrapper.orderByAsc("create_time");
        List<SysDict> dicts = sysDictService.list(queryWrapper);
        // 封装成 model
        List<DictModel> list = new ArrayList<DictModel>();
        for (SysDict dict : dicts) {
            list.add(new DictModel(dict.getDictCode(), dict.getDictName()));
        }
   @Override
   public List<DictModel> queryFilterTableDictInfo(String table, String text, String code, String filterSql) {
      return sysDictService.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql);
   }
        return list;
    }
   @Override
   public List<String> queryTableDictByKeys(String table, String text, String code, String[] keyArray) {
      return sysDictService.queryTableDictByKeys(table,text,code,Joiner.on(",").join(keyArray));
   }
    @Override
    public List<SysCategoryModel> queryAllSysCategory() {
        List<SysCategory> ls = categoryMapper.selectList(null);
        List<SysCategoryModel> res = oConvertUtils.entityListToModelList(ls, SysCategoryModel.class);
        return res;
    }
   @Override
   public List<ComboModel> queryAllUserBackCombo() {
      List<ComboModel> list = new ArrayList<ComboModel>();
      List<SysUser> userList = userMapper.selectList(new QueryWrapper<SysUser>().eq("status",1).eq("del_flag",0));
      for(SysUser user : userList){
         ComboModel model = new ComboModel();
         model.setTitle(user.getRealname());
         model.setId(user.getId());
         model.setUsername(user.getUsername());
         list.add(model);
      }
      return list;
   }
    @Override
    public List<DictModel> queryFilterTableDictInfo(String table, String text, String code, String filterSql) {
        return sysDictService.queryTableDictItemsByCodeAndFilter(table, text, code, filterSql);
    }
   @Override
   public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize) {
      JSONObject json = new JSONObject();
      QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status",1).eq("del_flag",0);
      List<ComboModel> list = new ArrayList<ComboModel>();
      Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);
      IPage<SysUser> pageList = userMapper.selectPage(page, queryWrapper);
      for(SysUser user : pageList.getRecords()){
         ComboModel model = new ComboModel();
         model.setUsername(user.getUsername());
         model.setTitle(user.getRealname());
         model.setId(user.getId());
         model.setEmail(user.getEmail());
         if(oConvertUtils.isNotEmpty(userIds)){
            String[] temp = userIds.split(",");
            for(int i = 0; i<temp.length;i++){
               if(temp[i].equals(user.getId())){
                  model.setChecked(true);
               }
            }
         }
         list.add(model);
      }
      json.put("list",list);
      json.put("total",pageList.getTotal());
      return json;
   }
    @Override
    public List<String> queryTableDictByKeys(String table, String text, String code, String[] keyArray) {
        return sysDictService.queryTableDictByKeys(table, text, code, Joiner.on(",").join(keyArray));
    }
   @Override
   public List<ComboModel> queryAllRole() {
      List<ComboModel> list = new ArrayList<ComboModel>();
      List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
      for(SysRole role : roleList){
         ComboModel model = new ComboModel();
         model.setTitle(role.getRoleName());
         model.setId(role.getId());
         list.add(model);
      }
      return list;
   }
    @Override
    public List<ComboModel> queryAllUserBackCombo() {
        List<ComboModel> list = new ArrayList<ComboModel>();
        List<SysUser> userList = userMapper.selectList(new QueryWrapper<SysUser>().eq("status", 1).eq("del_flag", 0));
        for (SysUser user : userList) {
            ComboModel model = new ComboModel();
            model.setTitle(user.getRealname());
            model.setId(user.getId());
            model.setUsername(user.getUsername());
            list.add(model);
        }
        return list;
    }
    @Override
    public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize) {
        JSONObject json = new JSONObject();
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status", 1).eq("del_flag", 0);
        List<ComboModel> list = new ArrayList<ComboModel>();
        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);
        IPage<SysUser> pageList = userMapper.selectPage(page, queryWrapper);
        for (SysUser user : pageList.getRecords()) {
            ComboModel model = new ComboModel();
            model.setUsername(user.getUsername());
            model.setTitle(user.getRealname());
            model.setId(user.getId());
            model.setEmail(user.getEmail());
            if (oConvertUtils.isNotEmpty(userIds)) {
                String[] temp = userIds.split(",");
                for (int i = 0; i < temp.length; i++) {
                    if (temp[i].equals(user.getId())) {
                        model.setChecked(true);
                    }
                }
            }
            list.add(model);
        }
        json.put("list", list);
        json.put("total", pageList.getTotal());
        return json;
    }
    //   @Override
    public List<ComboModel> queryAllRole() {
        List<ComboModel> list = new ArrayList<ComboModel>();
        List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
        for (SysRole role : roleList) {
            ComboModel model = new ComboModel();
            model.setTitle(role.getRoleName());
            model.setId(role.getId());
            list.add(model);
        }
        return list;
    }
    @Override
    public List<ComboModel> queryAllRole(String[] roleIds) {
        List<ComboModel> list = new ArrayList<ComboModel>();
        List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
        for(SysRole role : roleList){
        for (SysRole role : roleList) {
            ComboModel model = new ComboModel();
            model.setTitle(role.getRoleName());
            model.setId(role.getId());
            model.setRoleCode(role.getRoleCode());
            if(oConvertUtils.isNotEmpty(roleIds)) {
            if (oConvertUtils.isNotEmpty(roleIds)) {
                for (int i = 0; i < roleIds.length; i++) {
                    if (roleIds[i].equals(role.getId())) {
                        model.setChecked(true);
@@ -681,594 +724,606 @@
        return list;
    }
   @Override
   public List<String> getRoleIdsByUsername(String username) {
      return sysUserRoleMapper.getRoleIdByUserName(username);
   }
    @Override
    public List<String> getRoleIdsByUsername(String username) {
        return sysUserRoleMapper.getRoleIdByUserName(username);
    }
   @Override
   public String getDepartIdsByOrgCode(String orgCode) {
      return departMapper.queryDepartIdByOrgCode(orgCode);
   }
    @Override
    public String getDepartIdsByOrgCode(String orgCode) {
        return departMapper.queryDepartIdByOrgCode(orgCode);
    }
   @Override
   public List<SysDepartModel> getAllSysDepart() {
      List<SysDepartModel> departModelList = new ArrayList<SysDepartModel>();
      List<SysDepart> departList = departMapper.selectList(new QueryWrapper<SysDepart>().eq("del_flag","0"));
      for(SysDepart depart : departList){
         SysDepartModel model = new SysDepartModel();
         BeanUtils.copyProperties(depart,model);
         departModelList.add(model);
      }
      return departModelList;
   }
    @Override
    public List<SysDepartModel> getAllSysDepart() {
        List<SysDepartModel> departModelList = new ArrayList<SysDepartModel>();
        List<SysDepart> departList = departMapper.selectList(new QueryWrapper<SysDepart>().eq("del_flag", "0"));
        for (SysDepart depart : departList) {
            SysDepartModel model = new SysDepartModel();
            BeanUtils.copyProperties(depart, model);
            departModelList.add(model);
        }
        return departModelList;
    }
   @Override
   public DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId) {
      SysDataSource dbSource = dataSourceService.getById(dbSourceId);
      if(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){
         String dbPassword = dbSource.getDbPassword();
         String decodedStr = SecurityUtil.jiemi(dbPassword);
         dbSource.setDbPassword(decodedStr);
      }
      return new DynamicDataSourceModel(dbSource);
   }
    @Override
    public DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId) {
        SysDataSource dbSource = dataSourceService.getById(dbSourceId);
        if (dbSource != null && StringUtils.isNotBlank(dbSource.getDbPassword())) {
            String dbPassword = dbSource.getDbPassword();
            String decodedStr = SecurityUtil.jiemi(dbPassword);
            dbSource.setDbPassword(decodedStr);
        }
        return new DynamicDataSourceModel(dbSource);
    }
   @Override
   public DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode) {
      SysDataSource dbSource = dataSourceService.getOne(new LambdaQueryWrapper<SysDataSource>().eq(SysDataSource::getCode, dbSourceCode));
      if(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){
         String dbPassword = dbSource.getDbPassword();
         String decodedStr = SecurityUtil.jiemi(dbPassword);
         dbSource.setDbPassword(decodedStr);
      }
      return new DynamicDataSourceModel(dbSource);
   }
    @Override
    public DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode) {
        SysDataSource dbSource = dataSourceService.getOne(new LambdaQueryWrapper<SysDataSource>().eq(SysDataSource::getCode, dbSourceCode));
        if (dbSource != null && StringUtils.isNotBlank(dbSource.getDbPassword())) {
            String dbPassword = dbSource.getDbPassword();
            String decodedStr = SecurityUtil.jiemi(dbPassword);
            dbSource.setDbPassword(decodedStr);
        }
        return new DynamicDataSourceModel(dbSource);
    }
   @Override
   public List<String> getDeptHeadByDepId(String deptId) {
      List<SysUser> userList = userMapper.selectList(new QueryWrapper<SysUser>().like("depart_ids",deptId).eq("status",1).eq("del_flag",0));
      List<String> list = new ArrayList<>();
      for(SysUser user : userList){
         list.add(user.getUsername());
      }
      return list;
   }
    @Override
    public List<String> getDeptHeadByDepId(String deptId) {
        List<SysUser> userList = userMapper.selectList(new QueryWrapper<SysUser>().like("depart_ids", deptId).eq("status", 1).eq("del_flag", 0));
        List<String> list = new ArrayList<>();
        for (SysUser user : userList) {
            list.add(user.getUsername());
        }
        return list;
    }
   @Override
   public void sendWebSocketMsg(String[] userIds, String cmd) {
      JSONObject obj = new JSONObject();
      obj.put(WebsocketConst.MSG_CMD, cmd);
      webSocket.sendMessage(userIds, obj.toJSONString());
   }
    @Override
    public void sendWebSocketMsg(String[] userIds, String cmd) {
        JSONObject obj = new JSONObject();
        obj.put(WebsocketConst.MSG_CMD, cmd);
        webSocket.sendMessage(userIds, obj.toJSONString());
    }
   @Override
   public List<LoginUser> queryAllUserByIds(String[] userIds) {
      QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status",1).eq("del_flag",0);
      queryWrapper.in("id",userIds);
      List<LoginUser> loginUsers = new ArrayList<>();
      List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
      for (SysUser user:sysUsers) {
         LoginUser loginUser=new LoginUser();
         BeanUtils.copyProperties(user, loginUser);
         loginUsers.add(loginUser);
      }
      return loginUsers;
   }
    @Override
    public List<LoginUser> queryAllUserByIds(String[] userIds) {
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status", 1).eq("del_flag", 0);
        queryWrapper.in("id", userIds);
        List<LoginUser> loginUsers = new ArrayList<>();
        List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
        for (SysUser user : sysUsers) {
            LoginUser loginUser = new LoginUser();
            BeanUtils.copyProperties(user, loginUser);
            loginUsers.add(loginUser);
        }
        return loginUsers;
    }
   /**
    * 推送签到人员信息
    * @param userId
    */
   @Override
   public void meetingSignWebsocket(String userId) {
      JSONObject obj = new JSONObject();
      obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_SIGN);
      obj.put(WebsocketConst.MSG_USER_ID,userId);
      //TODO 目前全部推送,后面修改
      webSocket.sendMessage(obj.toJSONString());
   }
    /**
     * 推送签到人员信息
     *
     * @param userId
     */
    @Override
    public void meetingSignWebsocket(String userId) {
        JSONObject obj = new JSONObject();
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_SIGN);
        obj.put(WebsocketConst.MSG_USER_ID, userId);
        //TODO 目前全部推送,后面修改
        webSocket.sendMessage(obj.toJSONString());
    }
   @Override
   public List<LoginUser> queryUserByNames(String[] userNames) {
      QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status",1).eq("del_flag",0);
      queryWrapper.in("username",userNames);
      List<LoginUser> loginUsers = new ArrayList<>();
      List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
      for (SysUser user:sysUsers) {
         LoginUser loginUser=new LoginUser();
         BeanUtils.copyProperties(user, loginUser);
         loginUsers.add(loginUser);
      }
      return loginUsers;
   }
    @Override
    public List<LoginUser> queryUserByNames(String[] userNames) {
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq("status", 1).eq("del_flag", 0);
        queryWrapper.in("username", userNames);
        List<LoginUser> loginUsers = new ArrayList<>();
        List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
        for (SysUser user : sysUsers) {
            LoginUser loginUser = new LoginUser();
            BeanUtils.copyProperties(user, loginUser);
            loginUsers.add(loginUser);
        }
        return loginUsers;
    }
   @Override
   public SysDepartModel selectAllById(String id) {
      SysDepart sysDepart = sysDepartService.getById(id);
      SysDepartModel sysDepartModel = new SysDepartModel();
      BeanUtils.copyProperties(sysDepart,sysDepartModel);
      return sysDepartModel;
   }
    @Override
    public SysDepartModel selectAllById(String id) {
        SysDepart sysDepart = sysDepartService.getById(id);
        SysDepartModel sysDepartModel = new SysDepartModel();
        BeanUtils.copyProperties(sysDepart, sysDepartModel);
        return sysDepartModel;
    }
   @Override
   public List<String> queryDeptUsersByUserId(String userId) {
      List<String> userIds = new ArrayList<>();
      List<SysUserDepart> userDepartList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().eq("user_id",userId));
      if(userDepartList != null){
         //查找所属公司
         String orgCodes = "";
         StringBuilder orgCodesBuilder = new StringBuilder();
    @Override
    public List<String> queryDeptUsersByUserId(String userId) {
        List<String> userIds = new ArrayList<>();
        List<SysUserDepart> userDepartList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().eq("user_id", userId));
        if (userDepartList != null) {
            //查找所属公司
            String orgCodes = "";
            StringBuilder orgCodesBuilder = new StringBuilder();
            orgCodesBuilder.append(orgCodes);
         for(SysUserDepart userDepart : userDepartList){
            //查询所属公司编码
            SysDepart depart = sysDepartService.getById(userDepart.getDepId());
            int length = YouBianCodeUtil.ZHANWEI_LENGTH;
            String compyOrgCode = "";
            if(depart != null && depart.getOrgCode() != null){
               compyOrgCode = depart.getOrgCode().substring(0,length);
               if(orgCodes.indexOf(compyOrgCode) == -1){
            for (SysUserDepart userDepart : userDepartList) {
                //查询所属公司编码
                SysDepart depart = sysDepartService.getById(userDepart.getDepId());
                int length = YouBianCodeUtil.ZHANWEI_LENGTH;
                String compyOrgCode = "";
                if (depart != null && depart.getOrgCode() != null) {
                    compyOrgCode = depart.getOrgCode().substring(0, length);
                    if (orgCodes.indexOf(compyOrgCode) == -1) {
                        orgCodesBuilder.append(SymbolConstant.COMMA).append(compyOrgCode);
               }
            }
         }
                    }
                }
            }
            orgCodes = orgCodesBuilder.toString();
         if(oConvertUtils.isNotEmpty(orgCodes)){
            orgCodes = orgCodes.substring(1);
            List<String> listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(","));
            List<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in("dep_id",listIds));
            for(SysUserDepart userDepart : userList){
               if(!userIds.contains(userDepart.getUserId())){
                  userIds.add(userDepart.getUserId());
               }
            }
         }
      }
      return userIds;
   }
            if (oConvertUtils.isNotEmpty(orgCodes)) {
                orgCodes = orgCodes.substring(1);
                List<String> listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(","));
                List<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in("dep_id", listIds));
                for (SysUserDepart userDepart : userList) {
                    if (!userIds.contains(userDepart.getUserId())) {
                        userIds.add(userDepart.getUserId());
                    }
                }
            }
        }
        return userIds;
    }
   /**
    * 查询用户拥有的角色集合
    * @param username
    * @return
    */
   @Override
   public Set<String> getUserRoleSet(String username) {
      // 查询用户拥有的角色集合
      List<String> roles = sysUserRoleMapper.getRoleByUserName(username);
      log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size()));
      return new HashSet<>(roles);
   }
    /**
     * 查询用户拥有的角色集合
     *
     * @param username
     * @return
     */
    @Override
    public Set<String> getUserRoleSet(String username) {
        // 查询用户拥有的角色集合
        List<String> roles = sysUserRoleMapper.getRoleByUserName(username);
        log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size()));
        return new HashSet<>(roles);
    }
   /**
    * 查询用户拥有的权限集合
    * @param username
    * @return
    */
   @Override
   public Set<String> getUserPermissionSet(String username) {
      Set<String> permissionSet = new HashSet<>();
      List<SysPermission> permissionList = sysPermissionMapper.queryByUser(username);
      for (SysPermission po : permissionList) {
    /**
     * 查询用户拥有的权限集合
     *
     * @param username
     * @return
     */
    @Override
    public Set<String> getUserPermissionSet(String username) {
        Set<String> permissionSet = new HashSet<>();
        List<SysPermission> permissionList = sysPermissionMapper.queryByUser(username);
        for (SysPermission po : permissionList) {
//         // TODO URL规则有问题?
//         if (oConvertUtils.isNotEmpty(po.getUrl())) {
//            permissionSet.add(po.getUrl());
//         }
         if (oConvertUtils.isNotEmpty(po.getPerms())) {
            permissionSet.add(po.getPerms());
         }
      }
      log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) );
      return permissionSet;
   }
            if (oConvertUtils.isNotEmpty(po.getPerms())) {
                permissionSet.add(po.getPerms());
            }
        }
        log.info("-------通过数据库读取用户拥有的权限Perms------username: " + username + ",Perms size: " + (permissionSet == null ? 0 : permissionSet.size()));
        return permissionSet;
    }
   /**
    * 判断online菜单是否有权限
    * @param onlineAuthDTO
    * @return
    */
   @Override
   public boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO) {
      String username = onlineAuthDTO.getUsername();
      List<String> possibleUrl = onlineAuthDTO.getPossibleUrl();
      String onlineFormUrl = onlineAuthDTO.getOnlineFormUrl();
      //查询菜单
      LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
      query.eq(SysPermission::getDelFlag, 0);
      query.in(SysPermission::getUrl, possibleUrl);
      List<SysPermission> permissionList = sysPermissionMapper.selectList(query);
      if (permissionList == null || permissionList.size() == 0) {
         //没有配置菜单 找online表单菜单地址
         SysPermission sysPermission = new SysPermission();
         sysPermission.setUrl(onlineFormUrl);
         int count = sysPermissionMapper.queryCountByUsername(username, sysPermission);
         if(count<=0){
            return false;
         }
      } else {
         //找到菜单了
         boolean has = false;
         for (SysPermission p : permissionList) {
            int count = sysPermissionMapper.queryCountByUsername(username, p);
            has = has || (count>0);
         }
         return has;
      }
      return true;
   }
    /**
     * 判断online菜单是否有权限
     *
     * @param onlineAuthDTO
     * @return
     */
    @Override
    public boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO) {
        String username = onlineAuthDTO.getUsername();
        List<String> possibleUrl = onlineAuthDTO.getPossibleUrl();
        String onlineFormUrl = onlineAuthDTO.getOnlineFormUrl();
        //查询菜单
        LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
        query.eq(SysPermission::getDelFlag, 0);
        query.in(SysPermission::getUrl, possibleUrl);
        List<SysPermission> permissionList = sysPermissionMapper.selectList(query);
        if (permissionList == null || permissionList.size() == 0) {
            //没有配置菜单 找online表单菜单地址
            SysPermission sysPermission = new SysPermission();
            sysPermission.setUrl(onlineFormUrl);
            int count = sysPermissionMapper.queryCountByUsername(username, sysPermission);
            if (count <= 0) {
                return false;
            }
        } else {
            //找到菜单了
            boolean has = false;
            for (SysPermission p : permissionList) {
                int count = sysPermissionMapper.queryCountByUsername(username, p);
                has = has || (count > 0);
            }
            return has;
        }
        return true;
    }
   /**
    * 查询用户拥有的角色集合 common api 里面的接口实现
    * @param username
    * @return
    */
   @Override
   public Set<String> queryUserRoles(String username) {
      return getUserRoleSet(username);
   }
    /**
     * 查询用户拥有的角色集合 common api 里面的接口实现
     *
     * @param username
     * @return
     */
    @Override
    public Set<String> queryUserRoles(String username) {
        return getUserRoleSet(username);
    }
   /**
    * 查询用户拥有的权限集合 common api 里面的接口实现
    * @param username
    * @return
    */
   @Override
   public Set<String> queryUserAuths(String username) {
      return getUserPermissionSet(username);
   }
    /**
     * 查询用户拥有的权限集合 common api 里面的接口实现
     *
     * @param username
     * @return
     */
    @Override
    public Set<String> queryUserAuths(String username) {
        return getUserPermissionSet(username);
    }
   /**
    * 36根据多个用户账号(逗号分隔),查询返回多个用户信息
    * @param usernames
    * @return
    */
   @Override
   public List<JSONObject> queryUsersByUsernames(String usernames) {
      LambdaQueryWrapper<SysUser> queryWrapper =  new LambdaQueryWrapper<>();
      queryWrapper.in(SysUser::getUsername,usernames.split(","));
      return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);
   }
    /**
     * 36根据多个用户账号(逗号分隔),查询返回多个用户信息
     *
     * @param usernames
     * @return
     */
    @Override
    public List<JSONObject> queryUsersByUsernames(String usernames) {
        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SysUser::getUsername, usernames.split(","));
        return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);
    }
   @Override
   public List<JSONObject> queryUsersByIds(String ids) {
      LambdaQueryWrapper<SysUser> queryWrapper =  new LambdaQueryWrapper<>();
      queryWrapper.in(SysUser::getId,ids.split(","));
      return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);
   }
    @Override
    public List<JSONObject> queryUsersByIds(String ids) {
        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SysUser::getId, ids.split(","));
        return JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);
    }
   /**
    * 37根据多个部门编码(逗号分隔),查询返回多个部门信息
    * @param orgCodes
    * @return
    */
   @Override
   public List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {
      LambdaQueryWrapper<SysDepart> queryWrapper =  new LambdaQueryWrapper<>();
      queryWrapper.in(SysDepart::getOrgCode,orgCodes.split(","));
      return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);
   }
    /**
     * 37根据多个部门编码(逗号分隔),查询返回多个部门信息
     *
     * @param orgCodes
     * @return
     */
    @Override
    public List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {
        LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SysDepart::getOrgCode, orgCodes.split(","));
        return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);
    }
   @Override
   public List<JSONObject> queryDepartsByIds(String ids) {
      LambdaQueryWrapper<SysDepart> queryWrapper =  new LambdaQueryWrapper<>();
      queryWrapper.in(SysDepart::getId,ids.split(","));
      return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);
   }
    @Override
    public List<JSONObject> queryDepartsByIds(String ids) {
        LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SysDepart::getId, ids.split(","));
        return JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);
    }
   /**
    * 发消息
    * @param fromUser
    * @param toUser
    * @param title
    * @param msgContent
    * @param setMsgCategory
    */
   private void sendSysAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory) {
      SysAnnouncement announcement = new SysAnnouncement();
      announcement.setTitile(title);
      announcement.setMsgContent(msgContent);
      announcement.setSender(fromUser);
      announcement.setPriority(CommonConstant.PRIORITY_M);
      announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
      announcement.setSendStatus(CommonConstant.HAS_SEND);
      announcement.setSendTime(new Date());
      announcement.setMsgCategory(setMsgCategory);
      announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
      sysAnnouncementMapper.insert(announcement);
      // 2.插入用户通告阅读标记表记录
      String userId = toUser;
      String[] userIds = userId.split(",");
      String anntId = announcement.getId();
      for(int i=0;i<userIds.length;i++) {
         if(oConvertUtils.isNotEmpty(userIds[i])) {
            SysUser sysUser = userMapper.getUserByName(userIds[i]);
            if(sysUser==null) {
               continue;
            }
            SysAnnouncementSend announcementSend = new SysAnnouncementSend();
            announcementSend.setAnntId(anntId);
            announcementSend.setUserId(sysUser.getId());
            announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
            sysAnnouncementSendMapper.insert(announcementSend);
            JSONObject obj = new JSONObject();
            obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
            obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
            obj.put(WebsocketConst.MSG_ID, announcement.getId());
            obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
            webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
         }
      }
    /**
     * 发消息
     *
     * @param fromUser
     * @param toUser
     * @param title
     * @param msgContent
     * @param setMsgCategory
     */
    private void sendSysAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory) {
        SysAnnouncement announcement = new SysAnnouncement();
        announcement.setTitile(title);
        announcement.setMsgContent(msgContent);
        announcement.setSender(fromUser);
        announcement.setPriority(CommonConstant.PRIORITY_M);
        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
        announcement.setSendStatus(CommonConstant.HAS_SEND);
        announcement.setSendTime(new Date());
        announcement.setMsgCategory(setMsgCategory);
        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
        sysAnnouncementMapper.insert(announcement);
        // 2.插入用户通告阅读标记表记录
        String userId = toUser;
        String[] userIds = userId.split(",");
        String anntId = announcement.getId();
        for (int i = 0; i < userIds.length; i++) {
            if (oConvertUtils.isNotEmpty(userIds[i])) {
                SysUser sysUser = userMapper.getUserByName(userIds[i]);
                if (sysUser == null) {
                    continue;
                }
                SysAnnouncementSend announcementSend = new SysAnnouncementSend();
                announcementSend.setAnntId(anntId);
                announcementSend.setUserId(sysUser.getId());
                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
                sysAnnouncementSendMapper.insert(announcementSend);
                JSONObject obj = new JSONObject();
                obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
                obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
                obj.put(WebsocketConst.MSG_ID, announcement.getId());
                obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
                webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
            }
        }
   }
    }
   /**
    * 发消息 带业务参数
    * @param fromUser
    * @param toUser
    * @param title
    * @param msgContent
    * @param setMsgCategory
    * @param busType
    * @param busId
    */
   private void sendBusAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory, String busType, String busId) {
      SysAnnouncement announcement = new SysAnnouncement();
      announcement.setTitile(title);
      announcement.setMsgContent(msgContent);
      announcement.setSender(fromUser);
      announcement.setPriority(CommonConstant.PRIORITY_M);
      announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
      announcement.setSendStatus(CommonConstant.HAS_SEND);
      announcement.setSendTime(new Date());
      announcement.setMsgCategory(setMsgCategory);
      announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
      announcement.setBusId(busId);
      announcement.setBusType(busType);
      announcement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());
      announcement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());
      sysAnnouncementMapper.insert(announcement);
      // 2.插入用户通告阅读标记表记录
      String userId = toUser;
      String[] userIds = userId.split(",");
      String anntId = announcement.getId();
      for(int i=0;i<userIds.length;i++) {
         if(oConvertUtils.isNotEmpty(userIds[i])) {
            SysUser sysUser = userMapper.getUserByName(userIds[i]);
            if(sysUser==null) {
               continue;
            }
            SysAnnouncementSend announcementSend = new SysAnnouncementSend();
            announcementSend.setAnntId(anntId);
            announcementSend.setUserId(sysUser.getId());
            announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
            sysAnnouncementSendMapper.insert(announcementSend);
            JSONObject obj = new JSONObject();
            obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
            obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
            obj.put(WebsocketConst.MSG_ID, announcement.getId());
            obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
            webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
         }
      }
   }
    /**
     * 发消息 带业务参数
     *
     * @param fromUser
     * @param toUser
     * @param title
     * @param msgContent
     * @param setMsgCategory
     * @param busType
     * @param busId
     */
    private void sendBusAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory, String busType, String busId) {
        SysAnnouncement announcement = new SysAnnouncement();
        announcement.setTitile(title);
        announcement.setMsgContent(msgContent);
        announcement.setSender(fromUser);
        announcement.setPriority(CommonConstant.PRIORITY_M);
        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
        announcement.setSendStatus(CommonConstant.HAS_SEND);
        announcement.setSendTime(new Date());
        announcement.setMsgCategory(setMsgCategory);
        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
        announcement.setBusId(busId);
        announcement.setBusType(busType);
        announcement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());
        announcement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());
        sysAnnouncementMapper.insert(announcement);
        // 2.插入用户通告阅读标记表记录
        String userId = toUser;
        String[] userIds = userId.split(",");
        String anntId = announcement.getId();
        for (int i = 0; i < userIds.length; i++) {
            if (oConvertUtils.isNotEmpty(userIds[i])) {
                SysUser sysUser = userMapper.getUserByName(userIds[i]);
                if (sysUser == null) {
                    continue;
                }
                SysAnnouncementSend announcementSend = new SysAnnouncementSend();
                announcementSend.setAnntId(anntId);
                announcementSend.setUserId(sysUser.getId());
                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
                sysAnnouncementSendMapper.insert(announcementSend);
                JSONObject obj = new JSONObject();
                obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
                obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
                obj.put(WebsocketConst.MSG_ID, announcement.getId());
                obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
                webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
            }
        }
    }
   /**
    * 发送邮件消息
    * @param email
    * @param title
    * @param content
    */
   @Override
   public void sendEmailMsg(String email, String title, String content) {
         EmailSendMsgHandle emailHandle=new EmailSendMsgHandle();
         emailHandle.sendMsg(email, title, content);
   }
    /**
     * 发送邮件消息
     *
     * @param email
     * @param title
     * @param content
     */
    @Override
    public void sendEmailMsg(String email, String title, String content) {
        EmailSendMsgHandle emailHandle = new EmailSendMsgHandle();
        emailHandle.sendMsg(email, title, content);
    }
   /**
    * 获取公司下级部门和所有用户id信息
    * @param orgCode
    * @return
    */
   @Override
   public List<Map> getDeptUserByOrgCode(String orgCode) {
      //1.获取公司信息
      SysDepart comp=sysDepartService.queryCompByOrgCode(orgCode);
      if(comp!=null){
         //2.获取公司下级部门
         List<SysDepart> departs=sysDepartService.queryDeptByPid(comp.getId());
         //3.获取部门下的人员信息
          List<Map> list=new ArrayList();
          //4.处理部门和下级用户数据
         for (SysDepart dept:departs) {
            Map map=new HashMap(5);
            //部门名称
            String departName = dept.getDepartName();
            //根据部门编码获取下级部门id
            List<String> listIds = departMapper.getSubDepIdsByDepId(dept.getId());
            //根据下级部门ids获取下级部门的所有用户
            List<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in("dep_id",listIds));
            List<String> userIds = new ArrayList<>();
            for(SysUserDepart userDepart : userList){
               if(!userIds.contains(userDepart.getUserId())){
                  userIds.add(userDepart.getUserId());
               }
            }
            map.put("name",departName);
            map.put("ids",userIds);
            list.add(map);
         }
         return list;
      }
      return null;
   }
    /**
     * 获取公司下级部门和所有用户id信息
     *
     * @param orgCode
     * @return
     */
    @Override
    public List<Map> getDeptUserByOrgCode(String orgCode) {
        //1.获取公司信息
        SysDepart comp = sysDepartService.queryCompByOrgCode(orgCode);
        if (comp != null) {
            //2.获取公司下级部门
            List<SysDepart> departs = sysDepartService.queryDeptByPid(comp.getId());
            //3.获取部门下的人员信息
            List<Map> list = new ArrayList();
            //4.处理部门和下级用户数据
            for (SysDepart dept : departs) {
                Map map = new HashMap(5);
                //部门名称
                String departName = dept.getDepartName();
                //根据部门编码获取下级部门id
                List<String> listIds = departMapper.getSubDepIdsByDepId(dept.getId());
                //根据下级部门ids获取下级部门的所有用户
                List<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in("dep_id", listIds));
                List<String> userIds = new ArrayList<>();
                for (SysUserDepart userDepart : userList) {
                    if (!userIds.contains(userDepart.getUserId())) {
                        userIds.add(userDepart.getUserId());
                    }
                }
                map.put("name", departName);
                map.put("ids", userIds);
                list.add(map);
            }
            return list;
        }
        return null;
    }
   /**
    * 查询分类字典翻译
    *
    * @param ids 分类字典表id
    * @return
    */
   @Override
   public List<String> loadCategoryDictItem(String ids) {
      return sysCategoryService.loadDictItem(ids, false);
   }
    /**
     * 查询分类字典翻译
     *
     * @param ids 分类字典表id
     * @return
     */
    @Override
    public List<String> loadCategoryDictItem(String ids) {
        return sysCategoryService.loadDictItem(ids, false);
    }
   /**
    * 根据字典code加载字典text
    *
    * @param dictCode 顺序:tableName,text,code
    * @param keys     要查询的key
    * @return
    */
   @Override
   public List<String> loadDictItem(String dictCode, String keys) {
      String[] params = dictCode.split(",");
      return sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, false);
   }
    /**
     * 根据字典code加载字典text
     *
     * @param dictCode 顺序:tableName,text,code
     * @param keys     要查询的key
     * @return
     */
    @Override
    public List<String> loadDictItem(String dictCode, String keys) {
        String[] params = dictCode.split(",");
        return sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, false);
    }
   /**
    * 根据字典code查询字典项
    *
    * @param dictCode 顺序:tableName,text,code
    * @param dictCode 要查询的key
    * @return
    */
   @Override
   public List<DictModel> getDictItems(String dictCode) {
      List<DictModel> ls = sysDictService.getDictItems(dictCode);
      if (ls == null) {
         ls = new ArrayList<>();
      }
      return ls;
   }
    /**
     * 根据字典code查询字典项
     *
     * @param dictCode 顺序:tableName,text,code
     * @param dictCode 要查询的key
     * @return
     */
    @Override
    public List<DictModel> getDictItems(String dictCode) {
        List<DictModel> ls = sysDictService.getDictItems(dictCode);
        if (ls == null) {
            ls = new ArrayList<>();
        }
        return ls;
    }
   /**
    * 根据多个字典code查询多个字典项
    *
    * @param dictCodeList
    * @return key = dictCode ; value=对应的字典项
    */
   @Override
   public Map<String, List<DictModel>> getManyDictItems(List<String> dictCodeList) {
      return sysDictService.queryDictItemsByCodeList(dictCodeList);
   }
    /**
     * 根据多个字典code查询多个字典项
     *
     * @param dictCodeList
     * @return key = dictCode ; value=对应的字典项
     */
    @Override
    public Map<String, List<DictModel>> getManyDictItems(List<String> dictCodeList) {
        return sysDictService.queryDictItemsByCodeList(dictCodeList);
    }
   /**
    * 【下拉搜索】
    * 大数据量的字典表 走异步加载,即前端输入内容过滤数据
    *
    * @param dictCode 字典code格式:table,text,code
    * @param keyword  过滤关键字
    * @return
    */
   @Override
   public List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageSize) {
      return sysDictService.loadDict(dictCode, keyword, pageSize);
   }
    /**
     * 【下拉搜索】
     * 大数据量的字典表 走异步加载,即前端输入内容过滤数据
     *
     * @param dictCode 字典code格式:table,text,code
     * @param keyword  过滤关键字
     * @return
     */
    @Override
    public List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageSize) {
        return sysDictService.loadDict(dictCode, keyword, pageSize);
    }
   @Override
   public Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys) {
      List<String> dictCodeList = Arrays.asList(dictCodes.split(","));
      List<String> values = Arrays.asList(keys.split(","));
      return sysDictService.queryManyDictByKeys(dictCodeList, values);
   }
    @Override
    public Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys) {
        List<String> dictCodeList = Arrays.asList(dictCodes.split(","));
        List<String> values = Arrays.asList(keys.split(","));
        return sysDictService.queryManyDictByKeys(dictCodeList, values);
    }
   @Override
   public List<DictModel> translateDictFromTableByKeys(String table, String text, String code, String keys) {
      return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(",")));
   }
    @Override
    public List<DictModel> translateDictFromTableByKeys(String table, String text, String code, String keys) {
        return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(",")));
    }
   //-------------------------------------流程节点发送模板消息-----------------------------------------------
   @Autowired
   private QywxSendMsgHandle qywxSendMsgHandle;
    //-------------------------------------流程节点发送模板消息-----------------------------------------------
    @Autowired
    private QywxSendMsgHandle qywxSendMsgHandle;
   @Autowired
   private SystemSendMsgHandle systemSendMsgHandle;
    @Autowired
    private SystemSendMsgHandle systemSendMsgHandle;
   @Autowired
   private EmailSendMsgHandle emailSendMsgHandle;
    @Autowired
    private EmailSendMsgHandle emailSendMsgHandle;
   @Autowired
   private DdSendMsgHandle ddSendMsgHandle;
    @Autowired
    private DdSendMsgHandle ddSendMsgHandle;
   @Override
   public void sendTemplateMessage(MessageDTO message) {
      String messageType = message.getType();
      //update-begin-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
      String templateCode = message.getTemplateCode();
      if(oConvertUtils.isNotEmpty(templateCode)){
         SysMessageTemplate templateEntity = getTemplateEntity(templateCode);
         boolean isMarkdown = CommonConstant.MSG_TEMPLATE_TYPE_MD.equals(templateEntity.getTemplateType());
         String content = templateEntity.getTemplateContent();
         if(oConvertUtils.isNotEmpty(content) && null!=message.getData()){
            content = FreemarkerParseFactory.parseTemplateContent(content, message.getData(), isMarkdown);
         }
         message.setIsMarkdown(isMarkdown);
         message.setContent(content);
      }
      if(oConvertUtils.isEmpty(message.getContent())){
         throw new JeecgBootException("发送消息失败,消息内容为空!");
      }
      //update-end-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
      if(MessageTypeEnum.XT.getType().equals(messageType)){
         if (message.isMarkdown()) {
            // 系统消息要解析Markdown
            message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
         }
         systemSendMsgHandle.sendMessage(message);
      }else if(MessageTypeEnum.YJ.getType().equals(messageType)){
         if (message.isMarkdown()) {
            // 邮件消息要解析Markdown
            message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
         }
         emailSendMsgHandle.sendMessage(message);
      }else if(MessageTypeEnum.DD.getType().equals(messageType)){
         ddSendMsgHandle.sendMessage(message);
      }else if(MessageTypeEnum.QYWX.getType().equals(messageType)){
         qywxSendMsgHandle.sendMessage(message);
      }
   }
    @Override
    public void sendTemplateMessage(MessageDTO message) {
        String messageType = message.getType();
        //update-begin-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
        String templateCode = message.getTemplateCode();
        if (oConvertUtils.isNotEmpty(templateCode)) {
            SysMessageTemplate templateEntity = getTemplateEntity(templateCode);
            boolean isMarkdown = CommonConstant.MSG_TEMPLATE_TYPE_MD.equals(templateEntity.getTemplateType());
            String content = templateEntity.getTemplateContent();
            if (oConvertUtils.isNotEmpty(content) && null != message.getData()) {
                content = FreemarkerParseFactory.parseTemplateContent(content, message.getData(), isMarkdown);
            }
            message.setIsMarkdown(isMarkdown);
            message.setContent(content);
        }
        if (oConvertUtils.isEmpty(message.getContent())) {
            throw new JeecgBootException("发送消息失败,消息内容为空!");
        }
        //update-end-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
        if (MessageTypeEnum.XT.getType().equals(messageType)) {
            if (message.isMarkdown()) {
                // 系统消息要解析Markdown
                message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
            }
            systemSendMsgHandle.sendMessage(message);
        } else if (MessageTypeEnum.YJ.getType().equals(messageType)) {
            if (message.isMarkdown()) {
                // 邮件消息要解析Markdown
                message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
            }
            emailSendMsgHandle.sendMessage(message);
        } else if (MessageTypeEnum.DD.getType().equals(messageType)) {
            ddSendMsgHandle.sendMessage(message);
        } else if (MessageTypeEnum.QYWX.getType().equals(messageType)) {
            qywxSendMsgHandle.sendMessage(message);
        }
    }
   @Override
   public String getTemplateContent(String code) {
      List<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);
      if(list==null || list.size()==0){
         return null;
      }
      return list.get(0).getTemplateContent();
   }
    @Override
    public String getTemplateContent(String code) {
        List<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);
        if (list == null || list.size() == 0) {
            return null;
        }
        return list.get(0).getTemplateContent();
    }
   /**
    * 获取模板内容,解析markdown
    *
    * @param code
    * @return
    */
   public SysMessageTemplate getTemplateEntity(String code) {
      List<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);
      if (list == null || list.size() == 0) {
         return null;
      }
      return list.get(0);
   }
    /**
     * 获取模板内容,解析markdown
     *
     * @param code
     * @return
     */
    public SysMessageTemplate getTemplateEntity(String code) {
        List<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);
        if (list == null || list.size() == 0) {
            return null;
        }
        return list.get(0);
    }
   //-------------------------------------流程节点发送模板消息-----------------------------------------------
    //-------------------------------------流程节点发送模板消息-----------------------------------------------
   @Override
   public void saveDataLog(DataLogDTO dataLogDto) {
      SysDataLog entity = new SysDataLog();
      entity.setDataTable(dataLogDto.getTableName());
      entity.setDataId(dataLogDto.getDataId());
      entity.setDataContent(dataLogDto.getContent());
      entity.setType(dataLogDto.getType());
      entity.setDataVersion("1");
      sysDataLogService.save(entity);
   }
    @Override
    public void saveDataLog(DataLogDTO dataLogDto) {
        SysDataLog entity = new SysDataLog();
        entity.setDataTable(dataLogDto.getTableName());
        entity.setDataId(dataLogDto.getDataId());
        entity.setDataContent(dataLogDto.getContent());
        entity.setType(dataLogDto.getType());
        entity.setDataVersion("1");
        sysDataLogService.save(entity);
    }
    @Override
    public void addSysFiles(SysFilesModel sysFilesModel) {
        SysFiles sysFiles = new SysFiles();
        BeanUtils.copyProperties(sysFilesModel,sysFiles);
        BeanUtils.copyProperties(sysFilesModel, sysFiles);
        String defaultValue = "0";
        sysFiles.setIzStar(defaultValue);
        sysFiles.setIzFolder(defaultValue);
@@ -1290,11 +1345,180 @@
        sysUserService.updateById(sysUser);
    }
   @Override
   public void sendAppChatSocket(String userId) {
      JSONObject obj = new JSONObject();
      obj.put(WebsocketConst.MSG_CMD, WebsocketConst.MSG_CHAT);
      obj.put(WebsocketConst.MSG_USER_ID, userId);
      webSocket.sendMessage(userId, obj.toJSONString());
   }
    @Override
    public void sendAppChatSocket(String userId) {
        JSONObject obj = new JSONObject();
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.MSG_CHAT);
        obj.put(WebsocketConst.MSG_USER_ID, userId);
        webSocket.sendMessage(userId, obj.toJSONString());
    }
    @Override
    public List<SysUploadRela> listByBusIdAndBusType(String busId, String busType) {
        return uploadRelaService.listByBusIdAndBusType(busId, busType);
    }
    @Override
    public SysUpload getUploadById(String id) {
        return uploadService.getById(id);
    }
    @Override
    public boolean saveOrUpdateBatchUploadRela(List<SysUploadRela> sysUploadRelaList) {
        return uploadRelaService.saveOrUpdateBatch(sysUploadRelaList);
    }
    @Override
    public boolean updateBatchUploadById(List<SysUpload> sysUploadList) {
        return uploadService.updateBatchById(sysUploadList);
    }
    @Override
    public List<SysUpload> batchUploadFile(String fileType, List<MultipartFile> multipartFileList, String description) throws Exception {
        return uploadService.batchUploadFile(fileType, multipartFileList, description);
    }
    @Override
    public void saveOrUpdateUploadRale(String busId, String busType, String uploadId) {
        uploadRelaService.saveOrUpdateUploadRale(busId, busType, uploadId);
    }
    @Override
    public void removeDataVersionByBusinessId(String businessId) {
        dataVersionService.removeDataVersionByBusinessId(businessId);
    }
    @Override
    public void removeUploadById(String id) {
        uploadService.removeById(id);
    }
    @Override
    public void removeUploadRelaById(String id) {
        uploadRelaService.removeById(id);
    }
    @Override
    public void delSysUploadRelaByBusIdAndBusType(String busId, String busType) {
        uploadRelaService.delSysUploadRelaByBusIdAndBusType(busId, busType);
    }
    @Override
    public String getUnitNameById(String unitId) {
        Unit unit = unitService.getById(unitId);
        String unitName = "";
        if(unit != null){
            unitName = unit.getName();
        }
        return unitName;
    }
    @Override
    public String queryDictTextByKey(String dictCode, String key) {
        return sysDictService.queryDictTextByKey(dictCode, key);
    }
    @Override
    public String getVersionStatusByVersionAndBusinessType(Integer version, String businessType) {
        return dataVersionService.getVersionStatusByVersionAndBusinessType(version, businessType);
    }
    @Override
    public void saveDataVersion(DataVersion dataVersion) {
        dataVersionService.save(dataVersion);
    }
    @Override
    public DataVersion getDataVersionByBusinessId(String id) {
        return dataVersionService.getById(id);
    }
    @Override
    public void removeDataVersionById(String id) {
        dataVersionService.removeById(id);
    }
    /**
     * 根据企业ID获取企业名称
     *
     * @param enterpriseId
     * @return
     */
    @Override
    public String getEnterpriseNameById(String enterpriseId) {
        String enterpriseName = enterpriseService.getById(enterpriseId).getName();
        return enterpriseName;
    }
    @Override
    public List<DataVersion> getLastDataVersion(String businessType, String enterpriseId, String isLastusable) {
        List<DataVersion> dataVersionList = dataVersionService.getLastDataVersion(businessType, enterpriseId, isLastusable);
        return dataVersionList;
    }
    @Override
    public List<DataVersion> getDataVersionList(String businessType, String enterpriseId, String versionStatus, String version) {
        List<DataVersion> dataVersionList = dataVersionService.getDataVersionList(businessType, enterpriseId, versionStatus, version);
        return dataVersionList;
    }
    @Override
    public void removeDataVersionByIds(String ids) {
        dataVersionService.removeBatchByIds(Arrays.asList(ids.split(",")));
    }
    @Override
    public void updateBatchDataVersion(List<DataVersion> dataVersionList) {
        dataVersionService.saveOrUpdateBatch(dataVersionList);
    }
    @Override
    public void closeJobByClassName(String className) {
        QuartzJob quartzJob = quartzJobService.getOne(new QueryWrapper<QuartzJob>().eq("job_class_name", className), true);
        if (ObjectUtils.isNotNull(quartzJob)) {
            quartzJobService.deleteAndStopJob(quartzJob);
        }
    }
    @Override
    public void sendAnnouncement(String fromUser, String toUser, String title, String msgContent) {
        SysAnnouncement announcement = new SysAnnouncement();
        announcement.setTitile(title);
        announcement.setMsgContent(msgContent);
        announcement.setSender(fromUser);
        announcement.setPriority(CommonConstant.PRIORITY_M);
        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
        announcement.setSendStatus(CommonConstant.HAS_SEND);
        announcement.setSendTime(new Date());
        announcement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);
        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
        sysAnnouncementMapper.insert(announcement);
        // 2.插入用户通告阅读标记表记录
        String userId = toUser;
        String[] userIds = userId.split(",");
        String anntId = announcement.getId();
        for (int i = 0; i < userIds.length; i++) {
            if (oConvertUtils.isNotEmpty(userIds[i])) {
                SysUser sysUser = userMapper.getUserByName(userIds[i]);
                if (sysUser == null) {
                    continue;
                }
                SysAnnouncementSend announcementSend = new SysAnnouncementSend();
                announcementSend.setAnntId(anntId);
                announcementSend.setUserId(sysUser.getId());
                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
                sysAnnouncementSendMapper.insert(announcementSend);
                JSONObject obj = new JSONObject();
                obj.put("cmd", "user");
                obj.put("userId", sysUser.getId());
                obj.put("msgId", announcement.getId());
                obj.put("msgTxt", announcement.getTitile());
                webSocket.sendOneMessage(sysUser.getId(), obj.toJSONString());
            }
        }
    }
}