diff --git a/.gitignore b/.gitignore index f7e65b4f..d498a38e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ rebel.xml ## front **/*.lock -os_del.cmd \ No newline at end of file +os_del.cmd +os_del_doc.cmd +.svn diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java index 97823987..516cc60d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java @@ -117,14 +117,17 @@ public interface CommonAPI { */ Map> translateManyDict(String dictCodes, String keys); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 15 字典表的 翻译,可批量 * @param table * @param text * @param code * @param keys 多个用逗号分割 + * @param dataSource 数据源 * @return */ - List translateDictFromTableByKeys(String table, String text, String code, String keys); + List translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java index c5c28974..cc3d8b2a 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java @@ -140,11 +140,15 @@ public class DictAspect { String code = field.getAnnotation(Dict.class).dicCode(); String text = field.getAnnotation(Dict.class).dicText(); String table = field.getAnnotation(Dict.class).dictTable(); - + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + String dataSource = field.getAnnotation(Dict.class).ds(); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ List dataList; String dictCode = code; if (!StringUtils.isEmpty(table)) { - dictCode = String.format("%s,%s,%s", table, text, code); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + dictCode = String.format("%s,%s,%s,%s", table, text, code, dataSource); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ } dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>()); this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(","))); @@ -169,10 +173,15 @@ public class DictAspect { String code = field.getAnnotation(Dict.class).dicCode(); String text = field.getAnnotation(Dict.class).dicText(); String table = field.getAnnotation(Dict.class).dictTable(); - + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + // 自定义的字典表数据源 + String dataSource = field.getAnnotation(Dict.class).ds(); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ String fieldDictCode = code; if (!StringUtils.isEmpty(table)) { - fieldDictCode = String.format("%s,%s,%s", table, text, code); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + fieldDictCode = String.format("%s,%s,%s,%s", table, text, code, dataSource); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ } String value = record.getString(field.getName()); @@ -274,9 +283,18 @@ public class DictAspect { String[] arr = dictCode.split(","); String table = arr[0], text = arr[1], code = arr[2]; String values = String.join(",", needTranslDataTable); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + // 自定义的数据源 + String dataSource = null; + if (arr.length > 3) { + dataSource = arr[3]; + } + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ log.debug("translateDictFromTableByKeys.dictCode:" + dictCode); log.debug("translateDictFromTableByKeys.values:" + values); - List texts = commonApi.translateDictFromTableByKeys(table, text, code, values); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + List texts = commonApi.translateDictFromTableByKeys(table, text, code, values, dataSource); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ log.debug("translateDictFromTableByKeys.result:" + texts); List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); list.addAll(texts); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java index 871ff447..2fdb582d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java @@ -39,4 +39,16 @@ public @interface Dict { * @return 返回类型: String */ String dictTable() default ""; + + + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + /** + * 方法描述: 数据字典表所在数据源名称 + * 作 者: chenrui + * 日 期: 2023年12月20日-下午4:58 + * + * @return 返回类型: String + */ + String ds() default ""; + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 57442a7e..aee67a3f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -69,6 +69,8 @@ public interface CommonConstant { /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ Integer SC_INTERNAL_SERVER_ERROR_500 = 500; + /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */ + Integer SC_INTERNAL_NOT_FOUND_404 = 404; /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ Integer SC_OK_200 = 200; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java index 851089bc..2796a841 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java @@ -17,6 +17,9 @@ public interface DataBaseConstant { /**postgreSQL达梦数据库*/ public static final String DB_TYPE_POSTGRESQL = "POSTGRESQL"; + + /**人大金仓数据库*/ + public static final String DB_TYPE_KINGBASEES = "KINGBASEES"; /**sqlserver数据库*/ public static final String DB_TYPE_SQLSERVER = "SQLSERVER"; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java index fe0706c0..4b57f43e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java @@ -1,5 +1,7 @@ package org.jeecg.common.exception; +import org.jeecg.common.constant.CommonConstant; + /** * @Description: jeecg-boot自定义异常 * @author: jeecg-boot @@ -7,10 +9,24 @@ package org.jeecg.common.exception; public class JeecgBootException extends RuntimeException { private static final long serialVersionUID = 1L; + /** + * 返回给前端的错误code + */ + private int errCode = CommonConstant.SC_INTERNAL_SERVER_ERROR_500; + public JeecgBootException(String message){ super(message); } - + + public JeecgBootException(String message, int errCode){ + super(message); + this.errCode = errCode; + } + + public int getErrCode() { + return errCode; + } + public JeecgBootException(Throwable cause) { super(cause); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java index 82e19cf9..0c246f51 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java @@ -33,7 +33,7 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(JeecgBootException.class) public Result handleJeecgBootException(JeecgBootException e){ log.error(e.getMessage(), e); - return Result.error(e.getMessage()); + return Result.error(e.getErrCode(), e.getMessage()); } /** diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java index fbd328d9..b95347fc 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java @@ -302,7 +302,7 @@ public class CommonUtils { DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE; }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER)>=0||dbType.indexOf(sqlserver)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER; - }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL)>=0) { + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL)>=0 || dbType.indexOf(DataBaseConstant.DB_TYPE_KINGBASEES)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL; }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java index 725fa938..de2dd387 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java @@ -29,6 +29,17 @@ public class SqlInjectionUtil { * 字典专用—sql注入关键词 */ private static String specialDictSqlXssStr = "exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|+|--"; + /** + * 完整匹配的key,不需要考虑前空格 + */ + private static List FULL_MATCHING_KEYWRODS = new ArrayList<>(); + static { + FULL_MATCHING_KEYWRODS.add(";"); + FULL_MATCHING_KEYWRODS.add("+"); + FULL_MATCHING_KEYWRODS.add("--"); + } + + /** * sql注入风险的 正则关键字 * @@ -50,6 +61,8 @@ public class SqlInjectionUtil { * sql注释的正则 */ private final static Pattern SQL_ANNOTATION = Pattern.compile("/\\*[\\s\\S]*\\*/"); + private final static String SQL_ANNOTATION2 = "--"; + /** * sql注入提示语 */ @@ -128,7 +141,13 @@ public class SqlInjectionUtil { if (sql.startsWith(keyword.trim())) { return true; } else if (sql.contains(keyword)) { - if (sql.contains(" " + keyword)) { + // 需要匹配的,sql注入关键词 + String matchingText = " " + keyword; + if(FULL_MATCHING_KEYWRODS.contains(keyword)){ + matchingText = keyword; + } + + if (sql.contains(matchingText)) { return true; } else { String regularStr = "\\s+\\S+" + keyword; @@ -244,6 +263,13 @@ public class SqlInjectionUtil { * @return */ public static void checkSqlAnnotation(String str){ + if(str.contains(SQL_ANNOTATION2)){ + String error = "请注意,SQL中不允许含注释,有安全风险!"; + log.error(error); + throw new RuntimeException(error); + } + + Matcher matcher = SQL_ANNOTATION.matcher(str); if(matcher.find()){ String error = "请注意,值可能存在SQL注入风险---> \\*.*\\"; @@ -260,7 +286,7 @@ public class SqlInjectionUtil { * * @param table */ - private static Pattern tableNamePattern = Pattern.compile("^[a-zA-Z][a-zA-Z0-9_]{0,63}$"); + private static Pattern tableNamePattern = Pattern.compile("^[a-zA-Z][a-zA-Z0-9_\\$]{0,63}$"); public static String getSqlInjectTableName(String table) { if(oConvertUtils.isEmpty(table)){ return table; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java index 6e821a99..1a78fc54 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java @@ -61,6 +61,10 @@ public class SsrfFileTypeFilter { FILE_TYPE_WHITE_LIST.add("7z"); FILE_TYPE_WHITE_LIST.add("tar"); + //app文件后缀 + FILE_TYPE_WHITE_LIST.add("apk"); + FILE_TYPE_WHITE_LIST.add("wgt"); + //设置禁止文件的头部标记 FILE_TYPE_MAP.put("3c25402070616765206c", "jsp"); FILE_TYPE_MAP.put("3c3f7068700a0a2f2a2a0a202a205048", "php"); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java index af51cb9e..66dbf2eb 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java @@ -31,7 +31,7 @@ public class WebSocketConfig { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(websocketFilter()); //TODO 临时注释掉,测试下线上socket总断的问题 - bean.addUrlPatterns("/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*"); + bean.addUrlPatterns("/taskCountSocket/*", "/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*"); return bean; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 4ca3ddf5..6a274a62 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -17,12 +17,12 @@ import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean; import org.jeecg.config.shiro.filters.JwtFilter; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.core.env.Environment; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import redis.clients.jedis.HostAndPort; @@ -31,7 +31,6 @@ import redis.clients.jedis.JedisCluster; import javax.annotation.Resource; import javax.servlet.Filter; import java.util.*; -import java.util.stream.Collectors; /** * @author: Scott @@ -76,6 +75,7 @@ public class ShiroConfig { } } } + // 配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas验证登录 filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //登录验证码接口排除 @@ -94,6 +94,9 @@ public class ShiroConfig { filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码 filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览 + + //filterChainDefinitionMap.put("/sys/common/view/**", "anon");//图片预览不限制token + //filterChainDefinitionMap.put("/sys/common/download/**", "anon");//文件下载不限制token filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件 filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //登录二维码 @@ -101,6 +104,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //授权接口排除 + //update-begin--Author:scott Date:20221116 for:排除静态资源后缀 filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/doc.html", "anon"); filterChainDefinitionMap.put("/**/*.js", "anon"); @@ -115,16 +119,17 @@ public class ShiroConfig { filterChainDefinitionMap.put("/**/*.ttf", "anon"); filterChainDefinitionMap.put("/**/*.woff", "anon"); filterChainDefinitionMap.put("/**/*.woff2", "anon"); + //update-end--Author:scott Date:20221116 for:排除静态资源后缀 filterChainDefinitionMap.put("/druid/**", "anon"); filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger**/**", "anon"); filterChainDefinitionMap.put("/webjars/**", "anon"); filterChainDefinitionMap.put("/v2/**", "anon"); - // 企业微信证书排除 - filterChainDefinitionMap.put("/WW_verify*", "anon"); - + + // update-begin--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP) filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon"); + // update-end--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP) //积木报表排除 filterChainDefinitionMap.put("/jmreport/**", "anon"); @@ -155,10 +160,10 @@ public class ShiroConfig { //测试模块排除 filterChainDefinitionMap.put("/test/seata/**", "anon"); - // update-begin--author:liusq Date:20230522 for:[issues/4829]访问不存在的url时会提示Token失效,请重新登录呢 //错误路径排除 filterChainDefinitionMap.put("/error", "anon"); - // update-end--author:liusq Date:20230522 for:[issues/4829]访问不存在的url时会提示Token失效,请重新登录呢 + // 企业微信证书排除 + filterChainDefinitionMap.put("/WW_verify*", "anon"); // 添加自己的过滤器并且取名为jwt Map filterMap = new HashMap(1); @@ -253,8 +258,7 @@ public class ShiroConfig { public IRedisManager redisManager() { log.info("===============(2)创建RedisManager,连接Redis.."); IRedisManager manager; - - // sentinel cluster redis + // sentinel cluster redis(【issues/5569】shiro集成 redis 不支持 sentinel 方式部署的redis集群 #5569) if (Objects.nonNull(redisProperties) && Objects.nonNull(redisProperties.getSentinel()) && !CollectionUtils.isEmpty(redisProperties.getSentinel().getNodes())) { @@ -266,6 +270,7 @@ public class ShiroConfig { return sentinelManager; } + // redis 单机支持,在集群为空,或者集群无机器时候使用 add by jzyadmin@163.com if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) { RedisManager redisManager = new RedisManager(); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Firewall.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Firewall.java index 93de7f35..6138dec8 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Firewall.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Firewall.java @@ -35,4 +35,5 @@ public class Firewall { public void setLowCodeMode(String lowCodeMode) { this.lowCodeMode = lowCodeMode; } + } diff --git a/jeecg-boot-base-core/src/main/resources/templates/email/bpm_new_task_email.ftl b/jeecg-boot-base-core/src/main/resources/templates/email/bpm_new_task_email.ftl index f9f2921e..eadb60c5 100644 --- a/jeecg-boot-base-core/src/main/resources/templates/email/bpm_new_task_email.ftl +++ b/jeecg-boot-base-core/src/main/resources/templates/email/bpm_new_task_email.ftl @@ -56,7 +56,7 @@

- Copyright © 2023-2024 北京国炬科技股份有限公司. 保留所有权利。 + Copyright © 2023-2024 北京国炬信息技术有限公司. 保留所有权利。

邮件由系统自动发送,请勿直接回复本邮件! diff --git a/jeecg-boot-base-core/src/main/resources/templates/email/desform_new_data_email.ftl b/jeecg-boot-base-core/src/main/resources/templates/email/desform_new_data_email.ftl index 56fdc99d..89a50704 100644 --- a/jeecg-boot-base-core/src/main/resources/templates/email/desform_new_data_email.ftl +++ b/jeecg-boot-base-core/src/main/resources/templates/email/desform_new_data_email.ftl @@ -6,7 +6,10 @@

-
【重要】新数据提醒
+ +
+ 【重要】新数据提醒 +
@@ -23,12 +26,12 @@ [查看所有数据]

- +

- Copyright © 2023-2024 北京国炬科技股份有限公司. 保留所有权利。 + Copyright © 2023-2024 北京敲敲云科技有限公司. 保留所有权利。

邮件由系统自动发送,请勿直接回复本邮件! @@ -46,6 +49,8 @@ } .info-top{ + display: flex; + align-items: center; padding: 15px 25px; border-top-left-radius: 10px; border-top-right-radius: 10px; diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java index 4688694c..28a35ed0 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java @@ -24,7 +24,7 @@ public class JcloudDemoProviderController { private JcloudDemoService jcloudDemoService; @GetMapping("/getMessage") - public String getMessage(@RequestParam String name) { + public String getMessage(@RequestParam(name = "name") String name) { String msg = jcloudDemoService.getMessage(name); log.info(" 微服务被调用:{} ",msg); return msg; diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java index 58b177f0..b0c1b6c5 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java @@ -45,11 +45,11 @@ public class JeecgDemo extends JeecgEntity implements Serializable { private java.util.Date punchTime; /** 工资 */ @ApiModelProperty(value = "工资",example = "0") - @Excel(name="工资",width=15) + @Excel(name="工资",type = 4,width=15) private java.math.BigDecimal salaryMoney; /** 奖金 */ @ApiModelProperty(value = "奖金",example = "0") - @Excel(name="奖金",width=15) + @Excel(name="奖金",type = 4,width=15) private java.lang.Double bonusMoney; /** 性别 {男:1,女:2} */ @ApiModelProperty(value = "性别") @@ -57,7 +57,7 @@ public class JeecgDemo extends JeecgEntity implements Serializable { private java.lang.String sex; /** 年龄 */ @ApiModelProperty(value = "年龄",example = "0") - @Excel(name="年龄",width=15) + @Excel(name="年龄",type = 4,width=15) private java.lang.Integer age; /** 生日 */ @ApiModelProperty(value = "生日") diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index f7f84a32..2e84043e 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -94,6 +94,22 @@ public interface ISysBaseAPI extends CommonAPI { @GetMapping("/sys/api/getDepartIdsByUsername") List getDepartIdsByUsername(@RequestParam("username") String username); + /** + * 8.2 通过用户账号查询部门父ID集合 + * @param username + * @return 部门 parentIds + */ + @GetMapping("/sys/api/getDepartParentIdsByUsername") + Set getDepartParentIdsByUsername(@RequestParam("username")String username); + + /** + * 8.3 查询部门父ID集合 + * @param depIds + * @return 部门 parentIds + */ + @GetMapping("/sys/api/getDepartParentIdsByDepIds") + Set getDepartParentIdsByDepIds(@RequestParam("depIds") Set depIds); + /** * 9通过用户账号查询部门 name * @param username @@ -481,6 +497,14 @@ public interface ISysBaseAPI extends CommonAPI { @GetMapping("/sys/api/loadCategoryDictItem") List loadCategoryDictItem(@RequestParam("ids") String ids); + /** + * 44 反向翻译分类字典,用于导入 + * + * @param names 名称,逗号分割 + */ + @GetMapping("/sys/api/loadCategoryDictItemByNames") + List loadCategoryDictItemByNames(@RequestParam("names") String names, @RequestParam("delNotExist") boolean delNotExist); + /** * 43 根据字典code加载字典text * @@ -551,17 +575,20 @@ public interface ISysBaseAPI extends CommonAPI { @GetMapping("/sys/api/translateManyDict") Map> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 49 字典表的 翻译,可批量 * @param table * @param text * @param code * @param keys 多个用逗号分割 + * @param ds * @return */ @Override @GetMapping("/sys/api/translateDictFromTableByKeys") - List translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys); + List translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys, @RequestParam("ds") String ds); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 发送模板消息 diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java index c2907745..2a22be11 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java @@ -65,6 +65,16 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public Set getDepartParentIdsByUsername(String username) { + return null; + } + + @Override + public Set getDepartParentIdsByDepIds(Set depIds) { + return null; + } + @Override public List getDepartNamesByUsername(String username) { return null; @@ -275,10 +285,12 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ @Override - public List translateDictFromTableByKeys(String table, String text, String code, String keys) { + public List translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource) { return null; } + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ @Override public void sendTemplateMessage(MessageDTO message) { @@ -319,6 +331,11 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public List loadCategoryDictItemByNames(String names, boolean delNotExist) { + return null; + } + @Override public List loadDictItem(String dictCode, String keys) { return null; diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 6dc8826a..63b72406 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -89,6 +89,20 @@ public interface ISysBaseAPI extends CommonAPI { */ List getDepartIdsByUsername(String username); + /** + * 8.2 通过用户账号查询部门父ID集合 + * @param username + * @return 部门 parentIds + */ + Set getDepartParentIdsByUsername(String username); + + /** + * 8.2 查询部门父ID集合 + * @param depIds + * @return 部门 parentIds + */ + Set getDepartParentIdsByDepIds(Set depIds); + /** * 9通过用户账号查询部门 name * @param username @@ -373,6 +387,13 @@ public interface ISysBaseAPI extends CommonAPI { */ List loadCategoryDictItem(String ids); + /** + * 反向翻译分类字典,用于导入 + * + * @param names 名称,逗号分割 + */ + List loadCategoryDictItemByNames(String names, boolean delNotExist); + /** * 根据字典code加载字典text * diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java index 4e79a5e5..9ca8dc32 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java @@ -140,6 +140,26 @@ public class SystemApiController { return sysBaseApi.getDepartIdsByUsername(username); } + /** + * 通过用户账号查询部门父ID集合 + * @param username + * @return 部门 id + */ + @GetMapping("/getDepartParentIdsByUsername") + Set getDepartParentIdsByUsername(@RequestParam("username") String username){ + return sysBaseApi.getDepartParentIdsByUsername(username); + } + + /** + * 查询部门父ID集合 + * @param depIds + * @return 部门 id + */ + @GetMapping("/getDepartParentIdsByDepIds") + Set getDepartParentIdsByDepIds(@RequestParam("depIds") Set depIds){ + return sysBaseApi.getDepartParentIdsByDepIds(depIds); + } + /** * 通过用户账号查询部门 name * @param username @@ -527,6 +547,17 @@ public class SystemApiController { return sysBaseApi.loadCategoryDictItem(ids); } + /** + * 反向翻译分类字典,用于导入 + * + * @param names 名称,逗号分割 + * @return + */ + @GetMapping("/loadCategoryDictItemByNames") + List loadCategoryDictItemByNames(@RequestParam("names") String names, @RequestParam("delNotExist") boolean delNotExist) { + return sysBaseApi.loadCategoryDictItemByNames(names, delNotExist); + } + /** * 根据字典code加载字典text * @@ -655,6 +686,7 @@ public class SystemApiController { } + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 【接口签名验证】 * 49 字典表的 翻译,可批量 @@ -663,12 +695,14 @@ public class SystemApiController { * @param text * @param code * @param keys 多个用逗号分割 + * @param ds 数据源 * @return */ @GetMapping("/translateDictFromTableByKeys") - public List translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys) { - return this.sysBaseApi.translateDictFromTableByKeys(table, text, code, keys); + public List translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys, @RequestParam("ds") String ds) { + return this.sysBaseApi.translateDictFromTableByKeys(table, text, code, keys, ds); } + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 发送模板信息 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index 611f2c7d..a529ada6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -25,6 +25,7 @@ import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.service.ISysUserDepartService; import org.jeecg.modules.system.service.ISysUserService; +import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -350,25 +351,34 @@ public class SysDepartController { } //------------------------------------------------------------------------------------------------ - // Step.1 组装查询条件 - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap()); - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = sysDepartService.list(queryWrapper); + //update-begin---author:wangshuai---date:2023-10-19---for:【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径--- + //// Step.1 组装查询条件 + //QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap()); + //Step.1 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + //List pageList = sysDepartService.list(queryWrapper); //按字典排序 - Collections.sort(pageList, new Comparator() { - @Override - public int compare(SysDepart arg0, SysDepart arg1) { - return arg0.getOrgCode().compareTo(arg1.getOrgCode()); - } - }); + //Collections.sort(pageList, new Comparator() { + //@Override + //public int compare(SysDepart arg0, SysDepart arg1) { + //return arg0.getOrgCode().compareTo(arg1.getOrgCode()); + //} + //}); + //step.2 组装导出数据 + List sysDepartExportVos = sysDepartService.getExportDepart(sysDepart.getTenantId()); //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表"); - mv.addObject(NormalExcelConstants.CLASS, SysDepart.class); + mv.addObject(NormalExcelConstants.CLASS, SysDepartExportVo.class); LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息")); - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("导入规则:\n" + + "1、标题为第三行,部门路径和部门名称的标题不允许修改,否则会匹配失败;第四行为数据填写范围;\n" + + "2、部门路径用英文字符/分割,部门名称为部门路径的最后一位;\n" + + "3、部门从一级名称开始创建,如果有同级就需要多添加一行,如研发部/研发一部;研发部/研发二部;\n" + + "4、自定义的部门编码需要满足规则才能导入。如一级部门编码为A01,那么子部门为A01A01,同级子部门为A01A02,编码固定为三位,首字母为A-Z,后两位为数字0-99,依次递增;", "导出人:"+user.getRealname(), "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, sysDepartExportVos); + //update-end---author:wangshuai---date:2023-10-19---for:【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径--- + + return mv; } /** @@ -386,7 +396,8 @@ public class SysDepartController { public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; List errorMessageList = new ArrayList<>(); - List listSysDeparts = null; + //List listSysDeparts = null; + List listSysDeparts = null; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { // 获取上传文件对象 @@ -396,51 +407,59 @@ public class SysDepartController { params.setHeadRows(1); params.setNeedSave(true); try { - // orgCode编码长度 - int codeLength = YouBianCodeUtil.ZHANWEI_LENGTH; - listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params); - //按长度排序 - Collections.sort(listSysDeparts, new Comparator() { - @Override - public int compare(SysDepart arg0, SysDepart arg1) { - return arg0.getOrgCode().length() - arg1.getOrgCode().length(); - } - }); - - int num = 0; - for (SysDepart sysDepart : listSysDeparts) { - String orgCode = sysDepart.getOrgCode(); - if(orgCode.length() > codeLength) { - String parentCode = orgCode.substring(0, orgCode.length()-codeLength); - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("org_code", parentCode); - try { - SysDepart parentDept = sysDepartService.getOne(queryWrapper); - if(!parentDept.equals(null)) { - sysDepart.setParentId(parentDept.getId()); - //更新父级部门不是叶子结点 - sysDepartService.updateIzLeaf(parentDept.getId(),CommonConstant.NOT_LEAF); - } else { - sysDepart.setParentId(""); - } - }catch (Exception e) { - //没有查找到parentDept - } - }else{ - sysDepart.setParentId(""); - } - //update-begin---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ - sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+""); - //update-end---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ - sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); - //update-begin---author:wangshuai ---date:20220105 for:[JTC-363]部门导入 机构类别没有时导入失败,赋默认值------------ - if(oConvertUtils.isEmpty(sysDepart.getOrgCategory())){ - sysDepart.setOrgCategory("1"); - } - //update-end---author:wangshuai ---date:20220105 for:[JTC-363]部门导入 机构类别没有时导入失败,赋默认值------------ - ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE); - num++; - } + //update-begin---author:wangshuai---date:2023-10-20---for: 注释掉原来的导入部门的逻辑--- +// // orgCode编码长度 +// int codeLength = YouBianCodeUtil.ZHANWEI_LENGTH; +// listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params); +// //按长度排序 +// Collections.sort(listSysDeparts, new Comparator() { +// @Override +// public int compare(SysDepart arg0, SysDepart arg1) { +// return arg0.getOrgCode().length() - arg1.getOrgCode().length(); +// } +// }); +// +// int num = 0; +// for (SysDepart sysDepart : listSysDeparts) { +// String orgCode = sysDepart.getOrgCode(); +// if(orgCode.length() > codeLength) { +// String parentCode = orgCode.substring(0, orgCode.length()-codeLength); +// QueryWrapper queryWrapper = new QueryWrapper(); +// queryWrapper.eq("org_code", parentCode); +// try { +// SysDepart parentDept = sysDepartService.getOne(queryWrapper); +// if(!parentDept.equals(null)) { +// sysDepart.setParentId(parentDept.getId()); +// //更新父级部门不是叶子结点 +// sysDepartService.updateIzLeaf(parentDept.getId(),CommonConstant.NOT_LEAF); +// } else { +// sysDepart.setParentId(""); +// } +// }catch (Exception e) { +// //没有查找到parentDept +// } +// }else{ +// sysDepart.setParentId(""); +// } +// //update-begin---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ +// sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+""); +// //update-end---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------ +// sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); +// //update-begin---author:wangshuai ---date:20220105 for:[JTC-363]部门导入 机构类别没有时导入失败,赋默认值------------ +// if(oConvertUtils.isEmpty(sysDepart.getOrgCategory())){ +// sysDepart.setOrgCategory("1"); +// } +// //update-end---author:wangshuai ---date:20220105 for:[JTC-363]部门导入 机构类别没有时导入失败,赋默认值------------ +// ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE); +// num++; +// } + //update-end---author:wangshuai---date:2023-10-20---for: 注释掉原来的导入部门的逻辑--- + + //update-begin---author:wangshuai---date:2023-10-19---for:【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径--- + listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepartExportVo.class, params); + sysDepartService.importSysDepart(listSysDeparts,errorMessageList); + //update-end---author:wangshuai---date:2023-10-19---for:【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径--- + //清空部门缓存 Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*"); Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*"); @@ -544,7 +563,7 @@ public class SysDepartController { * @return */ @RequestMapping(value = "/queryByIds", method = RequestMethod.GET) - public Result> queryByIds(@RequestParam String deptIds) { + public Result> queryByIds(@RequestParam(name = "deptIds") String deptIds) { Result> result = new Result<>(); String[] ids = deptIds.split(","); Collection idList = Arrays.asList(ids); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java index 58edd0a2..f0f99756 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java @@ -79,8 +79,8 @@ public class SysDepartRoleController extends JeecgController queryWrapper = QueryGenerator.initQueryWrapper(sysDepartRole, req.getParameterMap()); Page page = new Page(pageNo, pageSize); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - List deptIds = null; +// LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// List deptIds = null; // if(oConvertUtils.isEmpty(deptId)){ // if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals(CommonConstant.USER_IDENTITY_2) ){ // deptIds = sysDepartService.getMySubDepIdsByDepId(user.getDepartIds()); @@ -93,7 +93,10 @@ public class SysDepartRoleController extends JeecgController pageList = sysDepartRoleService.page(page, queryWrapper); return Result.ok(pageList); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java index 194cb52a..a5ddf238 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java @@ -123,9 +123,13 @@ public class SysRoleController { @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { Result> result = new Result>(); - //------------------------------------------------------------------------------------------------ - //此接口必须通过租户来隔离查询 - role.setTenantId(oConvertUtils.getInt(!"0".equals(TenantContext.getTenant()) ? TenantContext.getTenant() : "", -1)); + + //update-begin---author:wangshuai---date:2023-11-20---for:【QQYUN-7089】低代码模式 选择组织角色没有数据 在租户角色中添加数据后,列表也无数据展示--- + if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ + //此接口必须通过租户来隔离查询 + role.setTenantId(oConvertUtils.getInt(!"0".equals(TenantContext.getTenant()) ? TenantContext.getTenant() : "", -1)); + } + //update-end---author:wangshuai---date:2023-11-20---for:【QQYUN-7089】低代码模式 选择组织角色没有数据 在租户角色中添加数据后,列表也无数据展示--- QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap()); Page page = new Page(pageNo, pageSize); @@ -527,7 +531,6 @@ public class SysRoleController { } /** - * TODO 权限未完成(敲敲云接口,租户应用) * 分页获取全部角色列表(包含每个角色的数量) * @return */ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java index e00801ce..3da88bbb 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java @@ -858,16 +858,19 @@ public class SysTenantController { @GetMapping("/getTenantCount") public Result> getTenantCount(HttpServletRequest request){ Map map = new HashMap<>(); - Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request),0); - LambdaQueryWrapper userTenantQuery = new LambdaQueryWrapper<>(); - userTenantQuery.eq(SysUserTenant::getTenantId,tenantId); - userTenantQuery.eq(SysUserTenant::getStatus,CommonConstant.USER_TENANT_NORMAL); - long userCount = relationService.count(userTenantQuery); + //update-begin---author:wangshuai---date:2023-11-24---for:【QQYUN-7177】用户数量显示不正确--- + if(oConvertUtils.isEmpty(TokenUtils.getTenantIdByRequest(request))){ + return Result.error("当前租户为空,禁止访问!"); + } + Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request)); + Long userCount = relationService.getUserCount(tenantId,CommonConstant.USER_TENANT_NORMAL); + //update-end---author:wangshuai---date:2023-11-24---for:【QQYUN-7177】用户数量显示不正确--- map.put("userCount",userCount); LambdaQueryWrapper departQuery = new LambdaQueryWrapper<>(); departQuery.eq(SysDepart::getDelFlag,String.valueOf(CommonConstant.DEL_FLAG_0)); departQuery.eq(SysDepart::getTenantId,tenantId); - departQuery.eq(SysDepart::getStatus,CommonConstant.STATUS_1); + //部门状态暂时没用,先注释掉 + //departQuery.eq(SysDepart::getStatus,CommonConstant.STATUS_1); long departCount = sysDepartService.count(departQuery); map.put("departCount",departCount); return Result.ok(map); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java index 9fb9dcf3..29c5a9e2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java @@ -437,12 +437,13 @@ public class SysUserController { @RequestParam(name = "departId", required = false) String departId, @RequestParam(name="realname",required=false) String realname, @RequestParam(name="username",required=false) String username, + @RequestParam(name="isMultiTranslate",required=false) String isMultiTranslate, @RequestParam(name="id",required = false) String id) { //update-begin-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 String[] arr = new String[]{departId, realname, username, id}; SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK); //update-end-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 - IPage pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id); + IPage pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id,isMultiTranslate); return Result.OK(pageList); } @@ -568,7 +569,7 @@ public class SysUserController { * @return */ @RequestMapping(value = "/queryByIds", method = RequestMethod.GET) - public Result> queryByIds(@RequestParam String userIds) { + public Result> queryByIds(@RequestParam(name = "userIds") String userIds) { Result> result = new Result<>(); String[] userId = userIds.split(","); Collection idList = Arrays.asList(userId); @@ -585,7 +586,7 @@ public class SysUserController { * @return */ @RequestMapping(value = "/queryByNames", method = RequestMethod.GET) - public Result> queryByNames(@RequestParam String userNames) { + public Result> queryByNames(@RequestParam(name = "userNames") String userNames) { Result> result = new Result<>(); String[] names = userNames.split(","); QueryWrapper queryWrapper=new QueryWrapper(); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java index af5a07fa..9079338c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java @@ -424,10 +424,6 @@ public class ThirdAppController { @GetMapping("/getThirdConfigByTenantId") public Result getThirdAppByTenantId(@RequestParam(name = "tenantId", required = false) Integer tenantId, @RequestParam(name = "thirdType") String thirdType) { - Result result = new Result<>(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysThirdAppConfig::getThirdType,thirdType); - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { if (tenantId == null) { return Result.error("开启多租户模式,租户ID参数不允许为空!"); @@ -438,7 +434,9 @@ public class ThirdAppController { tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); } } - + Result result = new Result<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysThirdAppConfig::getThirdType,thirdType); query.eq(SysThirdAppConfig::getTenantId,tenantId); SysThirdAppConfig sysThirdAppConfig = appConfigService.getOne(query); result.setSuccess(true); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java index 0a41276c..ada0b0df 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java @@ -1,11 +1,12 @@ package org.jeecg.modules.system.controller; +import javax.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPackUser.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPackUser.java index c89af50f..9b299823 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPackUser.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPackUser.java @@ -68,7 +68,7 @@ public class SysTenantPackUser implements Serializable { private transient String packCode; /** - * 状态(1 正常 2 离职 3 待审核 4 拒绝 5 邀请加入) + * 状态(申请状态0 正常状态1) */ private Integer status; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java index b8145ee7..1998e3d6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java @@ -48,6 +48,4 @@ public class SysUserRole implements Serializable { this.roleId = roleId; } - - } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java index 674dd7d9..b1623aad 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java @@ -9,6 +9,7 @@ import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.model.TreeModel; +import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.SysUserDepVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; import org.springframework.data.repository.query.Param; @@ -161,4 +162,12 @@ public interface SysDepartMapper extends BaseMapper { * @return */ List getDepartPageByName(@Param("page") Page page, @Param("departName") String departName, @Param("tenantId") Integer tenantId, @Param("parentId") String parentId); + + /** + * 获取租户id和部门父id获取的部门数据 + * @param tenantId + * @param parentId + * @return + */ + List getSysDepartList(@Param("parentId") String parentId,@Param("tenantId") Integer tenantId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java index f1fda16b..c0feb8b6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java @@ -119,5 +119,12 @@ public interface SysTenantMapper extends BaseMapper { * @return */ Long getApplySuperAdminCount(@Param("userId") String userId, @Param("tenantId") Integer tenantId); - + + /** + * 租户是否存在 + * @param tenantId + * @return + */ + @Select("select count(1) from sys_tenant where id = #{tenantId} and del_flag = 0") + Long tenantIzExist(@Param("tenantId") Integer tenantId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackUserMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackUserMapper.java index 13af385d..7711429c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackUserMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackUserMapper.java @@ -25,4 +25,11 @@ public interface SysTenantPackUserMapper extends BaseMapper { @InterceptorIgnore(tenantLine = "true") List queryTenantPackUserNameList(@Param("tenantId") Integer tenantId, @Param("packCodeList") List packCodeList); + /** + * 判断当前用户在该租户下是否拥有管理员的权限 + * @param userId + * @param tenantId + * @return + */ + Long izHaveBuyAuth(@Param("userId") String userId, @Param("tenantId") String tenantId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAccountMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAccountMapper.java index aff3e462..395bb2bc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAccountMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAccountMapper.java @@ -3,6 +3,7 @@ package org.jeecg.modules.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import org.jeecg.modules.system.entity.SysThirdAccount; +import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; import java.util.List; @@ -22,5 +23,12 @@ public interface SysThirdAccountMapper extends BaseMapper { * @return */ List selectThirdIdsByUsername(@Param("sysUsernameArr") String[] sysUsernameArr, @Param("thirdType") String thirdType, @Param("tenantId") Integer tenantId); - + + /** + * 查询被绑定的用户 + * @param tenantId + * @param thirdType + * @return + */ + List getThirdUserBindByWechat(@Param("tenantId") int tenantId, @Param("thirdType") String thirdType); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserPositionMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserPositionMapper.java index be692db9..bc00e1b1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserPositionMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserPositionMapper.java @@ -1,17 +1,17 @@ package org.jeecg.modules.system.mapper; +import java.util.List; + import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserPosition; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import org.jeecg.modules.system.vo.SysUserPositionVo; -import java.util.List; - /** * @Description: 用户职位关系表 * @Author: jeecg-boot @@ -66,7 +66,7 @@ public interface SysUserPositionMapper extends BaseMapper { * @return */ @InterceptorIgnore(tenantLine = "true") - List getPositionIdByUserTenantId(@Param("userId") String userId, @Param("tenantId") Integer tenantId); + List getPositionIdByUserTenantId(@Param("userId")String userId, @Param("tenantId")Integer tenantId); /** * 根据用户id获取用户职位 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserTenantMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserTenantMapper.java index a12b9ea0..14ac103b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserTenantMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserTenantMapper.java @@ -12,6 +12,7 @@ import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserTenant; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.system.vo.SysUserTenantVo; +import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; /** * @Description: sys_user_tenant_relation @@ -149,4 +150,20 @@ public interface SysUserTenantMapper extends BaseMapper { * @param tenantIds */ void deleteUserByTenantId(@Param("tenantIds") List tenantIds); + + /** + * 获取租户下的成员数量 + * + * @param tenantId + * @param tenantStatus + * @return + */ + Long getUserCount(Integer tenantId, String tenantStatus); + + /** + * 根据租户id和名称获取用户数据 + * @param tenantId + * @return + */ + List getUsersByTenantIdAndName(@Param("tenantId") Integer tenantId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml index 348f71e1..61e640b1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml @@ -33,7 +33,7 @@ + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml index 8e47de78..9747d3e0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml @@ -43,6 +43,7 @@ + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAccountMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAccountMapper.xml index e3d5b60d..324c28d3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAccountMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAccountMapper.xml @@ -14,5 +14,14 @@ #{item} + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserTenantMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserTenantMapper.xml index 6cb02785..3d07d1a2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserTenantMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserTenantMapper.xml @@ -39,9 +39,10 @@ + SELECT count(1) FROM sys_user_tenant sut JOIN sys_user su on sut.user_id = su.id and su.del_flag = 0 and su.status = 1 + WHERE sut.status = #{tenantStatus} + AND tenant_id = #{tenantId} + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java index 6c8b3015..607d2c5d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java @@ -89,4 +89,13 @@ public interface ISysCategoryService extends IService { */ List loadDictItem(String ids, boolean delNotExist); + /** + * 【仅导入使用】分类字典控件反向翻译 + * + * @param names + * @param delNotExist 是否移除不存在的项,设为false如果某个key不存在数据库中,则直接返回key本身 + * @return + */ + List loadDictItemByNames(String names, boolean delNotExist); + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index e9942aab..a22273ed 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.entity.SysUserDepart; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.model.SysDepartTreeModel; +import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; import javax.servlet.http.HttpServletRequest; @@ -215,5 +217,18 @@ public interface ISysDepartService extends IService{ List getExcelDepart(int tenantId); void importExcel(List listSysDeparts, List errorMessageList); - + + /** + * 根据租户id导出部门 + * @param tenantId + * @return + */ + List getExportDepart(int tenantId); + + /** + * 导出系统部门excel + * @param listSysDeparts + * @param errorMessageList + */ + void importSysDepart(List listSysDeparts, List errorMessageList); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictService.java index 87ba8dfd..b3d59400 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictService.java @@ -107,6 +107,7 @@ public interface ISysDictService extends IService { @Deprecated String queryTableDictTextByKey(String table, String text, String code, String key); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 通过查询指定table的 text code key 获取字典值,可批量查询 * @@ -114,9 +115,11 @@ public interface ISysDictService extends IService { * @param text * @param code * @param keys + * @param dataSource 数据源 * @return */ - List queryTableDictTextByKeys(String table, String text, String code, List keys); + List queryTableDictTextByKeys(String table, String text, String code, List keys, String dataSource); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ /** * 通过查询指定table的 text code key 获取字典值,包含value diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java index 8ae9aa5c..86a74cb3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java @@ -75,7 +75,8 @@ public interface ISysThirdAccountService extends IService { * @param unionid * @param thirdType * @param tenantId + * @param thirdUserId * @return */ - SysThirdAccount getOneByUuidAndThirdType(String unionid, String thirdType,Integer tenantId); + SysThirdAccount getOneByUuidAndThirdType(String unionid, String thirdType,Integer tenantId,String thirdUserId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java index 74fb9c71..a348057b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java @@ -51,9 +51,10 @@ public interface ISysUserDepartService extends IService { * @param pageNo * @param realname * @param id + * @param isMultiTranslate 是否多字段翻译 * @return */ - IPage queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id); + IPage queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate); /** * 获取用户信息 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserTenantService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserTenantService.java index d826ca7a..523f6382 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserTenantService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserTenantService.java @@ -120,4 +120,12 @@ public interface ISysUserTenantService extends IService { * @return */ SysUserTenant getUserTenantByTenantId(String userId, Integer tenantId); + + /** + * 获取租户下的成员数量 + * @param tenantId + * @param tenantStatus + * @return + */ + Long getUserCount(Integer tenantId, String tenantStatus); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java index 508200d1..4fa03b56 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.LoginUser; @@ -61,7 +62,12 @@ public class SysAnnouncementServiceImpl extends ServiceImpl getDepartParentIdsByUsername(String username) { + List list = sysDepartService.queryDepartsByUsername(username); + Set result = new HashSet<>(list.size()); + for (SysDepart depart : list) { + result.add(depart.getParentId()); + } + return result; + } + + @Override + public Set getDepartParentIdsByDepIds(Set depIds) { + LambdaQueryWrapper departQuery = new LambdaQueryWrapper().in(SysDepart::getId, depIds); + List departList = departMapper.selectList(departQuery); + + if(CollectionUtils.isEmpty(departList)){ + return null; + } + Set parentIds = departList.stream() + .map(SysDepart::getParentId) + .collect(Collectors.toSet()); + return parentIds; + } + @Override public List getDepartNamesByUsername(String username) { List list = sysDepartService.queryDepartsByUsername(username); @@ -1388,6 +1414,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { return sysCategoryService.loadDictItem(ids, false); } + @Override + public List loadCategoryDictItemByNames(String names, boolean delNotExist) { + return sysCategoryService.loadDictItemByNames(names, delNotExist); + } + /** * 根据字典code加载字典text * @@ -1461,13 +1492,17 @@ public class SysBaseApiImpl implements ISysBaseAPI { public Map> translateManyDict(String dictCodes, String keys) { List dictCodeList = Arrays.asList(dictCodes.split(",")); List values = Arrays.asList(keys.split(",")); + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ return sysDictService.queryManyDictByKeys(dictCodeList, values); + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ } + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ @Override - public List translateDictFromTableByKeys(String table, String text, String code, String keys) { - return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(","))); + public List translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource) { + return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(",")), dataSource); } + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ //-------------------------------------流程节点发送模板消息----------------------------------------------- @Autowired diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java index 437be4ef..c007d8a7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.exception.JeecgBootException; @@ -18,10 +17,7 @@ import org.jeecg.modules.system.service.ISysCategoryService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -235,4 +231,22 @@ public class SysCategoryServiceImpl extends ServiceImpl loadDictItemByNames(String names, boolean delNotExist) { + List nameList = Arrays.asList(names.split(SymbolConstant.COMMA)); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.select(SysCategory::getId, SysCategory::getName); + query.in(SysCategory::getName, nameList); + // 查询数据 + List list = super.list(query); + // 取出id并返回 + return nameList.stream().map(name -> { + SysCategory res = list.stream().filter(i -> name.equals(i.getName())).findFirst().orElse(null); + if (res == null) { + return delNotExist ? null : name; + } + return res.getId(); + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index 247543b5..7c58ffc7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -1,6 +1,7 @@ package org.jeecg.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -28,9 +29,9 @@ import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.util.FindsDepartsChildrenUtil; +import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -69,6 +70,11 @@ public class SysDepartServiceImpl extends ServiceImpl query = new LambdaQueryWrapper(); String[] codeArr = this.getMyDeptParentOrgCode(departIds); + //update-begin---author:wangshuai---date:2023-12-01---for:【QQYUN-7320】查询部门没数据,导致报错空指针--- + if(ArrayUtil.isEmpty(codeArr)){ + return null; + } + //update-end---author:wangshuai---date:2023-12-01---for:【QQYUN-7320】查询部门没数据,导致报错空指针--- for(int i=0;i query = new LambdaQueryWrapper(); query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); - query.in(SysDepart::getId, Arrays.asList(departIds.split(","))); + if(oConvertUtils.isNotEmpty(departIds)){ + query.in(SysDepart::getId, Arrays.asList(departIds.split(","))); + } + //------------------------------------------------------------------------------------------------ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ @@ -1195,4 +1212,169 @@ public class SysDepartServiceImpl extends ServiceImpl getExportDepart(int tenantId) { + //获取父级部门 + List parentDepart = departMapper.getSysDepartList("", tenantId); + //子部门 + List childrenDepart = new ArrayList<>(); + //把一级部门名称放在里面 + List exportDepartVoList = new ArrayList<>(); + //存放部门一级id避免重复 + List departIdList = new ArrayList<>(); + for (SysDepartExportVo sysDepart : parentDepart) { + //step 1.添加第一级部门 + departIdList.add(sysDepart.getId()); + sysDepart.setDepartNameUrl(sysDepart.getDepartName()); + exportDepartVoList.add(sysDepart); + //step 2.添加自己部门路径,用/分离 + //创建路径 + List path = new ArrayList<>(); + path.add(sysDepart.getDepartName()); + //创建子部门路径 + findSysDepartPath(sysDepart, path, tenantId, childrenDepart, departIdList); + path.clear(); + } + exportDepartVoList.addAll(childrenDepart); + childrenDepart.clear(); + departIdList.clear(); + return exportDepartVoList; + } + + /** + * 系统部门导入 + * @param listSysDeparts + * @param errorMessageList + */ + @Override + public void importSysDepart(List listSysDeparts, List errorMessageList) { + int num = 0; + int tenantId = 0; + if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { + tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); + } + //部门路径排序 + Collections.sort(listSysDeparts, new Comparator() { + @Override + public int compare(SysDepartExportVo o1, SysDepartExportVo o2) { + if(oConvertUtils.isNotEmpty(o1.getDepartNameUrl()) && oConvertUtils.isNotEmpty(o2.getDepartNameUrl())){ + int oldLength = o1.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length; + int newLength = o2.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length; + return oldLength - newLength; + }else{ + return 0; + } + } + }); + //存放部门数据的map + Map departMap = new HashMap<>(); + // orgCode编码长度 + int codeLength = YouBianCodeUtil.ZHANWEI_LENGTH; + //循环第二遍导入数据 + for (SysDepartExportVo departExportVo : listSysDeparts) { + SysDepart sysDepart = new SysDepart(); + boolean izExport = false; + try { + izExport = this.addDepartByName(departExportVo.getDepartNameUrl(),departExportVo.getDepartName(),sysDepart,errorMessageList,tenantId,departMap,num); + } catch (Exception e) { + //没有查找到parentDept + } + //没有错误的时候才会导入数据 + if(izExport){ + if(oConvertUtils.isNotEmpty(departExportVo.getOrgCode())){ + SysDepart depart = this.baseMapper.queryCompByOrgCode(departExportVo.getOrgCode()); + if(null != depart){ + if(oConvertUtils.isNotEmpty(sysDepart.getParentId())){ + //更新上级部门为叶子节点 + this.updateIzLeaf(sysDepart.getParentId(),CommonConstant.IS_LEAF); + } + //部门名称已存在 + errorMessageList.add("第 " + num + " 行:记录部门名称“"+departExportVo.getDepartName()+"”部门编码重复,请检查!"); + continue; + } + String departNameUrl = departExportVo.getDepartNameUrl(); + //包含/说明是多级 + if(departNameUrl.contains(SymbolConstant.SINGLE_SLASH)){ + //判断添加部门的规则是否和生成的一致 + if(!sysDepart.getOrgCode().equals(departExportVo.getOrgCode())){ + if(oConvertUtils.isNotEmpty(sysDepart.getParentId())){ + //更新上级部门为叶子节点 + this.updateIzLeaf(sysDepart.getParentId(),CommonConstant.IS_LEAF); + } + //部门名称已存在 + errorMessageList.add("第 " + num + " 行:记录部门名称“"+departExportVo.getDepartName()+"”部门编码规则不匹配,请检查!"); + continue; + } + } + sysDepart.setOrgCode(departExportVo.getOrgCode()); + if(oConvertUtils.isNotEmpty(sysDepart.getParentId())){ + //上级 + sysDepart.setOrgType("2"); + }else{ + //下级 + sysDepart.setOrgType("1"); + } + }else{ + sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+""); + } + sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + sysDepart.setDepartNameEn(departExportVo.getDepartNameEn()); + sysDepart.setDepartOrder(departExportVo.getDepartOrder()); + sysDepart.setOrgCategory(oConvertUtils.getString(departExportVo.getOrgCategory(),"1")); + sysDepart.setMobile(departExportVo.getMobile()); + sysDepart.setFax(departExportVo.getFax()); + sysDepart.setAddress(departExportVo.getAddress()); + sysDepart.setMemo(departExportVo.getMemo()); + ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE); + departMap.put(departExportVo.getDepartNameUrl(),sysDepart); + } + num++; + } + } + + /** + * 寻找部门路径 + * + * @param departVo 部门vo + * @param path 部门路径 + * @param tenantId 租户id + * @param childrenDepart 子部门 + * @param departIdList 部门id集合 + */ + private void findSysDepartPath(SysDepartExportVo departVo, List path, Integer tenantId, List childrenDepart, List departIdList) { + //step 1.查询子部门的数据 + //获取租户id和部门父id获取的部门数据 + List departList = departMapper.getSysDepartList(departVo.getId(), tenantId); + //部门为空判断 + if (departList == null || departList.size() <= 0) { + //判断最后一个子部门是否已拼接 + if (!departIdList.contains(departVo.getId())) { + departVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH, path)); + childrenDepart.add(departVo); + } + return; + } + + for (SysDepartExportVo exportDepartVo : departList) { + //存放子级路径 + List cPath = new ArrayList<>(path); + cPath.add(exportDepartVo.getDepartName()); + //step 2.拼接子部门路径 + if (!departIdList.contains(departVo.getId())) { + departIdList.add(departVo.getId()); + departVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH, path)); + childrenDepart.add(departVo); + } + //step 3.递归查询子路径,直到找不到为止 + findSysDepartPath(exportDepartVo, cPath, tenantId, childrenDepart, departIdList); + } + } + //========================end 系统下部门与人员导入 ================================================================== } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index d2362097..45d7f975 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -1,6 +1,7 @@ package org.jeecg.modules.system.service.impl; import cn.hutool.core.util.RandomUtil; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -326,15 +327,22 @@ public class SysDictServiceImpl extends ServiceImpl impl } @Override - public List queryTableDictTextByKeys(String table, String text, String code, List codeValues) { + public List queryTableDictTextByKeys(String table, String text, String code, List codeValues, String dataSource) { String str = table+","+text+","+code; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); - // 1.表字典黑名单check - if(!dictQueryBlackListHandler.isPass(str)){ - log.error(dictQueryBlackListHandler.getError()); - return null; + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + // 是否自定义数据源 + boolean isCustomDataSource = oConvertUtils.isNotEmpty(dataSource); + // 如果是自定义数据源就不检查表字典白名单 + if (!isCustomDataSource) { + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); + // 1.表字典黑名单check + if (!dictQueryBlackListHandler.isPass(str)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } } + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ // 2.分割SQL获取表名和条件 String filterSql = null; @@ -352,8 +360,19 @@ public class SysDictServiceImpl extends ServiceImpl impl table = SqlInjectionUtil.getSqlInjectTableName(table); text = SqlInjectionUtil.getSqlInjectField(text); code = SqlInjectionUtil.getSqlInjectField(code); - - return sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, filterSql, codeValues); + + //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + // 切换为字典表的数据源 + if (isCustomDataSource) { + DynamicDataSourceContextHolder.push(dataSource); + } + List restData = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, filterSql, codeValues); + // 清理自定义的数据源 + if (isCustomDataSource) { + DynamicDataSourceContextHolder.clear(); + } + return restData; + //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ //update-end-author:taoyan date:20220113 for: @dict注解支持 dicttable 设置where条件 } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java index a809bb79..9cb2859a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java @@ -143,8 +143,19 @@ public class SysUserDepartServiceImpl extends ServiceImpl queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id) { + public IPage queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate) { IPage pageList = null; // 部门ID不存在 直接查询用户表即可 Page page = new Page(pageNo, pageSize); @@ -153,9 +164,17 @@ public class SysUserDepartServiceImpl extends ServiceImpl impl @Autowired private SysThirdAccountMapper sysThirdAccountMapper; @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; + ThirdAppDingtalkServiceImpl dingtalkService; @Autowired - SysRoleIndexMapper sysRoleIndexMapper; + SysRoleIndexMapper sysRoleIndexMapper; @Autowired - SysTenantMapper sysTenantMapper; + SysTenantMapper sysTenantMapper; @Autowired private SysUserTenantMapper relationMapper; @Autowired @@ -117,6 +118,7 @@ public class SysUserServiceImpl extends ServiceImpl impl private SysPositionMapper sysPositionMapper; @Autowired private SystemSendMsgHandle systemSendMsgHandle; + @Autowired private ISysThirdAccountService sysThirdAccountService; @@ -831,6 +833,7 @@ public class SysUserServiceImpl extends ServiceImpl impl SysUserTenant userTenant = new SysUserTenant(); userTenant.setStatus(CommonConstant.USER_TENANT_QUIT); userTenantMapper.update(userTenant,query); + //update-end---author:wangshuai ---date:20230111 for:[QQYUN-3951]租户用户离职重构------------ } @Override diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java index 2adde8d8..0177ef6e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java @@ -15,6 +15,7 @@ import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysTenant; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserTenant; +import org.jeecg.modules.system.mapper.SysTenantPackUserMapper; import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.mapper.SysUserPositionMapper; import org.jeecg.modules.system.mapper.SysUserTenantMapper; @@ -53,6 +54,9 @@ public class SysUserTenantServiceImpl extends ServiceImpl getPageUserList(Page page, Integer userTenantId, SysUser user) { return page.setRecords(userTenantMapper.getPageUserList(page,userTenantId,user)); @@ -162,7 +166,6 @@ public class SysUserTenantServiceImpl extends ServiceImpl getTenantPageListByUserId(Page page, String userId, List userTenantStatus,SysUserTenantVo sysUserTenantVo) { return page.setRecords(userTenantMapper.getTenantPageListByUserId(page,userId,userTenantStatus,sysUserTenantVo)); @@ -183,4 +186,9 @@ public class SysUserTenantServiceImpl extends ServiceImpljeecg-module-demo ${jeecgboot.version} + + + org.jeecgframework + kingbase8 + 9.0.0 + runtime + + + + com.dameng + Dm8JdbcDriver18 + ${dm8.version} + + + com.dameng + DmDialect-for-hibernate5.0 + ${dm8.version} + diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java index 4095d22e..179bf07d 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java @@ -4,6 +4,7 @@ import org.jeecgframework.codegenerate.window.CodeWindow; /** * @Title: 单表代码生成器入口 + * 【 GUI模式功能弱一些,请优先使用Online代码生成 】 * @Author 张代浩 * @site www.jeecg.com * @Version:V1.0.1 diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java index 39b74eef..a1f68dce 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java @@ -9,6 +9,8 @@ import org.jeecgframework.codegenerate.generate.pojo.onetomany.SubTableVo; /** * 代码生成器入口【一对多】 + * + * 【 GUI模式功能弱一些,请优先使用Online代码生成 】 * @Author 张代浩 * @site www.jeecg.com * diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 092e517a..58790066 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml @@ -26,7 +26,7 @@ spring: max-request-size: 10MB mail: host: smtp.163.com - username: ?? + username: jeecgos@163.com password: ?? properties: mail: @@ -191,7 +191,7 @@ jeecg: #webapp文件路径 webapp: /opt/jeecg-boot/webapp shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/jmreport/bigscreen2/**,/api/getUserInfo + excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**,/api/getUserInfo #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml index 2264061a..efddc8f5 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml @@ -191,7 +191,7 @@ jeecg: #webapp文件路径 webapp: D://opt//webapp shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/jmreport/bigscreen2/** + excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/** #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? diff --git a/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java b/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java index 4d8d9cf2..b20566a2 100644 --- a/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java +++ b/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java @@ -44,5 +44,12 @@ public class TestStr { valArray.add("qwe"); System.out.println("值: " + StringUtils.join(valArray, ",")); } + + @Test + public void testSql() { + String sql = "select * from sys_user where sex = ${sex}"; + sql = sql.replaceAll("'?\\$\\{sex}'?","1"); + System.out.println(sql); + } } diff --git a/pom.xml b/pom.xml index e3fb7887..7bd31093 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ jeecg-boot-parent 3.6.1 pom - JEECG BOOT ${project.version} + JEECG BOOT ${project.version} @@ -48,7 +48,9 @@ 4.0 8.0.27 5.8.23 - + + 8.1.1.49 + 3.5.3.1 4.1.3 @@ -161,7 +163,6 @@ pom import - io.seata seata-spring-boot-starter @@ -399,8 +400,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.8 - 1.8 + ${java.version} + ${java.version} UTF-8